mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
Add forceobject support with ductfan and tornado
This commit is contained in:
parent
1dc1966d8f
commit
abcd9db939
7 changed files with 108 additions and 15 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
23
src/shapes/DuctFan.hx
Normal file
23
src/shapes/DuctFan.hx
Normal file
|
|
@ -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()
|
||||
}
|
||||
];
|
||||
}
|
||||
}
|
||||
23
src/shapes/SmallDuctFan.hx
Normal file
23
src/shapes/SmallDuctFan.hx
Normal file
|
|
@ -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()
|
||||
}
|
||||
];
|
||||
}
|
||||
}
|
||||
39
src/shapes/Tornado.hx
Normal file
39
src/shapes/Tornado.hx
Normal file
|
|
@ -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)
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue