transformed point caching

This commit is contained in:
RandomityGuy 2022-12-30 14:51:17 +05:30
parent 770eac480a
commit 04a774a41e
6 changed files with 63 additions and 10 deletions

View file

@ -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) {

View file

@ -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));

View file

@ -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...

View file

@ -1,6 +1,5 @@
package src;
import shaders.Gamma;
import collision.Collision;
import shapes.MegaMarble;
import shapes.Blast;

View file

@ -38,6 +38,8 @@ class CollisionEntity implements IOctreeObject implements IBVHObject {
public var difEdgeMap:Map<Int, dif.Edge>;
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;

View file

@ -20,7 +20,10 @@ class CollisionSurface implements IOctreeObject implements IBVHObject {
public var edgeConcavities:Array<Bool>;
public var originalIndices:Array<Int>;
public var originalSurfaceIndex:Int;
public var key:Bool = false;
public var transformKeys:Array<Int>;
var _transformedPoints:Array<Vector>;
var _transformedNormals:Array<Vector>;
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]
};
}
}