aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/SimulationController/src/particles/ScParticlePacketShape.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'PhysX_3.4/Source/SimulationController/src/particles/ScParticlePacketShape.cpp')
-rw-r--r--PhysX_3.4/Source/SimulationController/src/particles/ScParticlePacketShape.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/PhysX_3.4/Source/SimulationController/src/particles/ScParticlePacketShape.cpp b/PhysX_3.4/Source/SimulationController/src/particles/ScParticlePacketShape.cpp
new file mode 100644
index 00000000..8dd86f0a
--- /dev/null
+++ b/PhysX_3.4/Source/SimulationController/src/particles/ScParticlePacketShape.cpp
@@ -0,0 +1,191 @@
+// 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 "ScParticlePacketShape.h"
+#if PX_USE_PARTICLE_SYSTEM_API
+
+#include "ScParticleBodyInteraction.h"
+#include "ScNPhaseCore.h"
+#include "ScScene.h"
+#include "PtParticleSystemSim.h"
+#include "ScParticleSystemCore.h"
+#include "ScSimStats.h"
+#include "ScSqBoundsManager.h"
+#include "ScScene.h"
+#include "PxsContext.h"
+
+using namespace physx;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Sc::ParticlePacketShape::ParticlePacketShape(ParticleSystemSim& particleSystem, PxU32 index, Pt::ParticleShape* llParticleShape) :
+ ElementSim(particleSystem, ElementType::ePARTICLE_PACKET),
+ mLLParticleShape(llParticleShape)
+{
+ // Initialize LL shape.
+ PX_ASSERT(mLLParticleShape);
+ mLLParticleShape->setUserDataV(this);
+
+ setIndex(index);
+
+ // Add particle actor element to broadphase
+ createLowLevelVolume();
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Sc::ParticlePacketShape::~ParticlePacketShape()
+{
+ getParticleSystem().unlinkParticleShape(this); // Let the particle system remove this shape from the list.
+
+ // Remove particle actor element from broadphase and cleanup interactions
+ destroyLowLevelVolume();
+
+ // Destroy LowLevel shape
+ if (mLLParticleShape)
+ {
+ mLLParticleShape->destroyV();
+ mLLParticleShape = 0;
+ }
+
+ PX_ASSERT(mInteractions.size()==0);
+ mInteractions.releaseMem(*this);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void Sc::ParticlePacketShape::computeWorldBounds(PxBounds3& b) const
+{
+ b = getBounds();
+ PX_ASSERT(b.isFinite());
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void Sc::ParticlePacketShape::getFilterInfo(PxFilterObjectAttributes& filterAttr, PxFilterData& filterData) const
+{
+ filterAttr = 0;
+ if (getParticleSystem().getInternalFlags() & Pt::InternalParticleSystemFlag::eSPH)
+ ElementSim::setFilterObjectAttributeType(filterAttr, PxFilterObjectType::ePARTICLE_FLUID);
+ else
+ ElementSim::setFilterObjectAttributeType(filterAttr, PxFilterObjectType::ePARTICLE_SYSTEM);
+
+ filterData = getParticleSystem().getSimulationFilterData();
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Sc::ParticleSystemSim& Sc::ParticlePacketShape::getParticleSystem() const
+{
+ return static_cast<ParticleSystemSim&>(getActor());
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void Sc::ParticlePacketShape::setInteractionsDirty(InteractionDirtyFlag::Enum flag)
+{
+ ParticleElementRbElementInteraction** interactions = getInteractions();
+ PxU32 nbInteractions = getInteractionsCount();
+
+ while(nbInteractions--)
+ {
+ ParticleElementRbElementInteraction* interaction = *interactions++;
+
+ PX_ASSERT(interaction->readInteractionFlag(InteractionFlag::eFILTERABLE));
+ PX_ASSERT(interaction->readInteractionFlag(InteractionFlag::eELEMENT_ELEMENT));
+
+ interaction->setDirty(flag);
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// PT: TODO: refactor with Sc::ActorSim::reallocInteractions
+void Sc::ParticlePacketShape::reallocInteractions(Sc::ParticleElementRbElementInteraction**& mem, PxU16& capacity, PxU16 size, PxU16 requiredMinCapacity)
+{
+ ParticleElementRbElementInteraction** newMem;
+ PxU16 newCapacity;
+
+ if(requiredMinCapacity==0)
+ {
+ newCapacity = 0;
+ newMem = 0;
+ }
+ else if(requiredMinCapacity<=INLINE_INTERACTION_CAPACITY)
+ {
+ newCapacity = INLINE_INTERACTION_CAPACITY;
+ newMem = mInlineInteractionMem;
+ }
+ else
+ {
+ const PxU32 desiredCapacity = Ps::nextPowerOfTwo(PxU32(requiredMinCapacity-1));
+ PX_ASSERT(desiredCapacity<=65536);
+
+ const PxU32 limit = 0xffff;
+ newCapacity = Ps::to16(PxMin(limit, desiredCapacity));
+ newMem = reinterpret_cast<ParticleElementRbElementInteraction**>(getScene().allocatePointerBlock(newCapacity));
+ }
+
+ PX_ASSERT(newCapacity >= requiredMinCapacity && requiredMinCapacity>=size);
+
+ PxMemCopy(newMem, mem, size*sizeof(ParticleElementRbElementInteraction*));
+
+ if(mem && mem!=mInlineInteractionMem)
+ getScene().deallocatePointerBlock(reinterpret_cast<void**>(mem), capacity);
+
+ capacity = newCapacity;
+ mem = newMem;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void Sc::ParticlePacketShape::createLowLevelVolume()
+{
+ PX_ASSERT(getBounds().isFinite());
+
+ getScene().getBoundsArray().setBounds(getBounds(), getElementID());
+ addToAABBMgr(0, Bp::FilterGroup::ePARTICLES, false);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void Sc::ParticlePacketShape::destroyLowLevelVolume()
+{
+ if (!isInBroadPhase())
+ return;
+
+ Sc::Scene& scene = getScene();
+ PxsContactManagerOutputIterator outputs = scene.getLowLevelContext()->getNphaseImplementationContext()->getContactManagerOutputs();
+
+ scene.getNPhaseCore()->onVolumeRemoved(this, 0, outputs, scene.getPublicFlags() & PxSceneFlag::eADAPTIVE_FORCE);
+ removeFromAABBMgr();
+}
+
+#endif // PX_USE_PARTICLE_SYSTEM_API