Add initial prototype.
This commit is contained in:
373
3-mid/physics/implement/bullet/source/c/bullet-object.cpp
Normal file
373
3-mid/physics/implement/bullet/source/c/bullet-object.cpp
Normal file
@@ -0,0 +1,373 @@
|
||||
#include "bullet-object.h"
|
||||
#include "btBulletDynamicsCommon.h"
|
||||
|
||||
|
||||
|
||||
///////////////
|
||||
/// C++ Support
|
||||
//
|
||||
|
||||
class KinematicMotionState : public btMotionState
|
||||
{
|
||||
public:
|
||||
KinematicMotionState (const btTransform &initialpos) { mPos1 = initialpos; }
|
||||
virtual ~ KinematicMotionState () { }
|
||||
|
||||
virtual void getWorldTransform ( btTransform &worldTrans) const { worldTrans = mPos1; }
|
||||
void setKinematicPos ( btTransform ¤tPos) { mPos1 = currentPos; }
|
||||
virtual void setWorldTransform (const btTransform &worldTrans) { }
|
||||
|
||||
protected:
|
||||
btTransform mPos1;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
///////////
|
||||
/// Utility
|
||||
//
|
||||
|
||||
btRigidBody*
|
||||
to_bullet (Object* From)
|
||||
{
|
||||
return (btRigidBody*) From;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Object*
|
||||
to_bt3 (btRigidBody* From)
|
||||
{
|
||||
return (Object*) From;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
///////////////
|
||||
/// C Interface
|
||||
//
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
|
||||
int
|
||||
is_Kinematic (btRigidBody* Self)
|
||||
{
|
||||
return Self->getCollisionFlags()
|
||||
& btCollisionObject::CF_KINEMATIC_OBJECT;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
struct Object*
|
||||
b3d_new_Object (Real Mass,
|
||||
Shape* the_Shape,
|
||||
int is_Kinematic)
|
||||
{
|
||||
btCollisionShape* bt_Shape = (btCollisionShape*) (the_Shape);
|
||||
btScalar mass = Mass;
|
||||
bool isDynamic = (mass != 0.f);
|
||||
btVector3 localInertia (0,0,0);
|
||||
btTransform groundTransform;
|
||||
|
||||
groundTransform.setIdentity();
|
||||
|
||||
if (isDynamic)
|
||||
bt_Shape->calculateLocalInertia (mass, localInertia);
|
||||
|
||||
|
||||
KinematicMotionState* myMotionState = new KinematicMotionState (groundTransform);
|
||||
btRigidBody::btRigidBodyConstructionInfo rbInfo (mass, myMotionState, bt_Shape, localInertia);
|
||||
btRigidBody* body = new btRigidBody (rbInfo);
|
||||
|
||||
|
||||
if (is_Kinematic)
|
||||
{
|
||||
body->setCollisionFlags ( body->getCollisionFlags()
|
||||
| btCollisionObject::CF_KINEMATIC_OBJECT);
|
||||
|
||||
body->setActivationState (DISABLE_DEACTIVATION);
|
||||
}
|
||||
|
||||
if (isDynamic)
|
||||
body->setActivationState (DISABLE_DEACTIVATION);
|
||||
|
||||
return (Object*) body;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Shape*
|
||||
b3d_Object_Shape (Object* Self)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
return (Shape*) the_Body->getCollisionShape ();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void*
|
||||
b3d_Object_user_Data (Object* Self)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
return the_Body->getUserPointer ();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_user_Data_is (Object* Self, void* Now)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
the_Body->setUserPointer (Now);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Real
|
||||
b3d_Object_Mass (Object* Self)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
Real inv_Mass = the_Body->getInvMass();
|
||||
|
||||
if (inv_Mass == 0.0)
|
||||
return 0.0;
|
||||
else
|
||||
return 1.0 / inv_Mass;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_Friction_is (Object* Self, Real Now)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
the_Body->setFriction (Now);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_Restitution_is (Object* Self, Real Now)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
the_Body->setRestitution (Now);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Vector_3
|
||||
b3d_Object_Site (Object* Self)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
Vector_3 the_Site;
|
||||
|
||||
btTransform& trans = the_Body->getWorldTransform ();
|
||||
btVector3 bt_Site = trans.getOrigin();
|
||||
|
||||
the_Site.x = bt_Site.x();
|
||||
the_Site.y = bt_Site.y();
|
||||
the_Site.z = bt_Site.z();
|
||||
|
||||
return the_Site;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_Site_is (Object* Self, Vector_3* Now)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
btTransform& trans = the_Body->getWorldTransform ();
|
||||
|
||||
trans.setOrigin (btVector3 (Now->x, Now->y, Now->z));
|
||||
the_Body->activate();
|
||||
|
||||
if (is_Kinematic (the_Body))
|
||||
{
|
||||
KinematicMotionState* the_Motion_State = (KinematicMotionState*) the_Body->getMotionState();
|
||||
|
||||
the_Motion_State->setKinematicPos (trans);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Matrix_3x3
|
||||
b3d_Object_Spin (Object* Self)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
Vector_3 the_Site;
|
||||
|
||||
btTransform& trans = the_Body->getWorldTransform ();
|
||||
btMatrix3x3 the_Spin = trans.getBasis();
|
||||
|
||||
btVector3& R1 = the_Spin [0];
|
||||
btVector3& R2 = the_Spin [1];
|
||||
btVector3& R3 = the_Spin [2];
|
||||
|
||||
return Matrix_3x3 (R1 [0], R1 [1], R1 [2],
|
||||
R2 [0], R2 [1], R2 [2],
|
||||
R3 [0], R3 [1], R3 [2]);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_Spin_is (Object* Self, Matrix_3x3* Now)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
btTransform& trans = the_Body->getWorldTransform();
|
||||
|
||||
trans.setBasis (btMatrix3x3 (Now->m00, Now->m01, Now->m02,
|
||||
Now->m10, Now->m11, Now->m12,
|
||||
Now->m20, Now->m21, Now->m22));
|
||||
|
||||
if (is_Kinematic (the_Body))
|
||||
{
|
||||
KinematicMotionState* the_Motion_State = (KinematicMotionState*) the_Body->getMotionState();
|
||||
|
||||
the_Motion_State->setKinematicPos (trans);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Matrix_4x4
|
||||
b3d_Object_Transform (Object* Self)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
btTransform& trans = the_Body->getWorldTransform ();
|
||||
btScalar gl_Matrix [16];
|
||||
|
||||
trans.getOpenGLMatrix (gl_Matrix);
|
||||
|
||||
return Matrix_4x4 (gl_Matrix);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_Transform_is (Object* Self, Matrix_4x4* Now)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
|
||||
if (is_Kinematic (the_Body))
|
||||
{
|
||||
btTransform trans;
|
||||
KinematicMotionState* the_Motion_State = (KinematicMotionState*) the_Body->getMotionState();
|
||||
|
||||
trans.setFromOpenGLMatrix (&Now->m00);
|
||||
the_Motion_State->setKinematicPos (trans);
|
||||
}
|
||||
else
|
||||
{
|
||||
btTransform& trans = the_Body->getWorldTransform ();
|
||||
|
||||
trans.setFromOpenGLMatrix (&Now->m00);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Vector_3
|
||||
b3d_Object_Speed (Object* Self)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
Vector_3 the_Speed;
|
||||
btVector3 bt_Speed = the_Body->getLinearVelocity ();
|
||||
|
||||
the_Speed.x = bt_Speed.x();
|
||||
the_Speed.y = bt_Speed.y();
|
||||
the_Speed.z = bt_Speed.z();
|
||||
|
||||
return the_Speed;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_Speed_is (Object* Self, Vector_3* Now)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
the_Body->setLinearVelocity (btVector3 (Now->x, Now->y, Now->z));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Vector_3
|
||||
b3d_Object_Gyre (Object* Self)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
Vector_3 the_Gyre;
|
||||
btVector3 bt_Gyre = the_Body->getAngularVelocity ();
|
||||
|
||||
the_Gyre.x = bt_Gyre.x();
|
||||
the_Gyre.y = bt_Gyre.y();
|
||||
the_Gyre.z = bt_Gyre.z();
|
||||
|
||||
return the_Gyre;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_Gyre_is (Object* Self, Vector_3* Now)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
the_Body->setAngularVelocity (btVector3 (Now->x, Now->y, Now->z));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_apply_Torque (Object* Self, Vector_3* Torque)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
the_Body->applyTorque (btVector3 (Torque->x, Torque->y, Torque->z));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_apply_Torque_impulse (Object* Self, Vector_3* Torque)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
the_Body->applyTorqueImpulse (btVector3 (Torque->x, Torque->y, Torque->z));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
b3d_Object_apply_Force (Object* Self, Vector_3* Force)
|
||||
{
|
||||
btRigidBody* the_Body = to_bullet (Self);
|
||||
|
||||
the_Body->applyCentralImpulse (btVector3 (Force->x, Force->y, Force->z));
|
||||
}
|
||||
|
||||
|
||||
} // extern "C"
|
||||
Reference in New Issue
Block a user