fix some CCD and trigger bugs

This commit is contained in:
RandomityGuy 2023-02-13 23:29:09 +05:30
parent e87411794c
commit c56d382c3a
5 changed files with 24 additions and 14 deletions

View file

@ -999,10 +999,11 @@ class Marble extends GameObject {
// for (iter in 0...10) { // for (iter in 0...10) {
// var iterationFound = false; // var iterationFound = false;
for (obj in foundObjs.filter(x -> x.go is InteriorObject || (x.go is PathedInterior))) { for (obj in foundObjs) {
// Its an MP so bruh // Its an MP so bruh
if (!obj.go.isCollideable) if (!obj.go.isCollideable)
continue; continue;
var invMatrix = @:privateAccess obj.invTransform; var invMatrix = @:privateAccess obj.invTransform;
if (obj.go is PathedInterior) if (obj.go is PathedInterior)
invMatrix = obj.transform.getInverse(); invMatrix = obj.transform.getInverse();
@ -1063,8 +1064,9 @@ class Marble extends GameObject {
testTriangles.push({ testTriangles.push({
v: [v0, v, v2], v: [v0, v, v2],
n: surfaceNormal, n: surfaceNormal,
edge: surf.edgeData[Math.floor(i / 3)], edge: surf.edgeData != null ? surf.edgeData[Math.floor(i / 3)] : 0,
concavity: surface.edgeConcavities.slice(Math.floor(i / 3), Math.floor(i / 3) + 3) concavity: surface.edgeConcavities != null ? surface.edgeConcavities.slice(Math.floor(i / 3),
Math.floor(i / 3) + 3) : [false, false, false],
}); });
// Time until collision with the plane // Time until collision with the plane

View file

@ -1606,10 +1606,12 @@ class MarbleWorld extends Scheduler {
for (collider in endpadBB) { for (collider in endpadBB) {
if (collider.go == this.endPad) { if (collider.go == this.endPad) {
var chull = cast(collider, collision.CollisionHull); var chull = cast(collider, collision.CollisionHull);
var chullinvT = @:privateAccess chull.invTransform.clone();
chullinvT.clone();
for (surface in chull.surfaces) { for (surface in chull.surfaces) {
var i = 0; var i = 0;
while (i < surface.indices.length) { while (i < surface.indices.length) {
var surfaceN = surface.normals[surface.indices[i]].transformed3x3(chull.transform); var surfaceN = surface.normals[surface.indices[i]].transformed3x3(chullinvT);
var v1 = surface.points[surface.indices[i]].transformed(chull.transform); var v1 = surface.points[surface.indices[i]].transformed(chull.transform);
var surfaceD = -surfaceN.dot(v1); var surfaceD = -surfaceN.dot(v1);

View file

@ -257,9 +257,10 @@ class PathedInterior extends InteriorObject {
var m2:PathedInteriorMarker = this.markerData[1]; var m2:PathedInteriorMarker = this.markerData[1];
if (m1 == null) { if (m1 == null) {
// Incase there are no markers at all // Incase there are no markers at all
var mat = new Matrix(); var tmp = new Matrix();
this.baseOrientation.toMatrix(mat); var mat = Matrix.S(this.baseScale.x, this.baseScale.y, this.baseScale.z);
mat.scale(this.baseScale.x, this.baseScale.y, this.baseScale.z); this.baseOrientation.toMatrix(tmp);
mat.multiply3x4(mat, tmp);
mat.setPosition(this.basePosition); mat.setPosition(this.basePosition);
return mat; return mat;
} }
@ -310,10 +311,10 @@ class PathedInterior extends InteriorObject {
position = position.sub(firstPosition); position = position.sub(firstPosition);
position = position.add(basePosition); // Add the base position position = position.add(basePosition); // Add the base position
var mat = new Matrix(); var tmp = new Matrix();
this.baseOrientation.toMatrix(mat); var mat = Matrix.S(this.baseScale.x, this.baseScale.y, this.baseScale.z);
this.baseOrientation.toMatrix(tmp);
mat.scale(this.baseScale.x, this.baseScale.y, this.baseScale.z); mat.multiply3x4(mat, tmp);
mat.setPosition(position); mat.setPosition(position);
return mat; return mat;

View file

@ -120,6 +120,8 @@ class CollisionEntity implements IOctreeObject implements IBVHObject {
public function rayCast(rayOrigin:Vector, rayDirection:Vector):Array<RayIntersectionData> { public function rayCast(rayOrigin:Vector, rayDirection:Vector):Array<RayIntersectionData> {
var invMatrix = invTransform; var invMatrix = invTransform;
var invTPos = invMatrix.clone();
invTPos.transpose();
var rStart = rayOrigin.clone(); var rStart = rayOrigin.clone();
rStart.transform(invMatrix); rStart.transform(invMatrix);
var rDir = rayDirection.transformed3x3(invMatrix); var rDir = rayDirection.transformed3x3(invMatrix);
@ -128,7 +130,7 @@ class CollisionEntity implements IOctreeObject implements IBVHObject {
var iData:Array<RayIntersectionData> = []; var iData:Array<RayIntersectionData> = [];
for (i in intersections) { for (i in intersections) {
i.point.transform(transform); i.point.transform(transform);
i.normal.transform3x3(transform); i.normal.transform3x3(invTPos);
i.normal.normalize(); i.normal.normalize();
iData.push({point: i.point, normal: i.normal, object: i.object}); iData.push({point: i.point, normal: i.normal, object: i.object});
} }
@ -137,7 +139,7 @@ class CollisionEntity implements IOctreeObject implements IBVHObject {
var intersections = this.bvh.rayCast(rStart, rDir); var intersections = this.bvh.rayCast(rStart, rDir);
for (i in intersections) { for (i in intersections) {
i.point.transform(transform); i.point.transform(transform);
i.normal.transform3x3(transform); i.normal.transform3x3(invTPos);
i.normal.normalize(); i.normal.normalize();
} }

View file

@ -14,7 +14,10 @@ class MustChangeTrigger extends Trigger {
} }
public override function onMarbleEnter(time:TimeState) { public override function onMarbleEnter(time:TimeState) {
this.interior.setTargetTime(time, MisParser.parseNumber(this.element.targettime) / 1000); var ttime = MisParser.parseNumber(this.element.targettime);
if (ttime > 0)
ttime /= 1000;
this.interior.setTargetTime(time, ttime);
if (this.element.instant == "1") { if (this.element.instant == "1") {
if (this.element.icontinuetottime != null && this.element.icontinuetottime != "0") { if (this.element.icontinuetottime != null && this.element.icontinuetottime != "0") {
// Absolutely strange, and not sure if it's even a thing in MBG, but is implement nonetheless. // Absolutely strange, and not sure if it's even a thing in MBG, but is implement nonetheless.