Add forceobject support with ductfan and tornado

This commit is contained in:
RandomityGuy 2021-06-04 11:20:18 +05:30
parent 1dc1966d8f
commit abcd9db939
7 changed files with 108 additions and 15 deletions

View file

@ -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;
}

View file

@ -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);

View file

@ -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();

View file

@ -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
View 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()
}
];
}
}

View 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
View 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)
},
];
}
}