00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CS_IVARIA_DYNAMICS_H__
00021 #define __CS_IVARIA_DYNAMICS_H__
00022
00027 #include "csutil/scf.h"
00028
00029
00030 struct iBodyGroup;
00031 struct iJoint;
00032 struct iMeshWrapper;
00033 struct iLight;
00034 struct iCamera;
00035 struct iObject;
00036 struct iRigidBody;
00037
00038 class csMatrix3;
00039 class csOrthoTransform;
00040 class csPlane3;
00041 class csVector3;
00042
00043 struct iDynamicsCollisionCallback;
00044 struct iDynamicsMoveCallback;
00045 struct iDynamicSystem;
00046
00047
00052 struct iDynamicsStepCallback : public virtual iBase
00053 {
00054 SCF_INTERFACE (iDynamicsStepCallback, 0, 0, 1);
00055
00060 virtual void Step (float stepsize) = 0;
00061 };
00062
00078 struct iDynamics : public virtual iBase
00079 {
00080 SCF_INTERFACE(iDynamics,0,0,2);
00082 virtual csPtr<iDynamicSystem> CreateSystem () = 0;
00083
00085 virtual void RemoveSystem (iDynamicSystem* system) = 0;
00086
00088 virtual void RemoveSystems () = 0;
00089
00091 virtual iDynamicSystem* FindSystem (const char *name) = 0;
00092
00100 virtual void Step (float stepsize) = 0;
00101
00105 virtual void AddStepCallback (iDynamicsStepCallback *callback) = 0;
00106
00110 virtual void RemoveStepCallback (iDynamicsStepCallback *callback) = 0;
00111 };
00112
00113 struct iDynamicsSystemCollider;
00114
00129 struct iDynamicSystem : public virtual iBase
00130 {
00131 SCF_INTERFACE (iDynamicSystem, 0, 0, 4);
00132
00134 virtual iObject *QueryObject (void) = 0;
00136 virtual void SetGravity (const csVector3& v) = 0;
00138 virtual const csVector3 GetGravity () const = 0;
00139
00149 virtual void SetLinearDampener (float d) = 0;
00150
00152 virtual float GetLinearDampener () const = 0;
00153
00163 virtual void SetRollingDampener (float d) = 0;
00164
00166 virtual float GetRollingDampener () const = 0;
00167
00173 virtual void EnableAutoDisable (bool enable) = 0;
00175 virtual bool AutoDisableEnabled () = 0;
00188 virtual void SetAutoDisableParams (float linear, float angular, int steps,
00189 float time) = 0;
00190
00192 virtual void Step (float stepsize) = 0;
00193
00195 virtual csPtr<iRigidBody> CreateBody () = 0;
00196
00198 virtual void RemoveBody (iRigidBody* body) = 0;
00199
00201 virtual iRigidBody *FindBody (const char *name) = 0;
00202
00204 virtual iRigidBody *GetBody (unsigned int index) = 0;
00205
00207 virtual int GetBodysCount () = 0;
00208
00210 virtual csPtr<iBodyGroup> CreateGroup () = 0;
00211
00213 virtual void RemoveGroup (iBodyGroup* group) = 0;
00214
00216 virtual csPtr<iJoint> CreateJoint () = 0;
00217
00219 virtual void RemoveJoint (iJoint* joint) = 0;
00220
00222 virtual iDynamicsMoveCallback* GetDefaultMoveCallback () = 0;
00223
00238 virtual bool AttachColliderConvexMesh (iMeshWrapper* mesh,
00239 const csOrthoTransform& trans, float friction,
00240 float elasticity, float softness = 0.01f) = 0;
00241
00259 virtual bool AttachColliderMesh (iMeshWrapper* mesh,
00260 const csOrthoTransform& trans, float friction,
00261 float elasticity, float softness = 0.01f) = 0;
00262
00278 virtual bool AttachColliderCylinder (float length, float radius,
00279 const csOrthoTransform& trans, float friction,
00280 float elasticity, float softness = 0.01f) = 0;
00281
00295 virtual bool AttachColliderBox (const csVector3 &size,
00296 const csOrthoTransform& trans, float friction,
00297 float elasticity, float softness = 0.01f) = 0;
00298
00313 virtual bool AttachColliderSphere (float radius, const csVector3 &offset,
00314 float friction, float elasticity, float softness = 0.01f) = 0;
00315
00328 virtual bool AttachColliderPlane (const csPlane3 &plane, float friction,
00329 float elasticity, float softness = 0.01f) = 0;
00330
00332 virtual void DestroyColliders () = 0;
00333
00335 virtual void DestroyCollider (iDynamicsSystemCollider* collider) = 0;
00336
00338 virtual void AttachCollider (iDynamicsSystemCollider* collider) = 0;
00339
00345 virtual csRef<iDynamicsSystemCollider> CreateCollider () = 0;
00346
00348 virtual csRef<iDynamicsSystemCollider> GetCollider (unsigned int index) = 0;
00349
00351 virtual int GetColliderCount () = 0;
00352
00370 virtual bool AttachColliderCapsule (float length, float radius,
00371 const csOrthoTransform& trans, float friction,
00372 float elasticity, float softness = 0.01f) = 0;
00373
00379 virtual void AddBody (iRigidBody* body) = 0;
00380
00384 virtual void AddJoint (iJoint* joint) = 0;
00385 };
00386
00398 struct iDynamicsMoveCallback : public virtual iBase
00399 {
00400 SCF_INTERFACE (iDynamicsMoveCallback, 0, 0, 1);
00401
00403 virtual void Execute (iMeshWrapper* mesh, csOrthoTransform& t) = 0;
00404
00406 virtual void Execute (iLight* light, csOrthoTransform& t) = 0;
00407
00409 virtual void Execute (iCamera* camera, csOrthoTransform& t) = 0;
00410
00417 virtual void Execute (csOrthoTransform& t) = 0;
00418 };
00419
00430 struct iDynamicsCollisionCallback : public virtual iBase
00431 {
00432 SCF_INTERFACE (iDynamicsCollisionCallback, 0, 0, 2);
00433
00442 virtual void Execute (iRigidBody *thisbody, iRigidBody *otherbody,
00443 const csVector3& pos, const csVector3& normal, float depth) = 0;
00444 };
00445
00462 struct iBodyGroup : public virtual iBase
00463 {
00464 SCF_INTERFACE (iBodyGroup, 0, 1, 0);
00465
00467 virtual void AddBody (iRigidBody *body) = 0;
00469 virtual void RemoveBody (iRigidBody *body) = 0;
00471 virtual bool BodyInGroup (iRigidBody *body) = 0;
00472 };
00473
00491 struct iRigidBody : public virtual iBase
00492 {
00493 SCF_INTERFACE (iRigidBody, 0, 0, 3);
00494
00496 virtual iObject *QueryObject (void) = 0;
00503 virtual bool MakeStatic (void) = 0;
00511 virtual bool MakeDynamic (void) = 0;
00519 virtual bool IsStatic (void) = 0;
00523 virtual bool Disable (void) = 0;
00525 virtual bool Enable (void) = 0;
00527 virtual bool IsEnabled (void) = 0;
00528
00530 virtual csRef<iBodyGroup> GetGroup (void) = 0;
00531
00548 virtual bool AttachColliderConvexMesh (iMeshWrapper* mesh,
00549 const csOrthoTransform& trans, float friction, float density,
00550 float elasticity, float softness = 0.01f) = 0;
00551
00571 virtual bool AttachColliderMesh (iMeshWrapper* mesh,
00572 const csOrthoTransform& trans, float friction, float density,
00573 float elasticity, float softness = 0.01f) = 0;
00574
00591 virtual bool AttachColliderCylinder (float length, float radius,
00592 const csOrthoTransform& trans, float friction, float density,
00593 float elasticity, float softness = 0.01f) = 0;
00594
00610 virtual bool AttachColliderBox (const csVector3 &size,
00611 const csOrthoTransform& trans, float friction, float density,
00612 float elasticity, float softness = 0.01f) = 0;
00613
00629 virtual bool AttachColliderSphere (float radius, const csVector3 &offset,
00630 float friction, float density, float elasticity,
00631 float softness = 0.01f) = 0;
00632
00647 virtual bool AttachColliderPlane (const csPlane3 &plane, float friction,
00648 float density, float elasticity, float softness = 0.01f) = 0;
00649
00656 virtual void AttachCollider (iDynamicsSystemCollider* collider) = 0;
00657
00659 virtual void DestroyColliders () = 0;
00660
00662 virtual void DestroyCollider (iDynamicsSystemCollider* collider) = 0;
00663
00665 virtual void SetPosition (const csVector3& trans) = 0;
00667 virtual const csVector3 GetPosition () const = 0;
00669 virtual void SetOrientation (const csMatrix3& trans) = 0;
00671 virtual const csMatrix3 GetOrientation () const = 0;
00673 virtual void SetTransform (const csOrthoTransform& trans) = 0;
00675 virtual const csOrthoTransform GetTransform () const = 0;
00677 virtual void SetLinearVelocity (const csVector3& vel) = 0;
00679 virtual const csVector3 GetLinearVelocity () const = 0;
00681 virtual void SetAngularVelocity (const csVector3& vel) = 0;
00683 virtual const csVector3 GetAngularVelocity () const = 0;
00684
00696 virtual void SetProperties (float mass, const csVector3& center,
00697 const csMatrix3& inertia) = 0;
00699 virtual void GetProperties (float* mass, csVector3* center,
00700 csMatrix3* inertia) = 0;
00702 virtual float GetMass () = 0;
00704 virtual csVector3 GetCenter () = 0;
00706 virtual csMatrix3 GetInertia () = 0;
00707
00713 virtual void AdjustTotalMass (float targetmass) = 0;
00714
00716 virtual void AddForce (const csVector3& force) = 0;
00718 virtual void AddTorque (const csVector3& force) = 0;
00720 virtual void AddRelForce (const csVector3& force) = 0;
00722 virtual void AddRelTorque (const csVector3& force) = 0 ;
00727 virtual void AddForceAtPos (const csVector3& force, const csVector3& pos) = 0;
00732 virtual void AddForceAtRelPos (const csVector3& force,
00733 const csVector3& pos) = 0;
00738 virtual void AddRelForceAtPos (const csVector3& force,
00739 const csVector3& pos) = 0;
00744 virtual void AddRelForceAtRelPos (const csVector3& force,
00745 const csVector3& pos) = 0;
00746
00748 virtual const csVector3 GetForce () const = 0;
00750 virtual const csVector3 GetTorque () const = 0;
00751
00752
00754
00756
00757
00758
00759
00761
00762
00763
00765 virtual void AttachMesh (iMeshWrapper* mesh) = 0;
00767 virtual iMeshWrapper* GetAttachedMesh () = 0;
00769 virtual void AttachLight (iLight* light) = 0;
00771 virtual iLight* GetAttachedLight () = 0;
00773 virtual void AttachCamera (iCamera* camera) = 0;
00775 virtual iCamera* GetAttachedCamera () = 0;
00776
00781 virtual void SetMoveCallback (iDynamicsMoveCallback* cb) = 0;
00786 virtual void SetCollisionCallback (iDynamicsCollisionCallback* cb) = 0;
00787
00795 virtual void Collision (iRigidBody *other, const csVector3& pos,
00796 const csVector3& normal, float depth) = 0;
00797
00799 virtual void Update () = 0;
00800
00802 virtual csRef<iDynamicsSystemCollider> GetCollider (unsigned int index) = 0;
00803
00805 virtual int GetColliderCount () = 0;
00806
00824 virtual bool AttachColliderCapsule (float length, float radius,
00825 const csOrthoTransform& trans, float friction, float density,
00826 float elasticity, float softness = 0.01f) = 0;
00827 };
00828
00829 enum csColliderGeometryType
00830 {
00831 NO_GEOMETRY,
00832 BOX_COLLIDER_GEOMETRY,
00833 PLANE_COLLIDER_GEOMETRY,
00834 TRIMESH_COLLIDER_GEOMETRY,
00835 CONVEXMESH_COLLIDER_GEOMETRY,
00836 CYLINDER_COLLIDER_GEOMETRY,
00837 CAPSULE_COLLIDER_GEOMETRY,
00838 SPHERE_COLLIDER_GEOMETRY
00839 };
00840
00841
00851 struct iDynamicsColliderCollisionCallback : public virtual iBase
00852 {
00853 SCF_INTERFACE (iDynamicsColliderCollisionCallback, 0, 0, 1);
00854
00858 virtual void Execute (iDynamicsSystemCollider *thiscollider,
00859 iDynamicsSystemCollider *othercollider) = 0;
00860
00864 virtual void Execute (iDynamicsSystemCollider *thiscollider,
00865 iRigidBody *otherbody) = 0;
00866 };
00867
00868
00869 struct iGeneralFactoryState;
00870 class csBox3;
00871 class csSphere;
00872 class csReversibleTransform;
00873
00893 struct iDynamicsSystemCollider : public virtual iBase
00894 {
00895 SCF_INTERFACE (iDynamicsSystemCollider, 0, 0, 4);
00896
00898 virtual bool CreateSphereGeometry (const csSphere& sphere) = 0;
00899
00901 virtual bool CreatePlaneGeometry (const csPlane3& plane) = 0;
00902
00904 virtual bool CreateConvexMeshGeometry (iMeshWrapper *mesh) = 0;
00905
00913 virtual bool CreateMeshGeometry (iMeshWrapper *mesh) = 0;
00914
00916 virtual bool CreateBoxGeometry (const csVector3& box_size) = 0;
00917
00919 virtual bool CreateCapsuleGeometry (float length, float radius) = 0;
00920
00922 virtual bool CreateCylinderGeometry (float length, float radius) = 0;
00923
00924
00925
00926 virtual void SetCollisionCallback (
00927 iDynamicsColliderCollisionCallback* cb) = 0;
00928
00930 virtual void SetFriction (float friction) = 0;
00931
00933 virtual void SetSoftness (float softness) = 0;
00934
00945 virtual void SetDensity (float density) = 0;
00946
00948 virtual void SetElasticity (float elasticity) = 0;
00949
00951 virtual float GetFriction () = 0;
00952
00954 virtual float GetSoftness () = 0;
00955
00957 virtual float GetDensity () = 0;
00958
00960 virtual float GetElasticity () = 0;
00961
00963 virtual void FillWithColliderGeometry (
00964 csRef<iGeneralFactoryState> genmesh_fact) = 0;
00965
00967 virtual csColliderGeometryType GetGeometryType () = 0;
00968
00970 virtual csOrthoTransform GetTransform () = 0;
00971
00976 virtual csOrthoTransform GetLocalTransform () = 0;
00977
00982 virtual void SetTransform (const csOrthoTransform& trans) = 0;
00983
00988 virtual bool GetBoxGeometry (csVector3& size) = 0;
00989
00994 virtual bool GetSphereGeometry (csSphere& sphere) = 0;
00995
01000 virtual bool GetPlaneGeometry (csPlane3& plane) = 0;
01001
01006 virtual bool GetCylinderGeometry (float& length, float& radius) = 0;
01007
01013 virtual void MakeStatic () = 0;
01014
01019 virtual void MakeDynamic () = 0;
01020
01022 virtual bool IsStatic () = 0;
01023
01028 virtual bool GetCapsuleGeometry (float& length, float& radius) = 0;
01029
01045 virtual bool GetMeshGeometry (csVector3*& vertices, size_t& vertexCount,
01046 int*& indices, size_t& triangleCount) = 0;
01047
01063 virtual bool GetConvexMeshGeometry (csVector3*& vertices, size_t& vertexCount,
01064 int*& indices, size_t& triangleCount) = 0;
01065 };
01066
01079 struct iJoint : public virtual iBase
01080 {
01081 SCF_INTERFACE (iJoint, 0, 0, 1);
01082
01087 virtual void Attach (iRigidBody* body1, iRigidBody* body2, bool force_update = true) = 0;
01089 virtual csRef<iRigidBody> GetAttachedBody (int body) = 0;
01098 virtual void SetTransform (const csOrthoTransform &trans, bool force_update = true) = 0;
01100 virtual csOrthoTransform GetTransform () = 0;
01109 virtual void SetTransConstraints (bool X, bool Y, bool Z, bool force_update = true) = 0;
01111 virtual bool IsXTransConstrained () = 0;
01113 virtual bool IsYTransConstrained () = 0;
01115 virtual bool IsZTransConstrained () = 0;
01120 virtual void SetMinimumDistance (const csVector3 &min, bool force_update = true) = 0;
01122 virtual csVector3 GetMinimumDistance () = 0;
01127 virtual void SetMaximumDistance (const csVector3 &max, bool force_update = true) = 0;
01129 virtual csVector3 GetMaximumDistance () = 0;
01138 virtual void SetRotConstraints (bool X, bool Y, bool Z, bool force_update = true) = 0;
01140 virtual bool IsXRotConstrained () = 0;
01142 virtual bool IsYRotConstrained () = 0;
01144 virtual bool IsZRotConstrained () = 0;
01149 virtual void SetMinimumAngle (const csVector3 &min, bool force_update = true) = 0;
01151 virtual csVector3 GetMinimumAngle () = 0;
01156 virtual void SetMaximumAngle (const csVector3 &max, bool force_update = true) = 0;
01158 virtual csVector3 GetMaximumAngle () = 0;
01159
01160
01161
01167 virtual void SetBounce (const csVector3 & bounce, bool force_update = true) = 0;
01169 virtual csVector3 GetBounce () = 0;
01174 virtual void SetDesiredVelocity (const csVector3 &velocity, bool force_update = true) = 0;
01176 virtual csVector3 GetDesiredVelocity () = 0;
01181 virtual void SetMaxForce (const csVector3 & maxForce, bool force_update = true) = 0;
01183 virtual csVector3 GetMaxForce () = 0;
01188 virtual void SetAngularConstraintAxis (const csVector3 &axis, int body, bool force_update = true) = 0;
01190 virtual csVector3 GetAngularConstraintAxis (int body) = 0;
01195 virtual bool RebuildJoint () = 0;
01196
01197 };
01198
01199 #endif // __CS_IVARIA_DYNAMICS_H__
01200