From 9489fcf429cd225e409fcadb953c3b50fb2d6a5b Mon Sep 17 00:00:00 2001 From: gered Date: Tue, 31 Dec 2013 14:32:17 -0500 Subject: [PATCH] add large tile support in the swept sphere collision implementation --- .../TileMapSweptSphereCollisionChecker.java | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/ca/blarg/gdx/tilemap3d/TileMapSweptSphereCollisionChecker.java b/src/main/java/ca/blarg/gdx/tilemap3d/TileMapSweptSphereCollisionChecker.java index e244e3b..d5b7599 100644 --- a/src/main/java/ca/blarg/gdx/tilemap3d/TileMapSweptSphereCollisionChecker.java +++ b/src/main/java/ca/blarg/gdx/tilemap3d/TileMapSweptSphereCollisionChecker.java @@ -1,13 +1,13 @@ package ca.blarg.gdx.tilemap3d; -import ca.blarg.gdx.tilemap3d.tilemesh.TileMesh; -import com.badlogic.gdx.math.Matrix4; -import com.badlogic.gdx.math.Vector3; -import com.badlogic.gdx.math.collision.BoundingBox; import ca.blarg.gdx.math.SweptSphere; import ca.blarg.gdx.math.SweptSphereCollisionTester; import ca.blarg.gdx.math.SweptSphereWorldCollisionChecker; import ca.blarg.gdx.tilemap3d.tilemesh.TileMesh; +import com.badlogic.gdx.math.Matrix4; +import com.badlogic.gdx.math.Vector3; +import com.badlogic.gdx.math.collision.BoundingBox; +import com.badlogic.gdx.utils.ObjectSet; public class TileMapSweptSphereCollisionChecker implements SweptSphereWorldCollisionChecker { static final TileCoord min = new TileCoord(); @@ -21,6 +21,8 @@ public class TileMapSweptSphereCollisionChecker implements SweptSphereWorldColli public final TileCoord lastCollisionTilePosition = new TileCoord(); + final ObjectSet checkedLargeTiles = new ObjectSet(32); + @Override public boolean checkForCollisions(SweptSphere sphere, BoundingBox possibleCollisionArea) { if (tileMap == null) @@ -44,13 +46,31 @@ public class TileMapSweptSphereCollisionChecker implements SweptSphereWorldColli // only check solid tiles if (tile.isCollideable()) { + int worldPosX = x - (int)tile.parentTileOffsetX; + int worldPosY = y - (int)tile.parentTileOffsetY; + int worldPosZ = z - (int)tile.parentTileOffsetZ; + + // if this is a large tile, get the parent tile and make sure we haven't already checked + // for collisions against it + if (tile.isLargeTile()) { + Tile parentTile; + if (tile.isLargeTileRoot()) + parentTile = tile; + else + parentTile = tileMap.get(worldPosX, worldPosY, worldPosZ); + + boolean needToCheck = checkedLargeTiles.add(parentTile); + if (!needToCheck) + continue; // don't check it again! + } + // check each triangle in this tile's mesh TileMesh mesh = tileMap.tileMeshes.get(tile); Vector3[] vertices = mesh.getCollisionVertices(); // world position of this tile, will be used to move each // mesh triangle into world space - tileWorldPosition.set(x, y, z); + tileWorldPosition.set(worldPosX, worldPosY, worldPosZ); // also add the global TileMesh offset so the mesh is within // 0,0,0 to 1,1,1 and not -0.5,-0.5,-0.5 to 0.5,0.5,0.5 @@ -96,6 +116,8 @@ public class TileMapSweptSphereCollisionChecker implements SweptSphereWorldColli } } + checkedLargeTiles.clear(); + return foundCollision; } }