ivaria/physics.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2011-2012 Christian Van Brussel, Institute of Information 00003 and Communication Technologies, Electronics and Applied Mathematics 00004 at Universite catholique de Louvain, Belgium 00005 http://www.uclouvain.be/en-icteam.html 00006 Copyright (C) 2012 by Dominik Seifert 00007 Copyright (C) 2011 by Liu Lu 00008 00009 This library is free software; you can redistribute it and/or 00010 modify it under the terms of the GNU Library General Public 00011 License as published by the Free Software Foundation; either 00012 version 2 of the License, or (at your option) any later version. 00013 00014 This library is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 Library General Public License for more details. 00018 00019 You should have received a copy of the GNU Library General Public 00020 License along with this library; if not, write to the Free 00021 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00022 */ 00023 #ifndef __IVARIA_PHYSICS_H__ 00024 #define __IVARIA_PHYSICS_H__ 00025 00030 #include "csgeom/tri.h" 00031 #include "csutil/scf.h" 00032 #include "csutil/scf_interface.h" 00033 #include "iengine/mesh.h" 00034 #include "iengine/engine.h" 00035 #include "imesh/genmesh.h" 00036 #include "iutil/objreg.h" 00037 #include "ivaria/collisions.h" 00038 00039 namespace CS { 00040 namespace Physics { 00041 00042 struct iDynamicActor; 00043 struct iJoint; 00044 struct iKinematicCallback; 00045 struct iPhysicalSystem; 00046 struct iPhysicalSector; 00047 struct iRigidBody; 00048 struct iSoftBody; 00049 struct iVehicle; 00050 struct iVehicleFactory; 00051 struct iVehicleWheelFactory; 00052 00056 enum RigidBodyState 00057 { 00058 STATE_STATIC = 0, 00059 STATE_DYNAMIC, 00060 STATE_KINEMATIC 00061 }; 00062 00066 enum PhysicalObjectType 00067 { 00068 PHYSICAL_OBJECT_RIGIDBODY = 0, 00069 PHYSICAL_OBJECT_SOFTBODY, 00070 PHYSICAL_OBJECT_DYNAMICACTOR 00071 }; 00072 00076 enum DebugMode 00077 { 00078 DEBUG_NOTHING = 0, 00079 DEBUG_COLLIDERS = 1, 00080 DEBUG_AABB = 2, 00081 DEBUG_JOINTS = 4 00082 }; 00083 00089 enum MeshDuplicationMode 00090 { 00093 MESH_DUPLICATION_NONE = 0, 00096 MESH_DUPLICATION_INTERLEAVED, 00099 MESH_DUPLICATION_CONTIGUOUS 00100 }; 00101 00105 struct iPhysicalObjectFactory : public virtual CS::Collisions::iCollisionObjectFactory 00106 { 00107 SCF_INTERFACE (CS::Physics::iPhysicalObjectFactory, 1, 0, 0); 00108 00110 virtual CS::Physics::PhysicalObjectType GetPhysicalObjectType () const = 0; 00111 00113 virtual float GetDensity () const = 0; 00115 virtual void SetDensity (float value) = 0; 00116 00118 // TODO: explain difference density/mass 00119 virtual float GetMass () const = 0; 00121 virtual void SetMass (float value) = 0; 00122 00124 virtual void SetFriction (float value) = 0; 00126 virtual float GetFriction () const = 0; 00127 00129 virtual bool GetGravityEnabled () const = 0; 00131 virtual void SetGravityEnabled (bool enabled) = 0; 00132 }; 00133 00138 struct iPhysicalBody : public virtual CS::Collisions::iCollisionObject 00139 { 00140 SCF_INTERFACE (CS::Physics::iPhysicalBody, 1, 0, 1); 00141 00143 virtual PhysicalObjectType GetPhysicalObjectType () const = 0; 00144 00149 virtual iRigidBody* QueryRigidBody () = 0; 00150 00155 virtual iSoftBody* QuerySoftBody () = 0; 00156 00163 virtual bool IsDynamic () const = 0; 00164 00166 virtual void SetEnabled (bool enabled) = 0; 00167 00169 virtual bool GetEnabled () const = 0; 00170 00172 virtual void SetMass (float mass) = 0; 00173 00175 virtual float GetMass () const = 0; 00176 00178 virtual float GetDensity () const = 0; 00179 00189 virtual void SetDensity (float density) = 0; 00190 00192 virtual float GetVolume () const = 0; 00193 00195 virtual void AddForce (const csVector3& force) = 0; 00196 00198 virtual csVector3 GetLinearVelocity () const = 0; 00200 virtual void SetLinearVelocity (const csVector3& vel) = 0; 00201 00206 virtual void SetFriction (float friction) = 0; 00207 00209 virtual float GetFriction () const = 0; 00210 00212 virtual void SetGravityEnabled (bool enabled) = 0; 00214 virtual bool GetGravityEnabled () const = 0; 00215 }; 00216 00217 // TODO: There are a lot more configurable parameters - See btRigidBodyConstructionInfo: 00218 /* 00219 btVector3 m_localInertia; 00220 00222 btScalar m_restitution; 00223 00224 btScalar m_linearSleepingThreshold; 00225 btScalar m_angularSleepingThreshold; 00226 00227 //Additional damping can help avoiding lowpass jitter motion, help stability for ragdolls etc. 00228 //Such damping is undesirable, so once the overall simulation quality of the rigid body dynamics system has improved, this should become obsolete 00229 bool m_additionalDamping; 00230 btScalar m_additionalDampingFactor; 00231 btScalar m_additionalLinearDampingThresholdSqr; 00232 btScalar m_additionalAngularDampingThresholdSqr; 00233 btScalar m_additionalAngularDampingFactor; 00234 */ 00235 00239 struct iRigidBodyFactory : public virtual iPhysicalObjectFactory 00240 { 00241 SCF_INTERFACE (CS::Physics::iRigidBodyFactory, 1, 0, 0); 00242 00244 virtual csPtr<CS::Physics::iRigidBody> CreateRigidBody () = 0; 00245 00247 virtual void SetState (CS::Physics::RigidBodyState state) = 0; 00248 virtual CS::Physics::RigidBodyState GetState () const = 0; 00249 00251 virtual void SetElasticity (float value) = 0; 00252 00254 virtual float GetElasticity () const = 0; 00264 virtual void SetLinearDamping (float d) = 0; 00265 00267 virtual float GetLinearDamping () const = 0; 00268 00277 virtual void SetAngularDamping (float d) = 0; 00278 00280 virtual float GetAngularDamping () const = 0; 00281 }; 00282 00301 struct iRigidBody : public virtual iPhysicalBody 00302 { 00303 SCF_INTERFACE (CS::Physics::iRigidBody, 1, 0, 0); 00304 00306 virtual RigidBodyState GetState () const = 0; 00307 00309 virtual void SetState (RigidBodyState state) = 0; 00310 00312 virtual float GetElasticity () = 0; 00314 virtual void SetElasticity (float elasticity) = 0; 00315 00317 virtual csVector3 GetAngularVelocity () const = 0; 00319 virtual void SetAngularVelocity (const csVector3& vel) = 0; 00320 00322 virtual void AddTorque (const csVector3& torque) = 0; 00323 00325 virtual void AddRelForce (const csVector3& force) = 0; 00326 00328 virtual void AddRelTorque (const csVector3& torque) = 0; 00329 00334 virtual void AddForceAtPos (const csVector3& force, 00335 const csVector3& pos) = 0; 00336 00341 virtual void AddForceAtRelPos (const csVector3& force, 00342 const csVector3& pos) = 0; 00343 00348 virtual void AddRelForceAtPos (const csVector3& force, 00349 const csVector3& pos) = 0; 00350 00355 virtual void AddRelForceAtRelPos (const csVector3& force, 00356 const csVector3& pos) = 0; 00357 00359 virtual csVector3 GetTotalForce () const = 0; 00360 00362 virtual csVector3 GetTotalTorque () const = 0; 00363 00368 // TODO: rename in Listener 00369 virtual void SetKinematicCallback (iKinematicCallback* cb) = 0; 00370 00372 virtual iKinematicCallback* GetKinematicCallback () = 0; 00373 00383 virtual void SetLinearDamping (float d) = 0; 00384 00386 virtual float GetLinearDamping () = 0; 00387 00396 virtual void SetAngularDamping (float d) = 0; 00397 00399 virtual float GetAngularDamping () = 0; 00400 00402 virtual csVector3 GetAngularFactor () const = 0; 00407 virtual void SetAngularFactor (const csVector3& f) = 0; 00408 }; 00409 00419 struct iAnchorAnimationControl : public virtual iBase 00420 { 00421 SCF_INTERFACE (CS::Physics::iAnchorAnimationControl, 1, 0, 0); 00422 00426 virtual csVector3 GetAnchorPosition () const = 0; 00427 }; 00428 00432 struct iSoftBodyFactory : public virtual iPhysicalObjectFactory 00433 { 00434 SCF_INTERFACE (CS::Physics::iSoftBodyFactory, 1, 0, 0); 00435 00437 virtual csPtr<iSoftBody> CreateSoftBody () = 0; 00438 00440 virtual void SetLinearStiffness (float stiffness) = 0; 00441 00443 virtual void SetAngularStiffness (float stiffness) = 0; 00444 00446 virtual void SetVolumeStiffness (float stiffness) = 0; 00447 00449 virtual void SetSRHardness (float hardness) = 0; 00450 00452 virtual void SetSKHardness (float hardness) = 0; 00453 00455 virtual void SetSSHardness (float hardness) = 0; 00456 00458 virtual void SetSRImpulse (float impulse) = 0; 00459 00461 virtual void SetSKImpulse (float impulse) = 0; 00462 00464 virtual void SetSSImpulse (float impulse) = 0; 00465 00467 virtual void SetDamping (float damping) = 0; 00468 00470 virtual void SetDrag (float drag) = 0; 00471 00473 virtual void SetLift (float lift) = 0; 00474 00476 virtual void SetPressure (float pressure) = 0; 00477 00479 virtual void SetVolumeConversationCoefficient (float conversation) = 0; 00480 00482 virtual void SetShapeMatchThreshold (float matching) = 0; 00483 00485 virtual void SetRContactsHardness (float hardness) = 0; 00486 00488 virtual void SetKContactsHardness (float hardness) = 0; 00489 00491 virtual void SetSContactsHardness (float hardness) = 0; 00492 00494 virtual void SetAnchorsHardness (float hardness) = 0; 00495 00497 virtual void SetShapeMatching (bool match) = 0; 00498 00506 virtual void GenerateBendingConstraints (size_t distance) = 0; 00507 }; 00508 00512 struct iSoftRopeFactory : public virtual iSoftBodyFactory 00513 { 00514 SCF_INTERFACE (CS::Physics::iSoftRopeFactory, 1, 0, 0); 00515 00517 virtual const csVector3& GetStart () const = 0; 00519 virtual void SetStart (const csVector3& v) = 0; 00520 00522 virtual const csVector3& GetEnd () const = 0; 00524 virtual void SetEnd (const csVector3& v) = 0; 00525 00527 virtual size_t GetNodeCount () const = 0; 00529 virtual void SetNodeCount (size_t c) = 0; 00530 }; 00531 00536 struct iSoftClothFactory : public virtual iSoftBodyFactory 00537 { 00538 SCF_INTERFACE (CS::Physics::iSoftClothFactory, 1, 0, 0); 00539 00541 virtual const csVector3* GetCorners () const = 0; 00542 00553 virtual void SetCorners (csVector3 topLeft, csVector3 topRight, 00554 csVector3 bottomLeft, csVector3 bottomRight) = 0; 00555 00561 virtual void GetSegmentCounts (size_t& countH, size_t& countV) const = 0; 00562 00568 virtual void SetSegmentCounts (size_t countH, size_t countV) = 0; 00569 00574 virtual bool GetDiagonals () const = 0; 00575 00580 virtual void SetDiagonals (bool d) = 0; 00581 }; 00582 00586 struct iSoftMeshFactory : public virtual iSoftBodyFactory 00587 { 00588 SCF_INTERFACE (CS::Physics::iSoftMeshFactory, 1, 0, 0); 00589 00591 virtual iTriangleMesh* GetMesh () const = 0; 00593 virtual void SetMesh (iTriangleMesh* mesh) = 0; 00594 00596 virtual MeshDuplicationMode GetDuplicationMode () const = 0; 00598 virtual void SetDuplicationMode (MeshDuplicationMode mode) = 0; 00599 }; 00600 00618 struct iSoftBody : public virtual iPhysicalBody 00619 { 00620 SCF_INTERFACE (CS::Physics::iSoftBody, 1, 0, 0); 00621 00623 virtual void SetVertexMass (float mass, size_t index) = 0; 00624 00626 virtual float GetVertexMass (size_t index) = 0; 00627 00629 virtual size_t GetVertexCount () = 0; 00630 00632 virtual csVector3 GetVertexPosition (size_t index) const = 0; 00633 00635 virtual size_t GetTriangleCount () = 0; 00636 00638 virtual csTriangle GetTriangle (size_t index) const = 0; 00639 00641 virtual csVector3 GetVertexNormal (size_t index) const = 0; 00642 00644 virtual void AnchorVertex (size_t vertexIndex) = 0; 00645 00650 virtual void AnchorVertex (size_t vertexIndex, 00651 iRigidBody* body) = 0; 00652 00657 virtual void AnchorVertex (size_t vertexIndex, 00658 iAnchorAnimationControl* controller) = 0; 00659 00672 virtual void UpdateAnchor (size_t vertexIndex, 00673 csVector3& position) = 0; 00674 00679 virtual void RemoveAnchor (size_t vertexIndex) = 0; 00680 00682 virtual void SetLinearStiffness (float stiffness) = 0; 00683 00685 virtual void SetAngularStiffness (float stiffness) = 0; 00686 00688 virtual void SetVolumeStiffness (float stiffness) = 0; 00689 00691 //virtual void ResetCollisionFlag () = 0; 00692 00694 //virtual void SetClusterCollisionRS (bool cluster) = 0; 00695 00697 //virtual bool GetClusterCollisionRS () = 0; 00698 00700 //virtual void SetClusterCollisionSS (bool cluster) = 0; 00701 00703 //virtual bool GetClusterCollisionSS () = 0; 00704 00706 virtual void SetSRHardness (float hardness) = 0; 00707 00709 virtual void SetSKHardness (float hardness) = 0; 00710 00712 virtual void SetSSHardness (float hardness) = 0; 00713 00715 virtual void SetSRImpulse (float impulse) = 0; 00716 00718 virtual void SetSKImpulse (float impulse) = 0; 00719 00721 virtual void SetSSImpulse (float impulse) = 0; 00722 00724 //virtual void SetVeloCorrectionFactor (float factor) = 0; 00725 00727 virtual void SetDamping (float damping) = 0; 00728 00730 virtual void SetDrag (float drag) = 0; 00731 00733 virtual void SetLift (float lift) = 0; 00734 00736 virtual void SetPressure (float pressure) = 0; 00737 00739 virtual void SetVolumeConversationCoefficient (float conversation) = 0; 00740 00742 virtual void SetShapeMatchThreshold (float matching) = 0; 00743 00745 virtual void SetRContactsHardness (float hardness) = 0; 00746 00748 virtual void SetKContactsHardness (float hardness) = 0; 00749 00751 virtual void SetSContactsHardness (float hardness) = 0; 00752 00754 virtual void SetAnchorsHardness (float hardness) = 0; 00755 00757 //virtual void SetVeloSolverIterations (int iter) = 0; 00758 00760 //virtual void SetPositionIterations (int iter) = 0; 00761 00763 //virtual void SetDriftIterations (int iter) = 0; 00764 00766 //virtual void SetClusterIterations (int iter) = 0; 00767 00769 virtual void SetShapeMatching (bool match) = 0; 00770 00778 // TODO: remove? 00779 virtual void GenerateBendingConstraints (size_t distance) = 0; 00780 00782 //virtual void GenerateCluster (int iter) = 0; 00783 00785 //virtual size_t GetNodeCount () const = 0; 00786 00788 virtual csVector3 GetLinearVelocity (size_t nodeIndex) const = 0; 00790 virtual void SetLinearVelocity (size_t nodeIndex, const csVector3& vel) = 0; 00791 00795 virtual void SetWindVelocity (const csVector3& velocity) = 0; 00796 00798 virtual const csVector3 GetWindVelocity () const = 0; 00799 00801 virtual void AddForce (const csVector3& force, size_t vertexIndex) = 0; 00802 00807 virtual void DebugDraw (iView* rView) = 0; 00808 }; 00809 00813 // TODO: move in a lib tool class 00814 struct SoftBodyHelper 00815 { 00828 static csPtr<iMeshFactoryWrapper> CreateClothGenMeshFactory 00829 (iObjectRegistry* object_reg, const char* factoryName, iSoftBody* cloth, 00830 csVector2 scale = csVector2 (1.0f)) 00831 { 00832 csRef<iEngine> engine = csQueryRegistry<iEngine> (object_reg); 00833 00834 // Create the cloth mesh factory. 00835 csRef<iMeshFactoryWrapper> clothFact = engine->CreateMeshFactory 00836 ("crystalspace.mesh.object.genmesh", factoryName); 00837 if (!clothFact) 00838 return 0; 00839 00840 csRef<iGeneralFactoryState> gmstate = scfQueryInterface<iGeneralFactoryState> 00841 (clothFact->GetMeshObjectFactory ()); 00842 00843 // Create the vertices and normals of the genmesh 00844 size_t vertexCount = cloth->GetVertexCount (); 00845 gmstate->SetVertexCount (int (vertexCount * 2)); 00846 csVector3* vertices = gmstate->GetVertices (); 00847 csVector3* normals = gmstate->GetNormals (); 00848 00849 for (size_t i = 0; i < vertexCount; i++) 00850 { 00851 vertices[i] = cloth->GetVertexPosition (i); 00852 vertices[i + vertexCount] = cloth->GetVertexPosition (i); 00853 00854 normals[i] = cloth->GetVertexNormal (i); 00855 normals[i + vertexCount] = cloth->GetVertexNormal (i); 00856 normals[i] = csVector3 (0.f, 0.f, 1.f); 00857 normals[i + vertexCount] = csVector3 (0.f, 0.f, 1.f); 00858 } 00859 00860 // Create the triangles of the genmesh 00861 gmstate->SetTriangleCount (int (cloth->GetTriangleCount ()) * 2); 00862 csTriangle* triangles = gmstate->GetTriangles (); 00863 for (size_t i = 0; i < cloth->GetTriangleCount (); i++) 00864 { 00865 csTriangle triangle = cloth->GetTriangle (i); 00866 triangles[i * 2] = triangle; 00867 triangles[i * 2 + 1] = csTriangle (int (triangle[2] + vertexCount), 00868 int (triangle[1] + vertexCount), 00869 int (triangle[0] + vertexCount)); 00870 } 00871 00872 // Set up the texels of the genmesh 00873 csVector2* texels = gmstate->GetTexels (); 00874 for (size_t i = 0; i < vertexCount * 2; i++) 00875 { 00876 csVector3 p = vertices[i]; 00877 csVector3 n = normals[i]; 00878 csVector3 a1, a2; 00879 csPlane3::FindOrthogonalPoints (n, a1, a2); 00880 00881 // Calculate the closest point from point 'p' on the plane given 00882 // by 'n' and the origin. 00883 csVector3 closest = p - n * (n * p); 00884 00885 csVector2 uv; 00886 uv.x = a1 * closest * scale.x; 00887 uv.y = a2 * closest * scale.y; 00888 texels[i] = uv; 00889 } 00890 00891 gmstate->Invalidate (); 00892 00893 return csPtr<iMeshFactoryWrapper> (clothFact); 00894 } 00895 }; 00896 00900 struct iDynamicActorFactory : public virtual iRigidBodyFactory, 00901 public virtual CS::Collisions::iActorFactory 00902 { 00903 SCF_INTERFACE (CS::Physics::iDynamicActorFactory, 1, 0, 0); 00904 00906 virtual csPtr<iDynamicActor> CreateDynamicActor () = 0; 00907 00909 virtual bool GetKinematicStepsEnabled () const = 0; 00911 virtual void SetKinematicStepsEnabled (bool u) = 0; 00912 }; 00913 00932 struct iDynamicActor : public virtual iRigidBody, public virtual CS::Collisions::iActor 00933 { 00934 SCF_INTERFACE (CS::Physics::iDynamicActor, 1, 0, 0); 00935 00937 virtual bool GetKinematicStepsEnabled () const = 0; 00939 virtual void SetKinematicStepsEnabled (bool u) = 0; 00940 }; 00941 00954 struct iJointFactory : public virtual iBase 00955 { 00956 SCF_INTERFACE (CS::Physics::iJointFactory, 1, 0, 0); 00957 00959 virtual csPtr<CS::Physics::iJoint> CreateJoint () = 0; 00960 00969 virtual void SetTransConstraints (bool X, bool Y, bool Z) = 0; 00970 00972 virtual bool IsXTransConstrained () const = 0; 00973 00975 virtual bool IsYTransConstrained () const = 0; 00976 00978 virtual bool IsZTransConstrained () const = 0; 00979 00984 virtual void SetMinimumDistance (const csVector3& dist) = 0; 00985 00987 virtual const csVector3& GetMinimumDistance () const = 0; 00988 00993 virtual void SetMaximumDistance (const csVector3& dist) = 0; 00994 00996 virtual const csVector3& GetMaximumDistance () const = 0; 00997 01006 virtual void SetRotConstraints (bool X, bool Y, bool Z) = 0; 01007 01009 virtual bool IsXRotConstrained () const = 0; 01010 01012 virtual bool IsYRotConstrained () const = 0; 01013 01015 virtual bool IsZRotConstrained () const = 0; 01016 01021 virtual void SetMinimumAngle (const csVector3& angle) = 0; 01022 01024 virtual const csVector3& GetMinimumAngle () const = 0; 01025 01030 virtual void SetMaximumAngle (const csVector3& angle) = 0; 01031 01033 virtual const csVector3& GetMaximumAngle () const = 0; 01034 01040 virtual void SetBounce (const csVector3& bounce) = 0; 01041 01043 virtual const csVector3& GetBounce () const = 0; 01044 01049 virtual void SetDesiredVelocity (const csVector3& velo) = 0; 01050 01052 virtual const csVector3& GetDesiredVelocity () const = 0; 01053 01058 virtual void SetMaxForce (const csVector3& force) = 0; 01059 01061 virtual const csVector3& GetMaxForce () const = 0; 01062 01064 virtual void SetSpring (bool isSpring) = 0; 01065 01067 virtual void SetLinearStiffness (const csVector3& stiffness) = 0; 01068 01070 virtual const csVector3& GetLinearStiffness () const = 0; 01071 01073 virtual void SetAngularStiffness (const csVector3& stiffness) = 0; 01074 01076 virtual const csVector3& GetAngularStiffness () const = 0; 01077 01079 virtual void SetLinearDamping (const csVector3& damp) = 0; 01080 01082 virtual const csVector3& GetLinearDamping () const = 0; 01083 01085 virtual void SetAngularDamping (const csVector3& damp) = 0; 01086 01088 virtual const csVector3& GetAngularDamping () const = 0; 01089 01091 virtual void SetLinearEquilibriumPoint (const csVector3& point) = 0; 01092 01094 virtual void SetAngularEquilibriumPoint (const csVector3& point) = 0; 01095 01097 virtual void SetBreakingImpulseThreshold (float threshold) = 0; 01098 01100 virtual float GetBreakingImpulseThreshold () const = 0; 01101 }; 01102 01115 struct iJoint : public virtual iBase 01116 { 01117 SCF_INTERFACE (CS::Physics::iJoint, 1, 0, 0); 01118 01119 // TODO: remove forceUpdate 01120 // TODO: Set/GetSector 01121 01126 virtual void Attach (iPhysicalBody* body1, iPhysicalBody* body2, 01127 bool forceUpdate = true) = 0; 01128 01130 virtual iPhysicalBody* GetAttachedBody (int index) = 0; 01131 01136 virtual void SetTransform (const csOrthoTransform& trans, 01137 bool forceUpdate = false) = 0; 01138 01140 virtual csOrthoTransform GetTransform () const = 0; 01141 01143 virtual void SetPosition (const csVector3& position, 01144 bool forceUpdate = false) = 0; 01145 01147 virtual const csVector3& GetPosition () const = 0; 01148 01157 virtual void SetTransConstraints (bool X, 01158 bool Y, bool Z, 01159 bool forceUpdate = false) = 0; 01160 01162 virtual bool IsXTransConstrained () const = 0; 01163 01165 virtual bool IsYTransConstrained () const = 0; 01166 01168 virtual bool IsZTransConstrained () const = 0; 01169 01178 virtual void SetRotConstraints (bool X, 01179 bool Y, bool Z, 01180 bool forceUpdate = false) = 0; 01181 01183 virtual bool IsXRotConstrained () const = 0; 01184 01186 virtual bool IsYRotConstrained () const = 0; 01187 01189 virtual bool IsZRotConstrained () const = 0; 01190 01195 virtual void SetMinimumDistance (const csVector3& dist, 01196 bool forceUpdate = false) = 0; 01197 01199 virtual csVector3 GetMinimumDistance () const = 0; 01200 01205 virtual void SetMaximumDistance (const csVector3& dist, 01206 bool forceUpdate = false) = 0; 01207 01209 virtual csVector3 GetMaximumDistance () const = 0; 01210 01215 virtual void SetMinimumAngle (const csVector3& angle, 01216 bool forceUpdate = false) = 0; 01217 01219 virtual const csVector3& GetMinimumAngle () const = 0; 01220 01225 virtual void SetMaximumAngle (const csVector3& angle, 01226 bool forceUpdate = false) = 0; 01227 01229 virtual const csVector3& GetMaximumAngle () const = 0; 01230 01236 virtual void SetBounce (const csVector3& bounce, 01237 bool forceUpdate = false) = 0; 01238 01240 virtual const csVector3& GetBounce () const = 0; 01241 01246 virtual void SetDesiredVelocity (const csVector3& velo, 01247 bool forceUpdate = false) = 0; 01248 01250 virtual const csVector3& GetDesiredVelocity () const = 0; 01251 01256 virtual void SetMaxForce (const csVector3& force, 01257 bool forceUpdate = false) = 0; 01258 01260 virtual csVector3 GetMaxForce () const = 0; 01261 01266 virtual bool RebuildJoint () = 0; 01267 01269 virtual void SetSpring (bool isSpring, bool forceUpdate = false) = 0; 01270 01272 virtual void SetLinearStiffness (const csVector3& stiffness, bool forceUpdate = false) = 0; 01273 01275 virtual const csVector3& GetLinearStiffness () const = 0; 01276 01278 virtual void SetAngularStiffness (const csVector3& stiffness, bool forceUpdate = false) = 0; 01279 01281 virtual const csVector3& GetAngularStiffness () const = 0; 01282 01284 virtual void SetLinearDamping (const csVector3& damp, bool forceUpdate = false) = 0; 01285 01287 virtual const csVector3& GetLinearDamping () const = 0; 01288 01290 virtual void SetAngularDamping (const csVector3& damp, bool forceUpdate = false) = 0; 01291 01293 virtual const csVector3& GetAngularDamping () const = 0; 01294 01296 virtual void SetLinearEquilibriumPoint (const csVector3& point, bool forceUpdate = false) = 0; 01297 01299 virtual void SetAngularEquilibriumPoint (const csVector3& point, bool forceUpdate = false) = 0; 01300 01302 virtual void SetBreakingImpulseThreshold (float threshold, bool forceUpdate = false) = 0; 01303 01305 virtual float GetBreakingImpulseThreshold () const = 0; 01306 }; 01307 01315 // TODO: iKinematicListener 01316 struct iKinematicCallback : public virtual iBase 01317 { 01318 SCF_INTERFACE (CS::Physics::iKinematicCallback, 1, 0, 0); 01319 01323 virtual void GetBodyTransform (iRigidBody* body, 01324 csOrthoTransform& transform) const = 0; 01325 }; 01326 01333 struct iPhysicalSector : public virtual CS::Collisions::iCollisionSector 01334 { 01335 SCF_INTERFACE (CS::Physics::iPhysicalSector, 1, 0, 0); 01336 01350 virtual void SetAutoDisableParams (float linear, float angular, float time) = 0; 01351 01361 virtual void SetLinearDamping (float damping) = 0; 01362 01366 virtual float GetLinearDamping () const = 0; 01367 01377 virtual void SetAngularDamping (float damping) = 0; 01378 01380 virtual float GetAngularDamping () const = 0; 01381 01383 virtual size_t GetRigidBodyCount () = 0; 01384 01386 virtual iRigidBody* GetRigidBody (size_t index) = 0; 01387 01389 virtual size_t GetSoftBodyCount () = 0; 01390 01392 virtual iSoftBody* GetSoftBody (size_t index) = 0; 01393 01395 virtual void AddJoint (iJoint* joint) = 0; 01396 01398 virtual void RemoveJoint (iJoint* joint) = 0; 01399 01401 virtual void AddVehicle (iVehicle* vehicle) = 0; 01402 01404 virtual void RemoveVehicle (iVehicle* vehicle) = 0; 01405 01411 virtual bool Save (const char* filename) = 0; 01412 }; 01413 01429 // TODO: step callback 01430 struct iPhysicalSystem : public virtual CS::Collisions::iCollisionSystem 01431 { 01432 SCF_INTERFACE (CS::Physics::iPhysicalSystem, 1, 0, 0); 01433 01449 virtual void SetStepParameters (float timeStep, size_t maxSteps, 01450 size_t iterations) = 0; 01451 01453 // TODO: auto-step 01454 virtual void Step (csTicks duration) = 0; 01455 01461 virtual void SetSoftBodyEnabled (bool enabled) = 0; 01462 01466 virtual bool GetSoftBodyEnabled () const = 0; 01467 01480 virtual void SetInternalScale (float scale) = 0; 01481 01485 virtual float GetInternalScale () const = 0; 01486 01499 virtual void SetAutoDisableParams (float linear, float angular, float time) = 0; 01500 01512 virtual void SetLinearDamping (float damping) = 0; 01513 01517 virtual float GetLinearDamping () const = 0; 01518 01530 virtual void SetAngularDamping (float damping) = 0; 01531 01533 virtual float GetAngularDamping () const = 0; 01534 01536 virtual csPtr<iJointFactory> CreateJointFactory () = 0; 01537 01542 virtual csPtr<iJointFactory> CreateP2PJointFactory () = 0; 01543 01553 virtual csPtr<iJointFactory> CreateSlideJointFactory 01554 (float minDist, float maxDist, float minAngle, float maxAngle, int axis) = 0; 01555 01563 virtual csPtr<iJointFactory> CreateHingeJointFactory 01564 (float minAngle, float maxAngle, int axis) = 0; 01565 01573 virtual csPtr<iJointFactory> CreateConeTwistJointFactory 01574 (float swingSpan1,float swingSpan2,float twistSpan) = 0; 01575 01580 virtual csPtr<iJointFactory> CreateSoftLinearJointFactory () = 0; 01581 01586 virtual csPtr<iJointFactory> CreateSoftAngularJointFactory (int axis) = 0; 01587 01592 virtual csPtr<iJointFactory> CreatePivotJointFactory () = 0; 01593 01594 // Factories 01595 01597 virtual csPtr<iRigidBodyFactory> CreateRigidBodyFactory 01598 (CS::Collisions::iCollider* collider = nullptr) = 0; 01599 01601 virtual csPtr<iDynamicActorFactory> CreateDynamicActorFactory 01602 (CS::Collisions::iCollider* collider = nullptr) = 0; 01603 01605 virtual csPtr<iSoftRopeFactory> CreateSoftRopeFactory () = 0; 01606 01608 virtual csPtr<iSoftClothFactory> CreateSoftClothFactory () = 0; 01609 01611 virtual csPtr<iSoftMeshFactory> CreateSoftMeshFactory () = 0; 01612 01613 // Vehicles 01614 01616 virtual csPtr<iVehicleFactory> CreateVehicleFactory 01617 (CS::Collisions::iCollider* collider = nullptr) = 0; 01618 01620 virtual csPtr<iVehicleWheelFactory> CreateVehicleWheelFactory () = 0; 01621 01627 virtual void DebugDraw (iView* rview) = 0; 01628 01636 virtual void DebugDraw (iGraphics3D* g3d, iCamera* camera) = 0; 01637 01644 virtual void SetDebugMode (DebugMode mode) = 0; 01645 01647 virtual DebugMode GetDebugMode () = 0; 01648 01654 virtual void StartProfile () = 0; 01655 01659 virtual void StopProfile () = 0; 01660 01667 virtual void DumpProfile (bool resetProfile = true) = 0; 01668 }; 01669 01670 } 01671 } 01672 01673 #endif
Generated for Crystal Space 2.1 by doxygen 1.6.1
