From 2477299746217b07052bc9f8174b010774efe84d Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sat, 8 Jun 2024 23:50:12 +0530 Subject: [PATCH] fix trigger vertical limit --- src/MarbleWorld.hx | 88 ++++++++++++++++++++++++++++++--- src/triggers/InBoundsTrigger.hx | 7 +++ src/triggers/Trigger.hx | 1 + 3 files changed, 89 insertions(+), 7 deletions(-) diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 1938ece3..466f8159 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -2005,20 +2005,94 @@ class MarbleWorld extends Scheduler { if (contact.go is Trigger) { var trigger:Trigger = cast contact.go; var triggeraabb = trigger.collider.boundingBox; - - if (triggeraabb.collide(box)) { - trigger.onMarbleInside(marble, timeState); - if (!this.shapeOrTriggerInside.contains(contact.go)) { - this.shapeOrTriggerInside.push(contact.go); - trigger.onMarbleEnter(marble, timeState); + if (trigger.accountForGravity) { + var up = marble.currentUp; + var extents = triggeraabb.getCenter(); + var enterExtents = box.getCenter(); + var diffExtents = enterExtents.sub(extents); + var upAmount = up.dot(diffExtents.toVector()); + if (upAmount > 0) { + var boxC = box.clone(); + boxC.xMin -= up.x * upAmount; + boxC.yMin -= up.y * upAmount; + boxC.zMin -= up.z * upAmount; + boxC.xMax -= up.x * upAmount; + boxC.yMax -= up.y * upAmount; + boxC.zMax -= up.z * upAmount; + // Debug.drawSphere(boxC.getCenter().toVector(), 0.3, 0.25); + if (triggeraabb.collide(boxC)) { + trigger.onMarbleInside(marble, timeState); + if (!this.shapeOrTriggerInside.contains(contact.go)) { + this.shapeOrTriggerInside.push(contact.go); + trigger.onMarbleEnter(marble, timeState); + } + inside.push(contact.go); + } + } else { + // Debug.drawSphere(box.getCenter().toVector(), 0.3, 0.25); + if (triggeraabb.collide(box)) { + trigger.onMarbleInside(marble, timeState); + if (!this.shapeOrTriggerInside.contains(contact.go)) { + this.shapeOrTriggerInside.push(contact.go); + trigger.onMarbleEnter(marble, timeState); + } + inside.push(contact.go); + } + } + } else { + if (triggeraabb.collide(box)) { + trigger.onMarbleInside(marble, timeState); + if (!this.shapeOrTriggerInside.contains(contact.go)) { + this.shapeOrTriggerInside.push(contact.go); + trigger.onMarbleEnter(marble, timeState); + } + inside.push(contact.go); } - inside.push(contact.go); } } } } for (object in shapeOrTriggerInside) { + if (object is Trigger) { + var trigger:Trigger = cast object; + var triggeraabb = trigger.collider.boundingBox; + if (trigger.accountForGravity) { + var up = marble.currentUp; + var extents = triggeraabb.getCenter(); + var enterExtents = box.getCenter(); + var diffExtents = enterExtents.sub(extents); + var upAmount = up.dot(diffExtents.toVector()); + if (upAmount > 0) { + var boxC = box.clone(); + boxC.xMin -= up.x * upAmount; + boxC.yMin -= up.y * upAmount; + boxC.zMin -= up.z * upAmount; + boxC.xMax -= up.x * upAmount; + boxC.yMax -= up.y * upAmount; + boxC.zMax -= up.z * upAmount; + // Debug.drawSphere(boxC.getCenter().toVector(), 0.3, 0.25); + if (triggeraabb.collide(boxC)) { + trigger.onMarbleInside(marble, timeState); + if (!this.shapeOrTriggerInside.contains(object)) { + this.shapeOrTriggerInside.push(object); + trigger.onMarbleEnter(marble, timeState); + } + inside.push(object); + } + } else { + // Debug.drawSphere(box.getCenter().toVector(), 0.3, 0.25); + if (triggeraabb.collide(box)) { + trigger.onMarbleInside(marble, timeState); + if (!this.shapeOrTriggerInside.contains(object)) { + this.shapeOrTriggerInside.push(object); + trigger.onMarbleEnter(marble, timeState); + } + inside.push(object); + } + } + } + } if (!inside.contains(object)) { this.shapeOrTriggerInside.remove(object); object.onMarbleLeave(marble, timeState); diff --git a/src/triggers/InBoundsTrigger.hx b/src/triggers/InBoundsTrigger.hx index 7a62e762..0ea1e040 100644 --- a/src/triggers/InBoundsTrigger.hx +++ b/src/triggers/InBoundsTrigger.hx @@ -1,10 +1,17 @@ package triggers; +import mis.MissionElement.MissionElementTrigger; import src.TimeState; import src.ResourceLoader; import src.Marble; +import src.MarbleWorld; class InBoundsTrigger extends Trigger { + public function new(element:MissionElementTrigger, level:MarbleWorld) { + super(element, level); + this.accountForGravity = true; + } + override function onMarbleLeave(marble:Marble, timeState:TimeState) { this.level.goOutOfBounds(marble); // this.level.replay.recordMarbleLeave(this); diff --git a/src/triggers/Trigger.hx b/src/triggers/Trigger.hx index 6bd2583c..6da7e184 100644 --- a/src/triggers/Trigger.hx +++ b/src/triggers/Trigger.hx @@ -21,6 +21,7 @@ class Trigger extends GameObject { var vertices:Array; public var collider:BoxCollisionEntity; + public var accountForGravity:Bool = false; public function new(element:MissionElementTrigger, level:MarbleWorld) { super();