]> git.localhorst.tv Git - blank.git/commitdiff
ignore obscured faces in collision response
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 20 Nov 2015 15:30:33 +0000 (16:30 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Fri, 20 Nov 2015 15:30:33 +0000 (16:30 +0100)
src/world/BlockLookup.hpp
src/world/world.cpp

index 3d7aa0420f442d204311086ac1025e31000697df..214608ef49ce14ca06c1d2de3b69a05133081f67 100644 (file)
@@ -2,6 +2,7 @@
 #define BLANK_WORLD_BLOCKLOOKUP_HPP_
 
 #include "Block.hpp"
+#include "BlockType.hpp"
 #include "Chunk.hpp"
 
 
@@ -28,6 +29,8 @@ public:
        const BlockType &GetType() const noexcept { return GetChunk().Type(GetBlock()); }
        int GetLight() const noexcept { return GetChunk().GetLight(GetBlockPos()); }
 
+       bool FaceFilled(Block::Face f) const noexcept { return GetType().FaceFilled(GetBlock(), f); }
+
        void SetBlock(const Block &b) noexcept { GetChunk().SetBlock(GetBlockPos(), b); }
 
        // traverse in given direction
index d2b05d66850e96923704bfd262335af5cc464832..199343c33103d2c7377fff7338f0594e6852f96b 100644 (file)
@@ -699,11 +699,19 @@ glm::vec3 World::CombinedInterpenetration(
        glm::vec3 max_pen(0.0f);
        for (const WorldCollision &c : col) {
                if (!c.Blocks()) continue;
-               glm::vec3 local_pen(c.normal * c.depth);
+               glm::vec3 normal(c.normal);
                // swap if neccessary (normal may point away from the entity)
-               if (dot(c.normal, state.RelativePosition(c.ChunkPos()) - c.BlockCoords()) > 0) {
-                       local_pen *= -1;
+               if (dot(normal, state.RelativePosition(c.ChunkPos()) - c.BlockCoords()) < 0) {
+                       normal = -normal;
                }
+               // check if block surface is "inside"
+               Block::Face coll_face = Block::NormalFace(normal);
+               BlockLookup neighbor(c.chunk, c.BlockPos(), coll_face);
+               if (neighbor && neighbor.FaceFilled(Block::Opposite(coll_face))) {
+                       // yep, so ignore this contact
+                       continue;
+               }
+               glm::vec3 local_pen(normal * c.depth);
                min_pen = min(min_pen, local_pen);
                max_pen = max(max_pen, local_pen);
        }