Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CollideChecker< T, canbebolt > Class Template Reference

Static Public Member Functions

static void FixMinLookMaxLook (CollideMap *tmpcm, CollideMap::iterator tmptmore, double &minlook, double &maxlook)
 
static bool CheckCollisionsInner (CollideMap::iterator cmbegin, CollideMap::iterator cmend, T *un, const Collidable &collider, unsigned int location_index, CollideMap::iterator tless, CollideMap::iterator tmore, double minlook, double maxlook)
 
static bool ComputeMaxLookMinLook (Unit *un, CollideMap *cm, CollideMap::iterator collider, CollideMap::iterator begin, CollideMap::iterator end, double sortedloc, float radius, double &minlook, double &maxlook)
 
static bool ComputeMaxLookMinLook (Bolt *un, CollideMap *cm, CollideMap::iterator collider, CollideMap::iterator cmbegin, CollideMap::iterator cmend, double sortedloc, float rad, double &minlook, double &maxlook)
 
static bool CheckCollisions (CollideMap *cm, T *un, const Collidable &collider, unsigned int location_index)
 
static bool doUpdateKey (Bolt *b)
 
static bool doUpdateKey (Unit *un)
 
static bool endAfterCollide (Bolt *b, unsigned int location_index)
 
static bool endAfterCollide (Unit *un, unsigned int location_index)
 
static bool ApartPositive (const Collidable &a, const Collidable &b)
 
static bool ApartNeg (const Collidable &a, const Collidable &b)
 
static bool CheckCollision (Unit *a, const Collidable &aiter, Unit *b, const Collidable &biter)
 
static bool CheckCollision (Bolt *a, const Collidable &aiter, Unit *b, const Collidable &biter)
 
static bool BoltType (Bolt *a)
 
static bool BoltType (Unit *a)
 
static bool CheckCollision (Bolt *a, const Collidable &aiter, Collidable::CollideRef b, const Collidable &biter)
 
static bool CheckCollision (Unit *un, const Collidable &aiter, Collidable::CollideRef b, const Collidable &biter)
 

Detailed Description

template<class T, bool canbebolt>
class CollideChecker< T, canbebolt >

Definition at line 279 of file collide_map.cpp.

Member Function Documentation

template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::ApartNeg ( const Collidable a,
const Collidable b 
)
inlinestatic

Definition at line 465 of file collide_map.cpp.

References Collidable::position, and Collidable::radius.

Referenced by CollideChecker< T, canbebolt >::CheckCollision().

