aboutsummaryrefslogtreecommitdiff
path: root/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp
diff options
context:
space:
mode:
authorAnton Novoselov <[email protected]>2017-08-01 12:53:38 +0300
committerAnton Novoselov <[email protected]>2017-08-01 12:53:38 +0300
commit236f03c0b9a4982328ed1201978f7f69d192d9b2 (patch)
treee486f2fa39dba203563895541e92c60ed3e25759 /tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp
parentAdded screens to welcome page (diff)
downloadarchived-blast-236f03c0b9a4982328ed1201978f7f69d192d9b2.tar.xz
archived-blast-236f03c0b9a4982328ed1201978f7f69d192d9b2.zip
Blast 1.1 release (windows / linux)
see docs/release_notes.txt for details
Diffstat (limited to 'tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp')
-rw-r--r--tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp175
1 files changed, 160 insertions, 15 deletions
diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp
index d231a6c..1e45003 100644
--- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp
+++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp
@@ -1,12 +1,30 @@
-/*
-* 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.
-*/
+// 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"
@@ -14,14 +32,101 @@
//#define TINYOBJLOADER_IMPLEMENTATION
// Add By Lixu End
#include "tiny_obj_loader.h"
-
+#include "MathUtil.h"
+#include "NvBlastExtExporterFbxReader.h"
using namespace physx;
+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
+
+ FbxFileReader rdr;
+ 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
+ */
+ std::vector<uint32_t> infl;
+ rdr.getBoneInfluences(infl);
+ for (uint32_t i = 0; i < rdr.getBoneCount(); ++i)
+ {
+ std::vector<int32_t> indRemap(rdr.getPositionArray().size(), -1);
+ std::vector<uint32_t> indices;
+ SimpleMesh cmesh;
+ for (uint32_t j = 0; j < rdr.getPositionArray().size(); ++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.getIndexArray().size(); 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;
+ }
+ 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;
@@ -30,14 +135,14 @@ BlastModelPtr BlastModel::loadFromFileTinyLoader(const char* path)
std::string mtlPath;
for (size_t i = strnlen(path, 255) - 1; i >= 0; --i)
{
- if (path[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());
@@ -54,11 +159,24 @@ BlastModelPtr BlastModel::loadFromFileTinyLoader(const char* path)
{
tinyobj::material_t *pMaterial = &mats[i];
- if (!pMaterial->diffuse_texname.empty())
+ // Add By Lixu Begin
+ if (strcmp(pMaterial->name.c_str(), "neverMat123XABCnever") == 0)
+ {
+ model->materials[i].name.clear();
+ }
+ else
{
-// Add By Lixu Begin
model->materials[i].name = pMaterial->name;
-// Add By Lixu End
+ }
+ // 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;
}
}
@@ -154,12 +272,39 @@ BlastModelPtr BlastModel::loadFromFileTinyLoader(const char* path)
}
}
+ // compute 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 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;
}
}