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 #include "ivaria/bodytype.h" 00030 00031 00032 struct iBodyGroup; 00033 struct iJoint; 00034 struct iMeshWrapper; 00035 struct iLight; 00036 struct iCamera; 00037 struct iObject; 00038 struct iRigidBody; 00039 00040 class csMatrix3; 00041 class csOrthoTransform; 00042 class csPlane3; 00043 class csVector3; 00044 00045 struct iDynamicsCollisionCallback; 00046 struct iDynamicsMoveCallback; 00047 struct iDynamicSystem; 00048 00049 00054 struct iDynamicsStepCallback : public virtual iBase 00055 { 00056 SCF_INTERFACE (iDynamicsStepCallback, 0, 0, 1); 00057 00062 virtual void Step (float stepsize) = 0; 00063 }; 00064 00080 struct iDynamics : public virtual iBase 00081 { 00082 SCF_INTERFACE(iDynamics,0,0,2); 00084 virtual csPtr<iDynamicSystem> CreateSystem () = 0; 00085 00087 virtual void RemoveSystem (iDynamicSystem* system) = 0; 00088 00090 virtual void RemoveSystems () = 0; 00091 00093 virtual iDynamicSystem* FindSystem (const char *name) = 0; 00094 00102 virtual void Step (float stepsize) = 0; 00103 00107 virtual void AddStepCallback (iDynamicsStepCallback *callback) = 0; 00108 00112 virtual void RemoveStepCallback (iDynamicsStepCallback *callback) = 0; 00113 }; 00114 00115 struct iDynamicsSystemCollider; 00116 00131 struct iDynamicSystem : public virtual iBase 00132 { 00133 SCF_INTERFACE (iDynamicSystem, 0, 0, 4); 00134 00136 virtual iObject *QueryObject (void) = 0; 00138 virtual void SetGravity (const csVector3& v) = 0; 00140 virtual const csVector3 GetGravity () const = 0; 00141 00151 virtual void SetLinearDampener (float d) = 0; 00152 00154 virtual float GetLinearDampener () const = 0; 00155 00165 virtual void SetRollingDampener (float d) = 0; 00166 00168 virtual float GetRollingDampener () const = 0; 00169 00175 virtual void EnableAutoDisable (bool enable) = 0; 00177 virtual bool AutoDisableEnabled () = 0; 00190 virtual void SetAutoDisableParams (float linear, float angular, int steps, 00191 float time) = 0; 00192 00194 virtual void Step (float stepsize) = 0; 00195 00197 virtual csPtr<iRigidBody> CreateBody () = 0; 00198 00200 virtual void RemoveBody (iRigidBody* body) = 0; 00201 00203 virtual iRigidBody *FindBody (const char *name) = 0; 00204 00206 virtual iRigidBody *GetBody (unsigned int index) = 0; 00207 00209 virtual int GetBodysCount () = 0; 00210 00212 virtual csPtr<iBodyGroup> CreateGroup () = 0; 00213 00215 virtual void RemoveGroup (iBodyGroup* group) = 0; 00216 00218 virtual csPtr<iJoint> CreateJoint () = 0; 00219 00221 virtual void RemoveJoint (iJoint* joint) = 0; 00222 00224 virtual iDynamicsMoveCallback* GetDefaultMoveCallback () = 0; 00225 00240 virtual bool AttachColliderConvexMesh (iMeshWrapper* mesh, 00241 const csOrthoTransform& trans, float friction, 00242 float elasticity, float softness = 0.01f) = 0; 00243 00261 virtual bool AttachColliderMesh (iMeshWrapper* mesh, 00262 const csOrthoTransform& trans, float friction, 00263 float elasticity, float softness = 0.01f) = 0; 00264 00280 virtual bool AttachColliderCylinder (float length, float radius, 00281 const csOrthoTransform& trans, float friction, 00282 float elasticity, float softness = 0.01f) = 0; 00283 00297 virtual bool AttachColliderBox (const csVector3 &size, 00298 const csOrthoTransform& trans, float friction, 00299 float elasticity, float softness = 0.01f) = 0; 00300 00315 virtual bool AttachColliderSphere (float radius, const csVector3 &offset, 00316 float friction, float elasticity, float softness = 0.01f) = 0; 00317 00330 virtual bool AttachColliderPlane (const csPlane3 &plane, float friction, 00331 float elasticity, float softness = 0.01f) = 0; 00332 00334 virtual void DestroyColliders () = 0; 00335 00337 virtual void DestroyCollider (iDynamicsSystemCollider* collider) = 0; 00338 00340 virtual void AttachCollider (iDynamicsSystemCollider* collider) = 0; 00341 00347 virtual csRef<iDynamicsSystemCollider> CreateCollider () = 0; 00348 00350 virtual csRef<iDynamicsSystemCollider> GetCollider (unsigned int index) = 0; 00351 00353 virtual int GetColliderCount () = 0; 00354 00372 virtual bool AttachColliderCapsule (float length, float radius, 00373 const csOrthoTransform& trans, float friction, 00374 float elasticity, float softness = 0.01f) = 0; 00375 00381 virtual void AddBody (iRigidBody* body) = 0; 00382 00386 virtual void AddJoint (iJoint* joint) = 0; 00387 }; 00388 00400 struct iDynamicsMoveCallback : public virtual iBase 00401 { 00402 SCF_INTERFACE (iDynamicsMoveCallback, 0, 0, 1); 00403 00405 virtual void Execute (iMeshWrapper* mesh, csOrthoTransform& t) = 0; 00406 00408 virtual void Execute (iLight* light, csOrthoTransform& t) = 0; 00409 00411 virtual void Execute (iCamera* camera, csOrthoTransform& t) = 0; 00412 00419 virtual void Execute (csOrthoTransform& t) = 0; 00420 }; 00421 00432 struct iDynamicsCollisionCallback : public virtual iBase 00433 { 00434 SCF_INTERFACE (iDynamicsCollisionCallback, 0, 0, 2); 00435 00444 virtual void Execute (iRigidBody *thisbody, iRigidBody *otherbody, 00445 const csVector3& pos, const csVector3& normal, float depth) = 0; 00446 }; 00447 00464 struct iBodyGroup : public virtual iBase 00465 { 00466 SCF_INTERFACE (iBodyGroup, 0, 1, 0); 00467 00469 virtual void AddBody (iRigidBody *body) = 0; 00471 virtual void RemoveBody (iRigidBody *body) = 0; 00473 virtual bool BodyInGroup (iRigidBody *body) = 0; 00474 }; 00475 00493 struct iRigidBody : public virtual iBase 00494 { 00495 SCF_INTERFACE (iRigidBody, 0, 0, 3); 00496 00498 virtual iObject *QueryObject (void) = 0; 00505 virtual bool MakeStatic (void) = 0; 00513 virtual bool MakeDynamic (void) = 0; 00521 virtual bool IsStatic (void) = 0; 00525 virtual bool Disable (void) = 0; 00527 virtual bool Enable (void) = 0; 00529 virtual bool IsEnabled (void) = 0; 00530 00532 virtual csRef<iBodyGroup> GetGroup (void) = 0; 00533 00550 virtual bool AttachColliderConvexMesh (iMeshWrapper* mesh, 00551 const csOrthoTransform& trans, float friction, float density, 00552 float elasticity, float softness = 0.01f) = 0; 00553 00573 virtual bool AttachColliderMesh (iMeshWrapper* mesh, 00574 const csOrthoTransform& trans, float friction, float density, 00575 float elasticity, float softness = 0.01f) = 0; 00576 00593 virtual bool AttachColliderCylinder (float length, float radius, 00594 const csOrthoTransform& trans, float friction, float density, 00595 float elasticity, float softness = 0.01f) = 0; 00596 00612 virtual bool AttachColliderBox (const csVector3 &size, 00613 const csOrthoTransform& trans, float friction, float density, 00614 float elasticity, float softness = 0.01f) = 0; 00615 00631 virtual bool AttachColliderSphere (float radius, const csVector3 &offset, 00632 float friction, float density, float elasticity, 00633 float softness = 0.01f) = 0; 00634 00649 virtual bool AttachColliderPlane (const csPlane3 &plane, float friction, 00650 float density, float elasticity, float softness = 0.01f) = 0; 00651 00658 virtual void AttachCollider (iDynamicsSystemCollider* collider) = 0; 00659 00661 virtual void DestroyColliders () = 0; 00662 00664 virtual void DestroyCollider (iDynamicsSystemCollider* collider) = 0; 00665 00667 virtual void SetPosition (const csVector3& trans) = 0; 00669 virtual const csVector3 GetPosition () const = 0; 00671 virtual void SetOrientation (const csMatrix3& trans) = 0; 00673 virtual const csMatrix3 GetOrientation () const = 0; 00675 virtual void SetTransform (const csOrthoTransform& trans) = 0; 00677 virtual const csOrthoTransform GetTransform () const = 0; 00679 virtual void SetLinearVelocity (const csVector3& vel) = 0; 00681 virtual const csVector3 GetLinearVelocity () const = 0; 00683 virtual void SetAngularVelocity (const csVector3& vel) = 0; 00685 virtual const csVector3 GetAngularVelocity () const = 0; 00686 00698 virtual void SetProperties (float mass, const csVector3& center, 00699 const csMatrix3& inertia) = 0; 00701 virtual void GetProperties (float* mass, csVector3* center, 00702 csMatrix3* inertia) = 0; 00704 virtual float GetMass () = 0; 00706 virtual csVector3 GetCenter () = 0; 00708 virtual csMatrix3 GetInertia () = 0; 00709 00715 virtual void AdjustTotalMass (float targetmass) = 0; 00716 00718 virtual void AddForce (const csVector3& force) = 0; 00720 virtual void AddTorque (const csVector3& force) = 0; 00722 virtual void AddRelForce (const csVector3& force) = 0; 00724 virtual void AddRelTorque (const csVector3& force) = 0 ; 00729 virtual void AddForceAtPos (const csVector3& force, const csVector3& pos) = 0; 00734 virtual void AddForceAtRelPos (const csVector3& force, 00735 const csVector3& pos) = 0; 00740 virtual void AddRelForceAtPos (const csVector3& force, 00741 const csVector3& pos) = 0; 00746 virtual void AddRelForceAtRelPos (const csVector3& force, 00747 const csVector3& pos) = 0; 00748 00750 virtual const csVector3 GetForce () const = 0; 00752 virtual const csVector3 GetTorque () const = 0; 00753 00754 /* 00756 virtual const csVector3& GetRelForce () const = 0; 00758 virtual const csVector3& GetRelTorque () const = 0; 00759 */ 00760 00761 /* 00763 virtual int GetJointCount () const = 0; 00764 */ 00765 00767 virtual void AttachMesh (iMeshWrapper* mesh) = 0; 00769 virtual iMeshWrapper* GetAttachedMesh () = 0; 00771 virtual void AttachLight (iLight* light) = 0; 00773 virtual iLight* GetAttachedLight () = 0; 00775 virtual void AttachCamera (iCamera* camera) = 0; 00777 virtual iCamera* GetAttachedCamera () = 0; 00778 00783 virtual void SetMoveCallback (iDynamicsMoveCallback* cb) = 0; 00788 virtual void SetCollisionCallback (iDynamicsCollisionCallback* cb) = 0; 00789 00797 virtual void Collision (iRigidBody *other, const csVector3& pos, 00798 const csVector3& normal, float depth) = 0; 00799 00801 virtual void Update () = 0; 00802 00804 virtual csRef<iDynamicsSystemCollider> GetCollider (unsigned int index) = 0; 00805 00807 virtual int GetColliderCount () = 0; 00808 00826 virtual bool AttachColliderCapsule (float length, float radius, 00827 const csOrthoTransform& trans, float friction, float density, 00828 float elasticity, float softness = 0.01f) = 0; 00829 }; 00830 00840 struct iDynamicsColliderCollisionCallback : public virtual iBase 00841 { 00842 SCF_INTERFACE (iDynamicsColliderCollisionCallback, 0, 0, 1); 00843 00847 virtual void Execute (iDynamicsSystemCollider *thiscollider, 00848 iDynamicsSystemCollider *othercollider) = 0; 00849 00853 virtual void Execute (iDynamicsSystemCollider *thiscollider, 00854 iRigidBody *otherbody) = 0; 00855 }; 00856 00857 00858 struct iGeneralFactoryState; 00859 class csBox3; 00860 class csSphere; 00861 class csReversibleTransform; 00862 00882 struct iDynamicsSystemCollider : public virtual iBase 00883 { 00884 SCF_INTERFACE (iDynamicsSystemCollider, 0, 0, 4); 00885 00887 virtual bool CreateSphereGeometry (const csSphere& sphere) = 0; 00888 00890 virtual bool CreatePlaneGeometry (const csPlane3& plane) = 0; 00891 00893 virtual bool CreateConvexMeshGeometry (iMeshWrapper *mesh) = 0; 00894 00902 virtual bool CreateMeshGeometry (iMeshWrapper *mesh) = 0; 00903 00905 virtual bool CreateBoxGeometry (const csVector3& box_size) = 0; 00906 00908 virtual bool CreateCapsuleGeometry (float length, float radius) = 0; 00909 00911 virtual bool CreateCylinderGeometry (float length, float radius) = 0; 00912 00913 //FIXME: This should be implememented, but it is not so obvious - it 00914 //should be valid also for static colliders. 00915 virtual void SetCollisionCallback ( 00916 iDynamicsColliderCollisionCallback* cb) = 0; 00917 00919 virtual void SetFriction (float friction) = 0; 00920 00922 virtual void SetSoftness (float softness) = 0; 00923 00934 virtual void SetDensity (float density) = 0; 00935 00937 virtual void SetElasticity (float elasticity) = 0; 00938 00940 virtual float GetFriction () = 0; 00941 00943 virtual float GetSoftness () = 0; 00944 00946 virtual float GetDensity () = 0; 00947 00949 virtual float GetElasticity () = 0; 00950 00952 virtual void FillWithColliderGeometry ( 00953 csRef<iGeneralFactoryState> genmesh_fact) = 0; 00954 00956 virtual csColliderGeometryType GetGeometryType () = 0; 00957 00959 virtual csOrthoTransform GetTransform () = 0; 00960 00965 virtual csOrthoTransform GetLocalTransform () = 0; 00966 00971 virtual void SetTransform (const csOrthoTransform& trans) = 0; 00972 00977 virtual bool GetBoxGeometry (csVector3& size) = 0; 00978 00983 virtual bool GetSphereGeometry (csSphere& sphere) = 0; 00984 00989 virtual bool GetPlaneGeometry (csPlane3& plane) = 0; 00990 00995 virtual bool GetCylinderGeometry (float& length, float& radius) = 0; 00996 01002 virtual void MakeStatic () = 0; 01003 01008 virtual void MakeDynamic () = 0; 01009 01011 virtual bool IsStatic () = 0; 01012 01017 virtual bool GetCapsuleGeometry (float& length, float& radius) = 0; 01018 01034 virtual bool GetMeshGeometry (csVector3*& vertices, size_t& vertexCount, 01035 int*& indices, size_t& triangleCount) = 0; 01036 01052 virtual bool GetConvexMeshGeometry (csVector3*& vertices, size_t& vertexCount, 01053 int*& indices, size_t& triangleCount) = 0; 01054 }; 01055 01068 struct iJoint : public virtual iBase 01069 { 01070 SCF_INTERFACE (iJoint, 0, 0, 1); 01071 01076 virtual void Attach (iRigidBody* body1, iRigidBody* body2, bool force_update = true) = 0; 01078 virtual csRef<iRigidBody> GetAttachedBody (int body) = 0; 01087 virtual void SetTransform (const csOrthoTransform &trans, bool force_update = true) = 0; 01089 virtual csOrthoTransform GetTransform () = 0; 01098 virtual void SetTransConstraints (bool X, bool Y, bool Z, bool force_update = true) = 0; 01100 virtual bool IsXTransConstrained () = 0; 01102 virtual bool IsYTransConstrained () = 0; 01104 virtual bool IsZTransConstrained () = 0; 01109 virtual void SetMinimumDistance (const csVector3 &min, bool force_update = true) = 0; 01111 virtual csVector3 GetMinimumDistance () = 0; 01116 virtual void SetMaximumDistance (const csVector3 &max, bool force_update = true) = 0; 01118 virtual csVector3 GetMaximumDistance () = 0; 01127 virtual void SetRotConstraints (bool X, bool Y, bool Z, bool force_update = true) = 0; 01129 virtual bool IsXRotConstrained () = 0; 01131 virtual bool IsYRotConstrained () = 0; 01133 virtual bool IsZRotConstrained () = 0; 01138 virtual void SetMinimumAngle (const csVector3 &min, bool force_update = true) = 0; 01140 virtual csVector3 GetMinimumAngle () = 0; 01145 virtual void SetMaximumAngle (const csVector3 &max, bool force_update = true) = 0; 01147 virtual csVector3 GetMaximumAngle () = 0; 01148 01149 //Motor parameters 01150 01156 virtual void SetBounce (const csVector3 & bounce, bool force_update = true) = 0; 01158 virtual csVector3 GetBounce () = 0; 01163 virtual void SetDesiredVelocity (const csVector3 &velocity, bool force_update = true) = 0; 01165 virtual csVector3 GetDesiredVelocity () = 0; 01170 virtual void SetMaxForce (const csVector3 & maxForce, bool force_update = true) = 0; 01172 virtual csVector3 GetMaxForce () = 0; 01177 virtual void SetAngularConstraintAxis (const csVector3 &axis, int body, bool force_update = true) = 0; 01179 virtual csVector3 GetAngularConstraintAxis (int body) = 0; 01184 virtual bool RebuildJoint () = 0; 01185 01186 }; 01187 01188 #endif // __CS_IVARIA_DYNAMICS_H__ 01189
Generated for Crystal Space 2.1 by doxygen 1.6.1
