void ClothingScene::removeRenderProxies(ClothingAsset* asset)
{
	// delete all render proxies that have the RenderMeshAsset
	// of this ClothingAsset
	mRenderProxiesLock.lock();
	PxU32 numGraphicalMeshes = asset->getNumGraphicalMeshes();
	for (PxU32 i = 0; i < numGraphicalMeshes; ++i)
	{
		NiApexRenderMeshAsset* renderMeshAsset = asset->getGraphicalMesh(i);

		Array<ClothingRenderProxy*>& renderProxies = mRenderProxies[renderMeshAsset];
		for (PxI32 i = (physx::PxI32)renderProxies.size()-1; i >= 0 ; --i)
		{
			ClothingRenderProxy* renderProxy = renderProxies[(physx::PxU32)i];
			if (renderProxy->getTimeInPool() > 0)
			{
				PX_DELETE(renderProxies[(physx::PxU32)i]);
			}
			else
			{
				renderProxy->notifyAssetRelease();
			}
		}
		renderProxies.clear();
		mRenderProxies.erase(renderMeshAsset);
	}
	mRenderProxiesLock.unlock();
}
void ClothingScene::tickRenderProxies()
{
	PX_PROFILER_PERF_SCOPE("ClothingScene::tickRenderProxies");
	mRenderProxiesLock.lock();

	for(HashMap<NiApexRenderMeshAsset*, Array<ClothingRenderProxy*> >::Iterator iter = mRenderProxies.getIterator(); !iter.done(); ++iter)
	{
		Array<ClothingRenderProxy*>& renderProxies = iter->second;

		for (PxI32 i = (physx::PxI32)renderProxies.size()-1; i >= 0 ; --i)
		{
			PxU32 timeInPool = renderProxies[(physx::PxU32)i]->getTimeInPool();

			if (timeInPool > 0)
			{
				if (timeInPool > mModule->getMaxTimeRenderProxyInPool() + 1) // +1 because we add them with time 1
				{
					PX_DELETE(renderProxies[(physx::PxU32)i]);
					renderProxies.replaceWithLast((physx::PxU32)i);
				}
				else
				{
					renderProxies[(physx::PxU32)i]->setTimeInPool(timeInPool+1);
				}
			}
		}
	}

	mRenderProxiesLock.unlock();
}
void ApexResourceProvider::destroy()
{
	if (mUserCallback)
	{
		for (uint32_t i = 0 ; i < mResources.size() ; i++)
		{
			ApexResourceProvider::resource& res = mResources[i];
			if (res.refCount != 0 && res.valueIsSet && res.ptr != NULL)
			{
				ResID resIndex = mNSNames.getOrCreateID(res.nameSpace, "NameSpace");
				PX_ASSERT(mResources[resIndex].ptr);
				uint32_t nsIndex = getNSIndex((ResID)(size_t)mResources[resIndex].ptr);
				if (nsIndex < mNameSpaces.size() &&
					mNameSpaces[nsIndex]->releaseAtExit())
				{
					if (res.usedGetResource) // this check added for PhysXLab DE4349
				{
					mUserCallback->releaseResource(res.nameSpace, res.name, res.ptr);
				}
					else
					{
						APEX_DEBUG_WARNING("Unreleased resource found during teardown: Namespace <%s>, Name <%s>", res.nameSpace, res.name);
					}
				}
			}
		}
	}
	mResources.clear();
	for (uint32_t i = 0 ; i < mNameSpaces.size() ; i++)
	{
		PX_DELETE(mNameSpaces[i]);
	}
	mNameSpaces.clear();
	delete this;
}
		void DefaultBufferedProfiler::release()
		{			
			mProfileZoneHandler.release();
			mProfileZoneManager->removeProfileZoneHandler(mProfileZoneHandler);
			mCallbacks.clear();
			mProfileZoneManager->release();

			PX_DELETE(this);
		}
		void ProfileZoneHandler::release()
		{
			for (PxU32 i = mProfileZoneInterfaces.size(); i--;)
			{
				mProfileZoneInterfaces[i]->getProfileZone().removeClient(*mProfileZoneInterfaces[i]);
				PX_DELETE(mProfileZoneInterfaces[i]);
			}
			mProfileZoneInterfaces.clear();
		}
		void ProfileZoneHandler::onZoneRemoved( PxProfileZone&  inSDK)	
		{
			for (PxU32 i = mProfileZoneInterfaces.size(); i--;)
			{
				if(&mProfileZoneInterfaces[i]->getProfileZone() == &inSDK)
				{
					inSDK.removeClient(*mProfileZoneInterfaces[i]);
					PX_DELETE(mProfileZoneInterfaces[i]);
					mProfileZoneInterfaces.replaceWithLast(i);
					break;
				}
			}
		}
