Bullet Collision Detection & Physics Library
btSoftBodySolver_DX11.h
Go to the documentation of this file.
1 /*
2 Bullet Continuous Collision Detection and Physics Library
3 Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
4 
5 This software is provided 'as-is', without any express or implied warranty.
6 In no event will the authors be held liable for any damages arising from the use of this software.
7 Permission is granted to anyone to use this software for any purpose,
8 including commercial applications, and to alter it and redistribute it freely,
9 subject to the following restrictions:
10 
11 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
12 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
13 3. This notice may not be removed or altered from any source distribution.
14 */
15 
16 #ifndef BT_ACCELERATED_SOFT_BODY_DX11_SOLVER_H
17 #define BT_ACCELERATED_SOFT_BODY_DX11_SOLVER_H
18 
19 
20 #include "vectormath/vmInclude.h"
26 
27 
28 
30 {
31 public:
32 
33  typedef HRESULT (WINAPI * CompileFromMemoryFunc)(LPCSTR,SIZE_T,LPCSTR,const D3D10_SHADER_MACRO*,LPD3D10INCLUDE,LPCSTR,LPCSTR,UINT,UINT,ID3DX11ThreadPump*,ID3D10Blob**,ID3D10Blob**,HRESULT*);
34 
35  ID3D11Device * m_dx11Device;
36  ID3D11DeviceContext* m_dx11Context;
38 
39  DXFunctions(ID3D11Device *dx11Device, ID3D11DeviceContext* dx11Context, CompileFromMemoryFunc dx11CompileFromMemory) :
40  m_dx11Device( dx11Device ),
41  m_dx11Context( dx11Context ),
42  m_dx11CompileFromMemory( dx11CompileFromMemory )
43  {
44 
45  }
46 
47  class KernelDesc
48  {
49  protected:
50 
51 
52  public:
53  ID3D11ComputeShader* kernel;
54  ID3D11Buffer* constBuffer;
55 
57  {
58  kernel = 0;
59  constBuffer = 0;
60  }
61 
62  virtual ~KernelDesc()
63  {
64  // TODO: this should probably destroy its kernel but we need to be careful
65  // in case KernelDescs are copied
66  }
67  };
68 
72  KernelDesc compileComputeShaderFromString( const char* shaderString, const char* shaderName, int constBufferSize, D3D10_SHADER_MACRO *compileMacros = 0 );
73 
74 };
75 
77 {
78 protected:
84  {
88 
91 
92  // Both needed for capsule
93  float radius;
94  float halfHeight;
95 
96  float margin;
97  float friction;
98 
100  {
101  collisionShapeType = 0;
102  margin = 0;
103  friction = 0;
104  }
105  };
106 
107  struct UIntVector3
108  {
110  {
111  x = 0;
112  y = 0;
113  z = 0;
114  _padding = 0;
115  }
116 
117  UIntVector3( unsigned int x_, unsigned int y_, unsigned int z_ )
118  {
119  x = x_;
120  y = y_;
121  z = z_;
122  _padding = 0;
123  }
124 
125  unsigned int x;
126  unsigned int y;
127  unsigned int z;
128  unsigned int _padding;
129  };
130 
131 
132 
133 public:
140  {
141  protected:
160 
163 
164 
165  public:
167  m_softBody( softBody )
168  {
169  m_numVertices = 0;
170  m_maxVertices = 0;
171  m_numTriangles = 0;
172  m_maxTriangles = 0;
173  m_firstVertex = 0;
174  m_firstTriangle = 0;
175  m_firstLink = 0;
176  m_maxLinks = 0;
177  m_numLinks = 0;
178  }
179  int getNumVertices() const
180  {
181  return m_numVertices;
182  }
183 
184  int getNumTriangles() const
185  {
186  return m_numTriangles;
187  }
188 
189  int getMaxVertices() const
190  {
191  return m_maxVertices;
192  }
193 
194  int getMaxTriangles() const
195  {
196  return m_maxTriangles;
197  }
198 
199  int getFirstVertex() const
200  {
201  return m_firstVertex;
202  }
203 
204  int getFirstTriangle() const
205  {
206  return m_firstTriangle;
207  }
208 
209 
213  void updateBounds( const btVector3 &lowerBound, const btVector3 &upperBound );
214 
215 
216  // TODO: All of these set functions will have to do checks and
217  // update the world because restructuring of the arrays will be necessary
218  // Reasonable use of "friend"?
219  void setNumVertices( int numVertices )
220  {
221  m_numVertices = numVertices;
222  }
223 
224  void setNumTriangles( int numTriangles )
225  {
226  m_numTriangles = numTriangles;
227  }
228 
229  void setMaxVertices( int maxVertices )
230  {
231  m_maxVertices = maxVertices;
232  }
233 
234  void setMaxTriangles( int maxTriangles )
235  {
236  m_maxTriangles = maxTriangles;
237  }
238 
239  void setFirstVertex( int firstVertex )
240  {
241  m_firstVertex = firstVertex;
242  }
243 
244  void setFirstTriangle( int firstTriangle )
245  {
246  m_firstTriangle = firstTriangle;
247  }
248 
249  void setMaxLinks( int maxLinks )
250  {
251  m_maxLinks = maxLinks;
252  }
253 
254  void setNumLinks( int numLinks )
255  {
256  m_numLinks = numLinks;
257  }
258 
259  void setFirstLink( int firstLink )
260  {
261  m_firstLink = firstLink;
262  }
263 
265  {
266  return m_maxLinks;
267  }
268 
270  {
271  return m_numLinks;
272  }
273 
275  {
276  return m_firstLink;
277  }
278 
280  {
281  return m_softBody;
282  }
283 
284  };
285 
286 
288  {
289  CollisionObjectIndices( int f, int e )
290  {
291  firstObject = f;
292  endObject = e;
293  }
294 
297  };
298 
299 
300 
301 
302 
304  {
305  int numLinks;
306  int padding0;
307  int padding1;
308  int padding2;
309  };
310 
312  {
314  int numLinks;
315  float kst;
316  float ti;
317  };
318 
319  struct IntegrateCB
320  {
321  int numNodes;
322  float solverdt;
323  int padding1;
324  int padding2;
325  };
326 
328  {
329  int numNodes;
330  float solverSDT;
331  int padding1;
332  int padding2;
333  };
334 
336  {
337  int numNodes;
338  float isolverdt;
339  int padding1;
340  int padding2;
341  };
342 
344  {
345  int numNodes;
346  float isolverdt;
347  int padding1;
348  int padding2;
349  };
350 
352  {
353  int numNodes;
355  int numFaces;
356  float epsilon;
357  };
358 
359 
361  {
362  unsigned int numNodes;
363  float solverdt;
364  float epsilon;
365  int padding3;
366  };
367 
369  {
371  int lastNode;
372  float velocityX;
373  float velocityY;
374  float velocityZ;
375  int padding1;
376  int padding2;
377  int padding3;
378  };
379 
381  {
383  int numLinks;
384  float kst;
385  int padding;
386  };
387 
389  {
390  int numNodes;
392  int padding1;
393  int padding2;
394  };
395 
397  {
398  unsigned int numNodes;
399  float isolverdt;
400  int padding0;
401  int padding1;
402  };
403 
404 
405 
406 
407 protected:
408  ID3D11Device * m_dx11Device;
409  ID3D11DeviceContext* m_dx11Context;
410 
412 public:
417 
418 protected:
419 
422 
424 
430 
436 
442 
446 
450 
454 
458 
462 
463 
469 
475 
484 
493 
494 
500 
514 
516 
518 
522  virtual void integrate( float solverdt );
523  float computeTriangleArea(
524  const Vectormath::Aos::Point3 &vertex0,
525  const Vectormath::Aos::Point3 &vertex1,
526  const Vectormath::Aos::Point3 &vertex2 );
527 
528 
529  virtual bool buildShaders();
530 
531  void resetNormalsAndAreas( int numVertices );
532 
533  void normalizeNormalsAndAreas( int numVertices );
534 
535  void executeUpdateSoftBodies( int firstTriangle, int numTriangles );
536 
538 
540 
541  void ApplyClampedForce( float solverdt, const Vectormath::Aos::Vector3 &force, const Vectormath::Aos::Vector3 &vertexVelocity, float inverseMass, Vectormath::Aos::Vector3 &vertexForce );
542 
543  virtual void applyForces( float solverdt );
544 
545  virtual void updateConstants( float timeStep );
546  int findSoftBodyIndex( const btSoftBody* const softBody );
547 
549  // Kernel dispatches
550  virtual void prepareLinks();
551 
552  void updatePositionsFromVelocities( float solverdt );
553  void solveLinksForPosition( int startLink, int numLinks, float kst, float ti );
554  void solveLinksForVelocity( int startLink, int numLinks, float kst );
555 
556  void updateVelocitiesFromPositionsWithVelocities( float isolverdt );
557  void updateVelocitiesFromPositionsWithoutVelocities( float isolverdt );
558  void computeBounds( );
559  void solveCollisionsAndUpdateVelocities( float isolverdt );
560 
561  // End kernel dispatches
563 
564  void updateBounds();
565 
566 
567  void releaseKernels();
568 
569 public:
570  btDX11SoftBodySolver(ID3D11Device * dx11Device, ID3D11DeviceContext* dx11Context, DXFunctions::CompileFromMemoryFunc dx11CompileFromMemory = &D3DX11CompileFromMemory);
571 
572  virtual ~btDX11SoftBodySolver();
573 
574 
575  virtual SolverTypes getSolverType() const
576  {
577  return DX_SOLVER;
578  }
579 
580  void setEnableUpdateBounds(bool enableBounds)
581  {
582  m_enableUpdateBounds = enableBounds;
583  }
585  {
586  return m_enableUpdateBounds;
587  }
588 
589 
590 
591  virtual btSoftBodyLinkData &getLinkData();
592 
594 
596 
597 
598 
599 
600 
601  btAcceleratedSoftBodyInterface *findSoftBodyInterface( const btSoftBody* const softBody );
602  const btAcceleratedSoftBodyInterface * const findSoftBodyInterface( const btSoftBody* const softBody ) const;
603 
604  virtual bool checkInitialized();
605 
606  virtual void updateSoftBodies( );
607 
608  virtual void optimize( btAlignedObjectArray< btSoftBody * > &softBodies , bool forceUpdate=false);
609 
610  virtual void copyBackToSoftBodies(bool bMove = true);
611 
612  virtual void solveConstraints( float solverdt );
613 
614  virtual void predictMotion( float solverdt );
615 
616 
617  virtual void processCollision( btSoftBody *, const btCollisionObjectWrapper* );
618 
619  virtual void processCollision( btSoftBody*, btSoftBody* );
620 
621 };
622 
623 
624 
630 {
631 protected:
632 
633 public:
635  {
636  }
637 
639  virtual void copySoftBodyToVertexBuffer( const btSoftBody * const softBody, btVertexBufferDescriptor *vertexBuffer );
640 };
641 
647 {
648 protected:
650  {
652  int numNodes;
655 
658  int padding1;
659  int padding2;
660  };
661 
665 
666 
668 
669  bool checkInitialized();
670  bool buildShaders();
671  void releaseKernels();
672 
673 public:
674  btSoftBodySolverOutputDXtoDX(ID3D11Device *dx11Device, ID3D11DeviceContext* dx11Context, DXFunctions::CompileFromMemoryFunc dx11CompileFromMemory = &D3DX11CompileFromMemory) :
675  dxFunctions( dx11Device, dx11Context, dx11CompileFromMemory )
676  {
677  m_shadersInitialized = false;
678  }
679 
681  {
682  releaseKernels();
683  }
684 
686  virtual void copySoftBodyToVertexBuffer( const btSoftBody * const softBody, btVertexBufferDescriptor *vertexBuffer );
687 };
688 
689 #endif // #ifndef BT_ACCELERATED_SOFT_BODY_DX11_SOLVER_H
690 
691 
btDX11Buffer< CollisionObjectIndices > m_dx11PerClothCollisionObjects
btSoftBody * m_softBody
The actual soft body this data represents.
virtual void integrate(float solverdt)
Integrate motion on the solver.
int m_maxVertices
Maximum number of vertices allocated to be part of this cloth.
ID3D11DeviceContext * m_dx11Context
Vectormath::Aos::Vector3 ProjectOnAxis(const Vectormath::Aos::Vector3 &v, const Vectormath::Aos::Vector3 &a)
Class to manage movement of data from a solver to a given target.
btDX11Buffer< float > m_dx11PerClothDampingFactor
DXFunctions::KernelDesc computeBoundsKernel
DXFunctions::KernelDesc outputToVertexArrayWithoutNormalsKernel
ID3D11ComputeShader * kernel
The btAlignedObjectArray template class uses a subset of the stl::vector interface for its methods It...
DXFunctions::KernelDesc updatePositionsFromVelocitiesKernel
virtual btSoftBodyTriangleData & getTriangleData()
float computeTriangleArea(const Vectormath::Aos::Point3 &vertex0, const Vectormath::Aos::Point3 &vertex1, const Vectormath::Aos::Point3 &vertex2)
virtual void copySoftBodyToVertexBuffer(const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer)
Output current computed vertex data to the vertex buffers for all cloths in the solver.
void normalizeNormalsAndAreas(int numVertices)
virtual void processCollision(btSoftBody *, const btCollisionObjectWrapper *)
btDX11Buffer< float > m_dx11PerClothDragFactor
bool getEnableUpdateBounds() const
btAlignedObjectArray< float > m_perClothVelocityCorrectionCoefficient
Velocity correction coefficient.
virtual void updateSoftBodies()
Perform necessary per-step updates of soft bodies such as recomputing normals and bounding boxes...
btAlignedObjectArray< CollisionObjectIndices > m_perClothCollisionObjects
Collision shape details: pair of index of first collision shape for the cloth and number of collision...
DXFunctions(ID3D11Device *dx11Device, ID3D11DeviceContext *dx11Context, CompileFromMemoryFunc dx11CompileFromMemory)
void updateVelocitiesFromPositionsWithVelocities(float isolverdt)
DXFunctions::KernelDesc applyForcesKernel
Class to manage movement of data from a solver to a given target.
void updateVelocitiesFromPositionsWithoutVelocities(float isolverdt)
void resetNormalsAndAreas(int numVertices)
void updateBounds(const btVector3 &lowerBound, const btVector3 &upperBound)
Update the bounds in the btSoftBody object.
DXFunctions::KernelDesc addVelocityKernel
virtual void copySoftBodyToVertexBuffer(const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer)
Output current computed vertex data to the vertex buffers for all cloths in the solver.
btAlignedObjectArray< UIntVector3 > m_perClothMinBounds
Minimum bounds for each cloth.
virtual SolverTypes getSolverType() const
Return the type of the solver.
btSoftBodySolverOutputDXtoDX(ID3D11Device *dx11Device, ID3D11DeviceContext *dx11Context, DXFunctions::CompileFromMemoryFunc dx11CompileFromMemory=&D3DX11CompileFromMemory)
btAcceleratedSoftBodyInterface * findSoftBodyInterface(const btSoftBody *const softBody)
DXFunctions::KernelDesc solvePositionsFromLinksKernel
btDX11Buffer< float > m_dx11PerClothVelocityCorrectionCoefficient
void solveLinksForPosition(int startLink, int numLinks, float kst, float ti)
btAlignedObjectArray< float > m_perClothMediumDensity
Density of the medium in which each cloth sits.
int m_maxTriangles
Maximum number of triangles allocated to be part of this cloth.
void updatePositionsFromVelocities(float solverdt)
DXFunctions::KernelDesc solveCollisionsAndUpdateVelocitiesKernel
KernelDesc compileComputeShaderFromString(const char *shaderString, const char *shaderName, int constBufferSize, D3D10_SHADER_MACRO *compileMacros=0)
Compile a compute shader kernel from a string and return the appropriate KernelDesc object...
DXFunctions::KernelDesc updateSoftBodiesKernel
int m_firstVertex
Index of first vertex in the world allocated to this cloth.
virtual btSoftBodyVertexData & getVertexData()
btAlignedObjectArray< float > m_perClothDampingFactor
Velocity damping factor.
SoftBody class to maintain information about a soft body instance within a solver.
btSoftBodyLinkDataDX11 m_linkData
Link data for all cloths.
int m_maxLinks
Maximum number of links allocated to this cloth.
btDX11Buffer< float > m_dx11PerClothLiftFactor
DXFunctions::KernelDesc prepareLinksKernel
DXFunctions::KernelDesc resetNormalsAndAreasKernel
btDX11Buffer< Vectormath::Aos::Vector3 > m_dx11PerClothWindVelocity
DXFunctions::KernelDesc normalizeNormalsAndAreasKernel
virtual btSoftBodyLinkData & getLinkData()
btAlignedObjectArray< float > m_perClothFriction
Friction coefficient for each cloth.
virtual void solveConstraints(float solverdt)
Solve constraints for a set of soft bodies.
btDX11Buffer< CollisionShapeDescription > m_dx11CollisionObjectDetails
ID3D11DeviceContext * m_dx11Context
DXFunctions::KernelDesc integrateKernel
btAlignedObjectArray< Vectormath::Aos::Vector3 > m_perClothWindVelocity
Wind velocity to be applied normal to all non-static vertices in the solver.
virtual void copyBackToSoftBodies(bool bMove=true)
Copy necessary data back to the original soft body source objects.
void ApplyClampedForce(float solverdt, const Vectormath::Aos::Vector3 &force, const Vectormath::Aos::Vector3 &vertexVelocity, float inverseMass, Vectormath::Aos::Vector3 &vertexForce)
btVector3 can be used to represent 3D points and vectors.
Definition: btVector3.h:83
btAlignedObjectArray< btAcceleratedSoftBodyInterface * > m_softBodySet
Cloths owned by this solver.
virtual void applyForces(float solverdt)
virtual void predictMotion(float solverdt)
Predict motion of soft bodies into next timestep.
Wrapper for vertex data information.
void executeUpdateSoftBodies(int firstTriangle, int numTriangles)
btAlignedObjectArray< float > m_perClothDragFactor
Drag parameter for wind effect on cloth.
btDX11Buffer< float > m_dx11PerClothMediumDensity
CompileFromMemoryFunc m_dx11CompileFromMemory
btDX11Buffer< UIntVector3 > m_dx11PerClothMinBounds
Class to manage movement of data from a solver to a given target.
btSoftBodyVertexDataDX11 m_vertexData
btAlignedObjectArray< CollisionShapeDescription > m_collisionObjectDetails
Collision shapes being passed across to the cloths in this solver.
virtual bool checkInitialized()
Ensure that this solver is initialized.
UIntVector3(unsigned int x_, unsigned int y_, unsigned int z_)
btAlignedObjectArray< float > m_perClothLiftFactor
Lift parameter for wind effect on cloth.
int m_firstLink
Index of first link in the world allocated to this cloth.
void solveLinksForVelocity(int startLink, int numLinks, float kst)
DXFunctions::KernelDesc updateVelocitiesFromPositionsWithoutVelocitiesKernel
DXFunctions::KernelDesc outputToVertexArrayWithNormalsKernel
int m_numLinks
Current number of links allocated to this cloth.
btSoftBodyTriangleDataDX11 m_triangleData
DXFunctions::KernelDesc updateVelocitiesFromPositionsWithVelocitiesKernel
void prepareCollisionConstraints()
Sort the collision object details array and generate indexing into it for the per-cloth collision obj...
The btSoftBody is an class to simulate cloth and volumetric soft bodies.
Definition: btSoftBody.h:71
int findSoftBodyIndex(const btSoftBody *const softBody)
void solveCollisionsAndUpdateVelocities(float isolverdt)
btDX11Buffer< float > m_dx11PerClothFriction
HRESULT(WINAPI * CompileFromMemoryFunc)(LPCSTR, SIZE_T, LPCSTR, const D3D10_SHADER_MACRO *, LPD3D10INCLUDE, LPCSTR, LPCSTR, UINT, UINT, ID3DX11ThreadPump *, ID3D10Blob **, ID3D10Blob **, HRESULT *)
ID3D11Device * m_dx11Device
void setEnableUpdateBounds(bool enableBounds)
int m_firstTriangle
Index of first triangle in the world allocated to this cloth.
btDX11Buffer< UIntVector3 > m_dx11PerClothMaxBounds
btDX11SoftBodySolver(ID3D11Device *dx11Device, ID3D11DeviceContext *dx11Context, DXFunctions::CompileFromMemoryFunc dx11CompileFromMemory=&D3DX11CompileFromMemory)
bool m_updateSolverConstants
Variable to define whether we need to update solver constants on the next iteration.
virtual void optimize(btAlignedObjectArray< btSoftBody * > &softBodies, bool forceUpdate=false)
Optimize soft bodies in this solver.
int m_numVertices
Current number of vertices that are part of this cloth.
DXFunctions::KernelDesc vSolveLinksKernel
int m_numTriangles
Current number of triangles that are part of this cloth.
btDX11Buffer< Vectormath::Aos::Vector3 > m_dx11PerClothAcceleration
virtual void updateConstants(float timeStep)
btAlignedObjectArray< UIntVector3 > m_perClothMaxBounds
Maximum bounds for each cloth.
btAlignedObjectArray< Vectormath::Aos::Vector3 > m_perClothAcceleration
Acceleration value to be applied to all non-static vertices in the solver.