169 PxU32 maxNbAggregates, PxU32 maxNbShapes,
PxVirtualAllocator& allocator, PxU64 contextID,
174 virtual void destroy() = 0;
176 virtual AggregateHandle createAggregate(BoundsIndex index, Bp::FilterGroup::Enum group,
void* userData, PxU32 maxNumShapes, PxAggregateFilterHint filterHint) = 0;
177 virtual bool destroyAggregate(BoundsIndex& index, Bp::FilterGroup::Enum& group, AggregateHandle aggregateHandle) = 0;
179 virtual bool addBounds(BoundsIndex index, PxReal contactDistance, Bp::FilterGroup::Enum group,
void* userdata, AggregateHandle aggregateHandle, ElementType::Enum volumeType) = 0;
180 virtual bool removeBounds(BoundsIndex index) = 0;
182 void reserveSpaceForBounds(BoundsIndex index);
184 PX_FORCE_INLINE PxIntBool isMarkedForRemove(BoundsIndex index)
const {
return mRemovedHandleMap.boundedTest(index); }
188 PX_FORCE_INLINE PxU32 getNbActiveAggregates()
const {
return mNbAggregates; }
191 PX_FORCE_INLINE void* getUserData(
const BoundsIndex index)
const {
return (index<mVolumeData.
size()) ? mVolumeData[index].getUserData() : NULL; }
193 void setContactDistance(BoundsIndex handle, PxReal offset)
196 mContactDistance.
begin()[handle] = offset;
197 setPersistentStateChanged();
198 mChangedHandleMap.growAndSet(handle);
206 void setBPGroup(BoundsIndex index, Bp::FilterGroup::Enum group)
208 PX_ASSERT((index + 1) < mVolumeData.
size());
209 PX_ASSERT(group != Bp::FilterGroup::eINVALID);
210 mGroups[index] = group;
213 virtual void updateBPFirstPass(PxU32 numCpuTasks,
Cm::FlushPool& flushPool,
bool hasContactDistanceUpdated,
PxBaseTask* continuation) = 0;
217 virtual void reallocateChangedAABBMgActorHandleMap(
const PxU32 size) = 0;
219 AABBOverlap* getCreatedOverlaps(ElementType::Enum type, PxU32& count)
221 PX_ASSERT(type < ElementType::eCOUNT);
222 count = mCreatedOverlaps[type].size();
223 return mCreatedOverlaps[type].begin();
226 AABBOverlap* getDestroyedOverlaps(ElementType::Enum type, PxU32& count)
228 PX_ASSERT(type < ElementType::eCOUNT);
229 count = mDestroyedOverlaps[type].size();
230 return mDestroyedOverlaps[type].begin();
235 void** getOutOfBoundsObjects(PxU32& nbOutOfBoundsObjects)
237 nbOutOfBoundsObjects = mOutOfBoundsObjects.
size();
238 return mOutOfBoundsObjects.
begin();
241 void clearOutOfBoundsObjects()
243 mOutOfBoundsObjects.
clear();
246 void** getOutOfBoundsAggregates(PxU32& nbOutOfBoundsAggregates)
248 nbOutOfBoundsAggregates = mOutOfBoundsAggregates.
size();
249 return mOutOfBoundsAggregates.
begin();
252 void clearOutOfBoundsAggregates()
254 mOutOfBoundsAggregates.
clear();
257 void shiftOrigin(
const PxVec3& shift);
261 virtual void releaseDeferredAggregateIds() = 0;
262 virtual void setGPUStateChanged() {}
263 virtual void setPersistentStateChanged() {}
266 void reserveShapeSpace(PxU32 nbShapes);
277 if (mAddedHandleMap.test(index))
279 mAddedHandleMap.reset(index);
283 mRemovedHandleMap.set(index);
289 if (mRemovedHandleMap.test(index))
290 mRemovedHandleMap.reset(index);
292 mAddedHandleMap.set(index);
302 PX_FORCE_INLINE void initEntry(BoundsIndex index, PxReal contactDistance, Bp::FilterGroup::Enum group,
void* userData)
304 if ((index + 1) >= mVolumeData.
size())
305 reserveShapeSpace(index + 1);
308 mUsedSize =
PxMax(index + 1, mUsedSize);
310 PX_ASSERT(group != Bp::FilterGroup::eINVALID);
311 mGroups[index] = group;
312 mContactDistance.
begin()[index] = contactDistance;
313 mVolumeData[index].setUserData(userData);
318 mGroups[index] = Bp::FilterGroup::eINVALID;
319 mContactDistance.
begin()[index] = 0.0f;
320 mVolumeData[index].
reset();
339#ifdef BP_USE_AGGREGATE_GROUP_TAIL
343 PxU32 mAggregateGroupTide;
349#ifdef BP_USE_AGGREGATE_GROUP_TAIL
350 PX_FORCE_INLINE void releaseAggregateGroup(
const Bp::FilterGroup::Enum group)
352 PX_ASSERT(group != Bp::FilterGroup::eINVALID);
353 mFreeAggregateGroups.
pushBack(group);
359 if (mFreeAggregateGroups.
size())
360 id = mFreeAggregateGroups.
popBack();
363 id = mAggregateGroupTide--;
364 id <<= BP_FILTERING_TYPE_SHIFT_BIT;
365 id |= FilterType::AGGREGATE;
367 const Bp::FilterGroup::Enum group = Bp::FilterGroup::Enum(
id);
368 PX_ASSERT(group != Bp::FilterGroup::eINVALID);