diff --git a/src/collision/BVHTree.hx b/src/collision/BVHTree.hx index 2364519e..6d6c654a 100644 --- a/src/collision/BVHTree.hx +++ b/src/collision/BVHTree.hx @@ -6,7 +6,7 @@ import h3d.col.Bounds; interface IBVHObject { var boundingBox:Bounds; var key:Int; - function rayCast(rayOrigin:Vector, rayDirection:Vector, results:Array):Void; + function rayCast(rayOrigin:Vector, rayDirection:Vector, results:Array, bestT:Float):Float; } @:generic @@ -463,7 +463,7 @@ class BVHTree { return res; } - public function rayCast(origin:Vector, direction:Vector) { + public function rayCast(origin:Vector, direction:Vector, bestT:Float) { var res = []; if (this.root == null) return res; @@ -476,7 +476,7 @@ class BVHTree { var currentnode = this.nodes[current]; if (currentnode.collideRay(ray)) { if (currentnode.isLeaf) { - currentnode.object.rayCast(origin, direction, res); + bestT = currentnode.object.rayCast(origin, direction, res, bestT); } else { if (currentnode.child1 != -1) q.push(currentnode.child1); diff --git a/src/collision/BoxCollisionEntity.hx b/src/collision/BoxCollisionEntity.hx index 9332e26e..0116f695 100644 --- a/src/collision/BoxCollisionEntity.hx +++ b/src/collision/BoxCollisionEntity.hx @@ -48,8 +48,9 @@ class BoxCollisionEntity extends CollisionEntity implements IBVHObject { } } - public override function rayCast(rayOrigin:Vector, rayDirection:Vector, results:Array) { + public override function rayCast(rayOrigin:Vector, rayDirection:Vector, results:Array, bestT:Float) { // TEMP cause bruh + return Math.POSITIVE_INFINITY; } public override function sphereIntersection(collisionEntity:SphereCollisionEntity, timeState:TimeState) { diff --git a/src/collision/CollisionEntity.hx b/src/collision/CollisionEntity.hx index 41349ea8..3ff96ab4 100644 --- a/src/collision/CollisionEntity.hx +++ b/src/collision/CollisionEntity.hx @@ -141,7 +141,7 @@ class CollisionEntity implements IOctreeObject implements IBVHObject { } } - public function rayCast(rayOrigin:Vector, rayDirection:Vector, results:Array) { + public function rayCast(rayOrigin:Vector, rayDirection:Vector, results:Array, bestT:Float) { var invMatrix = invTransform; var invTPos = invMatrix.clone(); invTPos.transpose(); @@ -159,13 +159,17 @@ class CollisionEntity implements IOctreeObject implements IBVHObject { // } // return intersections; // iData; // } else { - var intersections = grid.rayCast(rStart, rDir); // this.bvh.rayCast(rStart, rDir); + var intersections = grid.rayCast(rStart, rDir, bestT); // this.bvh.rayCast(rStart, rDir); for (i in intersections) { i.point.transform(transform); i.normal.transform3x3(invTPos); i.normal.normalize(); - results.push(i); + if (i.t < bestT) { + bestT = i.t; + results.push(i); + } } + return bestT; // } } diff --git a/src/collision/CollisionSurface.hx b/src/collision/CollisionSurface.hx index e7c23f65..ac73ca01 100644 --- a/src/collision/CollisionSurface.hx +++ b/src/collision/CollisionSurface.hx @@ -139,7 +139,7 @@ class CollisionSurface implements IOctreeObject implements IBVHObject { normals.push(z); } - public function rayCast(rayOrigin:Vector, rayDirection:Vector, intersections:Array) { + public function rayCast(rayOrigin:Vector, rayDirection:Vector, intersections:Array, bestT:Float) { var i = 0; while (i < indices.length) { var p1 = getPoint(indices[i]); @@ -152,10 +152,19 @@ class CollisionSurface implements IOctreeObject implements IBVHObject { var ip = rayOrigin.add(rayDirection.multiply(t)); ip.w = 1; if (t >= 0 && Collision.PointInTriangle(ip, p1, p2, p3)) { - intersections.push({point: ip, normal: n, object: cast this}); + if (t < bestT) { + bestT = t; + intersections.push({ + point: ip, + normal: n, + object: cast this, + t: t + }); + } } i += 3; } + return bestT; } public function support(direction:Vector, transform:Matrix) { diff --git a/src/collision/CollisionWorld.hx b/src/collision/CollisionWorld.hx index 475112b1..7fd589a4 100644 --- a/src/collision/CollisionWorld.hx +++ b/src/collision/CollisionWorld.hx @@ -139,12 +139,12 @@ class CollisionWorld { var results = []; for (obj in objs) { var oo = cast(obj, CollisionEntity); - oo.rayCast(rayStart, rayDirection, results); + oo.rayCast(rayStart, rayDirection, results, rayLength); } for (obj in dynObjs) { var oo = cast(obj, CollisionEntity); - oo.rayCast(rayStart, rayDirection, results); + oo.rayCast(rayStart, rayDirection, results, rayLength); } // results = results.concat(this.staticWorld.rayCast(rayStart, rayDirection)); return results; diff --git a/src/collision/Grid.hx b/src/collision/Grid.hx index 75459b1c..3af6df69 100644 --- a/src/collision/Grid.hx +++ b/src/collision/Grid.hx @@ -9,7 +9,7 @@ class Grid { public var cellSize:Vector; // The dimensions of one cell - static var CELL_SIZE = 16; + static var CELL_SIZE = 24; public var CELL_DIV = new Vector(CELL_SIZE, CELL_SIZE); // split the bounds into cells of dimensions 1/16th of the corresponding dimensions of the bounds @@ -124,7 +124,7 @@ class Grid { return elegantPair(elegantPair(x, y), z); } - public function rayCast(origin:Vector, direction:Vector) { + public function rayCast(origin:Vector, direction:Vector, bestT:Float) { var cell = origin.sub(this.bounds.getMin().toVector()); cell.x /= this.cellSize.x; cell.y /= this.cellSize.y; @@ -175,7 +175,7 @@ class Grid { if (surf.key == searchKey) continue; surf.key = searchKey; - surf.rayCast(origin, direction, results); + bestT = surf.rayCast(origin, direction, results, bestT); } if (tmax.x < tmax.y) { X = X + stepX; diff --git a/src/collision/SphereCollisionEntity.hx b/src/collision/SphereCollisionEntity.hx index 5173d65b..0e7cd1ab 100644 --- a/src/collision/SphereCollisionEntity.hx +++ b/src/collision/SphereCollisionEntity.hx @@ -69,8 +69,9 @@ class SphereCollisionEntity extends CollisionEntity { } } - public override function rayCast(rayOrigin:Vector, rayDirection:Vector, results:Array) { + public override function rayCast(rayOrigin:Vector, rayDirection:Vector, results:Array, bestT:Float) { // TEMP cause bruh + return Math.POSITIVE_INFINITY; } public override function sphereIntersection(collisionEntity:SphereCollisionEntity, timeState:TimeState) { diff --git a/src/modes/HuntMode.hx b/src/modes/HuntMode.hx index f99b0bc4..d8ba37af 100644 --- a/src/modes/HuntMode.hx +++ b/src/modes/HuntMode.hx @@ -49,7 +49,7 @@ class GemSpawnPoint implements IOctreeObject { this.priority = priority; } - public function rayCast(rayOrigin:Vector, rayDirection:Vector, resultSet:Array) { + public function rayCast(rayOrigin:Vector, rayDirection:Vector, resultSet:Array, bestT:Float):Float { throw new haxe.exceptions.NotImplementedException(); // Not applicable } } diff --git a/src/octree/IOctreeObject.hx b/src/octree/IOctreeObject.hx index 4343b5c3..2376bc72 100644 --- a/src/octree/IOctreeObject.hx +++ b/src/octree/IOctreeObject.hx @@ -9,9 +9,10 @@ class RayIntersectionData { var point:Vector; var normal:Vector; var object:IOctreeObject; + var t:Float; } interface IOctreeObject extends IOctreeElement { var boundingBox:Bounds; - function rayCast(rayOrigin:Vector, rayDirection:Vector, resultSet:Array):Void; + function rayCast(rayOrigin:Vector, rayDirection:Vector, resultSet:Array, bestT:Float):Float; } diff --git a/src/octree/Octree.hx b/src/octree/Octree.hx index e1435432..03b86ca3 100644 --- a/src/octree/Octree.hx +++ b/src/octree/Octree.hx @@ -153,9 +153,9 @@ class Octree { } /** Returns a list of all objects that intersect with the given ray, sorted by distance. */ - public function raycast(rayOrigin:Vector, rayDirection:Vector) { + public function raycast(rayOrigin:Vector, rayDirection:Vector, bestT:Float) { var intersections:Array = []; - this.root.raycast(rayOrigin, rayDirection, intersections); + this.root.raycast(rayOrigin, rayDirection, intersections, bestT); intersections.sort((a, b) -> (a.distance == b.distance) ? 0 : (a.distance > b.distance ? 1 : -1)); return intersections; } diff --git a/src/octree/OctreeNode.hx b/src/octree/OctreeNode.hx index 38f0f7fc..7de6f848 100644 --- a/src/octree/OctreeNode.hx +++ b/src/octree/OctreeNode.hx @@ -192,7 +192,7 @@ class OctreeNode implements IOctreeElement { return maxmin; } - public function raycast(rayOrigin:Vector, rayDirection:Vector, intersections:Array) { + public function raycast(rayOrigin:Vector, rayDirection:Vector, intersections:Array, bestT:Float) { var ray = Ray.fromValues(rayOrigin.x, rayOrigin.y, rayOrigin.z, rayDirection.x, rayDirection.y, rayDirection.z); // Construct the loose bounding box of this node (2x in size, with the regular bounding box in the center) @@ -201,7 +201,7 @@ class OctreeNode implements IOctreeElement { for (obj in this.objects) { var iSecs = []; - obj.rayCast(rayOrigin, rayDirection, iSecs); + obj.rayCast(rayOrigin, rayDirection, iSecs, bestT); for (intersection in iSecs) { var intersectionData = new OctreeIntersection(); intersectionData.distance = rayOrigin.distance(intersection.point); @@ -215,7 +215,7 @@ class OctreeNode implements IOctreeElement { if (this.octants != null) { for (i in 0...8) { var octant = this.octants[i]; - octant.raycast(rayOrigin, rayDirection, intersections); + octant.raycast(rayOrigin, rayDirection, intersections, bestT); } } }