diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/module/clothing/src/ClothingRenderProxyImpl.cpp | |
| download | physx-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 'APEX_1.4/module/clothing/src/ClothingRenderProxyImpl.cpp')
| -rw-r--r-- | APEX_1.4/module/clothing/src/ClothingRenderProxyImpl.cpp | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/APEX_1.4/module/clothing/src/ClothingRenderProxyImpl.cpp b/APEX_1.4/module/clothing/src/ClothingRenderProxyImpl.cpp new file mode 100644 index 00000000..2576e8ef --- /dev/null +++ b/APEX_1.4/module/clothing/src/ClothingRenderProxyImpl.cpp @@ -0,0 +1,270 @@ +/* + * Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, 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. + */ + + +#include "ApexDefs.h" + +#include "ClothingRenderProxyImpl.h" + +#include "ClothingAssetImpl.h" +#include "ClothingActorParam.h" +#include "RenderMeshActorDesc.h" +#include "RenderMeshAssetIntl.h" +#include "ClothingScene.h" + +namespace nvidia +{ +namespace clothing +{ + +ClothingRenderProxyImpl::ClothingRenderProxyImpl(RenderMeshAssetIntl* rma, bool useFallbackSkinning, bool useCustomVertexBuffer, const HashMap<uint32_t, ApexSimpleString>& overrideMaterials, const PxVec3* morphTargetNewPositions, const uint32_t* morphTargetVertexOffsets, ClothingScene* scene) : +renderingDataPosition(NULL), +renderingDataNormal(NULL), +renderingDataTangent(NULL), +mBounds(), +mPose(PxMat44(PxIdentity)), +mRenderMeshActor(NULL), +mRenderMeshAsset(rma), +mScene(scene), +mUseFallbackSkinning(useFallbackSkinning), +mMorphTargetNewPositions(morphTargetNewPositions), +mTimeInPool(0) +{ + // create renderMeshActor + RenderMeshActorDesc desc; + desc.keepVisibleBonesPacked = false; + desc.forceFallbackSkinning = mUseFallbackSkinning; + + // prepare material names array and copy the map with override names + const uint32_t numSubmeshes = rma->getSubmeshCount(); + Array<const char*> overrideMaterialNames; + for (uint32_t si = 0; si < numSubmeshes; ++si) + { + const Pair<const uint32_t, ApexSimpleString>* overrideMat = overrideMaterials.find(si); + if (overrideMat != NULL) + { + overrideMaterialNames.pushBack(overrideMat->second.c_str()); + mOverrideMaterials[si] = overrideMat->second; + } + else + { + overrideMaterialNames.pushBack(rma->getMaterialName(si)); + } + } + + desc.overrideMaterialCount = numSubmeshes; + desc.overrideMaterials = &overrideMaterialNames[0]; + mRenderMeshActor = DYNAMIC_CAST(RenderMeshActorIntl*)(mRenderMeshAsset->createActor(desc)); + + // Necessary for clothing + mRenderMeshActor->setSkinningMode(RenderMeshActorSkinningMode::AllBonesPerPart); + + if (useCustomVertexBuffer) + { + // get num verts and check if we need tangents + ClothingGraphicalMeshAssetWrapper meshAsset(rma); + uint32_t numRenderVertices = meshAsset.getNumTotalVertices(); + bool renderTangents = meshAsset.hasChannel(NULL, RenderVertexSemantic::TANGENT); + + // allocate aligned buffers and init to 0 + const uint32_t alignedNumRenderVertices = (numRenderVertices + 15) & 0xfffffff0; + const uint32_t renderingDataSize = sizeof(PxVec3) * alignedNumRenderVertices * 2 + sizeof(PxVec4) * alignedNumRenderVertices * (renderTangents ? 1 : 0); + renderingDataPosition = (PxVec3*)PX_ALLOC(renderingDataSize, PX_DEBUG_EXP("SimulationAbstract::renderingDataPositions")); + renderingDataNormal = renderingDataPosition + alignedNumRenderVertices; + if (renderTangents) + { + renderingDataTangent = reinterpret_cast<PxVec4*>(renderingDataNormal + alignedNumRenderVertices); + PX_ASSERT(((size_t)renderingDataTangent & 0xf) == 0); + } + memset(renderingDataPosition, 0, renderingDataSize); + + // update rma to use the custom buffers + uint32_t submeshOffset = 0; + for (uint32_t i = 0; i < meshAsset.getSubmeshCount(); i++) + { + PxVec3* position = renderingDataPosition + (renderingDataPosition != NULL ? submeshOffset : 0); + PxVec3* normal = renderingDataNormal + (renderingDataNormal != NULL ? submeshOffset : 0); + PxVec4* tangent = renderingDataTangent + (renderingDataTangent != NULL ? submeshOffset : 0); + mRenderMeshActor->addVertexBuffer(i, true, position, normal, tangent); + + // morph targets + if (mMorphTargetNewPositions != NULL) + { + const PxVec3* staticPosition = mMorphTargetNewPositions + morphTargetVertexOffsets[i]; + mRenderMeshActor->setStaticPositionReplacement(i, staticPosition); + } + + submeshOffset += meshAsset.getNumVertices(i); + } + } +} + + + +ClothingRenderProxyImpl::~ClothingRenderProxyImpl() +{ + mRMALock.lock(); + if (mRenderMeshActor != NULL) + { + mRenderMeshActor->release(); + mRenderMeshActor = NULL; + } + mRMALock.unlock(); + + if (renderingDataPosition != NULL) + { + PX_FREE(renderingDataPosition); + renderingDataPosition = NULL; + renderingDataNormal = NULL; + renderingDataTangent = NULL; + } +} + + + +// from ApexInterface +void ClothingRenderProxyImpl::release() +{ + WRITE_ZONE(); + setTimeInPool(1); + if(mScene == NULL || mRenderMeshActor == NULL) + { + PX_DELETE(this); + } +} + + + +// from Renderable +void ClothingRenderProxyImpl::dispatchRenderResources(UserRenderer& api) +{ + mRMALock.lock(); + if (mRenderMeshActor != NULL) + { + mRenderMeshActor->dispatchRenderResources(api, mPose); + } + mRMALock.unlock(); +} + + + +// from RenderDataProvider.h +void ClothingRenderProxyImpl::updateRenderResources(bool rewriteBuffers, void* userRenderData) +{ + URR_SCOPE; + + mRMALock.lock(); + if (mRenderMeshActor != NULL) + { + mRenderMeshActor->updateRenderResources(renderingDataPosition == NULL, rewriteBuffers, userRenderData); + } + mRMALock.unlock(); +} + + +void ClothingRenderProxyImpl::lockRenderResources() +{ + // no need to lock anything, as soon as the user can access the proxy, we don't write it anymore + // until he calls release +} + + +void ClothingRenderProxyImpl::unlockRenderResources() +{ +} + + + +bool ClothingRenderProxyImpl::hasSimulatedData() const +{ + READ_ZONE(); + return renderingDataPosition != NULL; +} + + + +RenderMeshActorIntl* ClothingRenderProxyImpl::getRenderMeshActor() +{ + return mRenderMeshActor; +} + + + +RenderMeshAssetIntl* ClothingRenderProxyImpl::getRenderMeshAsset() +{ + return mRenderMeshAsset; +} + + + +void ClothingRenderProxyImpl::setOverrideMaterial(uint32_t submeshIndex, const char* overrideMaterialName) +{ + mOverrideMaterials[submeshIndex] = overrideMaterialName; + mRMALock.lock(); + if (mRenderMeshActor != NULL) + { + mRenderMeshActor->setOverrideMaterial(submeshIndex, overrideMaterialName); + } + mRMALock.unlock(); +} + + + +bool ClothingRenderProxyImpl::overrideMaterialsEqual(const HashMap<uint32_t, ApexSimpleString>& overrideMaterials) +{ + uint32_t numEntries = mOverrideMaterials.size(); + if (overrideMaterials.size() != numEntries) + return false; + + for(HashMap<uint32_t, ApexSimpleString>::Iterator iter = mOverrideMaterials.getIterator(); !iter.done(); ++iter) + { + uint32_t submeshIndex = iter->first; + const Pair<const uint32_t, ApexSimpleString>* overrideMat = overrideMaterials.find(submeshIndex); + + // submeshIndex not found + if (overrideMat == NULL) + return false; + + // name is different + if (overrideMat->second != iter->second) + return false; + } + + return true; +} + + +uint32_t ClothingRenderProxyImpl::getTimeInPool() const +{ + return mTimeInPool; +} + + +void ClothingRenderProxyImpl::setTimeInPool(uint32_t time) +{ + mTimeInPool = time; +} + + +void ClothingRenderProxyImpl::notifyAssetRelease() +{ + mRMALock.lock(); + if (mRenderMeshActor != NULL) + { + mRenderMeshActor->release(); + mRenderMeshActor = NULL; + } + mRenderMeshAsset = NULL; + mRMALock.unlock(); +} + +} +} // namespace nvidia + |