mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-04-27 05:01:38 +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.points = [];
|
||||||
colliderSurface.normals = [];
|
colliderSurface.normals = [];
|
||||||
colliderSurface.indices = [];
|
colliderSurface.indices = [];
|
||||||
|
colliderSurface.transformKeys = [];
|
||||||
colliderSurface.edgeData = [];
|
colliderSurface.edgeData = [];
|
||||||
colliderSurface.edgeConcavities = [];
|
colliderSurface.edgeConcavities = [];
|
||||||
colliderSurface.originalIndices = [];
|
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.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]) {
|
for (v in [p1, p2, p3]) {
|
||||||
var buckets = vertexBuckets.get(v);
|
var buckets = vertexBuckets.get(v);
|
||||||
if (buckets == null) {
|
if (buckets == null) {
|
||||||
|
|
|
||||||
|
|
@ -520,6 +520,7 @@ class DtsObject extends GameObject {
|
||||||
hs.points = [];
|
hs.points = [];
|
||||||
hs.normals = [];
|
hs.normals = [];
|
||||||
hs.indices = [];
|
hs.indices = [];
|
||||||
|
hs.transformKeys = [];
|
||||||
|
|
||||||
var material = this.dts.matNames[primitive.matIndex & TSDrawPrimitive.MaterialMask];
|
var material = this.dts.matNames[primitive.matIndex & TSDrawPrimitive.MaterialMask];
|
||||||
if (dtsMaterials.exists(material)) {
|
if (dtsMaterials.exists(material)) {
|
||||||
|
|
@ -544,6 +545,7 @@ class DtsObject extends GameObject {
|
||||||
for (index in [i1, i2, i3]) {
|
for (index in [i1, i2, i3]) {
|
||||||
var vertex = vertices[index];
|
var vertex = vertices[index];
|
||||||
hs.points.push(new Vector(vertex.x, vertex.y, vertex.z));
|
hs.points.push(new Vector(vertex.x, vertex.y, vertex.z));
|
||||||
|
hs.transformKeys.push(0);
|
||||||
|
|
||||||
var normal = vertexNormals[index];
|
var normal = vertexNormals[index];
|
||||||
hs.normals.push(new Vector(normal.x, normal.y, normal.z));
|
hs.normals.push(new Vector(normal.x, normal.y, normal.z));
|
||||||
|
|
|
||||||
|
|
@ -1019,13 +1019,20 @@ class Marble extends GameObject {
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
while (i < surface.indices.length) {
|
while (i < surface.indices.length) {
|
||||||
var v0 = surface.points[surface.indices[i]].transformed(obj.transform);
|
var verts = surface.transformTriangle(i, obj.transform, @:privateAccess obj._transformKey);
|
||||||
var v = surface.points[surface.indices[i + 1]].transformed(obj.transform);
|
// var v0 = surface.points[surface.indices[i]].transformed(tform);
|
||||||
var v2 = surface.points[surface.indices[i + 2]].transformed(obj.transform);
|
// 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 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);
|
var surfaceD = -surfaceNormal.dot(v0);
|
||||||
|
|
||||||
// If we're going the wrong direction or not going to touch the plane, ignore...
|
// If we're going the wrong direction or not going to touch the plane, ignore...
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
import shaders.Gamma;
|
|
||||||
import collision.Collision;
|
import collision.Collision;
|
||||||
import shapes.MegaMarble;
|
import shapes.MegaMarble;
|
||||||
import shapes.Blast;
|
import shapes.Blast;
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,8 @@ class CollisionEntity implements IOctreeObject implements IBVHObject {
|
||||||
|
|
||||||
public var difEdgeMap:Map<Int, dif.Edge>;
|
public var difEdgeMap:Map<Int, dif.Edge>;
|
||||||
|
|
||||||
|
var _transformKey:Int = 0;
|
||||||
|
|
||||||
public function new(go:GameObject) {
|
public function new(go:GameObject) {
|
||||||
this.go = go;
|
this.go = go;
|
||||||
this.octree = new Octree();
|
this.octree = new Octree();
|
||||||
|
|
@ -87,6 +89,7 @@ class CollisionEntity implements IOctreeObject implements IBVHObject {
|
||||||
this.invTransform = transform.getInverse();
|
this.invTransform = transform.getInverse();
|
||||||
generateBoundingBox();
|
generateBoundingBox();
|
||||||
}
|
}
|
||||||
|
_transformKey++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function generateBoundingBox() {
|
public function generateBoundingBox() {
|
||||||
|
|
@ -162,9 +165,13 @@ class CollisionEntity implements IOctreeObject implements IBVHObject {
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
while (i < surface.indices.length) {
|
while (i < surface.indices.length) {
|
||||||
var v0 = surface.points[surface.indices[i]].transformed(tform);
|
var verts = surface.transformTriangle(i, tform, this._transformKey);
|
||||||
var v = surface.points[surface.indices[i + 1]].transformed(tform);
|
// var v0 = surface.points[surface.indices[i]].transformed(tform);
|
||||||
var v2 = surface.points[surface.indices[i + 2]].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 e1e2 = hashEdge(surface.originalIndices[i], surface.originalIndices[i + 1]);
|
||||||
// var e2e3 = hashEdge(surface.originalIndices[i + 1], surface.originalIndices[i + 2]);
|
// 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 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 res = Collision.TriangleSphereIntersection(v0, v, v2, surfacenormal, position, radius, edgeData, edgeConcavities);
|
||||||
var closest = res.point;
|
var closest = res.point;
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,10 @@ class CollisionSurface implements IOctreeObject implements IBVHObject {
|
||||||
public var edgeConcavities:Array<Bool>;
|
public var edgeConcavities:Array<Bool>;
|
||||||
public var originalIndices:Array<Int>;
|
public var originalIndices:Array<Int>;
|
||||||
public var originalSurfaceIndex: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() {}
|
public function new() {}
|
||||||
|
|
||||||
|
|
@ -117,4 +120,35 @@ class CollisionSurface implements IOctreeObject implements IBVHObject {
|
||||||
|
|
||||||
return furthestVertex;
|
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