CrystalSpace

Public API Reference

cstool/collider.h

Go to the documentation of this file.
00001 /*
00002     Copyright (C) 1998-2003 by Jorrit Tyberghein
00003     Written by Alex Pfaffe.
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public
00016     License along with this library; if not, write to the Free
00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018 */
00019 #ifndef __CS_COLLIDER_H__
00020 #define __CS_COLLIDER_H__
00021 
00026 #include "csextern.h"
00027 
00028 #include "csgeom/box.h"
00029 #include "csutil/csobject.h"
00030 #include "csutil/leakguard.h"
00031 #include "csutil/array.h"
00032 #include "csutil/scf_implementation.h"
00033 
00034 #include "ivaria/collider.h"
00035 
00036 struct iCamera;
00037 struct iCollider;
00038 struct iCollideSystem;
00039 struct iEngine;
00040 struct iMeshWrapper;
00041 struct iMovable;
00042 struct iObject;
00043 struct iPolygonMesh;
00044 struct iRegion;
00045 struct iSector;
00046 
00047 struct csCollisionPair;
00048 class csReversibleTransform;
00049 
00050 struct csIntersectingTriangle;
00051 
00052 
00066 class CS_CRYSTALSPACE_EXPORT csColliderWrapper : 
00067   public scfImplementationExt1<csColliderWrapper, 
00068                                csObject,
00069                                scfFakeInterface<csColliderWrapper> >
00070 {
00071 private:
00072   csRef<iCollideSystem> collide_system;
00073   csRef<iCollider> collider;
00074 
00075 public:
00076   SCF_INTERFACE(csColliderWrapper, 2,0,0);
00077 
00078   CS_LEAKGUARD_DECLARE (csColliderWrapper);
00079 
00081   csColliderWrapper (csObject& parent, iCollideSystem* collide_system,
00082         iPolygonMesh* mesh);
00083 
00085   csColliderWrapper (iObject* parent, iCollideSystem* collide_system,
00086         iPolygonMesh* mesh);
00087 
00093   csColliderWrapper (iObject* parent, iCollideSystem* collide_system,
00094         iCollider* collider);
00095 
00097   virtual ~csColliderWrapper ();
00098 
00100   iCollider* GetCollider () { return collider; }
00101 
00103   iCollideSystem* GetCollideSystem () { return collide_system; }
00104 
00112   bool Collide (csColliderWrapper& pOtherCollider,
00113                 csReversibleTransform* pThisTransform = 0,
00114                 csReversibleTransform* pOtherTransform = 0);
00119   bool Collide (csObject& otherObject,
00120                 csReversibleTransform* pThisTransform = 0,
00121                 csReversibleTransform* pOtherTransform = 0);
00126   bool Collide (iObject* otherObject,
00127                 csReversibleTransform* pThisTransform = 0,
00128                 csReversibleTransform* pOtherTransform = 0);
00129 
00134   static csColliderWrapper* GetColliderWrapper (csObject& object);
00135 
00140   static csColliderWrapper* GetColliderWrapper (iObject* object);
00141 };
00142 
00146 struct CS_CRYSTALSPACE_EXPORT csTraceBeamResult
00147 {
00149 
00153   csIntersectingTriangle closest_tri;
00158   csVector3 closest_isect;
00162   iMeshWrapper* closest_mesh;
00167   float sqdistance;
00171   iSector* end_sector;
00172 };
00173 
00178 class CS_CRYSTALSPACE_EXPORT csColliderHelper
00179 {
00180 public:
00192   static csColliderWrapper* InitializeCollisionWrapper (iCollideSystem* colsys,
00193         iMeshWrapper* mesh);
00194 
00200   static void InitializeCollisionWrappers (iCollideSystem* colsys,
00201         iEngine* engine, iRegion* region = 0);
00202 
00220   static bool CollideArray (
00221         iCollideSystem* colsys,
00222         iCollider* collider,
00223         const csReversibleTransform* trans,
00224         int num_colliders,
00225         iCollider** colliders,
00226         csReversibleTransform **transforms);
00227 
00264   static int CollidePath (
00265         iCollideSystem* colsys,
00266         iCollider* collider, const csReversibleTransform* trans,
00267         float nbrsteps,
00268         csVector3& newpos,
00269         int num_colliders,
00270         iCollider** colliders,
00271         csReversibleTransform** transforms);
00272 
00296   static float TraceBeam (iCollideSystem* cdsys, iSector* sector,
00297         const csVector3& start, const csVector3& end,
00298         bool traverse_portals,
00299         csIntersectingTriangle& closest_tri,
00300         csVector3& closest_isect,
00301         iMeshWrapper** closest_mesh = 0,
00302         iSector** end_sector = 0);
00303 
00320   static csTraceBeamResult TraceBeam (iCollideSystem* cdsys, iSector* sector,
00321         const csVector3& start, const csVector3& end,
00322         bool traverse_portals);
00323 };
00324 
00329 class CS_CRYSTALSPACE_EXPORT csColliderActor
00330 {
00331 private:
00332   bool revertMove;
00333   bool onground;
00334   bool cd;
00335   csArray<csCollisionPair> our_cd_contact;
00336   float gravity;
00337   iMeshWrapper* mesh;
00338   iCamera* camera;
00339   iMovable* movable;
00340   iCollideSystem* cdsys;
00341   iEngine* engine;
00342   csVector3 velWorld;
00343 
00345   csVector3 rotation;
00346 
00347   csRef<iCollider> topCollider;
00348   csRef<iCollider> bottomCollider;
00349   csBox3 boundingBox;
00350   csVector3 shift;
00351   csVector3 topSize;
00352   csVector3 bottomSize;
00353   csVector3 intervalSize;
00354 
00355   int revertCount;
00356 
00371   int CollisionDetect (
00372         iCollider *collider,
00373         iSector* sector,
00374         csReversibleTransform* transform,
00375         csReversibleTransform* old_transform);
00376 
00386   int CollisionDetectIterative (
00387         iCollider *collider,
00388         iSector* sector,
00389         csReversibleTransform* transform,
00390         csReversibleTransform* old_transform, csVector3& maxmove);
00391   bool MoveV (float delta, const csVector3& velBody);
00392   bool RotateV (float delta, const csVector3& angularVelocity);
00393   void InitializeColliders (const csVector3& legs,
00394         const csVector3& body, const csVector3& shift);
00395 
00396 public:
00398   csColliderActor ();
00399 
00401   void SetCollideSystem (iCollideSystem* cdsys)
00402   {
00403     csColliderActor::cdsys = cdsys;
00404   }
00405 
00407   void SetEngine (iEngine* engine)
00408   {
00409     csColliderActor::engine = engine;
00410   }
00411 
00421   void InitializeColliders (iMeshWrapper* mesh, const csVector3& legs,
00422         const csVector3& body, const csVector3& shift);
00423 
00435   void InitializeColliders (iCamera* camera, const csVector3& legs,
00436         const csVector3& body, const csVector3& shift);
00437 
00444   void SetCamera (iCamera* camera, bool adjustRotation = true);
00445 
00449   void SetGravity (float g)
00450   {
00451     gravity = g;
00452     velWorld.y = 0;
00453   }
00454 
00458   float GetGravity () const { return gravity; }
00459 
00463   bool IsOnGround () const { return onground; }
00464 
00468   void SetOnGround (bool og) { onground = og; }
00469 
00473   bool HasCD () const { return cd; }
00474 
00478   void SetCD (bool c) { cd = c; }
00479 
00483   bool CheckRevertMove () const { return revertMove; }
00484 
00496   bool Move (float delta, float speed, const csVector3& velBody,
00497         const csVector3& angularVelocity);
00498 
00503   const csVector3& GetRotation () { return rotation; }
00504 
00509   void SetRotation (const csVector3& rot);
00510 
00516   bool AdjustForCollisions (const csVector3& oldpos,
00517         csVector3& newpos,
00518         const csVector3& vel,
00519         float delta);
00520 };
00521 
00522 #endif // __CS_COLLIDER_H__

Generated for Crystal Space by doxygen 1.4.6