commit
f7c7c7de6d
|
@ -5,7 +5,9 @@ package armory.trait.physics.bullet;
|
||||||
import iron.math.Vec4;
|
import iron.math.Vec4;
|
||||||
import iron.math.Mat4;
|
import iron.math.Mat4;
|
||||||
import iron.Trait;
|
import iron.Trait;
|
||||||
|
import iron.object.Object;
|
||||||
import iron.object.MeshObject;
|
import iron.object.MeshObject;
|
||||||
|
import iron.object.Transform;
|
||||||
import iron.data.MeshData;
|
import iron.data.MeshData;
|
||||||
import iron.data.SceneFormat;
|
import iron.data.SceneFormat;
|
||||||
import armory.trait.physics.RigidBody;
|
import armory.trait.physics.RigidBody;
|
||||||
|
@ -13,26 +15,29 @@ import armory.trait.physics.PhysicsWorld;
|
||||||
import haxebullet.Bullet;
|
import haxebullet.Bullet;
|
||||||
|
|
||||||
class PhysicsHook extends Trait {
|
class PhysicsHook extends Trait {
|
||||||
|
var target:Object;
|
||||||
var targetName:String;
|
var targetName:String;
|
||||||
|
var targetTransform:Transform;
|
||||||
var verts:Array<Float>;
|
var verts:Array<Float>;
|
||||||
|
var hook_rb:BtRigidBody;
|
||||||
|
|
||||||
public function new(targetName:String, verts:Array<Float>) {
|
public function new(targetName:String, verts:Array<Float>) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.targetName = targetName;
|
this.targetName = targetName;
|
||||||
this.verts = verts;
|
this.verts = verts;
|
||||||
|
hook_rb = null;
|
||||||
|
|
||||||
Scene.active.notifyOnInit(function() {
|
Scene.active.notifyOnInit(function() {
|
||||||
notifyOnInit(init);
|
notifyOnInit(init);
|
||||||
|
notifyOnUpdate(update);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
|
|
||||||
// Hook to empty axes
|
// Hook to empty axes
|
||||||
var target = targetName != "" ? iron.Scene.active.getChild(targetName) : null;
|
target = targetName != "" ? iron.Scene.active.getChild(targetName) : null;
|
||||||
var targetTransform = target != null ? target.transform : object.transform;
|
targetTransform = target != null ? target.transform : object.transform;
|
||||||
|
|
||||||
var physics = PhysicsWorld.active;
|
var physics = PhysicsWorld.active;
|
||||||
|
|
||||||
|
@ -46,22 +51,22 @@ class PhysicsHook extends Trait {
|
||||||
var _shape = BtSphereShape.create(0.01);
|
var _shape = BtSphereShape.create(0.01);
|
||||||
var _transform = BtTransform.create();
|
var _transform = BtTransform.create();
|
||||||
_transform.setIdentity();
|
_transform.setIdentity();
|
||||||
// _transform.setOrigin(BtVector3.create(
|
_transform.setOrigin(BtVector3.create(
|
||||||
// targetTransform.loc.x,
|
targetTransform.loc.x,
|
||||||
// targetTransform.loc.y,
|
targetTransform.loc.y,
|
||||||
// targetTransform.loc.z));
|
targetTransform.loc.z));
|
||||||
// _transform.setRotation(BtQuaternion.create(
|
_transform.setRotation(BtQuaternion.create(
|
||||||
// targetTransform.rot.x,
|
targetTransform.rot.x,
|
||||||
// targetTransform.rot.y,
|
targetTransform.rot.y,
|
||||||
// targetTransform.rot.z,
|
targetTransform.rot.z,
|
||||||
// targetTransform.rot.w));
|
targetTransform.rot.w));
|
||||||
var _centerOfMassOffset = BtTransform.create();
|
var _centerOfMassOffset = BtTransform.create();
|
||||||
_centerOfMassOffset.setIdentity();
|
_centerOfMassOffset.setIdentity();
|
||||||
var _motionState = BtDefaultMotionState.create(_transform, _centerOfMassOffset);
|
var _motionState = BtDefaultMotionState.create(_transform, _centerOfMassOffset);
|
||||||
var mass = 0.0;
|
var mass = 0.0;
|
||||||
_shape.calculateLocalInertia(mass, _inertia);
|
_shape.calculateLocalInertia(mass, _inertia);
|
||||||
var _bodyCI = BtRigidBodyConstructionInfo.create(mass, _motionState, _shape, _inertia);
|
var _bodyCI = BtRigidBodyConstructionInfo.create(mass, _motionState, _shape, _inertia);
|
||||||
var rb = BtRigidBody.create(_bodyCI);
|
hook_rb = BtRigidBody.create(_bodyCI);
|
||||||
|
|
||||||
#if js
|
#if js
|
||||||
var nodes = sb.body.get_m_nodes();
|
var nodes = sb.body.get_m_nodes();
|
||||||
|
@ -88,7 +93,7 @@ class PhysicsHook extends Trait {
|
||||||
|
|
||||||
// Anchor node to rigid body
|
// Anchor node to rigid body
|
||||||
if (Math.abs(nodePos.x() - x) < 0.01 && Math.abs(nodePos.y() - y) < 0.01 && Math.abs(nodePos.z() - z) < 0.01) {
|
if (Math.abs(nodePos.x() - x) < 0.01 && Math.abs(nodePos.y() - y) < 0.01 && Math.abs(nodePos.z() - z) < 0.01) {
|
||||||
sb.body.appendAnchor(i, rb, false, 1.0 / numVerts);
|
sb.body.appendAnchor(i, hook_rb, false, 1.0 / numVerts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,6 +124,25 @@ class PhysicsHook extends Trait {
|
||||||
// Rigid body or soft body not initialized yet
|
// Rigid body or soft body not initialized yet
|
||||||
notifyOnInit(init);
|
notifyOnInit(init);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function update() {
|
||||||
|
if(hook_rb == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var _transform = BtTransform.create();
|
||||||
|
_transform.setIdentity();
|
||||||
|
_transform.setOrigin(BtVector3.create(
|
||||||
|
targetTransform.world.getLoc().x,
|
||||||
|
targetTransform.world.getLoc().y,
|
||||||
|
targetTransform.world.getLoc().z));
|
||||||
|
_transform.setRotation(BtQuaternion.create(
|
||||||
|
targetTransform.world.getQuat().x,
|
||||||
|
targetTransform.world.getQuat().y,
|
||||||
|
targetTransform.world.getQuat().z,
|
||||||
|
targetTransform.world.getQuat().w));
|
||||||
|
hook_rb.setWorldTransform(_transform);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#end
|
#end
|
||||||
|
|
|
@ -2360,11 +2360,11 @@ class ArmoryExporter:
|
||||||
soft_mod = None
|
soft_mod = None
|
||||||
for m in bobject.modifiers:
|
for m in bobject.modifiers:
|
||||||
if m.type == 'CLOTH':
|
if m.type == 'CLOTH':
|
||||||
soft_type = 0
|
soft_type = 0 # SoftShape.Cloth
|
||||||
soft_mod = m
|
soft_mod = m
|
||||||
break
|
break
|
||||||
elif m.type == 'SOFT_BODY':
|
elif m.type == 'SOFT_BODY':
|
||||||
soft_type = 1 # Volume
|
soft_type = 1 # SoftShape.Volume
|
||||||
soft_mod = m
|
soft_mod = m
|
||||||
break
|
break
|
||||||
if soft_type >= 0 and bpy.data.worlds['Arm'].arm_physics != 'Disabled':
|
if soft_type >= 0 and bpy.data.worlds['Arm'].arm_physics != 'Disabled':
|
||||||
|
@ -2394,15 +2394,12 @@ class ArmoryExporter:
|
||||||
self.add_hook_trait(to, target, bobject.name, '')
|
self.add_hook_trait(to, target, bobject.name, '')
|
||||||
|
|
||||||
# Hook modifier
|
# Hook modifier
|
||||||
# hook_mod = None
|
hook_mod = None
|
||||||
# for m in bobject.modifiers:
|
for m in bobject.modifiers:
|
||||||
# if m.type == 'HOOK':
|
if m.type == 'HOOK':
|
||||||
# hook_mod = m
|
group_name = m.vertex_group
|
||||||
# break
|
target_name = m.object.name
|
||||||
# if hook_mod != None:
|
self.add_hook_trait(o, bobject, target_name, group_name)
|
||||||
# group_name = hook_mod.vertex_group
|
|
||||||
# target_name = hook_mod.object.name
|
|
||||||
# self.add_hook_trait(o, bobject, target_name, group_name)
|
|
||||||
|
|
||||||
# Camera traits
|
# Camera traits
|
||||||
if type == NodeTypeCamera:
|
if type == NodeTypeCamera:
|
||||||
|
|
Loading…
Reference in a new issue