20 #include "phyobject.h"
21 #include "private/phyobjectprivate.h"
22 #include "private/worldprivate.h"
27 :
WObject( w, name, tm, false ), materialv(
"default") {
29 priv =
new PhyObjectPrivate();
31 if ( createPrivate ) {
32 w->pushObject(
this );
33 createPrivateObject();
41 objInertiaVec =
wVector(0.0, 1.0, 1.0, 1.0);
42 objInvInertiaVec =
wVector(0.0, 1.0, 1.0, 1.0);
46 #ifdef WORLDSIM_USE_NEWTON
47 if (
priv->body != NULL ) {
48 NewtonDestroyBody( worldpriv->world,
priv->body );
49 NewtonReleaseCollision( worldpriv->world,
priv->collision );
59 #ifdef WORLDSIM_USE_NEWTON
62 NewtonBodySetTransformCallback(
priv->body, 0 );
63 NewtonBodySetForceAndTorqueCallback(
priv->body, 0 );
80 NewtonBodySetMassMatrix(
priv->body, 0, 1, 1, 1 );
84 NewtonCollision* nullC = NewtonCreateNull( worldpriv->world );
85 NewtonBodySetCollision(
priv->body, nullC );
86 NewtonReleaseCollision( worldpriv->world, nullC );
90 NewtonBodySetTransformCallback(
priv->body, (PhyObjectPrivate::setTransformHandler) );
91 NewtonBodySetForceAndTorqueCallback(
priv->body, (PhyObjectPrivate::applyForceAndTorqueHandler) );
92 NewtonBodySetFreezeState(
priv->body, 0 );
93 NewtonBodySetCollision(
priv->body,
priv->collision );
94 NewtonBodySetMatrix(
priv->body, &
tm[0][0] );
97 NewtonBodySetMassMatrix(
priv->body, 0.0, 1.0, 1.0, 1.0 );
99 NewtonBodySetMassMatrix(
priv->body, objInertiaVec[0], objInertiaVec[1], objInertiaVec[2], objInertiaVec[3] );
107 if (isStatic == b)
return;
109 #ifdef WORLDSIM_USE_NEWTON
111 NewtonBodySetMassMatrix(
priv->body, 0.0, 1.0, 1.0, 1.0 );
113 NewtonBodySetMassMatrix(
priv->body, objInertiaVec[0], objInertiaVec[1], objInertiaVec[2], objInertiaVec[3] );
119 #ifdef WORLDSIM_USE_NEWTON
123 NewtonBodySetForce(
priv->body, &forceAcc[0] );
124 NewtonBodySetTorque(
priv->body, &torqueAcc[0] );
125 NewtonBodySetOmega(
priv->body, &zero[0] );
126 NewtonBodySetVelocity(
priv->body, &zero[0] );
128 NewtonWorld* nworld = NewtonBodyGetWorld(
priv->body );
129 NewtonWorldCriticalSectionLock( nworld );
130 for( NewtonJoint* contactList = NewtonBodyGetFirstContactJoint(
priv->body ); contactList;
131 contactList = NewtonBodyGetNextContactJoint(
priv->body, contactList ) ) {
133 for(
void* contact = NewtonContactJointGetFirstContact(contactList); contact; contact = nextContact ) {
135 nextContact = NewtonContactJointGetNextContact( contactList, contact );
136 NewtonContactJointRemoveContact( contactList, contact );
139 NewtonWorldCriticalSectionUnlock( nworld );
144 #ifdef WORLDSIM_USE_NEWTON
146 NewtonBodySetMatrix(
priv->body, &
tm[0][0] );
150 void PhyObject::addForce(
const wVector& force ) {
154 void PhyObject::setForce(
const wVector& force) {
158 wVector PhyObject::force() {
160 #ifdef WORLDSIM_USE_NEWTON
161 NewtonBodyGetForce(
priv->body, &f[0] );
166 void PhyObject::addTorque(
const wVector& torque ) {
170 void PhyObject::setTorque(
const wVector& torque ) {
174 wVector PhyObject::torque() {
176 #ifdef WORLDSIM_USE_NEWTON
177 NewtonBodyGetTorque(
priv->body, &t[0] );
184 #ifdef WORLDSIM_USE_NEWTON
186 NewtonBodySetMassMatrix(
priv->body, mi[0], mi[1], mi[2], mi[3] );
187 NewtonBodyGetInvMass(
priv->body, &objInvInertiaVec[0], &objInvInertiaVec[1], &objInvInertiaVec[2], &objInvInertiaVec[3]);
192 return objInertiaVec;
195 wVector PhyObject::invMassInertiaVec()
const {
196 return objInvInertiaVec;
201 mi[0] = objInvInertiaVec[1];
202 mi[1] = objInvInertiaVec[2];
203 mi[2] = objInvInertiaVec[3];
209 #ifdef WORLDSIM_USE_NEWTON
210 if ( newmass < 0.0001 ) {
211 objInertiaVec =
wVector(0.0, 1.0, 1.0, 1.0);
212 objInvInertiaVec =
wVector(0.0, 1.0, 1.0, 1.0);
214 NewtonBodySetMassMatrix(
priv->body, 0, 1, 1, 1 );
217 real centre[3] = { 0, 0, 0 };
218 NewtonConvexCollisionCalculateInertialMatrix(
priv->collision, inertia, centre );
220 objInertiaVec =
wVector(newmass, newmass*inertia[0], newmass*inertia[1], newmass*inertia[2]);
221 NewtonBodySetMassMatrix(
priv->body, objInertiaVec[0], objInertiaVec[1], objInertiaVec[2], objInertiaVec[3] );
223 NewtonBodyGetInvMass(
priv->body, &objInvInertiaVec[0], &objInvInertiaVec[1], &objInvInertiaVec[2], &objInvInertiaVec[3]);
226 NewtonBodySetMassMatrix(
priv->body, 0, 1, 1, 1 );
233 return objInertiaVec[0];
236 void PhyObject::setOmega(
const wVector& omega ) {
237 #ifdef WORLDSIM_USE_NEWTON
238 NewtonBodySetOmega(
priv->body, &omega[0] );
242 wVector PhyObject::omega() {
244 #ifdef WORLDSIM_USE_NEWTON
245 NewtonBodyGetOmega(
priv->body, &t[0] );
250 void PhyObject::setVelocity(
const wVector& velocity ) {
251 #ifdef WORLDSIM_USE_NEWTON
252 NewtonBodySetVelocity(
priv->body, &velocity[0] );
256 wVector PhyObject::velocity() {
258 #ifdef WORLDSIM_USE_NEWTON
259 NewtonBodyGetVelocity(
priv->body, &t[0] );
264 void PhyObject::addImpulse(
const wVector& pointDeltaVeloc,
const wVector& pointPosit ) {
265 #ifdef WORLDSIM_USE_NEWTON
266 NewtonBodyAddImpulse(
priv->body, &pointDeltaVeloc[0], &pointPosit[0] );
270 void PhyObject::setMaterial( QString material ) {
271 this->materialv = material;
272 #ifdef WORLDSIM_USE_NEWTON
273 if (
worldv->priv->matIDs.contains( material ) ) {
274 NewtonBodySetMaterialGroupID(
priv->body,
worldv->priv->matIDs[material] );
279 QString PhyObject::material()
const {
283 void PhyObject::createPrivateObject() {
284 #ifdef WORLDSIM_USE_NEWTON
285 NewtonCollision* c = NewtonCreateNull( worldpriv->world );
287 priv->body = NewtonCreateBody( worldpriv->world, c, &initialTransformationMatrix[0][0] );
288 priv->collision = NewtonBodyGetCollision(
priv->body );
290 NewtonBodySetAutoSleep(
priv->body, 0 );
291 NewtonBodySetMassMatrix(
priv->body, 1.0, 1.0, 1.0, 1.0 );
292 NewtonBodySetUserData(
priv->body,
this );
294 NewtonBodySetTransformCallback(
priv->body, (PhyObjectPrivate::setTransformHandler) );
295 NewtonBodySetForceAndTorqueCallback(
priv->body, (PhyObjectPrivate::applyForceAndTorqueHandler) );