ivaria/bullet.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2007 by Jorrit Tyberghein 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 #ifndef __CS_IVARIA_BULLET_H__ 00020 #define __CS_IVARIA_BULLET_H__ 00021 00026 #include "csutil/scf_interface.h" 00027 #include "iutil/objreg.h" 00028 #include "iengine/mesh.h" 00029 #include "iengine/engine.h" 00030 #include "imesh/genmesh.h" 00031 #include "csgeom/tri.h" 00032 #include "cstool/primitives.h" 00033 00034 struct iView; 00035 struct iRigidBody; 00036 struct csLockedHeightData; 00037 struct iTerrainCell; 00038 struct iTerrainSystem; 00039 00040 namespace CS 00041 { 00042 namespace Physics 00043 { 00044 namespace Bullet 00045 { 00046 00047 struct iKinematicCallback; 00048 struct iSoftBody; 00049 struct iPivotJoint; 00050 struct iTerrainCollider; 00051 00055 enum BodyType 00056 { 00057 UNDEFINED_BODY = 0, 00058 RIGID_BODY, 00059 SOFT_BODY, 00060 TERRAIN 00061 }; 00062 00066 struct iBody : public virtual iBase 00067 { 00068 SCF_INTERFACE(CS::Physics::Bullet::iBody, 1, 0, 0); 00069 00071 virtual BodyType GetType () const = 0; 00072 00077 virtual ::iRigidBody* QueryRigidBody () = 0; 00078 00083 virtual iSoftBody* QuerySoftBody () = 0; 00084 00089 virtual iTerrainCollider* QueryTerrainCollider () = 0; 00090 }; 00091 00097 struct HitBeamResult 00098 { 00099 HitBeamResult () 00100 : hasHit (false), body (0), isect (0.0f), normal (0.0f), vertexIndex (0) 00101 {} 00102 00106 bool hasHit; 00107 00111 iBody* body; 00112 00116 csVector3 isect; 00117 00121 csVector3 normal; 00122 00127 size_t vertexIndex; 00128 }; 00129 00133 enum DebugMode 00134 { 00135 DEBUG_NOTHING = 0, 00136 DEBUG_COLLIDERS = 1, 00137 DEBUG_AABB = 2, 00138 DEBUG_JOINTS = 4 00139 }; 00140 00145 enum MeshDuplicationMode 00146 { 00147 MESH_DUPLICATION_NONE = 0, 00149 MESH_DUPLICATION_INTERLEAVED, 00151 MESH_DUPLICATION_CONTIGUOUS 00153 }; 00154 00160 struct iDynamicSystem : public virtual iBase 00161 { 00162 SCF_INTERFACE(CS::Physics::Bullet::iDynamicSystem, 4, 0, 0); 00163 00169 virtual void DebugDraw (iView* rview) = 0; 00170 00177 virtual HitBeamResult HitBeam (const csVector3 &start, 00178 const csVector3 &end) = 0; 00179 00192 virtual void SetInternalScale (float scale) = 0; 00193 00209 virtual void SetStepParameters (float timeStep, size_t maxSteps, 00210 size_t iterations) = 0; 00211 00218 virtual void SetDebugMode (DebugMode mode) = 0; 00219 00223 virtual DebugMode GetDebugMode () = 0; 00224 00230 virtual void SetSoftBodyWorld (bool isSoftBodyWorld) = 0; 00231 00235 virtual bool GetSoftBodyWorld () = 0; 00236 00240 virtual size_t GetSoftBodyCount () = 0; 00241 00245 virtual iSoftBody* GetSoftBody (size_t index) = 0; 00246 00254 virtual iSoftBody* CreateRope (csVector3 start, csVector3 end, 00255 uint segmentCount) = 0; 00256 00263 virtual iSoftBody* CreateRope (csVector3* vertices, size_t vertexCount) = 0; 00264 00277 virtual iSoftBody* CreateCloth (csVector3 corner1, csVector3 corner2, 00278 csVector3 corner3, csVector3 corner4, 00279 uint segmentCount1, uint segmentCount2, 00280 bool withDiagonals = false) = 0; 00281 00290 virtual iSoftBody* CreateSoftBody (iGeneralFactoryState* genmeshFactory, 00291 const csOrthoTransform& bodyTransform, 00292 MeshDuplicationMode duplicationMode = MESH_DUPLICATION_NONE) = 0; 00293 00302 virtual iSoftBody* CreateSoftBody (csVector3* vertices, size_t vertexCount, 00303 csTriangle* triangles, size_t triangleCount) = 0; 00304 00308 virtual void RemoveSoftBody (iSoftBody* body) = 0; 00309 00313 virtual csPtr<iPivotJoint> CreatePivotJoint () = 0; 00314 00318 virtual void RemovePivotJoint (iPivotJoint* joint) = 0; 00319 00324 virtual bool SaveBulletWorld (const char* filename) = 0; 00325 00339 virtual iTerrainCollider* AttachColliderTerrain (csLockedHeightData& heightData, 00340 int gridWidth, int gridHeight, 00341 csVector3 gridSize, 00342 csOrthoTransform& transform, 00343 float minimumHeight = 0, 00344 float maximumHeight = 0) = 0; 00345 00355 virtual iTerrainCollider* AttachColliderTerrain (iTerrainCell* cell, 00356 float minimumHeight = 0, 00357 float maximumHeight = 0) = 0; 00358 00371 virtual iTerrainCollider* AttachColliderTerrain (iTerrainSystem* terrain, 00372 float minimumHeight = 0, 00373 float maximumHeight = 0) = 0; 00377 virtual void DestroyCollider (iTerrainCollider* collider) = 0; 00378 00384 virtual void StartProfile () = 0; 00385 00389 virtual void StopProfile () = 0; 00390 00397 virtual void DumpProfile (bool resetProfile = true) = 0; 00398 }; 00399 00409 struct iAnchorAnimationControl : public virtual iBase 00410 { 00411 SCF_INTERFACE(CS::Physics::Bullet::iAnchorAnimationControl, 1, 0, 0); 00412 00416 virtual csVector3 GetAnchorPosition () const = 0; 00417 }; 00418 00431 struct iSoftBody : public iBody 00432 { 00433 SCF_INTERFACE(CS::Physics::Bullet::iSoftBody, 2, 0, 2); 00434 00439 virtual void DebugDraw (iView* rview) = 0; 00440 00444 virtual void SetMass (float mass) = 0; 00445 00449 virtual float GetMass () const = 0; 00450 00454 virtual size_t GetVertexCount () const = 0; 00455 00459 virtual csVector3 GetVertexPosition (size_t index) const = 0; 00460 00464 virtual void AnchorVertex (size_t vertexIndex) = 0; 00465 00470 virtual void AnchorVertex (size_t vertexIndex, iRigidBody* body) = 0; 00471 00476 virtual void AnchorVertex (size_t vertexIndex, iAnchorAnimationControl* controller) = 0; 00477 00490 virtual void UpdateAnchor (size_t vertexIndex, csVector3& position) = 0; 00491 00496 virtual void RemoveAnchor (size_t vertexIndex) = 0; 00497 00502 virtual void SetRigidity (float rigidity) = 0; 00503 00507 virtual float GetRigidity () const = 0; 00508 00512 virtual void SetLinearVelocity (csVector3 velocity) = 0; 00513 00517 virtual void SetLinearVelocity (csVector3 velocity, size_t vertexIndex) = 0; 00518 00522 virtual csVector3 GetLinearVelocity (size_t vertexIndex) const = 0; 00523 00527 virtual void AddForce (csVector3 force) = 0; 00528 00532 virtual void AddForce (csVector3 force, size_t vertexIndex) = 0; 00533 00537 virtual size_t GetTriangleCount () const = 0; 00538 00542 virtual csTriangle GetTriangle (size_t index) const = 0; 00543 00547 virtual csVector3 GetVertexNormal (size_t index) const = 0; 00548 00556 virtual void GenerateBendingConstraints (size_t distance) = 0; 00557 }; 00558 00562 struct SoftBodyHelper 00563 { 00572 static csPtr<iMeshFactoryWrapper> CreateClothGenMeshFactory 00573 (iObjectRegistry* object_reg, const char* factoryName, iSoftBody* cloth) 00574 { 00575 csRef<iEngine> engine = csQueryRegistry<iEngine> (object_reg); 00576 00577 // Create the cloth mesh factory. 00578 csRef<iMeshFactoryWrapper> clothFact = engine->CreateMeshFactory 00579 ("crystalspace.mesh.object.genmesh", factoryName); 00580 if (!clothFact) 00581 return 0; 00582 00583 csRef<iGeneralFactoryState> gmstate = scfQueryInterface<iGeneralFactoryState> 00584 (clothFact->GetMeshObjectFactory ()); 00585 00586 // Create the vertices of the genmesh 00587 size_t vertexCount = cloth->GetVertexCount (); 00588 gmstate->SetVertexCount (vertexCount * 2); 00589 csVector3* vertices = gmstate->GetVertices (); 00590 for (size_t i = 0; i < vertexCount; i++) 00591 { 00592 vertices[i] = cloth->GetVertexPosition (i); 00593 vertices[i + vertexCount] = cloth->GetVertexPosition (i); 00594 } 00595 00596 // Create the triangles of the genmesh 00597 gmstate->SetTriangleCount (cloth->GetTriangleCount () * 2); 00598 csTriangle* triangles = gmstate->GetTriangles (); 00599 for (size_t i = 0; i < cloth->GetTriangleCount (); i++) 00600 { 00601 csTriangle triangle = cloth->GetTriangle (i); 00602 triangles[i * 2] = triangle; 00603 triangles[i * 2 + 1] = csTriangle (triangle[2] + vertexCount, 00604 triangle[1] + vertexCount, 00605 triangle[0] + vertexCount); 00606 } 00607 00608 gmstate->CalculateNormals (); 00609 00610 // Set up the texels of the genmesh 00611 csVector2* texels = gmstate->GetTexels (); 00612 csVector3* normals = gmstate->GetNormals (); 00613 CS::Geometry::TextureMapper* mapper = new CS::Geometry::DensityTextureMapper (1.0f); 00614 for (size_t i = 0; i < vertexCount * 2; i++) 00615 texels[i] = mapper->Map (vertices[i], normals[i], i); 00616 00617 gmstate->Invalidate (); 00618 00619 return csPtr<iMeshFactoryWrapper> (clothFact); 00620 } 00621 }; 00622 00626 enum BodyState 00627 { 00628 STATE_STATIC = 0, 00630 STATE_DYNAMIC, 00632 STATE_KINEMATIC 00635 }; 00636 00642 struct iRigidBody : public iBody 00643 { 00644 SCF_INTERFACE(CS::Physics::Bullet::iRigidBody, 1, 0, 1); 00645 00654 virtual void MakeKinematic () = 0; 00655 00659 virtual BodyState GetDynamicState () const = 0; 00660 00665 virtual void SetDynamicState (BodyState state) = 0; 00666 00671 virtual void SetKinematicCallback (iKinematicCallback* callback) = 0; 00672 00676 virtual iKinematicCallback* GetKinematicCallback () = 0; 00677 00687 virtual void SetLinearDampener (float d) = 0; 00688 00692 virtual float GetLinearDampener () const = 0; 00693 00703 virtual void SetRollingDampener (float d) = 0; 00704 00708 virtual float GetRollingDampener () const = 0; 00709 }; 00710 00719 struct iKinematicCallback : public virtual iBase 00720 { 00721 SCF_INTERFACE (CS::Physics::Bullet::iKinematicCallback, 1, 0, 0); 00722 00726 virtual void GetBodyTransform (::iRigidBody* body, 00727 csOrthoTransform& transform) const = 0; 00728 }; 00729 00735 struct iPivotJoint : public virtual iBase 00736 { 00737 SCF_INTERFACE (CS::Physics::Bullet::iPivotJoint, 1, 0, 0); 00738 00744 virtual void Attach (::iRigidBody* body, const csVector3& position) = 0; 00745 00749 virtual iRigidBody* GetAttachedBody () const = 0; 00750 00754 virtual void SetPosition (const csVector3& position) = 0; 00755 00759 virtual csVector3 GetPosition () const = 0; 00760 }; 00761 00765 struct iTerrainCollider : public iBody 00766 { 00767 SCF_INTERFACE (CS::Physics::Bullet::iTerrainCollider, 1, 0, 0); 00768 00769 }; 00770 00771 } //namespace Bullet 00772 } //namespace Physics 00773 } //namespace CS 00774 00775 CS_DEPRECATED_METHOD_MSG("Use CS::Physics::Bullet::iDynamicSystem instead") 00776 typedef CS::Physics::Bullet::iDynamicSystem iBulletDynamicSystem; 00777 00778 #endif // __CS_IVARIA_BULLET_H__ 00779
Generated for Crystal Space 2.0 by doxygen 1.6.1