CrystalSpace

Public API Reference

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 
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   virtual const csVector3& GetRelForce () const = 0;
00756   virtual const csVector3& GetRelTorque () const = 0;
00757   */
00758 
00759   /*
00761   virtual int GetJointCount () const = 0;
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   //FIXME: This should be implememented, but it is not so obvious - it
00925   //should be valid also for static colliders.
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   //Motor parameters
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 

Generated for Crystal Space 2.0 by doxygen 1.7.6.1