From 266a29afc4d14eb1bfb1f43b82f9a19986bf2137 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Mon, 13 Feb 2023 19:01:33 +0530 Subject: [PATCH] fix bad collision normals --- data/tmp/cache.dat | 2 +- src/Debug.hx | 32 ++++++++++++++++++++++ src/Marble.hx | 4 ++- src/MarbleGame.hx | 5 +++- src/MarbleWorld.hx | 6 +++-- src/collision/CollisionEntity.hx | 44 ++++++++++++++++--------------- src/collision/CollisionSurface.hx | 4 +-- 7 files changed, 69 insertions(+), 28 deletions(-) diff --git a/data/tmp/cache.dat b/data/tmp/cache.dat index f63bcd3f..ed8011f7 100644 --- a/data/tmp/cache.dat +++ b/data/tmp/cache.dat @@ -1 +1 @@ -by16:font%2Farial.fntaoy3:veri1y4:timei1659272757y4:hashy40:dc7f069d72e0d1b6b7edfd5b9e6af9c22f9c641cy3:outy23:tmp%2Ffont%2Farial.bfntghy21:font%2FMarkerFelt.fntaoR1i1R2i1672239219R3y40:eb239790210478413cc111da54400b3d38aba041R5y28:tmp%2Ffont%2FMarkerFelt.bfntghy27:font%2FLucida%20Console.fntaoR1i1R2i1672239804R3y40:b56483df1b8f3d8472856b51459d5ce8f3cdfa09R5y34:tmp%2Ffont%2FLucida%20Console.bfntghy16:font%2FEXPON.fntaoR1i1R2i1659272757R3y40:ba8ecd55d9475ee0f9d20c9a5189fe6a9c9ff727R5y23:tmp%2Ffont%2FEXPON.bfntghy21:font%2FDomCasualD.fntaoR1i1R2i1659272757R3y40:ea40ffbf969a51d3e653a3d09b450143a814c7eeR5y28:tmp%2Ffont%2FDomCasualD.bfntghy23:font%2FArial%20Bold.fntaoR1i1R2i1659272757R3y40:dce4a5edf92262f9ea5540d55271f8423683d064R5y30:tmp%2Ffont%2FArial%20Bold.bfntghy23:data%2Ffont%2Farial.fntaoR1i1R2i1659272757R3R4R5y37:data%2Ftmp%2Fdata%2Ffont%2Farial.bfntghy28:data%2Ffont%2FMarkerFelt.fntaoR1i1R2i1672239219R3R8R5y42:data%2Ftmp%2Fdata%2Ffont%2FMarkerFelt.bfntghy34:data%2Ffont%2FLucida%20Console.fntaoR1i1R2i1672239804R3R11R5y48:data%2Ftmp%2Fdata%2Ffont%2FLucida%20Console.bfntghy23:data%2Ffont%2FEXPON.fntaoR1i1R2i1659272757R3R14R5y37:data%2Ftmp%2Fdata%2Ffont%2FEXPON.bfntghy28:data%2Ffont%2FDomCasualD.fntaoR1i1R2i1659272757R3R17R5y42:data%2Ftmp%2Fdata%2Ffont%2FDomCasualD.bfntghy30:data%2Ffont%2FArial%20Bold.fntaoR1i1R2i1659272757R3R20R5y44:data%2Ftmp%2Fdata%2Ffont%2FArial%20Bold.bfntghh \ No newline at end of file +by30:data%2Ffont%2FArial%20Bold.fntaoy3:outy44:data%2Ftmp%2Fdata%2Ffont%2FArial%20Bold.bfnty3:veri1y4:hashy40:dce4a5edf92262f9ea5540d55271f8423683d064y4:timei1659272757ghy21:font%2FDomCasualD.fntaoR1y28:tmp%2Ffont%2FDomCasualD.bfntR3i1R4y40:ea40ffbf969a51d3e653a3d09b450143a814c7eeR6i1659272757ghy16:font%2FEXPON.fntaoR1y23:tmp%2Ffont%2FEXPON.bfntR3i1R4y40:ba8ecd55d9475ee0f9d20c9a5189fe6a9c9ff727R6i1659272757ghy27:font%2FLucida%20Console.fntaoR1y34:tmp%2Ffont%2FLucida%20Console.bfntR3i1R4y40:b56483df1b8f3d8472856b51459d5ce8f3cdfa09R6i1675969447ghy23:font%2FArial%20Bold.fntaoR1y30:tmp%2Ffont%2FArial%20Bold.bfntR3i1R4R5R6i1659272757ghy28:data%2Ffont%2FMarkerFelt.fntaoR1y42:data%2Ftmp%2Fdata%2Ffont%2FMarkerFelt.bfntR3i1R4y40:eb239790210478413cc111da54400b3d38aba041R6i1675969447ghy16:font%2Farial.fntaoR1y23:tmp%2Ffont%2Farial.bfntR3i1R4y40:dc7f069d72e0d1b6b7edfd5b9e6af9c22f9c641cR6i1659272757ghy28:data%2Ffont%2FDomCasualD.fntaoR1y42:data%2Ftmp%2Fdata%2Ffont%2FDomCasualD.bfntR3i1R4R9R6i1659272757ghy34:data%2Ffont%2FLucida%20Console.fntaoR1y48:data%2Ftmp%2Fdata%2Ffont%2FLucida%20Console.bfntR3i1R4R15R6i1675969447ghy21:font%2FMarkerFelt.fntaoR1y28:tmp%2Ffont%2FMarkerFelt.bfntR3i1R4R20R6i1675969447ghy23:data%2Ffont%2FEXPON.fntaoR1y37:data%2Ftmp%2Fdata%2Ffont%2FEXPON.bfntR3i1R4R12R6i1659272757ghy23:data%2Ffont%2Farial.fntaoR1y37:data%2Ftmp%2Fdata%2Ffont%2Farial.bfntR3i1R4R23R6i1659272757ghh \ No newline at end of file diff --git a/src/Debug.hx b/src/Debug.hx index 34f1d427..8219657a 100644 --- a/src/Debug.hx +++ b/src/Debug.hx @@ -1,8 +1,40 @@ package src; +import src.MarbleGame; +import h3d.Vector; + @:publicFields class Debug { static var timeScale:Float = 1.0; static var wireFrame:Bool = false; static var drawBounds:Bool = false; + + static var _triangles:Array = []; + + static var debugTriangles:h3d.scene.Mesh; + + public static function update() { + if (_triangles.length != 0 && drawBounds) { + var prim = new h3d.prim.Polygon(_triangles.copy()); + if (debugTriangles != null) { + debugTriangles.remove(); + } + debugTriangles = new h3d.scene.Mesh(prim, h3d.mat.Material.create()); + prim.addUVs(); + prim.addNormals(); + MarbleGame.instance.scene.addChild(debugTriangles); + _triangles = []; + } else { + if (debugTriangles != null) { + debugTriangles.remove(); + debugTriangles = null; + } + } + } + + public static function drawTriangle(p1:Vector, p2:Vector, p3:Vector) { + _triangles.push(p3.toPoint()); + _triangles.push(p2.toPoint()); + _triangles.push(p1.toPoint()); + } } diff --git a/src/Marble.hx b/src/Marble.hx index 78ce0825..66e77299 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -1006,6 +1006,8 @@ class Marble extends GameObject { var invMatrix = @:privateAccess obj.invTransform; if (obj.go is PathedInterior) invMatrix = obj.transform.getInverse(); + var invTform = invMatrix.clone(); + invTform.transpose(); var localpos = position.clone(); localpos.transform(invMatrix); @@ -1032,7 +1034,7 @@ class Marble extends GameObject { var i = 0; while (i < surface.indices.length) { - var verts = surface.transformTriangle(i, obj.transform, @:privateAccess obj._transformKey); + var verts = surface.transformTriangle(i, obj.transform, invTform, @: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); diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index 15d118f8..d8ab5dda 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -176,6 +176,7 @@ class MarbleGame { world = null; return; } + Debug.update(); if (Util.isTouchDevice()) { touchInput.update(); } @@ -224,7 +225,9 @@ class MarbleGame { exitGameDlg = new ExitGameDlg((sender) -> { canvas.popDialog(exitGameDlg); if (world.isRecording) { - MarbleGame.canvas.pushDialog(new ReplayNameDlg(() -> {quitMission();})); + MarbleGame.canvas.pushDialog(new ReplayNameDlg(() -> { + quitMission(); + })); } else { quitMission(); } diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index b3505451..a92f4322 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -684,7 +684,8 @@ class MarbleWorld extends Scheduler { var tmp = new Matrix(); interiorRotation.toMatrix(tmp); mat.multiply3x4(mat, tmp); - mat.setPosition(interiorPosition); + var tmat = Matrix.T(interiorPosition.x, interiorPosition.y, interiorPosition.z); + mat.multiply(mat, tmat); interior.setTransform(mat); interior.isCollideable = hasCollision; @@ -809,7 +810,8 @@ class MarbleWorld extends Scheduler { var tmp = new Matrix(); shapeRotation.toMatrix(tmp); mat.multiply3x4(mat, tmp); - mat.setPosition(shapePosition); + var tmat = Matrix.T(shapePosition.x, shapePosition.y, shapePosition.z); + mat.multiply(mat, tmat); this.addDtsObject(shape, () -> { shape.setTransform(mat); diff --git a/src/collision/CollisionEntity.hx b/src/collision/CollisionEntity.hx index c4bd1c31..9dfdd0c3 100644 --- a/src/collision/CollisionEntity.hx +++ b/src/collision/CollisionEntity.hx @@ -73,26 +73,26 @@ class CollisionEntity implements IOctreeObject implements IBVHObject { if (this.transform.equal(transform)) return; // Speedup - if (Util.mat3x3equal(this.transform, transform)) { - var oldPos = this.transform.getPosition(); - var newPos = transform.getPosition(); - this.transform.setPosition(newPos); - this.invTransform.setPosition(newPos.multiply(-1)); - if (this.boundingBox == null) - generateBoundingBox(); - else { - this.boundingBox.xMin += newPos.x - oldPos.x; - this.boundingBox.xMax += newPos.x - oldPos.x; - this.boundingBox.yMin += newPos.y - oldPos.y; - this.boundingBox.yMax += newPos.y - oldPos.y; - this.boundingBox.zMin += newPos.z - oldPos.z; - this.boundingBox.zMax += newPos.z - oldPos.z; - } - } else { - this.transform.load(transform); - this.invTransform = transform.getInverse(); - generateBoundingBox(); - } + // if (Util.mat3x3equal(this.transform, transform)) { + // var oldPos = this.transform.getPosition(); + // var newPos = transform.getPosition(); + // this.transform.setPosition(newPos); + // this.invTransform.setPosition(newPos.multiply(-1)); + // if (this.boundingBox == null) + // generateBoundingBox(); + // else { + // this.boundingBox.xMin += newPos.x - oldPos.x; + // this.boundingBox.xMax += newPos.x - oldPos.x; + // this.boundingBox.yMin += newPos.y - oldPos.y; + // this.boundingBox.yMax += newPos.y - oldPos.y; + // this.boundingBox.zMin += newPos.z - oldPos.z; + // this.boundingBox.zMax += newPos.z - oldPos.z; + // } + // } else { + this.transform.load(transform); + this.invTransform = transform.getInverse(); + generateBoundingBox(); + // } _transformKey++; } @@ -169,6 +169,8 @@ class CollisionEntity implements IOctreeObject implements IBVHObject { var sphereRadius = new Vector(radius * invScale.x, radius * invScale.y, radius * invScale.z); sphereBounds.addSpherePos(localPos.x, localPos.y, localPos.z, Math.max(Math.max(sphereRadius.x, sphereRadius.y), sphereRadius.z) * 1.1); var surfaces = bvh == null ? octree.boundingSearch(sphereBounds).map(x -> cast x) : bvh.boundingSearch(sphereBounds); + var invtform = invMatrix.clone(); + invtform.transpose(); var tform = transform.clone(); // tform.setPosition(tform.getPosition().add(this.velocity.multiply(timeState.dt))); @@ -183,7 +185,7 @@ class CollisionEntity implements IOctreeObject implements IBVHObject { var i = 0; while (i < surface.indices.length) { - var verts = surface.transformTriangle(i, tform, this._transformKey); + var verts = surface.transformTriangle(i, tform, invtform, 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); diff --git a/src/collision/CollisionSurface.hx b/src/collision/CollisionSurface.hx index 96acdf37..28f24471 100644 --- a/src/collision/CollisionSurface.hx +++ b/src/collision/CollisionSurface.hx @@ -121,7 +121,7 @@ class CollisionSurface implements IOctreeObject implements IBVHObject { return furthestVertex; } - public function transformTriangle(idx:Int, tform:Matrix, key:Int) { + public function transformTriangle(idx:Int, tform:Matrix, invtform:Matrix, key:Int) { if (_transformedPoints == null) { _transformedPoints = points.copy(); } @@ -133,7 +133,7 @@ class CollisionSurface implements IOctreeObject implements IBVHObject { var p3 = indices[idx + 2]; if (transformKeys[p1] != key) { _transformedPoints[p1] = points[p1].transformed(tform); - _transformedNormals[p1] = normals[p1].transformed3x3(tform).normalized(); + _transformedNormals[p1] = normals[p1].transformed3x3(invtform).normalized(); transformKeys[p1] = key; } if (transformKeys[p2] != key) {