aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Samples/SampleBase/ParticleEmitterPressure.cpp
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /PhysX_3.4/Samples/SampleBase/ParticleEmitterPressure.cpp
downloadphysx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz
physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip
Initial commit:
PhysX 3.4.0 Update @ 21294896 APEX 1.4.0 Update @ 21275617 [CL 21300167]
Diffstat (limited to 'PhysX_3.4/Samples/SampleBase/ParticleEmitterPressure.cpp')
-rw-r--r--PhysX_3.4/Samples/SampleBase/ParticleEmitterPressure.cpp221
1 files changed, 221 insertions, 0 deletions
diff --git a/PhysX_3.4/Samples/SampleBase/ParticleEmitterPressure.cpp b/PhysX_3.4/Samples/SampleBase/ParticleEmitterPressure.cpp
new file mode 100644
index 00000000..a2f857c0
--- /dev/null
+++ b/PhysX_3.4/Samples/SampleBase/ParticleEmitterPressure.cpp
@@ -0,0 +1,221 @@
+// This code contains NVIDIA Confidential Information and is disclosed to you
+// under a form of NVIDIA software license agreement provided separately to you.
+//
+// Notice
+// NVIDIA Corporation and its licensors retain all intellectual property and
+// proprietary rights in and to this software and related documentation and
+// any modifications thereto. Any use, reproduction, disclosure, or
+// distribution of this software and related documentation without an express
+// license agreement from NVIDIA Corporation is strictly prohibited.
+//
+// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES
+// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
+// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT,
+// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.
+//
+// Information and code furnished is believed to be accurate and reliable.
+// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such
+// information or for any infringement of patents or other rights of third parties that may
+// result from its use. No license is granted by implication or otherwise under any patent
+// or patent rights of NVIDIA Corporation. Details are subject to change without notice.
+// This code supersedes and replaces all information previously supplied.
+// NVIDIA Corporation products are not authorized for use as critical
+// components in life support devices or systems without express written approval of
+// NVIDIA Corporation.
+//
+// Copyright (c) 2008-2016 NVIDIA Corporation. All rights reserved.
+// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
+// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
+
+#include "ParticleEmitterPressure.h"
+#include "PsMathUtils.h"
+
+//----------------------------------------------------------------------------//
+
+ParticleEmitterPressure::ParticleEmitterPressure(ParticleEmitter::Shape::Enum shape, PxReal extentX, PxReal extentY, PxReal spacing) :
+ ParticleEmitter(shape, extentX, extentY, spacing),
+ mSimulationAcceleration(0.0f),
+ mSimulationMaxVelocity(1.0f),
+ mMaxRate(10000.0f)
+{
+ mMaxZNoiseOffset = spacing/4.0f;
+ mSites.resize(mNumSites);
+ clearPredecessors();
+}
+
+//----------------------------------------------------------------------------//
+
+ParticleEmitterPressure::~ParticleEmitterPressure()
+{
+}
+
+//----------------------------------------------------------------------------//
+
+void ParticleEmitterPressure::stepInternal(ParticleData& particles, PxReal dt, const PxVec3& externalAcceleration, PxReal maxParticleVelocity)
+{
+ PX_ASSERT(mNumX > 0 && mNumY > 0);
+
+ mSimulationAcceleration = externalAcceleration;
+ mSimulationMaxVelocity = maxParticleVelocity;
+
+ PxU32 numEmittedParticles = 0;
+
+ PxU32 maxParticlesPerStep = (PxU32)physx::shdfnd::floor(mMaxRate*dt);
+ PxU32 maxParticles = PxMin(particles.maxParticles - particles.numParticles, maxParticlesPerStep);
+
+ PxU32 siteNr = 0;
+ for(PxU32 y = 0; y != mNumY; y++)
+ {
+ PxReal offset = 0.0f;
+ if (y%2) offset = mSpacingX * 0.5f;
+
+ for(PxU32 x = 0; x != mNumX; x++)
+ {
+ if (isOutsideShape(x,y,offset))
+ continue;
+
+ SiteData& siteData = mSites[siteNr];
+
+ //position noise
+ PxVec3 posNoise;
+ posNoise.x = randInRange(-mRandomPos.x, mRandomPos.x);
+ posNoise.y = randInRange(-mRandomPos.y, mRandomPos.y);
+
+ //special code for Z noise
+ if (!siteData.predecessor)
+ siteData.noiseZ = randInRange(-mRandomPos.z, mRandomPos.z);
+ else
+ {
+ PxReal noiseZOffset = PxMin(mMaxZNoiseOffset, mRandomPos.z);
+ siteData.noiseZ += randInRange(-noiseZOffset, noiseZOffset);
+ siteData.noiseZ = PxClamp(siteData.noiseZ, mRandomPos.z, -mRandomPos.z);
+ }
+
+ posNoise.z = siteData.noiseZ;
+
+ //set position
+ PxVec3 sitePos = mBasePos + mAxisX*(offset+mSpacingX*x) + mAxisY*(mSpacingY*y) + mAxisZ*siteData.noiseZ;
+ PxVec3 particlePos = sitePos + mAxisX*posNoise.x + mAxisY*posNoise.y;
+
+ PxVec3 siteVel;
+ computeSiteVelocity(siteVel, particlePos);
+
+ if (siteData.predecessor)
+ {
+ predictPredecessorPos(siteData, dt);
+ }
+ else {
+ bool isSpawned = spawnParticle(particles, numEmittedParticles, maxParticles, particlePos, siteVel);
+ if(isSpawned)
+ {
+ updatePredecessor(siteData, particlePos, siteVel);
+ }
+ else
+ {
+ siteData.predecessor = false;
+ return;
+ }
+ }
+
+ bool allSpawned = stepEmissionSite(siteData, particles, numEmittedParticles, maxParticles, sitePos, siteVel, dt);
+ if(!allSpawned)
+ return;
+
+ siteNr++;
+ }
+ }
+}
+
+//----------------------------------------------------------------------------//
+
+void ParticleEmitterPressure::clearPredecessors()
+{
+ PX_ASSERT(mSites.size() == mNumSites);
+ for (PxU32 i = 0; i < mNumSites; i++)
+ mSites[i].predecessor = false;
+}
+
+//----------------------------------------------------------------------------//
+
+bool ParticleEmitterPressure::stepEmissionSite(
+ SiteData& siteData,
+ ParticleData& spawnData,
+ PxU32& spawnNum,
+ const PxU32 spawnMax,
+ const PxVec3 &sitePos,
+ const PxVec3 &siteVel,
+ const PxReal dt)
+{
+ PxReal maxDistanceMoved = 5.0f * mSpacingZ; // don't generate long particle beams
+
+ /**
+ * Find displacement vector of the particle's motion this frame
+ * this is not necessarily v*stepSize because a collision might have occured
+ */
+ PxVec3 displacement = siteData.position - sitePos;
+ PxVec3 normal = displacement;
+ PxReal distanceMoved = normal.normalize();
+
+ if (distanceMoved > maxDistanceMoved)
+ distanceMoved = maxDistanceMoved;
+
+ /**
+ * Place particles along line between emission point and new position
+ * starting backwards from the new position
+ * spacing between the particles is the rest spacing of the fluid
+ */
+ PxReal lastPlaced = 0.0f;
+ while((lastPlaced + mSpacingZ) <= distanceMoved)
+ {
+ PxVec3 pos = sitePos + normal * (distanceMoved - (lastPlaced + mSpacingZ));
+
+ PxVec3 posNoise;
+ posNoise.x = randInRange(-mRandomPos.x, mRandomPos.x);
+ posNoise.y = randInRange(-mRandomPos.y, mRandomPos.y);
+
+ pos += mAxisX*posNoise.x + mAxisY*posNoise.y;
+
+ bool isSpawned = spawnParticle(spawnData, spawnNum, spawnMax, pos, siteVel);
+ if(isSpawned)
+ {
+ updatePredecessor(siteData, pos, siteVel);
+ lastPlaced += mSpacingZ;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
+//----------------------------------------------------------------------------//
+
+void ParticleEmitterPressure::predictPredecessorPos(SiteData& siteData, PxReal dt)
+{
+ PxReal compensationHack = 2.0f/3.0f;
+
+ siteData.velocity += dt*(mSimulationAcceleration);
+ PxReal velAbs = siteData.velocity.magnitude();
+ PxReal maxVel = mSimulationMaxVelocity;
+
+ if (velAbs > maxVel)
+ {
+ PxReal scale = maxVel/velAbs;
+ siteData.velocity *= scale;
+ }
+
+ siteData.position += dt*compensationHack*siteData.velocity;
+}
+
+//----------------------------------------------------------------------------//
+
+void ParticleEmitterPressure::updatePredecessor(SiteData& siteData, const PxVec3& position, const PxVec3& velocity)
+{
+ siteData.predecessor = true;
+ siteData.position = position;
+ siteData.velocity = velocity;
+}
+
+//----------------------------------------------------------------------------//
+