diff options
| author | mtamis <[email protected]> | 2017-02-28 18:24:59 +0100 |
|---|---|---|
| committer | mtamis <[email protected]> | 2017-02-28 18:24:59 +0100 |
| commit | 5581909a4d19db97304449f66404ff99a0429d3f (patch) | |
| tree | a90f7eb85c095a8aba45cf5e909c82c1cdbed77d /NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp | |
| parent | Fix cmake visual studio project generation (locate_gw_root.bat) (diff) | |
| download | nvcloth-5581909a4d19db97304449f66404ff99a0429d3f.tar.xz nvcloth-5581909a4d19db97304449f66404ff99a0429d3f.zip | |
Add visual samples.
Diffstat (limited to 'NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp')
| -rw-r--r-- | NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp b/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp new file mode 100644 index 0000000..d75bb25 --- /dev/null +++ b/NvCloth/samples/SampleBase/utils/ClothMeshGenerator.cpp @@ -0,0 +1,193 @@ +/* +* Copyright (c) 2008-2017, 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 "ClothMeshGenerator.h" + +void ClothMeshData::Clear() +{ + mVertices.clear(); + mTriangles.clear(); + mQuads.clear(); +} + +void ClothMeshData::GeneratePlaneCloth(float width, float height, int segmentsX, int segmentsY, bool createQuads, physx::PxMat44 transform, bool alternatingDiagonals) +{ + +/* +GeneratePlaneCloth(x,y,2,2) generates: + + v0______v1_____v2 v0______v1_____v2 + | | | |\ |\ | + | Q0 | Q1 | | \t0 | \t2 | + | | | | t1 \ | t3 \ | + v3------v4-----v5 v3-----\v4----\v5 + | | | | \ | \ | + | Q2 | Q3 | | \t4| \t6| + |______|______| |_t5_\_|_t7__\| + v6 v7 v8 v6 v7 v8 +*/ + + +// Submesh submesh; + + Clear(); + mVertices.resize((segmentsX + 1) * (segmentsY + 1)); + mInvMasses.resize((segmentsX + 1) * (segmentsY + 1)); + mTriangles.resize(segmentsX * segmentsY * 2); + if (createQuads) + mQuads.resize(segmentsX * segmentsY); + + mMesh.vertices.resize(mVertices.size()); + mMesh.indices.resize(3 * mTriangles.size()); + + physx::PxVec3 topLeft(-width * 0.5f, 0.f, -height * 0.5f); +// vec3 topLeftGLM(-width * 0.5f, translateUp, -height * 0.5f); + + //calculate uv scale and offset to keep texture aspect ratio 1:1 + float uvSx = width > height ? 1.0f : width / height; + float uvSy = width > height ? height / width : 1.0f; + float uvOx = 0.5f * (1.0f - uvSx); + float uvOy = 0.5f * (1.0f - uvSy); + + // Vertices + for (int y = 0; y < segmentsY + 1; y++) + { + for(int x = 0; x < segmentsX + 1; x++) + { + mVertices[x + y * (segmentsX + 1)] = transform.transform(topLeft + physx::PxVec3( ((float)x / (float)segmentsX) * width, + 0.f, + ((float)y / (float)segmentsY) * height)); + mInvMasses[x + y * (segmentsX + 1)] = 1.0f; + + mMesh.vertices[x + y * (segmentsX + 1)].position = transform.transform(topLeft + physx::PxVec3(((float)x / (float)segmentsX) * width, + 0.f, + ((float)y / (float)segmentsY) * height)); + mMesh.vertices[x + y * (segmentsX + 1)].normal = transform.transform(physx::PxVec3(0.f, 1.f, 0.f)); + + mMesh.vertices[x + y * (segmentsX + 1)].uv = physx::PxVec2(uvOx + uvSx*(float)x / (float)segmentsX, uvOy + uvSy*(1.0f - (float)y / (float)segmentsY)); + } + } + + if (createQuads) + { + // Quads + for (int y = 0; y < segmentsY; y++) + { + for (int x = 0; x < segmentsX; x++) + { + mQuads[(x + y * segmentsX)] = Quad((uint32_t)(x + 0) + (y + 0) * (segmentsX + 1), + (uint32_t)(x + 1) + (y + 0) * (segmentsX + 1), + (uint32_t)(x + 1) + (y + 1) * (segmentsX + 1), + (uint32_t)(x + 0) + (y + 1) * (segmentsX + 1)); + } + } + } + + // Triangles + for (int y = 0; y < segmentsY; y++) + { + for(int x = 0; x < segmentsX; x++) + { + if(alternatingDiagonals && (x^y)&1) + { + //Top right to bottom left + mTriangles[(x + y * segmentsX) * 2 + 0] = Triangle( (uint32_t)(x + 0) + (y + 0) * (segmentsX + 1), + (uint32_t)(x + 1) + (y + 0) * (segmentsX + 1), + (uint32_t)(x + 0) + (y + 1) * (segmentsX + 1)); + + mTriangles[(x + y * segmentsX) * 2 + 1] = Triangle( (uint32_t)(x + 1) + (y + 0) * (segmentsX + 1), + (uint32_t)(x + 1) + (y + 1) * (segmentsX + 1), + (uint32_t)(x + 0) + (y + 1) * (segmentsX + 1)); + } + else + { + //Top left to bottom right + mTriangles[(x + y * segmentsX) * 2 + 0] = Triangle( (uint32_t)(x + 0) + (y + 0) * (segmentsX + 1), + (uint32_t)(x + 1) + (y + 0) * (segmentsX + 1), + (uint32_t)(x + 1) + (y + 1) * (segmentsX + 1)); + + mTriangles[(x + y * segmentsX) * 2 + 1] = Triangle( (uint32_t)(x + 0) + (y + 0) * (segmentsX + 1), + (uint32_t)(x + 1) + (y + 1) * (segmentsX + 1), + (uint32_t)(x + 0) + (y + 1) * (segmentsX + 1)); + } + } + } + + for (int i = 0; i < (int)mTriangles.size(); i++) + { + mMesh.indices[3 * i] = mTriangles[i].a; + mMesh.indices[3 * i + 1] = mTriangles[i].b; + mMesh.indices[3 * i + 2] = mTriangles[i].c; + } +} + +void ClothMeshData::AttachClothPlaneByAngles(int segmentsX, int segmentsY, bool attachByWidth) +{ + for (int y = 0; y < segmentsY + 1; y++) + for (int x = 0; x < segmentsX + 1; x++) + if ((attachByWidth && y == 0) || (!attachByWidth && x == 0)) + if (x == 0 || x == segmentsX) + mInvMasses[x + y * (segmentsX + 1)] = 0.0f; +} + +void ClothMeshData::AttachClothPlaneBySide(int segmentsX, int segmentsY, bool attachByWidth) +{ + for (int y = 0; y < segmentsY + 1; y++) + for (int x = 0; x < segmentsX + 1; x++) + if ((attachByWidth && y == 0) || (!attachByWidth && x == 0)) + mInvMasses[x + y * (segmentsX + 1)] = 0.0f; +} + +void ClothMeshData::SetInvMasses(float invMass) +{ + // Doesn't modify attached vertices + for (int i = 0; i < (int)mInvMasses.size(); ++i) + if (mInvMasses[i] > 1e-6f) + mInvMasses[i] = invMass; +} + +void ClothMeshData::SetInvMassesFromDensity(float density) +{ + // Tempt code, should take into account triangle's areas + // Doesn't modify attached vertices + for (int i = 0; i < (int)mInvMasses.size(); ++i) + if (mInvMasses[i] > 1e-6f) + mInvMasses[i] = 1.f / density; +} + +template <typename T> +nv::cloth::BoundedData ToBoundedData(T& vector) +{ + nv::cloth::BoundedData d; + d.data = &vector[0]; + d.stride = sizeof(vector[0]); + d.count = (physx::PxU32)vector.size(); + + return d; +} + +nv::cloth::ClothMeshDesc ClothMeshData::GetClothMeshDesc() +{ + nv::cloth::ClothMeshDesc d; + d.setToDefault(); + d.points = ToBoundedData(mVertices); + if (mQuads.size() != 0) + d.quads = ToBoundedData(mQuads); + if (mTriangles.size() != 0) + d.triangles = ToBoundedData(mTriangles); + d.invMasses = ToBoundedData(mInvMasses); + + return d; +} + +SimpleMesh ClothMeshData::GetRenderMesh() +{ + return mMesh; +}
\ No newline at end of file |