void ApexRenderMeshAsset::setSubmeshCount(physx::PxU32 submeshCount)
{
	const physx::PxU32 oldSize = mSubmeshes.size();

	for (physx::PxU32 i = oldSize; i-- > submeshCount;)
	{
		PX_DELETE(mSubmeshes[i]);
	}

	mSubmeshes.resize(submeshCount);

	for (physx::PxU32 i = oldSize; i < submeshCount; ++i)
	{
		mSubmeshes[i] = PX_NEW(ApexRenderSubmesh);
	}
}
Ejemplo n.º 8
0
void PxTaskMgr::release()
{
	PX_DELETE(this);
}
void ClothingScene::destroy()
{
	for (PxU32 i = 0; i < mActorArray.size(); i++)
	{
		ClothingActor* clothingActor = static_cast<ClothingActor*>(mActorArray[i]);
		clothingActor->waitForFetchResults();
	}

	removeAllActors();

	mClothingAssetsMutex.lock();
	for (physx::PxU32 i = 0 ; i < mClothingAssets.size(); i++)
	{
		if (mPhysXScene != NULL)
		{
			mClothingAssets[i]->hintSceneDeletion(mPhysXScene);
		}

		// for PhysX3: making sure that fabrics (in assets) are released before the factories (in mSimulationTask)
		mClothingAssets[i]->releaseCookedInstances();
	}
	mClothingAssets.clear();
	mClothingAssetsMutex.unlock();

	// clear render list
	for(HashMap<NiApexRenderMeshAsset*, Array<ClothingRenderProxy*> >::Iterator iter = mRenderProxies.getIterator(); !iter.done(); ++iter)
	{
		Array<ClothingRenderProxy*>& renderProxies = iter->second;

		for (PxI32 i = (physx::PxI32)renderProxies.size()-1; i >= 0 ; --i)
		{
			PxU32 timeInPool = renderProxies[(physx::PxU32)i]->getTimeInPool();
			if (timeInPool > 0)
			{
				PX_DELETE(renderProxies[(physx::PxU32)i]);
				renderProxies.replaceWithLast((physx::PxU32)i);
			}
			else
			{
				// actually the scene is released, but we just want to make sure
				// that the render proxy deletes itself when it's returned next time
				renderProxies[(physx::PxU32)i]->notifyAssetRelease();
			}
		}

		renderProxies.clear();
	}
	//mRenderProxies.clear();

	while (mCurrentCookingTask != NULL)
	{
		submitCookingTask(NULL);
		physx::Thread::sleep(0); // wait for remaining cooking tasks to finish
	}

	if (mSimulationTask != NULL)
	{
		setModulePhysXScene(NULL); // does some cleanup necessary here. Only needed when module gets deleted without the apex scene being deleted before!
		PX_DELETE(mSimulationTask);
		mSimulationTask = NULL;
	}

	if (mWaitForSolverTask != NULL)
	{
		PX_DELETE(mWaitForSolverTask);
		mWaitForSolverTask = NULL;
	}

	{
		if (mCpuFactory.factory != NULL)
		{
			mModule->releaseClothFactory(NULL);
			mCpuFactory.clear();
		}

#ifdef PX_WINDOWS
		PX_ASSERT(mGpuFactory.factory == NULL);

		NiApexSDK* apexSdk = NiGetApexSDK();
		apexSdk->unregisterPhysXIndicatorGpuClient(mPhysXGpuIndicator);
		mPhysXGpuIndicator = NULL;
#endif
	}

	mApexScene->moduleReleased(*this);
	delete this;
}
Ejemplo n.º 10
0
Actor::~Actor()
{
	PX_DELETE(mDefaultFracturePattern);
	mDefaultFracturePattern = NULL;
}
Ejemplo n.º 11
0
NpSpatialIndex::~NpSpatialIndex()
{
	PX_DELETE(mPruner);
}