aboutsummaryrefslogtreecommitdiff
path: root/demo/scenes/triggervolume.h
diff options
context:
space:
mode:
Diffstat (limited to 'demo/scenes/triggervolume.h')
-rw-r--r--demo/scenes/triggervolume.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/demo/scenes/triggervolume.h b/demo/scenes/triggervolume.h
new file mode 100644
index 0000000..0e4c1a4
--- /dev/null
+++ b/demo/scenes/triggervolume.h
@@ -0,0 +1,81 @@
+
+
+
+class TriggerVolume : public Scene
+{
+public:
+
+ TriggerVolume(const char* name) : Scene(name) {}
+
+ void Initialize()
+ {
+ float radius = 0.05f;
+ CreateParticleGrid(Vec3(1.75, 2.0, -0.25), 10, 5, 10, radius, Vec3(0.0f), 1.0f, false, 0.0f, NvFlexMakePhase(0, eNvFlexPhaseSelfCollide), 0.0f);
+
+ g_numExtraParticles = 10000;
+
+ // regular box
+ AddBox(Vec3(0.5), Vec3(0.0, 0.5, 0.0));
+
+ // trigger box
+ AddBox(Vec3(0.5), Vec3(2.0f, 0.5, 0.0));
+ g_buffers->shapeFlags[1] |= eNvFlexShapeFlagTrigger;
+
+ 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;
+
+ // draw options
+ g_drawPoints = true;
+
+ g_emitters[0].mEnabled = true;
+ }
+
+ virtual void Update()
+ {
+ const int maxContactsPerParticle = 6;
+
+ NvFlexVector<Vec4> contactPlanes(g_flexLib,g_buffers->positions.size()*maxContactsPerParticle);
+ NvFlexVector<Vec4> contactVelocities(g_flexLib, g_buffers->positions.size()*maxContactsPerParticle);
+ 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);
+
+ contactPlanes.map();
+ contactVelocities.map();
+ contactIndices.map();
+ contactCounts.map();
+
+ int activeCount = NvFlexGetActiveCount(g_flex);
+
+ for (int i = 0; i < activeCount; ++i)
+ {
+ const int contactIndex = contactIndices[i];
+ const unsigned int count = contactCounts[contactIndex];
+
+ for (unsigned int c = 0; c < count; ++c)
+ {
+ Vec4 velocity = contactVelocities[contactIndex*maxContactsPerParticle + c];
+
+ const int shapeId = int(velocity.w);
+
+ // detect when particle intersects the trigger
+ // volume and teleport it over to the other box
+ if (shapeId == 1)
+ {
+ Vec3 pos = Vec3(Randf(-0.5f, 0.5f), 1.0f, Randf(-0.5f, 0.5f));
+
+ g_buffers->positions[i] = Vec4(pos, 1.0f);
+ g_buffers->velocities[i] = 0.0f;
+ }
+ }
+ }
+ }
+
+}; \ No newline at end of file