diff options
| author | Miles Macklin <[email protected]> | 2017-06-09 13:41:15 +1200 |
|---|---|---|
| committer | Miles Macklin <[email protected]> | 2017-06-09 13:41:15 +1200 |
| commit | 688b5f42e9bfe498d7af7075d4d8f4429867f3a3 (patch) | |
| tree | 7e0d0e7c95298f0418723abd92f61ac6e16b055e /demo/scenes | |
| parent | Update README.md (diff) | |
| download | flex-1.2.0.beta.1.tar.xz flex-1.2.0.beta.1.zip | |
1.2.0.beta.11.2.0.beta.1
Diffstat (limited to 'demo/scenes')
37 files changed, 310 insertions, 248 deletions
diff --git a/demo/scenes/adhesion.h b/demo/scenes/adhesion.h index efbdec2..10c614a 100644 --- a/demo/scenes/adhesion.h +++ b/demo/scenes/adhesion.h @@ -11,7 +11,6 @@ public: g_params.radius = radius; - g_params.fluid = true; g_params.numIterations = 3; g_params.vorticityConfinement = 0.0f; g_params.fluidRestDistance = g_params.radius*0.55f; diff --git a/demo/scenes/armadilloshower.h b/demo/scenes/armadilloshower.h index fdbf194..0fd2cfe 100644 --- a/demo/scenes/armadilloshower.h +++ b/demo/scenes/armadilloshower.h @@ -18,7 +18,6 @@ public: g_params.radius = radius; - g_params.fluid = true; g_params.numIterations = 3; g_params.vorticityConfinement = 0.0f; g_params.fluidRestDistance = g_params.radius*0.5f; diff --git a/demo/scenes/bouyancy.h b/demo/scenes/bouyancy.h index 816146f..9f5b0d2 100644 --- a/demo/scenes/bouyancy.h +++ b/demo/scenes/bouyancy.h @@ -34,7 +34,6 @@ public: g_params.radius = radius; g_params.dynamicFriction = 0.1f; - g_params.fluid = true; g_params.viscosity = 2.0f; g_params.numIterations = 4; g_params.vorticityConfinement = 180.f; diff --git a/demo/scenes/bunnybath.h b/demo/scenes/bunnybath.h index db9e6ac..eeec5ac 100644 --- a/demo/scenes/bunnybath.h +++ b/demo/scenes/bunnybath.h @@ -37,7 +37,6 @@ public: g_params.radius = radius; g_params.dynamicFriction = 0.01f; - g_params.fluid = true; g_params.viscosity = 2.0f; g_params.numIterations = 4; g_params.vorticityConfinement = 40.0f; diff --git a/demo/scenes/ccdfluid.h b/demo/scenes/ccdfluid.h index 356eec7..9ba018e 100644 --- a/demo/scenes/ccdfluid.h +++ b/demo/scenes/ccdfluid.h @@ -50,7 +50,6 @@ public: g_numSubsteps = 2; - g_params.fluid = true; g_params.radius = radius; g_params.fluidRestDistance = restDistance; g_params.dynamicFriction = 0.1f; diff --git a/demo/scenes/dambreak.h b/demo/scenes/dambreak.h index c2f9a40..cf45c29 100644 --- a/demo/scenes/dambreak.h +++ b/demo/scenes/dambreak.h @@ -22,7 +22,6 @@ public: g_numSubsteps = 2; - g_params.fluid = true; g_params.radius = radius; g_params.fluidRestDistance = restDistance; g_params.dynamicFriction = 0.f; diff --git a/demo/scenes/debris.h b/demo/scenes/debris.h index 39013ff..5454b76 100644 --- a/demo/scenes/debris.h +++ b/demo/scenes/debris.h @@ -112,7 +112,7 @@ public: // emit new debris int numToEmit = 1;//Rand()%8; - int particleOffset = NvFlexGetActiveCount(g_flex); + int particleOffset = NvFlexGetActiveCount(g_solver); for (int i = 0; i < numToEmit; ++i) { @@ -265,7 +265,7 @@ public: virtual void Sync() { - NvFlexSetRigids(g_flex, g_buffers->rigidOffsets.buffer, g_buffers->rigidIndices.buffer, g_buffers->rigidLocalPositions.buffer, g_buffers->rigidLocalNormals.buffer, g_buffers->rigidCoefficients.buffer, g_buffers->rigidRotations.buffer, g_buffers->rigidTranslations.buffer, g_buffers->rigidOffsets.size() - 1, g_buffers->rigidIndices.size()); + NvFlexSetRigids(g_solver, g_buffers->rigidOffsets.buffer, g_buffers->rigidIndices.buffer, g_buffers->rigidLocalPositions.buffer, g_buffers->rigidLocalNormals.buffer, g_buffers->rigidCoefficients.buffer, g_buffers->rigidPlasticThresholds.buffer, g_buffers->rigidPlasticCreeps.buffer, g_buffers->rigidRotations.buffer, g_buffers->rigidTranslations.buffer, g_buffers->rigidOffsets.size() - 1, g_buffers->rigidIndices.size()); } virtual void KeyDown(int key) @@ -303,8 +303,7 @@ public: { if (mBatches[b].mInstanceTransforms.size()) { - extern Colour gColors[]; - DrawGpuMeshInstances(mBatches[b].mMesh, &mBatches[b].mInstanceTransforms[0], mBatches[b].mInstanceTransforms.size(), Vec3(gColors[b % 8])); + DrawGpuMeshInstances(mBatches[b].mMesh, &mBatches[b].mInstanceTransforms[0], mBatches[b].mInstanceTransforms.size(), Vec3(g_colors[b % 8])); } } } diff --git a/demo/scenes/envcloth.h b/demo/scenes/envcloth.h index 7405739..50a703a 100644 --- a/demo/scenes/envcloth.h +++ b/demo/scenes/envcloth.h @@ -34,7 +34,7 @@ public: int gridz = mGridZ; int clothIndex = 0; - int phase = NvFlexMakePhase(0, eNvFlexPhaseSelfCollide); + int phase = NvFlexMakePhase(0, eNvFlexPhaseSelfCollide | eNvFlexPhaseSelfCollideFilter); for (int x=0; x < gridx; ++x) { @@ -49,6 +49,9 @@ public: } } + // only simple collision necessary + g_solverDesc.featureMode = eNvFlexFeatureModeSimpleSolids; + g_params.radius = radius*1.05f; g_params.dynamicFriction = 0.25f; g_params.dissipation = 0.0f; diff --git a/demo/scenes/fluidblock.h b/demo/scenes/fluidblock.h index 82de2cb..abf508b 100644 --- a/demo/scenes/fluidblock.h +++ b/demo/scenes/fluidblock.h @@ -45,7 +45,6 @@ public: g_params.radius = radius; g_params.dynamicFriction = 0.0f; - g_params.fluid = true; g_params.viscosity = 0.0f; g_params.numIterations = 3; g_params.vorticityConfinement = 40.f; diff --git a/demo/scenes/fluidclothcoupling.h b/demo/scenes/fluidclothcoupling.h index 403a775..d9802b0 100644 --- a/demo/scenes/fluidclothcoupling.h +++ b/demo/scenes/fluidclothcoupling.h @@ -138,7 +138,6 @@ public: g_numExtraParticles = 64*1024; g_params.radius = radius; - g_params.fluid = true; g_params.numIterations = 5; g_params.vorticityConfinement = 0.0f; g_params.anisotropyScale = 30.0f; diff --git a/demo/scenes/forcefield.h b/demo/scenes/forcefield.h index 1ffcd12..6510e87 100644 --- a/demo/scenes/forcefield.h +++ b/demo/scenes/forcefield.h @@ -40,7 +40,7 @@ public: NvFlexExtDestroyForceFieldCallback(callback); // create new callback - callback = NvFlexExtCreateForceFieldCallback(g_flex); + callback = NvFlexExtCreateForceFieldCallback(g_solver); // expand scene bounds to include force field g_sceneLower -= Vec3(1.0f); diff --git a/demo/scenes/gamemesh.h b/demo/scenes/gamemesh.h index 6de6bd0..11824db 100644 --- a/demo/scenes/gamemesh.h +++ b/demo/scenes/gamemesh.h @@ -40,7 +40,6 @@ public: g_params.radius = radius; g_params.dynamicFriction = 0.3f; g_params.dissipation = 0.0f; - g_params.fluid = false; g_params.fluidRestDistance = g_params.radius*0.5f; g_params.viscosity = 0.05f; g_params.anisotropyScale = 20.0f; @@ -73,7 +72,6 @@ public: g_params.dissipation = 0.0f; g_params.numIterations = 4; g_params.numPlanes = 1; - g_params.fluid = false; g_params.particleCollisionMargin = g_params.radius*0.1f; g_params.restitution = 0.0f; @@ -103,7 +101,6 @@ public: g_params.numIterations = 3; g_params.anisotropyScale = 30.0f; g_params.smoothing = 0.5f; - g_params.fluid = true; g_params.relaxationFactor = 1.0f; g_params.restitution = 0.0f; g_params.smoothing = 0.5f; diff --git a/demo/scenes/googun.h b/demo/scenes/googun.h index 79ff396..71d1c51 100644 --- a/demo/scenes/googun.h +++ b/demo/scenes/googun.h @@ -17,7 +17,6 @@ public: g_params.radius = radius; - g_params.fluid = true; g_params.numIterations = 3; g_params.vorticityConfinement = 0.0f; g_params.fluidRestDistance = g_params.radius*0.55f; diff --git a/demo/scenes/granularpile.h b/demo/scenes/granularpile.h index 56a85ea..d71c7a9 100644 --- a/demo/scenes/granularpile.h +++ b/demo/scenes/granularpile.h @@ -19,7 +19,7 @@ public: CreateParticleShape(GetFilePathByPlatform("../../data/sandcastle.obj").c_str(), Vec3(-2.0f, -radius*0.15f, 0.0f), 4.0f, 0.0f, radius*1.0001f, 0.0f, 1.0f, false, 0.0f, NvFlexMakePhase(0, eNvFlexPhaseSelfCollide), false, 0.00f); g_numSubsteps = 2; - + g_params.radius = radius; g_params.staticFriction = 1.0f; g_params.dynamicFriction = 0.5f; @@ -37,9 +37,8 @@ public: g_drawPoints = true; g_warmup = false; - // hack, change the color of phase 0 particles to 'sand' - extern Colour gColors[]; - gColors[0] = Colour(0.805f, 0.702f, 0.401f); + // hack, change the color of phase 0 particles to 'sand' + g_colors[0] = Colour(0.805f, 0.702f, 0.401f); } void Update() diff --git a/demo/scenes/granularshape.h b/demo/scenes/granularshape.h index 6d21738..b07581d 100644 --- a/demo/scenes/granularshape.h +++ b/demo/scenes/granularshape.h @@ -27,8 +27,7 @@ public: g_numSubsteps = 3; - extern Colour gColors[]; - gColors[1] = Colour(0.805f, 0.702f, 0.401f); + g_colors[1] = Colour(0.805f, 0.702f, 0.401f); // draw options g_drawPoints = true; diff --git a/demo/scenes/inflatable.h b/demo/scenes/inflatable.h index 58f5f08..b3e97f6 100644 --- a/demo/scenes/inflatable.h +++ b/demo/scenes/inflatable.h @@ -135,7 +135,7 @@ public: virtual void Sync() { - NvFlexSetInflatables(g_flex, g_buffers->inflatableTriOffsets.buffer, g_buffers->inflatableTriCounts.buffer, g_buffers->inflatableVolumes.buffer, g_buffers->inflatablePressures.buffer, g_buffers->inflatableCoefficients.buffer, mCloths.size()); + NvFlexSetInflatables(g_solver, g_buffers->inflatableTriOffsets.buffer, g_buffers->inflatableTriCounts.buffer, g_buffers->inflatableVolumes.buffer, g_buffers->inflatablePressures.buffer, g_buffers->inflatableCoefficients.buffer, mCloths.size()); } virtual void Draw(int pass) diff --git a/demo/scenes/lighthouse.h b/demo/scenes/lighthouse.h index e4b410a..41e5d2f 100644 --- a/demo/scenes/lighthouse.h +++ b/demo/scenes/lighthouse.h @@ -23,7 +23,6 @@ public: g_params.radius = radius; g_params.dynamicFriction = 0.f; - g_params.fluid = true; g_params.viscosity = 0.01f; g_params.numIterations = 3; g_params.vorticityConfinement = 50.0f; diff --git a/demo/scenes/localspacecloth.h b/demo/scenes/localspacecloth.h index f28912e..1030f8b 100644 --- a/demo/scenes/localspacecloth.h +++ b/demo/scenes/localspacecloth.h @@ -65,7 +65,6 @@ public: g_numSubsteps = 2; - g_params.fluid = false; g_params.radius = radius; g_params.dynamicFriction = 0.f; g_params.restitution = 0.0f; diff --git a/demo/scenes/localspacefluid.h b/demo/scenes/localspacefluid.h index 494249a..7bcbd8b 100644 --- a/demo/scenes/localspacefluid.h +++ b/demo/scenes/localspacefluid.h @@ -46,7 +46,6 @@ public: g_numSubsteps = 2; - g_params.fluid = true; g_params.radius = radius; g_params.fluidRestDistance = restDistance; g_params.dynamicFriction = 0.f; diff --git a/demo/scenes/lowdimensionalshapes.h b/demo/scenes/lowdimensionalshapes.h index 5d32ea5..3c91394 100644 --- a/demo/scenes/lowdimensionalshapes.h +++ b/demo/scenes/lowdimensionalshapes.h @@ -21,7 +21,6 @@ public: g_params.radius = radius; g_params.dynamicFriction = 1.0f; - g_params.fluid = false; g_params.fluidRestDistance = radius; g_params.viscosity = 0.0f; g_params.numIterations = 4; diff --git a/demo/scenes/melting.h b/demo/scenes/melting.h index c7da792..f8d7083 100644 --- a/demo/scenes/melting.h +++ b/demo/scenes/melting.h @@ -13,7 +13,6 @@ public: g_params.dynamicFriction = 0.25f; g_params.dissipation = 0.0f; g_params.viscosity = 0.0f; - g_params.fluid = true; g_params.cohesion = 0.0f; g_params.fluidRestDistance = g_params.radius*0.6f; g_params.anisotropyScale = 4.0f / g_params.radius; @@ -63,7 +62,7 @@ public: virtual void Sync() { - NvFlexSetRigids(g_flex, g_buffers->rigidOffsets.buffer, g_buffers->rigidIndices.buffer, g_buffers->rigidLocalPositions.buffer, g_buffers->rigidLocalNormals.buffer, g_buffers->rigidCoefficients.buffer, g_buffers->rigidRotations.buffer, g_buffers->rigidTranslations.buffer, g_buffers->rigidOffsets.size() - 1, g_buffers->rigidIndices.size()); + NvFlexSetRigids(g_solver, g_buffers->rigidOffsets.buffer, g_buffers->rigidIndices.buffer, g_buffers->rigidLocalPositions.buffer, g_buffers->rigidLocalNormals.buffer, g_buffers->rigidCoefficients.buffer, g_buffers->rigidPlasticThresholds.buffer, g_buffers->rigidPlasticCreeps.buffer, g_buffers->rigidRotations.buffer, g_buffers->rigidTranslations.buffer, g_buffers->rigidOffsets.size() - 1, g_buffers->rigidIndices.size()); } int mFrame; diff --git a/demo/scenes/mixedpile.h b/demo/scenes/mixedpile.h index 61bc5a5..35333ff 100644 --- a/demo/scenes/mixedpile.h +++ b/demo/scenes/mixedpile.h @@ -186,7 +186,6 @@ public: g_params.shockPropagation = 0.0f; g_params.restitution = 0.0f; g_params.collisionDistance = g_params.radius*0.5f; - g_params.fluid = false; g_params.maxSpeed = 2.0f*g_params.radius*g_numSubsteps/g_dt; // separte solid particle count @@ -207,13 +206,13 @@ public: g_emitters[0].mSpeed = (g_params.radius*0.5f/g_dt); g_emitters[0].mSpeed = (g_params.radius/g_dt); - extern Colour gColors[]; - gColors[0] = Colour(0.805f, 0.702f, 0.401f); + extern Colour g_colors[]; + g_colors[0] = Colour(0.805f, 0.702f, 0.401f); } virtual void Update() { - NvFlexSetInflatables(g_flex, &mTriOffset[0], &mTriCount[0], &mRestVolume[0], &mOverPressure[0], &mConstraintScale[0], mCloths.size(), eFlexMemoryHost); + NvFlexSetInflatables(g_solver, &mTriOffset[0], &mTriCount[0], &mRestVolume[0], &mOverPressure[0], &mConstraintScale[0], mCloths.size(), eFlexMemoryHost); } int mHeight; diff --git a/demo/scenes/parachutingbunnies.h b/demo/scenes/parachutingbunnies.h index 04f2052..bfb18bb 100644 --- a/demo/scenes/parachutingbunnies.h +++ b/demo/scenes/parachutingbunnies.h @@ -124,7 +124,6 @@ public: } } - g_params.fluid = true; g_params.radius = 0.1f; g_params.fluidRestDistance = radius; g_params.numIterations = 4; diff --git a/demo/scenes/plasticstack.h b/demo/scenes/plasticstack.h deleted file mode 100644 index e1543ca..0000000 --- a/demo/scenes/plasticstack.h +++ /dev/null @@ -1,50 +0,0 @@ - -class PlasticStack : public Scene -{ -public: - - PlasticStack(const char* name) : Scene(name) {} - - virtual void Initialize() - { - g_params.radius = 0.225f; - - g_params.numIterations = 2; - g_params.dynamicFriction = 0.5f; - g_params.particleFriction = 0.15f; - g_params.dissipation = 0.0f; - g_params.viscosity = 0.0f; - - AddPlinth(); - - const float rotation = -kPi*0.5f; - const float spacing = g_params.radius*0.5f; - - // alternative box and sphere shapes - const char* mesh[] = - { - "../../data/box_high.ply", - "../../data/sphere.ply" - }; - - Vec3 lower = Vec3(4.0f, 1.0f, 0.0f); - float sizeInc = 0.0f; - float size = 1.0f; - int group = 0; - - for (int i=0; i < 8; ++i) - { - CreateParticleShape(GetFilePathByPlatform(mesh[i%2]).c_str(), lower, size + i*sizeInc, rotation, spacing, Vec3(.0f, 0.0f, 0.0f), 1.0f, true, 1.0f, NvFlexMakePhase(group++, 0), true, 0.0f, 0.0f, g_params.radius*0.5f); - - lower += Vec3(0.0f, size + i*sizeInc + 0.2f, 0.0f); - } - - g_params.plasticThreshold = 0.00025f; - g_params.plasticCreep = 0.165f; - - g_numSubsteps = 4; - - // draw options - g_drawPoints = false; - } -}; diff --git a/demo/scenes/player.h b/demo/scenes/player.h index 83407ac..46f4ca5 100644 --- a/demo/scenes/player.h +++ b/demo/scenes/player.h @@ -40,7 +40,7 @@ public: { g_buffers->activeIndices = mInitialActive; - NvFlexSetActive(g_flex, &mInitialActive[0], mInitialActive.size(), eFlexMemoryHost); + NvFlexSetActive(g_solver, &mInitialActive[0], mInitialActive.size(), eFlexMemoryHost); } virtual Matrix44 GetBasis() @@ -166,6 +166,8 @@ public: ReadArray(g_buffers->rigidLocalNormals, true); ReadArray(g_buffers->rigidCoefficients, true); + ReadArray(g_buffers->rigidPlasticThresholds, true); + ReadArray(g_buffers->rigidPlasticCreeps, true); ReadArray(g_buffers->rigidOffsets, true); ReadArray(g_buffers->rigidRotations, true); ReadArray(g_buffers->rigidTranslations, true); diff --git a/demo/scenes/rayleightaylor.h b/demo/scenes/rayleightaylor.h index f07fb46..b4f7ebd 100644 --- a/demo/scenes/rayleightaylor.h +++ b/demo/scenes/rayleightaylor.h @@ -31,7 +31,6 @@ public: g_params.gravity[1] = -9.f; g_params.radius = radius; g_params.dynamicFriction = 0.00f; - g_params.fluid = true; g_params.viscosity = 2.0f; g_params.numIterations = 10; g_params.vorticityConfinement = 0.0f; @@ -109,7 +108,6 @@ public: g_params.gravity[1] = -9.f; g_params.radius = radius; g_params.dynamicFriction = 0.00f; - g_params.fluid = true; g_params.viscosity = 0.0f; g_params.numIterations = 10; g_params.vorticityConfinement = 0.0f; diff --git a/demo/scenes/rigidfluidcoupling.h b/demo/scenes/rigidfluidcoupling.h index b978eb8..0bde7d9 100644 --- a/demo/scenes/rigidfluidcoupling.h +++ b/demo/scenes/rigidfluidcoupling.h @@ -43,13 +43,12 @@ public: g_params.radius = radius; g_params.dynamicFriction = 0.5f; - g_params.fluid = true; g_params.viscosity = 0.1f; g_params.numIterations = 3; g_params.vorticityConfinement = 0.0f; g_params.anisotropyScale = 25.0f; - g_params.fluidRestDistance = g_params.radius*0.55f; - + g_params.fluidRestDistance = g_params.radius*0.55f; + g_params.solidRestDistance = g_params.radius*0.5f; g_emitters[0].mEnabled = true; g_emitters[0].mSpeed = 2.0f*(g_params.fluidRestDistance)/g_dt; diff --git a/demo/scenes/rigidrotation.h b/demo/scenes/rigidrotation.h index 8abcb98..6d2e1d7 100644 --- a/demo/scenes/rigidrotation.h +++ b/demo/scenes/rigidrotation.h @@ -12,9 +12,9 @@ public: { float radius = 0.1f; - float dimx = 1.0f; - float dimy = 5.0f; - float dimz = 1.0f; + float dimx = 3.0f; + float dimy = 3.0f; + float dimz = 3.0f; CreateParticleShape(GetFilePathByPlatform("../../data/box.ply").c_str(), Vec3(0.0f, 1.0f, 0.0f), Vec3(dimx, dimy, dimz)*radius, 0.0f, radius, Vec3(0.0f), 1.0f, true, 1.0f, 0, true, 0.0f, 0.0f, 0.0f); @@ -22,7 +22,7 @@ public: g_params.gravity[1] = 0; g_params.numIterations = 1; - g_numSubsteps = 1; + g_numSubsteps = 3; g_pause = true; @@ -39,17 +39,19 @@ public: Vec3 center = (lower + upper)*0.5f; - Matrix44 rotation = RotationMatrix(DegToRad(95.0f), Vec3(0.0f, 0.0f, 1.0f)); + //Matrix44 rotation = RotationMatrix(DegToRad(40.0f), Vec3(0.0f, 0.0f, 1.0f)); for (int i = 0; i < int(g_buffers->positions.size()); ++i) { Vec3 delta = Vec3(g_buffers->positions[i]) - center; - delta = Vec3(rotation*Vec4(delta, 1.0f)); + //delta = Vec3(rotation*Vec4(delta, 1.0f)); - g_buffers->positions[i].x = center.x + delta.x; - g_buffers->positions[i].y = center.y + delta.y; - g_buffers->positions[i].z = center.z + delta.z; + //g_buffers->positions[i].x = center.x + delta.x; + //g_buffers->positions[i].y = center.y + delta.y; + //g_buffers->positions[i].z = center.z + delta.z; + + g_buffers->velocities[i] = Cross(delta, Vec3(0.0f, 0.0f, 1.0f))*10.0f; } } } diff --git a/demo/scenes/rockpool.h b/demo/scenes/rockpool.h index e7c0034..f596de2 100644 --- a/demo/scenes/rockpool.h +++ b/demo/scenes/rockpool.h @@ -21,11 +21,12 @@ public: CreateParticleGrid(Vec3(0.0f, radius*0.5f, -1.0f), 32, 32, 32, radius*0.55f, Vec3(0.0f), 1.0f, false, 0.0f, NvFlexMakePhase(0, eNvFlexPhaseSelfCollide | eNvFlexPhaseFluid), 0.005f); + g_solverDesc.featureMode = eNvFlexFeatureModeSimpleFluids; + g_numSubsteps = 2; g_params.radius = radius; g_params.dynamicFriction = 0.00f; - g_params.fluid = true; g_params.viscosity = 0.01f; g_params.numIterations = 2; g_params.vorticityConfinement = 75.0f; diff --git a/demo/scenes/shapechannels.h b/demo/scenes/shapechannels.h new file mode 100644 index 0000000..22ee649 --- /dev/null +++ b/demo/scenes/shapechannels.h @@ -0,0 +1,48 @@ + + +// demonstrates how to make particles collide with +// selected collision shapes based on the channel mask +class ShapeChannels : public Scene +{ +public: + + ShapeChannels(const char* name) : Scene(name) {} + + void Initialize() + { + const float radius = 0.05f; + + Vec3 offset = Vec3(-0.25f, 6.0f, -0.25f); + + // layers of particles each set to collide with a different shape channel + int numLayers = 8; + + for (int i=0; i < numLayers; ++i) + { + CreateParticleGrid(offset + Vec3(0.0f, 2.0f*i*radius, 0.0f), 10, 1, 10, radius, Vec3(0.0f), 1.0f, false, 0.0f, NvFlexMakePhaseWithChannels(i, eNvFlexPhaseSelfCollide, eNvFlexPhaseShapeChannel0<<i), 0.0f); + //CreateParticleGrid(offset + Vec3(0.0f, 2.0f*radius, 0.0f), 10, 1, 10, radius, Vec3(0.0f), 1.0f, false, 0.0f, NvFlexMakePhaseWithChannels(0, eNvFlexPhaseSelfCollide, eNvFlexPhaseShapeChannel1), 0.0f); + //CreateParticleGrid(offset + Vec3(0.0f, 4.0f*radius, 0.0f), 10, 1, 10, radius, Vec3(0.0f), 1.0f, false, 0.0f, NvFlexMakePhaseWithChannels(0, eNvFlexPhaseSelfCollide, eNvFlexPhaseShapeChannel2), 0.0f); + + AddBox(Vec3(0.5f, 0.1f, 0.5f), Vec3(0.0f, 0.5f + i*0.5f, 0.0f), Quat(), false, eNvFlexPhaseShapeChannel0<<i); + } + + // regular box + //AddBox(Vec3(0.5f, 0.1f, 0.5f), Vec3(0.0f, 0.5f, 0.0f), Quat(), false, eNvFlexPhaseShapeChannel0); + //AddBox(Vec3(0.5f, 0.1f, 0.5f), Vec3(0.0f, 1.0f, 0.0f), Quat(), false, eNvFlexPhaseShapeChannel1); + //AddBox(Vec3(0.5f, 0.1f, 0.5f), Vec3(0.0f, 1.5f, 0.0f), Quat(), false, eNvFlexPhaseShapeChannel2); + + g_params.radius = radius; + g_params.dynamicFriction = 0.025f; + g_params.dissipation = 0.0f; + g_params.restitution = 0.0; + g_params.numIterations = 4; + g_params.particleCollisionMargin = g_params.radius*0.05f; + + g_numSubsteps = 1; + } + + virtual void Update() + { + + } +};
\ No newline at end of file diff --git a/demo/scenes/softbody.h b/demo/scenes/softbody.h index c12680c..265626b 100644 --- a/demo/scenes/softbody.h +++ b/demo/scenes/softbody.h @@ -2,51 +2,145 @@ class SoftBody : public Scene { -public: - SoftBody(const char* name, const char* mesh) : +public: + SoftBody(const char* name) : Scene(name), - mFile(mesh), - mScale(2.0f), - mOffset(0.0f, 1.0f, 0.0f), mRadius(0.1f), - mClusterSpacing(1.0f), - mClusterRadius(0.0f), - mClusterStiffness(0.5f), - mLinkRadius(0.0f), - mLinkStiffness(1.0f), - mGlobalStiffness(0.0f), - mSurfaceSampling(0.0f), - mVolumeSampling(4.0f), - mSkinningFalloff(2.0f), - mSkinningMaxDistance(100.0f), - mPlasticThreshold(0.0f), - mPlasticCreep(0.0f), mRelaxationFactor(1.0f), - mPlinth(false) + mPlinth(false), + plasticDeformation(false) { - mStack[0] = 1; - mStack[1] = 1; - mStack[2] = 1; + const Vec3 colorPicker[7] = + { + Vec3(0.0f, 0.5f, 1.0f), + Vec3(0.797f, 0.354f, 0.000f), + Vec3(0.000f, 0.349f, 0.173f), + Vec3(0.875f, 0.782f, 0.051f), + Vec3(0.01f, 0.170f, 0.453f), + Vec3(0.673f, 0.111f, 0.000f), + Vec3(0.612f, 0.194f, 0.394f) + }; + memcpy(mColorPicker, colorPicker, sizeof(Vec3) * 7); + } + + float mRadius; + float mRelaxationFactor; + bool mPlinth; + + Vec3 mColorPicker[7]; + + struct Instance + { + Instance(const char* mesh) : + + mFile(mesh), + mColor(0.5f, 0.5f, 1.0f), + + mScale(2.0f), + mTranslation(0.0f, 1.0f, 0.0f), + + mClusterSpacing(1.0f), + mClusterRadius(0.0f), + mClusterStiffness(0.5f), + + mLinkRadius(0.0f), + mLinkStiffness(1.0f), + + mGlobalStiffness(0.0f), + + mSurfaceSampling(0.0f), + mVolumeSampling(4.0f), + + mSkinningFalloff(2.0f), + mSkinningMaxDistance(100.0f), + + mClusterPlasticThreshold(0.0f), + mClusterPlasticCreep(0.0f) + {} + + const char* mFile; + Vec3 mColor; + + Vec3 mScale; + Vec3 mTranslation; + + float mClusterSpacing; + float mClusterRadius; + float mClusterStiffness; + + float mLinkRadius; + float mLinkStiffness; + + float mGlobalStiffness; + + float mSurfaceSampling; + float mVolumeSampling; + + float mSkinningFalloff; + float mSkinningMaxDistance; + + float mClusterPlasticThreshold; + float mClusterPlasticCreep; + }; + + std::vector<Instance> mInstances; + +private: + + struct RenderingInstance + { + Mesh* mMesh; + std::vector<int> mSkinningIndices; + std::vector<float> mSkinningWeights; + vector<Vec3> mRigidRestPoses; + Vec3 mColor; + int mOffset; + }; + + std::vector<RenderingInstance> mRenderingInstances; + + bool plasticDeformation; + + +public: + virtual void AddInstance(Instance instance) + { + this->mInstances.push_back(instance); + } + + virtual void AddStack(Instance instance, int xStack, int yStack, int zStack, bool rotateColors = false) + { + Vec3 translation = instance.mTranslation; + for (int x = 0; x < xStack; ++x) + { + for (int y = 0; y < yStack; ++y) + { + for (int z = 0; z < zStack; ++z) + { + instance.mTranslation = translation + Vec3(x*(instance.mScale.x + 1), y*(instance.mScale.y + 1), z*(instance.mScale.z + 1))*mRadius; + if (rotateColors) { + instance.mColor = mColorPicker[(x*yStack*zStack + y*zStack + z) % 7]; + } + this->mInstances.push_back(instance); + } + } + } } virtual void Initialize() { float radius = mRadius; + // no fluids or sdf based collision + g_solverDesc.featureMode = eNvFlexFeatureModeSimpleSolids; + g_params.radius = radius; g_params.dynamicFriction = 0.35f; g_params.particleFriction = 0.25f; - g_params.dissipation = 0.0f; g_params.numIterations = 4; - g_params.viscosity = 0.0f; - g_params.drag = 0.0f; - g_params.lift = 0.0f; g_params.collisionDistance = radius*0.75f; - g_params.plasticThreshold = mPlasticThreshold; - g_params.plasticCreep = mPlasticCreep; - g_params.relaxationFactor = mRelaxationFactor; g_windStrength = 0.0f; @@ -61,14 +155,14 @@ public: g_buffers->rigidOffsets.push_back(0); - mInstances.resize(0); + mRenderingInstances.resize(0); + // build soft bodies + for (int i = 0; i < int(mInstances.size()); i++) + CreateSoftBody(mInstances[i], mRenderingInstances.size()); - CreateBodies(); - - if (mPlinth) { + if (mPlinth) AddPlinth(); - } // fix any particles below the ground plane in place for (int i = 0; i < int(g_buffers->positions.size()); ++i) @@ -81,73 +175,60 @@ public: g_lightDistance *= 1.5f; } - virtual void CreateBodies() + void CreateSoftBody(Instance instance, int group = 0) { - // build soft body - for (int x = 0; x < mStack[0]; ++x) - { - for (int y = 0; y < mStack[1]; ++y) - { - for (int z = 0; z < mStack[2]; ++z) - { - CreateSoftBody(mRadius, mOffset + Vec3(x*(mScale.x + 1), y*(mScale.y + 1), z*(mScale.z + 1))*mRadius, mClusterStiffness, mInstances.size()); - } - } - } - } - - void CreateSoftBody(float radius, Vec3 position, float clusterStiffness, int group = 0) - { - Instance instance; + RenderingInstance renderingInstance; - Mesh* mesh = ImportMesh(GetFilePathByPlatform(mFile).c_str()); + Mesh* mesh = ImportMesh(GetFilePathByPlatform(instance.mFile).c_str()); mesh->Normalize(); - mesh->Transform(TranslationMatrix(Point3(position))*ScaleMatrix(mScale*radius)); + mesh->Transform(TranslationMatrix(Point3(instance.mTranslation))*ScaleMatrix(instance.mScale*mRadius)); - instance.mMesh = mesh; - instance.mColor = Vec3(0.5f, 0.5f, 1.0f); - instance.mOffset = g_buffers->rigidTranslations.size(); + renderingInstance.mMesh = mesh; + renderingInstance.mColor = instance.mColor; + renderingInstance.mOffset = g_buffers->rigidTranslations.size(); double createStart = GetSeconds(); // create soft body definition NvFlexExtAsset* asset = NvFlexExtCreateSoftFromMesh( - (float*)&instance.mMesh->m_positions[0], - instance.mMesh->m_positions.size(), - (int*)&instance.mMesh->m_indices[0], - instance.mMesh->m_indices.size(), - radius, - mVolumeSampling, - mSurfaceSampling, - mClusterSpacing*radius, - mClusterRadius*radius, - clusterStiffness, - mLinkRadius*radius, - mLinkStiffness, - mGlobalStiffness); + (float*)&renderingInstance.mMesh->m_positions[0], + renderingInstance.mMesh->m_positions.size(), + (int*)&renderingInstance.mMesh->m_indices[0], + renderingInstance.mMesh->m_indices.size(), + mRadius, + instance.mVolumeSampling, + instance.mSurfaceSampling, + instance.mClusterSpacing*mRadius, + instance.mClusterRadius*mRadius, + instance.mClusterStiffness, + instance.mLinkRadius*mRadius, + instance.mLinkStiffness, + instance.mGlobalStiffness, + instance.mClusterPlasticThreshold, + instance.mClusterPlasticCreep); double createEnd = GetSeconds(); // create skinning const int maxWeights = 4; - instance.mSkinningIndices.resize(instance.mMesh->m_positions.size()*maxWeights); - instance.mSkinningWeights.resize(instance.mMesh->m_positions.size()*maxWeights); + renderingInstance.mSkinningIndices.resize(renderingInstance.mMesh->m_positions.size()*maxWeights); + renderingInstance.mSkinningWeights.resize(renderingInstance.mMesh->m_positions.size()*maxWeights); for (int i = 0; i < asset->numShapes; ++i) - instance.mRigidRestPoses.push_back(Vec3(&asset->shapeCenters[i * 3])); + renderingInstance.mRigidRestPoses.push_back(Vec3(&asset->shapeCenters[i * 3])); double skinStart = GetSeconds(); NvFlexExtCreateSoftMeshSkinning( - (float*)&instance.mMesh->m_positions[0], - instance.mMesh->m_positions.size(), + (float*)&renderingInstance.mMesh->m_positions[0], + renderingInstance.mMesh->m_positions.size(), asset->shapeCenters, asset->numShapes, - mSkinningFalloff, - mSkinningMaxDistance, - &instance.mSkinningWeights[0], - &instance.mSkinningIndices[0]); + instance.mSkinningFalloff, + instance.mSkinningMaxDistance, + &renderingInstance.mSkinningWeights[0], + &renderingInstance.mSkinningIndices[0]); double skinEnd = GetSeconds(); @@ -178,6 +259,52 @@ public: g_buffers->rigidCoefficients.push_back(asset->shapeCoefficients[i]); } + + // add plastic deformation data to solver, if at least one asset has non-zero plastic deformation coefficients, leave the according pointers at NULL otherwise + if (plasticDeformation) + { + if (asset->shapePlasticThresholds && asset->shapePlasticCreeps) + { + for (int i = 0; i < asset->numShapes; ++i) + { + g_buffers->rigidPlasticThresholds.push_back(asset->shapePlasticThresholds[i]); + g_buffers->rigidPlasticCreeps.push_back(asset->shapePlasticCreeps[i]); + } + } + else + { + for (int i = 0; i < asset->numShapes; ++i) + { + g_buffers->rigidPlasticThresholds.push_back(0.0f); + g_buffers->rigidPlasticCreeps.push_back(0.0f); + } + } + } + else + { + if (asset->shapePlasticThresholds && asset->shapePlasticCreeps) + { + int oldBufferSize = g_buffers->rigidCoefficients.size() - asset->numShapes; + + g_buffers->rigidPlasticThresholds.resize(oldBufferSize); + g_buffers->rigidPlasticCreeps.resize(oldBufferSize); + + for (int i = 0; i < oldBufferSize; i++) + { + g_buffers->rigidPlasticThresholds[i] = 0.0f; + g_buffers->rigidPlasticCreeps[i] = 0.0f; + } + + for (int i = 0; i < asset->numShapes; ++i) + { + g_buffers->rigidPlasticThresholds.push_back(asset->shapePlasticThresholds[i]); + g_buffers->rigidPlasticCreeps.push_back(asset->shapePlasticCreeps[i]); + } + + plasticDeformation = true; + } + } + // add link data to the solver for (int i = 0; i < asset->numSprings; ++i) { @@ -190,7 +317,7 @@ public: NvFlexExtDestroyAsset(asset); - mInstances.push_back(instance); + mRenderingInstances.push_back(renderingInstance); } virtual void Draw(int pass) @@ -198,9 +325,9 @@ public: if (!g_drawMesh) return; - for (int s = 0; s < int(mInstances.size()); ++s) + for (int s = 0; s < int(mRenderingInstances.size()); ++s) { - const Instance& instance = mInstances[s]; + const RenderingInstance& instance = mRenderingInstances[s]; Mesh m; m.m_positions.resize(instance.mMesh->m_positions.size()); @@ -239,58 +366,15 @@ public: DrawMesh(&m, instance.mColor); } } - - struct Instance - { - Mesh* mMesh; - std::vector<int> mSkinningIndices; - std::vector<float> mSkinningWeights; - vector<Vec3> mRigidRestPoses; - Vec3 mColor; - int mOffset; - }; - - std::vector<Instance> mInstances; - - const char* mFile; - Vec3 mScale; - Vec3 mOffset; - - float mRadius; - - float mClusterSpacing; - float mClusterRadius; - float mClusterStiffness; - - float mLinkRadius; - float mLinkStiffness; - - float mGlobalStiffness; - - float mSurfaceSampling; - float mVolumeSampling; - - float mSkinningFalloff; - float mSkinningMaxDistance; - - float mPlasticThreshold; - float mPlasticCreep; - - float mRelaxationFactor; - - bool mPlinth; - - int mStack[3]; }; - - class SoftBodyFixed : public SoftBody { public: - SoftBodyFixed(const char* name, const char* mesh) : SoftBody(name, mesh) {} + SoftBodyFixed(const char* name) : SoftBody(name) + {} virtual void Initialize() { @@ -302,16 +386,16 @@ public: g_buffers->positions[i].w = 0.0f; } - virtual void CreateBodies() + virtual void AddStack(Instance instance, int zStack) { - int x = 0; - int y = 0; + float clusterStiffness = instance.mClusterStiffness; + Vec3 translation = instance.mTranslation; - for (int z = 0; z < 4; ++z) + for (int z = 0; z < zStack; ++z) { - float stiffness = sqr(mClusterStiffness*(z + 1)); - - CreateSoftBody(mRadius, mOffset + Vec3(x*(mScale.x + 1), y*(mScale.y + 1), -z*(mScale.z + 1))*mRadius, stiffness, mInstances.size()); + instance.mClusterStiffness = sqr(clusterStiffness*(z + 1)); + instance.mTranslation = translation + Vec3(0.0f, 0.0f, -z*(instance.mScale.z + 1))*mRadius; + this->mInstances.push_back(instance); } } @@ -322,4 +406,4 @@ public: (Vec4&)g_params.planes[1] = Vec4(1.0f, 0.0f, 0.0f, 0.0f); g_params.numPlanes = 2; } -}; +};
\ No newline at end of file diff --git a/demo/scenes/surfacetension.h b/demo/scenes/surfacetension.h index b22ad6d..60f1836 100644 --- a/demo/scenes/surfacetension.h +++ b/demo/scenes/surfacetension.h @@ -17,7 +17,6 @@ public: g_params.radius = radius; - g_params.fluid = true; g_params.numIterations = 3; g_params.vorticityConfinement = 0.0f; g_params.fluidRestDistance = restDistance; diff --git a/demo/scenes/tearing.h b/demo/scenes/tearing.h index c36ca7a..ce9dacc 100644 --- a/demo/scenes/tearing.h +++ b/demo/scenes/tearing.h @@ -123,9 +123,9 @@ public: virtual void Sync() { // update solver data not already updated in the main loop - NvFlexSetSprings(g_flex, g_buffers->springIndices.buffer, g_buffers->springLengths.buffer, g_buffers->springStiffness.buffer, g_buffers->springLengths.size()); - NvFlexSetDynamicTriangles(g_flex, g_buffers->triangles.buffer, g_buffers->triangleNormals.buffer, g_buffers->triangles.size() / 3); - NvFlexSetRestParticles(g_flex, g_buffers->restPositions.buffer, g_buffers->restPositions.size()); + NvFlexSetSprings(g_solver, g_buffers->springIndices.buffer, g_buffers->springLengths.buffer, g_buffers->springStiffness.buffer, g_buffers->springLengths.size()); + NvFlexSetDynamicTriangles(g_solver, g_buffers->triangles.buffer, g_buffers->triangleNormals.buffer, g_buffers->triangles.size() / 3); + NvFlexSetRestParticles(g_solver, g_buffers->restPositions.buffer, NULL); } NvFlexExtAsset* mCloth; diff --git a/demo/scenes/thinbox.h b/demo/scenes/thinbox.h index a77f258..d9005c9 100644 --- a/demo/scenes/thinbox.h +++ b/demo/scenes/thinbox.h @@ -47,7 +47,6 @@ public: g_params.gravity[1] = -9.f; g_params.radius = radius; g_params.dynamicFriction = 0.0f; - g_params.fluid = false; g_params.numIterations = 5; g_params.numPlanes = 1; g_params.restitution = 0.0f; diff --git a/demo/scenes/triggervolume.h b/demo/scenes/triggervolume.h index 0e4c1a4..8c078de 100644 --- a/demo/scenes/triggervolume.h +++ b/demo/scenes/triggervolume.h @@ -45,14 +45,14 @@ public: NvFlexVector<int> contactIndices(g_flexLib, g_buffers->positions.size()); NvFlexVector<unsigned int> contactCounts(g_flexLib, g_buffers->positions.size()); - NvFlexGetContacts(g_flex, contactPlanes.buffer, contactVelocities.buffer, contactIndices.buffer, contactCounts.buffer); + NvFlexGetContacts(g_solver, contactPlanes.buffer, contactVelocities.buffer, contactIndices.buffer, contactCounts.buffer); contactPlanes.map(); contactVelocities.map(); contactIndices.map(); contactCounts.map(); - int activeCount = NvFlexGetActiveCount(g_flex); + int activeCount = NvFlexGetActiveCount(g_solver); for (int i = 0; i < activeCount; ++i) { diff --git a/demo/scenes/viscosity.h b/demo/scenes/viscosity.h index 0615855..52db6d5 100644 --- a/demo/scenes/viscosity.h +++ b/demo/scenes/viscosity.h @@ -10,9 +10,10 @@ public: float radius = 0.1f; float restDistance = radius*0.5f; + g_solverDesc.featureMode = eNvFlexFeatureModeSimpleFluids; + g_params.radius = radius; - g_params.fluid = true; g_params.numIterations = 3; g_params.vorticityConfinement = 0.0f; g_params.fluidRestDistance = restDistance; diff --git a/demo/scenes/waterballoon.h b/demo/scenes/waterballoon.h index 544bf78..0e59f40 100644 --- a/demo/scenes/waterballoon.h +++ b/demo/scenes/waterballoon.h @@ -88,8 +88,6 @@ public: g_params.collisionDistance = 0.01f; g_params.solidPressure = 0.0f; - g_params.fluid = true; - g_params.fluidRestDistance = radius*0.65f; g_params.viscosity = 0.0; g_params.adhesion = 0.0f; @@ -190,11 +188,11 @@ public: virtual void Sync() { // send new particle data to the GPU - NvFlexSetRestParticles(g_flex, g_buffers->restPositions.buffer, g_buffers->restPositions.size()); + NvFlexSetRestParticles(g_solver, g_buffers->restPositions.buffer, NULL); // update solver - NvFlexSetSprings(g_flex, g_buffers->springIndices.buffer, g_buffers->springLengths.buffer, g_buffers->springStiffness.buffer, g_buffers->springLengths.size()); - NvFlexSetDynamicTriangles(g_flex, g_buffers->triangles.buffer, g_buffers->triangleNormals.buffer, g_buffers->triangles.size() / 3); + NvFlexSetSprings(g_solver, g_buffers->springIndices.buffer, g_buffers->springLengths.buffer, g_buffers->springStiffness.buffer, g_buffers->springLengths.size()); + NvFlexSetDynamicTriangles(g_solver, g_buffers->triangles.buffer, g_buffers->triangleNormals.buffer, g_buffers->triangles.size() / 3); } virtual void Update() |