]> git.localhorst.tv Git - blank.git/blobdiff - src/world.cpp
don't render chunk that are outside clip space
[blank.git] / src / world.cpp
index d115378f10b6926e771e65eb9fad34d6ccdb44e1..7f30d71efc1930d9658c5b2633038499c6c62e7b 100644 (file)
@@ -13,6 +13,7 @@ World::World()
 , slabShape({{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.0f, 0.5f }})
 , blockNoise(0)
 , colorNoise(1)
+, player()
 , loaded()
 , to_generate() {
        blockType.Add(BlockType{ true, { 1.0f, 1.0f, 1.0f }, &blockShape }); // white block
@@ -101,7 +102,7 @@ bool World::Intersection(
                int cur_blkid;
                float cur_dist;
                glm::vec3 cur_normal;
-               if (cur_chunk.Intersection(ray, M * cur_chunk.Transform(), &cur_blkid, &cur_dist, &cur_normal)) {
+               if (cur_chunk.Intersection(ray, M * cur_chunk.Transform(player.ChunkCoords()), &cur_blkid, &cur_dist, &cur_normal)) {
                        if (cur_dist < closest_dist) {
                                closest_chunk = &cur_chunk;
                                closest_blkid = cur_blkid;
@@ -159,11 +160,15 @@ void World::Update(int dt) {
 
 void World::Render(DirectionalLighting &program) {
        program.SetLightDirection({ -1.0f, -3.0f, -2.0f });
-       program.SetView(glm::inverse(player.Transform()));
+       program.SetView(glm::inverse(player.Transform(player.ChunkCoords())));
 
        for (Chunk &chunk : LoadedChunks()) {
-               program.SetM(chunk.Transform());
-               chunk.Draw();
+               glm::mat4 m(chunk.Transform(player.ChunkCoords()));
+               program.SetM(m);
+               glm::mat4 mvp(program.GetVP() * m);
+               if (!CullTest(Chunk::Bounds(), mvp)) {
+                       chunk.Draw();
+               }
        }
 }