aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/framework/src/ApexRenderSubmesh.cpp
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/framework/src/ApexRenderSubmesh.cpp
downloadphysx-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/framework/src/ApexRenderSubmesh.cpp')
-rw-r--r--APEX_1.4/framework/src/ApexRenderSubmesh.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/APEX_1.4/framework/src/ApexRenderSubmesh.cpp b/APEX_1.4/framework/src/ApexRenderSubmesh.cpp
new file mode 100644
index 00000000..150e2432
--- /dev/null
+++ b/APEX_1.4/framework/src/ApexRenderSubmesh.cpp
@@ -0,0 +1,141 @@
+/*
+ * 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 "ApexRenderSubmesh.h"
+
+//#include "ApexStream.h"
+//#include "ApexSharedSerialization.h"
+#include "ApexSDKIntl.h"
+
+
+namespace nvidia
+{
+namespace apex
+{
+
+PX_INLINE uint32_t findIndexedNeighbors(uint32_t indexedNeighbors[3], uint32_t triangleIndex,
+ const uint32_t* indexBuffer, const uint32_t* vertexTriangleRefs, const uint32_t* vertexToTriangleMap)
+{
+ uint32_t indexedNeighborCount = 0;
+ const uint32_t* triangleVertexIndices = indexBuffer + 3 * triangleIndex;
+ for (uint32_t v = 0; v < 3; ++v)
+ {
+ const uint32_t vertexIndex = triangleVertexIndices[v];
+ const uint32_t prevVertexIndex = triangleVertexIndices[(3 >> v) ^ 1];
+ // Find all other triangles which have this vertex
+ const uint32_t mapStart = vertexTriangleRefs[vertexIndex];
+ const uint32_t mapStop = vertexTriangleRefs[vertexIndex + 1];
+ for (uint32_t i = mapStart; i < mapStop; ++i)
+ {
+ const uint32_t neighborTriangleIndex = vertexToTriangleMap[i];
+ // See if the previous vertex on the triangle matches the next vertex on the neighbor. (This will
+ // automatically exclude the triangle itself, so no check to exclude a self-check is made.)
+ const uint32_t* neighborTriangleVertexIndices = indexBuffer + 3 * neighborTriangleIndex;
+ const uint8_t indexMatch = (uint8_t)((uint8_t)(neighborTriangleVertexIndices[0] == vertexIndex) |
+ (uint8_t)(neighborTriangleVertexIndices[1] == vertexIndex) << 1 |
+ (uint8_t)(neighborTriangleVertexIndices[2] == vertexIndex) << 2);
+ const uint32_t nextNeighborVertexIndex = neighborTriangleVertexIndices[indexMatch & 3];
+ if (nextNeighborVertexIndex == prevVertexIndex)
+ {
+ // Found a neighbor
+ indexedNeighbors[indexedNeighborCount++] = neighborTriangleIndex;
+ }
+ }
+ }
+
+ return indexedNeighborCount;
+}
+
+
+
+void ApexRenderSubmesh::applyPermutation(const Array<uint32_t>& old2new, const Array<uint32_t>& new2old)
+{
+ if (mParams->vertexPartition.arraySizes[0] == 2)
+ {
+ mVertexBuffer.applyPermutation(new2old);
+ }
+
+ const uint32_t numIndices = (uint32_t)mParams->indexBuffer.arraySizes[0];
+ for (uint32_t i = 0; i < numIndices; i++)
+ {
+ PX_ASSERT(mParams->indexBuffer.buf[i] < old2new.size());
+ mParams->indexBuffer.buf[i] = old2new[mParams->indexBuffer.buf[i]];
+ }
+}
+
+
+
+bool ApexRenderSubmesh::createFromParameters(SubmeshParameters* params)
+{
+ mParams = params;
+
+ if (mParams->vertexBuffer == NULL)
+ {
+ NvParameterized::Traits* traits = GetInternalApexSDK()->getParameterizedTraits();
+ mParams->vertexBuffer = traits->createNvParameterized(VertexBufferParameters::staticClassName());
+ }
+ mVertexBuffer.setParams(static_cast<VertexBufferParameters*>(mParams->vertexBuffer));
+
+ return true;
+}
+
+
+
+void ApexRenderSubmesh::setParams(SubmeshParameters* submeshParams, VertexBufferParameters* vertexBufferParams)
+{
+
+ if (vertexBufferParams == NULL && submeshParams != NULL)
+ {
+ vertexBufferParams = static_cast<VertexBufferParameters*>(submeshParams->vertexBuffer);
+ PX_ASSERT(vertexBufferParams != NULL);
+ }
+ else if (submeshParams != NULL && submeshParams->vertexBuffer == NULL)
+ {
+ submeshParams->vertexBuffer = vertexBufferParams;
+ }
+ else if (mParams == NULL)
+ {
+ // Only emit this warning if mParams is empty yet (not on destruction of the object)
+ APEX_INTERNAL_ERROR("Confliciting parameterized objects!");
+ }
+ mParams = submeshParams;
+
+ mVertexBuffer.setParams(vertexBufferParams);
+}
+
+
+
+void ApexRenderSubmesh::addStats(RenderMeshAssetStats& stats) const
+{
+ stats.vertexCount += mVertexBuffer.getVertexCount();
+ stats.indexCount += mParams->indexBuffer.arraySizes[0];
+
+ const uint32_t submeshVertexBytes = mVertexBuffer.getAllocationSize();
+ stats.vertexBufferBytes += submeshVertexBytes;
+ stats.totalBytes += submeshVertexBytes;
+
+ const uint32_t submeshIndexBytes = mParams->indexBuffer.arraySizes[0] * sizeof(uint32_t);
+ stats.indexBufferBytes += submeshIndexBytes;
+ stats.totalBytes += submeshIndexBytes;
+
+ stats.totalBytes += mParams->smoothingGroups.arraySizes[0] * sizeof(uint32_t);
+}
+
+
+
+void ApexRenderSubmesh::buildVertexBuffer(const VertexFormat& format, uint32_t vertexCount)
+{
+ mVertexBuffer.build(format, vertexCount);
+}
+
+
+} // namespace apex
+} // namespace nvidia