From 04a774a41e52a2c34feff283b4dee9b0fb9edec2 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Fri, 30 Dec 2022 14:51:17 +0530 Subject: [PATCH] transformed point caching --- src/DifBuilder.hx | 4 ++++ src/DtsObject.hx | 2 ++ src/Marble.hx | 15 +++++++++---- src/MarbleWorld.hx | 1 - src/collision/CollisionEntity.hx | 15 +++++++++---- src/collision/CollisionSurface.hx | 36 ++++++++++++++++++++++++++++++- 6 files changed, 63 insertions(+), 10 deletions(-) diff --git a/src/DifBuilder.hx b/src/DifBuilder.hx index 574a96e0..a88d3ea0 100644 --- a/src/DifBuilder.hx +++ b/src/DifBuilder.hx @@ -336,6 +336,7 @@ class DifBuilder { colliderSurface.points = []; colliderSurface.normals = []; colliderSurface.indices = []; + colliderSurface.transformKeys = []; colliderSurface.edgeData = []; colliderSurface.edgeConcavities = []; colliderSurface.originalIndices = []; @@ -418,6 +419,9 @@ class DifBuilder { colliderSurface.indices.push(colliderSurface.indices.length); colliderSurface.indices.push(colliderSurface.indices.length); colliderSurface.indices.push(colliderSurface.indices.length); + colliderSurface.transformKeys.push(0); + colliderSurface.transformKeys.push(0); + colliderSurface.transformKeys.push(0); for (v in [p1, p2, p3]) { var buckets = vertexBuckets.get(v); if (buckets == null) { diff --git a/src/DtsObject.hx b/src/DtsObject.hx index d65e94e2..de893ffa 100644 --- a/src/DtsObject.hx +++ b/src/DtsObject.hx @@ -520,6 +520,7 @@ class DtsObject extends GameObject { hs.points = []; hs.normals = []; hs.indices = []; + hs.transformKeys = []; var material = this.dts.matNames[primitive.matIndex & TSDrawPrimitive.MaterialMask]; if (dtsMaterials.exists(material)) { @@ -544,6 +545,7 @@ class DtsObject extends GameObject { for (index in [i1, i2, i3]) { var vertex = vertices[index]; hs.points.push(new Vector(vertex.x, vertex.y, vertex.z)); + hs.transformKeys.push(0); var normal = vertexNormals[index]; hs.normals.push(new Vector(normal.x, normal.y, normal.z)); diff --git a/src/Marble.hx b/src/Marble.hx index e74b5c53..1706d49f 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -1019,13 +1019,20 @@ class Marble extends GameObject { var i = 0; while (i < surface.indices.length) { - var v0 = surface.points[surface.indices[i]].transformed(obj.transform); - var v = surface.points[surface.indices[i + 1]].transformed(obj.transform); - var v2 = surface.points[surface.indices[i + 2]].transformed(obj.transform); + var verts = surface.transformTriangle(i, obj.transform, @:privateAccess obj._transformKey); + // var v0 = surface.points[surface.indices[i]].transformed(tform); + // var v = surface.points[surface.indices[i + 1]].transformed(tform); + // var v2 = surface.points[surface.indices[i + 2]].transformed(tform); + var v0 = verts.v1; + var v = verts.v2; + var v2 = verts.v3; + // var v0 = surface.points[surface.indices[i]].transformed(obj.transform); + // var v = surface.points[surface.indices[i + 1]].transformed(obj.transform); + // var v2 = surface.points[surface.indices[i + 2]].transformed(obj.transform); var triangleVerts = [v0, v, v2]; - var surfaceNormal = surface.normals[surface.indices[i]].transformed3x3(obj.transform).normalized(); + var surfaceNormal = verts.n; // surface.normals[surface.indices[i]].transformed3x3(obj.transform).normalized(); var surfaceD = -surfaceNormal.dot(v0); // If we're going the wrong direction or not going to touch the plane, ignore... diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 18a073f4..2c846613 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1,6 +1,5 @@ package src; -import shaders.Gamma; import collision.Collision; import shapes.MegaMarble; import shapes.Blast; diff --git a/src/collision/CollisionEntity.hx b/src/collision/CollisionEntity.hx index 46120a31..2eb1a217 100644 --- a/src/collision/CollisionEntity.hx +++ b/src/collision/CollisionEntity.hx @@ -38,6 +38,8 @@ class CollisionEntity implements IOctreeObject implements IBVHObject { public var difEdgeMap:Map; + var _transformKey:Int = 0; + public function new(go:GameObject) { this.go = go; this.octree = new Octree(); @@ -87,6 +89,7 @@ class CollisionEntity implements IOctreeObject implements IBVHObject { this.invTransform = transform.getInverse(); generateBoundingBox(); } + _transformKey++; } public function generateBoundingBox() { @@ -162,9 +165,13 @@ class CollisionEntity implements IOctreeObject implements IBVHObject { var i = 0; while (i < surface.indices.length) { - var v0 = surface.points[surface.indices[i]].transformed(tform); - var v = surface.points[surface.indices[i + 1]].transformed(tform); - var v2 = surface.points[surface.indices[i + 2]].transformed(tform); + var verts = surface.transformTriangle(i, tform, this._transformKey); + // var v0 = surface.points[surface.indices[i]].transformed(tform); + // var v = surface.points[surface.indices[i + 1]].transformed(tform); + // var v2 = surface.points[surface.indices[i + 2]].transformed(tform); + var v0 = verts.v1; + var v = verts.v2; + var v2 = verts.v3; // var e1e2 = hashEdge(surface.originalIndices[i], surface.originalIndices[i + 1]); // var e2e3 = hashEdge(surface.originalIndices[i + 1], surface.originalIndices[i + 2]); @@ -185,7 +192,7 @@ class CollisionEntity implements IOctreeObject implements IBVHObject { var edgeConcavities = surface.edgeConcavities.slice(Math.floor(i / 3), Math.floor(i / 3) + 3); - var surfacenormal = surface.normals[surface.indices[i]].transformed3x3(transform).normalized(); + var surfacenormal = verts.n; // surface.normals[surface.indices[i]].transformed3x3(transform).normalized(); var res = Collision.TriangleSphereIntersection(v0, v, v2, surfacenormal, position, radius, edgeData, edgeConcavities); var closest = res.point; diff --git a/src/collision/CollisionSurface.hx b/src/collision/CollisionSurface.hx index c4a6915c..96acdf37 100644 --- a/src/collision/CollisionSurface.hx +++ b/src/collision/CollisionSurface.hx @@ -20,7 +20,10 @@ class CollisionSurface implements IOctreeObject implements IBVHObject { public var edgeConcavities:Array; public var originalIndices:Array; public var originalSurfaceIndex:Int; - public var key:Bool = false; + public var transformKeys:Array; + + var _transformedPoints:Array; + var _transformedNormals:Array; public function new() {} @@ -117,4 +120,35 @@ class CollisionSurface implements IOctreeObject implements IBVHObject { return furthestVertex; } + + public function transformTriangle(idx:Int, tform:Matrix, key:Int) { + if (_transformedPoints == null) { + _transformedPoints = points.copy(); + } + if (_transformedNormals == null) { + _transformedNormals = normals.copy(); + } + var p1 = indices[idx]; + var p2 = indices[idx + 1]; + var p3 = indices[idx + 2]; + if (transformKeys[p1] != key) { + _transformedPoints[p1] = points[p1].transformed(tform); + _transformedNormals[p1] = normals[p1].transformed3x3(tform).normalized(); + transformKeys[p1] = key; + } + if (transformKeys[p2] != key) { + _transformedPoints[p2] = points[p2].transformed(tform); + transformKeys[p2] = key; + } + if (transformKeys[p3] != key) { + _transformedPoints[p3] = points[p3].transformed(tform); + transformKeys[p3] = key; + } + return { + v1: _transformedPoints[p1], + v2: _transformedPoints[p2], + v3: _transformedPoints[p3], + n: _transformedNormals[p1] + }; + } }