diff options
Diffstat (limited to 'tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp')
| -rw-r--r-- | tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp | 338 |
1 files changed, 0 insertions, 338 deletions
diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp deleted file mode 100644 index 2f00207..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp +++ /dev/null @@ -1,338 +0,0 @@ -// This code contains NVIDIA Confidential Information and is disclosed to you -// under a form of NVIDIA software license agreement provided separately to you. -// -// Notice -// NVIDIA Corporation and its licensors retain all intellectual property and -// proprietary rights in and to this software and 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. -// -// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES -// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO -// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, -// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. -// -// Information and code furnished is believed to be accurate and reliable. -// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such -// information or for any infringement of patents or other rights of third parties that may -// result from its use. No license is granted by implication or otherwise under any patent -// or patent rights of NVIDIA Corporation. Details are subject to change without notice. -// This code supersedes and replaces all information previously supplied. -// NVIDIA Corporation products are not authorized for use as critical -// components in life support devices or systems without express written approval of -// NVIDIA Corporation. -// -// Copyright (c) 2008-2017 NVIDIA Corporation. All rights reserved. - - -#include "BlastModel.h" - -// Add By Lixu Begin -//#define TINYOBJLOADER_IMPLEMENTATION -// Add By Lixu End -#include "tiny_obj_loader.h" -#include "MathUtil.h" -#include "NvBlastExtExporter.h" -#include "NvBlastGlobals.h" - -using namespace physx; - -void computeFacenormalByPosition( - physx::PxVec3 p0, physx::PxVec3 p1, physx::PxVec3 p2, - physx::PxVec3& facenormal) -{ - physx::PxVec3 p01 = p1 - p0; - physx::PxVec3 p02 = p2 - p0; - - facenormal.x = p01.y * p02.z - p01.z * p02.y; - facenormal.y = p01.z * p02.x - p01.x * p02.z; - facenormal.z = p01.x * p02.y - p01.y * p02.x; - - facenormal = -facenormal.getNormalized(); -} - -void computeTangentByPositionAndTexcoord( - physx::PxVec3 p0, physx::PxVec3 p1, physx::PxVec3 p2, - physx::PxVec2 r0, physx::PxVec2 r1, physx::PxVec2 r2, - physx::PxVec3& tangent) -{ - float x1 = p1.x - p0.x; - float x2 = p2.x - p0.x; - float y1 = p1.y - p0.y; - float y2 = p2.y - p0.y; - float z1 = p1.z - p0.z; - float z2 = p2.z - p0.z; - - float s1 = r1.x - r0.x; - float s2 = r2.x - r0.x; - float t1 = r1.y - r0.y; - float t2 = r2.y - r0.y; - - float r = 1.0f / (s1 * t2 - s2 * t1); - - tangent = PxVec3((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r); -} - -BlastModelPtr BlastModel::loadFromFbxFile(const char* path) -{ -// Add By Lixu Begin - BlastModel* model = new BlastModel(); - model->bbMin = PxVec3(FLT_MAX, FLT_MAX, FLT_MAX); - model->bbMax = PxVec3(FLT_MIN, FLT_MIN, FLT_MIN); -// Add By Lixu End - - - std::shared_ptr<Nv::Blast::IFbxFileReader> rdr(NvBlastExtExporterCreateFbxFileReader(), [](Nv::Blast::IFbxFileReader* p) {p->release(); }); - rdr->loadFromFile(path); - if (rdr->getBoneCount() == 0) - { - return nullptr; - } - - model->chunks.resize(rdr->getBoneCount()); - - model->materials.push_back(BlastModel::Material()); - - - /** - Produce buffers of appropriate for AssetViewer format - */ - uint32_t* infl; - rdr->getBoneInfluences(infl); - for (uint32_t i = 0; i < rdr->getBoneCount(); ++i) - { - std::vector<int32_t> indRemap(rdr->getVerticesCount(), -1); - std::vector<uint32_t> indices; - SimpleMesh cmesh; - for (uint32_t j = 0; j < rdr->getVerticesCount(); ++j) - { - if (i == infl[j]) - { - indRemap[j] = (int32_t)cmesh.vertices.size(); - cmesh.vertices.push_back(SimpleMesh::Vertex()); - cmesh.vertices.back().normal = rdr->getNormalsArray()[j]; - cmesh.vertices.back().position = rdr->getPositionArray()[j]; - cmesh.vertices.back().uv = rdr->getUvArray()[j]; - } - } - for (uint32_t j = 0; j < rdr->getIdicesCount(); j += 3) - { - if (i == infl[rdr->getIndexArray()[j]]) - { - int32_t lind = rdr->getIndexArray()[j + 2]; - cmesh.indices.push_back(indRemap[lind]); - lind = rdr->getIndexArray()[j + 1]; - cmesh.indices.push_back(indRemap[lind]); - lind = rdr->getIndexArray()[j]; - cmesh.indices.push_back(indRemap[lind]); - } - } - - model->chunks[i].meshes.push_back(Chunk::Mesh()); - model->chunks[i].meshes.back().materialIndex = 0; - model->chunks[i].meshes.back().mesh = cmesh; - - NVBLAST_FREE(infl); - } - return model; -} - - -BlastModelPtr BlastModel::loadFromFileTinyLoader(const char* path) -{ -// Add By Lixu Begin - BlastModel* model = new BlastModel(); - model->bbMin = PxVec3(FLT_MAX, FLT_MAX, FLT_MAX); - model->bbMax = PxVec3(FLT_MIN, FLT_MIN, FLT_MIN); -// Add By Lixu End - - std::vector<tinyobj::shape_t> shapes; - std::vector<tinyobj::material_t> mats; - std::string err; - std::string mtlPath; - for (size_t i = strnlen(path, 255) - 1; i >= 0; --i) - { - if (path[i] == '\\' || path[i] == '/') - { - mtlPath.resize(i + 2, 0); - strncpy(&mtlPath[0], path, i + 1); - break; - } - } - - - bool ret = tinyobj::LoadObj(shapes, mats, err, path, mtlPath.data()); - - // can't load? - if (!ret) - return false; - - // one submodel per material - uint32_t materialsCount = (uint32_t)mats.size(); - model->materials.resize(materialsCount); - - // fill submodel materials - for (uint32_t i = 0; i < materialsCount; i++) - { - tinyobj::material_t *pMaterial = &mats[i]; - - // Add By Lixu Begin - if (strcmp(pMaterial->name.c_str(), "neverMat123XABCnever") == 0) - { - model->materials[i].name.clear(); - } - else - { - model->materials[i].name = pMaterial->name; - } - // Add By Lixu End - - model->materials[i].r = pMaterial->diffuse[0]; - model->materials[i].g = pMaterial->diffuse[1]; - model->materials[i].b = pMaterial->diffuse[2]; - model->materials[i].a = 1.0; - - if (!pMaterial->diffuse_texname.empty()) - { - model->materials[i].diffuseTexture = pMaterial->diffuse_texname; - } - } - - // estimate - model->chunks.reserve(shapes.size() / materialsCount + 1); - - if (shapes.size() > 0) - { - uint32_t meshIndex = 0; - for (uint32_t m = 0; m < shapes.size(); m++) - { - tinyobj::shape_t& pMesh = shapes[m]; - uint32_t materialIndex; - uint32_t chunkIndex; - sscanf(pMesh.name.data(), "%d_%d", &chunkIndex, &materialIndex); - if (model->chunks.size() <= chunkIndex) - { - model->chunks.resize(chunkIndex + 1); - } - model->chunks[chunkIndex].meshes.push_back(Chunk::Mesh()); - Chunk::Mesh& mesh = model->chunks[chunkIndex].meshes.back(); - - mesh.materialIndex = materialIndex; - SimpleMesh& chunkMesh = mesh.mesh; - - PxVec3 emin(FLT_MAX, FLT_MAX, FLT_MAX); - PxVec3 emax(FLT_MIN, FLT_MIN, FLT_MIN); - - - - // create an index buffer - chunkMesh.indices.resize(pMesh.mesh.indices.size()); - - // Check if all faces are triangles - bool allTriangles = true; - for (uint32_t i = 0; i < pMesh.mesh.num_vertices.size(); ++i) - { - if (pMesh.mesh.num_vertices[i] != 3) - { - allTriangles = false; - break; - } - } - - if (pMesh.mesh.indices.size() > 0 && allTriangles) - { - for (uint32_t i = 0; i < pMesh.mesh.indices.size(); i += 3) - { - chunkMesh.indices[i] = (uint16_t)pMesh.mesh.indices[i + 2]; - chunkMesh.indices[i + 1] = (uint16_t)pMesh.mesh.indices[i + 1]; - chunkMesh.indices[i + 2] = (uint16_t)pMesh.mesh.indices[i]; - } - } - // create vertex buffer - chunkMesh.vertices.resize(pMesh.mesh.positions.size() / 3); - // copy positions - uint32_t indexer = 0; - for (uint32_t i = 0; i < pMesh.mesh.positions.size() / 3; i++) - { - chunkMesh.vertices[i].position.x = pMesh.mesh.positions[indexer]; - chunkMesh.vertices[i].position.y = pMesh.mesh.positions[indexer + 1]; - chunkMesh.vertices[i].position.z = pMesh.mesh.positions[indexer + 2]; - indexer += 3; - // calc min/max - emin = emin.minimum(chunkMesh.vertices[i].position); - emax = emax.maximum(chunkMesh.vertices[i].position); - } - - // copy normals - if (pMesh.mesh.normals.size() > 0) - { - indexer = 0; - for (uint32_t i = 0; i < pMesh.mesh.normals.size() / 3; i++) - { - chunkMesh.vertices[i].normal.x = pMesh.mesh.normals[indexer]; - chunkMesh.vertices[i].normal.y = pMesh.mesh.normals[indexer + 1]; - chunkMesh.vertices[i].normal.z = pMesh.mesh.normals[indexer + 2]; - - indexer += 3; - } - } - - // copy uv - if (pMesh.mesh.texcoords.size() > 0) - { - indexer = 0; - for (uint32_t i = 0; i < pMesh.mesh.texcoords.size() / 2; i++) - { - chunkMesh.vertices[i].uv.x = pMesh.mesh.texcoords[indexer]; - chunkMesh.vertices[i].uv.y = pMesh.mesh.texcoords[indexer + 1]; - indexer += 2; - } - } - - // compute facenormal and tangent - if (pMesh.mesh.indices.size() > 0 && allTriangles) - { - for (uint32_t i = 0; i < pMesh.mesh.indices.size(); i += 3) - { - SimpleMesh::Vertex& v0 = chunkMesh.vertices[chunkMesh.indices[i + 0]]; - SimpleMesh::Vertex& v1 = chunkMesh.vertices[chunkMesh.indices[i + 1]]; - SimpleMesh::Vertex& v2 = chunkMesh.vertices[chunkMesh.indices[i + 2]]; - - physx::PxVec3 facenormal; - computeFacenormalByPosition( - v0.position, v1.position, v2.position, facenormal); - - v0.facenormal = facenormal; - v1.facenormal = facenormal; - v2.facenormal = facenormal; - - physx::PxVec3 tangent; - computeTangentByPositionAndTexcoord( - v0.position, v1.position, v2.position, v0.uv, v1.uv, v2.uv, tangent); - - v0.tangent += tangent; - v1.tangent += tangent; - v2.tangent += tangent; - } - for (uint32_t i = 0; i < chunkMesh.vertices.size(); i++) - { - chunkMesh.vertices[i].tangent = chunkMesh.vertices[i].tangent.getNormalized(); - } - } - - // assign extents - chunkMesh.extents = (emax - emin) * 0.5f; - - // get the center - chunkMesh.center = emin + chunkMesh.extents; - - atcore_float3 min = gfsdk_min(*(atcore_float3*)&emin, *(atcore_float3*)&(model->bbMin)); - model->bbMin = *(physx::PxVec3*)&min; - atcore_float3 max = gfsdk_max(*(atcore_float3*)&emax, *(atcore_float3*)&(model->bbMax)); - model->bbMax = *(physx::PxVec3*)&max; - } - } - - return model; -} |