ivaria/collisions.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2011-2012 Christian Van Brussel, Institute of Information 00003 and Communication Technologies, Electronics and Applied Mathematics 00004 at Universite catholique de Louvain, Belgium 00005 http://www.uclouvain.be/en-icteam.html 00006 Copyright (C) 2012 by Dominik Seifert 00007 Copyright (C) 2011 by Liu Lu 00008 00009 This library is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU Library General Public 00011 License as published by the Free Software Foundation; either 00012 version 2 of the License, or (at your option) any later version. 00013 00014 This library is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 Library General Public License for more details. 00018 00019 You should have received a copy of the GNU Library General Public 00020 License along with this library; if not, write to the Free 00021 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00022 */ 00023 00024 #ifndef __CS_IVARIA_COLLISION2_H__ 00025 #define __CS_IVARIA_COLLISION2_H__ 00026 00031 #include "csutil/scf.h" 00032 #include "iutil/strset.h" 00033 #include "ivaria/colliders.h" 00034 00035 struct iCamera; 00036 struct iMeshWrapper; 00037 struct iMovable; 00038 struct iPortal; 00039 struct iSceneNode; 00040 struct iSector; 00041 struct iTerrainSystem; 00042 struct iTriangleMesh; 00043 struct iView; 00044 00045 namespace CS { 00046 namespace Physics { 00047 00048 struct iPhysicalBody; 00049 struct iPhysicalSector; 00050 struct iPhysicalSystem; 00051 00052 } 00053 } 00054 00055 namespace CS { 00056 namespace Collisions { 00057 00058 struct iActor; 00059 struct iCollisionActor; 00060 struct iCollisionObject; 00061 struct iCollisionSector; 00062 struct iCollisionSystem; 00063 00067 enum CollisionObjectType 00068 { 00069 COLLISION_OBJECT_SIMPLE = 0, 00071 COLLISION_OBJECT_PHYSICAL, 00073 COLLISION_OBJECT_GHOST, 00074 COLLISION_OBJECT_ACTOR 00075 }; 00076 00080 struct HitBeamResult 00081 { 00082 HitBeamResult () 00083 : hasHit (false), object (0), isect (0.0f), normal (0.0f), vertexIndex (0) 00084 {} 00085 00087 bool hasHit; 00088 00090 iCollisionObject* object; 00091 00093 csVector3 isect; 00094 00096 csVector3 normal; 00097 00102 size_t vertexIndex; 00103 }; 00104 00108 struct iCollisionContact : public virtual iBase 00109 { 00110 SCF_INTERFACE (CS::Collisions::iCollisionContact, 1, 0, 0); 00111 00113 virtual csVector3 GetPositionOnA () const = 0; 00114 00116 virtual csVector3 GetPositionOnB () const = 0; 00117 00119 //virtual csVector3 GetNormalOnA () const = 0; 00120 00122 virtual csVector3 GetNormalOnB () const = 0; 00123 00125 virtual float GetPenetration () const = 0; 00126 }; 00127 00133 struct iCollisionData : public virtual iBase 00134 { 00135 SCF_INTERFACE (CS::Collisions::iCollisionData, 1, 0, 0); 00136 00138 virtual iCollisionObject* GetObjectA () const = 0; 00139 00141 virtual iCollisionObject* GetObjectB () const = 0; 00142 00144 virtual size_t GetContactCount () const = 0; 00145 00147 virtual iCollisionContact* GetContact (size_t index) = 0; 00148 }; 00149 00153 struct iCollisionDataList : public virtual iBase 00154 { 00155 SCF_INTERFACE (CS::Collisions::iCollisionDataList, 1, 0, 0); 00156 00158 virtual size_t GetCollisionCount () const = 0; 00159 00161 virtual iCollisionData* GetCollision (size_t index) const = 0; 00162 }; 00163 00173 struct iCollisionCallback : public virtual iBase 00174 { 00175 SCF_INTERFACE (CS::Collisions::iCollisionCallback, 1, 0, 0); 00176 00180 virtual void OnCollision (iCollisionData* collision) = 0; 00181 }; 00182 00206 struct iCollisionGroup : public virtual iBase 00207 { 00209 virtual const char* GetName () const = 0; 00210 00221 virtual void SetCollisionEnabled (iCollisionGroup* other, bool enabled) = 0; 00222 00227 virtual bool GetCollisionEnabled (iCollisionGroup* other) = 0; 00228 }; 00229 00233 struct iCollisionObjectFactory : public virtual iBase 00234 { 00235 SCF_INTERFACE (CS::Collisions::iCollisionObjectFactory, 1, 0, 0); 00236 00238 virtual iObject *QueryObject () = 0; 00239 00241 virtual iCollisionSystem* GetSystem () const = 0; 00242 00244 virtual csPtr<iCollisionObject> CreateCollisionObject () = 0; 00245 00247 virtual void SetCollider (iCollider* value, 00248 const csOrthoTransform& transform = csOrthoTransform ()) = 0; 00250 virtual iCollider* GetCollider () const = 0; 00251 00253 virtual void SetColliderTransform (const csOrthoTransform& transform) = 0; 00255 virtual const csOrthoTransform& GetColliderTransform () const = 0; 00256 00258 virtual void SetCollisionGroup (iCollisionGroup* group) = 0; 00260 virtual iCollisionGroup* GetCollisionGroup () const = 0; 00261 }; 00262 00276 struct iCollisionObject : public virtual iBase 00277 { 00278 SCF_INTERFACE (CS::Collisions::iCollisionObject, 1, 0, 0); 00279 00281 virtual iObject *QueryObject (void) = 0; 00282 00284 virtual CS::Physics::iPhysicalBody* QueryPhysicalBody () = 0; 00285 00287 virtual iActor* QueryActor () = 0; 00288 00295 virtual void SetSector (iCollisionSector* sector) = 0; 00296 00301 virtual iCollisionSector* GetSector () const = 0; 00302 00304 virtual CollisionObjectType GetObjectType () const = 0; 00305 00307 virtual void SetDeactivable (bool d) = 0; 00309 virtual bool GetDeactivable () const = 0; 00310 00312 virtual void SetAttachedSceneNode (iSceneNode* sceneNode) = 0; 00314 virtual iSceneNode* GetAttachedSceneNode () const = 0; 00315 00320 virtual void SetAttachedCamera (iCamera* camera) = 0; 00321 00323 virtual iCamera* GetAttachedCamera () const = 0; 00324 00326 virtual void SetCollider (iCollider* collider, 00327 const csOrthoTransform& transform = csOrthoTransform ()) = 0; 00328 00330 virtual iCollider* GetCollider () const = 0; 00331 00333 virtual void SetColliderTransform (const csOrthoTransform& transform) = 0; 00334 00336 virtual const csOrthoTransform& GetColliderTransform () const = 0; 00337 00339 virtual void SetTransform (const csOrthoTransform& trans) = 0; 00340 00342 virtual csOrthoTransform GetTransform () const = 0; 00343 00348 virtual void SetRotation (const csMatrix3& rot) = 0; 00349 00351 virtual void RebuildObject () = 0; 00352 00354 virtual void SetCollisionGroup (iCollisionGroup* group) = 0; 00355 00357 virtual iCollisionGroup* GetCollisionGroup () const = 0; 00358 00364 virtual void SetCollisionCallback (iCollisionCallback* cb) = 0; 00365 00367 virtual iCollisionCallback* GetCollisionCallback () = 0; 00368 00370 // TODO: really useful? 00371 virtual csPtr<iCollisionData> Collide (iCollisionObject* otherObject) const = 0; 00372 00374 // TODO: add a collision filter parameter 00375 virtual HitBeamResult HitBeam (const csVector3& start, const csVector3& end) const = 0; 00376 00378 virtual size_t GetContactObjectsCount () = 0; 00379 00381 virtual iCollisionObject* GetContactObject (size_t index) = 0; 00382 }; 00383 00396 struct iCollisionTerrain : public virtual iBase 00397 { 00398 SCF_INTERFACE (CS::Collisions::iCollisionTerrain, 1, 0, 0); 00399 00401 virtual iTerrainSystem* GetTerrain () const = 0; 00402 00403 // TODO: Methods to iterate over the terrain cells 00404 }; 00405 00413 struct iActorFactory : public virtual iCollisionObjectFactory 00414 { 00415 SCF_INTERFACE (CS::Collisions::iActorFactory, 1, 0, 0); 00416 00418 virtual csPtr<iActor> CreateActor () = 0; 00419 00421 virtual float GetStepHeight () const = 0; 00423 virtual void SetStepHeight (float h) = 0; 00424 00426 virtual float GetWalkSpeed () const = 0; 00428 virtual void SetWalkSpeed (float s) = 0; 00429 00431 virtual float GetJumpSpeed () const = 0; 00433 virtual void SetJumpSpeed (float s) = 0; 00434 00436 virtual float GetAirControlFactor () const = 0; 00438 virtual void SetAirControlFactor (float f) = 0; 00439 }; 00440 00458 struct iActor : public virtual iCollisionObject 00459 { 00460 SCF_INTERFACE (CS::Collisions::iActor, 1, 0, 0); 00461 00468 virtual void Walk (csVector3 dir) = 0; 00469 00476 virtual void WalkHorizontal (csVector2 dir) = 0; 00477 00479 virtual void Jump () = 0; 00480 00482 virtual void StopMoving () = 0; 00483 00485 virtual bool IsFreeFalling () const = 0; 00486 00488 virtual bool IsOnGround () const = 0; 00489 00491 virtual float GetStepHeight () const = 0; 00493 virtual void SetStepHeight (float h) = 0; 00494 00496 virtual float GetWalkSpeed () const = 0; 00498 virtual void SetWalkSpeed (float s) = 0; 00499 00501 virtual float GetJumpSpeed () const = 0; 00503 virtual void SetJumpSpeed (float s) = 0; 00504 00506 virtual float GetAirControlFactor () const = 0; 00508 virtual void SetAirControlFactor (float f) = 0; 00509 00511 // TODO: working? 00512 virtual bool GetGravityEnabled () const = 0; 00514 virtual void SetGravityEnabled (bool g) = 0; 00515 }; 00516 00520 struct iCollisionActorFactory : public virtual iCollisionObjectFactory, 00521 public virtual iActorFactory 00522 { 00523 SCF_INTERFACE (CS::Collisions::iCollisionActorFactory, 1, 0, 0); 00524 00526 virtual csPtr<iCollisionActor> CreateCollisionActor () = 0; 00527 00532 virtual float GetMaximumSlope () const = 0; 00537 virtual void SetMaximumSlope (float slope) = 0; 00538 }; 00539 00553 struct iCollisionActor : public virtual iCollisionObject, public virtual iActor 00554 { 00555 SCF_INTERFACE (CS::Collisions::iCollisionActor, 1, 0, 0); 00556 00561 virtual float GetMaximumSlope () const = 0; 00566 virtual void SetMaximumSlope (float slope) = 0; 00567 }; 00568 00581 struct iCollisionSector : public virtual iBase 00582 { 00583 SCF_INTERFACE (CS::Collisions::iCollisionSector, 1, 0, 0); 00584 00586 virtual CS::Collisions::iCollisionSystem* GetSystem () const = 0; 00587 00589 virtual iObject *QueryObject (void) const = 0; 00590 00596 virtual CollisionObjectType GetSectorType () const = 0; 00597 00602 virtual CS::Physics::iPhysicalSector* QueryPhysicalSector () const = 0; 00603 00610 virtual void SetSector (iSector* sector) = 0; 00611 00613 virtual iSector* GetSector () = 0; 00614 00616 virtual void SetGravity (const csVector3& v) = 0; 00617 00619 virtual csVector3 GetGravity () const = 0; 00620 00624 // TODO: remove: The collision object has to be initialized. 00625 // TODO: rename all AddXXX() methods in Add() 00626 virtual void AddCollisionObject (iCollisionObject* object) = 0; 00627 00629 virtual void RemoveCollisionObject (iCollisionObject* object) = 0; 00630 00632 virtual size_t GetCollisionObjectCount () = 0; 00633 00635 virtual iCollisionObject* GetCollisionObject (size_t index) = 0; 00636 00637 // Terrain 00638 00640 virtual void AddCollisionTerrain (iCollisionTerrain* terrain) = 0; 00641 00643 virtual void RemoveCollisionTerrain (iCollisionTerrain* terrain) = 0; 00644 00646 virtual size_t GetCollisionTerrainCount () const = 0; 00647 00649 virtual iCollisionTerrain* GetCollisionTerrain (size_t index) const = 0; 00650 00652 virtual iCollisionTerrain* GetCollisionTerrain (iTerrainSystem* terrain) = 0; 00653 00654 // Portals 00655 00657 virtual void AddPortal (iPortal* portal, const csOrthoTransform& meshTrans) = 0; 00658 00660 virtual void RemovePortal (iPortal* portal) = 0; 00661 00663 // TODO: mask for selecting the type/state/collgroup of the objects to be removed? 00664 // TODO: flag indicating whether the attached iSceneNode should be removed from the engine? 00665 virtual void DeleteAll () = 0; 00666 00667 // Other stuff 00668 00675 // TODO: allow resuming the beam test when an object has been hit in order to find the next 00676 // object on the beam 00677 virtual HitBeamResult HitBeam (const csVector3& start, const csVector3& end) const = 0; 00678 00685 virtual HitBeamResult HitBeamPortal (const csVector3& start, const csVector3& end) const = 0; 00686 00691 virtual csPtr<iCollisionDataList> CollisionTest (iCollisionObject* object) = 0; 00692 }; 00693 00708 // TODO: global collision callback 00709 struct iCollisionSystem : public virtual iBase 00710 { 00711 SCF_INTERFACE (CS::Collisions::iCollisionSystem, 2, 0, 1); 00712 00717 virtual CS::Physics::iPhysicalSystem* QueryPhysicalSystem () = 0; 00718 00723 virtual void SetSimulationSpeed (float speed) = 0; 00724 00729 virtual float GetSimulationSpeed () const = 0; 00730 00735 virtual csPtr<iCollider> CreateCollider () = 0; 00736 00738 // TODO: what is simplify? 00739 virtual csPtr<iColliderConvexMesh> CreateColliderConvexMesh (iTriangleMesh* mesh, bool simplify = false) = 0; 00740 00742 virtual csPtr<iColliderConcaveMesh> CreateColliderConcaveMesh (iTriangleMesh* mesh) = 0; 00743 00745 virtual csPtr<iColliderConcaveMeshScaled> CreateColliderConcaveMeshScaled ( 00746 iColliderConcaveMesh* collider, const csVector3& scale) = 0; 00747 00749 virtual csPtr<iColliderCylinder> CreateColliderCylinder (float length, float radius) = 0; 00750 00752 virtual csPtr<iColliderBox> CreateColliderBox (const csVector3& size) = 0; 00753 00755 virtual csPtr<iColliderSphere> CreateColliderSphere (float radius) = 0; 00756 00758 virtual csPtr<iColliderCapsule> CreateColliderCapsule (float length, float radius) = 0; 00759 00761 virtual csPtr<iColliderCone> CreateColliderCone (float length, float radius) = 0; 00762 00764 virtual csPtr<iColliderPlane> CreateColliderPlane (const csPlane3& plane) = 0; 00765 00767 virtual csPtr<iCollisionTerrain> CreateCollisionTerrain (iTerrainSystem* terrain, 00768 float minHeight = 0, float maxHeight = 0) = 0; 00769 00771 virtual iCollisionSector* CreateCollisionSector (iSector* sector = nullptr) = 0; 00772 00774 virtual void DeleteCollisionSector (iCollisionSector* sector) = 0; 00775 00777 virtual void DeleteCollisionSectors () = 0; 00778 00780 virtual size_t GetCollisionSectorCount () const = 0; 00781 00783 virtual iCollisionSector* GetCollisionSector (size_t index) = 0; 00784 00786 virtual iCollisionSector* FindCollisionSector (const iSector* sceneSector) = 0; 00787 00789 virtual iCollisionSector* FindCollisionSector (const char* name) = 0; 00790 00798 virtual iCollisionGroup* CreateCollisionGroup (const char* name) = 0; 00799 00801 virtual iCollisionGroup* FindCollisionGroup (const char* name) const = 0; 00802 00804 virtual size_t GetCollisionGroupCount () const = 0; 00805 00807 virtual iCollisionGroup* GetCollisionGroup (size_t index) const = 0; 00808 00809 // Factory 00810 00812 virtual csPtr<iCollisionObjectFactory> CreateCollisionObjectFactory 00813 (CS::Collisions::iCollider* collider = nullptr) = 0; 00814 00816 virtual csPtr<iCollisionObjectFactory> CreateGhostCollisionObjectFactory 00817 (CS::Collisions::iCollider* collider = nullptr) = 0; 00818 00820 virtual csPtr<iCollisionActorFactory> CreateCollisionActorFactory 00821 (CS::Collisions::iCollider* collider = nullptr) = 0; 00822 00824 virtual void DeleteAll () = 0; 00825 }; 00826 00827 } } 00828 00829 #endif
Generated for Crystal Space 2.1 by doxygen 1.6.1
