aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/PhysX/src/buffering/ScbShape.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/Source/PhysX/src/buffering/ScbShape.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/Source/PhysX/src/buffering/ScbShape.cpp')
-rw-r--r--PhysX_3.4/Source/PhysX/src/buffering/ScbShape.cpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/PhysX_3.4/Source/PhysX/src/buffering/ScbShape.cpp b/PhysX_3.4/Source/PhysX/src/buffering/ScbShape.cpp
new file mode 100644
index 00000000..59f07169
--- /dev/null
+++ b/PhysX_3.4/Source/PhysX/src/buffering/ScbShape.cpp
@@ -0,0 +1,146 @@
+// 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 "ScbShape.h"
+
+using namespace physx;
+
+bool Scb::Shape::setMaterialsHelper(PxMaterial* const* materials, PxU16 materialCount)
+{
+ PX_ASSERT(!isBuffering());
+
+ if (materialCount == 1)
+ {
+ PxU16 materialIndex = Ps::to16((static_cast<NpMaterial*>(materials[0]))->getHandle());
+
+ mShape.setMaterialIndices(&materialIndex, 1);
+ }
+ else
+ {
+ PX_ASSERT(materialCount > 1);
+
+ PX_ALLOCA(materialIndices, PxU16, materialCount);
+
+ if (materialIndices)
+ {
+ NpMaterial::getMaterialIndices(materials, materialIndices, materialCount);
+ mShape.setMaterialIndices(materialIndices, materialCount);
+ }
+ else
+ {
+ Ps::getFoundation().error(PxErrorCode::eOUT_OF_MEMORY, __FILE__, __LINE__,
+ "PxShape::setMaterials() failed. Out of memory. Call will be ignored.");
+ return false;
+ }
+ }
+
+ Scb::Scene* sc = getScbScene();
+
+ if (sc)
+ {
+ sc->getScScene().notifyNphaseOnUpdateShapeMaterial(mShape);
+ }
+
+ return true;
+}
+
+
+void Scb::Shape::syncState()
+{
+ PxU32 flags = getBufferFlags();
+ if (flags)
+ {
+
+ PxShapeFlags oldShapeFlags = mShape.getFlags();
+
+ const Scb::ShapeBuffer& buffer = *getBufferedData();
+
+ if (flags & Buf::BF_Geometry)
+ {
+ Scb::Scene* sc = getScbScene();
+
+ if (sc)
+ {
+ sc->getScScene().unregisterShapeFromNphase(mShape);
+ }
+
+ mShape.setGeometry(buffer.geometry.getGeometry());
+
+ if (sc)
+ {
+ sc->getScScene().registerShapeInNphase(mShape);
+ }
+
+#if PX_SUPPORT_PVD
+ if(getControlState() == ControlState::eIN_SCENE)
+ {
+ Scb::Scene* scbScene = getScbScene();
+ PX_ASSERT(scbScene);
+ scbScene->getScenePvdClient().releaseAndRecreateGeometry(this);
+ }
+#endif
+ }
+
+ if (flags & Buf::BF_Material)
+ {
+ const PxU16* materialIndices = getMaterialBuffer(*getScbScene(), buffer);
+ mShape.setMaterialIndices(materialIndices, buffer.materialCount);
+ getScbScene()->getScScene().notifyNphaseOnUpdateShapeMaterial(mShape);
+ UPDATE_PVD_MATERIALS()
+ // TODO: So far we did not bother to fail gracefully in the case of running out of memory. If that should change then this
+ // method is somewhat problematic. The material ref counters have been adjusted at the time when the public API was called.
+ // Could be that one of the old materials was deleted afterwards. The problem now is what to do if this method fails?
+ // We can't adjust the material ref counts any longer since some of the old materials might have been deleted.
+ // One solution could be that this class allocates an array of material pointers when the buffered method is called.
+ // This array is then passed into the core object and is used by the core object, i.e., the core object does not allocate the
+ // buffer itself.
+ }
+
+ flush<Buf::BF_Shape2Actor>(buffer);
+ flush<Buf::BF_SimulationFilterData>(buffer);
+
+ if(isBuffered(Buf::BF_ContactOffset))
+ {
+ mShape.setContactOffset(buffer.mContactOffset);
+ }
+
+ flush<Buf::BF_RestOffset>(buffer);
+ flush<Buf::BF_Flags>(buffer);
+
+ Sc::RigidCore* scRigidCore = NpShapeGetScRigidObjectFromScbSLOW(*this);
+
+ if (scRigidCore) // may be NULL for exclusive shapes because of pending shape updates after buffered release of actor.
+ {
+ scRigidCore->onShapeChange(mShape, Sc::ShapeChangeNotifyFlags(flags), oldShapeFlags, true);
+ }
+ }
+
+ postSyncState();
+}