diff options
| author | Anton Novoselov <[email protected]> | 2017-08-08 20:14:22 +0300 |
|---|---|---|
| committer | Anton Novoselov <[email protected]> | 2017-08-08 20:14:22 +0300 |
| commit | d41654b469fa51870b5952c836c04d9da17f32d3 (patch) | |
| tree | 64f8f437eef394630355f281d35ca1d53e5c4d6c /tools/ArtistTools/source | |
| parent | add +x for packman script (diff) | |
| download | blast-d41654b469fa51870b5952c836c04d9da17f32d3.tar.xz blast-d41654b469fa51870b5952c836c04d9da17f32d3.zip | |
Updated to CL 22627414:
* docs updates
* authoring fixes
* stress solver crash fixes
Diffstat (limited to 'tools/ArtistTools/source')
21 files changed, 465 insertions, 519 deletions
diff --git a/tools/ArtistTools/source/BlastPlugin/BlastPlugin.cpp b/tools/ArtistTools/source/BlastPlugin/BlastPlugin.cpp index 582a5e5..4890dbf 100644 --- a/tools/ArtistTools/source/BlastPlugin/BlastPlugin.cpp +++ b/tools/ArtistTools/source/BlastPlugin/BlastPlugin.cpp @@ -72,7 +72,8 @@ #include "SelectionToolController.h" #include "GizmoToolController.h" #include <QtCore/QTimer> - +#include "NvBlastExtAuthoring.h" +#include "ResourceManager.h" const float tolenrance = 10e-6; QTimer gPlayTimer; @@ -110,8 +111,8 @@ return u + v <= 1; } */ -bool outside(int vc1, int fc1, Vertex* pv1, physx::PxBounds3& b1, - int vc2, int fc2, Vertex* pv2, physx::PxBounds3& b2) +bool outside(int vc1, int fc1, const Vertex* pv1, const physx::PxBounds3& b1, + int vc2, int fc2, const Vertex* pv2, const physx::PxBounds3& b2) { // mesh2 is not a volumn if (fc2 < 4) @@ -195,12 +196,12 @@ int contains(Nv::Blast::Mesh* pMesh1, Nv::Blast::Mesh* pMesh2) int vc1 = pMesh1->getVerticesCount(); int fc1 = pMesh1->getFacetCount(); - Vertex* pv1 = pMesh1->getVertices(); - physx::PxBounds3& b1 = pMesh1->getBoundingBox(); + const Vertex* pv1 = pMesh1->getVertices(); + const physx::PxBounds3& b1 = pMesh1->getBoundingBox(); int vc2 = pMesh2->getVerticesCount(); int fc2 = pMesh2->getFacetCount(); - Vertex* pv2 = pMesh2->getVertices(); - physx::PxBounds3& b2 = pMesh2->getBoundingBox(); + const Vertex* pv2 = pMesh2->getVertices(); + const physx::PxBounds3& b2 = pMesh2->getBoundingBox(); if (outside(vc1, fc1, pv1, b1, vc2, fc2, pv2, b2)) { @@ -898,9 +899,11 @@ void BlastPlugin::SimpleScene_OpenFilesByDrop(const QStringList& fileNames) } } bool bUpdateUI = false; + ResourceManager* pResourceManager = ResourceManager::ins(); if (projCount == 1) { QFileInfo fileInfo(projName); + pResourceManager->addSearchDir(fileInfo.absolutePath().toUtf8().data()); GlobalSettings& globalSettings = GlobalSettings::Inst(); globalSettings.m_projectFileDir = fileInfo.absolutePath().toUtf8().data(); globalSettings.m_projectFileName = fileInfo.fileName().toUtf8().data(); @@ -910,12 +913,14 @@ void BlastPlugin::SimpleScene_OpenFilesByDrop(const QStringList& fileNames) else if (fbxCount == 1) { QFileInfo fileInfo(fbxName); + pResourceManager->addSearchDir(fileInfo.absolutePath().toUtf8().data()); SimpleScene_LoadSceneFromFbx(fileInfo.absolutePath().toUtf8().data(), fileInfo.fileName().toUtf8().data()); bUpdateUI = true; } else if (bpxaCount == 1) { QFileInfo fileInfo(bpxaName); + pResourceManager->addSearchDir(fileInfo.absolutePath().toUtf8().data()); OpenBpxa(fileInfo.absolutePath().toUtf8().data(), fileInfo.fileName().toUtf8().data()); bUpdateUI = true; } @@ -1173,7 +1178,7 @@ bool BlastPlugin::SimpleScene_LoadSceneFromFbx(const char* d, const char* f) physx::PxVec3* nr = (!normals.empty()) ? normals.data() : 0; physx::PxVec2* uvp = (!uv.empty()) ? uv.data() : 0; - Nv::Blast::Mesh* pMesh = new Nv::Blast::Mesh(positions.data(), nr, uvp, static_cast<uint32_t>(positions.size()), + Nv::Blast::Mesh* pMesh = NvBlastExtAuthoringCreateMesh(positions.data(), nr, uvp, static_cast<uint32_t>(positions.size()), indices.data(), static_cast<uint32_t>(indices.size())); meshes[nm] = pMesh; @@ -1504,11 +1509,12 @@ bool BlastPlugin::SimpleScene_LoadParameters(NvParameterized::Interface* iface) physx::PxVec3* nr = (!normals.empty()) ? normals.data() : 0; physx::PxVec2* uvp = (!uv.empty()) ? uv.data() : 0; - Nv::Blast::Mesh* pMesh = new Nv::Blast::Mesh(positions.data(), nr, uvp, static_cast<uint32_t>(positions.size()), + Nv::Blast::Mesh* pMesh = NvBlastExtAuthoringCreateMesh(positions.data(), nr, uvp, static_cast<uint32_t>(positions.size()), indices.data(), static_cast<uint32_t>(indices.size())); for (uint32_t nf = 0; nf < numFaces; nf++) { - pMesh->getFacet(nf)->userData = materialIDArray.buf[nf]; + Facet* pFacet = const_cast<Facet*>(pMesh->getFacet(nf)); + pFacet->materialId = materialIDArray.buf[nf]; } meshes.push_back(pMesh); diff --git a/tools/ArtistTools/source/BlastPlugin/Parameters/BlastProjectParams.pl b/tools/ArtistTools/source/BlastPlugin/Parameters/BlastProjectParams.pl index bb22204..ad959ec 100644 --- a/tools/ArtistTools/source/BlastPlugin/Parameters/BlastProjectParams.pl +++ b/tools/ArtistTools/source/BlastPlugin/Parameters/BlastProjectParams.pl @@ -1060,26 +1060,21 @@ hints => { shortDescription => "Is this blast asset export FBX" }, }, { - name => 'obj', - type => 'STRING', - hints => { shortDescription => "OBJ export asset path" }, - }, - { - name => 'exportOBJ', + name => 'embedFBXCollision', type => 'BOOL', defaultValue => 'false', - hints => { shortDescription => "Is this blast asset export OBJ" }, + hints => { shortDescription => "Whether embed collisio in export FBX" }, }, { - name => 'collision', + name => 'obj', type => 'STRING', - hints => { shortDescription => "Collision export asset path" }, + hints => { shortDescription => "OBJ export asset path" }, }, { - name => 'exportCollision', + name => 'exportOBJ', type => 'BOOL', defaultValue => 'false', - hints => { shortDescription => "Is this blast asset export Collision" }, + hints => { shortDescription => "Is this blast asset export OBJ" }, }, { name => 'llasset', diff --git a/tools/ArtistTools/source/BlastPlugin/Parameters/HackNvParamBug.cpp b/tools/ArtistTools/source/BlastPlugin/Parameters/HackNvParamBug.cpp index 6017a75..5cd0a32 100644 --- a/tools/ArtistTools/source/BlastPlugin/Parameters/HackNvParamBug.cpp +++ b/tools/ArtistTools/source/BlastPlugin/Parameters/HackNvParamBug.cpp @@ -9,6 +9,8 @@ int GetHackElementSize(const char* data) return sizeof(nvidia::NvVec3); if (strstr(data, "graphicsMesh.normals") != nullptr) return sizeof(nvidia::NvVec3); + if (strstr(data, "graphicsMesh.tangents") != nullptr) + return sizeof(nvidia::NvVec3); if (strstr(data, "graphicsMesh.texcoords") != nullptr) return sizeof(nvidia::NvVec2); if (strstr(data, "graphicsMesh.positionIndexes") != nullptr) diff --git a/tools/ArtistTools/source/BlastPlugin/Parameters/ProjectParams.cpp b/tools/ArtistTools/source/BlastPlugin/Parameters/ProjectParams.cpp index ebe8f3d..3f97631 100644 --- a/tools/ArtistTools/source/BlastPlugin/Parameters/ProjectParams.cpp +++ b/tools/ArtistTools/source/BlastPlugin/Parameters/ProjectParams.cpp @@ -130,7 +130,6 @@ void freeBlast(BPPAsset& data) freeString(data.name); freeString(data.fbx); freeString(data.obj); - freeString(data.collision); freeString(data.llasset); freeString(data.tkasset); freeString(data.bpxa); @@ -732,13 +731,12 @@ void copy(BPPAsset& dest, BPPAsset& source) copy(dest.activeUserPreset, source.activeUserPreset); copy(dest.fbx, source.fbx); copy(dest.obj, source.obj); - copy(dest.collision, source.collision); copy(dest.llasset, source.llasset); copy(dest.tkasset, source.tkasset); copy(dest.bpxa, source.bpxa); dest.exportFBX = source.exportFBX; + dest.embedFBXCollision = source.embedFBXCollision; dest.exportOBJ = source.exportOBJ; - dest.exportCollision = source.exportCollision; dest.exportLLAsset = source.exportLLAsset; dest.exportTKAsset = source.exportTKAsset; dest.exportBPXA = source.exportBPXA; @@ -1471,13 +1469,12 @@ void init(BPPAsset& param) init(param.stressSolver); param.obj.buf = nullptr; param.fbx.buf = nullptr; - param.collision.buf = nullptr; param.llasset.buf = nullptr; param.tkasset.buf = nullptr; param.bpxa.buf = nullptr; param.exportFBX = false; + param.embedFBXCollision = true; param.exportOBJ = false; - param.exportCollision = false; param.exportLLAsset = false; param.exportTKAsset = false; param.exportBPXA = false; diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.cpp index 2c39824..857cb9b 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.cpp @@ -36,7 +36,7 @@ #include "NvBlastExtPxAsset.h" #include <sstream> #include <fstream> -#include "NvBlastExtExporterFbxReader.h" +#include "NvBlastExtExporter.h" #include "PxPhysics.h" #include <NvBlastGlobals.h> #include "NvBlastExtAssetUtils.h" @@ -46,6 +46,8 @@ #include "NvBlastExtLlSerialization.h" #include "NvBlastExtTkSerialization.h" #include "NvBlastExtPxSerialization.h" +#include "NvBlastExtAuthoring.h" +#include "NvBlastExtAuthoringCollisionBuilder.h" BlastAssetModel::BlastAssetModel(TkFramework& framework, PxPhysics& physics, PxCooking& cooking, ExtSerialization& serialization, Renderer& renderer, const char* modelName, const char* modelPath) : BlastAsset(renderer) @@ -179,27 +181,31 @@ BlastAssetModel::BlastAssetModel(TkFramework& framework, PxPhysics& physics, PxC path = GlobalSettings::MakeFileName(modelPath, objFileName.str().c_str()); if (QFile::exists(path.c_str())) { - FbxFileReader rdr; - rdr.loadFromFile(path); - if (rdr.isCollisionLoaded() == 0) + std::shared_ptr<IFbxFileReader> rdr(NvBlastExtExporterCreateFbxFileReader(), [](IFbxFileReader* p) {p->release(); }); + rdr->loadFromFile(path.c_str()); + if (rdr->isCollisionLoaded() == 0) { ASSERT_PRINT(false, "fbx doesn't contain collision geometry"); } - std::vector<std::vector<CollisionHull> > hulls; - rdr.getCollision(hulls); + uint32_t* hullsOffsets = nullptr; + CollisionHull** hulls = nullptr; + uint32_t meshCount = rdr->getCollision(hullsOffsets, hulls); /** Create physics meshes; */ - Nv::Blast::ConvexMeshBuilder collisionBuilder(&cooking, &physics.getPhysicsInsertionCallback()); - physicsChunks.resize(hulls.size()); - physicsSubchunks.resize(hulls.size()); + std::shared_ptr<Nv::Blast::ConvexMeshBuilder> collisionBuilder( + NvBlastExtAuthoringCreateConvexMeshBuilder(&cooking, &physics.getPhysicsInsertionCallback()), + [](Nv::Blast::ConvexMeshBuilder* cmb) {cmb->release(); }); - for (uint32_t i = 0; i < hulls.size(); ++i) + physicsChunks.resize(meshCount); + physicsSubchunks.resize(meshCount); + + for (uint32_t i = 0; i < meshCount; ++i) { - for (uint32_t sbHulls = 0; sbHulls < hulls[i].size(); ++sbHulls) + for (uint32_t sbHulls = hullsOffsets[i]; sbHulls < hullsOffsets[i+1]; ++sbHulls) { - PxConvexMeshGeometry temp = physx::PxConvexMeshGeometry(collisionBuilder.buildConvexMesh(hulls[i][sbHulls])); + PxConvexMeshGeometry temp = physx::PxConvexMeshGeometry(collisionBuilder.get()->buildConvexMesh(*hulls[sbHulls])); if (temp.isValid()) { physicsSubchunks[i].push_back(ExtPxAssetDesc::SubchunkDesc()); @@ -208,12 +214,20 @@ BlastAssetModel::BlastAssetModel(TkFramework& framework, PxPhysics& physics, PxC } } } - for (uint32_t i = 0; i < hulls.size(); ++i) + for (uint32_t i = 0; i < meshCount; ++i) { physicsChunks[i].isStatic = false; physicsChunks[i].subchunkCount = (uint32_t)physicsSubchunks[i].size(); physicsChunks[i].subchunks = physicsSubchunks[i].data(); } + if (hullsOffsets) + { + NVBLAST_FREE(hullsOffsets); + } + if (hulls) + { + NVBLAST_FREE(hulls); + } } m_pxAsset = ExtPxAsset::create(tkAsset, physicsChunks.data(), (uint32_t)physicsChunks.size()); ASSERT_PRINT(m_pxAsset != nullptr, "can't create asset"); diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.cpp index 01559da..7d2cbe4 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.cpp @@ -162,9 +162,10 @@ public: m_device = GetDeviceManager()->GetDevice(); m_inputDesc.push_back({ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - m_inputDesc.push_back({ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - m_inputDesc.push_back({ "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - m_inputDesc.push_back({ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 36, D3D11_INPUT_PER_VERTEX_DATA, 0 }); + m_inputDesc.push_back({ "VERTEX_NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }); + m_inputDesc.push_back({ "FACE_NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }); + m_inputDesc.push_back({ "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 36, D3D11_INPUT_PER_VERTEX_DATA, 0 }); + m_inputDesc.push_back({ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 48, D3D11_INPUT_PER_VERTEX_DATA, 0 }); m_inputDesc.push_back({ "TEXCOORD", 1, DXGI_FORMAT_R32_FLOAT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); m_numVertices = static_cast<uint32_t>(mesh->vertices.size()); diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.cpp index 5051534..cbd299b 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.cpp @@ -31,7 +31,8 @@ #include <BlastAsset.h> #include <NvBlastExtPxAsset.h> #include <NvBlastTkAsset.h> - +#include "NvBlastExtAuthoring.h" +#include "NvBlastExtAuthoringMeshImpl.h" void BlastFractureTool::free() { std::vector<Nv::Blast::Mesh*>::iterator it; @@ -101,7 +102,7 @@ void BlastFractureTool::setSourceAsset(const BlastAsset* pBlastAsset) PxVec3* nr = (!normals.empty()) ? normals.data() : 0; PxVec2* uvp = (!uv.empty()) ? uv.data() : 0; - Nv::Blast::Mesh* pMesh = new Nv::Blast::Mesh( + Nv::Blast::Mesh* pMesh = NvBlastExtAuthoringCreateMesh( positions.data(), nr, uvp, static_cast<uint32_t>(positions.size()), ind.data(), static_cast<uint32_t>(ind.size())); @@ -117,7 +118,8 @@ void BlastFractureTool::setSourceAsset(const BlastAsset* pBlastAsset) curMaterialIndex = materialIndexes[curFaceIndex]; } - pMesh->getFacet(fc)->userData = curMaterialIndex; + Facet* pFacet = const_cast<Facet*>(pMesh->getFacet(fc)); + pFacet->materialId = curMaterialIndex; } chunkMeshes[cs] = pMesh; @@ -162,22 +164,24 @@ void BlastFractureTool::setSourceAsset(const BlastAsset* pBlastAsset) { if (chunkMeshes[cs] == nullptr) continue; - mChunkData[cs].meshData = new Nv::Blast::Mesh(*chunkMeshes[cs]); + mChunkData[cs].meshData = new MeshImpl(*reinterpret_cast<const MeshImpl*>(chunkMeshes[cs])); mChunkData[cs].parent = parentIds[cs]; mChunkData[cs].chunkId = mChunkIdCounter++; mChunkData[cs].isLeaf = isLeafs[cs]; mesh = mChunkData[cs].meshData; - Nv::Blast::Vertex* verticesBuffer = mesh->getVertices(); + Nv::Blast::Vertex* verticesBuffer = const_cast<Nv::Blast::Vertex*>(mesh->getVertices()); for (uint32_t i = 0; i < mesh->getVerticesCount(); ++i) { verticesBuffer[i].p = (verticesBuffer[i].p - mOffset) * (1.0f / mScaleFactor); } - mesh->getBoundingBox().minimum = (mesh->getBoundingBox().minimum - mOffset) * (1.0f / mScaleFactor); - mesh->getBoundingBox().maximum = (mesh->getBoundingBox().maximum - mOffset) * (1.0f / mScaleFactor); + PxBounds3& bb = const_cast<PxBounds3&>(mesh->getBoundingBox()); + bb.minimum = (bb.minimum - mOffset) * (1.0f / mScaleFactor); + bb.maximum = (bb.maximum - mOffset) * (1.0f / mScaleFactor); for (uint32_t i = 0; i < mesh->getFacetCount(); ++i) { - mesh->getFacet(i)->userData = chunkMeshes[cs]->getFacet(i)->userData; + Facet* pFacet = const_cast<Facet*>(mesh->getFacet(i)); + pFacet->materialId = chunkMeshes[cs]->getFacet(i)->materialId; } } } @@ -195,7 +199,7 @@ void BlastFractureTool::setSourceMeshes(std::vector<Nv::Blast::Mesh*>& meshes, s chunkMeshes.resize(chunkSize, nullptr); for (int cs = 0; cs < chunkSize; cs++) { - Nv::Blast::Mesh* pMesh = new Nv::Blast::Mesh(*meshes[cs]); + Nv::Blast::Mesh* pMesh = new MeshImpl(*reinterpret_cast<const MeshImpl*>(meshes[cs])); chunkMeshes[cs] = pMesh; } @@ -223,22 +227,24 @@ void BlastFractureTool::setSourceMeshes(std::vector<Nv::Blast::Mesh*>& meshes, s { if (chunkMeshes[cs] == nullptr) continue; - mChunkData[cs].meshData = new Nv::Blast::Mesh(*chunkMeshes[cs]); + mChunkData[cs].meshData = new MeshImpl(*reinterpret_cast<const MeshImpl*>(chunkMeshes[cs])); mChunkData[cs].parent = parentIds[cs]; mChunkData[cs].chunkId = mChunkIdCounter++; mChunkData[cs].isLeaf = isLeafs[cs]; mesh = mChunkData[cs].meshData; - Nv::Blast::Vertex* verticesBuffer = mesh->getVertices(); + Nv::Blast::Vertex* verticesBuffer = const_cast<Nv::Blast::Vertex*>(mesh->getVertices()); for (uint32_t i = 0; i < mesh->getVerticesCount(); ++i) { verticesBuffer[i].p = (verticesBuffer[i].p - mOffset) * (1.0f / mScaleFactor); } - mesh->getBoundingBox().minimum = (mesh->getBoundingBox().minimum - mOffset) * (1.0f / mScaleFactor); - mesh->getBoundingBox().maximum = (mesh->getBoundingBox().maximum - mOffset) * (1.0f / mScaleFactor); + PxBounds3& bb = const_cast<PxBounds3&>(mesh->getBoundingBox()); + bb.minimum = (bb.minimum - mOffset) * (1.0f / mScaleFactor); + bb.maximum = (bb.maximum - mOffset) * (1.0f / mScaleFactor); for (uint32_t i = 0; i < mesh->getFacetCount(); ++i) { - mesh->getFacet(i)->userData = chunkMeshes[cs]->getFacet(i)->userData; + Facet* pFacet = const_cast<Facet*>(mesh->getFacet(i)); + pFacet->materialId = chunkMeshes[cs]->getFacet(i)->materialId; } } } diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.h index 42ff78f..3436551 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.h +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.h @@ -29,7 +29,7 @@ #ifndef BLAST_FRACTURETOOL_H #define BLAST_FRACTURETOOL_H -#include "NvBlastExtAuthoringFractureTool.h" +#include "NvBlastExtAuthoringFractureToolImpl.h" class BlastAsset; namespace Nv @@ -40,7 +40,7 @@ namespace Nv } } -class BlastFractureTool : public Nv::Blast::FractureTool +class BlastFractureTool : public Nv::Blast::FractureToolImpl { public: BlastFractureTool() {} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp index 1e45003..2f00207 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.cpp @@ -33,10 +33,25 @@ // Add By Lixu End #include "tiny_obj_loader.h" #include "MathUtil.h" -#include "NvBlastExtExporterFbxReader.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, @@ -67,14 +82,15 @@ BlastModelPtr BlastModel::loadFromFbxFile(const char* path) model->bbMax = PxVec3(FLT_MIN, FLT_MIN, FLT_MIN); // Add By Lixu End - FbxFileReader rdr; - rdr.loadFromFile(path); - if (rdr.getBoneCount() == 0) + + 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->chunks.resize(rdr->getBoneCount()); model->materials.push_back(BlastModel::Material()); @@ -82,33 +98,33 @@ BlastModelPtr BlastModel::loadFromFbxFile(const char* path) /** Produce buffers of appropriate for AssetViewer format */ - std::vector<uint32_t> infl; - rdr.getBoneInfluences(infl); - for (uint32_t i = 0; i < rdr.getBoneCount(); ++i) + 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<int32_t> indRemap(rdr->getVerticesCount(), -1); std::vector<uint32_t> indices; SimpleMesh cmesh; - for (uint32_t j = 0; j < rdr.getPositionArray().size(); ++j) + 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]; + 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) + for (uint32_t j = 0; j < rdr->getIdicesCount(); j += 3) { - if (i == infl[rdr.getIndexArray()[j]]) + if (i == infl[rdr->getIndexArray()[j]]) { - int32_t lind = rdr.getIndexArray()[j + 2]; + int32_t lind = rdr->getIndexArray()[j + 2]; cmesh.indices.push_back(indRemap[lind]); - lind = rdr.getIndexArray()[j + 1]; + lind = rdr->getIndexArray()[j + 1]; cmesh.indices.push_back(indRemap[lind]); - lind = rdr.getIndexArray()[j]; + lind = rdr->getIndexArray()[j]; cmesh.indices.push_back(indRemap[lind]); } } @@ -116,6 +132,8 @@ BlastModelPtr BlastModel::loadFromFbxFile(const char* path) 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; } @@ -272,7 +290,7 @@ BlastModelPtr BlastModel::loadFromFileTinyLoader(const char* path) } } - // compute tangent + // compute facenormal and tangent if (pMesh.mesh.indices.size() > 0 && allTriangles) { for (uint32_t i = 0; i < pMesh.mesh.indices.size(); i += 3) @@ -281,6 +299,14 @@ BlastModelPtr BlastModel::loadFromFileTinyLoader(const char* path) 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); diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.cpp index 61a174a..88af3a1 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.cpp @@ -71,7 +71,8 @@ #include "FileReferencesPanel.h" #include "BlastPlugin.h" #include "BlastToolBar.h" - +#include "NvBlastExtAuthoring.h" +#include "NvBlastExtExporter.h" using namespace physx; const uint32_t DEFAULT_VORONOI_UNIFORM_SITES_NUMBER = 5; @@ -122,7 +123,9 @@ void loggingCallback(int type, const char* msg, const char* file, int line) void buildPxChunks(const std::vector<std::vector<Triangle>>& chunkGeometry, std::vector<ExtPxAssetDesc::ChunkDesc>& pxChunks, std::vector<ExtPxAssetDesc::SubchunkDesc>& pxSubchunks, std::vector<bool>& statics) { - ConvexMeshBuilder collisionBuilder(cooking, &physics->getPhysicsInsertionCallback()); + std::shared_ptr<Nv::Blast::ConvexMeshBuilder> collisionBuilder( + NvBlastExtAuthoringCreateConvexMeshBuilder(cooking, &physics->getPhysicsInsertionCallback()), + [](Nv::Blast::ConvexMeshBuilder* cmb) {cmb->release(); }); pxChunks.resize(chunkGeometry.size()); pxSubchunks.resize(chunkGeometry.size()); @@ -137,7 +140,8 @@ void buildPxChunks(const std::vector<std::vector<Triangle>>& chunkGeometry, std: vertices.push_back(chunkGeometry[i][p].c.p); } pxSubchunks[i].transform = physx::PxTransform(physx::PxIdentity); - pxSubchunks[i].geometry = physx::PxConvexMeshGeometry(collisionBuilder.buildConvexMesh(vertices)); + pxSubchunks[i].geometry = physx::PxConvexMeshGeometry( + collisionBuilder.get()->buildConvexMesh(*collisionBuilder.get()->buildCollisionGeometry((uint32_t)vertices.size(), vertices.data()))); pxChunks[i].isStatic = statics.size() == 0 ? false : statics[i]; pxChunks[i].subchunkCount = 1; pxChunks[i].subchunks = &pxSubchunks[i]; @@ -268,7 +272,7 @@ void saveFractureToObj(std::vector<std::vector<Triangle> > chunksGeometry, std:: std::vector<int> internalSurfaces; for (uint32_t i = 0; i < totalSize; ++i) { - if (chunksGeometry[vc][i].userInfo != 0) + if (chunksGeometry[vc][i].materialId != 0) { internalSurfaces.push_back(indx++); internalSurfaces.push_back(indx++); @@ -383,10 +387,10 @@ bool VoronoiFractureExecutor::execute() if (mesh == nullptr) continue; - VoronoiSitesGenerator* siteGenerator = nullptr; + VoronoiSitesGenerator* siteGenerator = NvBlastExtAuthoringCreateVoronoiSitesGenerator(mesh, m_randomGenerator == nullptr ? &sRandomGenerator : m_randomGenerator); if (m_voronoi) { - siteGenerator = new VoronoiSitesGenerator(mesh, m_randomGenerator == nullptr ? &sRandomGenerator : m_randomGenerator); +// siteGenerator = new VoronoiSitesGenerator(mesh, m_randomGenerator == nullptr ? &sRandomGenerator : m_randomGenerator); if (0 == m_voronoi->siteGeneration) { siteGenerator->uniformlyGenerateSitesInMesh(m_voronoi->numSites); @@ -398,11 +402,13 @@ bool VoronoiFractureExecutor::execute() } else { - siteGenerator = new VoronoiSitesGenerator(mesh, m_randomGenerator == nullptr ? &sRandomGenerator : m_randomGenerator); +// siteGenerator = new VoronoiSitesGenerator(mesh, m_randomGenerator == nullptr ? &sRandomGenerator : m_randomGenerator); siteGenerator->uniformlyGenerateSitesInMesh(DEFAULT_VORONOI_UNIFORM_SITES_NUMBER); } - m_fractureTool->voronoiFracturing(*it, siteGenerator->getVoronoiSites(), false); + const physx::PxVec3* sites = nullptr; + uint32_t sitesCount = siteGenerator->getVoronoiSites(sites); + m_fractureTool->voronoiFracturing(*it, sitesCount, sites, false); delete siteGenerator; } m_fractureTool->finalizeFracturing(); @@ -686,23 +692,24 @@ bool SampleManager::saveAsset(BlastAsset* pBlastAsset) m_fTool->finalizeFracturing(); size_t nChunkListSize = m_fTool->getChunkCount(); - std::vector<std::shared_ptr<Triangle> > chunkMeshes(nChunkListSize); + std::vector<Triangle*> chunkMeshes(nChunkListSize); std::vector<uint32_t> chunkMeshesTriangleCount(nChunkListSize); - std::vector<bool> isSupport(nChunkListSize); + std::shared_ptr<bool> isSupport(new bool[nChunkListSize] { false }, [](bool* b) {delete[] b; }); for (uint32_t i = 0; i < nChunkListSize; ++i) { chunkMeshesTriangleCount[i] = m_fTool->getBaseMesh(i, chunkMeshes[i]); - isSupport[i] = m_fTool->getChunkInfo(i).isLeaf; + isSupport.get()[i] = m_fTool->getChunkInfo(i).isLeaf; } - BlastBondGenerator bondGenerator(cooking, &physics->getPhysicsInsertionCallback()); + std::shared_ptr<Nv::Blast::BlastBondGenerator> bondGenerator( + NvBlastExtAuthoringCreateBondGenerator(cooking, &physics->getPhysicsInsertionCallback()), + [](Nv::Blast::BlastBondGenerator* bg) {bg->release(); }); BondGenerationConfig cnf; cnf.bondMode = BondGenerationConfig::AVERAGE; - std::vector<NvBlastChunkDesc> chunkDesc; - std::vector<NvBlastBondDesc> bondDescs; - bondGenerator.buildDescFromInternalFracture(m_fTool, isSupport, bondDescs, chunkDesc); - const uint32_t chunkCount = static_cast<uint32_t>(chunkDesc.size()); - const uint32_t bondCount = static_cast<uint32_t>(bondDescs.size()); + NvBlastChunkDesc* chunkDesc; + NvBlastBondDesc* bondDescs; + const uint32_t bondCount = bondGenerator.get()->buildDescFromInternalFracture(m_fTool, isSupport.get(), bondDescs, chunkDesc); + const uint32_t chunkCount = nChunkListSize; if (bondCount == 0) { std::cout << "Can't create bonds descriptors..." << std::endl; @@ -712,9 +719,9 @@ bool SampleManager::saveAsset(BlastAsset* pBlastAsset) { std::vector<uint32_t> chunkReorderMap(chunkCount); std::vector<char> scratch(chunkCount * sizeof(NvBlastChunkDesc)); - NvBlastEnsureAssetExactSupportCoverage(chunkDesc.data(), chunkCount, scratch.data(), loggingCallback); - NvBlastBuildAssetDescChunkReorderMap(chunkReorderMap.data(), chunkDesc.data(), chunkCount, scratch.data(), loggingCallback); - NvBlastApplyAssetDescChunkReorderMapInPlace(chunkDesc.data(), chunkCount, bondDescs.data(), bondCount, chunkReorderMap.data(), true, scratch.data(), loggingCallback); + NvBlastEnsureAssetExactSupportCoverage(chunkDesc, chunkCount, scratch.data(), loggingCallback); + NvBlastBuildAssetDescChunkReorderMap(chunkReorderMap.data(), chunkDesc, chunkCount, scratch.data(), loggingCallback); + NvBlastApplyAssetDescChunkReorderMapInPlace(chunkDesc, chunkCount, bondDescs, bondCount, chunkReorderMap.data(), true, scratch.data(), loggingCallback); chunkReorderInvMap.resize(chunkReorderMap.size()); Nv::Blast::invertMap(chunkReorderInvMap.data(), chunkReorderMap.data(), static_cast<unsigned int>(chunkReorderMap.size())); } @@ -724,7 +731,7 @@ bool SampleManager::saveAsset(BlastAsset* pBlastAsset) { uint32_t chunkIndex = chunkReorderInvMap[i]; resultGeometry[chunkIndex].resize(chunkMeshesTriangleCount[i]); - memcpy(resultGeometry[chunkIndex].data(), chunkMeshes[i].get(), chunkMeshesTriangleCount[i] * sizeof(Triangle)); + memcpy(resultGeometry[chunkIndex].data(), chunkMeshes[i], chunkMeshesTriangleCount[i] * sizeof(Triangle)); } saveFractureToObj(resultGeometry, desc.name, outDir); @@ -855,7 +862,7 @@ uint32_t createChunkRecursive(FbxManager* sdkManager, uint32_t currentCpIdx, uin mesh->AddPolygon(currentCpIdx + cpIdx + 1); mesh->AddPolygon(currentCpIdx + cpIdx + 2); mesh->EndPolygon(); - if (tri.userInfo == 0) + if (tri.materialId == 0) { matElement->GetIndexArray().SetAt(polyCount, 0); } @@ -1003,23 +1010,24 @@ bool SampleManager::exportAsset() m_fTool->finalizeFracturing(); size_t nChunkListSize = m_fTool->getChunkCount(); - std::vector<std::shared_ptr<Triangle> > chunkMeshes(nChunkListSize); + std::vector<Triangle*> chunkMeshes(nChunkListSize); std::vector<uint32_t> chunkMeshesTriangleCount(nChunkListSize); - std::vector<bool> isSupport(nChunkListSize); + std::shared_ptr<bool> isSupport(new bool[nChunkListSize] { false }, [](bool* b) {delete[] b; }); for (uint32_t i = 0; i < nChunkListSize; ++i) { chunkMeshesTriangleCount[i] = m_fTool->getBaseMesh(i, chunkMeshes[i]); - isSupport[i] = m_fTool->getChunkInfo(i).isLeaf; + isSupport.get()[i] = m_fTool->getChunkInfo(i).isLeaf; } - BlastBondGenerator bondGenerator(cooking, &physics->getPhysicsInsertionCallback()); + std::shared_ptr<Nv::Blast::BlastBondGenerator> bondGenerator( + NvBlastExtAuthoringCreateBondGenerator(cooking, &physics->getPhysicsInsertionCallback()), + [](Nv::Blast::BlastBondGenerator* bg) {bg->release(); }); BondGenerationConfig cnf; cnf.bondMode = BondGenerationConfig::AVERAGE; - std::vector<NvBlastChunkDesc> chunkDesc; - std::vector<NvBlastBondDesc> bondDescs; - bondGenerator.buildDescFromInternalFracture(m_fTool, isSupport, bondDescs, chunkDesc); - const uint32_t chunkCount = static_cast<uint32_t>(chunkDesc.size()); - const uint32_t bondCount = static_cast<uint32_t>(bondDescs.size()); + NvBlastChunkDesc* chunkDesc; + NvBlastBondDesc* bondDescs; + const uint32_t bondCount = bondGenerator.get()->buildDescFromInternalFracture(m_fTool, isSupport.get(), bondDescs, chunkDesc); + const uint32_t chunkCount = nChunkListSize; if (bondCount == 0) { std::cout << "Can't create bonds descriptors..." << std::endl; @@ -1029,9 +1037,9 @@ bool SampleManager::exportAsset() { std::vector<uint32_t> chunkReorderMap(chunkCount); std::vector<char> scratch(chunkCount * sizeof(NvBlastChunkDesc)); - NvBlastEnsureAssetExactSupportCoverage(chunkDesc.data(), chunkCount, scratch.data(), loggingCallback); - NvBlastBuildAssetDescChunkReorderMap(chunkReorderMap.data(), chunkDesc.data(), chunkCount, scratch.data(), loggingCallback); - NvBlastApplyAssetDescChunkReorderMapInPlace(chunkDesc.data(), chunkCount, bondDescs.data(), bondCount, chunkReorderMap.data(), true, scratch.data(), loggingCallback); + NvBlastEnsureAssetExactSupportCoverage(chunkDesc, chunkCount, scratch.data(), loggingCallback); + NvBlastBuildAssetDescChunkReorderMap(chunkReorderMap.data(), chunkDesc, chunkCount, scratch.data(), loggingCallback); + NvBlastApplyAssetDescChunkReorderMapInPlace(chunkDesc, chunkCount, bondDescs, bondCount, chunkReorderMap.data(), true, scratch.data(), loggingCallback); chunkReorderInvMap.resize(chunkReorderMap.size()); Nv::Blast::invertMap(chunkReorderInvMap.data(), chunkReorderMap.data(), static_cast<unsigned int>(chunkReorderMap.size())); } @@ -1041,11 +1049,30 @@ bool SampleManager::exportAsset() { uint32_t chunkIndex = chunkReorderInvMap[i]; resultGeometry[chunkIndex].resize(chunkMeshesTriangleCount[i]); - memcpy(resultGeometry[chunkIndex].data(), chunkMeshes[i].get(), chunkMeshesTriangleCount[i] * sizeof(Triangle)); + memcpy(resultGeometry[chunkIndex].data(), chunkMeshes[i], chunkMeshesTriangleCount[i] * sizeof(Triangle)); } if (asset.exportFBX) { + std::string outputFilePath = GlobalSettings::MakeFileName(outDir.c_str(), asset.fbx.buf); + + Nv::Blast::ConvexMeshBuilder* collisionBuilder = NvBlastExtAuthoringCreateConvexMeshBuilder(cooking, &physics->getPhysicsInsertionCallback()); + Nv::Blast::AuthoringResult* result = NvBlastExtAuthoringProcessFracture(*m_fTool, *bondGenerator, *collisionBuilder); + + if (!asset.embedFBXCollision) + { + result->releaseCollisionHulls(); + } + + std::shared_ptr<IMeshFileWriter> fileWriter(NvBlastExtExporterCreateFbxFileWriter(bOutputFBXAscii), [](IMeshFileWriter* p) {p->release(); }); + fileWriter->appendMesh(*result, asset.name.buf); + if (!fileWriter->saveToFile(asset.fbx.buf, outDir.c_str())) + { + std::cerr << "Can't write geometry to FBX file." << std::endl; + return false; + } + +#if (0) FbxManager* sdkManager = FbxManager::Create(); FbxIOSettings* ios = FbxIOSettings::Create(sdkManager, IOSROOT); @@ -1150,6 +1177,7 @@ bool SampleManager::exportAsset() sdkManager->Destroy(); sdkManager = nullptr; +#endif std::string info = outputFilePath + " is saved."; viewer_info(info.c_str()); @@ -1180,20 +1208,6 @@ bool SampleManager::exportAsset() viewer_info(info.c_str()); } - if (asset.exportCollision) - { - SampleManager* pSampleManager = SampleManager::ins(); - PhysXController& physXController = pSampleManager->getPhysXController(); - PxPhysics& physics = physXController.getPhysics(); - PxScene& scene = physXController.getPhysXScene(); - - std::string outputFilePath = GlobalSettings::MakeFileName(outDir.c_str(), asset.collision.buf); - physXController.ExportCollisionRepX(outputFilePath.c_str(), &physics, &scene, false); - - std::string info = outputFilePath + " is saved."; - viewer_info(info.c_str()); - } - if (asset.exportTKAsset) { std::string outputFilePath = GlobalSettings::MakeFileName(outDir.c_str(), asset.tkasset.buf); @@ -1247,26 +1261,29 @@ void SampleManager::_createAsset(BlastAssetModelSimple** ppBlastAsset, physicsManager = &bc.getExtPxManager(); TkFramework& tk = bc.getTkFramework(); - std::vector<NvBlastChunkDesc> chunkDesc; - std::vector<NvBlastBondDesc> bondDescs; - std::vector<std::shared_ptr<Triangle> > chunkMeshes; + size_t nChunkListSize = m_fTool->getChunkCount(); + + std::vector<Triangle*> chunkMeshes; std::vector<uint32_t> chunkMeshesTriangleCount(nChunkListSize); - std::vector<bool> isSupport; + std::shared_ptr<bool> isSupport(new bool[nChunkListSize] { false }, [](bool* b) {delete[] b; }); - size_t nChunkListSize = m_fTool->getChunkCount(); chunkMeshes.resize(nChunkListSize); - isSupport.resize(nChunkListSize); for (uint32_t i = 0; i < nChunkListSize; ++i) { chunkMeshesTriangleCount[i] = m_fTool->getBaseMesh(i, chunkMeshes[i]); - isSupport[i] = supports.size() == 0 ? m_fTool->getChunkInfo(i).isLeaf : supports[i]; + isSupport.get()[i] = supports.size() == 0 ? m_fTool->getChunkInfo(i).isLeaf : supports[i]; } - BlastBondGenerator bondGenerator(cooking, &physics->getPhysicsInsertionCallback()); - bondGenerator.buildDescFromInternalFracture(m_fTool, isSupport, bondDescs, chunkDesc); - bondDescs.clear(); - bondGenerator.bondsFromPrefractured(chunkMeshes, isSupport, bondDescs); - int bondDescsSize = bondDescs.size(); + std::shared_ptr<Nv::Blast::BlastBondGenerator> bondGenerator( + NvBlastExtAuthoringCreateBondGenerator(cooking, &physics->getPhysicsInsertionCallback()), + [](Nv::Blast::BlastBondGenerator* bg) {bg->release(); }); + BondGenerationConfig cnf; + cnf.bondMode = BondGenerationConfig::AVERAGE; + NvBlastChunkDesc* chunkDesc; + NvBlastBondDesc* bondDescs; + const uint32_t bondCount = bondGenerator.get()->buildDescFromInternalFracture(m_fTool, isSupport.get(), bondDescs, chunkDesc); + const uint32_t chunkCount = nChunkListSize; + int bondDescsSize = bondCount; if (bondDescsSize == worlds.size()) { for (int bds = 0; bds < bondDescsSize; bds++) @@ -1278,8 +1295,6 @@ void SampleManager::_createAsset(BlastAssetModelSimple** ppBlastAsset, } } - const uint32_t chunkCount = static_cast<uint32_t>(chunkDesc.size()); - const uint32_t bondCount = static_cast<uint32_t>(bondDescs.size()); if (bondCount == 0) { std::cout << "Can't create bonds descriptors..." << std::endl; @@ -1290,9 +1305,9 @@ void SampleManager::_createAsset(BlastAssetModelSimple** ppBlastAsset, { std::vector<uint32_t> chunkReorderMap(chunkCount); std::vector<char> scratch(chunkCount * sizeof(NvBlastChunkDesc)); - NvBlastEnsureAssetExactSupportCoverage(chunkDesc.data(), chunkCount, scratch.data(), loggingCallback); - NvBlastBuildAssetDescChunkReorderMap(chunkReorderMap.data(), chunkDesc.data(), chunkCount, scratch.data(), loggingCallback); - NvBlastApplyAssetDescChunkReorderMapInPlace(chunkDesc.data(), chunkCount, bondDescs.data(), bondCount, chunkReorderMap.data(), true, scratch.data(), loggingCallback); + NvBlastEnsureAssetExactSupportCoverage(chunkDesc, chunkCount, scratch.data(), loggingCallback); + NvBlastBuildAssetDescChunkReorderMap(chunkReorderMap.data(), chunkDesc, chunkCount, scratch.data(), loggingCallback); + NvBlastApplyAssetDescChunkReorderMapInPlace(chunkDesc, chunkCount, bondDescs, bondCount, chunkReorderMap.data(), true, scratch.data(), loggingCallback); chunkReorderInvMap.resize(chunkReorderMap.size()); Nv::Blast::invertMap(chunkReorderInvMap.data(), chunkReorderMap.data(), static_cast<unsigned int>(chunkReorderMap.size())); } @@ -1303,7 +1318,7 @@ void SampleManager::_createAsset(BlastAssetModelSimple** ppBlastAsset, { uint32_t chunkIndex = chunkReorderInvMap[i]; resultGeometry[chunkIndex].resize(chunkMeshesTriangleCount[i]); - memcpy(resultGeometry[chunkIndex].data(), chunkMeshes[i].get(), chunkMeshesTriangleCount[i] * sizeof(Triangle)); + memcpy(resultGeometry[chunkIndex].data(), chunkMeshes[i], chunkMeshesTriangleCount[i] * sizeof(Triangle)); } // prepare physics data (convexes) @@ -1314,9 +1329,9 @@ void SampleManager::_createAsset(BlastAssetModelSimple** ppBlastAsset, // build and serialize ExtPhysicsAsset ExtPxAssetDesc descriptor; descriptor.bondCount = bondCount; - descriptor.bondDescs = bondDescs.data(); + descriptor.bondDescs = bondDescs; descriptor.chunkCount = chunkCount; - descriptor.chunkDescs = chunkDesc.data(); + descriptor.chunkDescs = chunkDesc; descriptor.bondFlags = joints.data(); descriptor.pxChunks = pxChunks.data(); ExtPxAsset* asset = ExtPxAsset::create(descriptor, tk); @@ -2760,26 +2775,28 @@ void SampleManager::_addAssetToProjectParam(BlastAsset* pBlastAsset) { chunkArray.buf = new BPPChunk[chunkCount]; chunkArray.arraySizes[0] = chunkCount; - char chunkname[10]; + char chunkname[32]; for (int cc = 0; cc < chunkCount; ++cc) { BPPChunk& chunk = chunkArray.buf[cc]; ::init(chunk); - std::vector<uint32_t> parentChunkIndexes; - parentChunkIndexes.push_back(cc); - uint32_t parentChunkIndex = cc; - while ((parentChunkIndex = pNvBlastChunk[parentChunkIndex].parentChunkIndex) != -1) - { - parentChunkIndexes.push_back(parentChunkIndex); - } + //std::vector<uint32_t> parentChunkIndexes; + //parentChunkIndexes.push_back(cc); + //uint32_t parentChunkIndex = cc; + //while ((parentChunkIndex = pNvBlastChunk[parentChunkIndex].parentChunkIndex) != -1) + //{ + // parentChunkIndexes.push_back(parentChunkIndex); + //} std::string strChunkName = "Chunk"; - for (int pcIndex = parentChunkIndexes.size() - 1; pcIndex >= 0; pcIndex--) - { - sprintf(chunkname, "_%d", parentChunkIndexes[pcIndex]); - strChunkName += chunkname; - } + sprintf(chunkname, "_%d", cc); + strChunkName += chunkname; + //for (int pcIndex = parentChunkIndexes.size() - 1; pcIndex >= 0; pcIndex--) + //{ + // sprintf(chunkname, "_%d", parentChunkIndexes[pcIndex]); + // strChunkName += chunkname; + //} copy(chunk.name, strChunkName.c_str()); chunk.asset = asset.ID; @@ -2927,7 +2944,7 @@ void SampleManager::_addAssetToProjectParam(BlastAsset* pBlastAsset) { bondArray.buf = new BPPBond[bondCount]; bondArray.arraySizes[0] = bondCount; - char bondname[20]; + char bondname[64]; bool visible; for (int bc = 0; bc < bondCount; ++bc) { diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.h index fa214e0..3ef7090 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.h +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.h @@ -56,6 +56,7 @@ public: public: physx::PxVec3 position; physx::PxVec3 normal; + physx::PxVec3 facenormal; physx::PxVec3 tangent; physx::PxVec2 uv; }; diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.cpp index a9fedf0..88533cb 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.cpp @@ -285,7 +285,7 @@ void RenderMaterial::setTextureFileName(std::string textureFileName, TextureType std::string searchDir = mTextureFileNames[tt]; size_t ind = searchDir.find_last_of('/'); - if (ind > 0) + if (ind > 0 && (ind != std::string::npos)) searchDir = searchDir.substr(0, ind); ResourceManager* pResourceManager = ResourceManager::ins(); diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.cpp index 5ce713d..d51101f 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.cpp @@ -29,7 +29,7 @@ #include "Renderable.h" #include "Renderer.h" #include "RenderUtils.h" - +#include "GlobalSettings.h" const DirectX::XMFLOAT4 DEFAULT_COLOR(0.5f, 0.5f, 0.5f, 1.0f); Renderable::Renderable(IRenderMesh& mesh, RenderMaterial& material) : m_mesh(mesh), m_scale(1, 1, 1), m_color(DEFAULT_COLOR), m_hidden(false), m_transform(PxIdentity) @@ -64,6 +64,7 @@ void Renderable::render(Renderer& renderer, bool depthStencilOnly) const float useSpecularTexture = -1.0; float useNormalTexture = -1.0; float specularShininess = 1.0; + bool useTexture = GlobalSettings::Inst().m_renderStyle == MESH_RENDER_TEXTURED; RenderMaterial& renderMaterial = m_materialInstance->getMaterial(); std::string mName = renderMaterial.getMaterialName(); if (mName != "") @@ -77,19 +78,19 @@ void Renderable::render(Renderer& renderer, bool depthStencilOnly) const specularColor = DirectX::XMFLOAT4(r, g, b, a); texName = renderMaterial.getTextureFileName(); - if (texName != "" && !renderMaterial.isBadTexture()) + if (useTexture && texName != "" && !renderMaterial.isBadTexture()) { useDiffuseTexture = 1.0; } texName = renderMaterial.getTextureFileName(RenderMaterial::TT_Specular); - if (texName != "" && !renderMaterial.isBadTexture(RenderMaterial::TT_Specular)) + if (useTexture && texName != "" && !renderMaterial.isBadTexture(RenderMaterial::TT_Specular)) { useSpecularTexture = 1.0; } texName = renderMaterial.getTextureFileName(RenderMaterial::TT_Normal); - if (texName != "" && !renderMaterial.isBadTexture(RenderMaterial::TT_Normal)) + if (useTexture && texName != "" && !renderMaterial.isBadTexture(RenderMaterial::TT_Normal)) { useNormalTexture = 1.0; } diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.cpp index 9fe5038..00b3256 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.cpp @@ -55,7 +55,6 @@ Renderer::Renderer() : m_cameraCB(nullptr) , m_worldCB(nullptr) , m_objectCB(nullptr) -, m_RSState(nullptr) , m_opaqueRenderDSState(nullptr) , m_transparencyRenderDSState(nullptr) , m_opaqueRenderNoDepthDSState(nullptr) @@ -79,6 +78,9 @@ Renderer::Renderer() m_worldCBData.dirLightDir = DirectX::XMFLOAT3(-0.08f, -0.34f, -0.91f); m_worldCBData.specularPower = 140.0f; m_worldCBData.specularIntensity = 0.4f; + + m_RSState[0] = nullptr; + m_RSState[1] = nullptr; toggleCameraSpeed(false); } @@ -89,13 +91,9 @@ Renderer::~Renderer() void Renderer::initializeDefaultRSState() { - SAFE_RELEASE(m_RSState); D3D11_RASTERIZER_DESC desc; ZeroMemory(&desc, sizeof(desc)); -// Add By Lixu Begin desc.CullMode = D3D11_CULL_NONE; -// Add By Lixu End - desc.FillMode = m_wireframeMode ? D3D11_FILL_WIREFRAME : D3D11_FILL_SOLID; desc.AntialiasedLineEnable = FALSE; desc.DepthBias = 0; desc.DepthBiasClamp = 0; @@ -105,7 +103,11 @@ void Renderer::initializeDefaultRSState() desc.ScissorEnable = FALSE; desc.SlopeScaledDepthBias = 0; - V(m_device->CreateRasterizerState(&desc, &m_RSState)); + desc.FillMode = D3D11_FILL_SOLID; + V(m_device->CreateRasterizerState(&desc, &m_RSState[0])); + + desc.FillMode = D3D11_FILL_WIREFRAME; + V(m_device->CreateRasterizerState(&desc, &m_RSState[1])); } HRESULT Renderer::DeviceCreated(ID3D11Device* device) @@ -242,7 +244,8 @@ void Renderer::DeviceDestroyed() SAFE_RELEASE(m_cameraCB); SAFE_RELEASE(m_worldCB); SAFE_RELEASE(m_objectCB); - SAFE_RELEASE(m_RSState); + SAFE_RELEASE(m_RSState[0]); + SAFE_RELEASE(m_RSState[1]); SAFE_RELEASE(m_opaqueRenderDSState); SAFE_RELEASE(m_transparencyRenderDSState); SAFE_RELEASE(m_opaqueRenderNoDepthDSState); @@ -360,6 +363,10 @@ void Renderer::setAllConstantBuffers(ID3D11DeviceContext* ctx) void Renderer::Render(ID3D11Device* /*device*/, ID3D11DeviceContext* ctx, ID3D11RenderTargetView* pRTV, ID3D11DepthStencilView*) { + GlobalSettings& globalSettings = GlobalSettings::Inst(); + if (!globalSettings.m_showGraphicsMesh) + return; + PROFILER_SCOPED_FUNCTION(); m_context = ctx; @@ -389,6 +396,19 @@ void Renderer::Render(ID3D11Device* /*device*/, ID3D11DeviceContext* ctx, ID3D11 D3D11_MAPPED_SUBRESOURCE mappedResource; ctx->Map(m_worldCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); CBWorld* worldBuffer = (CBWorld*)mappedResource.pData; + float flatNormal = -1.0; + if (globalSettings.m_renderStyle == MESH_RENDER_FLAT) + { + flatNormal = 1.0; + } + float useLighting = 1.0; + if (!globalSettings.m_useLighting) + { + useLighting = -1.0; + } + m_worldCBData.flatNormal = flatNormal; + m_worldCBData.wireFrameOver = -1.0; + m_worldCBData.useLighting = useLighting; Light::FillLightShaderParam(m_worldCBData.lightParam); memcpy(worldBuffer, &m_worldCBData, sizeof(m_worldCBData)); //worldBuffer->ambientColor = m_CBWorldData.ambientColor; @@ -401,7 +421,15 @@ void Renderer::Render(ID3D11Device* /*device*/, ID3D11DeviceContext* ctx, ID3D11 ctx->Unmap(m_worldCB, 0); } - ctx->RSSetState(m_RSState); + if (globalSettings.m_renderStyle != MESH_RENDER_WIREFRAME) + { + ctx->RSSetState(m_RSState[0]); + } + else + { + ctx->RSSetState(m_RSState[1]); + } + ctx->PSSetSamplers(0, 1, &m_linearSampler); ctx->PSSetSamplers(1, 1, &m_pointSampler); @@ -450,7 +478,6 @@ void Renderer::Render(ID3D11Device* /*device*/, ID3D11DeviceContext* ctx, ID3D11 // Opaque render { ctx->RSSetViewports(1, &m_viewport); - ctx->RSSetState(m_RSState); ctx->OMSetRenderTargets(1, &pRTV, m_DSView); ctx->OMSetDepthStencilState(m_opaqueRenderDSState, 0xFF); @@ -498,8 +525,44 @@ void Renderer::Render(ID3D11Device* /*device*/, ID3D11DeviceContext* ctx, ID3D11 } } + // draw overline + if (globalSettings.m_showWireframe) + { + ctx->RSSetState(m_RSState[1]); + + // update wireFrameOver + { + D3D11_MAPPED_SUBRESOURCE mappedResource; + ctx->Map(m_worldCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + CBWorld* worldBuffer = (CBWorld*)mappedResource.pData; + float wireFrameOver = -1.0; + { + if (globalSettings.m_showWireframe) + { + wireFrameOver = 1.0; + } + } + m_worldCBData.wireFrameOver = wireFrameOver; + memcpy(worldBuffer, &m_worldCBData, sizeof(m_worldCBData)); + ctx->Unmap(m_worldCB, 0); + } + + for (auto it = m_renderables.begin(); it != m_renderables.end(); it++) + { + if (!(*it)->isTransparent() && !(*it)->isHidden()) + { + (*it)->render(*this); + } + } + + if (globalSettings.m_renderStyle != MESH_RENDER_WIREFRAME) + { + ctx->RSSetState(m_RSState[0]); + } + } + // modulate shadows - if (m_shadowEnabled) + if (m_shadowEnabled && globalSettings.m_useLighting) { m_shadow.modulateShadowBuffer(pRTV); } diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.h index 6981e15..2142921 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.h +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.h @@ -198,6 +198,10 @@ class Renderer : public ISampleController float specularPower; DirectX::XMFLOAT3 dirLightColor; float specularIntensity; // TODO: actually it's per object property + float flatNormal; + float wireFrameOver; + float useLighting; + float unusedPad4; LightShaderParam lightParam; }; struct CBObject @@ -235,7 +239,7 @@ class Renderer : public ISampleController D3D11_VIEWPORT m_viewport; // DX11 states - ID3D11RasterizerState* m_RSState; + ID3D11RasterizerState* m_RSState[2]; ID3D11DepthStencilState* m_opaqueRenderDSState; ID3D11DepthStencilState* m_transparencyRenderDSState; ID3D11DepthStencilState* m_opaqueRenderNoDepthDSState; diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.cpp index 6e4cc50..d1d04e2 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.cpp @@ -241,7 +241,7 @@ bool ResourceManager::findFile(std::string fileName, const std::vector<const cha } size_t ind = fileNameOnly.find_last_of('/'); - if (ind > 0) + if (ind > 0 && (ind != std::string::npos)) fileNameOnly = fileNameOnly.substr(ind + 1); // Add By Lixu Begin diff --git a/tools/ArtistTools/source/BlastPlugin/Shaders/common_buffers_ex.hlsl b/tools/ArtistTools/source/BlastPlugin/Shaders/common_buffers_ex.hlsl index 0076599..d6a37b0 100644 --- a/tools/ArtistTools/source/BlastPlugin/Shaders/common_buffers_ex.hlsl +++ b/tools/ArtistTools/source/BlastPlugin/Shaders/common_buffers_ex.hlsl @@ -42,6 +42,9 @@ cbuffer World : register(b1) float specularPower; float3 dirLightColor; float specularIntensity; + float g_flatNormal; + float g_wireFrameOver; + float g_useLighting; Light g_Light[4]; }; diff --git a/tools/ArtistTools/source/BlastPlugin/Shaders/model_simple_textured_ex.hlsl b/tools/ArtistTools/source/BlastPlugin/Shaders/model_simple_textured_ex.hlsl index 152174c..6d8e819 100644 --- a/tools/ArtistTools/source/BlastPlugin/Shaders/model_simple_textured_ex.hlsl +++ b/tools/ArtistTools/source/BlastPlugin/Shaders/model_simple_textured_ex.hlsl @@ -10,8 +10,9 @@ Texture2D envTexture : register(t3); struct VS_INPUT { float3 position : POSITION0; - float3 normal : NORMAL0; - float3 tangent : TANGENT0; + float3 normal : VERTEX_NORMAL; + float3 faceNormal : FACE_NORMAL; + float3 tangent : TANGENT; float2 uv : TEXCOORD0; float health : TEXCOORD1; }; @@ -36,8 +37,9 @@ VS_OUTPUT VS(VS_INPUT iV) oV.worldPos = worldSpacePos; // normals - float3 worldNormal = mul(float4(iV.normal, 0.0f), worldMatrix); - oV.normal = worldNormal; + float3 normal = (g_flatNormal > 0) ? normalize(iV.faceNormal) : normalize(iV.normal); + normal = mul(float4(normal, 0.0f), worldMatrix); + oV.normal = normal; oV.tangent = normalize(iV.tangent); @@ -75,11 +77,44 @@ inline float3 computeSpecularLighting( float4 PS(VS_OUTPUT iV) : SV_Target0 { + if(g_wireFrameOver > 0) + return float4(0,0,0,1); + float3 diffuseColor = m_diffuseColor.xyz; if(m_useDiffuseTexture > 0) { diffuseColor = diffuseTexture.Sample(defaultSampler, iV.uv).xyz; } + + if(selected > 0) + { + if(diffuseColor.r > 0.5) + { + diffuseColor.r = 0.5; + } + else + { + diffuseColor.r += 0.5; + } + return float4(diffuseColor, 1.0f); + } + + if (g_useLighting < 0) + { + if(selected > 0) + { + if(diffuseColor.r > 0.5) + { + diffuseColor.r = 0.5; + } + else + { + diffuseColor.r += 0.5; + } + } + return float4(diffuseColor, 1.0f); + } + float3 specularColor = m_specularColor.xyz; if(m_useSpecularTexture > 0) { @@ -144,17 +179,6 @@ float4 PS(VS_OUTPUT iV) : SV_Target0 } color.rgb = (ambient + diffuse) * albedo + specular; - - if(selected > 0) - { - if(color.r > 0.5) - { - color.r = 0.5; - } - else - { - color.r += 0.5; - } - } + return color; }
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/UI/FileReferencesPanel.ui b/tools/ArtistTools/source/BlastPlugin/UI/FileReferencesPanel.ui index 15d727b..bde4935 100644 --- a/tools/ArtistTools/source/BlastPlugin/UI/FileReferencesPanel.ui +++ b/tools/ArtistTools/source/BlastPlugin/UI/FileReferencesPanel.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>340</width> - <height>311</height> + <height>277</height> </rect> </property> <property name="sizePolicy"> @@ -139,8 +139,21 @@ <string>Export Assets</string> </property> <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0"> - <widget class="QLabel" name="labelFBX"> + <item row="2" column="1"> + <widget class="QLineEdit" name="lineEditObj"/> + </item> + <item row="2" column="2"> + <widget class="QCheckBox" name="checkBoxObj"> + <property name="text"> + <string/> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLineEdit" name="lineEditLLAsset"/> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="labelLLAsset"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> @@ -160,18 +173,22 @@ </size> </property> <property name="text"> - <string>FBX</string> + <string>LLAsset</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="2" column="1"> - <widget class="QLineEdit" name="lineEditCollision"/> + <item row="0" column="2"> + <widget class="QCheckBox" name="checkBoxFBX"> + <property name="text"> + <string/> + </property> + </widget> </item> <item row="2" column="0"> - <widget class="QLabel" name="labelCollision"> + <widget class="QLabel" name="labelObj"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> @@ -191,21 +208,18 @@ </size> </property> <property name="text"> - <string>Collision</string> + <string>Obj</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="1" column="1"> - <widget class="QLineEdit" name="lineEditObj"/> - </item> <item row="0" column="1"> <widget class="QLineEdit" name="lineEditFBX"/> </item> - <item row="1" column="0"> - <widget class="QLabel" name="labelObj"> + <item row="0" column="0"> + <widget class="QLabel" name="labelFBX"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> @@ -225,36 +239,22 @@ </size> </property> <property name="text"> - <string>Obj</string> + <string>FBX</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="0" column="2"> - <widget class="QCheckBox" name="checkBoxFBX"> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="1" column="2"> - <widget class="QCheckBox" name="checkBoxObj"> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="2" column="2"> - <widget class="QCheckBox" name="checkBoxCollision"> + <item row="3" column="2"> + <widget class="QCheckBox" name="checkBoxLLAsset"> <property name="text"> <string/> </property> </widget> </item> - <item row="3" column="0"> - <widget class="QLabel" name="labelLLAsset"> + <item row="4" column="0"> + <widget class="QLabel" name="labelTKAsset"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> @@ -274,25 +274,25 @@ </size> </property> <property name="text"> - <string>LLAsset</string> + <string>TKAsset</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="3" column="1"> - <widget class="QLineEdit" name="lineEditLLAsset"/> + <item row="4" column="1"> + <widget class="QLineEdit" name="lineEditTKAsset"/> </item> - <item row="3" column="2"> - <widget class="QCheckBox" name="checkBoxLLAsset"> + <item row="4" column="2"> + <widget class="QCheckBox" name="checkBoxTKAsset"> <property name="text"> <string/> </property> </widget> </item> - <item row="4" column="0"> - <widget class="QLabel" name="labelTKAsset"> + <item row="5" column="0"> + <widget class="QLabel" name="labelBPXA"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> @@ -312,25 +312,25 @@ </size> </property> <property name="text"> - <string>TKAsset</string> + <string>BPXA</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="4" column="1"> - <widget class="QLineEdit" name="lineEditTKAsset"/> + <item row="5" column="1"> + <widget class="QLineEdit" name="lineEditBPXA"/> </item> - <item row="4" column="2"> - <widget class="QCheckBox" name="checkBoxTKAsset"> + <item row="5" column="2"> + <widget class="QCheckBox" name="checkBoxBPXA"> <property name="text"> <string/> </property> </widget> </item> - <item row="5" column="0"> - <widget class="QLabel" name="labelBPXA"> + <item row="1" column="0"> + <widget class="QLabel" name="labelEmbedFBXCollision"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred"> <horstretch>0</horstretch> @@ -350,18 +350,15 @@ </size> </property> <property name="text"> - <string>BPXA</string> + <string>Embed collision in FBX</string> </property> <property name="alignment"> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> </property> </widget> </item> - <item row="5" column="1"> - <widget class="QLineEdit" name="lineEditBPXA"/> - </item> - <item row="5" column="2"> - <widget class="QCheckBox" name="checkBoxBPXA"> + <item row="1" column="2"> + <widget class="QCheckBox" name="checkBoxEmbedFBXCollision"> <property name="text"> <string/> </property> @@ -410,8 +407,6 @@ <tabstop>checkBoxFBX</tabstop> <tabstop>lineEditObj</tabstop> <tabstop>checkBoxObj</tabstop> - <tabstop>lineEditCollision</tabstop> - <tabstop>checkBoxCollision</tabstop> <tabstop>lineEditLLAsset</tabstop> <tabstop>checkBoxLLAsset</tabstop> <tabstop>lineEditTKAsset</tabstop> diff --git a/tools/ArtistTools/source/BlastPlugin/Window/FileReferencesPanel.cpp b/tools/ArtistTools/source/BlastPlugin/Window/FileReferencesPanel.cpp index 235dd23..b3b09b4 100644 --- a/tools/ArtistTools/source/BlastPlugin/Window/FileReferencesPanel.cpp +++ b/tools/ArtistTools/source/BlastPlugin/Window/FileReferencesPanel.cpp @@ -2,7 +2,6 @@ #include "ui_FileReferencesPanel.h" #include "AppMainWindow.h" #include <QtWidgets/QFileDialog> -#include "ProjectParams.h" #include <QtCore/QFile> #include <QtCore/QDebug> #include "GlobalSettings.h" @@ -24,14 +23,12 @@ FileReferencesPanel::FileReferencesPanel(QWidget *parent) ui->lineEditFBX->setText("New.fbx"); ui->lineEditObj->setText("New.obj"); - ui->lineEditCollision->setText("New.repx"); ui->lineEditLLAsset->setText("Newll.blast"); ui->lineEditTKAsset->setText("Newtk.blast"); ui->lineEditBPXA->setText("New.blast"); bValid = false; ui->checkBoxFBX->setChecked(false); ui->checkBoxObj->setChecked(false); - ui->checkBoxCollision->setChecked(false); ui->checkBoxLLAsset->setChecked(false); ui->checkBoxTKAsset->setChecked(false); ui->checkBoxBPXA->setChecked(false); @@ -59,15 +56,12 @@ void FileReferencesPanel::updateValues() ui->lineEditFBX->setText(""); ui->lineEditObj->setText(""); - ui->lineEditCollision->setText(""); ui->lineEditLLAsset->setText(""); ui->lineEditTKAsset->setText(""); ui->lineEditBPXA->setText(""); bValid = false; ui->checkBoxFBX->setChecked(false); ui->checkBoxObj->setChecked(false); - ui->checkBoxCollision->setChecked(false); - ui->checkBoxLLAsset->setChecked(false); ui->checkBoxTKAsset->setChecked(false); ui->checkBoxBPXA->setChecked(false); bValid = true; @@ -128,13 +122,6 @@ void FileReferencesPanel::updateValues() ui->lineEditObj->setText(fileInfo.baseName() + "_New.obj"); } - if (asset.collision.buf != nullptr) - ui->lineEditCollision->setText(asset.collision.buf); - else - { - ui->lineEditCollision->setText(fileInfo.baseName() + "_New.repx"); - } - if (asset.llasset.buf != nullptr) ui->lineEditLLAsset->setText(asset.llasset.buf); else @@ -158,8 +145,8 @@ void FileReferencesPanel::updateValues() bValid = false; ui->checkBoxFBX->setChecked(asset.exportFBX); + ui->checkBoxEmbedFBXCollision->setChecked(asset.embedFBXCollision); ui->checkBoxObj->setChecked(asset.exportOBJ); - ui->checkBoxCollision->setChecked(asset.exportCollision); ui->checkBoxLLAsset->setChecked(asset.exportLLAsset); ui->checkBoxTKAsset->setChecked(asset.exportTKAsset); ui->checkBoxBPXA->setChecked(asset.exportBPXA); @@ -204,147 +191,42 @@ void FileReferencesPanel::on_checkBoxFBX_stateChanged(int arg1) return; } - SampleManager* pSampleManager = SampleManager::ins(); - if (pSampleManager == nullptr) - { - return; - } - - BlastAsset* pBlastAsset = pSampleManager->getCurBlastAsset(); - if (pBlastAsset == nullptr) - { - return; - } - - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = AssetDescMap.find(pBlastAsset); - if (itADM == AssetDescMap.end()) - { - return; - } - - AssetList::ModelAsset modelAsset = itADM->second; - if (modelAsset.name.empty()) - { + BPPAsset* assetPtr = _getCurrentAsset(); + if (nullptr == assetPtr) return; - } - BPParams& projectParams = BlastProject::ins().getParams(); - BPPAssetArray& assetArray = projectParams.blast.blastAssets; - int aaas = 0; - for (; aaas < assetArray.arraySizes[0]; aaas++) - { - std::string assetname = assetArray.buf[aaas].name; - if (assetname == modelAsset.name) - break; - } - if (aaas == assetArray.arraySizes[0]) - { - return; - } - - BPPAsset& asset = assetArray.buf[aaas]; + BPPAsset& asset = *assetPtr; asset.exportFBX = ui->checkBoxFBX->isChecked(); } -void FileReferencesPanel::on_checkBoxObj_stateChanged(int arg1) +void FileReferencesPanel::on_checkBoxEmbedFBXCollision_stateChanged(int arg1) { if (!bValid) { return; } - SampleManager* pSampleManager = SampleManager::ins(); - if (pSampleManager == nullptr) - { - return; - } - - BlastAsset* pBlastAsset = pSampleManager->getCurBlastAsset(); - if (pBlastAsset == nullptr) - { + BPPAsset* assetPtr = _getCurrentAsset(); + if (nullptr == assetPtr) return; - } - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = AssetDescMap.find(pBlastAsset); - if (itADM == AssetDescMap.end()) - { - return; - } - - AssetList::ModelAsset modelAsset = itADM->second; - if (modelAsset.name.empty()) - { - return; - } - - BPParams& projectParams = BlastProject::ins().getParams(); - BPPAssetArray& assetArray = projectParams.blast.blastAssets; - int aaas = 0; - for (; aaas < assetArray.arraySizes[0]; aaas++) - { - std::string assetname = assetArray.buf[aaas].name; - if (assetname == modelAsset.name) - break; - } - if (aaas == assetArray.arraySizes[0]) - { - return; - } - - BPPAsset& asset = assetArray.buf[aaas]; - asset.exportOBJ = ui->checkBoxObj->isChecked(); + BPPAsset& asset = *assetPtr; + asset.embedFBXCollision = ui->checkBoxEmbedFBXCollision->isChecked(); } -void FileReferencesPanel::on_checkBoxCollision_stateChanged(int arg1) +void FileReferencesPanel::on_checkBoxObj_stateChanged(int arg1) { if (!bValid) { return; } - SampleManager* pSampleManager = SampleManager::ins(); - if (pSampleManager == nullptr) - { - return; - } - - BlastAsset* pBlastAsset = pSampleManager->getCurBlastAsset(); - if (pBlastAsset == nullptr) - { - return; - } - - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = AssetDescMap.find(pBlastAsset); - if (itADM == AssetDescMap.end()) - { - return; - } - - AssetList::ModelAsset modelAsset = itADM->second; - if (modelAsset.name.empty()) - { - return; - } - - BPParams& projectParams = BlastProject::ins().getParams(); - BPPAssetArray& assetArray = projectParams.blast.blastAssets; - int aaas = 0; - for (; aaas < assetArray.arraySizes[0]; aaas++) - { - std::string assetname = assetArray.buf[aaas].name; - if (assetname == modelAsset.name) - break; - } - if (aaas == assetArray.arraySizes[0]) - { + BPPAsset* assetPtr = _getCurrentAsset(); + if (nullptr == assetPtr) return; - } - BPPAsset& asset = assetArray.buf[aaas]; - asset.exportCollision = ui->checkBoxCollision->isChecked(); + BPPAsset& asset = *assetPtr; + asset.exportOBJ = ui->checkBoxObj->isChecked(); } void FileReferencesPanel::on_checkBoxLLAsset_stateChanged(int arg1) @@ -354,46 +236,11 @@ void FileReferencesPanel::on_checkBoxLLAsset_stateChanged(int arg1) return; } - SampleManager* pSampleManager = SampleManager::ins(); - if (pSampleManager == nullptr) - { - return; - } - - BlastAsset* pBlastAsset = pSampleManager->getCurBlastAsset(); - if (pBlastAsset == nullptr) - { - return; - } - - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = AssetDescMap.find(pBlastAsset); - if (itADM == AssetDescMap.end()) - { - return; - } - - AssetList::ModelAsset modelAsset = itADM->second; - if (modelAsset.name.empty()) - { - return; - } - - BPParams& projectParams = BlastProject::ins().getParams(); - BPPAssetArray& assetArray = projectParams.blast.blastAssets; - int aaas = 0; - for (; aaas < assetArray.arraySizes[0]; aaas++) - { - std::string assetname = assetArray.buf[aaas].name; - if (assetname == modelAsset.name) - break; - } - if (aaas == assetArray.arraySizes[0]) - { + BPPAsset* assetPtr = _getCurrentAsset(); + if (nullptr == assetPtr) return; - } - BPPAsset& asset = assetArray.buf[aaas]; + BPPAsset& asset = *assetPtr; asset.exportLLAsset = ui->checkBoxLLAsset->isChecked(); } @@ -404,46 +251,11 @@ void FileReferencesPanel::on_checkBoxTKAsset_stateChanged(int arg1) return; } - SampleManager* pSampleManager = SampleManager::ins(); - if (pSampleManager == nullptr) - { - return; - } - - BlastAsset* pBlastAsset = pSampleManager->getCurBlastAsset(); - if (pBlastAsset == nullptr) - { + BPPAsset* assetPtr = _getCurrentAsset(); + if (nullptr == assetPtr) return; - } - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = AssetDescMap.find(pBlastAsset); - if (itADM == AssetDescMap.end()) - { - return; - } - - AssetList::ModelAsset modelAsset = itADM->second; - if (modelAsset.name.empty()) - { - return; - } - - BPParams& projectParams = BlastProject::ins().getParams(); - BPPAssetArray& assetArray = projectParams.blast.blastAssets; - int aaas = 0; - for (; aaas < assetArray.arraySizes[0]; aaas++) - { - std::string assetname = assetArray.buf[aaas].name; - if (assetname == modelAsset.name) - break; - } - if (aaas == assetArray.arraySizes[0]) - { - return; - } - - BPPAsset& asset = assetArray.buf[aaas]; + BPPAsset& asset = *assetPtr; asset.exportTKAsset = ui->checkBoxTKAsset->isChecked(); } @@ -454,46 +266,11 @@ void FileReferencesPanel::on_checkBoxBPXA_stateChanged(int arg1) return; } - SampleManager* pSampleManager = SampleManager::ins(); - if (pSampleManager == nullptr) - { + BPPAsset* assetPtr = _getCurrentAsset(); + if (nullptr == assetPtr) return; - } - BlastAsset* pBlastAsset = pSampleManager->getCurBlastAsset(); - if (pBlastAsset == nullptr) - { - return; - } - - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = AssetDescMap.find(pBlastAsset); - if (itADM == AssetDescMap.end()) - { - return; - } - - AssetList::ModelAsset modelAsset = itADM->second; - if (modelAsset.name.empty()) - { - return; - } - - BPParams& projectParams = BlastProject::ins().getParams(); - BPPAssetArray& assetArray = projectParams.blast.blastAssets; - int aaas = 0; - for (; aaas < assetArray.arraySizes[0]; aaas++) - { - std::string assetname = assetArray.buf[aaas].name; - if (assetname == modelAsset.name) - break; - } - if (aaas == assetArray.arraySizes[0]) - { - return; - } - - BPPAsset& asset = assetArray.buf[aaas]; + BPPAsset& asset = *assetPtr; asset.exportBPXA = ui->checkBoxBPXA->isChecked(); if (asset.exportBPXA) @@ -512,31 +289,58 @@ void FileReferencesPanel::on_btnSave_clicked() copy(fileReferences.fbxSourceAsset, ui->lineEditFBXSourceAsset->text().toUtf8().data()); + BPPAsset* assetPtr = _getCurrentAsset(); + if (nullptr == assetPtr) + return; + + BPPAsset& asset = *assetPtr; + + copy(asset.fbx, ui->lineEditFBX->text().toUtf8().data()); + asset.exportFBX = ui->checkBoxFBX->isChecked(); + + copy(asset.obj, ui->lineEditObj->text().toUtf8().data()); + asset.exportOBJ = ui->checkBoxObj->isChecked(); + + copy(asset.llasset, ui->lineEditLLAsset->text().toUtf8().data()); + asset.exportLLAsset = ui->checkBoxLLAsset->isChecked(); + + copy(asset.tkasset, ui->lineEditTKAsset->text().toUtf8().data()); + asset.exportTKAsset = ui->checkBoxTKAsset->isChecked(); + + copy(asset.bpxa, ui->lineEditBPXA->text().toUtf8().data()); + asset.exportBPXA = ui->checkBoxBPXA->isChecked(); + + SampleManager::ins()->exportAsset(); +} + +BPPAsset* FileReferencesPanel::_getCurrentAsset() +{ SampleManager* pSampleManager = SampleManager::ins(); if (pSampleManager == nullptr) { - return; + return nullptr; } BlastAsset* pBlastAsset = pSampleManager->getCurBlastAsset(); if (pBlastAsset == nullptr) { - return; + return nullptr; } std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = AssetDescMap.find(pBlastAsset); if (itADM == AssetDescMap.end()) { - return; + return nullptr; } AssetList::ModelAsset modelAsset = itADM->second; if (modelAsset.name.empty()) { - return; + return nullptr; } + BPParams& projectParams = BlastProject::ins().getParams(); BPPAssetArray& assetArray = projectParams.blast.blastAssets; int aaas = 0; for (; aaas < assetArray.arraySizes[0]; aaas++) @@ -547,28 +351,10 @@ void FileReferencesPanel::on_btnSave_clicked() } if (aaas == assetArray.arraySizes[0]) { - return; + return nullptr; } BPPAsset& asset = assetArray.buf[aaas]; - copy(asset.fbx, ui->lineEditFBX->text().toUtf8().data()); - asset.exportFBX = ui->checkBoxFBX->isChecked(); - - copy(asset.obj, ui->lineEditObj->text().toUtf8().data()); - asset.exportOBJ = ui->checkBoxObj->isChecked(); - - copy(asset.collision, ui->lineEditCollision->text().toUtf8().data()); - asset.exportCollision = ui->checkBoxCollision->isChecked(); - - copy(asset.llasset, ui->lineEditLLAsset->text().toUtf8().data()); - asset.exportLLAsset = ui->checkBoxLLAsset->isChecked(); - - copy(asset.tkasset, ui->lineEditTKAsset->text().toUtf8().data()); - asset.exportTKAsset = ui->checkBoxTKAsset->isChecked(); - - copy(asset.bpxa, ui->lineEditBPXA->text().toUtf8().data()); - asset.exportBPXA = ui->checkBoxBPXA->isChecked(); - - SampleManager::ins()->exportAsset(); + return &asset; } diff --git a/tools/ArtistTools/source/BlastPlugin/Window/FileReferencesPanel.h b/tools/ArtistTools/source/BlastPlugin/Window/FileReferencesPanel.h index 71905df..9accf6a 100644 --- a/tools/ArtistTools/source/BlastPlugin/Window/FileReferencesPanel.h +++ b/tools/ArtistTools/source/BlastPlugin/Window/FileReferencesPanel.h @@ -7,6 +7,8 @@ namespace Ui { class FileReferencesPanel; } +#include "ProjectParams.h" + class FileReferencesPanel : public QWidget { Q_OBJECT @@ -27,9 +29,9 @@ public slots: void on_checkBoxFBX_stateChanged(int arg1); - void on_checkBoxObj_stateChanged(int arg1); + void on_checkBoxEmbedFBXCollision_stateChanged(int arg1); - void on_checkBoxCollision_stateChanged(int arg1); + void on_checkBoxObj_stateChanged(int arg1); void on_checkBoxLLAsset_stateChanged(int arg1); @@ -40,6 +42,9 @@ public slots: void on_btnSave_clicked(); private: + BPPAsset* _getCurrentAsset(); + +private: Ui::FileReferencesPanel *ui; bool bValid; }; |