mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
transformed point caching
This commit is contained in:
parent
770eac480a
commit
04a774a41e
6 changed files with 63 additions and 10 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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...
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package src;
|
||||
|
||||
import shaders.Gamma;
|
||||
import collision.Collision;
|
||||
import shapes.MegaMarble;
|
||||
import shapes.Blast;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue