ivaria/dynamics.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2002 Anders Stenberg 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 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 00051 struct iDynamicsStepCallback : public virtual iBase 00052 { 00053 SCF_INTERFACE (iDynamicsStepCallback, 0, 0, 1); 00054 00055 virtual void Step (float stepsize) = 0; 00056 }; 00057 00071 struct iDynamics : public virtual iBase 00072 { 00073 SCF_INTERFACE(iDynamics,0,0,2); 00075 virtual csPtr<iDynamicSystem> CreateSystem () = 0; 00076 00078 virtual void RemoveSystem (iDynamicSystem* system) = 0; 00079 00081 virtual void RemoveSystems () = 0; 00082 00084 virtual iDynamicSystem* FindSystem (const char *name) = 0; 00085 00087 virtual void Step (float stepsize) = 0; 00088 00092 virtual void AddStepCallback (iDynamicsStepCallback *callback) = 0; 00093 00097 virtual void RemoveStepCallback (iDynamicsStepCallback *callback) = 0; 00098 }; 00099 00100 struct iDynamicsSystemCollider; 00101 00114 struct iDynamicSystem : public virtual iBase 00115 { 00116 SCF_INTERFACE (iDynamicSystem, 0, 0, 2); 00117 00119 virtual iObject *QueryObject (void) = 0; 00121 virtual void SetGravity (const csVector3& v) = 0; 00123 virtual const csVector3 GetGravity () const = 0; 00125 virtual void SetLinearDampener (float d) = 0; 00127 virtual float GetLinearDampener () const = 0; 00129 virtual void SetRollingDampener (float d) = 0; 00131 virtual float GetRollingDampener () const = 0; 00132 00138 virtual void EnableAutoDisable (bool enable) = 0; 00139 virtual bool AutoDisableEnabled () =0; 00149 virtual void SetAutoDisableParams (float linear, float angular, int steps, 00150 float time)=0; 00151 00153 virtual void Step (float stepsize) = 0; 00154 00156 virtual csPtr<iRigidBody> CreateBody () = 0; 00157 00159 virtual void RemoveBody (iRigidBody* body) = 0; 00160 00162 virtual iRigidBody *FindBody (const char *name) = 0; 00163 00165 virtual iRigidBody *GetBody (unsigned int index) = 0; 00166 00168 virtual int GetBodysCount () = 0; 00169 00171 virtual csPtr<iBodyGroup> CreateGroup () = 0; 00172 00174 virtual void RemoveGroup (iBodyGroup* group) = 0; 00175 00177 virtual csPtr<iJoint> CreateJoint () = 0; 00178 00180 virtual void RemoveJoint (iJoint* joint) = 0; 00181 00183 virtual iDynamicsMoveCallback* GetDefaultMoveCallback () = 0; 00184 00199 virtual bool AttachColliderConvexMesh (iMeshWrapper* mesh, 00200 const csOrthoTransform& trans, float friction, 00201 float elasticity, float softness = 0.01f) = 0; 00202 00216 virtual bool AttachColliderMesh (iMeshWrapper* mesh, 00217 const csOrthoTransform& trans, float friction, 00218 float elasticity, float softness = 0.01f) = 0; 00219 00234 virtual bool AttachColliderCylinder (float length, float radius, 00235 const csOrthoTransform& trans, float friction, 00236 float elasticity, float softness = 0.01f) = 0; 00237 00251 virtual bool AttachColliderBox (const csVector3 &size, 00252 const csOrthoTransform& trans, float friction, 00253 float elasticity, float softness = 0.01f) = 0; 00254 00269 virtual bool AttachColliderSphere (float radius, const csVector3 &offset, 00270 float friction, float elasticity, float softness = 0.01f) = 0; 00271 00284 virtual bool AttachColliderPlane (const csPlane3 &plane, float friction, 00285 float elasticity, float softness = 0.01f) = 0; 00286 00288 virtual void DestroyColliders () = 0; 00289 00291 virtual void DestroyCollider (iDynamicsSystemCollider* collider) = 0; 00292 00294 virtual void AttachCollider (iDynamicsSystemCollider* collider) = 0; 00295 00301 virtual csRef<iDynamicsSystemCollider> CreateCollider () = 0; 00302 00304 virtual csRef<iDynamicsSystemCollider> GetCollider (unsigned int index) = 0; 00305 00307 virtual int GetColliderCount () = 0; 00308 }; 00309 00321 struct iDynamicsMoveCallback : public virtual iBase 00322 { 00323 SCF_INTERFACE (iDynamicsMoveCallback, 0, 0, 1); 00324 00325 virtual void Execute (iMeshWrapper* mesh, csOrthoTransform& t) = 0; 00326 virtual void Execute (iLight* light, csOrthoTransform& t) = 0; 00327 virtual void Execute (iCamera* camera, csOrthoTransform& t) = 0; 00328 virtual void Execute (csOrthoTransform& t) = 0; 00329 }; 00330 00341 struct iDynamicsCollisionCallback : public virtual iBase 00342 { 00343 SCF_INTERFACE (iDynamicsCollisionCallback, 0, 0, 2); 00344 00353 virtual void Execute (iRigidBody *thisbody, iRigidBody *otherbody, 00354 const csVector3& pos, const csVector3& normal, float depth) = 0; 00355 }; 00356 00373 struct iBodyGroup : public virtual iBase 00374 { 00375 SCF_INTERFACE (iBodyGroup, 0, 1, 0); 00376 00378 virtual void AddBody (iRigidBody *body) = 0; 00380 virtual void RemoveBody (iRigidBody *body) = 0; 00382 virtual bool BodyInGroup (iRigidBody *body) = 0; 00383 }; 00384 00400 struct iRigidBody : public virtual iBase 00401 { 00402 SCF_INTERFACE (iRigidBody, 0, 0, 2); 00403 00405 virtual iObject *QueryObject (void) = 0; 00411 virtual bool MakeStatic (void) = 0; 00413 virtual bool MakeDynamic (void) = 0; 00415 virtual bool IsStatic (void) = 0; 00419 virtual bool Disable (void) = 0; 00421 virtual bool Enable (void) = 0; 00423 virtual bool IsEnabled (void) = 0; 00424 00426 virtual csRef<iBodyGroup> GetGroup (void) = 0; 00427 00444 virtual bool AttachColliderConvexMesh (iMeshWrapper* mesh, 00445 const csOrthoTransform& trans, float friction, float density, 00446 float elasticity, float softness = 0.01f) = 0; 00447 00463 virtual bool AttachColliderMesh (iMeshWrapper* mesh, 00464 const csOrthoTransform& trans, float friction, float density, 00465 float elasticity, float softness = 0.01f) = 0; 00466 00483 virtual bool AttachColliderCylinder (float length, float radius, 00484 const csOrthoTransform& trans, float friction, float density, 00485 float elasticity, float softness = 0.01f) = 0; 00486 00502 virtual bool AttachColliderBox (const csVector3 &size, 00503 const csOrthoTransform& trans, float friction, float density, 00504 float elasticity, float softness = 0.01f) = 0; 00505 00521 virtual bool AttachColliderSphere (float radius, const csVector3 &offset, 00522 float friction, float density, float elasticity, 00523 float softness = 0.01f) = 0; 00524 00539 virtual bool AttachColliderPlane (const csPlane3 &plane, float friction, 00540 float density, float elasticity, float softness = 0.01f) = 0; 00541 00548 virtual void AttachCollider (iDynamicsSystemCollider* collider) = 0; 00549 00551 virtual void DestroyColliders () = 0; 00552 00554 virtual void DestroyCollider (iDynamicsSystemCollider* collider) = 0; 00555 00557 virtual void SetPosition (const csVector3& trans) = 0; 00559 virtual const csVector3 GetPosition () const = 0; 00561 virtual void SetOrientation (const csMatrix3& trans) = 0; 00563 virtual const csMatrix3 GetOrientation () const = 0; 00565 virtual void SetTransform (const csOrthoTransform& trans) = 0; 00567 virtual const csOrthoTransform GetTransform () const = 0; 00569 virtual void SetLinearVelocity (const csVector3& vel) = 0; 00571 virtual const csVector3 GetLinearVelocity () const = 0; 00573 virtual void SetAngularVelocity (const csVector3& vel) = 0; 00575 virtual const csVector3 GetAngularVelocity () const = 0; 00576 00578 virtual void SetProperties (float mass, const csVector3& center, 00579 const csMatrix3& inertia) = 0; 00581 virtual void GetProperties (float* mass, csVector3* center, 00582 csMatrix3* inertia) = 0; 00584 virtual float GetMass () = 0; 00586 virtual csVector3 GetCenter () = 0; 00588 virtual csMatrix3 GetInertia () = 0; 00589 00591 virtual void AdjustTotalMass (float targetmass) = 0; 00592 00594 virtual void AddForce (const csVector3& force) = 0; 00596 virtual void AddTorque (const csVector3& force) = 0; 00598 virtual void AddRelForce (const csVector3& force) = 0; 00600 virtual void AddRelTorque (const csVector3& force) = 0 ; 00605 virtual void AddForceAtPos (const csVector3& force, const csVector3& pos) = 0; 00610 virtual void AddForceAtRelPos (const csVector3& force, 00611 const csVector3& pos) = 0; 00616 virtual void AddRelForceAtPos (const csVector3& force, 00617 const csVector3& pos) = 0; 00622 virtual void AddRelForceAtRelPos (const csVector3& force, 00623 const csVector3& pos) = 0; 00624 00626 virtual const csVector3 GetForce () const = 0; 00628 virtual const csVector3 GetTorque () const = 0; 00629 00630 /* 00632 virtual const csVector3& GetRelForce () const = 0; 00634 virtual const csVector3& GetRelTorque () const = 0; 00635 */ 00636 00637 /* 00639 virtual int GetJointCount () const = 0; 00640 */ 00641 00643 virtual void AttachMesh (iMeshWrapper* mesh) = 0; 00645 virtual iMeshWrapper* GetAttachedMesh () = 0; 00647 virtual void AttachLight (iLight* light) = 0; 00649 virtual iLight* GetAttachedLight () = 0; 00651 virtual void AttachCamera (iCamera* camera) = 0; 00653 virtual iCamera* GetAttachedCamera () = 0; 00654 00659 virtual void SetMoveCallback (iDynamicsMoveCallback* cb) = 0; 00664 virtual void SetCollisionCallback (iDynamicsCollisionCallback* cb) = 0; 00665 00673 virtual void Collision (iRigidBody *other, const csVector3& pos, 00674 const csVector3& normal, float depth) = 0; 00675 00677 virtual void Update () = 0; 00678 00680 virtual csRef<iDynamicsSystemCollider> GetCollider (unsigned int index) = 0; 00681 00683 virtual int GetColliderCount () = 0; 00684 }; 00685 00686 enum csColliderGeometryType 00687 { 00688 NO_GEOMETRY, 00689 BOX_COLLIDER_GEOMETRY, 00690 PLANE_COLLIDER_GEOMETRY, 00691 TRIMESH_COLLIDER_GEOMETRY, 00692 CYLINDER_COLLIDER_GEOMETRY, 00693 CAPSULE_COLLIDER_GEOMETRY, 00694 SPHERE_COLLIDER_GEOMETRY 00695 }; 00696 00697 00707 struct iDynamicsColliderCollisionCallback : public virtual iBase 00708 { 00709 SCF_INTERFACE (iDynamicsColliderCollisionCallback, 0, 0, 1); 00710 00711 virtual void Execute (iDynamicsSystemCollider *thiscollider, 00712 iDynamicsSystemCollider *othercollider) = 0; 00713 virtual void Execute (iDynamicsSystemCollider *thiscollider, 00714 iRigidBody *otherbody) = 0; 00715 }; 00716 00717 00718 struct iGeneralFactoryState; 00719 class csBox3; 00720 class csSphere; 00721 class csReversibleTransform; 00722 00742 struct iDynamicsSystemCollider : public virtual iBase 00743 { 00744 SCF_INTERFACE (iDynamicsSystemCollider, 0, 0, 2); 00745 00747 virtual bool CreateSphereGeometry (const csSphere& sphere) = 0; 00748 00750 virtual bool CreatePlaneGeometry (const csPlane3& plane) = 0; 00751 00753 virtual bool CreateConvexMeshGeometry (iMeshWrapper *mesh) = 0; 00754 00756 virtual bool CreateMeshGeometry (iMeshWrapper *mesh) = 0; 00757 00759 virtual bool CreateBoxGeometry (const csVector3& box_size) = 0; 00760 00762 virtual bool CreateCapsuleGeometry (float length, float radius) = 0; 00763 00765 virtual bool CreateCylinderGeometry (float length, float radius) = 0; 00766 00767 //FIXME: This should be implememented, but it is not so obvious - it 00768 //should be valid also for static colliders. 00769 virtual void SetCollisionCallback ( 00770 iDynamicsColliderCollisionCallback* cb) = 0; 00771 00773 virtual void SetFriction (float friction) = 0; 00774 00776 virtual void SetSoftness (float softness) = 0; 00777 00783 virtual void SetDensity (float density) = 0; 00784 00786 virtual void SetElasticity (float elasticity) = 0; 00787 00789 virtual float GetFriction () = 0; 00790 00792 virtual float GetSoftness () = 0; 00793 00795 virtual float GetDensity () = 0; 00796 00798 virtual float GetElasticity () = 0; 00799 00801 virtual void FillWithColliderGeometry ( 00802 csRef<iGeneralFactoryState> genmesh_fact) = 0; 00803 00805 virtual csColliderGeometryType GetGeometryType () = 0; 00806 00808 virtual csOrthoTransform GetTransform () = 0; 00809 00814 virtual csOrthoTransform GetLocalTransform () = 0; 00815 00820 virtual void SetTransform (const csOrthoTransform& trans) = 0; 00821 00826 virtual bool GetBoxGeometry (csVector3& size) = 0; 00827 00832 virtual bool GetSphereGeometry (csSphere& sphere) = 0; 00833 00838 virtual bool GetPlaneGeometry (csPlane3& plane) = 0; 00839 00844 virtual bool GetCylinderGeometry (float& length, float& radius) = 0; 00845 00851 virtual void MakeStatic () = 0; 00852 00857 virtual void MakeDynamic () = 0; 00858 00860 virtual bool IsStatic () = 0; 00861 }; 00862 00876 struct iJoint : public virtual iBase 00877 { 00878 SCF_INTERFACE (iJoint, 0, 0, 1); 00879 00884 virtual void Attach (iRigidBody* body1, iRigidBody* body2, bool force_update = true) = 0; 00886 virtual csRef<iRigidBody> GetAttachedBody (int body) = 0; 00893 virtual void SetTransform (const csOrthoTransform &trans, bool force_update = true) = 0; 00895 virtual csOrthoTransform GetTransform () = 0; 00904 virtual void SetTransConstraints (bool X, bool Y, bool Z, bool force_update = true) = 0; 00906 virtual bool IsXTransConstrained () = 0; 00908 virtual bool IsYTransConstrained () = 0; 00910 virtual bool IsZTransConstrained () = 0; 00915 virtual void SetMinimumDistance (const csVector3 &min, bool force_update = true) = 0; 00917 virtual csVector3 GetMinimumDistance () = 0; 00922 virtual void SetMaximumDistance (const csVector3 &max, bool force_update = true) = 0; 00924 virtual csVector3 GetMaximumDistance () = 0; 00931 virtual void SetRotConstraints (bool X, bool Y, bool Z, bool force_update = true) = 0; 00933 virtual bool IsXRotConstrained () = 0; 00935 virtual bool IsYRotConstrained () = 0; 00937 virtual bool IsZRotConstrained () = 0; 00942 virtual void SetMinimumAngle (const csVector3 &min, bool force_update = true) = 0; 00944 virtual csVector3 GetMinimumAngle () = 0; 00949 virtual void SetMaximumAngle (const csVector3 &max, bool force_update = true) = 0; 00951 virtual csVector3 GetMaximumAngle () = 0; 00952 00953 //Motor parameters 00954 00960 virtual void SetBounce (const csVector3 & bounce, bool force_update = true) = 0; 00962 virtual csVector3 GetBounce () = 0; 00967 virtual void SetDesiredVelocity (const csVector3 &velocity, bool force_update = true) = 0; 00968 virtual csVector3 GetDesiredVelocity () = 0; 00973 virtual void SetMaxForce (const csVector3 & maxForce, bool force_update = true) = 0; 00974 virtual csVector3 GetMaxForce () = 0; 00979 virtual void SetAngularConstraintAxis (const csVector3 &axis, int body, bool force_update = true) = 0; 00981 virtual csVector3 GetAngularConstraintAxis (int body) = 0; 00986 virtual bool RebuildJoint () = 0; 00987 00988 }; 00989 00990 #endif // __CS_IVARIA_DYNAMICS_H__ 00991
Generated for Crystal Space 1.4.0 by doxygen 1.5.8