41 unsigned long laPivot::_nDomains = 0;
43 laPivot::laPivot(
void)
45 angleX = angleY = angleZ = 0;
47 bSimulateCollision = bSimulateGravitation = M_TRUE;
53 velocity = laPoint3();
59 if( ! laPivot::_pCollider ) {
68 void laPivot::_sim_gravitation(laTimer &t)
70 PROFILE_COL(laPivot__sim_gravitation);
71 laCollisionScenario csGravitation;
73 csGravitation.pFirstDomain = _pFirstDomain;
74 csGravitation.nDomains = _nDomains;
86 csGravitation.ptPosition = (laPoint3)(*
this);
89 _pCollider->collideLineWithDomain(lnBase, &csGravitation, 1, M_FALSE);
90 bOnGround = csGravitation.bCollision;
93 if( csGravitation.bCollision )
98 velocity[1] = M_MIN(0, velocity.y());
101 if( csGravitation.bCollision && (csGravitation.pTrap!=NULL) )
102 pTrap = csGravitation.pTrap;
112 csGravitation.ptVector.y( csGravitation.ptVector.y() * -1 );
113 _pCollider->collideLineWithDomain(lnTop, &csGravitation, 1, M_FALSE);
117 if( csGravitation.bCollision ) velocity[1] = M_MAX(0, velocity.y());
124 laPoint3 laPivot::_sim_collisions(laTimer &t)
126 PROFILE_COL(laPivot__sim_collisions);
127 laCollisionScenario cs;
129 cs.pFirstDomain = _pFirstDomain;
130 cs.nDomains = _nDomains;
134 cs.ptVector = _displacement_vector(t, velocity);
135 cs.ptPosition = (laPoint3)(*
this);
154 ::laSystemIntegrator::getRenderer()->styleSet( laColor(0,0,255) );
155 ::laSystemIntegrator::getRenderer()->styleLine( 1 );
156 for(
unsigned i=0; i<4; i++) ln[i].draw(::laSystemIntegrator::getRenderer(), cs.ptPosition);
157 ::laSystemIntegrator::getRenderer()->drawLine(cs.ptPosition, cs.ptPosition+cs.ptVector);
159 _pCollider->collideLinesWithDomain(ln, 4, &cs, 3);
160 return cs.ptModifiedVector;
165 void laPivot::projectShadow()
167 PROFILE_COL(laPivot_projectShadow);
168 ASSERT(_pCollider,
"Nil collider");
169 ASSERT(_pFirstDomain,
"Nil first collision domain");
170 laCollisionScenario csShadow;
172 csShadow.pFirstDomain = _pFirstDomain;
173 csShadow.nDomains = _nDomains;
174 csShadow.ptPosition = (laPoint3)(*
this);
177 _pCollider->collidePointWithDomain(&csShadow, 0, M_FALSE);
184 laPoint3 laPivot::projectVector( laPoint3 vector, M_BOOL *pTrapFlag,
rpgTrap** ppTrap )
186 PROFILE_COL(laPivot_projectVector);
187 ASSERT(_pCollider,
"Nil collider");
188 ASSERT(_pFirstDomain,
"Nil first collision domain domain");
190 laCollisionScenario VectorCol;
192 VectorCol.pFirstDomain = _pFirstDomain;
193 VectorCol.nDomains = _nDomains;
194 VectorCol.ptPosition = (laPoint3)(*
this);
195 VectorCol.ptVector = vector;
197 _pCollider->collidePointWithDomain(&VectorCol, 1, M_FALSE);
199 if(VectorCol.bCollision && pTrapFlag)
204 if(ppTrap) { *ppTrap = VectorCol.pTrap; }
206 else *pTrapFlag = M_FALSE;
209 return VectorCol.ptModifiedVector;
#define M_GRAVITATION_ACC
Force of gravity accelleration;.
#define M_NORMAL_RESPONSE
Distance an object "bounces back" form a collision surface.
#define M_UNIT
Unit of 1 meter.
Collision Detection and Response.
#define M_GRAVITATIONAL_HOVER
Gravity surface distance.