FLEX  1.2.0
NvFlex.h
Go to the documentation of this file.
1 // This code contains NVIDIA Confidential Information and is disclosed to you
2 // under a form of NVIDIA software license agreement provided separately to you.
3 //
4 // Notice
5 // NVIDIA Corporation and its licensors retain all intellectual property and
6 // proprietary rights in and to this software and related documentation and
7 // any modifications thereto. Any use, reproduction, disclosure, or
8 // distribution of this software and related documentation without an express
9 // license agreement from NVIDIA Corporation is strictly prohibited.
10 //
11 // ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
12 // NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
13 // THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
14 // MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
15 //
16 // Information and code furnished is believed to be accurate and reliable.
17 // However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
18 // information or for any infringement of patents or other rights of third parties that may
19 // result from its use. No license is granted by implication or otherwise under any patent
20 // or patent rights of NVIDIA Corporation. Details are subject to change without notice.
21 // This code supersedes and replaces all information previously supplied.
22 // NVIDIA Corporation products are not authorized for use as critical
23 // components in life support devices or systems without express written approval of
24 // NVIDIA Corporation.
25 //
26 // Copyright (c) 2013-2020 NVIDIA Corporation. All rights reserved.
27 
28 #ifndef NV_FLEX_H
29 #define NV_FLEX_H
30 
32 #if _WIN32
33 #define NV_FLEX_API __declspec(dllexport)
34 #else
35 #define NV_FLEX_API
36 #endif
37 
38 // least 2 significant digits define minor version, eg: 10 -> version 0.10
39 #define NV_FLEX_VERSION 120
40 
42 
47 extern "C" {
48 
53 
57 typedef struct NvFlexSolver NvFlexSolver;
58 
62 typedef struct NvFlexBuffer NvFlexBuffer;
63 
68 {
71 };
72 
77 {
80 };
81 
86 {
89 };
90 
91 
96 {
98 
99  float gravity[3];
100  float radius;
103 
104  // common params
108  float restitution;
109  float adhesion;
111 
112  float maxSpeed;
114 
116  float dissipation;
117  float damping;
118 
119  // cloth params
120  float wind[3];
121  float drag;
122  float lift;
123 
124  // fluid params
125  float cohesion;
127  float viscosity;
132  float smoothing;
135  float buoyancy;
136 
137  // diffuse params
140  float diffuseDrag;
143 
144  // collision params
148 
149  float planes[8][4];
150  int numPlanes;
151 
154 };
155 
156 
161 {
162  eNvFlexPhaseGroupMask = 0x000fffff,
163  eNvFlexPhaseFlagsMask = 0x00f00000,
165 
168  eNvFlexPhaseFluid = 1 << 22,
169  eNvFlexPhaseUnused = 1 << 23,
170 
178 };
179 
180 
189 NV_FLEX_API inline int NvFlexMakePhaseWithChannels(int group, int particleFlags, int shapeChannels) { return (group & eNvFlexPhaseGroupMask) | (particleFlags & eNvFlexPhaseFlagsMask) | (shapeChannels & eNvFlexPhaseShapeChannelMask); }
190 
194 NV_FLEX_API inline int NvFlexMakePhase(int group, int particleFlags) { return NvFlexMakePhaseWithChannels(group, particleFlags, eNvFlexPhaseShapeChannelMask); }
195 
196 
201 {
202  float predict;
205  float createGrid;
206  float reorder;
214  float solveShapes;
215  float solveSprings;
218  float applyDeltas;
223  float finalize;
224  float updateBounds;
225  float total;
226 };
227 
232 {
238 };
239 
240 
244 {
251 };
252 
253 
267 {
269  void* userData;
270 
271  float* particles;
272  float* velocities;
273  int* phases;
274 
275  int numActive;
276 
277  float dt;
278 
279  const int* originalToSortedMap;
280  const int* sortedToOriginalMap;
281 };
282 
286 {
288  void* userData;
289 
291  void (*function)(NvFlexSolverCallbackParams params);
292 };
293 
297 typedef void (*NvFlexErrorCallback)(NvFlexErrorSeverity type, const char* msg, const char* file, int line);
298 
299 
300 
301 
305 {
309 };
310 
311 
315 {
318  void* renderDevice;
322 
324 };
325 
335 NV_FLEX_API NvFlexLibrary* NvFlexInit(int version = NV_FLEX_VERSION, NvFlexErrorCallback errorFunc = 0, NvFlexInitDesc* desc = 0);
336 
343 NV_FLEX_API void NvFlexShutdown(NvFlexLibrary* lib);
344 
348 NV_FLEX_API int NvFlexGetVersion();
349 
354 {
358 };
359 
364 {
366 
371 };
372 
377 NV_FLEX_API void NvFlexSetSolverDescDefaults(NvFlexSolverDesc* desc);
378 
385 NV_FLEX_API NvFlexSolver* NvFlexCreateSolver(NvFlexLibrary* lib, const NvFlexSolverDesc* desc);
386 
392 NV_FLEX_API void NvFlexDestroySolver(NvFlexSolver* solver);
393 
403 NV_FLEX_API int NvFlexGetSolvers(NvFlexLibrary* lib, NvFlexSolver** solvers, int n);
404 
412 
419 NV_FLEX_API void NvFlexGetSolverDesc(NvFlexSolver* solver, NvFlexSolverDesc* desc);
420 
430 
490 NV_FLEX_API void NvFlexUpdateSolver(NvFlexSolver* solver, float dt, int substeps, bool enableTimers);
491 
498 NV_FLEX_API void NvFlexSetParams(NvFlexSolver* solver, const NvFlexParams* params);
499 
507 NV_FLEX_API void NvFlexGetParams(NvFlexSolver* solver, NvFlexParams* params);
508 
513 {
514  int srcOffset; //<! Offset in elements from the start of the source buffer to begin reading from
515  int dstOffset; //<! Offset in elements from the start of the destination buffer to being writing to
516  int elementCount; //<! Number of elements to copy
517 };
518 
526 NV_FLEX_API void NvFlexSetActive(NvFlexSolver* solver, NvFlexBuffer* indices, const NvFlexCopyDesc* desc);
527 
535 NV_FLEX_API void NvFlexGetActive(NvFlexSolver* solver, NvFlexBuffer* indices, const NvFlexCopyDesc* desc);
536 
543 NV_FLEX_API void NvFlexSetActiveCount(NvFlexSolver* solver, int n);
544 
551 NV_FLEX_API int NvFlexGetActiveCount(NvFlexSolver* solver);
552 
561 NV_FLEX_API void NvFlexSetParticles(NvFlexSolver* solver, NvFlexBuffer* p, const NvFlexCopyDesc* desc);
562 
570 NV_FLEX_API void NvFlexGetParticles(NvFlexSolver* solver, NvFlexBuffer* p, const NvFlexCopyDesc* desc);
571 
581 NV_FLEX_API void NvFlexSetRestParticles(NvFlexSolver* solver, NvFlexBuffer* p, const NvFlexCopyDesc* desc);
582 
591 NV_FLEX_API void NvFlexGetRestParticles(NvFlexSolver* solver, NvFlexBuffer* p, const NvFlexCopyDesc* desc);
592 
593 
601 NV_FLEX_API void NvFlexGetSmoothParticles(NvFlexSolver* solver, NvFlexBuffer* p, const NvFlexCopyDesc* desc);
602 
611 NV_FLEX_API void NvFlexSetVelocities(NvFlexSolver* solver, NvFlexBuffer* v, const NvFlexCopyDesc* desc);
619 NV_FLEX_API void NvFlexGetVelocities(NvFlexSolver* solver, NvFlexBuffer* v, const NvFlexCopyDesc* desc);
620 
637 NV_FLEX_API void NvFlexSetPhases(NvFlexSolver* solver, NvFlexBuffer* phases, const NvFlexCopyDesc* desc);
645 NV_FLEX_API void NvFlexGetPhases(NvFlexSolver* solver, NvFlexBuffer* phases, const NvFlexCopyDesc* desc);
646 
654 NV_FLEX_API void NvFlexSetNormals(NvFlexSolver* solver, NvFlexBuffer* normals, const NvFlexCopyDesc* desc);
655 
663 NV_FLEX_API void NvFlexGetNormals(NvFlexSolver* solver, NvFlexBuffer* normals, const NvFlexCopyDesc* desc);
664 
665 
678 NV_FLEX_API void NvFlexSetSprings(NvFlexSolver* solver, NvFlexBuffer* indices, NvFlexBuffer* restLengths, NvFlexBuffer* stiffness, int numSprings);
688 NV_FLEX_API void NvFlexGetSprings(NvFlexSolver* solver, NvFlexBuffer* indices, NvFlexBuffer* restLengths, NvFlexBuffer* stiffness, int numSprings);
689 
708 NV_FLEX_API void NvFlexSetRigids(NvFlexSolver* solver, NvFlexBuffer* offsets, NvFlexBuffer* indices, NvFlexBuffer* restPositions, NvFlexBuffer* restNormals, NvFlexBuffer* stiffness, NvFlexBuffer* thresholds, NvFlexBuffer* creeps, NvFlexBuffer* rotations, NvFlexBuffer* translations, int numRigids, int numIndices);
709 
725 NV_FLEX_API void NvFlexGetRigids(NvFlexSolver* solver, NvFlexBuffer* offsets, NvFlexBuffer* indices, NvFlexBuffer* restPositions, NvFlexBuffer* restNormals, NvFlexBuffer* stiffness, NvFlexBuffer* thresholds, NvFlexBuffer* creeps, NvFlexBuffer* rotations, NvFlexBuffer* translations);
726 
730 typedef unsigned int NvFlexTriangleMeshId;
731 
735 typedef unsigned int NvFlexDistanceFieldId;
736 
742 typedef unsigned int NvFlexConvexMeshId;
743 
750 NV_FLEX_API NvFlexTriangleMeshId NvFlexCreateTriangleMesh(NvFlexLibrary* lib);
751 
758 NV_FLEX_API void NvFlexDestroyTriangleMesh(NvFlexLibrary* lib, NvFlexTriangleMeshId mesh);
759 
769 NV_FLEX_API int NvFlexGetTriangleMeshes(NvFlexLibrary* lib, NvFlexTriangleMeshId* meshes, int n);
770 
784 NV_FLEX_API void NvFlexUpdateTriangleMesh(NvFlexLibrary* lib, NvFlexTriangleMeshId mesh, NvFlexBuffer* vertices, NvFlexBuffer* indices, int numVertices, int numTriangles, const float* lower, const float* upper);
785 
794 NV_FLEX_API void NvFlexGetTriangleMeshBounds(NvFlexLibrary* lib, const NvFlexTriangleMeshId mesh, float* lower, float* upper);
795 
802 NV_FLEX_API NvFlexDistanceFieldId NvFlexCreateDistanceField(NvFlexLibrary* lib);
803 
810 NV_FLEX_API void NvFlexDestroyDistanceField(NvFlexLibrary* lib, NvFlexDistanceFieldId sdf);
811 
821 NV_FLEX_API int NvFlexGetDistanceFields(NvFlexLibrary* lib, NvFlexDistanceFieldId* sdfs, int n);
822 
834 NV_FLEX_API void NvFlexUpdateDistanceField(NvFlexLibrary* lib, NvFlexDistanceFieldId sdf, int dimx, int dimy, int dimz, NvFlexBuffer* field);
835 
842 NV_FLEX_API NvFlexConvexMeshId NvFlexCreateConvexMesh(NvFlexLibrary* lib);
843 
850 NV_FLEX_API void NvFlexDestroyConvexMesh(NvFlexLibrary* lib, NvFlexConvexMeshId convex);
851 
861 NV_FLEX_API int NvFlexGetConvexMeshes(NvFlexLibrary* lib, NvFlexConvexMeshId* meshes, int n);
862 
873 NV_FLEX_API void NvFlexUpdateConvexMesh(NvFlexLibrary* lib, NvFlexConvexMeshId convex, NvFlexBuffer* planes, int numPlanes, const float* lower, const float* upper);
874 
883 NV_FLEX_API void NvFlexGetConvexMeshBounds(NvFlexLibrary* lib, NvFlexConvexMeshId mesh, float* lower, float* upper);
884 
889 {
890  float radius;
891 };
892 
897 {
898  float radius;
899  float halfHeight;
900 };
901 
906 {
907  float halfExtents[3];
908 };
909 
914 {
915  float scale[3];
916  NvFlexConvexMeshId mesh;
917 };
918 
923 {
924  float scale[3];
925  NvFlexTriangleMeshId mesh;
926 };
927 
933 {
934  float scale;
935  NvFlexDistanceFieldId field;
936 };
937 
943 {
950 };
951 
953 {
960 };
961 
963 {
967 
969 };
970 
978 NV_FLEX_API inline int NvFlexMakeShapeFlagsWithChannels(NvFlexCollisionShapeType type, bool dynamic, int shapeChannels) { return type | (dynamic?eNvFlexShapeFlagDynamic:0) | shapeChannels; }
979 
983 NV_FLEX_API inline int NvFlexMakeShapeFlags(NvFlexCollisionShapeType type, bool dynamic) { return NvFlexMakeShapeFlagsWithChannels(type, dynamic, eNvFlexPhaseShapeChannelMask); }
984 
985 
999 NV_FLEX_API void NvFlexSetShapes(NvFlexSolver* solver, NvFlexBuffer* geometry, NvFlexBuffer* shapePositions, NvFlexBuffer* shapeRotations, NvFlexBuffer* shapePrevPositions, NvFlexBuffer* shapePrevRotations, NvFlexBuffer* shapeFlags, int numShapes);
1000 
1011 NV_FLEX_API void NvFlexSetDynamicTriangles(NvFlexSolver* solver, NvFlexBuffer* indices, NvFlexBuffer* normals, int numTris);
1020 NV_FLEX_API void NvFlexGetDynamicTriangles(NvFlexSolver* solver, NvFlexBuffer* indices, NvFlexBuffer* normals, int numTris);
1021 
1036 NV_FLEX_API void NvFlexSetInflatables(NvFlexSolver* solver, NvFlexBuffer* startTris, NvFlexBuffer* numTris, NvFlexBuffer* restVolumes, NvFlexBuffer* overPressures, NvFlexBuffer* constraintScales, int numInflatables);
1037 
1045 NV_FLEX_API void NvFlexGetDensities(NvFlexSolver* solver, NvFlexBuffer* densities, const NvFlexCopyDesc* desc);
1046 
1061 NV_FLEX_API void NvFlexGetAnisotropy(NvFlexSolver* solver, NvFlexBuffer* q1, NvFlexBuffer* q2, NvFlexBuffer* q3, const NvFlexCopyDesc* desc);
1071 NV_FLEX_API void NvFlexGetDiffuseParticles(NvFlexSolver* solver, NvFlexBuffer* p, NvFlexBuffer* v, NvFlexBuffer* count);
1072 
1083 NV_FLEX_API void NvFlexSetDiffuseParticles(NvFlexSolver* solver, NvFlexBuffer* p, NvFlexBuffer* v, int n);
1084 
1094 NV_FLEX_API void NvFlexGetContacts(NvFlexSolver* solver, NvFlexBuffer* planes, NvFlexBuffer* velocities, NvFlexBuffer* indices, NvFlexBuffer* counts);
1095 
1142 NV_FLEX_API void NvFlexGetNeighbors(NvFlexSolver* solver, NvFlexBuffer* neighbors, NvFlexBuffer* counts, NvFlexBuffer* apiToInternal, NvFlexBuffer* internalToApi);
1143 
1152 NV_FLEX_API void NvFlexGetBounds(NvFlexSolver* solver, NvFlexBuffer* lower, NvFlexBuffer* upper);
1153 
1165 NV_FLEX_API float NvFlexGetDeviceLatency(NvFlexSolver* solver, unsigned long long* begin, unsigned long long* end, unsigned long long* frequency);
1166 
1177 NV_FLEX_API void NvFlexGetTimers(NvFlexSolver* solver, NvFlexTimers* timers);
1178 
1183 {
1184  char* name;
1185  float time;
1186 };
1187 
1200 NV_FLEX_API int NvFlexGetDetailTimers(NvFlexSolver* solver, NvFlexDetailTimer** timers);
1201 
1211 NV_FLEX_API NvFlexBuffer* NvFlexAllocBuffer(NvFlexLibrary* lib, int elementCount, int elementByteStride, NvFlexBufferType type);
1212 
1218 NV_FLEX_API void NvFlexFreeBuffer(NvFlexBuffer* buf);
1219 
1229 NV_FLEX_API void* NvFlexMap(NvFlexBuffer* buffer, int flags);
1230 
1236 NV_FLEX_API void NvFlexUnmap(NvFlexBuffer* buffer);
1237 
1267 NV_FLEX_API NvFlexBuffer* NvFlexRegisterOGLBuffer(NvFlexLibrary* lib, int buf, int elementCount, int elementByteStride);
1268 
1274 NV_FLEX_API void NvFlexUnregisterOGLBuffer(NvFlexBuffer* buf);
1275 
1285 NV_FLEX_API NvFlexBuffer* NvFlexRegisterD3DBuffer(NvFlexLibrary* lib, void* buffer, int elementCount, int elementByteStride);
1286 
1292 NV_FLEX_API void NvFlexUnregisterD3DBuffer(NvFlexBuffer* buf);
1293 
1299 NV_FLEX_API void NvFlexAcquireContext(NvFlexLibrary* lib);
1300 
1305 NV_FLEX_API void NvFlexRestoreContext(NvFlexLibrary* lib);
1306 
1312 NV_FLEX_API const char* NvFlexGetDeviceName(NvFlexLibrary* lib);
1313 
1323 NV_FLEX_API void NvFlexGetDeviceAndContext(NvFlexLibrary* lib, void** device, void** context);
1324 
1325 
1331 NV_FLEX_API void NvFlexFlush(NvFlexLibrary* lib);
1332 
1333 NV_FLEX_API void NvFlexWait(NvFlexLibrary* lib);
1334 
1336 
1341 NV_FLEX_API void NvFlexSetDebug(NvFlexSolver* solver, bool enable);
1342 NV_FLEX_API void NvFlexGetShapeBVH(NvFlexSolver* solver, void* bvh);
1343 NV_FLEX_API void NvFlexCopySolver(NvFlexSolver* dst, NvFlexSolver* src);
1344 NV_FLEX_API void NvFlexCopyDeviceToHost(NvFlexSolver* solver, NvFlexBuffer* pDevice, void* pHost, int size, int stride);
1345 NV_FLEX_API void NvFlexComputeWaitForGraphics(NvFlexLibrary* lib);
1346 NV_FLEX_API void NvFlexGetDataAftermath(NvFlexLibrary* lib, void* pDataOut, void* pStatusOut);
1347 
1349 
1350 } // extern "C"
1351 
1352 #endif // NV_FLEX_H
NV_FLEX_API int NvFlexGetActiveCount(NvFlexSolver *solver)
Reserved.
Definition: NvFlex.h:169
float solveShapes
Time spent solving rigid body constraints.
Definition: NvFlex.h:214
NV_FLEX_API NvFlexSolverCallback NvFlexRegisterSolverCallback(NvFlexSolver *solver, NvFlexSolverCallback function, NvFlexSolverCallbackStage stage)
NV_FLEX_API void NvFlexGetPhases(NvFlexSolver *solver, NvFlexBuffer *phases, const NvFlexCopyDesc *desc)
float radius
Definition: NvFlex.h:890
Warning messages.
Definition: NvFlex.h:235
float solveSprings
Time spent solving distance constraints.
Definition: NvFlex.h:215
NvFlexMapFlags
Definition: NvFlex.h:67
int maxDiffuseParticles
Maximum number of diffuse particles in the solver.
Definition: NvFlex.h:368
void(* NvFlexErrorCallback)(NvFlexErrorSeverity type, const char *msg, const char *file, int line)
Definition: NvFlex.h:297
Information messages.
Definition: NvFlex.h:234
float smoothing
Control the strength of Laplacian smoothing in particles for rendering, if zero then smoothed positio...
Definition: NvFlex.h:132
NV_FLEX_API void NvFlexSetParams(NvFlexSolver *solver, const NvFlexParams *params)
Called at the end of solver update after the final substep has completed.
Definition: NvFlex.h:249
Particle will collide with shapes with channel 3 set (see NvFlexMakeShapeFlags()) ...
Definition: NvFlex.h:174
NV_FLEX_API void NvFlexUpdateTriangleMesh(NvFlexLibrary *lib, NvFlexTriangleMeshId mesh, NvFlexBuffer *vertices, NvFlexBuffer *indices, int numVertices, int numTriangles, const float *lower, const float *upper)
NV_FLEX_API void NvFlexUnmap(NvFlexBuffer *buffer)
If set this particle will interact with particles of the same group.
Definition: NvFlex.h:166
float createCellIndices
Time spent creating grid indices.
Definition: NvFlex.h:203
Particle will collide with shapes with channel 4 set (see NvFlexMakeShapeFlags()) ...
Definition: NvFlex.h:175
float shapeCollisionMargin
Increases the radius used during contact finding against kinematic shapes.
Definition: NvFlex.h:147
float scale
Uniform scale of SDF, this corresponds to the world space width of the shape.
Definition: NvFlex.h:934
int diffuseBallistic
The number of neighbors below which a diffuse particle is considered ballistic.
Definition: NvFlex.h:141
NV_FLEX_API void NvFlexSetRigids(NvFlexSolver *solver, NvFlexBuffer *offsets, NvFlexBuffer *indices, NvFlexBuffer *restPositions, NvFlexBuffer *restNormals, NvFlexBuffer *stiffness, NvFlexBuffer *thresholds, NvFlexBuffer *creeps, NvFlexBuffer *rotations, NvFlexBuffer *translations, int numRigids, int numIndices)
NvFlexRelaxationMode
Definition: NvFlex.h:85
float drag
Drag force applied to particles belonging to dynamic triangles, proportional to velocity^2*area in th...
Definition: NvFlex.h:121
NvFlexErrorSeverity
Definition: NvFlex.h:231
NV_FLEX_API void NvFlexSetPhases(NvFlexSolver *solver, NvFlexBuffer *phases, const NvFlexCopyDesc *desc)
float maxSpeed
The magnitude of particle velocity will be clamped to this value at the end of each step...
Definition: NvFlex.h:112
All features enabled.
Definition: NvFlex.h:355
float planes[8][4]
Collision planes in the form ax + by + cz + d = 0.
Definition: NvFlex.h:149
float cohesion
Control how strongly particles hold each other together, default: 0.025, range [0.0, +inf].
Definition: NvFlex.h:125
float staticFriction
Coefficient of static friction used when colliding against shapes.
Definition: NvFlex.h:106
float collideParticles
Time spent finding particle neighbors.
Definition: NvFlex.h:207
NV_FLEX_API void NvFlexGetNormals(NvFlexSolver *solver, NvFlexBuffer *normals, const NvFlexCopyDesc *desc)
NvFlexCapsuleGeometry capsule
Definition: NvFlex.h:945
float predict
Time spent in prediction.
Definition: NvFlex.h:202
NV_FLEX_API void NvFlexGetDiffuseParticles(NvFlexSolver *solver, NvFlexBuffer *p, NvFlexBuffer *v, NvFlexBuffer *count)
Definition: NvFlex.h:913
int maxNeighborsPerParticle
Maximum number of neighbors per-particle, for solids this can be around 32, for fluids up to 128 may ...
Definition: NvFlex.h:369
float updateDiffuse
Time spent updating diffuse particles.
Definition: NvFlex.h:220
NvFlexSphereGeometry sphere
Definition: NvFlex.h:944
float collisionDistance
Distance particles maintain against shapes, note that for robust collision against triangle meshes th...
Definition: NvFlex.h:145
NvFlexTriangleMeshGeometry triMesh
Definition: NvFlex.h:948
float solveContacts
Time spent solving contact constraints.
Definition: NvFlex.h:216
NV_FLEX_API void NvFlexSetActiveCount(NvFlexSolver *solver, int n)
Bits [20, 23] hold flags about how the particle behave.
Definition: NvFlex.h:163
Definition: NvFlex.h:968
NvFlexComputeType computeType
Set to eNvFlexD3D11 if DirectX 11 should be used, eNvFlexD3D12 for DirectX 12, this must match the li...
Definition: NvFlex.h:323
NV_FLEX_API void NvFlexDestroyDistanceField(NvFlexLibrary *lib, NvFlexDistanceFieldId sdf)
Use DirectX 11 compute for Flex, the application must link against the D3D libraries.
Definition: NvFlex.h:307
NV_FLEX_API void NvFlexDestroySolver(NvFlexSolver *solver)
Lower 3 bits holds the type of the collision shape given by the NvFlexCollisionShapeType enum...
Definition: NvFlex.h:964
const int * originalToSortedMap
Device pointer that maps the sorted callback data to the original position given by SetParticles() ...
Definition: NvFlex.h:279
float halfHeight
Definition: NvFlex.h:899
Calling thread will be blocked until buffer is ready for access, default.
Definition: NvFlex.h:69
NV_FLEX_API void NvFlexSetDiffuseParticles(NvFlexSolver *solver, NvFlexBuffer *p, NvFlexBuffer *v, int n)
struct NvFlexSolver NvFlexSolver
Definition: NvFlex.h:57
Called at the end of each substep after the velocity has been updated by the constraints.
Definition: NvFlex.h:248
float * particles
Device pointer to the active particle basic data in the form x,y,z,1/m.
Definition: NvFlex.h:271
NV_FLEX_API void NvFlexGetActive(NvFlexSolver *solver, NvFlexBuffer *indices, const NvFlexCopyDesc *desc)
NV_FLEX_API void NvFlexSetInflatables(NvFlexSolver *solver, NvFlexBuffer *startTris, NvFlexBuffer *numTris, NvFlexBuffer *restVolumes, NvFlexBuffer *overPressures, NvFlexBuffer *constraintScales, int numInflatables)
NV_FLEX_API void NvFlexWait(NvFlexLibrary *lib)
NV_FLEX_API void NvFlexSetParticles(NvFlexSolver *solver, NvFlexBuffer *p, const NvFlexCopyDesc *desc)
Definition: NvFlex.h:888
Definition: NvFlex.h:363
int dstOffset
Definition: NvFlex.h:515
Called at the beginning of each constraint iteration.
Definition: NvFlex.h:245
NV_FLEX_API void NvFlexGetTriangleMeshBounds(NvFlexLibrary *lib, const NvFlexTriangleMeshId mesh, float *lower, float *upper)
NV_FLEX_API int NvFlexMakeShapeFlagsWithChannels(NvFlexCollisionShapeType type, bool dynamic, int shapeChannels)
Definition: NvFlex.h:978
Definition: NvFlex.h:266
NV_FLEX_API NvFlexConvexMeshId NvFlexCreateConvexMesh(NvFlexLibrary *lib)
NV_FLEX_API void * NvFlexMap(NvFlexBuffer *buffer, int flags)
float time
Definition: NvFlex.h:1185
Definition: NvFlex.h:942
float updateNormals
Time spent updating vertex normals.
Definition: NvFlex.h:222
unsigned int NvFlexTriangleMeshId
Definition: NvFlex.h:730
The relaxation factor is a fixed multiplier on each constraint's delta divided by the particle's cons...
Definition: NvFlex.h:88
NV_FLEX_API NvFlexBuffer * NvFlexRegisterD3DBuffer(NvFlexLibrary *lib, void *buffer, int elementCount, int elementByteStride)
bool runOnRenderContext
If true, run Flex on D3D11 render context, or D3D12 direct queue. If false, run on a D3D12 compute qu...
Definition: NvFlex.h:321
Indicates that the shape is a trigger volume, this means it will not perform any collision response...
Definition: NvFlex.h:966
Simple single phase fluid-only particles (no solids)
Definition: NvFlex.h:357
A sphere shape, see FlexSphereGeometry.
Definition: NvFlex.h:954
A signed distance field shape, see FlexSDFGeometry.
Definition: NvFlex.h:959
int deviceIndex
The GPU device index that should be used, if there is already a CUDA context on the calling thread th...
Definition: NvFlex.h:316
float viscosity
Smoothes particle velocities using XSPH viscosity.
Definition: NvFlex.h:127
NvFlexTriangleMeshId mesh
A triangle mesh pointer created by NvFlexCreateTriangleMesh()
Definition: NvFlex.h:925
float adhesion
Controls how strongly particles stick to surfaces they hit, default 0.0, range [0.0, +inf].
Definition: NvFlex.h:109
NV_FLEX_API void NvFlexUnregisterOGLBuffer(NvFlexBuffer *buf)
float halfExtents[3]
Definition: NvFlex.h:907
Definition: NvFlex.h:905
NV_FLEX_API NvFlexDistanceFieldId NvFlexCreateDistanceField(NvFlexLibrary *lib)
int * phases
Device pointer to the active particle phase data.
Definition: NvFlex.h:273
NV_FLEX_API void NvFlexFlush(NvFlexLibrary *lib)
NV_FLEX_API void NvFlexGetBounds(NvFlexSolver *solver, NvFlexBuffer *lower, NvFlexBuffer *upper)
A host mappable buffer, pinned memory on CUDA, staging buffer on DX.
Definition: NvFlex.h:78
int numActive
The number of active particles returned, the callback data only return pointers to active particle da...
Definition: NvFlex.h:275
NV_FLEX_API NvFlexLibrary * NvFlexGetSolverLibrary(NvFlexSolver *solver)
struct NvFlexBuffer NvFlexBuffer
Definition: NvFlex.h:62
float sortCellIndices
Time spent sorting grid indices.
Definition: NvFlex.h:204
int srcOffset
Definition: NvFlex.h:514
int maxParticles
Maximum number of regular particles in the solver.
Definition: NvFlex.h:367
NV_FLEX_API void NvFlexGetRestParticles(NvFlexSolver *solver, NvFlexBuffer *p, const NvFlexCopyDesc *desc)
int maxContactsPerParticle
Maximum number of collision contacts per-particle.
Definition: NvFlex.h:370
void * computeContext
Direct3D context to use for simulation, if none is specified a new context will be created...
Definition: NvFlex.h:320
float radius
The maximum interaction radius for particles.
Definition: NvFlex.h:100
NV_FLEX_API void NvFlexGetContacts(NvFlexSolver *solver, NvFlexBuffer *planes, NvFlexBuffer *velocities, NvFlexBuffer *indices, NvFlexBuffer *counts)
NvFlexBoxGeometry box
Definition: NvFlex.h:946
float * velocities
Device pointer to the active particle velocity data in the form x,y,z,w (last component is not used) ...
Definition: NvFlex.h:272
Particle will collide with shapes with channel 1 set (see NvFlexMakeShapeFlags()) ...
Definition: NvFlex.h:172
NV_FLEX_API float NvFlexGetDeviceLatency(NvFlexSolver *solver, unsigned long long *begin, unsigned long long *end, unsigned long long *frequency)
float anisotropyMin
Clamp the anisotropy scale to this fraction of the radius.
Definition: NvFlex.h:130
float applyDeltas
Time spent adding position deltas to particles.
Definition: NvFlex.h:218
NvFlexDistanceFieldId field
A signed distance field pointer created by NvFlexCreateDistanceField()
Definition: NvFlex.h:935
float calculateDensity
Time spent calculating fluid density.
Definition: NvFlex.h:211
void * userData
Definition: NvFlex.h:288
A capsule shape, see FlexCapsuleGeometry.
Definition: NvFlex.h:955
NV_FLEX_API NvFlexTriangleMeshId NvFlexCreateTriangleMesh(NvFlexLibrary *lib)
NV_FLEX_API int NvFlexGetSolvers(NvFlexLibrary *lib, NvFlexSolver **solvers, int n)
NvFlexFeatureMode featureMode
Control which features are enabled.
Definition: NvFlex.h:365
NV_FLEX_API void NvFlexShutdown(NvFlexLibrary *lib)
NvFlexSolver * solver
Pointer to the solver that the callback is registered to.
Definition: NvFlex.h:268
If set this particle will generate fluid density constraints for its overlapping neighbors.
Definition: NvFlex.h:168
NvFlexFeatureMode
Definition: NvFlex.h:353
NV_FLEX_API int NvFlexGetDistanceFields(NvFlexLibrary *lib, NvFlexDistanceFieldId *sdfs, int n)
NvFlexPhase
Definition: NvFlex.h:160
NV_FLEX_API void NvFlexUnregisterD3DBuffer(NvFlexBuffer *buf)
float sleepThreshold
Particles with a velocity magnitude < this threshold will be considered fixed.
Definition: NvFlex.h:110
NV_FLEX_API int NvFlexGetVersion()
NV_FLEX_API int NvFlexGetTriangleMeshes(NvFlexLibrary *lib, NvFlexTriangleMeshId *meshes, int n)
float anisotropyMax
Clamp the anisotropy scale to this fraction of the radius.
Definition: NvFlex.h:131
float collideTriangles
Time spent colliding triangle shapes.
Definition: NvFlex.h:209
NV_FLEX_API int NvFlexGetDetailTimers(NvFlexSolver *solver, NvFlexDetailTimer **timers)
NV_FLEX_API void NvFlexGetConvexMeshBounds(NvFlexLibrary *lib, NvFlexConvexMeshId mesh, float *lower, float *upper)
Indicates the shape is dynamic and should have lower priority over static collision shapes...
Definition: NvFlex.h:965
Calling thread will check if buffer is ready for access, if not ready then the method will return NUL...
Definition: NvFlex.h:70
NV_FLEX_API int NvFlexMakePhaseWithChannels(int group, int particleFlags, int shapeChannels)
Definition: NvFlex.h:189
NV_FLEX_API int NvFlexMakePhase(int group, int particleFlags)
Definition: NvFlex.h:194
NV_FLEX_API void NvFlexSetActive(NvFlexSolver *solver, NvFlexBuffer *indices, const NvFlexCopyDesc *desc)
float shockPropagation
Artificially decrease the mass of particles based on height from a fixed reference point...
Definition: NvFlex.h:115
NV_FLEX_API const char * NvFlexGetDeviceName(NvFlexLibrary *lib)
NV_FLEX_API void NvFlexDestroyConvexMesh(NvFlexLibrary *lib, NvFlexConvexMeshId convex)
float collideFields
Time spent colliding signed distance field shapes.
Definition: NvFlex.h:210
float calculateAnisotropy
Time spent calculating particle anisotropy for fluid.
Definition: NvFlex.h:219
Particle will collide with shapes with channel 6 set (see NvFlexMakeShapeFlags()) ...
Definition: NvFlex.h:177
NV_FLEX_API void NvFlexGetParticles(NvFlexSolver *solver, NvFlexBuffer *p, const NvFlexCopyDesc *desc)
void * renderContext
Direct3D context that the app is using for rendering. In DirectX 12 this should be a ID3D12CommandQue...
Definition: NvFlex.h:319
struct NvFlexLibrary NvFlexLibrary
Definition: NvFlex.h:52
NV_FLEX_API void NvFlexAcquireContext(NvFlexLibrary *lib)
NV_FLEX_API NvFlexLibrary * NvFlexInit(int version=NV_FLEX_VERSION, NvFlexErrorCallback errorFunc=0, NvFlexInitDesc *desc=0)
float freeSurfaceDrag
Drag force applied to boundary fluid particles.
Definition: NvFlex.h:134
NV_FLEX_API void NvFlexSetNormals(NvFlexSolver *solver, NvFlexBuffer *normals, const NvFlexCopyDesc *desc)
NvFlexSDFGeometry sdf
Definition: NvFlex.h:949
float maxAcceleration
The magnitude of particle acceleration will be clamped to this value at the end of each step (limits ...
Definition: NvFlex.h:113
float wind[3]
Constant acceleration applied to particles that belong to dynamic triangles, drag needs to be > 0 for...
Definition: NvFlex.h:120
Particle will collide with shapes with channel 5 set (see NvFlexMakeShapeFlags()) ...
Definition: NvFlex.h:176
NV_FLEX_API NvFlexSolver * NvFlexCreateSolver(NvFlexLibrary *lib, const NvFlexSolverDesc *desc)
NV_FLEX_API void NvFlexUpdateDistanceField(NvFlexLibrary *lib, NvFlexDistanceFieldId sdf, int dimx, int dimy, int dimz, NvFlexBuffer *field)
Definition: NvFlex.h:200
float surfaceTension
Controls how strongly particles attempt to minimize surface area, default: 0.0, range: [0...
Definition: NvFlex.h:126
Particle will collide with shapes with channel 0 set (see NvFlexMakeShapeFlags()) ...
Definition: NvFlex.h:171
float dt
The per-update time-step, this is the value passed to NvFlexUpdateSolver()
Definition: NvFlex.h:277
float fluidRestDistance
The distance fluid particles are spaced at the rest density, must be in the range (0...
Definition: NvFlex.h:102
float reorder
Time spent reordering particles.
Definition: NvFlex.h:206
unsigned int NvFlexDistanceFieldId
Definition: NvFlex.h:735
A triangle mesh shape, see FlexTriangleMeshGeometry.
Definition: NvFlex.h:958
If set this particle will ignore collisions with particles closer than the radius in the rest pose...
Definition: NvFlex.h:167
NV_FLEX_API void NvFlexGetTimers(NvFlexSolver *solver, NvFlexTimers *timers)
NvFlexConvexMeshId mesh
Definition: NvFlex.h:916
NV_FLEX_API void NvFlexGetRigids(NvFlexSolver *solver, NvFlexBuffer *offsets, NvFlexBuffer *indices, NvFlexBuffer *restPositions, NvFlexBuffer *restNormals, NvFlexBuffer *stiffness, NvFlexBuffer *thresholds, NvFlexBuffer *creeps, NvFlexBuffer *rotations, NvFlexBuffer *translations)
NvFlexConvexMeshGeometry convexMesh
Definition: NvFlex.h:947
NvFlexSolverCallbackStage
Definition: NvFlex.h:243
float dissipation
Damps particle velocity based on how many particle contacts it has.
Definition: NvFlex.h:116
NvFlexCollisionShapeType
Definition: NvFlex.h:952
Used only in debug version of dll.
Definition: NvFlex.h:236
NV_FLEX_API int NvFlexGetConvexMeshes(NvFlexLibrary *lib, NvFlexConvexMeshId *meshes, int n)
Use CUDA compute for Flex, the application must link against the CUDA libraries.
Definition: NvFlex.h:306
NV_FLEX_API void NvFlexUpdateConvexMesh(NvFlexLibrary *lib, NvFlexConvexMeshId convex, NvFlexBuffer *planes, int numPlanes, const float *lower, const float *upper)
NvFlexRelaxationMode relaxationMode
How the relaxation is applied inside the solver.
Definition: NvFlex.h:152
float lift
Lift force applied to particles belonging to dynamic triangles, proportional to velocity^2*area in th...
Definition: NvFlex.h:122
NV_FLEX_API void NvFlexGetDeviceAndContext(NvFlexLibrary *lib, void **device, void **context)
void * renderDevice
Direct3D device to use for simulation, if none is specified a new device and context will be created...
Definition: NvFlex.h:318
A box shape, see FlexBoxGeometry.
Definition: NvFlex.h:956
float damping
Viscous drag force, applies a force proportional, and opposite to the particle velocity.
Definition: NvFlex.h:117
NV_FLEX_API void NvFlexSetDynamicTriangles(NvFlexSolver *solver, NvFlexBuffer *indices, NvFlexBuffer *normals, int numTris)
NvFlexCollisionShapeFlags
Definition: NvFlex.h:962
int numPlanes
Num collision planes.
Definition: NvFlex.h:150
NV_FLEX_API NvFlexBuffer * NvFlexAllocBuffer(NvFlexLibrary *lib, int elementCount, int elementByteStride, NvFlexBufferType type)
Definition: NvFlex.h:95
float collideShapes
Time spent colliding convex shapes.
Definition: NvFlex.h:208
float particleFriction
Coefficient of friction used when colliding particles.
Definition: NvFlex.h:107
NV_FLEX_API void NvFlexUpdateSolver(NvFlexSolver *solver, float dt, int substeps, bool enableTimers)
float createGrid
Time spent creating grid.
Definition: NvFlex.h:205
Bits [ 0, 19] represent the particle group for controlling collisions.
Definition: NvFlex.h:162
float buoyancy
Gravity is scaled by this value for fluid particles.
Definition: NvFlex.h:135
All log types.
Definition: NvFlex.h:237
NV_FLEX_API void NvFlexSetShapes(NvFlexSolver *solver, NvFlexBuffer *geometry, NvFlexBuffer *shapePositions, NvFlexBuffer *shapeRotations, NvFlexBuffer *shapePrevPositions, NvFlexBuffer *shapePrevRotations, NvFlexBuffer *shapeFlags, int numShapes)
Use DirectX 12 compute for Flex, the application must link against the D3D libraries.
Definition: NvFlex.h:308
float scale[3]
The scale of the object from local space to world space.
Definition: NvFlex.h:924
float solveDensities
Time spent solving density constraints.
Definition: NvFlex.h:212
NV_FLEX_API void NvFlexGetSmoothParticles(NvFlexSolver *solver, NvFlexBuffer *p, const NvFlexCopyDesc *desc)
NV_FLEX_API void NvFlexGetAnisotropy(NvFlexSolver *solver, NvFlexBuffer *q1, NvFlexBuffer *q2, NvFlexBuffer *q3, const NvFlexCopyDesc *desc)
NV_FLEX_API void NvFlexDestroyTriangleMesh(NvFlexLibrary *lib, NvFlexTriangleMeshId mesh)
float gravity[3]
Constant acceleration applied to all particles.
Definition: NvFlex.h:99
Called at the end of each constraint iteration.
Definition: NvFlex.h:246
Error messages.
Definition: NvFlex.h:233
NV_FLEX_API void NvFlexFreeBuffer(NvFlexBuffer *buf)
Bits [24, 30] hold flags representing what shape collision channels particles will collide with...
Definition: NvFlex.h:164
float solveInflatables
Time spent solving pressure constraints.
Definition: NvFlex.h:217
Called at the beginning of each substep after the prediction step has been completed.
Definition: NvFlex.h:247
Simple per-particle collision (no per-particle SDF normals, no fluids)
Definition: NvFlex.h:356
Definition: NvFlex.h:314
The relaxation factor is a fixed multiplier on each constraint's position delta.
Definition: NvFlex.h:87
NV_FLEX_API void NvFlexGetVelocities(NvFlexSolver *solver, NvFlexBuffer *v, const NvFlexCopyDesc *desc)
Definition: NvFlex.h:896
float total
Sum of all timers above.
Definition: NvFlex.h:225
void * userData
Pointer to the user data provided to NvFlexRegisterSolverCallback()
Definition: NvFlex.h:269
NV_FLEX_API void NvFlexGetDensities(NvFlexSolver *solver, NvFlexBuffer *densities, const NvFlexCopyDesc *desc)
float radius
Definition: NvFlex.h:898
NV_FLEX_API void NvFlexGetDynamicTriangles(NvFlexSolver *solver, NvFlexBuffer *indices, NvFlexBuffer *normals, int numTris)
NV_FLEX_API int NvFlexMakeShapeFlags(NvFlexCollisionShapeType type, bool dynamic)
Definition: NvFlex.h:983
NV_FLEX_API NvFlexBuffer * NvFlexRegisterOGLBuffer(NvFlexLibrary *lib, int buf, int elementCount, int elementByteStride)
Definition: NvFlex.h:1182
Particle will collide with shapes with channel 2 set (see NvFlexMakeShapeFlags()) ...
Definition: NvFlex.h:173
float relaxationFactor
Control the convergence rate of the parallel solver, default: 1, values greater than 1 may lead to in...
Definition: NvFlex.h:153
NV_FLEX_API void NvFlexSetSprings(NvFlexSolver *solver, NvFlexBuffer *indices, NvFlexBuffer *restLengths, NvFlexBuffer *stiffness, int numSprings)
float finalize
Time spent finalizing state.
Definition: NvFlex.h:223
const int * sortedToOriginalMap
Device pointer that maps the original particle index to the index in the callback data structure...
Definition: NvFlex.h:280
NvFlexComputeType
Definition: NvFlex.h:304
NV_FLEX_API void NvFlexGetNeighbors(NvFlexSolver *solver, NvFlexBuffer *neighbors, NvFlexBuffer *counts, NvFlexBuffer *apiToInternal, NvFlexBuffer *internalToApi)
float dynamicFriction
Coefficient of friction used when colliding against shapes.
Definition: NvFlex.h:105
Definition: NvFlex.h:932
float scale[3]
Definition: NvFlex.h:915
Definition: NvFlex.h:285
float diffuseBuoyancy
Scales force opposing gravity that diffuse particles receive.
Definition: NvFlex.h:139
float updateBounds
Time spent updating particle bounds.
Definition: NvFlex.h:224
char * name
Definition: NvFlex.h:1184
float solidRestDistance
The distance non-fluid particles attempt to maintain from each other, must be in the range (0...
Definition: NvFlex.h:101
NV_FLEX_API void NvFlexSetSolverDescDefaults(NvFlexSolverDesc *desc)
float solidPressure
Add pressure from solid surfaces to particles.
Definition: NvFlex.h:133
float solveVelocities
Time spent solving velocity constraints.
Definition: NvFlex.h:213
Number of stages.
Definition: NvFlex.h:250
float restitution
Coefficient of restitution used when colliding against shapes, particle collisions are always inelast...
Definition: NvFlex.h:108
Definition: NvFlex.h:922
int numIterations
Number of solver iterations to perform per-substep.
Definition: NvFlex.h:97
NV_FLEX_API void NvFlexRestoreContext(NvFlexLibrary *lib)
NV_FLEX_API void NvFlexGetParams(NvFlexSolver *solver, NvFlexParams *params)
float anisotropyScale
Control how much anisotropy is present in resulting ellipsoids for rendering, if zero then anisotropy...
Definition: NvFlex.h:129
float vorticityConfinement
Increases vorticity by applying rotational forces to particles.
Definition: NvFlex.h:128
float diffuseLifetime
Time in seconds that a diffuse particle will live for after being spawned, particles will be spawned ...
Definition: NvFlex.h:142
float diffuseDrag
Scales force diffuse particles receive in direction of neighbor fluid particles.
Definition: NvFlex.h:140
NV_FLEX_API void NvFlexGetSolverDesc(NvFlexSolver *solver, NvFlexSolverDesc *desc)
float particleCollisionMargin
Increases the radius used during neighbor finding, this is useful if particles are expected to move s...
Definition: NvFlex.h:146
float diffuseThreshold
Particles with kinetic energy + divergence above this threshold will spawn new diffuse particles...
Definition: NvFlex.h:138
int elementCount
Definition: NvFlex.h:516
A device memory buffer, mapping this on CUDA will return a device memory pointer, and will return a b...
Definition: NvFlex.h:79
NV_FLEX_API void NvFlexGetSprings(NvFlexSolver *solver, NvFlexBuffer *indices, NvFlexBuffer *restLengths, NvFlexBuffer *stiffness, int numSprings)
NV_FLEX_API void NvFlexSetRestParticles(NvFlexSolver *solver, NvFlexBuffer *p, const NvFlexCopyDesc *desc)
NV_FLEX_API void NvFlexSetVelocities(NvFlexSolver *solver, NvFlexBuffer *v, const NvFlexCopyDesc *desc)
A convex mesh shape, see FlexConvexMeshGeometry.
Definition: NvFlex.h:957
float updateTriangles
Time spent updating dynamic triangles.
Definition: NvFlex.h:221
Definition: NvFlex.h:512
NvFlexBufferType
Definition: NvFlex.h:76
bool enableExtensions
Enable or disable NVIDIA/AMD extensions in DirectX, can lead to improved performance.
Definition: NvFlex.h:317
unsigned int NvFlexConvexMeshId
Definition: NvFlex.h:742