]> git.localhorst.tv Git - blank.git/commitdiff
explicit reference for world coordinates
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 21 Aug 2015 07:59:01 +0000 (09:59 +0200)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 21 Aug 2015 07:59:01 +0000 (09:59 +0200)
src/ai/ai.cpp
src/ui/ui.cpp
src/world/World.cpp
src/world/World.hpp

index 5f5474b5f3320030e2f7e902badbb86c58328a79..fd03ebb4fec74e0cf3309f41e9ba44bee6546f1c 100644 (file)
@@ -33,10 +33,9 @@ void Chaser::Update(int dt) {
        glm::vec3 norm_diff(diff / dist);
 
        bool line_of_sight = true;
-       // FIXME: this only works if target is in the reference chunk (which is true for the player)
        Ray aim{Target().Position() - diff, norm_diff};
        WorldCollision coll;
-       if (world.Intersection(aim, glm::mat4(1.0f), coll)) {
+       if (world.Intersection(aim, glm::mat4(1.0f), Target().ChunkCoords(), coll)) {
                line_of_sight = coll.depth > dist;
        }
 
index aeaccc55c915e49bf21689f01c1347d82b346da3..037fcb510dc16a55d96f1ca638d08ba48fe47229 100644 (file)
@@ -592,10 +592,10 @@ OutlineModel::Buffer outl_buf;
 }
 
 void Interface::CheckAim() {
-       if (!world.Intersection(aim, glm::mat4(1.0f), aim_world)) {
+       if (!world.Intersection(aim, glm::mat4(1.0f), ctrl.Controlled().ChunkCoords(), aim_world)) {
                aim_world = WorldCollision();
        }
-       if (!world.Intersection(aim, glm::mat4(1.0f), aim_entity)) {
+       if (!world.Intersection(aim, glm::mat4(1.0f), ctrl.Controlled(), aim_entity)) {
                aim_entity = EntityCollision();
        }
        if (aim_world && aim_entity) {
index 997a5f0b83346238890a8c952e589613b84c2930..7ac9e18a6287e80ef989657f57b10d71c35b9ce3 100644 (file)
@@ -58,13 +58,14 @@ std::vector<Candidate> candidates;
 bool World::Intersection(
        const Ray &ray,
        const glm::mat4 &M,
+       const Chunk::Pos &reference,
        WorldCollision &coll
 ) {
        candidates.clear();
 
        for (Chunk &cur_chunk : chunks.Loaded()) {
                float cur_dist;
-               if (cur_chunk.Intersection(ray, M * cur_chunk.Transform(player->ChunkCoords()), cur_dist)) {
+               if (cur_chunk.Intersection(ray, M * cur_chunk.Transform(reference), cur_dist)) {
                        candidates.push_back({ &cur_chunk, cur_dist });
                }
        }
@@ -78,7 +79,7 @@ bool World::Intersection(
        for (Candidate &cand : candidates) {
                if (cand.dist > coll.depth) continue;
                WorldCollision cur_coll;
-               if (cand.chunk->Intersection(ray, M * cand.chunk->Transform(player->ChunkCoords()), cur_coll)) {
+               if (cand.chunk->Intersection(ray, M * cand.chunk->Transform(reference), cur_coll)) {
                        if (cur_coll.depth < coll.depth) {
                                coll = cur_coll;
                        }
@@ -91,18 +92,18 @@ bool World::Intersection(
 bool World::Intersection(
        const Ray &ray,
        const glm::mat4 &M,
+       const Entity &reference,
        EntityCollision &coll
 ) {
        coll.entity = nullptr;
        coll.depth = std::numeric_limits<float>::infinity();
        for (Entity &cur_entity : entities) {
-               // TODO: better check for skipping self (because the check might not be for the player)
-               if (&cur_entity == player) {
+               if (&cur_entity == &reference) {
                        continue;
                }
                float cur_dist;
                glm::vec3 cur_normal;
-               if (blank::Intersection(ray, cur_entity.Bounds(), M * cur_entity.Transform(player->ChunkCoords()), &cur_dist, &cur_normal)) {
+               if (blank::Intersection(ray, cur_entity.Bounds(), M * cur_entity.Transform(reference.ChunkCoords()), &cur_dist, &cur_normal)) {
                        // TODO: fine grained check goes here? maybe?
                        if (cur_dist < coll.depth) {
                                coll.entity = &cur_entity;
@@ -117,7 +118,8 @@ bool World::Intersection(
 
 bool World::Intersection(const Entity &e, std::vector<WorldCollision> &col) {
        AABB box = e.Bounds();
-       glm::mat4 M = e.Transform(player->ChunkCoords());
+       Chunk::Pos reference = e.ChunkCoords();
+       glm::mat4 M = e.Transform(reference);
        bool any = false;
        for (Chunk &cur_chunk : chunks.Loaded()) {
                if (manhattan_radius(cur_chunk.Position() - e.ChunkCoords()) > 1) {
@@ -125,7 +127,7 @@ bool World::Intersection(const Entity &e, std::vector<WorldCollision> &col) {
                        // since there's no entity which can extent over 16 blocks, they can be skipped
                        continue;
                }
-               if (cur_chunk.Intersection(box, M, cur_chunk.Transform(player->ChunkCoords()), col)) {
+               if (cur_chunk.Intersection(box, M, cur_chunk.Transform(reference), col)) {
                        any = true;
                }
        }
@@ -137,11 +139,6 @@ Chunk &World::PlayerChunk() {
        return chunks.ForceLoad(player->ChunkCoords());
 }
 
-Chunk &World::Next(const Chunk &to, const glm::ivec3 &dir) {
-       const Chunk::Pos tgt_pos = to.Position() + dir;
-       return chunks.ForceLoad(tgt_pos);
-}
-
 
 namespace {
 
index a1385138edd5fa135d84dba21025b2f4253f9e8b..e0209c96aaf273eb4fab523fd4734b2353e5af28 100644 (file)
@@ -42,15 +42,20 @@ public:
        /// check if this ray hits a block
        /// depth in the collision is the distance between the ray's
        /// origin and the intersection point
+       /// M is the global transform for given reference chunk
        bool Intersection(
                const Ray &,
                const glm::mat4 &M,
+               const Chunk::Pos &reference,
                WorldCollision &);
 
        /// check if this ray hits an entity
+       /// intersections with the reference are not tested
+       /// M is the global transform for the chunk of given reference entity
        bool Intersection(
                const Ray &,
                const glm::mat4 &M,
+               const Entity &reference,
                EntityCollision &);
 
        /// check if given entity intersects with the world
@@ -64,7 +69,6 @@ public:
        Entity &AddEntity() { entities.emplace_back(); return entities.back(); }
 
        Chunk &PlayerChunk();
-       Chunk &Next(const Chunk &to, const glm::ivec3 &dir);
 
        void Update(int dt);