RavEngine
Loading...
Searching...
No Matches
PxsNphaseImplementationContext.h
1// Redistribution and use in source and binary forms, with or without
2// modification, are permitted provided that the following conditions
3// are met:
4// * Redistributions of source code must retain the above copyright
5// notice, this list of conditions and the following disclaimer.
6// * Redistributions in binary form must reproduce the above copyright
7// notice, this list of conditions and the following disclaimer in the
8// documentation and/or other materials provided with the distribution.
9// * Neither the name of NVIDIA CORPORATION nor the names of its
10// contributors may be used to endorse or promote products derived
11// from this software without specific prior written permission.
12//
13// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24//
25// Copyright (c) 2008-2022 NVIDIA Corporation. All rights reserved.
26// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
27// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
28
29#ifndef PXS_NPHASE_IMPLEMENTATION_CONTEXT_H
30#define PXS_NPHASE_IMPLEMENTATION_CONTEXT_H
31
32#include "PxvNphaseImplementationContext.h"
33#include "PxsContactManagerState.h"
34#include "PxcNpCache.h"
35#include "foundation/PxPinnedArray.h"
36
38
39namespace physx
40{
41
43{
44 PxArray<PxsContactManagerOutput> mOutputContactManagers;
45 PxArray<PxsContactManager*> mContactManagerMapping;
46 PxArray<Gu::Cache> mCaches;
47 PxPinnedArray<Sc::ShapeInteraction*> mShapeInteractions;
48 PxFloatArrayPinned mRestDistances;
49 PxPinnedArray<PxsTorsionalFrictionData> mTorsionalProperties;
50
51 PxsContactManagers(const PxU32 bucketId, PxVirtualAllocatorCallback* callback) : PxsContactManagerBase(bucketId),
52 mOutputContactManagers ("mOutputContactManagers"),
53 mContactManagerMapping ("mContactManagerMapping"),
54 mCaches ("mCaches"),
55 mShapeInteractions (PxVirtualAllocator(callback)),
56 mRestDistances (callback),
57 mTorsionalProperties (callback)
58 {
59 }
60
61 void clear()
62 {
63 mOutputContactManagers.forceSize_Unsafe(0);
64 mContactManagerMapping.forceSize_Unsafe(0);
65 mCaches.forceSize_Unsafe(0);
66 mShapeInteractions.forceSize_Unsafe(0);
67 mRestDistances.forceSize_Unsafe(0);
68 mTorsionalProperties.forceSize_Unsafe(0);
69
70 }
71private:
72 PX_NOCOPY(PxsContactManagers)
73};
74
76{
77public:
79
82 mNarrowPhasePairs (index, callback),
83 mNewNarrowPhasePairs (index, callback),
84 mModifyCallback (NULL),
85 mIslandSim(islandSim) {}
86
87 virtual void destroy();
88 virtual void updateContactManager(PxReal dt, bool hasBoundsArrayChanged, bool hasContactDistanceChanged, PxBaseTask* continuation,
89 PxBaseTask* firstPassContinuation, Cm::FanoutTask* updateBoundAndShape);
90 virtual void postBroadPhaseUpdateContactManager(PxBaseTask*) {}
91 virtual void secondPassUpdateContactManager(PxReal dt, PxBaseTask* continuation);
92
93 virtual void registerContactManager(PxsContactManager* cm, Sc::ShapeInteraction* shapeInteraction, PxI32 touching, PxU32 numPatches);
94// virtual void registerContactManagers(PxsContactManager** cm, Sc::ShapeInteraction** shapeInteractions, PxU32 nbContactManagers, PxU32 maxContactManagerId);
95 virtual void unregisterContactManager(PxsContactManager* cm);
96 virtual void unregisterContactManagerFallback(PxsContactManager* cm, PxsContactManagerOutput* cmOutputs);
97
98 virtual void refreshContactManager(PxsContactManager* cm);
99 virtual void refreshContactManagerFallback(PxsContactManager* cm, PxsContactManagerOutput* cmOutputs);
100
101 virtual void registerShape(const PxNodeIndex& /*nodeIndex*/, const PxsShapeCore& /*shapeCore*/, const PxU32 /*transformCacheID*/, PxActor* /*actor*/, const bool /*isFemCloth*/) {}
102 virtual void unregisterShape(const PxsShapeCore& /*shapeCore*/, const PxU32 /*transformCacheID*/, const bool /*isFemCloth*/) {}
103
104 virtual void registerAggregate(const PxU32 /*transformCacheID*/) {}
105
106 virtual void updateShapeMaterial(const PxsShapeCore&) {}
107 virtual void updateShapeContactOffset(const PxsShapeCore&) {}
108
109 virtual void registerMaterial(const PxsMaterialCore&) {}
110 virtual void updateMaterial(const PxsMaterialCore&) {}
111 virtual void unregisterMaterial(const PxsMaterialCore&) {}
112
113 virtual void registerMaterial(const PxsFEMSoftBodyMaterialCore&) {}
114 virtual void updateMaterial(const PxsFEMSoftBodyMaterialCore&) {}
115 virtual void unregisterMaterial(const PxsFEMSoftBodyMaterialCore&) {}
116
117 virtual void registerMaterial(const PxsFEMClothMaterialCore&) {}
118 virtual void updateMaterial(const PxsFEMClothMaterialCore&) {}
119 virtual void unregisterMaterial(const PxsFEMClothMaterialCore&) {}
120
121 virtual void registerMaterial(const PxsPBDMaterialCore&) {}
122 virtual void updateMaterial(const PxsPBDMaterialCore&) {}
123 virtual void unregisterMaterial(const PxsPBDMaterialCore&) {}
124
125 virtual void registerMaterial(const PxsFLIPMaterialCore&) {}
126 virtual void updateMaterial(const PxsFLIPMaterialCore&) {}
127 virtual void unregisterMaterial(const PxsFLIPMaterialCore&) {}
128
129 virtual void registerMaterial(const PxsMPMMaterialCore&) {}
130 virtual void updateMaterial(const PxsMPMMaterialCore&) {}
131 virtual void unregisterMaterial(const PxsMPMMaterialCore&) {}
132
133 virtual void registerMaterial(const PxsCustomMaterialCore&) {}
134 virtual void updateMaterial(const PxsCustomMaterialCore&) {}
135 virtual void unregisterMaterial(const PxsCustomMaterialCore&) {}
136
137 virtual void appendContactManagers();
138 virtual void appendContactManagersFallback(PxsContactManagerOutput* cmOutputs);
139
140 virtual void removeContactManagersFallback(PxsContactManagerOutput* cmOutputs);
141
142 virtual void setContactModifyCallback(PxContactModifyCallback* callback) { mModifyCallback = callback; }
143
144 virtual PxsContactManagerOutputIterator getContactManagerOutputs();
145
146 virtual PxsContactManagerOutput& getNewContactManagerOutput(PxU32 npIndex);
147
148 virtual void acquireContext(){}
149 virtual void releaseContext(){}
150 virtual void preallocateNewBuffers(PxU32 /*nbNewPairs*/, PxU32 /*maxIndex*/) { /*TODO - implement if it's useful to do so*/}
151
152 virtual PxsContactManagerOutputCounts* getFoundPatchOutputCounts() { return mCmFoundLostOutputCounts.begin(); }
153 virtual PxsContactManager** getFoundPatchManagers() { return mCmFoundLost.begin(); }
154 virtual PxU32 getNbFoundPatchManagers() { return mCmFoundLost.size(); }
155
156 void processContactManager(PxReal dt, PxsContactManagerOutput* cmOutputs, PxBaseTask* continuation);
157 void processContactManagerSecondPass(PxReal dt, PxBaseTask* continuation);
158 void fetchUpdateContactManager() {}
159
160 void appendNewLostPairs();
161
162 void startNarrowPhaseTasks() {}
163
164 virtual void lock() { mContactManagerMutex.lock(); }
165 virtual void unlock() { mContactManagerMutex.unlock(); }
166
167 virtual Sc::ShapeInteraction** getShapeInteractions() { return mNarrowPhasePairs.mShapeInteractions.begin(); }
168 virtual PxReal* getRestDistances() { return mNarrowPhasePairs.mRestDistances.begin(); }
169 virtual PxsTorsionalFrictionData* getTorsionalData() { return mNarrowPhasePairs.mTorsionalProperties.begin(); }
170
171 virtual PxsContactManagerOutput* getGPUContactManagerOutputBase() { return NULL; }
172 virtual PxReal* getGPURestDistances() { return NULL; }
173 virtual Sc::ShapeInteraction** getGPUShapeInteractions() { return NULL; }
174 virtual PxsTorsionalFrictionData* getGPUTorsionalData() { return NULL; }
175
176 PxArray<PxU32> mRemovedContactManagers;
177 PxsContactManagers mNarrowPhasePairs;
178 PxsContactManagers mNewNarrowPhasePairs;
179
180 PxContactModifyCallback* mModifyCallback;
181
182 IG::IslandSim* mIslandSim;
183
184 PxMutex mContactManagerMutex;
185
187
188 PxArray<PxsContactManagerOutputCounts> mCmFoundLostOutputCounts;
189 PxArray<PxsContactManager*> mCmFoundLost;
190private:
191 void unregisterContactManagerInternal(PxU32 npIndex, PxsContactManagers& managers, PxsContactManagerOutput* cmOutputs);
192
193 PX_FORCE_INLINE void unregisterAndForceSize(PxsContactManagers& cms, PxU32 index)
194 {
195 unregisterContactManagerInternal(index, cms, cms.mOutputContactManagers.begin());
196 cms.mOutputContactManagers.forceSize_Unsafe(cms.mOutputContactManagers.size()-1);
197 }
198
200};
201
202}
203
204#endif
Definition PxsNphaseImplementationContext.cpp:117
Definition base.h:1940
A task that maintains a list of dependent tasks.
Definition CmTask.h:132
Definition PxsIslandSim.h:412
PxActor is the base class for the main simulation objects in the physics SDK.
Definition PxActor.h:201
Definition PxArray.h:53
PX_FORCE_INLINE uint32_t size() const
Definition PxArray.h:242
PX_FORCE_INLINE void forceSize_Unsafe(uint32_t size)
Definition PxArray.h:507
PX_FORCE_INLINE ConstIterator begin() const
Definition PxArray.h:176
Base class of all task types.
Definition PxTask.h:45
An interface class that the user can implement in order to modify contact constraints.
Definition PxContactModifyCallback.h:459
Definition PxMutex.h:89
PX_FORCE_INLINE void unlock() const
Definition PxMutex.h:149
PX_FORCE_INLINE void lock() const
Definition PxMutex.h:130
PxNodeIndex.
Definition PxNodeIndex.h:51
Definition PxAllocator.h:140
Definition PxAllocator.h:158
Definition PxvNphaseImplementationContext.h:81
Definition PxsContactManager.h:77
Definition PxsContext.h:92
Definition PxsNphaseImplementationContext.h:76
Definition PxvNphaseImplementationContext.h:249
Definition ScShapeInteraction.h:54
#define PX_FORCE_INLINE
Definition PxPreprocessor.h:335
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
Definition PxsNphaseCommon.h:39
Definition PxsNphaseImplementationContext.h:43
Definition PxvGeometry.h:221