Separate physics module

This commit is contained in:
Lubos Lenco 2017-09-30 00:32:06 +02:00
parent 743a8d1a39
commit 24aa6c4787
43 changed files with 176 additions and 298 deletions

View file

@ -3,7 +3,7 @@ package armory.logicnode;
import armory.object.Object;
import armory.math.Mat4;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
#end
class AppendTransformNode extends LogicNode {

View file

@ -2,7 +2,7 @@ package armory.logicnode;
import armory.object.Object;
import armory.math.Vec4;
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
class ApplyImpulseNode extends LogicNode {

View file

@ -19,7 +19,7 @@ class CastPhysicsRayNode extends LogicNode {
var vto:Vec4 = inputs[1].get();
#if arm_physics
var physics = armory.trait.internal.PhysicsWorld.active;
var physics = armory.trait.physics.PhysicsWorld.active;
var rb = physics.rayCast(vfrom, vto);
if (from == 0) { // Object

View file

@ -1,7 +1,7 @@
package armory.logicnode;
import armory.object.Object;
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
class GetContactsNode extends LogicNode {
@ -13,7 +13,7 @@ class GetContactsNode extends LogicNode {
var object:Object = inputs[0].get();
#if arm_physics
var physics = armory.trait.internal.PhysicsWorld.active;
var physics = armory.trait.physics.PhysicsWorld.active;
var rbs = physics.getContacts(object.getTrait(RigidBody));
var obs = [];
if (rbs != null) for (rb in rbs) obs.push(rb.object);

View file

@ -1,7 +1,7 @@
package armory.logicnode;
import armory.object.Object;
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
class GetFirstContactNode extends LogicNode {
@ -13,7 +13,7 @@ class GetFirstContactNode extends LogicNode {
var object:Object = inputs[0].get();
#if arm_physics
var physics = armory.trait.internal.PhysicsWorld.active;
var physics = armory.trait.physics.PhysicsWorld.active;
var rbs = physics.getContacts(object.getTrait(RigidBody));
if (rbs != null) return rbs[0].object;
#end

View file

@ -1,6 +1,6 @@
package armory.logicnode;
import armory.trait.internal.Navigation;
import armory.trait.navigation.Navigation;
import armory.object.Object;
import armory.math.Vec4;

View file

@ -1,7 +1,7 @@
package armory.logicnode;
import armory.object.Object;
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
class HasContactNode extends LogicNode {
@ -14,7 +14,7 @@ class HasContactNode extends LogicNode {
var object2:Object = inputs[1].get();
#if arm_physics
var physics = armory.trait.internal.PhysicsWorld.active;
var physics = armory.trait.physics.PhysicsWorld.active;
var rb2 = object2.getTrait(RigidBody);
var rbs = physics.getContacts(object1.getTrait(RigidBody));
if (rbs != null) for (rb in rbs) if (rb == rb2) return true;

View file

@ -1,7 +1,7 @@
package armory.logicnode;
import armory.math.Vec4;
import armory.trait.internal.Navigation;
import armory.trait.navigation.Navigation;
class NavigableLocationNode extends LogicNode {

View file

@ -1,7 +1,7 @@
package armory.logicnode;
import armory.object.Object;
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
class OnContactNode extends LogicNode {
@ -24,7 +24,7 @@ class OnContactNode extends LogicNode {
var contact = false;
#if arm_physics
var physics = armory.trait.internal.PhysicsWorld.active;
var physics = armory.trait.physics.PhysicsWorld.active;
var rb2 = object2.getTrait(RigidBody);
var rbs = physics.getContacts(object1.getTrait(RigidBody));
if (rbs != null) {

View file

@ -1,7 +1,7 @@
package armory.logicnode;
#if arm_physics
import armory.trait.internal.PhysicsWorld;
import armory.trait.physics.PhysicsWorld;
#end
class OnInitNode extends LogicNode {

View file

@ -18,9 +18,9 @@ class PickLocationNode extends LogicNode {
if (object == null) null;
#if arm_physics
var physics = armory.trait.internal.PhysicsWorld.active;
var physics = armory.trait.physics.PhysicsWorld.active;
var b = physics.pickClosest(coords.x, coords.y);
var rb = object.getTrait(armory.trait.internal.RigidBody);
var rb = object.getTrait(armory.trait.physics.RigidBody);
if (rb != null && b == rb) {
var p = physics.hitPointWorld;

View file

@ -14,7 +14,7 @@ class PickObjectNode extends LogicNode {
var coords:Vec4 = inputs[0].get();
#if arm_physics
var physics = armory.trait.internal.PhysicsWorld.active;
var physics = armory.trait.physics.PhysicsWorld.active;
var rb = physics.pickClosest(coords.x, coords.y);
if (rb == null) return null;

View file

@ -5,7 +5,7 @@ import armory.math.Mat4;
import armory.math.Quat;
import armory.math.Vec4;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
#end
class RotateObjectNode extends LogicNode {

View file

@ -4,7 +4,7 @@ import armory.object.Object;
import armory.math.Mat4;
import armory.math.Vec4;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
#end
class ScaleObjectNode extends LogicNode {

View file

@ -3,7 +3,7 @@ package armory.logicnode;
import armory.object.Object;
import armory.math.Vec4;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
#end
class SetLocationNode extends LogicNode {

View file

@ -3,7 +3,7 @@ package armory.logicnode;
import armory.object.Object;
import armory.math.Vec4;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
#end
class SetRotationNode extends LogicNode {

View file

@ -3,7 +3,7 @@ package armory.logicnode;
import armory.object.Object;
import armory.math.Vec4;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
#end
class SetScaleNode extends LogicNode {

View file

@ -3,7 +3,7 @@ package armory.logicnode;
import armory.object.Object;
import armory.math.Mat4;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
#end
class SetTransformNode extends LogicNode {

View file

@ -2,7 +2,7 @@ package armory.logicnode;
import armory.object.Object;
import armory.math.Vec4;
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
class SetVelocityNode extends LogicNode {

View file

@ -4,7 +4,7 @@ import armory.object.Object;
import armory.math.Mat4;
import armory.math.Vec4;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.physics.RigidBody;
#end
class TranslateObjectNode extends LogicNode {

View file

@ -3,7 +3,7 @@ package armory.trait;
import iron.math.Vec4;
import iron.system.Input;
import iron.object.Object;
import armory.trait.internal.PhysicsWorld;
import armory.trait.physics.PhysicsWorld;
import armory.trait.internal.CameraController;
class FirstPersonController extends CameraController {

View file

@ -1,7 +1,7 @@
package armory.trait;
#if arm_navigation
import armory.trait.internal.Navigation;
import armory.trait.navigation.Navigation;
import haxerecast.Recast;
#end

View file

@ -7,8 +7,9 @@ import iron.object.MeshObject;
import iron.data.MeshData;
import iron.data.SceneFormat;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.internal.PhysicsWorld;
import armory.trait.physics.bullet.RigidBody; // TODO - import Shape
import armory.trait.physics.RigidBody;
import armory.trait.physics.PhysicsWorld;
import haxebullet.Bullet;
#end
@ -30,7 +31,7 @@ class PhysicsBreak extends Trait {
}
function init() {
if (physics == null) physics = armory.trait.internal.PhysicsWorld.active;
if (physics == null) physics = armory.trait.physics.PhysicsWorld.active;
body = object.getTrait(RigidBody);
breaker.initBreakableObject(cast object, body.mass, new Vec4(), new Vec4(), true);
@ -62,7 +63,7 @@ class PhysicsBreak extends Trait {
var ud = breaker.userDataMap.get(cast o);
var friction = 0.5;
var margin = 0.06;
o.addTrait(new armory.trait.internal.RigidBody(ud.mass, Shape.ConvexHull, friction, margin));
o.addTrait(new armory.trait.physics.RigidBody(ud.mass, Shape.ConvexHull, friction, margin));
if (cast(o, MeshObject).data.geom.positions.length < 600) {
o.addTrait(new PhysicsBreak());
}

View file

@ -4,8 +4,8 @@ import iron.Trait;
import iron.system.Input;
import iron.math.Vec4;
import iron.math.RayCaster;
import armory.trait.internal.RigidBody;
import armory.trait.internal.PhysicsWorld;
import armory.trait.physics.RigidBody;
import armory.trait.physics.PhysicsWorld;
#if arm_physics
import haxebullet.Bullet;
#end
@ -32,7 +32,7 @@ class PhysicsDrag extends Trait {
}
function init() {
if (physics == null) physics = armory.trait.internal.PhysicsWorld.active;
if (physics == null) physics = armory.trait.physics.PhysicsWorld.active;
notifyOnUpdate(update);
}

View file

@ -2,7 +2,7 @@ package armory.trait;
import iron.math.Vec4;
import iron.system.Input;
import armory.trait.internal.PhysicsWorld;
import armory.trait.physics.PhysicsWorld;
import armory.trait.internal.CameraController;
class ThirdPersonController extends CameraController {

View file

@ -5,7 +5,7 @@ import iron.object.Object;
import iron.object.CameraObject;
import iron.object.Transform;
import iron.system.Time;
import armory.trait.internal.PhysicsWorld;
import armory.trait.physics.PhysicsWorld;
#if arm_physics
import haxebullet.Bullet;
#end
@ -51,7 +51,7 @@ class VehicleBody extends Trait {
}
function init() {
physics = armory.trait.internal.PhysicsWorld.active;
physics = armory.trait.physics.PhysicsWorld.active;
transform = object.transform;
camera = iron.Scene.active.camera;

View file

@ -4,6 +4,7 @@ import iron.Trait;
import iron.system.Input;
import iron.object.Transform;
import iron.object.CameraObject;
import armory.trait.physics.RigidBody;
class CameraController extends Trait {

View file

@ -176,7 +176,7 @@ class DebugConsole extends Trait {
updateTime += iron.App.updateTime;
animTime += iron.object.Animation.animationTime;
#if arm_physics
physTime += PhysicsWorld.physTime;
physTime += armory.trait.physics.PhysicsWorld.physTime;
#end
}

View file

@ -1,206 +0,0 @@
package armory.trait.internal;
import iron.math.Mat4;
import iron.math.Vec4;
import iron.Trait;
import iron.object.Transform;
import iron.object.MeshObject;
import iron.data.Data;
import iron.data.MaterialData;
import iron.data.MaterialData.MaterialContext;
class PathTracer extends Trait {
var context:MaterialContext;
var ray00Location:Int;
var ray01Location:Int;
var ray10Location:Int;
var ray11Location:Int;
var objectLocations:Array<Int>;
var transformMap:Map<Int, Transform>;
public function new() {
super();
notifyOnInit(init);
}
function getColorFromNode(object:MeshObject):Array<Float> {
// Hard code for now
// for (c in object.materials[0].contexts[0].raw.bind_constants) {
// if (c.name == "baseCol") {
// return c.vec4;
// }
// }
return null;
}
function init() {
// Data.getMaterial('pt_material', '', function(b:MaterialData) {
// context = b.getContext('pt_trace_pass');
// context.raw.bind_constants.push(
// {
// name: "glossiness",
// float: 0.6
// }
// );
// context.raw.bind_constants.push(
// {
// name: "ray00",
// vec3: [0.0, 0.0, 0.0]
// }
// );
// ray00Location = context.raw.bind_constants.length - 1;
// context.raw.bind_constants.push(
// {
// name: "ray01",
// vec3: [0.0, 0.0, 0.0]
// }
// );
// ray01Location = context.raw.bind_constants.length - 1;
// context.raw.bind_constants.push(
// {
// name: "ray10",
// vec3: [0.0, 0.0, 0.0]
// }
// );
// ray10Location = context.raw.bind_constants.length - 1;
// context.raw.bind_constants.push(
// {
// name: "ray11",
// vec3: [0.0, 0.0, 0.0]
// }
// );
// ray11Location = context.raw.bind_constants.length - 1;
// objectLocations = [];
// transformMap = new Map();
// var sphereNum = 0;
// var cubeNum = 0;
// for (n in iron.Scene.active.meshes) {
// if (n.name.split(".")[0] == "Sphere") {
// context.raw.bind_constants.push(
// {
// name: "sphereCenter" + sphereNum,
// vec3: [0.0, 0.0, 0.0]
// }
// );
// var loc = context.raw.bind_constants.length - 1;
// objectLocations.push(loc);
// transformMap.set(loc, n.transform);
// context.raw.bind_constants.push(
// {
// name: "sphereRadius" + sphereNum,
// float: n.transform.size.x / 2 - 0.02
// }
// );
// var col = getColorFromNode(n);
// context.raw.bind_constants.push(
// {
// name: "sphereColor" + sphereNum,
// vec3: [col[0], col[1], col[2]]
// }
// );
// sphereNum++;
// }
// else if (n.name.split(".")[0] == "Cube") {
// context.raw.bind_constants.push(
// {
// name: "cubeCenter" + cubeNum,
// vec3: [0.0, 0.0, 0.0]
// }
// );
// var loc = context.raw.bind_constants.length - 1;
// objectLocations.push(loc);
// transformMap.set(loc, n.transform);
// context.raw.bind_constants.push(
// {
// name: "cubeSize" + cubeNum,
// vec3: [n.transform.size.x / 2, n.transform.size.y / 2, n.transform.size.z / 2]
// }
// );
// var col = getColorFromNode(n);
// context.raw.bind_constants.push(
// {
// name: "cubeColor" + cubeNum,
// vec3: [col[0], col[1], col[2]]
// }
// );
// cubeNum++;
// }
// }
// notifyOnUpdate(update);
// });
}
function update() {
// var camera = iron.Scene.active.camera;
// var eye = camera.transform.loc;
// // var jitter = Mat4.identity();
// // jitter.initTranslate(Math.random() * 2 - 1, Math.random() * 2 - 1, 0);
// // jitter.multiplyScalar(1 / iron.App.w);
// // jitter.multiplyScalar(1 / 400);
// var mvp = Mat4.identity();
// mvp.multmat2(camera.V);
// mvp.multmat2(camera.P);
// var inverse = Mat4.identity();
// // jitter.multmat2(mvp);
// // inverse.getInverse(mvp);
// var matrix = inverse;
// // Set uniforms
// var v = getEyeRay(matrix, -1, -1, eye);
// context.raw.bind_constants[ray00Location].vec3 = [v.x, v.y, v.z];
// var v = getEyeRay(matrix, -1, 1, eye);
// context.raw.bind_constants[ray01Location].vec3 = [v.x, v.y, v.z];
// var v = getEyeRay(matrix, 1, -1, eye);
// context.raw.bind_constants[ray10Location].vec3 = [v.x, v.y, v.z];
// var v = getEyeRay(matrix, 1, 1, eye);
// context.raw.bind_constants[ray11Location].vec3 = [v.x, v.y, v.z];
// for (loc in objectLocations) {
// var t:Transform = transformMap.get(loc);
// t.buildMatrix();
// var c = context.raw.bind_constants[loc];
// c.vec3[0] = t.worldx();
// c.vec3[1] = t.worldy();
// c.vec3[2] = t.worldz();
// }
}
function getEyeRay(matrix:Mat4, x:Float, y:Float, eye:Vec4):Vec4 {
var v = new Vec4();
var vv = new kha.math.FastVector4(x, y, 0, 1);
vv = matrix.multvec(vv);
v.x = vv.x;
v.y = vv.y;
v.z = vv.z;
v.w = vv.w;
v.x /= v.w;
v.y /= v.w;
v.z /= v.w;
v.w /= v.w;
v.sub(eye);
return v;
}
}

View file

@ -1,4 +1,4 @@
package armory.trait.internal;
package armory.trait.navigation;
#if arm_navigation
import haxerecast.Recast;

View file

@ -0,0 +1,19 @@
package armory.trait.physics;
#if (!arm_physics)
class PhysicsConstraint extends Trait { public function new() { super(); } }
#else
#if arm_bullet
typedef PhysicsConstraint = armory.trait.physics.bullet.PhysicsConstraint;
#else
typedef PhysicsConstraint = armory.trait.physics.oimo.PhysicsConstraint;
#end
#end

View file

@ -0,0 +1,19 @@
package armory.trait.physics;
#if (!arm_physics)
class PhysicsHook extends Trait { public function new() { super(); } }
#else
#if arm_bullet
typedef PhysicsHook = armory.trait.physics.bullet.PhysicsHook;
#else
typedef PhysicsHook = armory.trait.physics.oimo.PhysicsHook;
#end
#end

View file

@ -0,0 +1,19 @@
package armory.trait.physics;
#if (!arm_physics)
class PhysicsWorld extends Trait { public function new() { super(); } }
#else
#if arm_bullet
typedef PhysicsWorld = armory.trait.physics.bullet.PhysicsWorld;
#else
typedef PhysicsWorld = armory.trait.physics.oimo.PhysicsWorld;
#end
#end

View file

@ -0,0 +1,19 @@
package armory.trait.physics;
#if (!arm_physics)
class RigidBody extends Trait { public function new() { super(); } }
#else
#if arm_bullet
typedef RigidBody = armory.trait.physics.bullet.RigidBody;
#else
typedef RigidBody = armory.trait.physics.oimo.RigidBody;
#end
#end

View file

@ -0,0 +1,19 @@
package armory.trait.physics;
#if (!arm_physics_soft)
class SoftBody extends Trait { public function new() { super(); } }
#else
#if arm_bullet
typedef SoftBody = armory.trait.physics.bullet.SoftBody;
#else
typedef SoftBody = armory.trait.physics.oimo.SoftBody;
#end
#end

View file

@ -1,4 +1,4 @@
package armory.trait.internal;
package armory.trait.physics.bullet;
import iron.math.Vec4;
import iron.math.Mat4;
@ -6,16 +6,11 @@ import iron.Trait;
import iron.object.MeshObject;
import iron.data.MeshData;
import iron.data.SceneFormat;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.internal.PhysicsWorld;
import armory.trait.physics.RigidBody;
import armory.trait.physics.PhysicsWorld;
import haxebullet.Bullet;
#end
class PhysicsConstraint extends Trait {
#if (!arm_physics)
public function new() { super(); }
#else
var body1:String;
var body2:String;
@ -59,6 +54,4 @@ class PhysicsConstraint extends Trait {
// Rigid body not initialized yet
notifyOnInit(init);
}
#end
}

View file

@ -1,4 +1,4 @@
package armory.trait.internal;
package armory.trait.physics.bullet;
import iron.math.Vec4;
import iron.math.Mat4;
@ -6,16 +6,11 @@ import iron.Trait;
import iron.object.MeshObject;
import iron.data.MeshData;
import iron.data.SceneFormat;
#if arm_physics
import armory.trait.internal.RigidBody;
import armory.trait.internal.PhysicsWorld;
import armory.trait.physics.RigidBody;
import armory.trait.physics.PhysicsWorld;
import haxebullet.Bullet;
#end
class PhysicsHook extends Trait {
#if (!arm_physics)
public function new() { super(); }
#else
var targetName:String;
var verts:Array<Float>;
@ -122,6 +117,4 @@ class PhysicsHook extends Trait {
// Rigid body or soft body not initialized yet
notifyOnInit(init);
}
#end
}

View file

@ -1,8 +1,6 @@
package armory.trait.internal;
package armory.trait.physics.bullet;
#if arm_physics
import haxebullet.Bullet;
#end
import iron.Trait;
import iron.system.Time;
import iron.math.Vec4;
@ -24,9 +22,6 @@ class ContactPair {
class PhysicsWorld extends Trait {
#if (!arm_physics)
public function new() { super(); }
#else
#if arm_profile
public static var physTime = 0.0;
#end
@ -256,5 +251,4 @@ class PhysicsWorld extends Trait {
public function removePreUpdate(f:Void->Void) {
preUpdates.remove(f);
}
#end
}

View file

@ -1,8 +1,6 @@
package armory.trait.internal;
package armory.trait.physics.bullet;
#if arm_physics
import haxebullet.Bullet;
#end
import iron.Trait;
import iron.math.Vec4;
import iron.object.Transform;
@ -10,10 +8,6 @@ import iron.object.MeshObject;
class RigidBody extends Trait {
#if (!arm_physics)
public function new() { super(); }
#else
var shape:Shape;
var _motionState:BtMotionStatePointer;
@ -69,7 +63,7 @@ class RigidBody extends Trait {
ready = true;
transform = object.transform;
physics = armory.trait.internal.PhysicsWorld.active;
physics = armory.trait.physics.PhysicsWorld.active;
var _shape:BtCollisionShapePointer = null;
var _shapeConvex:BtConvexHullShapePointer = null;
@ -287,7 +281,6 @@ class RigidBody extends Trait {
);
}
}
#end
}
@:enum abstract Shape(Int) from Int {

View file

@ -1,4 +1,4 @@
package armory.trait.internal;
package armory.trait.physics.bullet;
import iron.math.Vec4;
import iron.math.Mat4;
@ -7,8 +7,8 @@ import iron.object.MeshObject;
import iron.data.MeshData;
import iron.data.SceneFormat;
#if arm_physics_soft
import armory.trait.internal.RigidBody;
import armory.trait.internal.PhysicsWorld;
import armory.trait.physics.RigidBody;
import armory.trait.physics.PhysicsWorld;
import haxebullet.Bullet;
#end
@ -59,7 +59,7 @@ class SoftBody extends Trait {
if (ready) return;
ready = true;
if (physics == null) physics = armory.trait.internal.PhysicsWorld.active;
if (physics == null) physics = armory.trait.physics.PhysicsWorld.active;
var softBodyHelpers = BtSoftBodyHelpers.create();
var mo = cast(object, MeshObject);

View file

@ -2693,14 +2693,14 @@ class ArmoryExporter:
self.output['traits'] = []
x = {}
x['type'] = 'Script'
x['class_name'] = 'armory.trait.internal.PhysicsWorld'
x['class_name'] = 'armory.trait.physics.PhysicsWorld'
self.output['traits'].append(x)
if wrd.arm_navigation != 'Disabled' and ArmoryExporter.export_navigation:
if not 'traits' in self.output:
self.output['traits'] = []
x = {}
x['type'] = 'Script'
x['class_name'] = 'armory.trait.internal.Navigation'
x['class_name'] = 'armory.trait.navigation.Navigation'
self.output['traits'].append(x)
if wrd.arm_play_console:
if not 'traits' in self.output:
@ -2876,7 +2876,7 @@ class ArmoryExporter:
body_mass = rb.mass
x = {}
x['type'] = 'Script'
x['class_name'] = 'armory.trait.internal.RigidBody'
x['class_name'] = 'armory.trait.physics.RigidBody'
x['parameters'] = [str(body_mass), str(shape), str(rb.friction), str(rb.restitution)]
if rb.use_margin:
x['parameters'].append(str(rb.collision_margin))
@ -2904,7 +2904,7 @@ class ArmoryExporter:
assets.add_khafile_def('arm_physics_soft')
cloth_trait = {}
cloth_trait['type'] = 'Script'
cloth_trait['class_name'] = 'armory.trait.internal.SoftBody'
cloth_trait['class_name'] = 'armory.trait.physics.SoftBody'
if soft_type == 0:
bend = soft_mod.settings.bending_stiffness
elif soft_type == 1:
@ -3068,7 +3068,7 @@ class ArmoryExporter:
def add_hook_trait(self, o, bobject, target_name, group_name):
hook_trait = {}
hook_trait['type'] = 'Script'
hook_trait['class_name'] = 'armory.trait.internal.PhysicsHook'
hook_trait['class_name'] = 'armory.trait.physics.PhysicsHook'
verts = []
if group_name != '':
group = bobject.vertex_groups[group_name].index
@ -3084,7 +3084,7 @@ class ArmoryExporter:
def add_constraint_trait(self, o, rb1, rb2):
constr_trait = {}
constr_trait['type'] = 'Script'
constr_trait['class_name'] = 'armory.trait.internal.PhysicsConstraint'
constr_trait['class_name'] = 'armory.trait.physics.PhysicsConstraint'
constr_trait['parameters'] = ["'" + rb1.name + "'", "'" + rb2.name + "'"]
o['traits'].append(constr_trait)

View file

@ -49,7 +49,8 @@ def init_properties():
bpy.types.World.arm_project_scene = StringProperty(name="Scene", description="Scene to load when launching player")
bpy.types.World.arm_physics = EnumProperty(
items = [('Disabled', 'Disabled', 'Disabled'),
('Bullet', 'Bullet', 'Bullet')],
('Bullet', 'Bullet', 'Bullet'),
('Oimo', 'Oimo', 'Oimo')],
name = "Physics", default='Bullet')
bpy.types.World.arm_navigation = EnumProperty(
items = [('Disabled', 'Disabled', 'Disabled'),

View file

@ -77,12 +77,17 @@ project.addSources('Sources');
if export_physics:
assets.add_khafile_def('arm_physics')
if not os.path.exists('Libraries/haxebullet'):
f.write(add_armory_library(sdk_path + '/lib/', 'haxebullet'))
if state.target == 'krom' or state.target == 'html5' or state.target == 'node':
ammojs_path = sdk_path + '/lib/haxebullet/js/ammo/ammo.js'
ammojs_path = ammojs_path.replace('\\', '/')
f.write(add_assets(ammojs_path))
if wrd.arm_physics == 'Bullet':
assets.add_khafile_def('arm_bullet')
if not os.path.exists('Libraries/haxebullet'):
f.write(add_armory_library(sdk_path + '/lib/', 'haxebullet'))
if state.target == 'krom' or state.target == 'html5' or state.target == 'node':
ammojs_path = sdk_path + '/lib/haxebullet/js/ammo/ammo.js'
ammojs_path = ammojs_path.replace('\\', '/')
f.write(add_assets(ammojs_path))
elif wrd.arm_physics == 'Oimo':
if not os.path.exists('Libraries/oimo'):
f.write(add_armory_library(sdk_path + '/lib/', 'oimo'))
if export_navigation:
assets.add_khafile_def('arm_navigation')
@ -96,6 +101,14 @@ project.addSources('Sources');
if not is_publish:
f.write("""project.addParameter("--macro include('armory.trait')");\n""")
f.write("""project.addParameter("--macro include('armory.trait.internal')");\n""")
if export_physics:
f.write("""project.addParameter("--macro include('armory.trait.physics')");\n""")
if wrd.arm_physics == 'Bullet':
f.write("""project.addParameter("--macro include('armory.trait.physics.bullet')");\n""")
else:
f.write("""project.addParameter("--macro include('armory.trait.physics.oimo')");\n""")
if export_navigation:
f.write("""project.addParameter("--macro include('armory.trait.navigation')");\n""")
if import_logicnodes: # Live patching for logic nodes
f.write("""project.addParameter("--macro include('armory.logicnode')");\n""")