466  {
467  //return apart_return;
468  double tempy = a.position.j-b.position.j;
469  double tempz = a.position.k-b.position.k;
470  float radiussum = b.radius-a.radius; //a is negative
471  if (fabs( tempy ) > radiussum || fabs( tempz ) > radiussum)
472  return true;
473  double tempx = (a.position.i-b.position.i);
474  tempx *= tempx;
475  tempy *= tempy;
476  tempz *= tempz;
477  return (tempx+tempy+tempz) > radiussum*radiussum;
478  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::ApartPositive ( const Collidable a,
const Collidable b 
)
inlinestatic

Definition at line 459 of file collide_map.cpp.

References Collidable::GetPosition(), and Collidable::radius.

Referenced by CollideChecker< T, canbebolt >::CheckCollision().

460  {
461  float aradius = a.radius;
462  float bradius = b.radius;
463  return ( a.GetPosition()-b.GetPosition() ).MagnitudeSquared() > aradius*aradius+aradius*bradius*2+bradius*bradius;
464  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::BoltType ( Bolt a)
inlinestatic

Definition at line 495 of file collide_map.cpp.

Referenced by CollideChecker< T, canbebolt >::CheckCollisionsInner().

496  {
497  return true;
498  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::BoltType ( Unit a)
inlinestatic

Definition at line 499 of file collide_map.cpp.

500  {
501  return false;
502  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::CheckCollision ( Unit a,
const Collidable aiter,
Unit b,
const Collidable biter 
)
inlinestatic

Definition at line 479 of file collide_map.cpp.

References CollideChecker< T, canbebolt >::ApartPositive(), and Unit::Collide().

Referenced by CollideChecker< T, canbebolt >::CheckCollisionsInner().

480  {
481  if ( !ApartPositive( aiter, biter ) )
482  return a->Collide( b );
483  return false;
484  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::CheckCollision ( Bolt a,
const Collidable aiter,
Unit b,
const Collidable biter 
)
inlinestatic

Definition at line 485 of file collide_map.cpp.

References CollideChecker< T, canbebolt >::ApartNeg(), Bolt::Collide(), Bolt::Destroy(), nondecal_index(), and Collidable::ref.

486  {
487  if ( !ApartNeg( aiter, biter ) ) {
488  if ( a->Collide( b ) ) {
489  a->Destroy( nondecal_index( aiter.ref ) );
490  return true;
491  }
492  }
493  return false;
494  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::CheckCollision ( Bolt a,
const Collidable aiter,
Collidable::CollideRef  b,
const Collidable biter 
)
inlinestatic

Definition at line 504 of file collide_map.cpp.

505  {
506  return false;
507  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::CheckCollision ( Unit un,
const Collidable aiter,
Collidable::CollideRef  b,
const Collidable biter 
)
inlinestatic

Definition at line 508 of file collide_map.cpp.

References CollideChecker< T, canbebolt >::ApartNeg(), and Bolt::CollideAnon().

509  {
510  if ( !ApartNeg( biter, aiter ) )
511  return Bolt::CollideAnon( b, un );
512  return false;
513  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::CheckCollisions ( CollideMap cm,
T *  un,
const Collidable collider,
unsigned int  location_index 
)
inlinestatic

Definition at line 415 of file collide_map.cpp.

References CollideArray::begin(), CollideChecker< T, canbebolt >::CheckCollisionsInner(), CollideChecker< T, canbebolt >::ComputeMaxLookMinLook(), CollideArray::end(), Collidable::getKey(), CollideArray::Iterable(), Collidable::radius, and CollideArray::CollidableBackref::toflattenhints_offset.

Referenced by CollideMap::CheckCollisions(), and CollideMap::CheckUnitCollisions().

416  {
417  CollideMap::iterator tless, tmore;
418  double sortedloc = collider.getKey();
419  float rad = collider.radius;
420  CollideMap::iterator cmbegin = cm->begin();
421  CollideMap::iterator cmend = cm->end();
422  if (cmbegin == cmend) return false;
423  double minlook, maxlook;
424  CollideMap::iterator startIter = CheckBackref< T > () ( un, location_index );
425  if ( ComputeMaxLookMinLook( un, cm, startIter, cmbegin, cmend, sortedloc, rad, minlook, maxlook ) ) return false; //no units in area
426  if ( !cm->Iterable( startIter ) ) {
427  CollideArray::CollidableBackref *br = static_cast< CollideArray::CollidableBackref* > (startIter);
428  CollideMap::iterator tmploc = cmbegin+br->toflattenhints_offset;
429  if (tmploc == cmend)
430  tmploc--;
431  tless = tmore = tmploc; //don't decrease tless
432  } else {
433  tless = tmore = startIter;
434  if (tless != cmbegin)
435  --tless;
436  }
437  ++tmore;
438  return CheckCollisionsInner( cmbegin, cmend,
439  un, collider, location_index,
440  tless, tmore,
441  minlook, maxlook );
442  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::CheckCollisionsInner ( CollideMap::iterator  cmbegin,
CollideMap::iterator  cmend,
T *  un,
const Collidable collider,
unsigned int  location_index,
CollideMap::iterator  tless,
CollideMap::iterator  tmore,
double  minlook,
double  maxlook 
)
inlinestatic

Definition at line 288 of file collide_map.cpp.

References _Universe, Universe::activeStarSystem(), CollideArray::begin(), CollideChecker< T, canbebolt >::BoltType(), CollideChecker< T, canbebolt >::CheckCollision(), StarSystem::collidemap, CollideArray::end(), CollideChecker< T, canbebolt >::endAfterCollide(), Collidable::getKey(), Collidable::radius, and Unit::UNIT_ONLY.

Referenced by CollideChecker< T, canbebolt >::CheckCollisions().

297  {
298  CheckBackref< T >backref_obtain;
299  if (backref_obtain( un, location_index ) != cmbegin) {
300  //if will happen in case of !Iterable
301  while ( (*tless)->getKey() >= minlook ) {
302  float rad = (*tless)->radius;
303  bool boltSpecimen = canbebolt && (rad < 0);
304 
305  Collidable::CollideRef ref = (*tless)->ref;
306  if (tless == cmbegin) {
307  if (canbebolt && boltSpecimen) {
308  if ( CheckCollision( un, collider, ref, **tless ) ) {
309  if ( endAfterCollide( un, location_index ) )
310  return true;
311  else break;
312  } else {break; }} else if (rad != 0) {
313  if ( canbebolt == true && BoltType( un ) ) {
314  CollideMap::iterator tmptmore = ref.unit->location[Unit::UNIT_ONLY];
315  CollideMap::iterator tmptless = tmptmore;
316  ++tmptmore;
319  un, collider, Unit::UNIT_ONLY,
320  tmptless, tmptmore,
321  minlook, maxlook );
322  }
323  if ( CheckCollision( un, collider, ref.unit, **tless ) ) {
324  if ( endAfterCollide( un, location_index ) )
325  return true;
326  else break;
327  } else {break; }} else {break; }} else {
328  if (canbebolt && boltSpecimen) {
329  if ( CheckCollision( un, collider, ref, **tless-- ) )
330  if ( endAfterCollide( un, location_index ) )
331  return true;
332  } else if (rad != 0) {
333  if ( canbebolt == true && BoltType( un ) ) {
334  CollideMap::iterator tmptmore = ref.unit->location[Unit::UNIT_ONLY];
335  CollideMap::iterator tmptless = tmptmore;
336  ++tmptmore;
339  un, collider, Unit::UNIT_ONLY,
340  tmptless, tmptmore,
341  minlook, maxlook );
342  }
343  if ( CheckCollision( un, collider, ref.unit, **tless-- ) )
344  if ( endAfterCollide( un, location_index ) )
345  return true;
346  } else {
347  --tless;
348  }
349  }
350  }
351  }
352  while (tmore != cmend && (*tmore)->getKey() <= maxlook) {
353  float rad = (*tmore)->radius;
354  bool boltSpecimen = canbebolt && (rad < 0);
355  Collidable::CollideRef ref = (*tmore)->ref;
356  if (canbebolt && boltSpecimen) {
357  if ( CheckCollision( un, collider, ref, **tmore++ ) )
358  if ( endAfterCollide( un, location_index ) )
359  return true;
360  } else if (rad != 0) {
361  //not null unit
362  if ( canbebolt == true && BoltType( un ) ) {
363  CollideMap::iterator tmptmore = ref.unit->location[Unit::UNIT_ONLY];
364  CollideMap::iterator tmptless = tmptmore;
365  ++tmptmore;
368  un, collider, Unit::UNIT_ONLY,
369  tmptless, tmptmore,
370  minlook, maxlook );
371  }
372  if ( CheckCollision( un, collider, ref.unit, **tmore++ ) )
373  if ( endAfterCollide( un, location_index ) )
374  return true;
375  } else {++tmore; }}
376  return false;
377  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::ComputeMaxLookMinLook ( Unit un,
CollideMap cm,
CollideMap::iterator  collider,
CollideMap::iterator  begin,
CollideMap::iterator  end,
double  sortedloc,
float  radius,
double &  minlook,
double &  maxlook 
)
inlinestatic

Definition at line 378 of file collide_map.cpp.

Referenced by CollideChecker< T, canbebolt >::CheckCollisions().

387  {
388  maxlook = sortedloc+2.0625*radius;
389  minlook = sortedloc-2.0625*radius;
390  return false;
391  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::ComputeMaxLookMinLook ( Bolt un,
CollideMap cm,
CollideMap::iterator  collider,
CollideMap::iterator  cmbegin,
CollideMap::iterator  cmend,
double  sortedloc,
float  rad,
double &  minlook,
double &  maxlook 
)
inlinestatic

Definition at line 392 of file collide_map.cpp.

References CollideArray::max_radius.

401  {
402  float dboltdist = -2.0625*rad;
403  float boltdist = -1.0625*rad;
404  if (collider >= cmbegin && collider < cmend) {
405  float maxrad = cm->max_radius[collider-cmbegin];
406  if (maxrad == 0)
407  return true;
408  boltdist += maxrad;
409  if (dboltdist < boltdist)
410  boltdist = dboltdist;
411  } else {boltdist += fabs( rad ); } maxlook = sortedloc+boltdist;
412  minlook = sortedloc-boltdist;
413  return false;
414  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::doUpdateKey ( Bolt b)
inlinestatic

Definition at line 443 of file collide_map.cpp.

444  {
445  return true;
446  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::doUpdateKey ( Unit un)
inlinestatic

Definition at line 447 of file collide_map.cpp.

448  {
449  return false;
450  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::endAfterCollide ( Bolt b,
unsigned int  location_index 
)
inlinestatic

Definition at line 451 of file collide_map.cpp.

Referenced by CollideChecker< T, canbebolt >::CheckCollisionsInner().

452  {
453  return true;
454  }
template<class T , bool canbebolt>
static bool CollideChecker< T, canbebolt >::endAfterCollide ( Unit un,
unsigned int  location_index 
)
inlinestatic

Definition at line 455 of file collide_map.cpp.

References is_null(), and Unit::location.

456  {
457  return is_null( un->location[location_index] );
458  }
template<class T , bool canbebolt>
static void CollideChecker< T, canbebolt >::FixMinLookMaxLook ( CollideMap tmpcm,
CollideMap::iterator  tmptmore,
double &  minlook,
double &  maxlook 
)
inlinestatic

Definition at line 282 of file collide_map.cpp.

References Collidable::radius.

283  {
284  double mid = (minlook+maxlook)*.5;
285  minlook = (minlook+mid)*.5-tmptmore->radius;
286  maxlook = (maxlook+mid)*.5+tmptmore->radius;
287  }

The documentation for this class was generated from the following file: