NxApexActor* ImpactEmitterAsset::createApexActor(const NxParameterized::Interface& parms, NxApexScene& apexScene)
{
	NX_WRITE_ZONE();
	if (!isValidForActorCreation(parms, apexScene))
	{
		return NULL;
	}

	NxApexActor* ret = 0;

	const char* className = parms.className();
	if (strcmp(className, ImpactEmitterActorParameters::staticClassName()) == 0)
	{
		EmitterScene* es = mModule->getEmitterScene(apexScene);
		ImpactEmitterActor* actor = PX_NEW(ImpactEmitterActor)(parms, *this, mEmitterActors, *es);
		if (!actor->isValid())
		{
			actor->destroy();
			return NULL;
		}

		ret = actor;
	}
	else
	{
		APEX_INVALID_OPERATION("%s is not a valid descriptor class, expecting %s", className, ImpactEmitterActorParameters::staticClassName());
	}

	return ret;
}
		void ProfileZoneHandler::onZoneAdded( PxProfileZone& inSDK )
		{
			if(strstr(mProfileZoneNames,inSDK.getName()))
			{				
				ProfileZoneInterface* pzInt = PX_NEW (ProfileZoneInterface)(inSDK, mBufferedProfiler);
				inSDK.addClient(*pzInt);
				mProfileZoneInterfaces.pushBack(pzInt);
			}
		}
	FileRenderDebug(const char *fileName,bool readAccess,bool echoLocally)
	{
		mLastDisplayType = PxProcessRenderDebug::DT_LAST;
		mData = NULL;
		mPrimitives = NULL;
		mPrimitiveCount = 0;
		mCurrentFrame = 0;
		mFrameItemCount = 0;
		mFrameStart = 0;
		mFrameCount = 0;
		mReadAccess = readAccess;
		mEchoLocally = NULL;

		if ( echoLocally )
		{
			mEchoLocally = createProcessRenderDebug();
		}
		mFileBuffer = PX_NEW(PxFileBuffer)(fileName, readAccess ? PxFileBuf::OPEN_READ_ONLY : PxFileBuf::OPEN_WRITE_ONLY);
		if ( mFileBuffer->isOpen() )
		{
			if ( mReadAccess )
			{
				char temp[4];
				PxU32 r = mFileBuffer->read(temp,4);
				PxU32 version = mFileBuffer->readDword();
				if ( r == 4 && magic[0] == temp[0] && magic[1] == temp[1] && magic[2] == temp[2] && magic[3] == temp[3] && version == MAGIC_VERSION )
				{
					// it's valid!
					FrameHeader h;
					while ( readFrameHeader(h,*mFileBuffer ) )
					{
						mFrameHeaders.pushBack(h);
					}
					mFrameCount = mFrameHeaders.size();
				}
				else
				{
					delete mFileBuffer;
					mFileBuffer = NULL;
				}
			}
			else
			{
				mFileBuffer->write(magic, 4 );
				mFileBuffer->storeDword(MAGIC_VERSION);
				mFileBuffer->flush();
			}

		}
		else
		{
			delete mFileBuffer;
			mFileBuffer = NULL;
		}

	}
PxFileRenderDebug * createFileRenderDebug(const char *fileName,
										  bool readAccess,
										  bool echoLocally)
{
	FileRenderDebug *f = PX_NEW(FileRenderDebug)(fileName,readAccess,echoLocally);
	if (!f->isOk() )
	{
		delete f;
		f = NULL;
	}
	return static_cast< PxFileRenderDebug *>(f);
}
void ImpactEmitterAsset::buildEventNameIndexMap()
{
	// destroy old mappings
	for (physx::PxU32 j = 0; j < mEventNameIndexMaps.size(); j++)
	{
		if (mEventNameIndexMaps[j])
		{
			delete mEventNameIndexMaps[j];
		}
	}

	// loop through all event sets, build a mapping for each new name found
	// and store all indices for that event set
	NxParamArray<NxParameterized::Interface*> assetEventSets(mParams,
	        "eventSetList",
	        (NxParamDynamicArrayStruct*) & (mParams->eventSetList));

	for (physx::PxU32 i = 0; i < assetEventSets.size(); i++)
	{
		NxParameterized::Handle hEventSetName(*assetEventSets[i]);
		const char* paramEventSetName = 0;

		NxParameterized::getParamString(*(assetEventSets[i]), "eventSetName", paramEventSetName);
		if (!paramEventSetName)
		{
			APEX_DEBUG_WARNING("Invalid eventSetName from Impact Emitter event sets");
			continue;
		}

		/* first see if the name is already here */
		bool foundEventSet = false;
		for (physx::PxU32 j = 0; j < mEventNameIndexMaps.size(); j++)
		{
			if (mEventNameIndexMaps[j]->eventSetName == paramEventSetName)
			{
				// add index to list
				mEventNameIndexMaps[j]->eventIndices.pushBack((physx::PxU16)i);
				foundEventSet = true;
			}
		}

		if (!foundEventSet)
		{
			/* now add it to the list */
			EventNameIndexMap* newMap = PX_NEW(EventNameIndexMap)();
			newMap->eventSetName = paramEventSetName;
			newMap->eventIndices.pushBack((physx::PxU16)i);
			mEventNameIndexMaps.pushBack(newMap);
		}
	}
}
void MirrorScene::mirrorShape(const PxTriggerPair &tp)
{
	size_t hash = (size_t)tp.otherShape;
	const ShapeHash::Entry *found = mShapes.find(hash);
	MirrorActor *ma = found ? found->second : NULL;
	if ( tp.flags & PxTriggerPairFlag::eDELETED_SHAPE_OTHER )
	{
		if ( found )
		{
			bool kill = ma->removeShape();
			mShapes.erase(hash);
			if ( kill )
			{
				ma->release();
				mActors.erase( ma->mActorHash );
			}
		}
	}
	else if ( tp.status == PxPairFlag::eNOTIFY_TOUCH_FOUND )
	{
		PX_ASSERT( found == NULL );
		size_t actorHash = (size_t) &tp.otherActor;
		const ActorHash::Entry *foundActor = mActors.find(actorHash);
		if ( foundActor == NULL )
		{
			ma = PX_NEW(MirrorActor)(actorHash,*tp.otherActor,*this);
			mActors[actorHash] = ma;
		}
		else
		{
			ma = foundActor->second;
		}
		ma->addShape();
		mShapes[hash] = ma;
	}
	else if ( tp.status == PxPairFlag::eNOTIFY_TOUCH_LOST )
	{
		PX_ASSERT( found );
		if ( ma )
		{
			bool kill = ma->removeShape();
			mShapes.erase(hash);
			if ( kill )
			{
				mActors.erase( ma->mActorHash );
				ma->release();
 			}
		}
	}

}
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);
	}
}
PxCpuDispatcher* createDefaultThreadPool(unsigned int numThreads)
{
	if (numThreads == 0)
	{
#if defined(PX_WINDOWS)
		numThreads = 4;
#elif defined(PX_X360)
		numThreads = 3;
#elif defined(PX_PS3)
		numThreads = 2;
#elif defined(PX_APPLE)
		numThreads = 2;
#endif
	}
	return PX_NEW(DefaultCpuDispatcher)(numThreads, 0);
}
ClothingRenderProxy* ClothingScene::getRenderProxy(NiApexRenderMeshAsset* rma, bool useFallbackSkinning, bool useCustomVertexBuffer, const HashMap<PxU32, ApexSimpleString>& overrideMaterials, const PxVec3* morphTargetNewPositions, const PxU32* morphTargetVertexOffsets)
{
	if (rma == NULL)
	{
		return NULL;
	}

	ClothingRenderProxy* renderProxy = NULL;


	mRenderProxiesLock.lock();
	Array<ClothingRenderProxy*>& renderProxies = mRenderProxies[rma];
	for (PxU32 i = 0; i < renderProxies.size(); ++i)
	{
		ClothingRenderProxy* proxyInPool = renderProxies[i];
		if (
			proxyInPool->getTimeInPool() > 0 && // proxy is available
			useFallbackSkinning == proxyInPool->usesFallbackSkinning() &&
			useCustomVertexBuffer == proxyInPool->usesCustomVertexBuffer() &&
			morphTargetNewPositions == proxyInPool->getMorphTargetBuffer() &&
			proxyInPool->overrideMaterialsEqual(overrideMaterials)
			)
		{
			renderProxy = proxyInPool;
			break;
		}
	}

	// no corresponding proxy in pool, so create one
	if (renderProxy == NULL)
	{
		renderProxy = PX_NEW(ClothingRenderProxy)(rma, useFallbackSkinning, useCustomVertexBuffer, overrideMaterials, morphTargetNewPositions, morphTargetVertexOffsets, this);
		renderProxies.pushBack(renderProxy);
	}

	renderProxy->setTimeInPool(0);
	mRenderProxiesLock.unlock();

	return renderProxy;
}
/* == Internal ResourceProviderIntl interface == */
ResID ApexResourceProvider::createNameSpaceInternal(const char* &nameSpace, bool releaseAtExit)
{
	/* create or get a name space */
	size_t  nextID = mResources.size();
	ResID nsID = mNSNames.getOrCreateID(nameSpace, "NameSpace");
	if (nsID == (ResID) nextID)
	{
		NameSpace* ns = PX_NEW(NameSpace)(this, nsID, releaseAtExit, nameSpace);
		if (ns)
		{
			ResID id = getNSID(nameSpace);
			mNSID.insert(id, mNameSpaces.size());

			mResources[nsID].ptr = (void*)(size_t) id;
			mNameSpaces.pushBack(ns);
		}
		else
		{
			return INVALID_RESOURCE_ID;
		}
	}
	ResID ret = (ResID)(size_t) mResources[nsID].ptr;
	return ret;
}
	PxDefaultBufferedProfiler* PxDefaultBufferedProfilerCreate(PxFoundation	& foundation, const char * profileZoneNames)
	{
		PxDefaultBufferedProfiler* retVal = PX_NEW(Ext::DefaultBufferedProfiler)(foundation, profileZoneNames);
		return retVal;
	}
void instantiateModuleClothingLegacy()
{
	ApexSDKIntl *sdk = GetInternalApexSDK();
	ModuleClothingLegacy *impl = PX_NEW(ModuleClothingLegacy)(sdk);
	sdk->registerExternalModule((Module *) impl, (ModuleIntl *) impl);
}
NxRenderMeshActor* ApexRenderMeshAsset::createActor(const NxRenderMeshActorDesc& desc)
{
	return PX_NEW(ApexRenderMeshActor)(desc, *this, mActorList);
}
PxSpatialIndex* PxCreateSpatialIndex()
{
	return PX_NEW(NpSpatialIndex)();
}
NpSpatialIndex::NpSpatialIndex()
: mPendingUpdates(false)
{
	mPruner = PX_NEW(Sq::AABBPruner)(true);
}