Definition in file move_primitive.cpp.
#include "stdpacs.h"
#include "pacs/move_primitive.h"
#include "pacs/collision_desc.h"
#include "pacs/move_element.h"
#include "nel/misc/hierarchical_timer.h"
Go to the source code of this file.
Defines | |
| #define | NLPACS_HAUTO_GET_GLOBAL_POSITION H_AUTO_USE ( NLPACS_Get_Global_Position ) |
| #define | NLPACS_HAUTO_MOVE H_AUTO_USE ( NLPACS_Move ) |
| #define | NLPACS_HAUTO_SET_GLOBAL_POSITION H_AUTO_USE ( NLPACS_Set_Global_Position ) |
| #define | NLPACS_HAUTO_SET_UGLOBAL_POSITION H_AUTO_USE ( NLPACS_Set_UGlobal_Position ) |
Functions | |
| H_AUTO_DECL (NLPACS_Get_Global_Position) H_AUTO_DECL(NLPACS_Set_Global_Position) H_AUTO_DECL(NLPACS_Set_UGlobal_Position) H_AUTO_DECL(NLPACS_Move) namespace NLPACS | |
|
|
Referenced by H_AUTO_DECL(). |
|
|
Referenced by H_AUTO_DECL(). |
|
|
Referenced by H_AUTO_DECL(). |
|
|
Referenced by H_AUTO_DECL(). |
|
|
Definition at line 35 of file move_primitive.cpp. References depth, nlassert, NLPACS_HAUTO_GET_GLOBAL_POSITION, NLPACS_HAUTO_MOVE, NLPACS_HAUTO_SET_GLOBAL_POSITION, NLPACS_HAUTO_SET_UGLOBAL_POSITION, type, uint, uint8, and width.
00045 {
00046
00047 // ***************************************************************************
00048
00049 CMovePrimitive::CMovePrimitive (CMoveContainer* container, uint8 firstWorldImage, uint8 numWorldImage)
00050 {
00051 _FirstWorldImage=firstWorldImage;
00052 _NumWorldImage=numWorldImage;
00053
00054 _CollisionMask=0xffffffff;
00055 _OcclusionMask=0xffffffff;
00056 _Attenuation=1;
00057 _Container=container;
00058 _StaticFlags=0;
00059 _RootOTInfo=NULL;
00060 _LastTestTime=0xffffffff;
00061
00062 // Ptr table alloc
00063 _WorldImages=_Container->allocateWorldImagesPtrs (numWorldImage);
00064
00065 // Alloc world images
00066 for (uint j=0; j<numWorldImage; j++)
00067 _WorldImages[j]=_Container->allocateWorldImage ();
00068 }
00069
00070 // ***************************************************************************
00071
00072 CMovePrimitive::~CMovePrimitive ()
00073 {
00074 // Alloc world images
00075 for (uint j=0; j<(uint)_NumWorldImage; j++)
00076 {
00077 _WorldImages[j]->deleteIt (*_Container, (uint8)(_FirstWorldImage+j));
00078 _Container->freeWorldImage (_WorldImages[j]);
00079 }
00080
00081 // Ptr table alloc
00082 _Container->freeWorldImagesPtrs (_WorldImages);
00083 }
00084
00085 // ***************************************************************************
00086
00087 void CMovePrimitive::removeCollisionOTInfo (CCollisionOTInfo *toRemove)
00088 {
00089 // Should be ok
00090 CCollisionOTInfo *previousElement=NULL;
00091 CCollisionOTInfo *element=_RootOTInfo;
00092 nlassert (element);
00093
00094 // Look for it
00095 while (element)
00096 {
00097 // Good one ?
00098 if (element==toRemove)
00099 {
00100 // If previous element, just link
00101 if (previousElement)
00102 previousElement->primitiveLink (this, element->getNext (this));
00103 else
00104 _RootOTInfo=element->getNext (this);
00105
00106 // End
00107 break;
00108 }
00109
00110 // Look for next
00111 previousElement=element;
00112 element=element->getNext (this);
00113 }
00114
00115 // Should be found
00116 nlassert (element);
00117 }
00118
00119 // ***************************************************************************
00120
00121 void CMovePrimitive::removeCollisionOTInfo ()
00122 {
00123 // For each element in the list
00124 CCollisionOTInfo *element=_RootOTInfo;
00125 while (element)
00126 {
00127 // Unlink from ot
00128 element->unlink ();
00129
00130 // Remove collision ot info from other primitive
00131 CMovePrimitive *other=element->getOtherPrimitive (this);
00132 if (other)
00133 {
00134 // Remove it in the other element
00135 other->removeCollisionOTInfo (element);
00136 }
00137
00138 // Next element
00139 element=element->getNext (this);
00140 }
00141
00142 // Relink element because we keep it
00143 _RootOTInfo=NULL;
00144 }
00145
00146 // ***************************************************************************
00147
00148 void CMovePrimitive::checkSortedList ()
00149 {
00150 // Check sorted list for ecah world image
00151 for (uint i=0; i<(uint)_NumWorldImage; i++)
00152 _WorldImages[i]->checkSortedList (i+_FirstWorldImage);
00153 }
00154
00155 // ***************************************************************************
00156
00157 bool CMovePrimitive::isTriggered (CMovePrimitive& second, bool enter, bool exit)
00158 {
00159 // Generate a trigger ?
00160
00161 // Is the two are not triggers ?
00162 if ( ( (_StaticFlags&TriggerMask) == NotATrigger ) && ( (second._StaticFlags&TriggerMask) == NotATrigger ) )
00163 return false;
00164
00165 // Is one of them is an enter trigger ?
00166 if ( enter && ( (_StaticFlags&EnterTrigger) || (second._StaticFlags&EnterTrigger) ) )
00167 return true;
00168
00169 // Is one of them is an exit trigger ?
00170 if ( exit && ( (_StaticFlags&ExitTrigger) || (second._StaticFlags&ExitTrigger) ) )
00171 return true;
00172
00173 // Is one of them is a trigger ?
00174 if ( (_StaticFlags&OverlapTrigger) || (second._StaticFlags&OverlapTrigger) )
00175 return true;
00176
00177 return false;
00178 }
00179
00180 // ***************************************************************************
00181
00182 void CMovePrimitive::insertInWorldImage (uint8 worldImage)
00183 {
00184 // Check it is a collisionable primitive
00185 nlassert (!isNonCollisionable());
00186
00187 // Check ad get the primitive world image
00188 CPrimitiveWorldImage *wI=getWorldImage (worldImage);
00189
00190 // Set as inserted
00191 wI->setInWorldImageFlag (true);
00192
00193 // Flag to update this wI
00194 _Container->changed (this, worldImage);
00195 }
00196
00197 // ***************************************************************************
00198
00199 void CMovePrimitive::removeFromWorldImage (uint8 worldImage)
00200 {
00201 // Check it is a collisionable primitive
00202 nlassert (!isNonCollisionable());
00203
00204 // Check ad get the primitive world image
00205 CPrimitiveWorldImage *wI=getWorldImage (worldImage);
00206
00207 // Remove from cells
00208 wI->deleteIt (*_Container, worldImage);
00209
00210 // Set as non inserted
00211 wI->setInWorldImageFlag (false);
00212 }
00213
00214 // ***************************************************************************
00215
00216 void CMovePrimitive::setAbsorbtion (float attenuation)
00217 {
00218 _Attenuation=attenuation;
00219 }
00220
00221 // ***************************************************************************
00222
00223 void CMovePrimitive::setOrientation (double rot, uint8 worldImage)
00224 {
00225 if (isNonCollisionable())
00226 getWorldImage (0)->setOrientation (rot, _Container, this, worldImage);
00227 else
00228 getWorldImage (worldImage)->setOrientation (rot, _Container, this, worldImage);
00229 }
00230
00231 // ***************************************************************************
00232
00233 void CMovePrimitive::setGlobalPosition (const UGlobalPosition& pos, uint8 worldImage)
00234 {
00235 NLPACS_HAUTO_SET_GLOBAL_POSITION
00236
00237 if (isNonCollisionable())
00238 getWorldImage (0)->setGlobalPosition (pos, *_Container, *this, worldImage);
00239 else
00240 getWorldImage (worldImage)->setGlobalPosition (pos, *_Container, *this, worldImage);
00241 }
00242
00243 // ***************************************************************************
00244
00245 void CMovePrimitive::setGlobalPosition (const NLMISC::CVectorD& pos, uint8 worldImage, UGlobalPosition::TType type)
00246 {
00247 NLPACS_HAUTO_SET_UGLOBAL_POSITION
00248
00249 if (isNonCollisionable())
00250 getWorldImage (0)->setGlobalPosition (pos, *_Container, *this, worldImage, (_StaticFlags & DontSnapToGroundFlag) != 0);
00251 else
00252 getWorldImage (worldImage)->setGlobalPosition (pos, *_Container, *this, worldImage, (_StaticFlags & DontSnapToGroundFlag) != 0);
00253 }
00254
00255 // ***************************************************************************
00256
00257 void CMovePrimitive::move (const NLMISC::CVectorD& speed, uint8 worldImage)
00258 {
00259 NLPACS_HAUTO_MOVE
00260
00261 if (isNonCollisionable())
00262 getWorldImage (0)->move (speed, *_Container, *this, worldImage);
00263 else
00264 getWorldImage (worldImage)->move (speed, *_Container, *this, worldImage);
00265 }
00266
00267 // ***************************************************************************
00268
00269 NLMISC::CVectorD CMovePrimitive::getFinalPosition (uint8 worldImage) const
00270 {
00271 if (isNonCollisionable())
00272 return getWorldImage (0)->getFinalPosition ();
00273 else
00274 return getWorldImage (worldImage)->getFinalPosition ();
00275 }
00276
00277 // ***************************************************************************
00278
00279 const NLMISC::CVectorD& CMovePrimitive::getSpeed (uint8 worldImage) const
00280 {
00281 if (isNonCollisionable())
00282 return getWorldImage (0)->getSpeed ();
00283 else
00284 return getWorldImage (worldImage)->getSpeed ();
00285 }
00286
00287 // ***************************************************************************
00288
00289 CMovePrimitive::TType CMovePrimitive::getPrimitiveType () const
00290 {
00291 return getPrimitiveTypeInternal ();
00292 }
00293
00294 // ***************************************************************************
00295
00296 CMovePrimitive::TReaction CMovePrimitive::getReactionType () const
00297 {
00298 return getReactionTypeInternal ();
00299 }
00300
00301 // ***************************************************************************
00302
00303 CMovePrimitive::TTrigger CMovePrimitive::getTriggerType () const
00304 {
00305 return getTriggerTypeInternal ();
00306 }
00307
00308 // ***************************************************************************
00309
00310 CMovePrimitive::TCollisionMask CMovePrimitive::getCollisionMask () const
00311 {
00312 return getCollisionMaskInternal ();
00313 }
00314
00315 // ***************************************************************************
00316
00317 CMovePrimitive::TCollisionMask CMovePrimitive::getOcclusionMask () const
00318 {
00319 return getOcclusionMaskInternal ();
00320 }
00321
00322 // ***************************************************************************
00323
00324 bool CMovePrimitive::getObstacle () const
00325 {
00326 return isObstacle ();
00327 }
00328
00329 // ***************************************************************************
00330
00331 float CMovePrimitive::getAbsorbtion () const
00332 {
00333 return _Attenuation;
00334 }
00335
00336 // ***************************************************************************
00337
00338 void CMovePrimitive::getSize (float& width, float& depth) const
00339 {
00340 width=getLength(0);
00341 depth=getLength(1);
00342 }
00343
00344 // ***************************************************************************
00345
00346 float CMovePrimitive::getHeight () const
00347 {
00348 return getHeightInternal ();
00349 }
00350
00351 // ***************************************************************************
00352
00353 float CMovePrimitive::getRadius () const
00354 {
00355 return getRadiusInternal ();
00356 }
00357
00358 // ***************************************************************************
00359
00360 double CMovePrimitive::getOrientation (uint8 worldImage) const
00361 {
00362 if (isNonCollisionable())
00363 return getWorldImage (0)->getOrientation ();
00364 else
00365 return getWorldImage (worldImage)->getOrientation ();
00366 }
00367
00368 // ***************************************************************************
00369
00370 void CMovePrimitive::getGlobalPosition (UGlobalPosition& pos, uint8 worldImage) const
00371 {
00372 NLPACS_HAUTO_GET_GLOBAL_POSITION
00373
00374 if (isNonCollisionable())
00375 pos=getWorldImage (0)->getGlobalPosition();
00376 else
00377 pos=getWorldImage (worldImage)->getGlobalPosition();
00378 }
00379
00380 // ***************************************************************************
00381
00382 uint8 CMovePrimitive::getFirstWorldImageV () const
00383 {
00384 return getFirstWorldImage ();
00385 }
00386
00387 // ***************************************************************************
00388
00389 uint8 CMovePrimitive::getNumWorldImageV () const
00390 {
00391 return getNumWorldImageV ();
00392 }
00393
00394 // ***************************************************************************
00395
00396 bool CMovePrimitive::isInCollision (CMovePrimitive *primitive)
00397 {
00398 // Should be ok
00399 CCollisionOTInfo *element=_RootOTInfo;
00400
00401 // Look for it
00402 while (element)
00403 {
00404 // Dynamic collision ?
00405 if (!element->isCollisionAgainstStatic())
00406 {
00407 // Cast
00408 const CCollisionOTDynamicInfo *dynInfo=static_cast<const CCollisionOTDynamicInfo*> (element);
00409
00410 // Check if the primitive is used
00411 if ((dynInfo->getFirstPrimitive()== primitive)||(dynInfo->getSecondPrimitive()== primitive))
00412 return true;
00413 }
00414
00415 // Look for next
00416 element=element->getNext (this);
00417 }
00418
00419 return false;
00420 }
00421
00422 } // NLPACS
|
1.3.6