ivaria/collisions.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2011 by Liu Lu 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public 00015 License along with this library; if not, write to the Free 00016 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00017 */ 00018 00019 #ifndef __CS_IVARIA_COLLISION2_H__ 00020 #define __CS_IVARIA_COLLISION2_H__ 00021 00026 #include "csutil/scf.h" 00027 #include "csutil/csstring.h" 00028 #include "csgeom/vector3.h" 00029 #include "csgeom/matrix3.h" 00030 #include "csgeom/transfrm.h" 00031 #include "csgeom/plane3.h" 00032 00033 struct iTerrainSystem; 00034 struct iSector; 00035 struct iMeshWrapper; 00036 struct iMovable; 00037 struct iPortal; 00038 struct iCamera; 00039 struct iView; 00040 00041 namespace CS 00042 { 00043 namespace Physics 00044 { 00045 struct iPhysicalBody; 00046 } 00047 } 00048 00049 namespace CS 00050 { 00051 namespace Collisions 00052 { 00053 00054 struct csConvexResult; 00055 struct iCollisionCallback; 00056 struct iCollisionObject; 00057 typedef short CollisionGroupMask; 00058 00062 enum ColliderType 00063 { 00064 COLLIDER_INVALID = 0, 00065 COLLIDER_BOX, 00066 COLLIDER_SPHERE, 00067 COLLIDER_CYLINDER, 00068 COLLIDER_CAPSULE, 00069 COLLIDER_CONE, 00070 COLLIDER_PLANE, 00071 COLLIDER_CONVEX_MESH, 00072 COLLIDER_CONCAVE_MESH, 00073 COLLIDER_CONCAVE_MESH_SCALED, 00074 COLLIDER_TERRAIN 00075 }; 00076 00080 enum CollisionObjectType 00081 { 00082 COLLISION_OBJECT_BASE = 0, 00083 COLLISION_OBJECT_PHYSICAL, 00084 COLLISION_OBJECT_GHOST, 00085 COLLISION_OBJECT_ACTOR 00086 }; 00087 00092 struct CollisionGroup 00093 { 00095 csString name; 00096 00098 CollisionGroupMask value; 00099 00101 CollisionGroupMask mask; 00102 00103 CollisionGroup () {} 00104 00105 CollisionGroup (const char* name) 00106 : name (name) 00107 {} 00108 }; 00109 00113 struct HitBeamResult 00114 { 00115 HitBeamResult () 00116 : hasHit (false), object (0), isect (0.0f), normal (0.0f), vertexIndex (0) 00117 {} 00118 00120 bool hasHit; 00121 00123 iCollisionObject* object; 00124 00126 csVector3 isect; 00127 00129 csVector3 normal; 00130 00135 size_t vertexIndex; 00136 }; 00137 00141 struct CollisionData 00142 { 00144 iCollisionObject* objectA; 00145 00147 iCollisionObject* objectB; 00148 00150 csVector3 positionWorldOnA; 00151 00153 csVector3 positionWorldOnB; 00154 00156 csVector3 normalWorldOnB; 00157 00159 float penetration; 00160 }; 00161 00171 struct iCollisionCallback: public virtual iBase 00172 { 00173 SCF_INTERFACE (CS::Collisions::iCollisionCallback, 1, 0, 0); 00174 00181 virtual void OnCollision (iCollisionObject *thisbody, iCollisionObject *otherbody, 00182 const csArray<CollisionData>& collisions) = 0; 00183 }; 00184 00189 struct iCollider : public virtual iBase 00190 { 00191 SCF_INTERFACE (CS::Collisions::iCollider, 1, 0, 0); 00192 00194 virtual ColliderType GetGeometryType () const = 0; 00195 00197 virtual void SetLocalScale (const csVector3& scale) = 0; 00198 00200 virtual const csVector3& GetLocalScale () const = 0; 00201 00203 virtual void SetMargin (float margin) = 0; 00204 00206 virtual float GetMargin () const = 0; 00207 }; 00208 00221 struct iColliderBox : public virtual iCollider 00222 { 00223 SCF_INTERFACE (CS::Collisions::iColliderBox, 1, 0, 0); 00224 00226 virtual csVector3 GetBoxGeometry () = 0; 00227 }; 00228 00241 struct iColliderSphere : public virtual iCollider 00242 { 00243 SCF_INTERFACE (CS::Collisions::iColliderSphere, 1, 0, 0); 00244 00246 virtual float GetSphereGeometry () = 0; 00247 }; 00248 00261 struct iColliderCylinder : public virtual iCollider 00262 { 00263 SCF_INTERFACE (CS::Collisions::iColliderCylinder, 1, 0, 0); 00264 00266 virtual void GetCylinderGeometry (float& length, float& radius) = 0; 00267 }; 00268 00281 struct iColliderCapsule : public virtual iCollider 00282 { 00283 SCF_INTERFACE (CS::Collisions::iColliderCapsule, 1, 0, 0); 00284 00286 virtual void GetCapsuleGeometry (float& length, float& radius) = 0; 00287 }; 00288 00301 struct iColliderCone : public virtual iCollider 00302 { 00303 SCF_INTERFACE (CS::Collisions::iColliderCone, 1, 0, 0); 00304 00306 virtual void GetConeGeometry (float& length, float& radius) = 0; 00307 }; 00308 00321 struct iColliderPlane : public virtual iCollider 00322 { 00323 SCF_INTERFACE (CS::Collisions::iColliderPlane, 1, 0, 0); 00324 00326 virtual csPlane3 GetPlaneGeometry () = 0; 00327 }; 00328 00341 struct iColliderConvexMesh : public virtual iCollider 00342 { 00343 SCF_INTERFACE (CS::Collisions::iColliderConvexMesh, 1, 0, 0); 00344 00346 virtual iMeshWrapper* GetMesh () = 0; 00347 }; 00348 00361 struct iColliderConcaveMesh : public virtual iCollider 00362 { 00363 SCF_INTERFACE (CS::Collisions::iColliderConcaveMesh, 1, 0, 0); 00364 00366 virtual iMeshWrapper* GetMesh () = 0; 00367 }; 00368 00381 struct iColliderConcaveMeshScaled : public virtual iCollider 00382 { 00383 SCF_INTERFACE (CS::Collisions::iColliderConcaveMeshScaled, 1, 0, 0); 00384 00386 virtual iColliderConcaveMesh* GetCollider () = 0; 00387 }; 00388 00401 struct iColliderTerrain : public virtual iCollider 00402 { 00403 SCF_INTERFACE (CS::Collisions::iColliderTerrain, 1, 0, 0); 00404 00406 virtual iTerrainSystem* GetTerrain () const = 0; 00407 }; 00408 00422 struct iCollisionObject : public virtual iBase 00423 { 00424 SCF_INTERFACE (CS::Collisions::iCollisionObject, 1, 0, 0); 00425 00427 virtual iObject *QueryObject (void) = 0; 00428 00430 virtual iCollisionObject* QueryCollisionObject () = 0; 00431 00433 virtual CS::Physics::iPhysicalBody* QueryPhysicalBody () = 0; 00434 00436 virtual void SetObjectType (CollisionObjectType type, bool forceRebuild = true) = 0; 00437 00439 virtual CollisionObjectType GetObjectType () = 0; 00440 00445 virtual void SetAttachedMovable (iMovable* movable) = 0; 00446 00448 virtual iMovable* GetAttachedMovable () = 0; 00449 00454 virtual void SetAttachedCamera (iCamera* camera) = 0; 00455 00457 virtual iCamera* GetAttachedCamera () = 0; 00458 00460 virtual void SetTransform (const csOrthoTransform& trans) = 0; 00461 00463 virtual csOrthoTransform GetTransform () = 0; 00464 00466 virtual void AddCollider (iCollider* collider, const csOrthoTransform& relaTrans 00467 = csOrthoTransform (csMatrix3 (), csVector3 (0))) = 0; 00468 00470 virtual void RemoveCollider (iCollider* collider) = 0; 00471 00473 virtual void RemoveCollider (size_t index) = 0; 00474 00476 virtual iCollider* GetCollider (size_t index) = 0; 00477 00479 virtual size_t GetColliderCount () = 0; 00480 00482 virtual void RebuildObject () = 0; 00483 00485 virtual void SetCollisionGroup (const char* name) = 0; 00486 00488 virtual const char* GetCollisionGroup () const = 0; 00489 00494 virtual void SetCollisionCallback (iCollisionCallback* cb) = 0; 00495 00497 virtual iCollisionCallback* GetCollisionCallback () = 0; 00498 00500 virtual bool Collide (iCollisionObject* otherObject) = 0; 00501 00503 virtual HitBeamResult HitBeam ( 00504 const csVector3& start, const csVector3& end) = 0; 00505 00507 virtual size_t GetContactObjectsCount () = 0; 00508 00510 virtual iCollisionObject* GetContactObject (size_t index) = 0; 00511 }; 00512 00527 // kickvb: most of this would have to be redesigned, let's do it later 00528 struct iCollisionActor : public virtual iCollisionObject 00529 { 00530 SCF_INTERFACE (CS::Collisions::iCollisionActor, 1, 0, 0); 00531 00533 virtual bool IsOnGround () = 0; 00534 00536 //virtual void SetOnGround (bool og) = 0; 00537 00539 virtual void SetCamera (iCamera* camera) = 0; 00540 00545 virtual void SetRotation (const csMatrix3& rot) = 0; 00546 00548 virtual void Rotate (const csVector3& v, float angle) = 0; 00549 00551 virtual void UpdateAction (float delta) = 0; 00552 00554 virtual void SetVelocity (float speed) = 0; 00555 00561 virtual void PreStep () = 0; 00562 00567 virtual void PlayerStep (float delta) = 0; 00568 00570 virtual void SetFallSpeed (float fallSpeed) = 0; 00571 00573 virtual void SetJumpSpeed (float jumpSpeed) = 0; 00574 00576 virtual void SetMaxJumpHeight (float maxJumpHeight) = 0; 00577 00579 virtual void StepHeight (float stepHeight) = 0; 00580 00582 virtual void Jump () = 0; 00583 00588 virtual void SetMaxSlope (float slopeRadians) = 0; 00589 00591 virtual float GetMaxSlope () const = 0; 00592 }; 00593 00606 struct iCollisionSector : public virtual iBase 00607 { 00608 SCF_INTERFACE (CS::Collisions::iCollisionSector, 1, 0, 0); 00609 00611 virtual iObject *QueryObject (void) = 0; 00612 00614 virtual void SetGravity (const csVector3& v) = 0; 00615 00617 virtual csVector3 GetGravity () const = 0; 00618 00623 virtual void AddCollisionObject (iCollisionObject* object) = 0; 00624 00626 virtual void RemoveCollisionObject (iCollisionObject* object) = 0; 00627 00629 virtual size_t GetCollisionObjectCount () = 0; 00630 00632 virtual iCollisionObject* GetCollisionObject (size_t index) = 0; 00633 00635 virtual iCollisionObject* FindCollisionObject (const char* name) = 0; 00636 00638 virtual void AddPortal (iPortal* portal, const csOrthoTransform& meshTrans) = 0; 00639 00641 virtual void RemovePortal (iPortal* portal) = 0; 00642 00648 virtual void SetSector (iSector* sector) = 0; 00649 00651 virtual iSector* GetSector () = 0; 00652 00654 virtual HitBeamResult HitBeam ( 00655 const csVector3& start, const csVector3& end) = 0; 00656 00660 virtual HitBeamResult HitBeamPortal ( 00661 const csVector3& start, const csVector3& end) = 0; 00662 00667 virtual bool CollisionTest (iCollisionObject* object, csArray<CollisionData>& collisions) = 0; 00668 00670 virtual CollisionGroup& CreateCollisionGroup (const char* name) = 0; 00671 00673 virtual CollisionGroup& FindCollisionGroup (const char* name) = 0; 00674 00676 virtual void SetGroupCollision (const char* name1, 00677 const char* name2, bool collide) = 0; 00678 00680 virtual bool GetGroupCollision (const char* name1, const char* name2) = 0; 00681 00686 virtual void AddCollisionActor (iCollisionActor* actor) = 0; 00687 00689 virtual void RemoveCollisionActor () = 0; 00690 00692 virtual iCollisionActor* GetCollisionActor () = 0; 00693 }; 00694 00709 struct iCollisionSystem : public virtual iBase 00710 { 00711 SCF_INTERFACE (CS::Collisions::iCollisionSystem, 1, 0, 0); 00712 00725 virtual void SetInternalScale (float scale) = 0; 00726 00728 virtual csRef<iColliderConvexMesh> CreateColliderConvexMesh ( 00729 iMeshWrapper* mesh, bool simplify = false) = 0; 00730 00732 virtual csRef<iColliderConcaveMesh> CreateColliderConcaveMesh (iMeshWrapper* mesh) = 0; 00733 00735 virtual csRef<iColliderConcaveMeshScaled> CreateColliderConcaveMeshScaled ( 00736 iColliderConcaveMesh* collider, csVector3 scale) = 0; 00737 00739 virtual csRef<iColliderCylinder> CreateColliderCylinder (float length, float radius) = 0; 00740 00742 virtual csRef<iColliderBox> CreateColliderBox (const csVector3& size) = 0; 00743 00745 virtual csRef<iColliderSphere> CreateColliderSphere (float radius) = 0; 00746 00748 virtual csRef<iColliderCapsule> CreateColliderCapsule (float length, float radius) = 0; 00749 00751 virtual csRef<iColliderCone> CreateColliderCone (float length, float radius) = 0; 00752 00754 virtual csRef<iColliderPlane> CreateColliderPlane (const csPlane3& plane) = 0; 00755 00757 virtual csRef<iColliderTerrain> CreateColliderTerrain (iTerrainSystem* terrain, 00758 float minHeight = 0, float maxHeight = 0) = 0; 00759 00764 virtual csRef<iCollisionObject> CreateCollisionObject () = 0; 00765 00770 virtual csRef<iCollisionActor> CreateCollisionActor () = 0; 00771 00773 virtual csRef<iCollisionSector> CreateCollisionSector () = 0; 00774 00776 virtual iCollisionSector* FindCollisionSector (const char* name) = 0; 00777 00783 virtual void DecomposeConcaveMesh (iCollisionObject* object, 00784 iMeshWrapper* mesh, bool simplify = false) = 0; 00785 }; 00786 } 00787 } 00788 00789 #endif
Generated for Crystal Space 2.1 by doxygen 1.6.1
