From abcd9db939b1a40adbaf7fc660a3a0005ce7c3a0 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Fri, 4 Jun 2021 11:20:18 +0530 Subject: [PATCH] Add forceobject support with ductfan and tornado --- src/ForceObject.hx | 19 +++++++++---------- src/Main.hx | 8 +++----- src/Marble.hx | 10 ++++++++++ src/MarbleWorld.hx | 1 + src/shapes/DuctFan.hx | 23 ++++++++++++++++++++++ src/shapes/SmallDuctFan.hx | 23 ++++++++++++++++++++++ src/shapes/Tornado.hx | 39 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 108 insertions(+), 15 deletions(-) create mode 100644 src/shapes/DuctFan.hx create mode 100644 src/shapes/SmallDuctFan.hx create mode 100644 src/shapes/Tornado.hx diff --git a/src/ForceObject.hx b/src/ForceObject.hx index 86ca6637..323358cf 100644 --- a/src/ForceObject.hx +++ b/src/ForceObject.hx @@ -1,5 +1,6 @@ package src; +import src.DtsObject; import h3d.Vector; import h3d.scene.CustomObject; @@ -10,15 +11,13 @@ enum ForceType { ForceCone; } -class ForceData { - public var forceType:ForceType; - public var forceNode:Int; - public var forceVector:Vector; - public var forceRadius:Float; - public var forceStrength:Float; - public var forceArc:Float; - - public function new() {} +typedef ForceData = { + var forceType:ForceType; + var forceNode:Int; + var forceVector:Vector; + var forceRadius:Float; + var forceStrength:Float; + var forceArc:Float; } class ForceObject extends DtsObject { @@ -37,7 +36,7 @@ class ForceObject extends DtsObject { var node = this.getMountTransform(forceData.forceNode); var nodeVec:Vector; if (forceData.forceVector.length() == 0) { - nodeVec = new Vector(node._12, node._22, node._32); + nodeVec = node.right(); } else { nodeVec = forceData.forceVector; } diff --git a/src/Main.hx b/src/Main.hx index b5465861..6c16956b 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -1,5 +1,7 @@ package; +import shapes.Tornado; +import shapes.DuctFan; import dts.DtsFile; import src.InteriorGeometry; import h3d.Quat; @@ -25,11 +27,7 @@ class Main extends hxd.App { override function init() { super.init(); - dtsObj = new DtsObject(); - dtsObj.dtsPath = "data/shapes/hazards/ductfan.dts"; - dtsObj.isCollideable = false; - dtsObj.isTSStatic = false; - // dtsObj.setRotation(Math.PI / 2, 0, 0); + dtsObj = new Tornado(); world = new MarbleWorld(s3d); diff --git a/src/Marble.hx b/src/Marble.hx index 05088868..b650a713 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -1,5 +1,7 @@ package src; +import src.ForceObject; +import src.MarbleWorld; import h3d.Quat; import src.ResourceLoader; import collision.Collision; @@ -38,6 +40,8 @@ class Marble extends Object { public var velocity:Vector; public var omega:Vector; + public var level:MarbleWorld; + var gravityDir:Vector = new Vector(0, 0, -1); public var _radius = 0.2; @@ -114,6 +118,12 @@ class Marble extends Object { function getExternalForces(m:Move, dt:Float) { var gWorkGravityDir = gravityDir; var A = gWorkGravityDir.multiply(this._gravity); + for (obj in level.dtsObjects) { + if (obj is ForceObject) { + var force = cast(obj, ForceObject).getForce(this.getAbsPos().getPosition()); + A = A.add(force.multiply(1 / _mass)); + } + } if (contacts.length != 0) { var contactForce = 0.0; var contactNormal = new Vector(); diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 1c9a1ede..1eb600c9 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -52,6 +52,7 @@ class MarbleWorld { public function addMarble(marble:Marble) { this.marbles.push(marble); + marble.level = cast this; if (marble.controllable) { this.scene.addChild(marble.camera); } diff --git a/src/shapes/DuctFan.hx b/src/shapes/DuctFan.hx new file mode 100644 index 00000000..3360ff5a --- /dev/null +++ b/src/shapes/DuctFan.hx @@ -0,0 +1,23 @@ +package shapes; + +import h3d.Vector; +import src.ForceObject; + +class DuctFan extends ForceObject { + public function new() { + super(); + this.dtsPath = "data/shapes/hazards/ductfan.dts"; + this.isCollideable = true; + this.isTSStatic = false; + this.forceDatas = [ + { + forceType: ForceCone, + forceNode: 0, + forceStrength: 40, + forceRadius: 10, + forceArc: 0.7, + forceVector: new Vector() + } + ]; + } +} diff --git a/src/shapes/SmallDuctFan.hx b/src/shapes/SmallDuctFan.hx new file mode 100644 index 00000000..bfa88a64 --- /dev/null +++ b/src/shapes/SmallDuctFan.hx @@ -0,0 +1,23 @@ +package shapes; + +import h3d.Vector; +import src.ForceObject; + +class SmallDuctFan extends ForceObject { + public function new() { + super(); + this.dtsPath = "data/shapes/hazards/ductfan.dts"; + this.isCollideable = true; + this.isTSStatic = false; + this.forceDatas = [ + { + forceType: ForceCone, + forceNode: 0, + forceStrength: 10, + forceRadius: 5, + forceArc: 0.7, + forceVector: new Vector() + } + ]; + } +} diff --git a/src/shapes/Tornado.hx b/src/shapes/Tornado.hx new file mode 100644 index 00000000..e09bf18c --- /dev/null +++ b/src/shapes/Tornado.hx @@ -0,0 +1,39 @@ +package shapes; + +import h3d.Vector; +import src.ForceObject; + +class Tornado extends ForceObject { + public function new() { + super(); + this.dtsPath = "data/shapes/hazards/tornado.dts"; + this.isCollideable = true; + this.isTSStatic = false; + this.forceDatas = [ + { + forceType: ForceSpherical, + forceNode: 0, + forceStrength: -60, + forceRadius: 8, + forceArc: 0, + forceVector: new Vector() + }, + { + forceType: ForceSpherical, + forceNode: 0, + forceStrength: 60, + forceRadius: 3, + forceArc: 0, + forceVector: new Vector() + }, + { + forceType: ForceField, + forceNode: 0, + forceStrength: 250, + forceRadius: 3, + forceArc: 0, + forceVector: new Vector(0, 0, 1) + }, + ]; + } +}