diff options
| author | Bryan Galdrikian <[email protected]> | 2017-08-23 11:24:32 -0700 |
|---|---|---|
| committer | Bryan Galdrikian <[email protected]> | 2017-08-23 11:24:32 -0700 |
| commit | f1e539cadfb085cedc32f9773cfb9d14bfcdf138 (patch) | |
| tree | 7ca74e06a4386dd22fd850a8417a31a85d282a30 /tools/ArtistTools/source/BlastPlugin/SampleBase | |
| parent | Updated to CL 22661993: (diff) | |
| download | blast-f1e539cadfb085cedc32f9773cfb9d14bfcdf138.tar.xz blast-f1e539cadfb085cedc32f9773cfb9d14bfcdf138.zip | |
Removing ArtistTools and CurveEditor projects
Diffstat (limited to 'tools/ArtistTools/source/BlastPlugin/SampleBase')
87 files changed, 0 insertions, 24609 deletions
diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/Sample.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/Sample.h deleted file mode 100644 index 2499deb..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/Sample.h +++ /dev/null @@ -1,115 +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. - - -#ifndef SAMPLE_H -#define SAMPLE_H - -#include "PxTransform.h" -#include <string> -#include <vector> - - -struct AssetList -{ - struct BoxAsset - { - BoxAsset() : staticHeight(-std::numeric_limits<float>().infinity()), - jointAllBonds(false), extents(20, 20, 20), bondFlags(7) - {} - - struct Level - { - Level() :x(0), y(0), z(0), isSupport(0) {}; - - int x, y, z; - bool isSupport; - }; - - std::string id; - std::string name; - physx::PxVec3 extents; - float staticHeight; - bool jointAllBonds; - std::vector<Level> levels; - uint32_t bondFlags; - }; - - struct ModelAsset - { - ModelAsset() : isSkinned(false), transform(physx::PxIdentity) - {} - - std::string id; - std::string file; - std::string name; - std::string fullpath; - physx::PxTransform transform; - bool isSkinned; - }; - - struct CompositeAsset - { - CompositeAsset() : transform(physx::PxIdentity) - {} - - struct AssetRef - { - std::string id; - physx::PxTransform transform; - }; - - struct Joint - { - int32_t assetIndices[2]; - uint32_t chunkIndices[2]; - physx::PxVec3 attachPositions[2]; - }; - - std::string id; - std::string name; - physx::PxTransform transform; - std::vector<AssetRef> assetRefs; - std::vector<Joint> joints; - }; - - std::vector<ModelAsset> models; - std::vector<CompositeAsset> composites; - std::vector<BoxAsset> boxes; -}; - -struct SampleConfig -{ - std::wstring sampleName; - std::string assetsFile; - std::vector<std::string> additionalResourcesDir; - AssetList additionalAssetList; -}; - -int runSample(const SampleConfig& config); - -#endif //SAMPLE_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAsset.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAsset.cpp deleted file mode 100644 index 7bb4f95..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAsset.cpp +++ /dev/null @@ -1,166 +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 "BlastAsset.h" -#include "NvBlastExtPxAsset.h" -#include "NvBlastTkAsset.h" -#include <map> -#include <algorithm> -// Add By Lixu Begin -#include "BlastSceneTree.h" -#include "SampleManager.h" -// Add By Lixu End - -std::set<int> ExistingAssetIds; -BlastAsset::BlastAsset(Renderer& renderer) - : m_renderer(renderer), m_bondHealthMax(1.0f), m_supportChunkHealthMax(1.0f) -{ - for (int id = 0; ; id++) - { - if (ExistingAssetIds.find(id) == ExistingAssetIds.end()) - { - ExistingAssetIds.emplace(id); - mUniqueId = id; - break; - } - } -} - -BlastAsset::~BlastAsset() -{ - ExistingAssetIds.erase(mUniqueId); -} - -void BlastAsset::initialize() -{ -// Add By Lixu Begin - BPPBlast& blast = BlastProject::ins().getParams().blast; - BPPChunkArray& chunks = blast.chunks; - BPPBondArray& bonds = blast.bonds; - - std::vector<float> BondHealths; - SampleManager* pSampleManager = SampleManager::ins(); - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itASM = AssetDescMap.find(this); - AssetList::ModelAsset m; - if (itASM != AssetDescMap.end()) - { - m = itASM->second; - } - - int assetID = BlastProject::ins().getAssetIDByName(m.name.c_str()); - for (int bc = 0; bc < bonds.arraySizes[0]; bc++) - { - BPPBond& bond = bonds.buf[bc]; - if (bond.asset == assetID) - { - BondHealths.push_back(bond.support.bondStrength); - } - } - - const TkAsset& tkAsset = m_pxAsset->getTkAsset(); - uint32_t bondCount = tkAsset.getBondCount(); - - const float* pBondHealths = nullptr; - if (bondCount == BondHealths.size()) - { - pBondHealths = BondHealths.data(); - } - - const NvBlastActorDesc& defaultActorDesc = m_pxAsset->getDefaultActorDesc(); - NvBlastActorDesc newActorDesc = defaultActorDesc; - newActorDesc.initialBondHealths = pBondHealths; -// Add By Lixu End - - // calc max healths - const NvBlastActorDesc& actorDesc = newActorDesc; - if (actorDesc.initialBondHealths) - { - m_bondHealthMax = FLT_MIN; - const uint32_t bondCount = m_pxAsset->getTkAsset().getBondCount(); - for (uint32_t i = 0; i < bondCount; ++i) - { - m_bondHealthMax = std::max<float>(m_bondHealthMax, actorDesc.initialBondHealths[i]); - } - } - else - { - m_bondHealthMax = actorDesc.uniformInitialBondHealth; - } - - if(actorDesc.initialSupportChunkHealths) - { - m_supportChunkHealthMax = FLT_MIN; - const uint32_t nodeCount = m_pxAsset->getTkAsset().getGraph().nodeCount; - for (uint32_t i = 0; i < nodeCount; ++i) - { - m_supportChunkHealthMax = std::max<float>(m_supportChunkHealthMax, actorDesc.initialSupportChunkHealths[i]); - } - } - else - { - m_supportChunkHealthMax = actorDesc.uniformInitialLowerSupportChunkHealth; - } -} - -size_t BlastAsset::getBlastAssetSize() const -{ - return m_pxAsset->getTkAsset().getDataSize(); -} - -std::vector<uint32_t> BlastAsset::getChunkIndexesByDepth(uint32_t depth) const -{ - const TkAsset& tkAsset = m_pxAsset->getTkAsset(); - const NvBlastChunk* pNvBlastChunk = tkAsset.getChunks(); - uint32_t chunkCount = tkAsset.getChunkCount(); - - std::map<uint32_t, uint32_t> indexDepthMap; - indexDepthMap.insert(std::make_pair(0, 0)); - for (size_t i = 1; i < chunkCount; ++i) - { - int depth = 0; - const NvBlastChunk* curChunk = pNvBlastChunk + i; - while (-1 != curChunk->parentChunkIndex) - { - ++depth; - curChunk = pNvBlastChunk + curChunk->parentChunkIndex; - } - indexDepthMap.insert(std::make_pair(i, depth)); - } - - std::vector<uint32_t> indexes; - for (std::map<uint32_t, uint32_t>::iterator itr = indexDepthMap.begin(); itr != indexDepthMap.end(); ++itr) - { - if (itr->second == depth) - { - indexes.push_back(itr->first); - } - } - - return indexes; -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAsset.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAsset.h deleted file mode 100644 index feec9e3..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAsset.h +++ /dev/null @@ -1,132 +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. - - -#ifndef BLAST_ASSET_H -#define BLAST_ASSET_H - -#include <memory> -#include <vector> -#include "PxTransform.h" -#include "NvBlastTypes.h" - - -using namespace physx; - -class Renderer; -class BlastFamily; -class PhysXController; - -namespace Nv -{ -namespace Blast -{ -class ExtPxFamily; -class ExtPxAsset; -class ExtPxManager; -class TkGroup; -} -} - -using namespace Nv::Blast; - -// Add By Lixu Begin -typedef BlastFamily* BlastFamilyPtr; -// Add By Lixu End - - -class BlastAsset -{ -public: - //////// ctor //////// - - BlastAsset(Renderer& renderer); - virtual ~BlastAsset(); - int mUniqueId; - - - //////// desc //////// - - /** - Descriptor with actor initial settings. - */ - struct ActorDesc - { - NvBlastID id; - PxTransform transform; - TkGroup* group; - }; - - - //////// abstract //////// - - virtual BlastFamilyPtr createFamily(PhysXController& physXConroller, ExtPxManager& pxManager, const ActorDesc& desc) = 0; - - - //////// data getters //////// - - const ExtPxAsset* getPxAsset() const - { - return m_pxAsset; - } - - size_t getBlastAssetSize() const; - - std::vector<uint32_t> getChunkIndexesByDepth(uint32_t depth) const; - - float getBondHealthMax() const - { - return m_bondHealthMax; - } - - float getSupportChunkHealthMax() const - { - return m_bondHealthMax; - } - - void initialize(); - -protected: - //////// internal operations //////// - - - - //////// input data //////// - - Renderer& m_renderer; - - - //////// internal data //////// - - ExtPxAsset* m_pxAsset; - float m_bondHealthMax; - float m_supportChunkHealthMax; -}; - - - -#endif //BLAST_ASSET_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetBoxes.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetBoxes.cpp deleted file mode 100644 index 4bd9766..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetBoxes.cpp +++ /dev/null @@ -1,102 +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 "BlastAssetBoxes.h" -#include "BlastFamilyBoxes.h" -#include "NvBlastExtPxAsset.h" -#include "PxPhysics.h" -#include "cooking/PxCooking.h" - - -BlastAssetBoxes::BlastAssetBoxes(TkFramework& framework, PxPhysics& physics, PxCooking& cooking, Renderer& renderer, const Desc& desc) - : BlastAsset(renderer) -{ - // generate boxes slices procedurally - CubeAssetGenerator::generate(m_generatorAsset, desc.generatorSettings); - - // asset desc / tk asset - ExtPxAssetDesc assetDesc; - assetDesc.chunkDescs = m_generatorAsset.solverChunks.data(); - assetDesc.chunkCount = (uint32_t)m_generatorAsset.solverChunks.size(); - assetDesc.bondDescs = m_generatorAsset.solverBonds.data(); - assetDesc.bondCount = (uint32_t)m_generatorAsset.solverBonds.size(); - std::vector<uint8_t> bondFlags(assetDesc.bondCount); - std::fill(bondFlags.begin(), bondFlags.end(), desc.jointAllBonds ? 1 : 0); - assetDesc.bondFlags = bondFlags.data(); - - // box convex - PxVec3 vertices[8] = { { -1, -1, -1 }, { -1, -1, 1 }, { -1, 1, -1 }, { -1, 1, 1 }, { 1, -1, -1 }, { 1, -1, 1 }, { 1, 1, -1 }, { 1, 1, 1 } }; - PxConvexMeshDesc convexMeshDesc; - convexMeshDesc.points.count = 8; - convexMeshDesc.points.data = vertices; - convexMeshDesc.points.stride = sizeof(PxVec3); - convexMeshDesc.flags = PxConvexFlag::eCOMPUTE_CONVEX; - m_boxMesh = cooking.createConvexMesh(convexMeshDesc, physics.getPhysicsInsertionCallback()); - - // prepare chunks - const uint32_t chunkCount = (uint32_t)m_generatorAsset.solverChunks.size(); - std::vector<ExtPxAssetDesc::ChunkDesc> pxChunks(chunkCount); - std::vector<ExtPxAssetDesc::SubchunkDesc> pxSubchunks; - pxSubchunks.reserve(chunkCount); - for (uint32_t i = 0; i < m_generatorAsset.solverChunks.size(); i++) - { - uint32_t chunkID = m_generatorAsset.solverChunks[i].userData; - GeneratorAsset::BlastChunkCube& cube = m_generatorAsset.chunks[chunkID]; - PxVec3 position = *reinterpret_cast<PxVec3*>(&cube.position); - PxVec3 extents = *reinterpret_cast<PxVec3*>(&cube.extents); - ExtPxAssetDesc::ChunkDesc& chunk = pxChunks[chunkID]; - ExtPxAssetDesc::SubchunkDesc subchunk = - { - PxTransform(position), - PxConvexMeshGeometry(m_boxMesh, PxMeshScale(extents / 2)) - }; - pxSubchunks.push_back(subchunk); - chunk.subchunks = &pxSubchunks.back(); - chunk.subchunkCount = 1; - chunk.isStatic = (position.y - (extents.y - desc.generatorSettings.extents.y) / 2) <= desc.staticHeight; - } - - // create asset - assetDesc.pxChunks = pxChunks.data(); - m_pxAsset = ExtPxAsset::create(assetDesc, framework); - - initialize(); -} - - -BlastAssetBoxes::~BlastAssetBoxes() -{ - m_boxMesh->release(); - m_pxAsset->release(); -} - - -BlastFamilyPtr BlastAssetBoxes::createFamily(PhysXController& physXConroller, ExtPxManager& pxManager, const ActorDesc& desc) -{ - return BlastFamilyPtr(new BlastFamilyBoxes(physXConroller, pxManager, m_renderer, *this, desc)); -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetBoxes.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetBoxes.h deleted file mode 100644 index d4f8dd2..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetBoxes.h +++ /dev/null @@ -1,74 +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. - - -#ifndef BLAST_ASSET_BOXES_H -#define BLAST_ASSET_BOXES_H - -#include "BlastAsset.h" -#include "AssetGenerator.h" -#include "PxConvexMesh.h" - - -namespace physx -{ -class PxPhysics; -class PxCooking; -} - -namespace Nv -{ -namespace Blast -{ -class TkFramework; -} -} - - -class BlastAssetBoxes : public BlastAsset -{ -public: - struct Desc - { - CubeAssetGenerator::Settings generatorSettings; - float staticHeight; - bool jointAllBonds; - }; - - BlastAssetBoxes(TkFramework& framework, PxPhysics& physics, PxCooking& cooking, Renderer& renderer, const Desc& desc); - virtual ~BlastAssetBoxes(); - - BlastFamilyPtr createFamily(PhysXController& physXConroller, ExtPxManager& pxManager, const ActorDesc& desc); - -private: - PxConvexMesh* m_boxMesh; - GeneratorAsset m_generatorAsset; -}; - - - -#endif //BLAST_ASSET_BOXES_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.cpp deleted file mode 100644 index 857cb9b..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.cpp +++ /dev/null @@ -1,252 +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 "GlobalSettings.h" -#include <QtCore/QFile> -#include "BlastAssetModel.h" -#include "Renderer.h" -#include "BlastController.h" -#include "Utils.h" -#include "ResourceManager.h" -#include "NvBlastExtPxAsset.h" -#include <sstream> -#include <fstream> -#include "NvBlastExtExporter.h" -#include "PxPhysics.h" -#include <NvBlastGlobals.h> -#include "NvBlastExtAssetUtils.h" -#include "NvBlastExtPxAsset.h" -#include "NvBlastTkAsset.h" -#include "NvBlastExtSerialization.h" -#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) -{ - if (modelPath == NULL) - { - GlobalSettings& globalSettings = GlobalSettings::Inst(); - modelPath = globalSettings.m_projectFileDir.c_str(); - assert(globalSettings.m_projectFileDir.length() > 0); - } - - const float unitConversion = 1.f; - - const NvcVec3 inputScale = { unitConversion, unitConversion, unitConversion }; - - std::string path; - - // load obj file - std::ostringstream objFileName; - objFileName << modelName << ".obj"; - - path = GlobalSettings::MakeFileName(modelPath, objFileName.str().c_str()); - if (QFile::exists(path.c_str())) - { - m_model = BlastModel::loadFromFileTinyLoader(path.c_str()); - if (!m_model) - { - ASSERT_PRINT(false, "obj load failed"); - } - } - else // Obj is not found, try FBX - { - objFileName.clear(); - objFileName.str(""); - objFileName << modelName << ".fbx"; - path = GlobalSettings::MakeFileName(modelPath, objFileName.str().c_str()); - if (QFile::exists(path.c_str())) - { - m_model = BlastModel::loadFromFbxFile(path.c_str()); - if (!m_model) - { - ASSERT_PRINT(false, "fbx load failed"); - } - - } - else - { - ASSERT_PRINT(false, "mesh file not found"); - } - } - - for (auto& chunk : m_model->chunks) - { - for (auto& mesh : chunk.meshes) - { - SimpleMesh& smesh = const_cast<SimpleMesh&>(mesh.mesh); - smesh.center *= unitConversion; - smesh.extents *= unitConversion; - for (auto& vertex : smesh.vertices) - { - vertex.position *= unitConversion; - } - } - } - - // Physics Asset - - // Read file into buffer - std::ostringstream blastFileName; - blastFileName << modelName << ".blast"; - path = GlobalSettings::MakeFileName(modelPath, blastFileName.str().c_str()); - if (QFile::exists(path.c_str())) - { - std::ifstream stream(path.c_str(), std::ios::binary); - std::streampos size = stream.tellg(); - stream.seekg(0, std::ios::end); - size = stream.tellg() - size; - stream.seekg(0, std::ios::beg); - std::vector<char> buffer(size); - stream.read(buffer.data(), buffer.size()); - stream.close(); - uint32_t objectTypeID; - void* asset = serialization.deserializeFromBuffer(buffer.data(), buffer.size(), &objectTypeID); - if (asset == nullptr) - { - ASSERT_PRINT(asset != nullptr, "can't load .blast file."); - } - else - if (objectTypeID == Nv::Blast::ExtPxObjectTypeID::Asset) - { - m_pxAsset = reinterpret_cast<ExtPxAsset*>(asset); - const TkAsset& tkAsset = m_pxAsset->getTkAsset(); - NvBlastAsset* llasset = const_cast<NvBlastAsset*>(tkAsset.getAssetLL()); - NvBlastExtAssetTransformInPlace(llasset, &inputScale, nullptr, nullptr); - ExtPxSubchunk* subchunks = const_cast<ExtPxSubchunk*>(m_pxAsset->getSubchunks()); - for (uint32_t i = 0; i < m_pxAsset->getSubchunkCount(); ++i) - { - subchunks[i].geometry.scale.scale = PxVec3(unitConversion); - } - } - else - { - TkAsset* tkAsset = nullptr; - if (objectTypeID == Nv::Blast::TkObjectTypeID::Asset) - { - tkAsset = reinterpret_cast<TkAsset*>(asset); - NvBlastAsset* llasset = const_cast<NvBlastAsset*>(tkAsset->getAssetLL()); - NvBlastExtAssetTransformInPlace(llasset, &inputScale, nullptr, nullptr); - } - else - if (objectTypeID == Nv::Blast::LlObjectTypeID::Asset) - { - NvBlastAsset* llasset = reinterpret_cast<NvBlastAsset*>(asset); - NvBlastExtAssetTransformInPlace(llasset, &inputScale, nullptr, nullptr); - tkAsset = framework.createAsset(llasset, nullptr, 0, true); - } - else - { - ASSERT_PRINT(false, ".blast file contains unknown object."); - } - - if (tkAsset != nullptr) - { - std::vector<ExtPxAssetDesc::ChunkDesc> physicsChunks; - std::vector<std::vector<ExtPxAssetDesc::SubchunkDesc> > physicsSubchunks; - /** - Try find FBX and check whether it contains collision geometry. - */ - objFileName.str(""); - objFileName << modelName << ".fbx"; - path = GlobalSettings::MakeFileName(modelPath, objFileName.str().c_str()); - if (QFile::exists(path.c_str())) - { - 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"); - } - uint32_t* hullsOffsets = nullptr; - CollisionHull** hulls = nullptr; - uint32_t meshCount = rdr->getCollision(hullsOffsets, hulls); - - /** - Create physics meshes; - */ - std::shared_ptr<Nv::Blast::ConvexMeshBuilder> collisionBuilder( - NvBlastExtAuthoringCreateConvexMeshBuilder(&cooking, &physics.getPhysicsInsertionCallback()), - [](Nv::Blast::ConvexMeshBuilder* cmb) {cmb->release(); }); - - physicsChunks.resize(meshCount); - physicsSubchunks.resize(meshCount); - - for (uint32_t i = 0; i < meshCount; ++i) - { - for (uint32_t sbHulls = hullsOffsets[i]; sbHulls < hullsOffsets[i+1]; ++sbHulls) - { - PxConvexMeshGeometry temp = physx::PxConvexMeshGeometry(collisionBuilder.get()->buildConvexMesh(*hulls[sbHulls])); - if (temp.isValid()) - { - physicsSubchunks[i].push_back(ExtPxAssetDesc::SubchunkDesc()); - physicsSubchunks[i].back().geometry = temp; - physicsSubchunks[i].back().transform = physx::PxTransform(physx::PxIdentity); - } - } - } - 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"); - } - } - } -} - -BlastAssetModel::BlastAssetModel(ExtPxAsset* pExtPxAsset, BlastModel* pBlastModel, Renderer& renderer) - : BlastAsset(renderer) -{ - m_pxAsset = pExtPxAsset; - ASSERT_PRINT(m_pxAsset != nullptr, "m_pxAsset is nullptr"); - - m_model = pBlastModel; - ASSERT_PRINT(m_model != nullptr, "m_model is nullptr"); -} - -BlastAssetModel::~BlastAssetModel() -{ - m_pxAsset->release(); -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.h deleted file mode 100644 index 9e13674..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModel.h +++ /dev/null @@ -1,77 +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. - - -#ifndef BLAST_ASSET_MODEL_H -#define BLAST_ASSET_MODEL_H - -#include "BlastAsset.h" -#include "BlastModel.h" - - -namespace physx -{ -class PxPhysics; -class PxCooking; -} - -namespace Nv -{ -namespace Blast -{ -class TkFramework; -class ExtSerialization; -} -} - - -class BlastAssetModel : public BlastAsset -{ -public: - //////// ctor //////// - - BlastAssetModel(TkFramework& framework, PxPhysics& physics, PxCooking& cooking, ExtSerialization& serialization, Renderer& renderer, const char* modelName, const char* modelPath = NULL); - BlastAssetModel(ExtPxAsset* pExtPxAsset, BlastModel* pBlastModel, Renderer& renderer); - virtual ~BlastAssetModel(); - - - //////// data getters //////// - - const BlastModel& getModel() const - { -// Add By Lixu Begin - return *m_model; -// Add By Lixu End - } - -private: - //////// private internal data //////// - - BlastModelPtr m_model; -}; - -#endif //BLAST_ASSET_MODEL_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSimple.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSimple.cpp deleted file mode 100644 index c3db31d..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSimple.cpp +++ /dev/null @@ -1,74 +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 "BlastAssetModelSimple.h" -#include "BlastFamilyModelSimple.h" -#include "CustomRenderMesh.h" -#include "Renderer.h" - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// BlastAssetModelSimple -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -BlastAssetModelSimple::BlastAssetModelSimple(TkFramework& framework, PxPhysics& physics, PxCooking& cooking, ExtSerialization& serialization, Renderer& renderer, const char* modelName) - : BlastAssetModel(framework, physics, cooking, serialization, renderer, modelName) -{ - _init(renderer); -} - -BlastAssetModelSimple::BlastAssetModelSimple(ExtPxAsset* pExtPxAsset, BlastModel* pBlastModel, Renderer& renderer) - : BlastAssetModel(pExtPxAsset, pBlastModel, renderer) -{ - _init(renderer); -} - -BlastAssetModelSimple::~BlastAssetModelSimple() -{ - m_renderMaterialNames.clear(); -} - -void BlastAssetModelSimple::_init(Renderer& renderer) -{ - for (const BlastModel::Material& material : getModel().materials) - { - std::string name = material.name; - if (name != "" && !BlastProject::ins().isGraphicsMaterialNameExist(name.c_str())) - { - BlastProject::ins().addGraphicsMaterial(name.c_str()); - BlastProject::ins().reloadDiffuseTexture(name.c_str(), material.diffuseTexture.c_str()); - BlastProject::ins().reloadDiffuseColor(name.c_str(), material.r, material.g, material.b, material.a); - } - m_renderMaterialNames.push_back(name); - } -} - -BlastFamilyPtr BlastAssetModelSimple::createFamily(PhysXController& physXConroller, ExtPxManager& pxManager, const ActorDesc& desc) -{ - return BlastFamilyPtr(new BlastFamilyModelSimple(physXConroller, pxManager, m_renderer, *this, desc)); -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSimple.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSimple.h deleted file mode 100644 index ca3d995..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSimple.h +++ /dev/null @@ -1,66 +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. - - -#ifndef BLAST_ASSET_MODEL_SIMPLE_H -#define BLAST_ASSET_MODEL_SIMPLE_H - -#include "BlastAssetModel.h" - - - -class BlastAssetModelSimple : public BlastAssetModel -{ -public: - //////// ctor //////// - - BlastAssetModelSimple(TkFramework& framework, PxPhysics& physics, PxCooking& cooking, ExtSerialization& serialization, Renderer& renderer, const char* modelName); - BlastAssetModelSimple(ExtPxAsset* pExtPxAsset, BlastModel* pBlastModel, Renderer& renderer); - virtual ~BlastAssetModelSimple(); - - - //////// interface implementation //////// - - virtual BlastFamilyPtr createFamily(PhysXController& physXConroller, ExtPxManager& pxManager, const ActorDesc& desc); - - - //////// data getters //////// - - const std::vector<std::string>& getRenderMaterials() const - { - return m_renderMaterialNames; - } - - -private: - //////// private internal data //////// - void _init(Renderer& renderer); - - std::vector<std::string> m_renderMaterialNames; -}; - -#endif //BLAST_ASSET_MODEL_SIMPLE_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSkinned.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSkinned.cpp deleted file mode 100644 index 747c2f4..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSkinned.cpp +++ /dev/null @@ -1,65 +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 "BlastAssetModelSkinned.h" -#include "BlastFamilyModelSkinned.h" -#include "RenderMaterial.h" -#include "Renderer.h" - - -BlastAssetModelSkinned::BlastAssetModelSkinned(TkFramework& framework, PxPhysics& physics, PxCooking& cooking, ExtSerialization& serialization, Renderer& renderer, const char* modelName) - : BlastAssetModel(framework, physics, cooking, serialization, renderer, modelName) -{ -// Add By Lixu Begin - int index = 0; - char materialName[50]; - for (const BlastModel::Material& material : getModel().materials) - { - sprintf(materialName, "%s_Material%d", modelName, index++); - - if (material.diffuseTexture.empty()) - m_renderMaterials.push_back(new RenderMaterial(modelName, renderer.getResourceManager(), "model_skinned")); - else - m_renderMaterials.push_back(new RenderMaterial(modelName, renderer.getResourceManager(), "model_skinned_textured", material.diffuseTexture.c_str())); - } -// Add By Lixu End - initialize(); -} - -BlastAssetModelSkinned::~BlastAssetModelSkinned() -{ - for (RenderMaterial* r : m_renderMaterials) - { - SAFE_DELETE(r); - } -} - -BlastFamilyPtr BlastAssetModelSkinned::createFamily(PhysXController& physXConroller, ExtPxManager& pxManager, const ActorDesc& desc) -{ - return BlastFamilyPtr(new BlastFamilyModelSkinned(physXConroller, pxManager, m_renderer, *this, desc)); -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSkinned.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSkinned.h deleted file mode 100644 index e9c6784..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastAssetModelSkinned.h +++ /dev/null @@ -1,64 +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. - - -#ifndef BLAST_ASSET_MODEL_SKINNED_H -#define BLAST_ASSET_MODEL_SKINNED_H - -#include "BlastAssetModel.h" - -class RenderMaterial; - -class BlastAssetModelSkinned : public BlastAssetModel -{ -public: - //////// ctor //////// - - BlastAssetModelSkinned(TkFramework& framework, PxPhysics& physics, PxCooking& cooking, ExtSerialization& serialization, Renderer& renderer, const char* modelName); - virtual ~BlastAssetModelSkinned(); - - - //////// interface implementation //////// - - BlastFamilyPtr createFamily(PhysXController& physXConroller, ExtPxManager& pxManager, const ActorDesc& desc); - - - //////// public getter //////// - - const std::vector<RenderMaterial*>& getRenderMaterials() const - { - return m_renderMaterials; - } - - -private: - //////// internal data //////// - - std::vector<RenderMaterial*> m_renderMaterials; -}; - -#endif //BLAST_ASSET_MODEL_SKINNED_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastController.cpp deleted file mode 100644 index 950b217..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastController.cpp +++ /dev/null @@ -1,611 +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 "BlastController.h" -#include "BlastFamily.h" -#include "BlastAsset.h" -#include "BlastReplay.h" -#include "PhysXController.h" -#include "SampleTime.h" -#include "SampleProfiler.h" -#include "Utils.h" -#include "Renderer.h" - -#include "NvBlastExtPxTask.h" - -#include "NvBlast.h" -#include "NvBlastPxCallbacks.h" -#include "NvBlastExtPxManager.h" -#include "NvBlastExtPxFamily.h" -#include "NvBlastExtPxActor.h" -#include "NvBlastExtSerialization.h" -#include "NvBlastExtTkSerialization.h" -#include "NvBlastExtPxSerialization.h" - -#include "NvBlastTkFramework.h" - -#include "PsString.h" -#include "PxTaskManager.h" -#include "PxDefaultCpuDispatcher.h" -#include "PxRigidBody.h" -#include "PxScene.h" -#include "PxRigidDynamic.h" -#include "PxDistanceJoint.h" - -#include <sstream> -#include <numeric> -#include <cstdlib> - -#include "imgui.h" - -// Add By Lixu Begin -#include "BlastSceneTree.h" -// Add By Lixu End - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Joint creation -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -static physx::PxJoint* createPxJointCallback(ExtPxActor* actor0, const physx::PxTransform& localFrame0, ExtPxActor* actor1, const physx::PxTransform& localFrame1, physx::PxPhysics& physics, TkJoint& joint) -{ - PxDistanceJoint* pxJoint = PxDistanceJointCreate(physics, actor0 ? &actor0->getPhysXActor() : nullptr, localFrame0, actor1 ? &actor1->getPhysXActor() : nullptr, localFrame1); - pxJoint->setMaxDistance(1.0f); - return pxJoint; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Controller -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -BlastController::BlastController() -: m_eventCallback(nullptr), debugRenderMode(BlastFamily::DEBUG_RENDER_DISABLED), m_impactDamageEnabled(true), -m_impactDamageToStressEnabled(false), m_rigidBodyLimitEnabled(true), m_rigidBodyLimit(40000), m_blastAssetsSize(0), debugRenderScale(0.01f), -m_taskManager(nullptr), m_extGroupTaskManager(nullptr) -{ - m_impactDamageToStressFactor = 0.01f; - m_draggingToStressFactor = 100.0f; -} - - -BlastController::~BlastController() -{ -} - -void BlastController::reinitialize() -{ - onSampleStop(); - onSampleStart(); -} - -void BlastController::onSampleStart() -{ - m_tkFramework = NvBlastTkFrameworkCreate(); - - m_replay = new BlastReplay(); - - m_taskManager = PxTaskManager::createTaskManager(NvBlastGetPxErrorCallback(), getPhysXController().getCPUDispatcher(), 0); - - TkGroupDesc gdesc; - gdesc.workerCount = m_taskManager->getCpuDispatcher()->getWorkerCount(); - m_tkGroup = m_tkFramework->createGroup(gdesc); - - m_extPxManager = ExtPxManager::create(getPhysXController().getPhysics(), *m_tkFramework, createPxJointCallback); - m_extPxManager->setActorCountLimit(m_rigidBodyLimitEnabled ? m_rigidBodyLimit : 0); - m_extImpactDamageManager = ExtImpactDamageManager::create(m_extPxManager, m_extImpactDamageManagerSettings); - m_eventCallback = new EventCallback(m_extImpactDamageManager); - - m_extGroupTaskManager = ExtGroupTaskManager::create(*m_taskManager); - m_extGroupTaskManager->setGroup(m_tkGroup); - - setImpactDamageEnabled(m_impactDamageEnabled, true); - - m_extSerialization = NvBlastExtSerializationCreate(); - if (m_extSerialization != nullptr) - { - NvBlastExtTkSerializerLoadSet(*m_tkFramework, *m_extSerialization); - NvBlastExtPxSerializerLoadSet(*m_tkFramework, getPhysXController().getPhysics(), getPhysXController().getCooking(), *m_extSerialization); - } -} - - -void BlastController::onSampleStop() -{ - getPhysXController().simualtionSyncEnd(); - - removeAllFamilies(); - - m_extImpactDamageManager->release(); - m_extPxManager->release(); - SAFE_DELETE(m_eventCallback); - - m_tkGroup->release(); - - delete m_replay; - - m_tkFramework->release(); - - if (m_extGroupTaskManager != nullptr) - { - m_extGroupTaskManager->release(); - m_extGroupTaskManager = nullptr; - } - - if (m_taskManager != nullptr) - { - m_taskManager->release(); - } -} - - -void BlastController::notifyPhysXControllerRelease() -{ - if (m_extGroupTaskManager != nullptr) - { - m_extGroupTaskManager->release(); - m_extGroupTaskManager = nullptr; - } - - if (m_taskManager != nullptr) - { - m_taskManager->release(); - m_taskManager = nullptr; - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Impact damage -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void BlastController::updateImpactDamage() -{ - if (m_impactDamageUpdatePending) - { - getPhysXController().getPhysXScene().setSimulationEventCallback(m_impactDamageEnabled ? m_eventCallback : nullptr); - refreshImpactDamageSettings(); - m_impactDamageUpdatePending = false; - } -} - -void BlastController::setImpactDamageEnabled(bool enabled, bool forceUpdate) -{ - if (m_impactDamageEnabled != enabled || forceUpdate) - { - m_impactDamageEnabled = enabled; - m_impactDamageUpdatePending = true; - } -} - -bool BlastController::customImpactDamageFunction(void* data, ExtPxActor* actor, physx::PxShape* shape, physx::PxVec3 position, physx::PxVec3 force) -{ - return reinterpret_cast<BlastController*>(data)->stressDamage(actor, position, force); -} - -bool BlastController::stressDamage(ExtPxActor *actor, physx::PxVec3 position, physx::PxVec3 force) -{ - if (actor->getTkActor().getGraphNodeCount() > 1) - { - void* userData = actor->getFamily().userData; - if (userData) - { - ExtPxStressSolver* solver = reinterpret_cast<ExtPxStressSolver*>(userData); - solver->getSolver().addForce(*actor->getTkActor().getActorLL(), position, force * m_impactDamageToStressFactor); - return true; - } - } - - return false; -} - -void BlastController::refreshImpactDamageSettings() -{ - m_extImpactDamageManagerSettings.damageFunction = m_impactDamageToStressEnabled ? customImpactDamageFunction : nullptr; - m_extImpactDamageManagerSettings.damageFunctionData = this; - m_extImpactDamageManager->setSettings(m_extImpactDamageManagerSettings); -} - -// Add By Lixu Begin -BlastFamily* BlastController::getFamilyByPxActor(const PxActor& actor) -{ - for (BlastFamilyPtr family : m_families) - { - if (family->find(actor)) - { - return family; - } - } - return nullptr; -} - -BlastFamily* BlastController::getFamilyById(int familyId) -{ - BlastFamily* pBlastFamily = nullptr; - for (BlastFamilyPtr p : m_families) - { - if (p->mUniqueId == familyId) - { - pBlastFamily = p; - break; - } - } - return pBlastFamily; -} - -std::vector<PxActor*> BlastController::getActor(BlastAsset* asset, int chunkId) -{ - std::vector<PxActor*> actors; - for (BlastFamilyPtr family : m_families) - { - if (&(family->getBlastAsset()) == asset) - { - PxActor* actor = nullptr; - family->getPxActorByChunkIndex(chunkId, &actor); - if (actor) - actors.push_back(actor); - } - } - return actors; -} - -void BlastController::updateActorRenderableTransform(const PxActor& actor, physx::PxTransform& pos, bool local) -{ - BlastFamily* family = getFamilyByPxActor(actor); - if (family == nullptr) - return; - - family->updateActorRenderableTransform(actor, pos, local); -} - -bool BlastController::isActorVisible(const PxActor& actor) -{ - BlastFamily* family = getFamilyByPxActor(actor); - if (family == nullptr) - return false; - - return family->isActorVisible(actor); -} - -bool BlastController::isAssetFractrued(const PxActor& actor) -{ - BlastFamily* family = getFamilyByPxActor(actor); - if (family == nullptr) - return false; - - const BlastAsset& asset = family->getBlastAsset(); - if (asset.getChunkIndexesByDepth(1).size() > 0) - { - return true; - } - - return false; -} - -void BlastController::updateModelMeshToProjectParam(const PxActor& actor) -{ - BlastFamily* family = getFamilyByPxActor(actor); - if (family == nullptr) - return; - - const BlastAsset& asset = family->getBlastAsset(); - SampleManager::ins()->updateModelMeshToProjectParam(const_cast<BlastAsset*>(&asset)); -} -// Add By Lixu End - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Stress -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void BlastController::updateDraggingStress() -{ - auto physxController = getPhysXController(); - auto actor = physxController.getDraggingActor(); - if (actor) - { - ExtPxActor* pxActor = m_extPxManager->getActorFromPhysXActor(*actor); - if (pxActor && pxActor->getTkActor().getGraphNodeCount() > 1 && pxActor->getPhysXActor().getRigidBodyFlags() & PxRigidBodyFlag::eKINEMATIC) - { - void* userData = pxActor->getFamily().userData; - if (userData) - { - ExtPxStressSolver* solver = reinterpret_cast<ExtPxStressSolver*>(userData); - PxTransform t(pxActor->getPhysXActor().getGlobalPose().getInverse()); - PxVec3 dragVector = t.rotate(physxController.getDragVector()); - const float factor = dragVector.magnitudeSquared() * m_draggingToStressFactor; - solver->getSolver().addForce(*pxActor->getTkActor().getActorLL(), physxController.getDragActorHookLocalPoint(), dragVector.getNormalized() * factor); - } - } - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Stats -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -uint32_t BlastController::getActorCount() const -{ - return std::accumulate(m_families.begin(), m_families.end(), (uint32_t)0, [](uint32_t sum, const BlastFamilyPtr& a) - { - return sum += a->getActorCount(); - }); -} - -uint32_t BlastController::getTotalVisibleChunkCount() const -{ - return std::accumulate(m_families.begin(), m_families.end(), (uint32_t)0, [](uint32_t sum, const BlastFamilyPtr& a) - { - return sum += a->getTotalVisibleChunkCount(); - }); -} - -size_t BlastController::getFamilySize() const -{ - return std::accumulate(m_families.begin(), m_families.end(), (size_t)0, [](size_t sum, const BlastFamilyPtr& a) - { - return sum += a->getFamilySize(); - }); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Time -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const double Time::s_secondsPerTick = Time::getTickDuration(); - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Controller events -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void BlastController::Animate(double dt) -{ - PROFILER_SCOPED_FUNCTION(); - - PROFILER_BEGIN("Apply Impact Damage"); - m_extImpactDamageManager->applyDamage(); - PROFILER_END(); - - updateDraggingStress(); - - fillDebugRender(); - - getPhysXController().simualtionSyncEnd(); - - updateImpactDamage(); - - Time blastTime; - for (uint32_t i = 0; i < m_families.size(); ++i) - { - if (m_families[i]) - { - m_families[i]->updatePreSplit(dt); - } - } - - m_replay->update(); - - PROFILER_BEGIN("Tk Group Process/Sync"); - -#if 1 - - m_extGroupTaskManager->process(); - m_extGroupTaskManager->wait(); - -#else // process group on main thread - - m_tkGroup->process(); - -#endif - - PROFILER_END(); - - getPhysXController().simulationBegin(dt); - - TkGroupStats gstats; - m_tkGroup->getStats(gstats); - - this->m_lastBlastTimers.blastDamageMaterial = NvBlastTicksToSeconds(gstats.timers.material); - this->m_lastBlastTimers.blastDamageFracture = NvBlastTicksToSeconds(gstats.timers.fracture); - this->m_lastBlastTimers.blastSplitIsland = NvBlastTicksToSeconds(gstats.timers.island); - this->m_lastBlastTimers.blastSplitPartition = NvBlastTicksToSeconds(gstats.timers.partition); - this->m_lastBlastTimers.blastSplitVisibility = NvBlastTicksToSeconds(gstats.timers.visibility); - - for (uint32_t i = 0; i < m_families.size(); ++i) - { - if (m_families[i]) - { - m_families[i]->updateAfterSplit(dt); - } - } - -// Add By Lixu Begin - BlastSceneTree* pBlastSceneTree = BlastSceneTree::ins(); - bool needUpdateUI = false; - - std::map<BlastAsset*, std::vector<BlastFamily*>>& AssetFamiliesMap = getManager()->getAssetFamiliesMap(); - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itAsset; - std::vector<BlastFamily*>::iterator itFamily; - uint32_t assetIndex = 0; - for (itAsset = AssetFamiliesMap.begin(); itAsset != AssetFamiliesMap.end(); itAsset++) - { - std::vector<BlastFamily*>& BlastFamilies = itAsset->second; - for (itFamily = BlastFamilies.begin(); itFamily != BlastFamilies.end(); itFamily++) - { - BlastFamily* pFamily = *itFamily; - - std::map<uint32_t, bool>& VisibleChangedChunks = pFamily->getVisibleChangedChunks(); - std::map<uint32_t, bool>::iterator itChunk; - for (itChunk = VisibleChangedChunks.begin(); itChunk != VisibleChangedChunks.end(); itChunk++) - { - pBlastSceneTree->updateVisible(assetIndex, itChunk->first, itChunk->second); - needUpdateUI = true; - } - pFamily->clearVisibleChangedChunks(); - } - - assetIndex++; - } - - if (needUpdateUI) - { - //pBlastSceneTree->updateValues(false); - SampleManager::ins()->m_bNeedRefreshTree = true; - } -// Add By Lixu End -} - - -void BlastController::drawUI() -{ - // impact damage - bool impactEnabled = getImpactDamageEnabled(); - if (ImGui::Checkbox("Impact Damage", &impactEnabled)) - { - setImpactDamageEnabled(impactEnabled); - } - { - bool refresh = false; - refresh |= ImGui::Checkbox("Use Shear Damage", &m_extImpactDamageManagerSettings.shearDamage); - refresh |= ImGui::DragFloat("Impulse Threshold (Min)", &m_extImpactDamageManagerSettings.impulseMinThreshold); - refresh |= ImGui::DragFloat("Impulse Threshold (Max)", &m_extImpactDamageManagerSettings.impulseMaxThreshold); - refresh |= ImGui::DragFloat("Damage (Max)", &m_extImpactDamageManagerSettings.damageMax); - refresh |= ImGui::DragFloat("Damage Radius (Max)", &m_extImpactDamageManagerSettings.damageRadiusMax); - refresh |= ImGui::DragFloat("Damage Attenuation", &m_extImpactDamageManagerSettings.damageAttenuation, 1.0f, 0.0f, 1.0f); - refresh |= ImGui::Checkbox("Impact Damage To Stress Solver", &m_impactDamageToStressEnabled); - - if (refresh) - { - refreshImpactDamageSettings(); - } - } - - ImGui::DragFloat("Impact Damage To Stress Factor", &m_impactDamageToStressFactor, 0.001f, 0.0f, 1000.0f, "%.4f"); - ImGui::DragFloat("Dragging To Stress Factor", &m_draggingToStressFactor, 0.1f, 0.0f, 1000.0f, "%.3f"); - - ImGui::Checkbox("Limit Rigid Body Count", &m_rigidBodyLimitEnabled); - if (m_rigidBodyLimitEnabled) - { - ImGui::DragInt("Rigid Body Limit", (int*)&m_rigidBodyLimit, 100, 1000, 100000); - } - m_extPxManager->setActorCountLimit(m_rigidBodyLimitEnabled ? m_rigidBodyLimit : 0); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// actor management -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -BlastFamilyPtr BlastController::spawnFamily(BlastAsset* blastAsset, const BlastAsset::ActorDesc& desc) -{ - BlastFamilyPtr actor = blastAsset->createFamily(getPhysXController(), *m_extPxManager, desc); - m_families.push_back(actor); - recalculateAssetsSize(); - m_replay->addFamily(&actor->getFamily()->getTkFamily()); - return actor; -} - -void BlastController::removeFamily(BlastFamilyPtr actor) -{ - m_replay->removeFamily(&actor->getFamily()->getTkFamily()); - m_families.erase(std::remove(m_families.begin(), m_families.end(), actor), m_families.end()); - recalculateAssetsSize(); - getPhysXController().resetDragging(); -// Add By Lixu Begin - delete actor; -// Add By Lixu End -} - -void BlastController::removeAllFamilies() -{ - while (!m_families.empty()) - { - removeFamily(m_families.back()); - } - m_replay->reset(); -} - -void BlastController::recalculateAssetsSize() -{ - std::set<const BlastAsset*> uniquedAssets; - m_blastAssetsSize = 0; - for (uint32_t i = 0; i < m_families.size(); ++i) - { - if (uniquedAssets.find(&m_families[i]->getBlastAsset()) == uniquedAssets.end()) - { - m_blastAssetsSize += m_families[i]->getBlastAsset().getBlastAssetSize(); - uniquedAssets.insert(&m_families[i]->getBlastAsset()); - } - } -} - -bool BlastController::overlap(const PxGeometry& geometry, const PxTransform& pose, std::function<void(ExtPxActor*)> hitCall) -{ - PROFILER_SCOPED_FUNCTION(); - - bool anyHit = false; - for (uint32_t i = 0; i < m_families.size(); ++i) - { - if (m_families[i]) - { - anyHit |= m_families[i]->overlap(geometry, pose, hitCall); - } - } - return anyHit; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// debug render -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void BlastController::fillDebugRender() -{ - PROFILER_SCOPED_FUNCTION(); - - m_debugRenderBuffer.clear(); - - if (debugRenderMode != BlastFamily::DEBUG_RENDER_DISABLED) - { - getPhysXController().getPhysXScene().setVisualizationParameter(PxVisualizationParameter::eSCALE, 1); - for (uint32_t i = 0; i < m_families.size(); ++i) - { - m_families[i]->fillDebugRender(m_debugRenderBuffer, debugRenderMode, debugRenderScale); - } - } - else - { - getPhysXController().getPhysXScene().setVisualizationParameter(PxVisualizationParameter::eSCALE, 0); - } - - getRenderer().queueRenderBuffer(&m_debugRenderBuffer); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastController.h deleted file mode 100644 index 7a6bcf0..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastController.h +++ /dev/null @@ -1,287 +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. - - -#ifndef BLAST_CONTROLLER_H -#define BLAST_CONTROLLER_H - -#include "SampleManager.h" -#include "BlastFamily.h" -#include "DebugRenderBuffer.h" -#include "PxSimulationEventCallback.h" -#include "NvBlastExtImpactDamageManager.h" - -using namespace physx; - -class BlastAsset; -class BlastReplay; - -namespace physx -{ -class PxTaskManager; -} -namespace Nv -{ -namespace Blast -{ -class TkFramework; -class ExtGroupTaskManager; -class ExtSerialization; -} -} - - -struct BlastTimers -{ - double blastDamageMaterial; - double blastDamageFracture; - double blastSplitIsland; - double blastSplitPartition; - double blastSplitVisibility; -}; - -/** -Blast Controller. Entry point for all blast related code, keeps blast actors and controls them. -*/ -class BlastController : public ISampleController -{ -public: - //////// ctor //////// - - BlastController(); - virtual ~BlastController(); - - void reinitialize(); - - //////// controller callbacks //////// - - virtual void onSampleStart(); - virtual void onSampleStop(); - - virtual void Animate(double dt); - void drawUI(); - - - //////// public API //////// - - bool overlap(const PxGeometry& geometry, const PxTransform& pose, std::function<void(ExtPxActor*)> hitCall); - - bool stressDamage(ExtPxActor *actor, PxVec3 position, PxVec3 force); - - BlastFamilyPtr spawnFamily(BlastAsset* blastAsset, const BlastAsset::ActorDesc& desc); - void removeFamily(BlastFamilyPtr actor); - void removeAllFamilies(); - - - //////// public getters/setters //////// - - TkFramework& getTkFramework() const - { - return *m_tkFramework; - } - - TkGroup* getTkGroup() const - { - return m_tkGroup; - } - - ExtPxManager& getExtPxManager() const - { - return *m_extPxManager; - } - - ExtImpactDamageManager* getExtImpactDamageManager() const - { - return m_extImpactDamageManager; - } - - BlastReplay* getReplay() const - { - return m_replay; - } - - uint32_t getActorCount() const; - - uint32_t getTotalVisibleChunkCount() const; - - size_t getFamilySize() const; - - size_t getBlastAssetsSize() const - { - return m_blastAssetsSize; - } - - const BlastTimers& getLastBlastTimers() const - { - return m_lastBlastTimers; - } - - bool getImpactDamageEnabled() const - { - return m_impactDamageEnabled; - } - - void setImpactDamageEnabled(bool enabled, bool forceUpdate = false); - - ExtStressSolverSettings& getStressSolverSettings() - { - return m_extStressSolverSettings; - } - -// Add By Lixu Begin - std::vector<BlastFamilyPtr>& getFamilies() - { - return m_families; - } - - BlastFamily* getFamilyByPxActor(const PxActor& actor); - std::vector<PxActor*> getActor(BlastAsset* asset, int chunkId); - - void updateActorRenderableTransform(const PxActor& actor, physx::PxTransform& pos, bool local = false); - - bool isActorVisible(const PxActor& actor); - - bool isAssetFractrued(const PxActor& actor); - - // only update unfractured mode mesh - void updateModelMeshToProjectParam(const PxActor& actor); - - BlastFamily* getFamilyById(int familyId); -// Add By Lixu End - - float getLastStressDelta() const; - - void notifyPhysXControllerRelease(); - - ExtSerialization* getExtSerialization() const - { - return m_extSerialization; - } - - //////// public variables for UI //////// - - BlastFamily::DebugRenderMode debugRenderMode; - float debugRenderScale; - - - //////// Filter shader enum //////// - - enum FilterDataAttributes - { - SUPPRESS_CONTACT_NOTIFY = 1, - }; - -private: - //////// impact damage event callback //////// - - class EventCallback : public PxSimulationEventCallback - { - public: - EventCallback(ExtImpactDamageManager* manager) : m_manager(manager) {} - - // implemented - virtual void onContact(const PxContactPairHeader& pairHeader, const PxContactPair* pairs, uint32_t nbPairs) - { - m_manager->onContact(pairHeader, pairs, nbPairs); - } - - private: - // unused - void onConstraintBreak(PxConstraintInfo*, PxU32) {} - void onWake(PxActor**, PxU32) {} - void onSleep(PxActor**, PxU32) {} - void onTrigger(PxTriggerPair*, PxU32) {} - void onAdvance(const PxRigidBody*const*, const PxTransform*, const PxU32) {} - - // data - ExtImpactDamageManager* m_manager; - }; - - - //////// private methods //////// - - void updateDraggingStress(); - - void updateImpactDamage(); - - void refreshImpactDamageSettings(); - - void fillDebugRender(); - - void recalculateAssetsSize(); - - static bool customImpactDamageFunction(void* data, ExtPxActor* actor, PxShape* shape, PxVec3 position, PxVec3 force); - - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - PhysXController& getPhysXController() const - { - return getManager()->getPhysXController(); - } - - - //////// internal data //////// - - PxTaskManager* m_taskManager; - TkFramework* m_tkFramework; - TkGroup* m_tkGroup; - ExtPxManager* m_extPxManager; - ExtImpactDamageManager* m_extImpactDamageManager; - ExtImpactSettings m_extImpactDamageManagerSettings; - EventCallback* m_eventCallback; - ExtStressSolverSettings m_extStressSolverSettings; - ExtGroupTaskManager* m_extGroupTaskManager; - ExtSerialization* m_extSerialization; - - std::vector<BlastFamilyPtr> m_families; - DebugRenderBuffer m_debugRenderBuffer; - - bool m_impactDamageEnabled; - bool m_impactDamageUpdatePending; - bool m_impactDamageToStressEnabled; - - float m_impactDamageToStressFactor; - float m_draggingToStressFactor; - - bool m_rigidBodyLimitEnabled; - uint32_t m_rigidBodyLimit; - - BlastReplay* m_replay; - - BlastTimers m_lastBlastTimers; - - size_t m_blastAssetsSize; -}; - - -#endif diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamily.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamily.cpp deleted file mode 100644 index dff2d20..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamily.cpp +++ /dev/null @@ -1,617 +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 "BlastFamily.h" -#include "SampleProfiler.h" -#include "PhysXController.h" -#include "RenderUtils.h" -#include "SampleTime.h" -#include "UIHelpers.h" - -#include "NvBlast.h" -#include "NvBlastTkFamily.h" -#include "NvBlastTkActor.h" -#include "NvBlastTkAsset.h" -#include "NvBlastTkJoint.h" -#include "NvBlastExtPxAsset.h" -#include "NvBlastExtPxActor.h" -#include "NvBlastExtPxFamily.h" -#include "NvBlastExtPxManager.h" - -#include "PxRigidDynamic.h" -#include "PxScene.h" -#include "PxJoint.h" -// Add By Lixu Begin -#include "BlastSceneTree.h" -// Add By Lixu End - - -const float RIGIDBODY_DENSITY = 2000.0f; - -std::set<int> ExistingFamilyIds; -BlastFamily::BlastFamily(PhysXController& physXController, ExtPxManager& pxManager, const BlastAsset& blastAsset) - : m_physXController(physXController) - , m_pxManager(pxManager) - , m_blastAsset(blastAsset) - , m_listener(this) - , m_totalVisibleChunkCount(0) - , m_stressSolver(nullptr) - , m_spawned(false) -{ - m_settings.stressSolverEnabled = false; - m_settings.stressDamageEnabled = false; - - for (int id = 0; ; id++) - { - if (ExistingFamilyIds.find(id) == ExistingFamilyIds.end()) - { - ExistingFamilyIds.emplace(id); - mUniqueId = id; - break; - } - } -} - -BlastFamily::~BlastFamily() -{ - if (m_stressSolver) - { - m_stressSolver->release(); - } - - m_pxFamily->unsubscribe(m_listener); - - m_pxFamily->release(); - - ExistingFamilyIds.erase(mUniqueId); -} - -void BlastFamily::initialize(const BlastAsset::ActorDesc& desc) -{ -// Add By Lixu Begin - BPPBlast& blast = BlastProject::ins().getParams().blast; - BPPBondArray& bonds = blast.bonds; - BlastTreeData& blastTreeData = BlastTreeData::ins(); - - std::vector<float> BondHealths; - BlastAsset* pThis = (BlastAsset*)&m_blastAsset; - SampleManager* pSampleManager = SampleManager::ins(); - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - AssetList::ModelAsset m = AssetDescMap[pThis]; - int assetID = BlastProject::ins().getAssetIDByName(m.name.c_str()); - - for (int bc = 0; bc < bonds.arraySizes[0]; bc++) - { - BPPBond& bond = bonds.buf[bc]; - if (bond.asset == assetID) - { - BondHealths.push_back(bond.support.bondStrength); - } - } - - const ExtPxAsset* pExtPxAsset = m_blastAsset.getPxAsset(); - const TkAsset& tkAsset = pExtPxAsset->getTkAsset(); - uint32_t bondCount = tkAsset.getBondCount(); - - const float* pBondHealths = nullptr; - if (bondCount == BondHealths.size()) - { - pBondHealths = BondHealths.data(); - } - - const NvBlastActorDesc& defaultActorDesc = m_blastAsset.getPxAsset()->getDefaultActorDesc(); - NvBlastActorDesc newActorDesc = defaultActorDesc; - newActorDesc.initialBondHealths = pBondHealths; -// Add By Lixu End - - ExtPxFamilyDesc familyDesc; - familyDesc.actorDesc = (const NvBlastActorDesc*)&newActorDesc; // if you use it one day, consider changing code which needs getBondHealthMax() from BlastAsset. - familyDesc.group = desc.group; - familyDesc.pxAsset = m_blastAsset.getPxAsset(); - m_pxFamily = m_pxManager.createFamily(familyDesc); - - m_tkFamily = &m_pxFamily->getTkFamily(); - m_tkFamily->setID(desc.id); - m_tkFamily->setMaterial(&m_settings.material); - - m_familySize = NvBlastFamilyGetSize(m_tkFamily->getFamilyLL(), nullptr); - - m_pxFamily->subscribe(m_listener); - - m_initialTransform = desc.transform; - - updatePreSplit(0); - m_VisibleChangedChunks.clear(); -} - -void BlastFamily::updatePreSplit(float dt) -{ - if (!m_spawned) - { - ExtPxSpawnSettings spawnSettings = { - &m_physXController.getPhysXScene(), - m_physXController.getDefaultMaterial(), - RIGIDBODY_DENSITY - }; - - m_pxFamily->spawn(m_initialTransform, PxVec3(1.0f), spawnSettings); - reloadStressSolver(); - - m_spawned = true; - } - - // collect potential actors to health update - m_actorsToUpdateHealth.clear(); - for (const ExtPxActor* actor : m_actors) - { - if (actor->getTkActor().isPending()) - { - m_actorsToUpdateHealth.emplace(actor); - } - } -} - -void BlastFamily::updateAfterSplit(float dt) -{ - PROFILER_BEGIN("Actor Health Update"); - for (const ExtPxActor* actor : m_actors) - { - onActorUpdate(*actor); - - // update health if neccessary - if (m_actorsToUpdateHealth.find(actor) != m_actorsToUpdateHealth.end()) - { - onActorHealthUpdate(*actor); - } - } - PROFILER_END(); - - PROFILER_BEGIN("Stress Solver"); - // update stress - m_stressSolveTime = 0; - if (m_stressSolver) - { - Time t; - m_stressSolver->update(m_settings.stressDamageEnabled); - m_stressSolveTime += t.getElapsedSeconds(); - } - PROFILER_END(); - - PROFILER_BEGIN("Actor Misc Update"); - onUpdate(); - PROFILER_END(); - - m_pxFamily->postSplitUpdate(); -} - -void BlastFamily::processActorCreated(ExtPxFamily&, ExtPxActor& actor) -{ - m_totalVisibleChunkCount += actor.getChunkCount(); - m_actors.emplace(&actor); - - onActorCreated(actor); - onActorHealthUpdate(actor); -} - -void BlastFamily::processActorDestroyed(ExtPxFamily&, ExtPxActor& actor) -{ - m_totalVisibleChunkCount -= actor.getChunkCount(); - m_physXController.notifyRigidDynamicDestroyed(&actor.getPhysXActor()); - - onActorDestroyed(actor); - - m_actors.erase(m_actors.find(&actor)); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Data Helpers -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -uint32_t BlastFamily::getActorCount() const -{ - return (uint32_t)m_tkFamily->getActorCount(); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// UI -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void BlastFamily::drawUI() -{ - // Blast Material - ImGui::Spacing(); - ImGui::Text("Blast Material:"); - ImGui::DragFloat("Health", &m_settings.material.health); - ImGui::DragFloat("Min Damage Threshold", &m_settings.material.minDamageThreshold, 0.01f, 0.f, m_settings.material.maxDamageThreshold); - ImGui::DragFloat("Max Damage Threshold", &m_settings.material.maxDamageThreshold, 0.01f, m_settings.material.minDamageThreshold, 1.f); - - ImGui::Spacing(); - - // Stress Solver Settings - if (ImGui::Checkbox("Stress Solver Enabled", &m_settings.stressSolverEnabled)) - { - reloadStressSolver(); - } - - if (m_settings.stressSolverEnabled) - { - // Settings - bool changed = false; - - changed |= ImGui::DragInt("Bond Iterations Per Frame", (int*)&m_settings.stressSolverSettings.bondIterationsPerFrame, 100, 0, 500000); - changed |= ImGui::DragFloat("Material Hardness", &m_settings.stressSolverSettings.hardness, 10.0f, 0.01f, 100000.0f, "%.2f"); - changed |= ImGui::DragFloat("Stress Linear Factor", &m_settings.stressSolverSettings.stressLinearFactor, 0.01f, 0.0f, 100.0f, "%.2f"); - changed |= ImGui::DragFloat("Stress Angular Factor", &m_settings.stressSolverSettings.stressAngularFactor, 0.01f, 0.0f, 100.0f, "%.2f"); - changed |= ImGui::SliderInt("Graph Reduction Level", (int*)&m_settings.stressSolverSettings.graphReductionLevel, 0, 32); - if (changed) - { - refreshStressSolverSettings(); - } - - ImGui::Checkbox("Stress Damage Enabled", &m_settings.stressDamageEnabled); - - if (ImGui::Button("Recalculate Stress")) - { - resetStress(); - } - } -} - -void BlastFamily::drawStatsUI() -{ - ImGui::PushStyleColor(ImGuiCol_Text, ImColor(10, 255, 10, 255)); - if (m_stressSolver) - { - const ExtStressSolver& stressSolver = m_stressSolver->getSolver(); - const float errorLinear = stressSolver.getStressErrorLinear(); - const float errorAngular = stressSolver.getStressErrorAngular(); - - ImGui::Text("Stress Bond Count: %d", stressSolver.getBondCount()); - ImGui::Text("Stress Frame Iter: %d", stressSolver.getIterationsPerFrame()); - ImGui::Text("Stress Frames: %d", stressSolver.getFrameCount()); - ImGui::Text("Stress Error Lin / Ang: %.4f / %.4f", errorLinear, errorAngular); - ImGui::Text("Stress Solve Time: %.3f ms", m_stressSolveTime * 1000); - - // plot errors - { - static float scale = 1.0f; - scale = stressSolver.getFrameCount() <= 1 ? 1.0f : scale; - scale = std::max<float>(scale, errorLinear); - scale = std::max<float>(scale, errorAngular); - - static PlotLinesInstance<> linearErrorPlot; - linearErrorPlot.plot("Stress Linear Error", errorLinear, "error/frame", 0.0f, 1.0f * scale); - static PlotLinesInstance<> angularErrorPlot; - angularErrorPlot.plot("Stress Angular Error", errorAngular, "error/frame", 0.0f, 1.0f * scale); - } - } - else - { - ImGui::Text("No Stress Solver"); - } - ImGui::PopStyleColor(); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Stress Solver -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void BlastFamily::setSettings(const Settings& settings) -{ - bool reloadStressSolverNeeded = (m_settings.stressSolverEnabled != settings.stressSolverEnabled); - - m_settings = settings; - refreshStressSolverSettings(); - - if (reloadStressSolverNeeded) - { - reloadStressSolver(); - } - - m_tkFamily->setMaterial(&m_settings.material); - initTransform(m_settings.transform); - m_initialTransform = m_settings.transform; -} - -void BlastFamily::refreshStressSolverSettings() -{ - if (m_stressSolver) - { - m_stressSolver->getSolver().setSettings(m_settings.stressSolverSettings); - } -} - -void BlastFamily::resetStress() -{ - if (m_stressSolver) - { - m_stressSolver->getSolver().reset(); - } -} - -void BlastFamily::reloadStressSolver() -{ - if (m_stressSolver) - { - m_stressSolver->release(); - m_stressSolver = nullptr; - } - - if (m_settings.stressSolverEnabled) - { - m_stressSolver = ExtPxStressSolver::create(*m_pxFamily, m_settings.stressSolverSettings); - m_pxFamily->userData = m_stressSolver; - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// debug render -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const DirectX::XMFLOAT4 BOND_NORMAL_COLOR(0.0f, 0.8f, 1.0f, 1.0f); -const DirectX::XMFLOAT4 BOND_INVISIBLE_COLOR(0.65f, 0.16f, 0.16f, 1.0f); -const DirectX::XMFLOAT4 BOND_IMPULSE_LINEAR_COLOR(0.0f, 1.0f, 0.0f, 1.0f); -const DirectX::XMFLOAT4 BOND_IMPULSE_ANGULAR_COLOR(1.0f, 0.0f, 0.0f, 1.0f); -const DirectX::XMFLOAT4 JOINT_COLOR(0.5f, 0.6f, 7.0f, 1.0f); - - -inline void pushCentroid(std::vector<PxDebugLine>& lines, PxVec3 pos, PxU32 color, const float& area, const PxVec3& normal) -{ - // draw square of area 'area' rotated by normal - { - // build world rotation - PxVec3 n0(0, 0, 1); - PxVec3 n1 = normal; - PxVec3 axis = n0.cross(n1); - float d = n0.dot(n1); - PxQuat q(axis.x, axis.y, axis.z, 1.f + d); - q.normalize(); - float e = PxSqrt(1.0f / 2.0f); - float r = PxSqrt(area); - - // transform all 4 square points - PxTransform t(pos, q); - PxVec3 p0 = t.transform(PxVec3(-e, e, 0) * r); - PxVec3 p1 = t.transform(PxVec3( e, e, 0) * r); - PxVec3 p2 = t.transform(PxVec3( e, -e, 0) * r); - PxVec3 p3 = t.transform(PxVec3(-e, -e, 0) * r); - - // push square edges - lines.push_back(PxDebugLine(p0, p1, color)); - lines.push_back(PxDebugLine(p3, p2, color)); - lines.push_back(PxDebugLine(p1, p2, color)); - lines.push_back(PxDebugLine(p0, p3, color)); - } - - // draw normal - lines.push_back(PxDebugLine(pos, pos + normal * 0.5f, XMFLOAT4ToU32Color(BOND_NORMAL_COLOR))); -} - -inline DirectX::XMFLOAT4 bondHealthColor(float healthFraction) -{ - const DirectX::XMFLOAT4 BOND_HEALTHY_COLOR(0.0f, 1.0f, 0.0f, 1.0f); - const DirectX::XMFLOAT4 BOND_MID_COLOR(1.0f, 1.0f, 0.0f, 1.0f); - const DirectX::XMFLOAT4 BOND_BROKEN_COLOR(1.0f, 0.0f, 0.0f, 1.0f); - - return healthFraction < 0.5 ? XMFLOAT4Lerp(BOND_BROKEN_COLOR, BOND_MID_COLOR, 2.0f * healthFraction) : XMFLOAT4Lerp(BOND_MID_COLOR, BOND_HEALTHY_COLOR, 2.0f * healthFraction - 1.0f); -} - -void BlastFamily::fillDebugRender(DebugRenderBuffer& debugRenderBuffer, DebugRenderMode mode, float renderScale) -{ - const NvBlastChunk* chunks = m_tkFamily->getAsset()->getChunks(); - const NvBlastBond* bonds = m_tkFamily->getAsset()->getBonds(); - const NvBlastSupportGraph graph = m_tkFamily->getAsset()->getGraph(); - const float bondHealthMax = m_blastAsset.getBondHealthMax(); - const uint32_t chunkCount = m_tkFamily->getAsset()->getChunkCount(); - - for (const ExtPxActor* pxActor : m_actors) - { - TkActor& actor = pxActor->getTkActor(); - uint32_t lineStartIndex = (uint32_t)debugRenderBuffer.m_lines.size(); - - uint32_t nodeCount = actor.getGraphNodeCount(); - if (nodeCount == 0) // subsupport chunks don't have graph nodes - continue; - - std::vector<uint32_t> nodes(nodeCount); - actor.getGraphNodeIndices(nodes.data(), static_cast<uint32_t>(nodes.size())); - - if (DEBUG_RENDER_HEALTH_GRAPH <= mode && mode <= DEBUG_RENDER_HEALTH_GRAPH_CENTROIDS) - { - const float* bondHealths = actor.getBondHealths(); - - const ExtPxChunk* pxChunks = m_blastAsset.getPxAsset()->getChunks(); - - for (uint32_t node0 : nodes) - { - const uint32_t chunkIndex0 = graph.chunkIndices[node0]; - const NvBlastChunk& blastChunk0 = chunks[chunkIndex0]; - const ExtPxChunk& assetChunk0 = pxChunks[chunkIndex0]; - - for (uint32_t adjacencyIndex = graph.adjacencyPartition[node0]; adjacencyIndex < graph.adjacencyPartition[node0 + 1]; adjacencyIndex++) - { - uint32_t node1 = graph.adjacentNodeIndices[adjacencyIndex]; - const uint32_t chunkIndex1 = graph.chunkIndices[node1]; - const NvBlastChunk& blastChunk1 = chunks[chunkIndex1]; - const ExtPxChunk& assetChunk1 = pxChunks[chunkIndex1]; - if (node0 > node1) - continue; - - bool invisibleBond = chunkIndex0 >= chunkCount || chunkIndex1 >= chunkCount || assetChunk0.subchunkCount == 0 || assetChunk1.subchunkCount == 0; - - // health - uint32_t bondIndex = graph.adjacentBondIndices[adjacencyIndex]; - float healthVal = PxClamp(bondHealths[bondIndex] / bondHealthMax, 0.0f, 1.0f); - - DirectX::XMFLOAT4 color = bondHealthColor(healthVal); - - const NvBlastBond& solverBond = bonds[bondIndex]; - const PxVec3& centroid = reinterpret_cast<const PxVec3&>(solverBond.centroid); - - // centroid - if (mode == DEBUG_RENDER_HEALTH_GRAPH_CENTROIDS || mode == DEBUG_RENDER_CENTROIDS) - { - const PxVec3& normal = reinterpret_cast<const PxVec3&>(solverBond.normal); - pushCentroid(debugRenderBuffer.m_lines, centroid, XMFLOAT4ToU32Color(invisibleBond ? BOND_INVISIBLE_COLOR : color), solverBond.area, normal.getNormalized()); - } - - // chunk connection (bond) - if ((mode == DEBUG_RENDER_HEALTH_GRAPH || mode == DEBUG_RENDER_HEALTH_GRAPH_CENTROIDS) && !invisibleBond) - { - const PxVec3& c0 = reinterpret_cast<const PxVec3&>(blastChunk0.centroid); - const PxVec3& c1 = reinterpret_cast<const PxVec3&>(blastChunk1.centroid); - debugRenderBuffer.m_lines.push_back(PxDebugLine(c0, c1, XMFLOAT4ToU32Color(color))); - } - } - } - } - - // stress - if (DEBUG_RENDER_STRESS_GRAPH <= mode && mode <= DEBUG_RENDER_STRESS_GRAPH_BONDS_IMPULSES) - { - if (m_stressSolver) - { - const auto buffer = m_stressSolver->getSolver().fillDebugRender(nodes.data(), (uint32_t)nodes.size(), (ExtStressSolver::DebugRenderMode)(mode - DEBUG_RENDER_STRESS_GRAPH), renderScale); - if (buffer.lineCount) - { - const auto lines = reinterpret_cast<const PxDebugLine*>(buffer.lines); - debugRenderBuffer.m_lines.insert(debugRenderBuffer.m_lines.end(), lines, lines + buffer.lineCount); - } - } - } - - // transform all added lines from local to global - PxTransform localToGlobal = pxActor->getPhysXActor().getGlobalPose(); - for (uint32_t i = lineStartIndex; i < debugRenderBuffer.m_lines.size(); i++) - { - PxDebugLine& line = debugRenderBuffer.m_lines[i]; - line.pos0 = localToGlobal.transform(line.pos0); - line.pos1 = localToGlobal.transform(line.pos1); - } - } - - // joints debug render - if (mode == DEBUG_RENDER_JOINTS) - { - for (const ExtPxActor* pxActor : m_actors) - { - TkActor& actor = pxActor->getTkActor(); - const uint32_t jointCount = actor.getJointCount(); - if (jointCount > 0) - { - std::vector<TkJoint*> joints(jointCount); - actor.getJoints(joints.data(), jointCount); - for (auto joint : joints) - { - PxJoint* pxJoint = reinterpret_cast<PxJoint*>(joint->userData); - if (pxJoint) - { - PxRigidActor *actor0, *actor1; - pxJoint->getActors(actor0, actor1); - auto lp0 = pxJoint->getLocalPose(PxJointActorIndex::eACTOR0); - auto lp1 = pxJoint->getLocalPose(PxJointActorIndex::eACTOR1); - PxVec3 p0 = actor0 ? actor0->getGlobalPose().transform(lp0).p : lp0.p; - PxVec3 p1 = actor1 ? actor1->getGlobalPose().transform(lp1).p : lp1.p; - debugRenderBuffer.m_lines.push_back(PxDebugLine(p0, p1, XMFLOAT4ToU32Color(JOINT_COLOR))); - } - } - } - } - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// action!!! -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class BlastOverlapCallback : public PxOverlapCallback -{ -public: - BlastOverlapCallback(ExtPxManager& pxManager, std::set<ExtPxActor*>& actorBuffer) - : m_pxManager(pxManager), m_actorBuffer(actorBuffer), PxOverlapCallback(m_hitBuffer, sizeof(m_hitBuffer) / sizeof(m_hitBuffer[0])) {} - - PxAgain processTouches(const PxOverlapHit* buffer, PxU32 nbHits) - { - for (PxU32 i = 0; i < nbHits; ++i) - { - PxRigidDynamic* rigidDynamic = buffer[i].actor->is<PxRigidDynamic>(); - if (rigidDynamic) - { - ExtPxActor* actor = m_pxManager.getActorFromPhysXActor(*rigidDynamic); - if (actor != nullptr) - { - m_actorBuffer.insert(actor); - } - } - } - return true; - } - -private: - ExtPxManager& m_pxManager; - std::set<ExtPxActor*>& m_actorBuffer; - PxOverlapHit m_hitBuffer[1000]; -}; - -bool BlastFamily::overlap(const PxGeometry& geometry, const PxTransform& pose, std::function<void(ExtPxActor*)> hitCall) -{ -// Add By Lixu Begin - /* - const ExtPxAsset* pExtPxAsset = m_blastAsset.getPxAsset(); - const TkAsset& tkAsset = pExtPxAsset->getTkAsset(); - uint32_t bondCount = tkAsset.getBondCount(); - if (bondCount == 0) - { - return false; - } - */ -// Add By Lixu End - - std::set<ExtPxActor*> actorsToDamage; -#if 1 - BlastOverlapCallback overlapCallback(m_pxManager, actorsToDamage); - m_physXController.getPhysXScene().overlap(geometry, pose, overlapCallback); -#else - for (std::map<NvBlastActor*, PhysXController::Actor*>::iterator it = m_actorsMap.begin(); it != m_actorsMap.end(); it++) - { - actorsToDamage.insert(it->first); - } -#endif - - for (auto actor : actorsToDamage) - { - hitCall(actor); - } - - return !actorsToDamage.empty(); -} - diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamily.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamily.h deleted file mode 100644 index 9978f20..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamily.h +++ /dev/null @@ -1,262 +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. - - -#ifndef BLAST_FAMILY_H -#define BLAST_FAMILY_H - -#include "BlastAsset.h" -#include "NvBlastExtPxListener.h" -#include "NvBlastExtPxStressSolver.h" -#include "NvBlastExtDamageShaders.h" -#include <functional> -#include <set> -#include <map> - - -class DebugRenderBuffer; -// Add By Lixu Begin -class RenderMaterial; -namespace physx -{ - class PxActor; -} -using namespace physx; -// Add By Lixu End - -namespace Nv -{ -namespace Blast -{ -class TkFamily; -class ExtPxManager; -} -} - -namespace physx -{ -class PxGeometry; -class PxTransform; -} - - - -/** -BlastFamily class represents 1 spawned BlastAsset, contains and manipulates all physx/blast actors spawned by fracturing it. -Abstract class, internal actor management functions are implementation dependent and so pure virtual. -*/ -class BlastFamily -{ -public: - - //////// public API //////// - - bool overlap(const PxGeometry& geometry, const PxTransform& pose, std::function<void(ExtPxActor*)> hitCall); - - void updatePreSplit(float dt); - void updateAfterSplit(float dt); - - void drawUI(); - void drawStatsUI(); - -// Add By Lixu Begin - virtual bool find(const PxActor& actor) { return false; } - virtual void updateActorRenderableTransform(const PxActor& actor, PxTransform& pos, bool local) {} - virtual uint32_t getChunkIndexByPxActor(const PxActor& actor) { return -1; } - virtual bool getPxActorByChunkIndex(uint32_t chunkIndex, PxActor** ppActor) { return false; } - virtual void setActorSelected(const PxActor& actor, bool selected) {} - virtual bool isActorSelected(const PxActor& actor) { return false; } - virtual void setActorVisible(const PxActor& actor, bool visible) {} - virtual bool isActorVisible(const PxActor& actor) { return false; } - virtual std::vector<uint32_t> getSelectedChunks() { return std::vector<uint32_t>(); } - virtual void clearChunksSelected() {} - virtual void setChunkSelected(uint32_t chunk, bool selected) {} - virtual void setChunkSelected(std::vector<uint32_t> depths, bool selected) {} - virtual bool isChunkSelected(uint32_t chunk) { return false; } - virtual void setActorScale(const PxActor& actor, PxMat44& scale, bool replace) {} - virtual bool isChunkVisible(uint32_t chunkIndex) { return false; } - virtual void setChunkVisible(uint32_t chunkIndex, bool bVisible) {} - virtual void setChunkVisible(std::vector<uint32_t> depths, bool bVisible) {} - virtual void initTransform(physx::PxTransform t) { m_settings.transform = t; } - std::map<uint32_t, bool>& getVisibleChangedChunks() { return m_VisibleChangedChunks; } - void clearVisibleChangedChunks() { m_VisibleChangedChunks.clear(); } - virtual void getMaterial(RenderMaterial** ppRenderMaterial, bool externalSurface) {} - virtual void setMaterial(RenderMaterial* pRenderMaterial, bool externalSurface) {} - virtual void highlightChunks() {} -// Add By Lixu End - - enum DebugRenderMode - { - DEBUG_RENDER_DISABLED, - DEBUG_RENDER_HEALTH_GRAPH, - DEBUG_RENDER_CENTROIDS, - DEBUG_RENDER_HEALTH_GRAPH_CENTROIDS, - DEBUG_RENDER_JOINTS, - DEBUG_RENDER_STRESS_GRAPH, - DEBUG_RENDER_STRESS_GRAPH_NODES_IMPULSES, - DEBUG_RENDER_STRESS_GRAPH_BONDS_IMPULSES, - - // count - DEBUG_RENDER_MODES_COUNT - }; - - void fillDebugRender(DebugRenderBuffer& debugRenderBuffer, DebugRenderMode mode, float renderScale); - - - //////// public getters //////// - - const ExtPxFamily* getFamily() const - { - return m_pxFamily; - } - - uint32_t getActorCount() const; - - uint32_t getTotalVisibleChunkCount() const - { - return m_totalVisibleChunkCount; - } - - size_t getFamilySize() const - { - return m_familySize; - } - - const BlastAsset& getBlastAsset() - { - return m_blastAsset; - } - - void resetStress(); - - void refreshStressSolverSettings(); - - void reloadStressSolver(); - - - //////// settings //////// - - struct Settings - { - bool stressSolverEnabled; - ExtStressSolverSettings stressSolverSettings; - bool stressDamageEnabled; - NvBlastExtMaterial material; - physx::PxTransform transform; - }; - - void setSettings(const Settings& settings); - - const Settings& getSettings() const - { - return m_settings; - } - - - //////// dtor //////// - - virtual ~BlastFamily(); - int mUniqueId; - -protected: - - //////// ctor //////// - - BlastFamily(PhysXController& physXController, ExtPxManager& pxManager, const BlastAsset& blastAsset); - - void initialize(const BlastAsset::ActorDesc& desc); - - - //////// internal virtual callbacks //////// - - virtual void onActorCreated(const ExtPxActor& actor) = 0; - virtual void onActorUpdate(const ExtPxActor& actor) = 0; - virtual void onActorDestroyed(const ExtPxActor& actor) = 0; - virtual void onActorHealthUpdate(const ExtPxActor& pxActor) {}; - - virtual void onUpdate() {} - - - //////// protected data //////// - - PhysXController& m_physXController; - ExtPxManager& m_pxManager; - const BlastAsset& m_blastAsset; - std::map<uint32_t, bool> m_VisibleChangedChunks; - -private: - - //////// physics listener //////// - - class PxManagerListener : public ExtPxListener - { - public: - PxManagerListener(BlastFamily* family) : m_family(family) {} - - virtual void onActorCreated(ExtPxFamily& family, ExtPxActor& actor) - { - m_family->processActorCreated(family, actor); - - } - - virtual void onActorDestroyed(ExtPxFamily& family, ExtPxActor& actor) - { - m_family->processActorDestroyed(family, actor); - } - private: - BlastFamily* m_family; - }; - - friend class PxManagerListener; - - //////// private methods //////// - - void processActorCreated(ExtPxFamily&, ExtPxActor& actor); - void processActorDestroyed(ExtPxFamily&, ExtPxActor& actor); - - - //////// private data //////// - - TkFamily* m_tkFamily; - ExtPxFamily* m_pxFamily; - PxManagerListener m_listener; - Settings m_settings; - PxTransform m_initialTransform; - bool m_spawned; - size_t m_familySize; - uint32_t m_totalVisibleChunkCount; - ExtPxStressSolver* m_stressSolver; - double m_stressSolveTime; - std::set<const ExtPxActor*> m_actorsToUpdateHealth; - // Add By Lixu Begin -protected: - std::set<ExtPxActor*> m_actors; - // Add By Lixu End -}; - - -#endif //BLAST_FAMILY_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyBoxes.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyBoxes.cpp deleted file mode 100644 index 7011612..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyBoxes.cpp +++ /dev/null @@ -1,109 +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 "BlastFamilyBoxes.h" -#include "NvBlastExtPxAsset.h" -#include "NvBlastExtPxActor.h" -#include "BlastAssetBoxes.h" -#include "Renderer.h" -#include "PhysXController.h" -#include "RenderUtils.h" -#include "PxRigidDynamic.h" - -using namespace physx; - - -BlastFamilyBoxes::BlastFamilyBoxes(PhysXController& physXController, ExtPxManager& pxManager, Renderer& renderer, const BlastAssetBoxes& blastAsset, const BlastAsset::ActorDesc& desc) - : BlastFamily(physXController, pxManager, blastAsset), m_renderer(renderer) -{ - // prepare renderables - IRenderMesh* boxRenderMesh = renderer.getPrimitiveRenderMesh(PrimitiveRenderMeshType::Box); - RenderMaterial* primitiveRenderMaterial = physXController.getPrimitiveRenderMaterial(); - - const ExtPxAsset* pxAsset = m_blastAsset.getPxAsset(); - const uint32_t chunkCount = pxAsset->getChunkCount(); - const ExtPxChunk* chunks = pxAsset->getChunks(); - const ExtPxSubchunk* subChunks = pxAsset->getSubchunks(); - m_chunkRenderables.resize(chunkCount); - for (uint32_t i = 0; i < chunkCount; i++) - { - Renderable* renderable = renderer.createRenderable(*boxRenderMesh, *primitiveRenderMaterial); - renderable->setHidden(true); - renderable->setScale(subChunks[chunks[i].firstSubchunkIndex].geometry.scale.scale); - m_chunkRenderables[i] = renderable; - } - - // initialize in position - initialize(desc); -} - -BlastFamilyBoxes::~BlastFamilyBoxes() -{ - for (uint32_t i = 0; i < m_chunkRenderables.size(); i++) - { - m_renderer.removeRenderable(m_chunkRenderables[i]); - } -} - -void BlastFamilyBoxes::onActorCreated(const ExtPxActor& actor) -{ - DirectX::XMFLOAT4 color = getRandomPastelColor(); - - const uint32_t* chunkIndices = actor.getChunkIndices(); - uint32_t chunkCount = actor.getChunkCount(); - for (uint32_t i = 0; i < chunkCount; i++) - { - const uint32_t chunkIndex = chunkIndices[i]; - m_chunkRenderables[chunkIndex]->setHidden(false); - m_chunkRenderables[chunkIndex]->setColor(color); - } -} - -void BlastFamilyBoxes::onActorUpdate(const ExtPxActor& actor) -{ - const ExtPxChunk* chunks = m_blastAsset.getPxAsset()->getChunks(); - const ExtPxSubchunk* subChunks = m_blastAsset.getPxAsset()->getSubchunks(); - const uint32_t* chunkIndices = actor.getChunkIndices(); - uint32_t chunkCount = actor.getChunkCount(); - for (uint32_t i = 0; i < chunkCount; i++) - { - const uint32_t chunkIndex = chunkIndices[i]; - m_chunkRenderables[chunkIndex]->setTransform(actor.getPhysXActor().getGlobalPose() * subChunks[chunks[chunkIndex].firstSubchunkIndex].transform); - } -} - -void BlastFamilyBoxes::onActorDestroyed(const ExtPxActor& actor) -{ - const uint32_t* chunkIndices = actor.getChunkIndices(); - uint32_t chunkCount = actor.getChunkCount(); - for (uint32_t i = 0; i < chunkCount; i++) - { - m_chunkRenderables[chunkIndices[i]]->setHidden(true); - } - -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyBoxes.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyBoxes.h deleted file mode 100644 index b67ec31..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyBoxes.h +++ /dev/null @@ -1,55 +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. - - -#ifndef BLAST_FAMILY_BOXES -#define BLAST_FAMILY_BOXES - -#include "BlastFamily.h" - -class BlastAssetBoxes; -class Renderable; - - -class BlastFamilyBoxes : public BlastFamily -{ -public: - BlastFamilyBoxes(PhysXController& physXController, ExtPxManager& pxManager, Renderer& renderer, const BlastAssetBoxes& blastAsset, const BlastAsset::ActorDesc& desc); - virtual ~BlastFamilyBoxes(); - -protected: - virtual void onActorCreated(const ExtPxActor& actor); - virtual void onActorUpdate(const ExtPxActor& actor); - virtual void onActorDestroyed(const ExtPxActor& actor); - -private: - Renderer& m_renderer; - std::vector<Renderable*> m_chunkRenderables; -}; - - -#endif //BLAST_FAMILY_BOXES
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.cpp deleted file mode 100644 index 4ca8b87..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.cpp +++ /dev/null @@ -1,1071 +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 "BlastFamilyModelSimple.h" -#include "RenderUtils.h" -#include "DeviceManager.h" -#include "Renderer.h" -#include "NvBlastExtPxAsset.h" -#include "NvBlastExtPxActor.h" -#include "NvBlastTkActor.h" -#include "NvBlastTkAsset.h" -#include "PxRigidDynamic.h" -#include "MaterialLibraryPanel.h" - -// Add By Lixu Begin -#include "NvBlastExtPxManager.h" -#include "SceneController.h" -#include "PhysXController.h" -#include "SampleManager.h" -#include "BlastModel.h" -#include "PxPhysics.h" -#include "PxScene.h" -#include "GizmoToolController.h" -// Add By Lixu End - -using namespace physx; - -#include "ViewerOutput.h" -// print out all shapes for debug purpose. check actor/shape releasing. -void PrintActors(PhysXController& physXController) -{ - PxPhysics& physx = physXController.getPhysics(); - static int convexNum = 0, shapeNum = 0; - int convexNumNew = physx.getNbConvexMeshes(); - int shapeNumNew = physx.getNbShapes(); - if (shapeNum != shapeNumNew && shapeNumNew > 0) - { - // print shapes - std::vector<PxShape*> shapes(shapeNumNew); - physx.getShapes(shapes.data(), shapeNumNew); - shapeNum = shapeNumNew; - for (PxU32 u = 0; u < shapeNumNew; ++u) - { - PxShape& shape = *shapes[u]; - PxRigidActor* pActor = shape.getActor(); - const char* pName = pActor ? pActor->getName() : nullptr; - char buf[256]; - if (pName) - { - sprintf(buf, "Actor %x shape %x %s", pActor, &shape, pName); - } - else - { - sprintf(buf, "Actor %x shape %x", pActor, &shape); - } - viewer_msg(buf); - } - } -} - -// only modify unfractured mode mesh -void modifyModelByLocalWay(BlastModel& model, PxTransform& gp_old, PxTransform& gp_new) -{ - BlastModel::Chunk& chunk = model.chunks[0];//unfracture model only has one chunk - - std::vector<BlastModel::Chunk::Mesh>& meshes = chunk.meshes; - int meshSize = meshes.size(); - - if (meshSize == 0) - { - return; - } - - PxTransform gp_newInv = gp_new.getInverse(); - for (int ms = 0; ms < meshSize; ms++) - { - BlastModel::Chunk::Mesh& mesh = meshes[ms]; - SimpleMesh& simpleMesh = mesh.mesh; - std::vector<SimpleMesh::Vertex>& vertices = simpleMesh.vertices; - - int NumVertices = vertices.size(); - for (uint32_t i = 0; i < NumVertices; ++i) - { - PxTransform v_old(vertices[i].position); - PxTransform v_new = gp_newInv * gp_old * v_old; - physx::PxVec3 pos = v_new.p; - - SimpleMesh::Vertex& vertex = vertices[i]; - vertex.position.x = pos.x; - vertex.position.y = pos.y; - vertex.position.z = pos.z; - } - } -} - - -void scaleModel(BlastModel& model, PxMat44& scale) -{ - BlastModel::Chunk& chunk = model.chunks[0];//unfracture model only has one chunk - - std::vector<BlastModel::Chunk::Mesh>& meshes = chunk.meshes; - int meshSize = meshes.size(); - - if (meshSize == 0) - { - return; - } - - for (int ms = 0; ms < meshSize; ms++) - { - BlastModel::Chunk::Mesh& mesh = meshes[ms]; - SimpleMesh& simpleMesh = mesh.mesh; - std::vector<SimpleMesh::Vertex>& vertices = simpleMesh.vertices; - - int NumVertices = vertices.size(); - for (uint32_t i = 0; i < NumVertices; ++i) - { - SimpleMesh::Vertex& vertex = vertices[i]; - physx::PxVec3 pos = scale.transform(vertices[i].position); - - vertex.position.x = pos.x; - vertex.position.y = pos.y; - vertex.position.z = pos.z; - } - } -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// SimpleRenderMesh -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class SimpleRenderMesh : public IRenderMesh -{ -public: - SimpleRenderMesh(const SimpleMesh* mesh, int renderableId) : m_mesh(mesh) - { - mUniqueId = renderableId; - - 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({ "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()); - m_numFaces = static_cast<uint32_t>(mesh->indices.size()); - - // VB - { - D3D11_SUBRESOURCE_DATA vertexBufferData; - ZeroMemory(&vertexBufferData, sizeof(vertexBufferData)); - vertexBufferData.pSysMem = mesh->vertices.data(); - - D3D11_BUFFER_DESC bufferDesc; - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.ByteWidth = sizeof(SimpleMesh::Vertex) * m_numVertices; - bufferDesc.CPUAccessFlags = 0; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; - - V(m_device->CreateBuffer(&bufferDesc, &vertexBufferData, &m_vertexBuffer)); - } - - // Health Buffer - { - // fill with 1.0f initially - std::vector<float> healths(mesh->vertices.size()); - std::fill(healths.begin(), healths.end(), 1.0f); - - D3D11_SUBRESOURCE_DATA vertexBufferData; - ZeroMemory(&vertexBufferData, sizeof(vertexBufferData)); - vertexBufferData.pSysMem = healths.data(); - - D3D11_BUFFER_DESC bufferDesc; - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.ByteWidth = (uint32_t)(sizeof(float) * m_numVertices); - bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_DYNAMIC; - - V(m_device->CreateBuffer(&bufferDesc, &vertexBufferData, &m_healthBuffer)); - } - - // IB - if (m_numFaces) - { - D3D11_SUBRESOURCE_DATA indexBufferData; - - ZeroMemory(&indexBufferData, sizeof(indexBufferData)); - indexBufferData.pSysMem = mesh->indices.data(); - - D3D11_BUFFER_DESC bufferDesc; - - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; - bufferDesc.ByteWidth = sizeof(uint16_t) * m_numFaces; - bufferDesc.CPUAccessFlags = 0; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; - - V(m_device->CreateBuffer(&bufferDesc, &indexBufferData, &m_indexBuffer)); - } - } - - ~SimpleRenderMesh() - { - SAFE_RELEASE(m_healthBuffer); - SAFE_RELEASE(m_vertexBuffer); - SAFE_RELEASE(m_indexBuffer); - } - - - void render(ID3D11DeviceContext& context) const - { - context.IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - UINT strides[2] = { sizeof(SimpleMesh::Vertex), sizeof(float) }; - UINT offsets[2] = { 0 }; - ID3D11Buffer* buffers[2] = { m_vertexBuffer, m_healthBuffer }; - context.IASetVertexBuffers(0, 2, buffers, strides, offsets); - - - context.IASetIndexBuffer(m_indexBuffer, DXGI_FORMAT_R16_UINT, 0); - - if (m_indexBuffer) - context.DrawIndexed(m_numFaces, 0, 0); - else - context.Draw(m_numVertices, 0); - } - - const std::vector<D3D11_INPUT_ELEMENT_DESC>& getInputElementDesc() const { return m_inputDesc; } - - const SimpleMesh* getMesh() { return m_mesh; } - - void updateHealths(const std::vector<float>& healths) - { - ID3D11DeviceContext* context; - m_device->GetImmediateContext(&context); - - // update buffer - { - D3D11_MAPPED_SUBRESOURCE mappedRead; - V(context->Map(m_healthBuffer, 0, D3D11_MAP_WRITE_DISCARD, NULL, &mappedRead)); - memcpy(mappedRead.pData, healths.data(), sizeof(float) * healths.size()); - context->Unmap(m_healthBuffer, 0); - } - - } - -// Add By Lixu Begin - void setScale(PxMat44 scale, bool replace) - { - std::vector<SimpleMesh::Vertex> newVertex(m_numVertices); - for (int v = 0; v < m_numVertices; v++) - { - newVertex[v] = m_mesh->vertices[v]; - newVertex[v].position = scale.transform(newVertex[v].position); - } - - D3D11_SUBRESOURCE_DATA vertexBufferData; - ZeroMemory(&vertexBufferData, sizeof(vertexBufferData)); - vertexBufferData.pSysMem = newVertex.data(); - - D3D11_BUFFER_DESC bufferDesc; - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.ByteWidth = sizeof(SimpleMesh::Vertex) * m_numVertices; - bufferDesc.CPUAccessFlags = 0; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; - - ID3D11Buffer* pBuffer = m_vertexBuffer; - V(m_device->CreateBuffer(&bufferDesc, &vertexBufferData, &m_vertexBuffer)); - if (NULL != pBuffer) - { - pBuffer->Release(); - pBuffer = NULL; - } - - if (replace) - { - memcpy((void*)m_mesh->vertices.data(), newVertex.data(), bufferDesc.ByteWidth); - } - } -// Add By Lixu End - -private: - - ID3D11Device* m_device; - - ID3D11Buffer* m_vertexBuffer; - ID3D11Buffer* m_healthBuffer; - ID3D11Buffer* m_indexBuffer; - uint32_t m_numFaces; - uint32_t m_numVertices; - - std::vector<D3D11_INPUT_ELEMENT_DESC> m_inputDesc; - - const SimpleMesh* m_mesh; -}; - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// BlastFamilyModelSimple -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -BlastFamilyModelSimple::BlastFamilyModelSimple(PhysXController& physXController, ExtPxManager& pxManager, Renderer& renderer, const BlastAssetModelSimple& blastAsset, const BlastAsset::ActorDesc& desc) - : BlastFamily(physXController, pxManager, blastAsset), m_renderer(renderer) -{ - // Add By Lixu Begin - SampleManager* pSampleManager = SampleManager::ins(); - std::map<BlastAsset*, std::vector<BlastFamily*>>& AssetFamiliesMap = pSampleManager->getAssetFamiliesMap(); - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - - BlastAsset* pBlastAsset = (BlastAsset*)&getBlastAsset(); - AssetFamiliesMap[pBlastAsset].push_back(this); - - AssetList::ModelAsset& m = AssetDescMap[pBlastAsset]; - // Add By Lixu End - - // materials - auto materials = blastAsset.getRenderMaterials(); - - // model - const BlastModel& model = blastAsset.getModel(); - - // create render mesh for every BlastModel::Chunk::Mesh and renderable with it - const std::vector<BlastModel::Chunk>& modelChunks = model.chunks; - m_chunks.resize(modelChunks.size()); - for (uint32_t chunkIndex = 0; chunkIndex < modelChunks.size(); chunkIndex++) - { - const std::vector<BlastModel::Chunk::Mesh>& meshes = modelChunks[chunkIndex].meshes; - std::vector<SimpleRenderMesh*>& renderMeshes = m_chunks[chunkIndex].renderMeshes; - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; -// Add By Lixu Begin - std::vector<Renderable*>& ex_Renderables = m_chunks[chunkIndex].ex_Renderables; - ex_Renderables.clear(); - std::vector<Renderable*>& in_Renderables = m_chunks[chunkIndex].in_Renderables; - in_Renderables.clear(); - - PxActor* actor = pSampleManager->getPhysXController().createEditPhysXActor(meshes, desc.transform); - m_editActorChunkMap.insert(std::make_pair(actor, chunkIndex)); - m_chunkEditActorMap.insert(std::make_pair(chunkIndex, actor)); -// Add By Lixu End - renderMeshes.resize(meshes.size()); - renderables.resize(meshes.size()); - - int renderableId = Renderable::getRenderableId(mUniqueId, chunkIndex); - - for (uint32_t i = 0; i < meshes.size(); i++) - { - renderMeshes[i] = new SimpleRenderMesh(&meshes[i].mesh, renderableId); - - uint32_t materialIndex = model.chunks[chunkIndex].meshes[i].materialIndex; - - RenderMaterial* pRenderMaterial = pSampleManager->getRenderMaterial(materials[materialIndex]); - - Renderable* renderable = renderer.createRenderable(*renderMeshes[i], *pRenderMaterial); - renderable->setHidden(!_getBPPChunkVisible(chunkIndex)); - renderables[i] = renderable; -// Add By Lixu Begin - if (materialIndex == 0) - { - ex_Renderables.push_back(renderable); - } - else if (materialIndex == 1) - { - in_Renderables.push_back(renderable); - } -// Add By Lixu End - } - } - -// Add By Lixu Begin - initTransform(desc.transform); -// Add By Lixu End - - // initialize in position - initialize(desc); -} - -BlastFamilyModelSimple::~BlastFamilyModelSimple() -{ -// Add By Lixu Begin - // remove from AssetFamiliesMap - SampleManager* pSampleManager = SampleManager::ins(); - std::map<BlastAsset*, std::vector<BlastFamily*>>& AssetFamiliesMap = pSampleManager->getAssetFamiliesMap(); - BlastAsset* pBlastAsset = (BlastAsset*)&getBlastAsset(); - std::vector<BlastFamily*>& families = AssetFamiliesMap[pBlastAsset]; - std::vector<BlastFamily*>::iterator itBF; - for (itBF = families.begin(); itBF != families.end(); itBF++) - { - if ((*itBF) == this) - { - families.erase(itBF); - break; - } - } - if (families.size() == 0) - { - AssetFamiliesMap.erase(AssetFamiliesMap.find(pBlastAsset)); - } - - // disconnect the material and relative renderable - const BlastAssetModelSimple& blastAsset = *(BlastAssetModelSimple*)&m_blastAsset; - const std::vector<std::string>& materials = blastAsset.getRenderMaterials(); - int materialSize = materials.size(); - for (int ms = 0; ms < materialSize; ms++) - { - RenderMaterial* pRenderMaterial = pSampleManager->getRenderMaterial(materials[ms]); - pRenderMaterial->clearRelatedRenderables(); - } - - // remove physx actor for edit mode - PxScene& editScene = pSampleManager->getPhysXController().getEditPhysXScene(); - - for (std::map<PxActor*, uint32_t>::iterator itr = m_editActorChunkMap.begin(); itr != m_editActorChunkMap.end(); ++itr) - { - editScene.removeActor(*(itr->first)); - PxRigidDynamic* rigidDynamic = (itr->first)->is<PxRigidDynamic>(); - if (rigidDynamic == nullptr) - { - itr->first->release(); - continue; - } - - PxU32 shapeCount = rigidDynamic->getNbShapes(); - std::vector<PxShape*> shapes; - shapes.resize(shapeCount); - rigidDynamic->getShapes(shapes.data(), shapeCount); - for (PxU32 u = 0; u < shapeCount; ++u) - { - PxShape& shape = *shapes[u]; - rigidDynamic->detachShape(shape); - PxConvexMeshGeometry geometry; - shape.getConvexMeshGeometry(geometry); - geometry.convexMesh->release(); - shape.release(); - } - - rigidDynamic->release(); - } -// Add By Lixu End - - // release all chunks - for (uint32_t chunkIndex = 0; chunkIndex < m_chunks.size(); chunkIndex++) - { - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (uint32_t i = 0; i < m_chunks[chunkIndex].renderables.size(); i++) - { - m_renderer.removeRenderable(m_chunks[chunkIndex].renderables[i]); - SAFE_DELETE(m_chunks[chunkIndex].renderMeshes[i]); - } - } - // Add By Lixu Begin - //PrintActors(SampleManager::ins()->getPhysXController()); - // Add By Lixu End -} - -void BlastFamilyModelSimple::onActorCreated(const ExtPxActor& actor) -{ - // separate color for every material - std::vector<DirectX::XMFLOAT4> colors; - - const uint32_t* chunkIndices = actor.getChunkIndices(); - uint32_t chunkCount = actor.getChunkCount(); - for (uint32_t i = 0; i < chunkCount; i++) - { - uint32_t chunkIndex = chunkIndices[i]; - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (uint32_t r = 0; r < renderables.size(); r++) - { - if (colors.size() <= r) - colors.push_back(getRandomPastelColor()); - if (SampleManager::ins()->IsSimulating()) - { - renderables[r]->setHidden(false); - } - else - { - renderables[r]->setHidden(!_getBPPChunkVisible(chunkIndex)); - } -// renderables[r]->setColor(colors[r]); - - m_VisibleChangedChunks[chunkIndex] = true; - } - } -} - -void BlastFamilyModelSimple::onActorUpdate(const ExtPxActor& actor) -{ -// Add By Lixu Begin - if (!SampleManager::ins()->IsSimulating()) - return; - - uint32_t shapesCount = actor.getPhysXActor().getNbShapes(); - PxTransform lp; - if (shapesCount > 0) - { - std::vector<PxShape*> shapes(shapesCount); - actor.getPhysXActor().getShapes(&shapes[0], shapesCount); - PxShape* shape = shapes[0]; - lp = shape->getLocalPose(); - } -// Add By Lixu End - - const ExtPxChunk* chunks = m_blastAsset.getPxAsset()->getChunks(); - const ExtPxSubchunk* subChunks = m_blastAsset.getPxAsset()->getSubchunks(); - const uint32_t* chunkIndices = actor.getChunkIndices(); - uint32_t chunkCount = actor.getChunkCount(); - for (uint32_t i = 0; i < chunkCount; i++) - { - uint32_t chunkIndex = chunkIndices[i]; - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (Renderable* r : renderables) - { -// Add By Lixu Begin - r->setTransform(actor.getPhysXActor().getGlobalPose() * lp * subChunks[chunks[chunkIndex].firstSubchunkIndex].transform); -// Add By Lixu End - } - - // Add By Lixu Begin - PxActor* editActor = m_chunkEditActorMap[chunkIndex]; - PxRigidDynamic* rigidDynamic = editActor->is<PxRigidDynamic>(); - rigidDynamic->setGlobalPose(actor.getPhysXActor().getGlobalPose() * lp * subChunks[chunks[chunkIndex].firstSubchunkIndex].transform); - // Add By Lixu End - } -} - -void BlastFamilyModelSimple::onActorDestroyed(const ExtPxActor& actor) -{ - const uint32_t* chunkIndices = actor.getChunkIndices(); - uint32_t chunkCount = actor.getChunkCount(); - for (uint32_t i = 0; i < chunkCount; i++) - { - uint32_t chunkIndex = chunkIndices[i]; - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (Renderable* r : renderables) - { - r->setHidden(true); - - m_VisibleChangedChunks[chunkIndex] = false; - } - } -} - -void BlastFamilyModelSimple::onActorHealthUpdate(const ExtPxActor& actor) -{ - TkActor& tkActor = actor.getTkActor(); - const TkAsset* tkAsset = tkActor.getAsset(); - - const float* bondHealths = tkActor.getBondHealths(); - uint32_t nodeCount = tkActor.getGraphNodeCount(); - if (nodeCount == 0) // subsupport chunks don't have graph nodes - return; - - std::vector<uint32_t> nodes(tkActor.getGraphNodeCount()); - tkActor.getGraphNodeIndices(nodes.data(), static_cast<uint32_t>(nodes.size())); - - const NvBlastChunk* chunks = tkAsset->getChunks(); - const NvBlastBond* bonds = tkAsset->getBonds(); - - const NvBlastSupportGraph graph = tkAsset->getGraph(); - const float bondHealthMax = m_blastAsset.getBondHealthMax(); - - std::vector<float> healthBuffer; - - for (uint32_t node0 : nodes) - { - uint32_t chunkIndex = graph.chunkIndices[node0]; - - if (chunkIndex >= m_chunks.size()) - continue; - - std::vector<SimpleRenderMesh*>& meshes = m_chunks[chunkIndex].renderMeshes; - const auto& renderables = m_chunks[chunkIndex].renderables; - for (uint32_t i = 0; i < meshes.size(); ++i) - { - if(renderables[i]->isHidden()) - continue; - - SimpleRenderMesh* renderMesh = meshes[i]; - - const SimpleMesh* mesh = renderMesh->getMesh(); - healthBuffer.resize(mesh->vertices.size()); - - for (uint32_t vertexIndex = 0; vertexIndex < mesh->vertices.size(); vertexIndex++) - { - PxVec3 position = mesh->vertices[vertexIndex].position; - float health = 0.0f; - float healthDenom = 0.0f; - - for (uint32_t adjacencyIndex = graph.adjacencyPartition[node0]; adjacencyIndex < graph.adjacencyPartition[node0 + 1]; adjacencyIndex++) - { - uint32_t node1 = graph.adjacentNodeIndices[adjacencyIndex]; - uint32_t bondIndex = graph.adjacentBondIndices[adjacencyIndex]; - float bondHealth = PxClamp(bondHealths[bondIndex] / bondHealthMax, 0.0f, 1.0f); - const NvBlastBond& solverBond = bonds[bondIndex]; - const PxVec3& centroid = reinterpret_cast<const PxVec3&>(solverBond.centroid); - - float factor = 1.0f / (centroid - position).magnitudeSquared(); - - health += bondHealth * factor; - healthDenom += factor; - } - - healthBuffer[vertexIndex] = healthDenom > 0.0f ? health / healthDenom : 1.0f; - } - - renderMesh->updateHealths(healthBuffer); - } - } -} - -// Add By Lixu Begin -bool BlastFamilyModelSimple::find(const PxActor& actor) -{ - return -1 != getChunkIndexByPxActor(actor); -} - -void BlastFamilyModelSimple::updateActorRenderableTransform(const PxActor& actor, PxTransform& pos, bool local) -{ - uint32_t chunkIndex = getChunkIndexByPxActor(actor); - if (-1 == chunkIndex) - return; - - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (Renderable* r : renderables) - { - if (!local) - { - r->setTransform(pos); - - // in edit mode, if change root chunk's orientation in edit physx scene, also change root physx actor in blast physx scene - if (0 == chunkIndex && !SampleManager::ins()->IsSimulating()) - { - (*m_actors.begin())->getPhysXActor().setGlobalPose(pos); - } - } - else - { - if (0 == chunkIndex) - { - PxActor& blastActor = (*m_actors.begin())->getPhysXActor(); - PxRigidDynamic* rigidDynamic = blastActor.is<PxRigidDynamic>(); - if (NULL != rigidDynamic) - { - PxTransform gp_new = pos; - PxTransform gp_old = rigidDynamic->getGlobalPose(); - rigidDynamic->setGlobalPose(pos); - PxScene& pxScene = SampleManager::ins()->getPhysXController().getPhysXScene(); - modifyPxActorByLocalWay(pxScene, *rigidDynamic, gp_old, gp_new); - const BlastModel& model = dynamic_cast<BlastAssetModelSimple*>(const_cast<BlastAsset*>(&m_blastAsset))->getModel(); - // update model mesh - modifyModelByLocalWay(*(const_cast<BlastModel*>(&model)), gp_old, gp_new); - // update blast asset instance's transform - BPPAssetInstance* assetInstance = SampleManager::ins()->getInstanceByFamily(this); - assetInstance->transform.position = nvidia::NvVec3(gp_new.p.x, gp_new.p.y, gp_new.p.z); - assetInstance->transform.rotation = nvidia::NvVec4(gp_new.q.x, gp_new.q.y, gp_new.q.z, gp_new.q.w); - } - } - } - } -} - -uint32_t BlastFamilyModelSimple::getChunkIndexByPxActor(const PxActor& actor) -{ - std::map<PxActor*, uint32_t>::iterator itr = m_editActorChunkMap.find(const_cast<PxActor*>(&actor)); - - if (itr != m_editActorChunkMap.end()) - { - return itr->second; - } - else - { - for (ExtPxActor* extPxActor : m_actors) - { - if (&(extPxActor->getPhysXActor()) == (&actor)->is<physx::PxRigidDynamic>()) - { - return extPxActor->getChunkIndices()[0]; - } - } - } - return -1; -} - -bool BlastFamilyModelSimple::getPxActorByChunkIndex(uint32_t chunkIndex, PxActor** ppActor) -{ - *ppActor = nullptr; - std::map<uint32_t, PxActor*>::iterator it = m_chunkEditActorMap.find(chunkIndex); - if (it == m_chunkEditActorMap.end()) - { - return false; - } - - *ppActor = it->second; - return true; -} - -void BlastFamilyModelSimple::setActorSelected(const PxActor& actor, bool selected) -{ - uint32_t chunkIndex = getChunkIndexByPxActor(actor); - if (-1 == chunkIndex) - return; - - bool selectionDepthTest = BlastProject::ins().getParams().fracture.general.selectionDepthTest; - - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (Renderable* r : renderables) - { - r->setSelected(selected); - - if (!selectionDepthTest && selected) - { - r->setDepthTest(false); - } - else - { - r->setDepthTest(true); - } - } -} - -bool BlastFamilyModelSimple::isActorSelected(const PxActor& actor) -{ - uint32_t chunkIndex = getChunkIndexByPxActor(actor); - if (-1 == chunkIndex) - return false; - - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - return renderables[0]->isSelected(); -} - -void BlastFamilyModelSimple::setActorVisible(const PxActor& actor, bool visible) -{ - uint32_t chunkIndex = getChunkIndexByPxActor(actor); - if (-1 == chunkIndex) - return; - - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (Renderable* r : renderables) - { - r->setHidden(!visible); - } -} - -bool BlastFamilyModelSimple::isActorVisible(const PxActor& actor) -{ - uint32_t chunkIndex = getChunkIndexByPxActor(actor); - if (-1 == chunkIndex) - return false; - - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - return !renderables[0]->isHidden(); -} - -void BlastFamilyModelSimple::setChunkSelected(uint32_t chunk, bool selected) -{ - if (chunk > m_chunks.size()) - return; - - bool selectionDepthTest = BlastProject::ins().getParams().fracture.general.selectionDepthTest; - - std::vector<Renderable*>& renderables = m_chunks[chunk].renderables; - for (Renderable* r : renderables) - { - r->setSelected(selected); - - if (!selectionDepthTest && selected) - { - r->setDepthTest(false); - } - else - { - r->setDepthTest(true); - } - } -} - -void BlastFamilyModelSimple::setChunkSelected(std::vector<uint32_t> depths, bool selected) -{ - for (size_t i = 0; i < depths.size(); ++i) - { - const std::vector<uint32_t> indexes = m_blastAsset.getChunkIndexesByDepth(depths[i]); - for (size_t j = 0; j < indexes.size(); ++j) - { - setChunkSelected(indexes[j], selected); - } - } -} - -void BlastFamilyModelSimple::clearChunksSelected() -{ - size_t count = m_chunks.size(); - for (size_t chunkIndex = 0; chunkIndex < count; ++chunkIndex) - { - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (Renderable* r : renderables) - { - r->setSelected(false); - r->setDepthTest(true); - r->setHighlight(false); - } - } -} - -bool BlastFamilyModelSimple::isChunkSelected(uint32_t chunk) -{ - if (chunk > m_chunks.size()) - return false; - - std::vector<Renderable*>& renderables = m_chunks[chunk].renderables; - for (Renderable* r : renderables) - { - for (Renderable* r : renderables) - { - if (r->isSelected()) - { - return true; - } - } - } - - return false; -} - -std::vector<uint32_t> BlastFamilyModelSimple::getSelectedChunks() -{ - std::vector<uint32_t> selectedChunks; - size_t count = m_chunks.size(); - for (size_t chunkIndex = 0; chunkIndex < count; ++chunkIndex) - { - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (Renderable* r : renderables) - { - if (r->isSelected()) - { - selectedChunks.push_back(chunkIndex); - break; - } - } - } - return selectedChunks; -} - -void BlastFamilyModelSimple::setActorScale(const PxActor& actor, PxMat44& scale, bool replace) -{ - uint32_t chunkIndex = getChunkIndexByPxActor(actor); - if (-1 == chunkIndex) - return; - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (Renderable* r : renderables) - { - r->setMeshScale(scale, replace); - } - - if (0 == chunkIndex) - { - PxActor& blastActor = (*m_actors.begin())->getPhysXActor(); - PxRigidDynamic* rigidDynamic = blastActor.is<PxRigidDynamic>(); - if (NULL != rigidDynamic) - { - PxScene& pxScene = SampleManager::ins()->getPhysXController().getPhysXScene(); - scalePxActor(pxScene, *rigidDynamic, scale); - - if (replace) - { - const BlastModel& model = dynamic_cast<BlastAssetModelSimple*>(const_cast<BlastAsset*>(&m_blastAsset))->getModel(); - scaleModel(*(const_cast<BlastModel*>(&model)), scale); - } - } - } -} - -bool BlastFamilyModelSimple::isChunkVisible(uint32_t chunkIndex) -{ - if (chunkIndex < 0 || chunkIndex >= m_chunks.size()) - { - return false; - } - - bool bVisible = false; - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - if (renderables.size() > 0) - { - bVisible = !renderables[0]->isHidden(); - } - return bVisible; -} - -void BlastFamilyModelSimple::setChunkVisible(uint32_t chunkIndex, bool bVisible) -{ - if (chunkIndex < 0 || chunkIndex >= m_chunks.size()) - { - return; - } - - std::vector<Renderable*>& renderables = m_chunks[chunkIndex].renderables; - for (Renderable* r : renderables) - { - r->setHidden(!bVisible); - } -} - -void BlastFamilyModelSimple::setChunkVisible(std::vector<uint32_t> depths, bool bVisible) -{ - for (size_t i = 0; i < depths.size(); ++i) - { - const std::vector<uint32_t> indexes = m_blastAsset.getChunkIndexesByDepth(depths[i]); - for (size_t j = 0; j < indexes.size(); ++j) - { - setChunkVisible(indexes[j], bVisible); - } - } -} - -void BlastFamilyModelSimple::initTransform(physx::PxTransform t) -{ - BlastFamily::initTransform(t); - int chunkSize = m_chunks.size(); - for (int i = 0; i < chunkSize; i++) - { - std::vector<Renderable*>& renderables = m_chunks[i].renderables; - for (Renderable* r : renderables) - { - r->setTransform(t); - } - } - - for (std::map<PxActor*, uint32_t>::iterator itr = m_editActorChunkMap.begin(); itr != m_editActorChunkMap.end(); ++itr) - { - PxRigidDynamic* rigidDynamic = itr->first->is<PxRigidDynamic>(); - rigidDynamic->setGlobalPose(t); - } -} - -void BlastFamilyModelSimple::getMaterial(RenderMaterial** ppRenderMaterial, bool externalSurface) -{ - *ppRenderMaterial = nullptr; - - int chunkSize = m_chunks.size(); - if (chunkSize == 0) - { - return; - } - - if (externalSurface) - { - for (int i = 0; i < chunkSize; i++) - { - std::vector<Renderable*>& renderables = m_chunks[i].ex_Renderables; - if (renderables.size() > 0) - { - RenderMaterial& m = renderables[0]->getMaterial(); - *ppRenderMaterial = &m; - return; - } - } - } - else - { - for (int i = 0; i < chunkSize; i++) - { - std::vector<Renderable*>& renderables = m_chunks[i].in_Renderables; - if (renderables.size() > 0) - { - RenderMaterial& m = renderables[0]->getMaterial(); - *ppRenderMaterial = &m; - return; - } - } - } -} - -void BlastFamilyModelSimple::setMaterial(RenderMaterial* pRenderMaterial, bool externalSurface) -{ - RenderMaterial* p = pRenderMaterial; - if (p == nullptr) - { - p = RenderMaterial::getDefaultRenderMaterial(); - } - - int chunkSize = m_chunks.size(); - if (externalSurface) - { - for (int i = 0; i < chunkSize; i++) - { - std::vector<Renderable*>& renderables = m_chunks[i].ex_Renderables; - for (Renderable* r : renderables) - { - r->setMaterial(*p); - } - } - } - else - { - for (int i = 0; i < chunkSize; i++) - { - std::vector<Renderable*>& renderables = m_chunks[i].in_Renderables; - for (Renderable* r : renderables) - { - r->setMaterial(*p); - } - } - } -} - -void BlastFamilyModelSimple::highlightChunks() -{ - bool selectionDepthTest = BlastProject::ins().getParams().fracture.general.selectionDepthTest; - - for (Chunk chunk : m_chunks) - { - std::vector<Renderable*>& renderables = chunk.renderables; - for (Renderable* r : renderables) - { - r->setHighlight(true); - r->setDepthTest(selectionDepthTest); - } - } -} - -bool BlastFamilyModelSimple::_getBPPChunkVisible(uint32_t chunkIndex) -{ - std::map<BlastAsset*, AssetList::ModelAsset>& assetDescMap = SampleManager::ins()->getAssetDescMap(); - BlastAsset* blastAsset = (BlastAsset*)&getBlastAsset(); - AssetList::ModelAsset& m = assetDescMap[blastAsset]; - - BlastProject& project = BlastProject::ins(); - BPPAsset& bppAsset = *(project.getAsset(m.name.c_str())); - - BPPChunk* bppChunk = project.getChunk(bppAsset, chunkIndex); - if (bppChunk) - { - return bppChunk->visible; - } - else - { - return true; - } -} -// Add By Lixu End
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.h deleted file mode 100644 index c86242a..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSimple.h +++ /dev/null @@ -1,111 +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. - - -#ifndef BLAST_FAMILY_MODEL_SIMPLE_H -#define BLAST_FAMILY_MODEL_SIMPLE_H - -#include "BlastFamily.h" -#include "BlastAssetModelSimple.h" - -class SimpleRenderMesh; -class Renderable; -class Renderer; -// Add By Lixu Begin -namespace physx -{ - class PxActor; -} -using namespace physx; -// Add By Lixu End - -class BlastFamilyModelSimple : public BlastFamily -{ -public: - //////// ctor //////// - - BlastFamilyModelSimple(PhysXController& physXController, ExtPxManager& pxManager, Renderer& renderer, const BlastAssetModelSimple& blastAsset, const BlastAsset::ActorDesc& desc); - virtual ~BlastFamilyModelSimple(); - -// Add By Lixu Begin - virtual bool find(const PxActor& actor); - virtual void updateActorRenderableTransform(const PxActor& actor, PxTransform& pos, bool local); - virtual uint32_t getChunkIndexByPxActor(const PxActor& actor); - virtual bool getPxActorByChunkIndex(uint32_t chunkIndex, PxActor** ppActor); - virtual void setActorSelected(const PxActor& actor, bool selected); - virtual bool isActorSelected(const PxActor& actor); - virtual void setActorVisible(const PxActor& actor, bool visible); - virtual bool isActorVisible(const PxActor& actor); - virtual void clearChunksSelected(); - virtual void setChunkSelected(uint32_t chunk, bool selected); - virtual void setChunkSelected(std::vector<uint32_t> depths, bool selected); - virtual bool isChunkSelected(uint32_t chunk); - virtual std::vector<uint32_t> getSelectedChunks(); - virtual void setActorScale(const PxActor& actor, PxMat44& scale, bool replace); - virtual bool isChunkVisible(uint32_t chunkIndex); - virtual void setChunkVisible(uint32_t chunkIndex, bool bVisible); - virtual void setChunkVisible(std::vector<uint32_t> depths, bool bVisible); - virtual void initTransform(physx::PxTransform t); - virtual void getMaterial(RenderMaterial** ppRenderMaterial, bool externalSurface); - virtual void setMaterial(RenderMaterial* pRenderMaterial, bool externalSurface); - virtual void highlightChunks(); -// Add By Lixu End - -protected: - //////// abstract implementation //////// - - virtual void onActorCreated(const ExtPxActor& actor); - virtual void onActorUpdate(const ExtPxActor& actor); - virtual void onActorDestroyed(const ExtPxActor& actor); - virtual void onActorHealthUpdate(const ExtPxActor& pxActor); - -private: - // Add By Lixu Begin - bool _getBPPChunkVisible(uint32_t chunkIndex); - // Add By Lixu End - - //////// internal data //////// - - Renderer& m_renderer; - - struct Chunk - { - std::vector<SimpleRenderMesh*> renderMeshes; - std::vector<Renderable*> renderables; -// Add By Lixu Begin - std::vector<Renderable*> ex_Renderables; - std::vector<Renderable*> in_Renderables; -// Add By Lixu End - }; - - std::vector<Chunk> m_chunks; - std::map<PxActor*, uint32_t> m_editActorChunkMap;// only for edit mode - std::map<uint32_t, PxActor*> m_chunkEditActorMap;// only for edit mode -}; - - -#endif //BLAST_FAMILY_MODEL_SIMPLE_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSkinned.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSkinned.cpp deleted file mode 100644 index a0319ff..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSkinned.cpp +++ /dev/null @@ -1,185 +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 "BlastFamilyModelSkinned.h" -#include "RenderUtils.h" -#include "Renderer.h" -#include "SkinnedRenderMesh.h" -#include "NvBlastExtPxAsset.h" -#include "NvBlastExtPxActor.h" -#include "NvBlastTkActor.h" -#include "PxRigidDynamic.h" - -using namespace physx; - -BlastFamilyModelSkinned::BlastFamilyModelSkinned(PhysXController& physXController, ExtPxManager& pxManager, Renderer& renderer, const BlastAssetModelSkinned& blastAsset, const BlastAsset::ActorDesc& desc) - : BlastFamily(physXController, pxManager, blastAsset), m_renderer(renderer), m_visibleActorsDirty(true) -{ - // materials - auto materials = blastAsset.getRenderMaterials(); - - const BlastModel& model = blastAsset.getModel(); - - // finalize (create) sub model - auto finalizeSubModelFunction = [&](SubModel* subModel, std::vector<const SimpleMesh*>& subModelMeshes, RenderMaterial& renderMaterial) - { - subModel->skinnedRenderMesh = new SkinnedRenderMesh(subModelMeshes); - subModel->renderable = renderer.createRenderable(*subModel->skinnedRenderMesh, renderMaterial); - subModel->renderable->setColor(getRandomPastelColor()); - }; - - // create at least one submodel per every material (if mesh count is too high, more then one sub model per material to be created) - SubModel* subModel = nullptr; - std::vector<const SimpleMesh*> subModelMeshes; - subModelMeshes.reserve(model.chunks.size()); - for (uint32_t materialIndex = 0; materialIndex < model.materials.size(); materialIndex++) - { - for (uint32_t chunkIndex = 0; chunkIndex < model.chunks.size(); chunkIndex++) - { - const BlastModel::Chunk& chunk = model.chunks[chunkIndex]; - for (const BlastModel::Chunk::Mesh& mesh : chunk.meshes) - { - if (mesh.materialIndex == materialIndex) - { - // init new submodel? - if (subModel == nullptr) - { - m_subModels.push_back(SubModel()); - subModel = &m_subModels.back(); - subModel->chunkIdToBoneMap.resize(model.chunks.size()); - std::fill(subModel->chunkIdToBoneMap.begin(), subModel->chunkIdToBoneMap.end(), SubModel::INVALID_BONE_ID); - subModelMeshes.clear(); - } - - // add mesh to map and list - subModel->chunkIdToBoneMap[chunkIndex] = (uint32_t)subModelMeshes.size(); - subModelMeshes.push_back(&(mesh.mesh)); - - // mesh reached limit? - if (subModelMeshes.size() == SkinnedRenderMesh::MeshesCountMax) - { - finalizeSubModelFunction(subModel, subModelMeshes, *materials[materialIndex]); - subModel = nullptr; - } - } - } - } - - // finalize subModel for this material - if (subModel && subModelMeshes.size() > 0) - { - finalizeSubModelFunction(subModel, subModelMeshes, *materials[materialIndex]); - subModel = nullptr; - } - } - - // reserve for scratch - m_visibleBones.reserve(model.chunks.size()); - m_visibleBoneTransforms.reserve(model.chunks.size()); - - // initialize in position - initialize(desc); -} - -BlastFamilyModelSkinned::~BlastFamilyModelSkinned() -{ - for (uint32_t subModelIndex = 0; subModelIndex < m_subModels.size(); subModelIndex++) - { - m_renderer.removeRenderable(m_subModels[subModelIndex].renderable); - SAFE_DELETE(m_subModels[subModelIndex].skinnedRenderMesh); - } -} - -void BlastFamilyModelSkinned::onActorCreated(const ExtPxActor& actor) -{ - m_visibleActors.insert(&actor); - m_visibleActorsDirty = true; -} - -void BlastFamilyModelSkinned::onActorUpdate(const ExtPxActor& actor) -{ -} - -void BlastFamilyModelSkinned::onActorDestroyed(const ExtPxActor& actor) -{ - m_visibleActors.erase(&actor); - m_visibleActorsDirty = true; -} - -void BlastFamilyModelSkinned::onUpdate() -{ - // visible actors changed this frame? - if (m_visibleActorsDirty) - { - for (const SubModel& model : m_subModels) - { - // pass visible chunks list to render mesh - m_visibleBones.clear(); - for (const ExtPxActor* actor : m_visibleActors) - { - const uint32_t* chunkIndices = actor->getChunkIndices(); - uint32_t chunkCount = actor->getChunkCount(); - for (uint32_t i = 0; i < chunkCount; ++i) - { - uint32_t chunkIndex = chunkIndices[i]; - uint32_t boneIndex = model.chunkIdToBoneMap[chunkIndex]; - if (boneIndex != SubModel::INVALID_BONE_ID) - { - m_visibleBones.push_back(boneIndex); - } - } - } - model.skinnedRenderMesh->updateVisibleMeshes(m_visibleBones); - } - - m_visibleActorsDirty = false; - } - - // update and pass chunk transforms - const ExtPxChunk* chunks = m_blastAsset.getPxAsset()->getChunks(); - const ExtPxSubchunk* subChunks = m_blastAsset.getPxAsset()->getSubchunks(); - for (const SubModel& model : m_subModels) - { - m_visibleBoneTransforms.clear(); - for (const ExtPxActor* actor : m_visibleActors) - { - const uint32_t* chunkIndices = actor->getChunkIndices(); - uint32_t chunkCount = actor->getChunkCount(); - for (uint32_t i = 0; i < chunkCount; ++i) - { - uint32_t chunkIndex = chunkIndices[i]; - uint32_t boneIndex = model.chunkIdToBoneMap[chunkIndex]; - if (boneIndex != SubModel::INVALID_BONE_ID) - { - m_visibleBoneTransforms.push_back(PxMat44(actor->getPhysXActor().getGlobalPose() * subChunks[chunks[chunkIndex].firstSubchunkIndex].transform)); - } - } - } - model.skinnedRenderMesh->updateVisibleMeshTransforms(m_visibleBoneTransforms); - } -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSkinned.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSkinned.h deleted file mode 100644 index d76b18e..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFamilyModelSkinned.h +++ /dev/null @@ -1,81 +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. - - -#ifndef BLAST_FAMILY_MODEL_SKINNED_H -#define BLAST_FAMILY_MODEL_SKINNED_H - -#include "BlastFamily.h" -#include "BlastAssetModelSkinned.h" - -class SkinnedRenderMesh; -class Renderable; - -class BlastFamilyModelSkinned : public BlastFamily -{ -public: - //////// ctor //////// - - BlastFamilyModelSkinned(PhysXController& physXController, ExtPxManager& pxManager, Renderer& renderer, const BlastAssetModelSkinned& blastAsset, const BlastAsset::ActorDesc& desc); - virtual ~BlastFamilyModelSkinned(); - -protected: - //////// abstract implementation //////// - - virtual void onActorCreated(const ExtPxActor& actor); - virtual void onActorUpdate(const ExtPxActor& actor); - virtual void onActorDestroyed(const ExtPxActor& actor); - - virtual void onUpdate(); - -private: - //////// internal data //////// - - Renderer& m_renderer; - - struct SubModel - { - static const uint32_t INVALID_BONE_ID = ~(uint32_t)0; - - Renderable* renderable = nullptr; - SkinnedRenderMesh* skinnedRenderMesh = nullptr; - std::vector<uint32_t> chunkIdToBoneMap; - }; - std::vector<SubModel> m_subModels; - - std::set<const ExtPxActor*> m_visibleActors; - bool m_visibleActorsDirty; - - //////// scratch buffers //////// - - std::vector<uint32_t> m_visibleBones; - std::vector<PxMat44> m_visibleBoneTransforms; - -}; - - -#endif //BLAST_FAMILY_MODEL_SKINNED_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.cpp deleted file mode 100644 index cbd299b..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.cpp +++ /dev/null @@ -1,259 +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 "BlastFractureTool.h" -#include <BlastAssetModel.h> -#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; - for (it = chunkMeshes.begin(); it != chunkMeshes.end(); it++) - { - delete (*it); - (*it) = nullptr; - } - chunkMeshes.clear(); -} - -void BlastFractureTool::setSourceAsset(const BlastAsset* pBlastAsset) -{ - free(); - - BlastAssetModel* pBlastAssetModel = (BlastAssetModel*)pBlastAsset; - const BlastModel& blastModel = pBlastAssetModel->getModel(); - const std::vector<BlastModel::Chunk>& chunks = blastModel.chunks; - int chunkSize = chunks.size(); - if (chunkSize == 0) - { - return; - } - - chunkMeshes.resize(chunkSize, nullptr); - for (int cs = 0; cs < chunkSize; cs++) - { - const BlastModel::Chunk& chunk = chunks[cs]; - const std::vector<BlastModel::Chunk::Mesh>& meshes = chunk.meshes; - int meshSize = meshes.size(); - - if (meshSize == 0) - { - continue; - } - - std::vector<physx::PxVec3> positions; - std::vector<physx::PxVec3> normals; - std::vector<physx::PxVec2> uv; - std::vector<uint32_t> ind; - std::vector<int> faceBreakPoint; - std::vector<uint32_t> materialIndexes; - uint16_t curIndex = 0; - for (int ms = 0; ms < meshSize; ms++) - { - const BlastModel::Chunk::Mesh& mesh = meshes[ms]; - materialIndexes.push_back(mesh.materialIndex); - const SimpleMesh& simpleMesh = mesh.mesh; - const std::vector<SimpleMesh::Vertex>& vertices = simpleMesh.vertices; - const std::vector<uint16_t>& indices = simpleMesh.indices; - - int NumVertices = vertices.size(); - for (uint32_t i = 0; i < NumVertices; ++i) - { - positions.push_back(physx::PxVec3(vertices[i].position.x, vertices[i].position.y, vertices[i].position.z)); - normals.push_back(physx::PxVec3(vertices[i].normal.x, vertices[i].normal.y, vertices[i].normal.z)); - uv.push_back(physx::PxVec2(vertices[i].uv.x, vertices[i].uv.y)); - } - int NumIndices = indices.size(); - for (uint32_t i = 0; i < NumIndices; ++i) - { - ind.push_back(indices[i] + curIndex); - } - curIndex += NumIndices; - faceBreakPoint.push_back(NumIndices / 3); - } - - PxVec3* nr = (!normals.empty()) ? normals.data() : 0; - PxVec2* uvp = (!uv.empty()) ? uv.data() : 0; - Nv::Blast::Mesh* pMesh = NvBlastExtAuthoringCreateMesh( - positions.data(), nr, uvp, static_cast<uint32_t>(positions.size()), - ind.data(), static_cast<uint32_t>(ind.size())); - - int curFaceIndex = 0; - int curFaceBreakPoint = faceBreakPoint[curFaceIndex]; - uint32_t curMaterialIndex = materialIndexes[curFaceIndex]; - for (int fc = 0; fc < pMesh->getFacetCount(); fc++) - { - if (fc >= curFaceBreakPoint) - { - curFaceIndex++; - curFaceBreakPoint += faceBreakPoint[curFaceIndex]; - curMaterialIndex = materialIndexes[curFaceIndex]; - } - - Facet* pFacet = const_cast<Facet*>(pMesh->getFacet(fc)); - pFacet->materialId = curMaterialIndex; - } - - chunkMeshes[cs] = pMesh; - } - - const ExtPxAsset* pExtPxAsset = pBlastAsset->getPxAsset(); - const TkAsset& tkAsset = pExtPxAsset->getTkAsset(); - - std::vector<int32_t> parentIds; - parentIds.resize(chunkSize); - parentIds.assign(chunkSize, -1); - { - const NvBlastChunk* pNvBlastChunk = tkAsset.getChunks(); - for (uint32_t i = 0; i < chunkSize; ++i) - { - parentIds[i] = pNvBlastChunk[i].parentChunkIndex; - } - } - std::vector<bool> isLeafs; - isLeafs.resize(chunkSize); - isLeafs.assign(chunkSize, false); - { - const NvBlastSupportGraph supportGraph = tkAsset.getGraph(); - for (uint32_t i = 0; i < supportGraph.nodeCount; ++i) - { - const uint32_t chunkIndex = supportGraph.chunkIndices[i]; - if (chunkIndex < chunkSize) - { - isLeafs[chunkIndex] = true; - } - } - } - - setSourceMesh(chunkMeshes[0]); - - mChunkData.resize(chunkSize); - mChunkData[0].parent = parentIds[0]; - mChunkData[0].isLeaf = isLeafs[0]; - mChunkData[0].chunkId = 0; - Nv::Blast::Mesh* mesh = nullptr; - for (int cs = 1; cs < chunkSize; cs++) - { - if (chunkMeshes[cs] == nullptr) - continue; - 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 = 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); - } - 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) - { - Facet* pFacet = const_cast<Facet*>(mesh->getFacet(i)); - pFacet->materialId = chunkMeshes[cs]->getFacet(i)->materialId; - } - } -} - -void BlastFractureTool::setSourceMeshes(std::vector<Nv::Blast::Mesh*>& meshes, std::vector<int32_t>& parentIds) -{ - free(); - - int chunkSize = meshes.size(); - if (chunkSize == 0) - { - return; - } - - chunkMeshes.resize(chunkSize, nullptr); - for (int cs = 0; cs < chunkSize; cs++) - { - Nv::Blast::Mesh* pMesh = new MeshImpl(*reinterpret_cast<const MeshImpl*>(meshes[cs])); - chunkMeshes[cs] = pMesh; - } - - std::vector<bool> isLeafs; - isLeafs.resize(chunkSize, true); - for (int cs = 0; cs < chunkSize; cs++) - { - int32_t parentId = parentIds[cs]; - if (parentId == -1) - { - continue; - } - - isLeafs[parentId] = false; - } - - setSourceMesh(chunkMeshes[0]); - - mChunkData.resize(chunkSize); - mChunkData[0].parent = parentIds[0]; - mChunkData[0].isLeaf = isLeafs[0]; - mChunkData[0].chunkId = 0; - Nv::Blast::Mesh* mesh = nullptr; - for (int cs = 1; cs < chunkSize; cs++) - { - if (chunkMeshes[cs] == nullptr) - continue; - 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 = 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); - } - 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) - { - Facet* pFacet = const_cast<Facet*>(mesh->getFacet(i)); - pFacet->materialId = chunkMeshes[cs]->getFacet(i)->materialId; - } - } -} - -Nv::Blast::Mesh* BlastFractureTool::getSourceMesh(int32_t chunkId) -{ - if (chunkId < 0 || chunkId >= chunkMeshes.size()) - { - return nullptr; - } - return chunkMeshes[chunkId]; -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.h deleted file mode 100644 index 3436551..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastFractureTool.h +++ /dev/null @@ -1,61 +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. - - -#ifndef BLAST_FRACTURETOOL_H -#define BLAST_FRACTURETOOL_H - -#include "NvBlastExtAuthoringFractureToolImpl.h" - -class BlastAsset; -namespace Nv -{ - namespace Blast - { - class Mesh; - } -} - -class BlastFractureTool : public Nv::Blast::FractureToolImpl -{ -public: - BlastFractureTool() {} - ~BlastFractureTool() { free(); } - - void setSourceAsset(const BlastAsset* pBlastAsset); - - void setSourceMeshes(std::vector<Nv::Blast::Mesh*>& meshes, std::vector<int32_t>& parentIds); - - Nv::Blast::Mesh* getSourceMesh(int32_t chunkId); - -private: - void free(); - - std::vector<Nv::Blast::Mesh*> chunkMeshes; -}; - -#endif //BLAST_FRACTURETOOL_H
\ No newline at end of file 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; -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.h deleted file mode 100644 index 82d2af8..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastModel.h +++ /dev/null @@ -1,80 +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. - - -#ifndef BLAST_MODEL_H -#define BLAST_MODEL_H - -#include "Mesh.h" -#include <vector> -#include <memory> - - -class BlastModel; -// Add By Lixu Begin -typedef BlastModel* BlastModelPtr; -// Add By Lixu End - -/** -BlastModel struct represents graphic model. -Now only loading from .obj file is supported. -Can have >=0 materials -Every chunk can have multiple meshes (1 for every material) -*/ -class BlastModel -{ -public: - struct Material - { - std::string name; - std::string diffuseTexture; - float r, g, b, a; - }; - - struct Chunk - { - struct Mesh - { - uint32_t materialIndex; - SimpleMesh mesh; - }; - - std::vector<Mesh> meshes; - }; - - std::vector<Material> materials; - std::vector<Chunk> chunks; - physx::PxVec3 bbMin; - physx::PxVec3 bbMax; - - static BlastModelPtr loadFromFileTinyLoader(const char* path); - static BlastModelPtr loadFromFbxFile(const char* path); -private: - BlastModel() {} -}; - -#endif // ifndef BLAST_MODEL_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastReplay.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastReplay.cpp deleted file mode 100644 index 678cec2..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastReplay.cpp +++ /dev/null @@ -1,178 +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 "BlastReplay.h" -#include "NvBlastTk.h" -#include "NvBlastExtPxManager.h" -#include "NvBlastExtPxFamily.h" -#include "SampleProfiler.h" - - -using namespace std::chrono; - -BlastReplay::BlastReplay() : m_sync(nullptr) -{ - m_sync = ExtSync::create(); - reset(); -} - -BlastReplay::~BlastReplay() -{ - m_sync->release(); - clearBuffer(); -} - -void BlastReplay::addFamily(TkFamily* family) -{ - family->addListener(*m_sync); -} - -void BlastReplay::removeFamily(TkFamily* family) -{ - family->removeListener(*m_sync); -} - -void BlastReplay::startRecording(ExtPxManager& manager, bool syncFamily, bool syncPhysics) -{ - if (isRecording()) - return; - - m_sync->releaseSyncBuffer(); - - if (syncFamily || syncPhysics) - { - std::vector<ExtPxFamily*> families(manager.getFamilyCount()); - manager.getFamilies(families.data(), (uint32_t)families.size()); - for (ExtPxFamily* family : families) - { - if (syncPhysics) - { - m_sync->syncFamily(*family); - } - else if (syncFamily) - { - m_sync->syncFamily(family->getTkFamily()); - } - } - } - - m_isRecording = true; -} - -void BlastReplay::stopRecording() -{ - if (!isRecording()) - return; - - const ExtSyncEvent*const* buffer; - uint32_t size; - m_sync->acquireSyncBuffer(buffer, size); - - clearBuffer(); - m_buffer.resize(size); - for (uint32_t i = 0; i < size; ++i) - { - m_buffer[i] = buffer[i]->clone(); - } - - // TODO: sort by ts ? make sure? - //m_buffer.sort - - m_sync->releaseSyncBuffer(); - - m_isRecording = false; -} - -void BlastReplay::startPlayback(ExtPxManager& manager, TkGroup* group) -{ - if (isPlaying() || !hasRecord()) - return; - - m_isPlaying = true; - m_startTime = steady_clock::now(); - m_nextEventIndex = 0; - m_firstEventTs = m_buffer[0]->timestamp; - m_pxManager = &manager; - m_group = group; -} - -void BlastReplay::stopPlayback() -{ - if (!isPlaying()) - return; - - m_isPlaying = false; - m_pxManager = nullptr; - m_group = nullptr; -} - -void BlastReplay::update() -{ - if (isPlaying()) - { - PROFILER_SCOPED_FUNCTION(); - - auto now = steady_clock::now(); - auto mil = duration_cast<milliseconds>((now - m_startTime)); - bool stop = true; - while (m_nextEventIndex < m_buffer.size()) - { - const ExtSyncEvent* e = m_buffer[m_nextEventIndex]; - auto t = e->timestamp - m_firstEventTs; - if (t < (uint64_t)mil.count()) - { - m_sync->applySyncBuffer(m_pxManager->getFramework(), &e, 1, m_group, m_pxManager); - m_nextEventIndex++; - } - else - { - stop = false; - break; - } - } - - if (stop) - stopPlayback(); - } -} - -void BlastReplay::reset() -{ - m_isPlaying = false; - m_isRecording = false; - m_sync->releaseSyncBuffer(); -} - -void BlastReplay::clearBuffer() -{ - for (auto e : m_buffer) - { - e->release(); - } - m_buffer.clear(); -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastReplay.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastReplay.h deleted file mode 100644 index 2c247a5..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/blast/BlastReplay.h +++ /dev/null @@ -1,93 +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. - - -#ifndef BLAST_REPLAY_H -#define BLAST_REPLAY_H - -#include "NvBlastExtSync.h" -#include <chrono> - -using namespace Nv::Blast; - -class BlastReplay -{ -public: - BlastReplay(); - ~BlastReplay(); - - bool isRecording() const - { - return m_isRecording; - } - - bool isPlaying() const - { - return m_isPlaying; - } - - bool hasRecord() const - { - return m_buffer.size() > 0; - } - - size_t getEventCount() const - { - return isRecording() ? m_sync->getSyncBufferSize() : m_buffer.size(); - } - - uint32_t getCurrentEventIndex() const - { - return m_nextEventIndex; - } - - void addFamily(TkFamily* family); - void removeFamily(TkFamily* family); - - void startRecording(ExtPxManager& manager, bool syncFamily, bool syncPhysics); - void stopRecording(); - void startPlayback(ExtPxManager& manager, TkGroup* group); - void stopPlayback(); - void update(); - void reset(); - -private: - void clearBuffer(); - - ExtPxManager* m_pxManager; - TkGroup* m_group; - std::chrono::steady_clock::time_point m_startTime; - uint64_t m_firstEventTs; - uint32_t m_nextEventIndex; - bool m_isRecording; - bool m_isPlaying; - ExtSync* m_sync; - std::vector<ExtSyncEvent*> m_buffer; -}; - - -#endif // ifndef BLAST_REPLAY_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/Application.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/Application.cpp deleted file mode 100644 index 81754e4..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/Application.cpp +++ /dev/null @@ -1,84 +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 "Application.h" -#include <DirectXMath.h> -#include "XInput.h" -#include "DXUTMisc.h" - - -Application::Application(DeviceManager* pDeviceManager) -{ - m_deviceManager = pDeviceManager; -} - -void Application::addControllerToFront(IApplicationController* controller) -{ - m_controllers.push_back(controller); - m_deviceManager->AddControllerToFront(controller); -} - -int Application::init() -{ - // FirstPersonCamera uses this timer, without it it will be FPS-dependent - DXUTGetGlobalTimer()->Start(); - - m_deviceManager->DeviceCreated(); - m_deviceManager->BackBufferResized(); - - for (auto it = m_controllers.begin(); it != m_controllers.end(); it++) - (*it)->onInitialize(); - - for (auto it = m_controllers.begin(); it != m_controllers.end(); it++) - (*it)->onSampleStart(); - - m_deviceManager->SetVsyncEnabled(false); - - return 0; -} - -int Application::run() -{ - m_deviceManager->MessageLoop(); - - return 0; -} - -int Application::free() -{ - for (auto it = m_controllers.rbegin(); it != m_controllers.rend(); it++) - (*it)->onSampleStop(); - - for (auto it = m_controllers.rbegin(); it != m_controllers.rend(); it++) - (*it)->onTerminate(); - - //m_deviceManager->Shutdown(); // destructor will call this function - delete m_deviceManager; - - return 0; -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/Application.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/Application.h deleted file mode 100644 index 3681eb3..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/Application.h +++ /dev/null @@ -1,75 +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. - - -#ifndef APPLICATION_H -#define APPLICATION_H - -#include <DeviceManager.h> -#include <vector> -#include <string> - -/** -ISampleController adds more onstart and onstop callbacks to IVisualController -*/ -class IApplicationController : public IVisualController -{ - public: - virtual void onInitialize() {} - virtual void onSampleStart() {} - virtual void onSampleStop() {} - virtual void onTerminate() {} -}; - - -/** -Main manager which runs sample. -You have to add controllers to it which will receive all the start, animate, render etc. callbacks. -*/ -class Application -{ -public: - Application(DeviceManager* pDeviceManager); - void addControllerToFront(IApplicationController* controller); - - const std::vector<IApplicationController*>& getControllers() const - { - return m_controllers; - } - - int init(); - int run(); - int free(); - -private: - DeviceManager* m_deviceManager; - std::vector<IApplicationController*> m_controllers; -// std::wstring m_sampleName; -}; - - -#endif //APPLICATION_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/DeviceManager.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/DeviceManager.cpp deleted file mode 100644 index 78eefe8..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/DeviceManager.cpp +++ /dev/null @@ -1,796 +0,0 @@ -// TAGRELEASE: PUBLIC - -#include "DeviceManager.h" -#include <WinUser.h> -#include <Windows.h> -#include <assert.h> -#include <sstream> -#include <algorithm> -#include <vector> -#include "GlobalSettings.h" - -#ifndef SAFE_RELEASE -#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } } -#endif - -#undef min -#undef max - -namespace -{ - bool IsNvDeviceID(UINT id) - { - return id == 0x10DE; - } - - // Find an adapter whose name contains the given string. - IDXGIAdapter* FindAdapter(const WCHAR* targetName, bool& isNv) - { - IDXGIAdapter* targetAdapter = NULL; - IDXGIFactory* IDXGIFactory_0001 = NULL; - HRESULT hres = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&IDXGIFactory_0001); - if (hres != S_OK) - { - printf("ERROR in CreateDXGIFactory, %s@%d.\nFor more info, get log from debug D3D runtime: (1) Install DX SDK, and enable Debug D3D from DX Control Panel Utility. (2) Install and start DbgView. (3) Try running the program again.\n",__FILE__,__LINE__); - return targetAdapter; - } - - // changed by Junma Lixu - std::vector<IDXGIAdapter*> adapters; - // check current adapter first. EnumAdapters could fail on some device - IDXGIAdapter* pAdapter = nullptr; - ID3D11Device* pD3dDevice = nullptr; - ID3D11DeviceContext* pD3dDeviceContext = nullptr; - DWORD createDeviceFlags = D3D11_CREATE_DEVICE_DEBUG; - D3D_FEATURE_LEVEL fl; - // This following code is the robust way to get all possible feature levels while handling DirectX 11.0 systems: - // please read https://blogs.msdn.microsoft.com/chuckw/2014/02/05/anatomy-of-direct3d-11-create-device/ - D3D_FEATURE_LEVEL lvl[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, - D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, - D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 }; - HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, - createDeviceFlags, lvl, _countof(lvl), - D3D11_SDK_VERSION, &pD3dDevice, &fl, &pD3dDeviceContext); - if (pD3dDevice) - { - IDXGIDevice* dxgiDevice = nullptr; - hr = pD3dDevice->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&dxgiDevice)); - if (SUCCEEDED(hr)) - { - hr = dxgiDevice->GetAdapter(&pAdapter); - if (pAdapter) - { - adapters.push_back(pAdapter); - } - SAFE_RELEASE(dxgiDevice); - } - SAFE_RELEASE(pD3dDeviceContext); - SAFE_RELEASE(pD3dDevice); - } - - // Enum Adapters - unsigned int adapterNo = 0; - while (SUCCEEDED(hres = IDXGIFactory_0001->EnumAdapters(adapterNo, (IDXGIAdapter**)&pAdapter))) - { - adapters.push_back(pAdapter); - adapterNo++; - } - if (wcslen(targetName) != 0) - { - // find the adapter with specified name - for (int i = 0; i < adapters.size(); ++i) - { - IDXGIAdapter* pAdapter = adapters[i]; - DXGI_ADAPTER_DESC aDesc; - pAdapter->GetDesc(&aDesc); - std::wstring aName = aDesc.Description; - if (aName.find(targetName) != std::string::npos) - { - targetAdapter = pAdapter; - isNv = IsNvDeviceID(aDesc.VendorId); - } - } - } - else - { - // no name specified, find one NV adapter - for (int i = 0; i < adapters.size(); ++i) - { - IDXGIAdapter* pAdapter = adapters[i]; - DXGI_ADAPTER_DESC aDesc; - pAdapter->GetDesc(&aDesc); - std::wstring aName = aDesc.Description; - if (IsNvDeviceID(aDesc.VendorId)) - { - targetAdapter = pAdapter; - isNv = true; - } - } - } - if (targetAdapter == nullptr) - targetAdapter = adapters[0]; - for (int i = 0; i < adapters.size(); ++i) - { - IDXGIAdapter* pAdapter = adapters[i]; - if (pAdapter != targetAdapter) - { - pAdapter->Release(); - } - } - - if (IDXGIFactory_0001) - IDXGIFactory_0001->Release(); - - return targetAdapter; - } - - // Adjust window rect so that it is centred on the given adapter. Clamps to fit if it's too big. - RECT MoveWindowOntoAdapter(IDXGIAdapter* targetAdapter, const RECT& rect) - { - assert(targetAdapter != NULL); - - RECT result = rect; - HRESULT hres = S_OK; - unsigned int outputNo = 0; - while (SUCCEEDED(hres)) - { - IDXGIOutput* pOutput = NULL; - hres = targetAdapter->EnumOutputs(outputNo++, &pOutput); - - if (SUCCEEDED(hres) && pOutput) - { - DXGI_OUTPUT_DESC OutputDesc; - pOutput->GetDesc( &OutputDesc ); - const RECT desktop = OutputDesc.DesktopCoordinates; - const int centreX = (int) desktop.left + (int)(desktop.right - desktop.left) / 2; - const int centreY = (int) desktop.top + (int)(desktop.bottom - desktop.top) / 2; - const int winW = rect.right - rect.left; - const int winH = rect.bottom - rect.top; - int left = centreX - winW/2; - int right = left + winW; - int top = centreY - winH/2; - int bottom = top + winH; - result.left = std::max(left, (int) desktop.left); - result.right = std::min(right, (int) desktop.right); - result.bottom = std::min(bottom, (int) desktop.bottom); - result.top = std::max(top, (int) desktop.top); - pOutput->Release(); - - // If there is more than one output, go with the first found. Multi-monitor support could go here. - break; - } - } - return result; - } -} - -HRESULT -DeviceManager::CreateWindowDeviceAndSwapChain(const DeviceCreationParameters& params) -{ - IDXGIAdapter* targetAdapter = FindAdapter(params.adapterNameSubstring, m_IsNvidia); - if (targetAdapter) - { - RECT rect = { 0, 0, params.backBufferWidth, params.backBufferHeight }; - rect = MoveWindowOntoAdapter(targetAdapter, rect); - } - else - { - return E_FAIL; - } - - HRESULT hr = E_FAIL; - - m_hWnd = params.hWnd; - - RECT clientRect; - GetClientRect(m_hWnd, &clientRect); - UINT width = clientRect.right - clientRect.left; - UINT height = clientRect.bottom - clientRect.top; - - ZeroMemory(&m_SwapChainDesc, sizeof(m_SwapChainDesc)); - m_SwapChainDesc.BufferCount = params.swapChainBufferCount; - m_SwapChainDesc.BufferDesc.Width = width; - m_SwapChainDesc.BufferDesc.Height = height; - m_SwapChainDesc.BufferDesc.Format = params.swapChainFormat; - m_SwapChainDesc.BufferDesc.RefreshRate.Numerator = params.refreshRate; - m_SwapChainDesc.BufferDesc.RefreshRate.Denominator = 0; - m_SwapChainDesc.BufferUsage = params.swapChainUsage; - m_SwapChainDesc.OutputWindow = m_hWnd; - m_SwapChainDesc.SampleDesc.Count = params.swapChainSampleCount; - m_SwapChainDesc.SampleDesc.Quality = params.swapChainSampleQuality; - m_SwapChainDesc.Windowed = !params.startFullscreen; - m_SwapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; - - // The D3D documentation says that if adapter is non-null, driver type must be unknown. Why not put - // this logic in the CreateDevice fns then?!? - const D3D_DRIVER_TYPE dType = (targetAdapter)? D3D_DRIVER_TYPE_UNKNOWN: params.driverType; - - hr = D3D11CreateDeviceAndSwapChain( - targetAdapter, // pAdapter - dType, // DriverType - NULL, // Software - params.createDeviceFlags, // Flags - ¶ms.featureLevel, // pFeatureLevels - 1, // FeatureLevels - D3D11_SDK_VERSION, // SDKVersion - &m_SwapChainDesc, // pSwapChainDesc - &m_SwapChain, // ppSwapChain - &m_Device, // ppDevice - NULL, // pFeatureLevel - &m_ImmediateContext // ppImmediateContext - ); - - if (targetAdapter) - targetAdapter->Release(); - - if(FAILED(hr)) - return hr; - - m_DepthStencilDesc.ArraySize = 1; - m_DepthStencilDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; - m_DepthStencilDesc.CPUAccessFlags = 0; - m_DepthStencilDesc.Format = params.depthStencilFormat; - m_DepthStencilDesc.Width = width; - m_DepthStencilDesc.Height = height; - m_DepthStencilDesc.MipLevels = 1; - m_DepthStencilDesc.MiscFlags = 0; - m_DepthStencilDesc.SampleDesc.Count = params.swapChainSampleCount; - m_DepthStencilDesc.SampleDesc.Quality = 0; - m_DepthStencilDesc.Usage = D3D11_USAGE_DEFAULT; - - hr = CreateRenderTargetAndDepthStencil(); - - return hr; -} - -void -DeviceManager::Shutdown() -{ - if(m_SwapChain && GetWindowState() == kWindowFullscreen) - m_SwapChain->SetFullscreenState(false, NULL); - - DeviceDestroyed(); - - // changed by Junma Lixu - //SAFE_RELEASE(m_BackBufferRTV); - //SAFE_RELEASE(m_DepthStencilDSV); - //SAFE_RELEASE(m_DepthStencilBuffer); - -// g_DeviceManagerInstance = NULL; - - // changed by Junma Lixu - //SAFE_RELEASE(m_ImmediateContext); - //SAFE_RELEASE(m_SwapChain); - -#if defined(DEBUG) || defined(_DEBUG) - ID3D11Debug * d3dDebug = nullptr; - if (nullptr != m_Device) - { - ID3D11DeviceContext* pCtx; - m_Device->GetImmediateContext(&pCtx); - pCtx->ClearState(); - pCtx->Flush(); - pCtx->Release(); - if (SUCCEEDED(m_Device->QueryInterface(__uuidof(ID3D11Debug), reinterpret_cast<void**>(&d3dDebug)))) - { - d3dDebug->ReportLiveDeviceObjects(D3D11_RLDO_DETAIL); - d3dDebug->Release(); - } - } -#endif - - // changed by Junma Lixu - //SAFE_RELEASE(m_Device); - - if(m_hWnd) - { - DestroyWindow(m_hWnd); - m_hWnd = NULL; - } -} - -HRESULT -DeviceManager::CreateRenderTargetAndDepthStencil() -{ - HRESULT hr; - - ID3D11Texture2D *backBuffer = NULL; - hr = m_SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBuffer); - if (FAILED(hr)) - return hr; - - hr = m_Device->CreateRenderTargetView(backBuffer, NULL, &m_BackBufferRTV); - backBuffer->Release(); - if (FAILED(hr)) - return hr; - - if(m_DepthStencilDesc.Format != DXGI_FORMAT_UNKNOWN) - { - hr = m_Device->CreateTexture2D(&m_DepthStencilDesc, NULL, &m_DepthStencilBuffer); - if (FAILED(hr)) - return hr; - - hr = m_Device->CreateDepthStencilView(m_DepthStencilBuffer, NULL, &m_DepthStencilDSV); - if (FAILED(hr)) - return hr; - } - - return S_OK; -} - -#include "SimpleScene.h" -#include "RenderInterface.h" - -void -DeviceManager::MessageLoop() -{ - LARGE_INTEGER newTime; - QueryPerformanceCounter(&newTime); - - double elapsedSeconds = (m_FixedFrameInterval >= 0) - ? m_FixedFrameInterval - : (double)(newTime.QuadPart - previousTime.QuadPart) / (double)perfFreq.QuadPart; - - if (m_SwapChain && GetWindowState() != kWindowMinimized) - { - Animate(elapsedSeconds); - Render(); - Sleep(0); - } - else - { - // Release CPU resources when idle - Sleep(1); - } - - { - m_vFrameTimes.push_back(elapsedSeconds); - double timeSum = 0; - for (auto it = m_vFrameTimes.begin(); it != m_vFrameTimes.end(); it++) - timeSum += *it; - - if (timeSum > m_AverageTimeUpdateInterval) - { - m_AverageFrameTime = timeSum / (double)m_vFrameTimes.size(); - m_vFrameTimes.clear(); - } - } - - previousTime = newTime; -} - -LRESULT -DeviceManager::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - switch(uMsg) - { - case WM_DESTROY: - case WM_CLOSE: - PostQuitMessage(0); - return 0; - - case WM_SYSKEYDOWN: - if(wParam == VK_F4) - { - PostQuitMessage(0); - return 0; - } - break; - - case WM_ENTERSIZEMOVE: - m_InSizingModalLoop = true; - m_NewWindowSize.cx = m_SwapChainDesc.BufferDesc.Width; - m_NewWindowSize.cy = m_SwapChainDesc.BufferDesc.Height; - break; - - case WM_EXITSIZEMOVE: - m_InSizingModalLoop = false; - ResizeSwapChain(); - break; - - case WM_SIZE: - // Ignore the WM_SIZE event if there is no device, - // or if the window has been minimized (size == 0), - // or if it has been restored to the previous size (this part is tested inside ResizeSwapChain) - if (m_Device && (lParam != 0)) - { - m_NewWindowSize.cx = LOWORD(lParam); - m_NewWindowSize.cy = HIWORD(lParam); - - if(!m_InSizingModalLoop) - ResizeSwapChain(); - } - } - - if( uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST ) - { - // processing messages front-to-back - for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++) - { - if((*it)->IsEnabled()) - { - // for kb/mouse messages, 0 means the message has been handled - if(0 == (*it)->MsgProc(hWnd, uMsg, wParam, lParam)) - return 0; - } - } - } - - if (uMsg >= WM_KEYFIRST && uMsg <= WM_KEYLAST) - { - return 0; - } - - return DefWindowProc(hWnd, uMsg, wParam, lParam); -} - -void -DeviceManager::ResizeSwapChain() -{ - // changed by Junma Lixu - RenderPlugin* pPlugin = RenderPlugin::Instance(); - D3DHandles handles; - SetWindowDeviceAndSwapChain(pPlugin->GetDeviceHandles(handles)); - BackBufferResized(); - return; - - if (m_NewWindowSize.cx == (LONG)m_SwapChainDesc.BufferDesc.Width && - m_NewWindowSize.cy == (LONG)m_SwapChainDesc.BufferDesc.Height) - return; - - m_SwapChainDesc.BufferDesc.Width = m_NewWindowSize.cx; - m_SwapChainDesc.BufferDesc.Height = m_NewWindowSize.cy; - - ID3D11RenderTargetView *nullRTV = NULL; - m_ImmediateContext->OMSetRenderTargets(1, &nullRTV, NULL); - SAFE_RELEASE(m_BackBufferRTV); - SAFE_RELEASE(m_DepthStencilDSV); - SAFE_RELEASE(m_DepthStencilBuffer); - - if (m_SwapChain) - { - // Resize the swap chain - m_SwapChain->ResizeBuffers(m_SwapChainDesc.BufferCount, m_SwapChainDesc.BufferDesc.Width, - m_SwapChainDesc.BufferDesc.Height, m_SwapChainDesc.BufferDesc.Format, - m_SwapChainDesc.Flags); - - m_DepthStencilDesc.Width = m_NewWindowSize.cx; - m_DepthStencilDesc.Height = m_NewWindowSize.cy; - - CreateRenderTargetAndDepthStencil(); - - BackBufferResized(); - } -} - -void -DeviceManager::Render() -{ - D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (float)m_SwapChainDesc.BufferDesc.Width, (float)m_SwapChainDesc.BufferDesc.Height, 0.0f, 1.0f }; - - // rendering back-to-front - for(auto it = m_vControllers.rbegin(); it != m_vControllers.rend(); it++) - { - if((*it)->IsEnabled()) - { - m_ImmediateContext->OMSetRenderTargets(1, &m_BackBufferRTV, m_DepthStencilDSV); - m_ImmediateContext->RSSetViewports(1, &viewport); - - (*it)->Render(m_Device, m_ImmediateContext, m_BackBufferRTV, m_DepthStencilDSV); - } - } - - m_ImmediateContext->OMSetRenderTargets(1, &m_BackBufferRTV, m_DepthStencilDSV); - GlobalSettings::Inst().m_renderFrameCnt++; -} - -void -DeviceManager::Animate(double fElapsedTimeSeconds) -{ - // front-to-back, but the order shouldn't matter - for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++) - { - if((*it)->IsEnabled()) - { - (*it)->Animate(fElapsedTimeSeconds); - } - } -} - -void -DeviceManager::DeviceCreated() -{ - // creating resources front-to-back - for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++) - { - (*it)->DeviceCreated(m_Device); - } -} - -void -DeviceManager::DeviceDestroyed() -{ - // releasing resources back-to-front - for(auto it = m_vControllers.rbegin(); it != m_vControllers.rend(); it++) - { - (*it)->DeviceDestroyed(); - } -} - -void -DeviceManager::BackBufferResized() -{ - if(m_SwapChain == NULL) - return; - - DXGI_SURFACE_DESC backSD; - backSD.Format = m_SwapChainDesc.BufferDesc.Format; - backSD.Width = m_SwapChainDesc.BufferDesc.Width; - backSD.Height = m_SwapChainDesc.BufferDesc.Height; - backSD.SampleDesc = m_SwapChainDesc.SampleDesc; - - for(auto it = m_vControllers.begin(); it != m_vControllers.end(); it++) - { - (*it)->BackBufferResized(m_Device, &backSD); - } -} - -HRESULT -DeviceManager::ChangeBackBufferFormat(DXGI_FORMAT format, UINT sampleCount) -{ - HRESULT hr = E_FAIL; - - if((format == DXGI_FORMAT_UNKNOWN || format == m_SwapChainDesc.BufferDesc.Format) && - (sampleCount == 0 || sampleCount == m_SwapChainDesc.SampleDesc.Count)) - return S_FALSE; - - if(m_Device) - { - bool fullscreen = (GetWindowState() == kWindowFullscreen); - if(fullscreen) - m_SwapChain->SetFullscreenState(false, NULL); - - IDXGISwapChain* newSwapChain = NULL; - DXGI_SWAP_CHAIN_DESC newSwapChainDesc = m_SwapChainDesc; - - if(format != DXGI_FORMAT_UNKNOWN) - newSwapChainDesc.BufferDesc.Format = format; - if(sampleCount != 0) - newSwapChainDesc.SampleDesc.Count = sampleCount; - - IDXGIAdapter* pDXGIAdapter = GetDXGIAdapter(); - - IDXGIFactory* pDXGIFactory = NULL; - pDXGIAdapter->GetParent(__uuidof(IDXGIFactory), reinterpret_cast<void**>(&pDXGIFactory)); - - hr = pDXGIFactory->CreateSwapChain(m_Device, &newSwapChainDesc, &newSwapChain); - - pDXGIFactory->Release(); - pDXGIAdapter->Release(); - - if (FAILED(hr)) - { - if(fullscreen) - m_SwapChain->SetFullscreenState(true, NULL); - - return hr; - } - - SAFE_RELEASE(m_BackBufferRTV); - SAFE_RELEASE(m_SwapChain); - SAFE_RELEASE(m_DepthStencilBuffer); - SAFE_RELEASE(m_DepthStencilDSV); - - m_SwapChain = newSwapChain; - m_SwapChainDesc = newSwapChainDesc; - - m_DepthStencilDesc.SampleDesc.Count = sampleCount; - - if(fullscreen) - m_SwapChain->SetFullscreenState(true, NULL); - - CreateRenderTargetAndDepthStencil(); - BackBufferResized(); - } - - return S_OK; -} - -void -DeviceManager::AddControllerToFront(IVisualController* pController) -{ - m_vControllers.remove(pController); - m_vControllers.push_front(pController); -} - -void -DeviceManager::AddControllerToBack(IVisualController* pController) -{ - m_vControllers.remove(pController); - m_vControllers.push_back(pController); -} - -void -DeviceManager::RemoveController(IVisualController* pController) -{ - m_vControllers.remove(pController); -} - -HRESULT -DeviceManager::ResizeWindow(int width, int height) -{ - if(m_SwapChain == NULL) - return E_FAIL; - - RECT rect; - GetWindowRect(m_hWnd, &rect); - - ShowWindow(m_hWnd, SW_RESTORE); - - if(!MoveWindow(m_hWnd, rect.left, rect.top, width, height, true)) - return E_FAIL; - - // No need to call m_SwapChain->ResizeBackBuffer because MoveWindow will send WM_SIZE, which calls that function. - - return S_OK; -} - -#define WINDOW_STYLE_NORMAL (WS_OVERLAPPEDWINDOW | WS_VISIBLE) -#define WINDOW_STYLE_FULLSCREEN (WS_POPUP | WS_SYSMENU | WS_VISIBLE) - -HRESULT -DeviceManager::EnterFullscreenMode(int width, int height) -{ - if(m_SwapChain == NULL) - return E_FAIL; - - if(GetWindowState() == kWindowFullscreen) - return S_FALSE; - - if(width <= 0 || height <= 0) - { - width = m_SwapChainDesc.BufferDesc.Width; - height = m_SwapChainDesc.BufferDesc.Height; - } - - SetWindowLong(m_hWnd, GWL_STYLE, WINDOW_STYLE_FULLSCREEN); - MoveWindow(m_hWnd, 0, 0, width, height, true); - - HRESULT hr = m_SwapChain->SetFullscreenState(true, NULL); - - if(FAILED(hr)) - { - SetWindowLong(m_hWnd, GWL_STYLE, WINDOW_STYLE_NORMAL); - return hr; - } - - UpdateWindow(m_hWnd); - m_SwapChain->GetDesc(&m_SwapChainDesc); - - return S_OK; -} - -HRESULT -DeviceManager::LeaveFullscreenMode(int windowWidth, int windowHeight) -{ - if(m_SwapChain == NULL) - return E_FAIL; - - if(GetWindowState() != kWindowFullscreen) - return S_FALSE; - - HRESULT hr = m_SwapChain->SetFullscreenState(false, NULL); - if(FAILED(hr)) return hr; - - SetWindowLong(m_hWnd, GWL_STYLE, WINDOW_STYLE_NORMAL); - - if(windowWidth <= 0 || windowHeight <= 0) - { - windowWidth = m_SwapChainDesc.BufferDesc.Width; - windowHeight = m_SwapChainDesc.BufferDesc.Height; - } - - RECT rect = { 0, 0, windowWidth, windowHeight }; - AdjustWindowRect(&rect, WINDOW_STYLE_NORMAL, FALSE); - MoveWindow(m_hWnd, 0, 0, rect.right - rect.left, rect.bottom - rect.top, true); - UpdateWindow(m_hWnd); - - m_SwapChain->GetDesc(&m_SwapChainDesc); - - return S_OK; -} - -HRESULT -DeviceManager::ToggleFullscreen() -{ - if(GetWindowState() == kWindowFullscreen) - return LeaveFullscreenMode(); - else - return EnterFullscreenMode(); -} - -DeviceManager::WindowState -DeviceManager::GetWindowState() -{ - if(m_SwapChain && !m_SwapChainDesc.Windowed) - return kWindowFullscreen; - - if(m_hWnd == INVALID_HANDLE_VALUE) - return kWindowNone; - - if(IsZoomed(m_hWnd)) - return kWindowMaximized; - - if(IsIconic(m_hWnd)) - return kWindowMinimized; - - return kWindowNormal; -} - -HRESULT -DeviceManager::GetDisplayResolution(int& width, int& height) -{ - if(m_hWnd != INVALID_HANDLE_VALUE) - { - HMONITOR monitor = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTOPRIMARY); - MONITORINFO info; - info.cbSize = sizeof(MONITORINFO); - - if(GetMonitorInfo(monitor, &info)) - { - width = info.rcMonitor.right - info.rcMonitor.left; - height = info.rcMonitor.bottom - info.rcMonitor.top; - return S_OK; - } - } - - return E_FAIL; -} - -IDXGIAdapter* -DeviceManager::GetDXGIAdapter() -{ - if(!m_Device) - return NULL; - - IDXGIDevice* pDXGIDevice = NULL; - m_Device->QueryInterface(__uuidof(IDXGIDevice), reinterpret_cast<void**>(&pDXGIDevice)); - - IDXGIAdapter* pDXGIAdapter = NULL; - pDXGIDevice->GetParent(__uuidof(IDXGIAdapter), reinterpret_cast<void**>(&pDXGIAdapter)); - - pDXGIDevice->Release(); - - return pDXGIAdapter; -} - -// added by Junma Lixu -void -DeviceManager::SetWindowHandle(HWND hWnd) -{ - m_hWnd = hWnd; -} - -HRESULT -DeviceManager::SetWindowDeviceAndSwapChain(D3DHandles& deviceHandles) -{ - ID3D11Device* pDevice = (ID3D11Device*)(deviceHandles.pDevice); - ID3D11DeviceContext* pImmediateContext = (ID3D11DeviceContext*)(deviceHandles.pDeviceContext); - if (pDevice == nullptr || pImmediateContext == nullptr) - { - return E_FAIL; - } - - m_Device = pDevice; - m_ImmediateContext = pImmediateContext; - m_SwapChain = deviceHandles.pDXGISwapChain; - HRESULT res0 = m_SwapChain->GetDesc(&m_SwapChainDesc); - assert(m_SwapChainDesc.OutputWindow == m_hWnd); - - m_BackBufferRTV = (ID3D11RenderTargetView*)deviceHandles.pD3D11RenderTargetView; - m_DepthStencilBuffer = (ID3D11Texture2D*)deviceHandles.pD3D11DepthBuffer; - m_DepthStencilDSV = (ID3D11DepthStencilView*)deviceHandles.pD3D11DepthStencilView; - m_DepthStencilBuffer->GetDesc(&m_DepthStencilDesc); - - return S_OK; -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/DeviceManager.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/DeviceManager.h deleted file mode 100644 index bd6f7e2..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/DeviceManager.h +++ /dev/null @@ -1,179 +0,0 @@ -// TAGRELEASE: PUBLIC - -#pragma once -#include <Windows.h> -#include <DXGI.h> -#include <D3D11.h> -#include <list> -// added by Junma Lixu -#include "RenderPlugin.h" - -struct DeviceCreationParameters -{ - bool startMaximized; - bool startFullscreen; - int backBufferWidth; - int backBufferHeight; - int refreshRate; - int swapChainBufferCount; - DXGI_FORMAT swapChainFormat; - DXGI_FORMAT depthStencilFormat; - DXGI_USAGE swapChainUsage; - int swapChainSampleCount; - int swapChainSampleQuality; - UINT createDeviceFlags; - D3D_DRIVER_TYPE driverType; - D3D_FEATURE_LEVEL featureLevel; - HWND hWnd; - - // For use in the case of multiple adapters. If this is non-null, device creation will try to match - // the given string against an adapter name. If the specified string exists as a sub-string of the - // adapter name, the device and window will be created on that adapter. Case sensitive. - const WCHAR* adapterNameSubstring; - - DeviceCreationParameters() - : startMaximized(false) - , startFullscreen(false) - , backBufferWidth(1280) - , backBufferHeight(720) - , refreshRate(0) - , swapChainBufferCount(1) - , swapChainFormat(DXGI_FORMAT_R8G8B8A8_UNORM) - , depthStencilFormat(DXGI_FORMAT_D24_UNORM_S8_UINT) - , swapChainUsage(DXGI_USAGE_SHADER_INPUT | DXGI_USAGE_RENDER_TARGET_OUTPUT) - , swapChainSampleCount(1) - , swapChainSampleQuality(0) - , createDeviceFlags(0) - , driverType(D3D_DRIVER_TYPE_HARDWARE) - , featureLevel(D3D_FEATURE_LEVEL_11_0) - , adapterNameSubstring(L"") - , hWnd(0) - { } -}; - -#pragma warning(push) -#pragma warning(disable: 4100) // unreferenced formal parameter -class IVisualController -{ -private: - bool m_Enabled; -public: - IVisualController() : m_Enabled(true) { } - - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return 1; } - virtual void Render(ID3D11Device* pDevice, ID3D11DeviceContext* pDeviceContext, ID3D11RenderTargetView* pRTV, ID3D11DepthStencilView* pDSV) { } - virtual void Animate(double fElapsedTimeSeconds) { } - virtual HRESULT DeviceCreated(ID3D11Device* pDevice) { return S_OK; } - virtual void DeviceDestroyed() { } - virtual void BackBufferResized(ID3D11Device* pDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc) { } - - virtual void EnableController() { m_Enabled = true; } - virtual void DisableController() { m_Enabled = false; } - virtual bool IsEnabled() { return m_Enabled; } -}; -#pragma warning(pop) - -struct D3DHandles; - -class DeviceManager -{ -public: - enum WindowState - { - kWindowNone, - kWindowNormal, - kWindowMinimized, - kWindowMaximized, - kWindowFullscreen - }; - -protected: - ID3D11Device* m_Device; - ID3D11DeviceContext* m_ImmediateContext; - IDXGISwapChain* m_SwapChain; - ID3D11RenderTargetView* m_BackBufferRTV; - ID3D11Texture2D* m_DepthStencilBuffer; - ID3D11DepthStencilView* m_DepthStencilDSV; - DXGI_SWAP_CHAIN_DESC m_SwapChainDesc; - D3D11_TEXTURE2D_DESC m_DepthStencilDesc; - bool m_IsNvidia; - HWND m_hWnd; - std::list<IVisualController*> m_vControllers; - std::wstring m_WindowTitle; - double m_FixedFrameInterval; - UINT m_SyncInterval; - std::list<double> m_vFrameTimes; - double m_AverageFrameTime; - double m_AverageTimeUpdateInterval; - bool m_InSizingModalLoop; - SIZE m_NewWindowSize; - LARGE_INTEGER perfFreq, previousTime; -private: - HRESULT CreateRenderTargetAndDepthStencil(); - void ResizeSwapChain(); -public: - - DeviceManager() - : m_Device(NULL) - , m_ImmediateContext(NULL) - , m_SwapChain(NULL) - , m_BackBufferRTV(NULL) - , m_DepthStencilBuffer(NULL) - , m_DepthStencilDSV(NULL) - , m_IsNvidia(false) - , m_hWnd(NULL) - , m_WindowTitle(L"") - , m_FixedFrameInterval(-1) - , m_SyncInterval(0) - , m_AverageFrameTime(0) - , m_AverageTimeUpdateInterval(0.5) - , m_InSizingModalLoop(false) - { - QueryPerformanceFrequency(&perfFreq); - QueryPerformanceCounter(&previousTime); - } - - virtual ~DeviceManager() - { Shutdown(); } - - virtual HRESULT CreateWindowDeviceAndSwapChain(const DeviceCreationParameters& params); - virtual HRESULT ChangeBackBufferFormat(DXGI_FORMAT format, UINT sampleCount); - virtual HRESULT ResizeWindow(int width, int height); - virtual HRESULT EnterFullscreenMode(int width = 0, int height = 0); - virtual HRESULT LeaveFullscreenMode(int windowWidth = 0, int windowHeight = 0); - virtual HRESULT ToggleFullscreen(); - - virtual void Shutdown(); - virtual void MessageLoop(); - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual void Render(); - virtual void Animate(double fElapsedTimeSeconds); - virtual void DeviceCreated(); - virtual void DeviceDestroyed(); - virtual void BackBufferResized(); - - void AddControllerToFront(IVisualController* pController); - void AddControllerToBack(IVisualController* pController); - void RemoveController(IVisualController* pController); - - void SetFixedFrameInterval(double seconds) { m_FixedFrameInterval = seconds; } - void DisableFixedFrameInterval() { m_FixedFrameInterval = -1; } - - bool IsNvidia() const { return m_IsNvidia; } - HWND GetHWND() { return m_hWnd; } - ID3D11Device* GetDevice() { return m_Device; } - WindowState GetWindowState(); - bool GetVsyncEnabled() { return m_SyncInterval > 0; } - void SetVsyncEnabled(bool enabled) { m_SyncInterval = enabled ? 1 : 0; } - HRESULT GetDisplayResolution(int& width, int& height); - IDXGIAdapter* GetDXGIAdapter(); - double GetAverageFrameTime() { return m_AverageFrameTime; } - void SetAverageTimeUpdateInterval(double value) { m_AverageTimeUpdateInterval = value; } - - // added by Junma Lixu - void SetWindowHandle(HWND hWnd); - virtual HRESULT SetWindowDeviceAndSwapChain(D3DHandles& pDeviceHandles); -}; - - -DeviceManager* GetDeviceManager(); diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleController.cpp deleted file mode 100644 index cd8ea4c..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleController.cpp +++ /dev/null @@ -1,85 +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 "SampleController.h" -#include "SceneController.h" -#include "CommonUIController.h" -#include "BlastController.h" -#include "PhysXController.h" -#include "Renderer.h" - -#include "imgui.h" - -SampleController::SampleController() -{ -} - -SampleController::~SampleController() -{ -} - -void SampleController::onSampleStart() -{ - // start with GPU physics by default - setUseGPUPhysics(true); -} - - -void SampleController::setUseGPUPhysics(bool useGPUPhysics) -{ - if (!getPhysXController().getGPUPhysicsAvailable()) - { - useGPUPhysics = false; - } - - if (getPhysXController().getUseGPUPhysics() == useGPUPhysics) - { - return; - } - - int assetNum = getSceneController().releaseAll(); - - getBlastController().notifyPhysXControllerRelease(); - getPhysXController().setUseGPUPhysics(useGPUPhysics); - getBlastController().reinitialize(); - - getRenderer().clearQueue(); - - getSceneController().spawnAsset(assetNum); -} - - -void SampleController::drawPhysXGpuUI() -{ - // GPU Physics - bool useGPU = getPhysXController().getUseGPUPhysics(); - if (ImGui::Checkbox("Use GPU Physics", &useGPU)) - { - getCommonUIController().addDelayedCall([=]() { setUseGPUPhysics(useGPU); }, "Loading..."); - } -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleController.h deleted file mode 100644 index 6d478c1..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleController.h +++ /dev/null @@ -1,80 +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. - - -#ifndef SAMPLE_CONTROLLER_H -#define SAMPLE_CONTROLLER_H - -#include "SampleManager.h" - -class SampleController : public ISampleController -{ -public: - SampleController(); - virtual ~SampleController(); - - virtual void onSampleStart(); - void drawPhysXGpuUI(); - -private: - SampleController& operator= (SampleController&); - - - //////// used controllers //////// - - PhysXController& getPhysXController() const - { - return getManager()->getPhysXController(); - } - - BlastController& getBlastController() const - { - return getManager()->getBlastController(); - } - - SceneController& getSceneController() const - { - return getManager()->getSceneController(); - } - - CommonUIController& getCommonUIController() const - { - return getManager()->getCommonUIController(); - } - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - - //////// private methods //////// - - void setUseGPUPhysics(bool useGPUPhysics); -}; - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.cpp deleted file mode 100644 index f26fdb3..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.cpp +++ /dev/null @@ -1,3179 +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 "AppMainWindow.h" -#include "GlobalSettings.h" -#include <QtCore/QFileInfo> -#include <QtCore/QDir> -#include "NvBlastExtAuthoringTypes.h" -#include "NvBlastExtAuthoringFractureTool.h" -#include "NvBlastExtAuthoringBondGenerator.h" -#include "NvBlastIndexFns.h" - -#include "SampleManager.h" - -#include "Utils.h" - -#include "Renderer.h" -#include "PhysXController.h" -#include "BlastController.h" -#include "CommonUIController.h" -#include "DamageToolController.h" -#include "SelectionToolController.h" -#include "ExplodeToolController.h" -#include "GizmoToolController.h" -#include "EditionToolController.h" -#include "SceneController.h" -#include "SampleController.h" - -#include "tclap/CmdLine.h" -#include "PxPhysics.h" -#include "PsFileBuffer.h" -#include "NvBlast.h" -#include "NvBlastExtAuthoringCollisionBuilder.h" -#include "NvBlastExtPxAsset.h" -#include "BlastFractureTool.h" -#include <set> -#include "MaterialLibraryPanel.h" -#include "MaterialAssignmentsPanel.h" -#include "ViewerOutput.h" - -#include "NvBlastTkAsset.h" -#include "BlastAssetModelSimple.h" -#include "CorelibUtils.h" -#include "BlastAssetModel.h" -#include "SimpleScene.h" -#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; -physx::PxFoundation* foundation = nullptr; -physx::PxPhysics* physics = nullptr; -physx::PxCooking* cooking = nullptr; -Nv::Blast::ExtPxManager* physicsManager = nullptr; -SampleManager* sSampleManager = nullptr; - -class SimpleRandomGenerator : public RandomGeneratorBase -{ -public: - SimpleRandomGenerator() { - remember = false; - }; - - virtual float getRandomValue() - { - float r = (float)rand(); - r = r / RAND_MAX; - return r; - } - - virtual float getExponential(float lambda) - { - return -1.0f / lambda * log(1 - getRandomValue()); - } - - virtual void seed(int32_t seed) - { - srand(seed); - } - - virtual ~SimpleRandomGenerator() {}; - -private: - bool remember; -}; -static SimpleRandomGenerator sRandomGenerator; - -void loggingCallback(int type, const char* msg, const char* file, int line) -{ - (void)type; - - std::cout << msg << " FILE:" << file << " Line: " << line << "\n"; -} - -void buildPxChunks(const std::vector<std::vector<Triangle>>& chunkGeometry, std::vector<ExtPxAssetDesc::ChunkDesc>& pxChunks, - std::vector<ExtPxAssetDesc::SubchunkDesc>& pxSubchunks, std::vector<bool>& statics) -{ - 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()); - - for (uint32_t i = 0; i < chunkGeometry.size(); ++i) - { - std::vector<physx::PxVec3> vertices; - for (uint32_t p = 0; p < chunkGeometry[i].size(); ++p) - { - vertices.push_back(chunkGeometry[i][p].a.p); - vertices.push_back(chunkGeometry[i][p].b.p); - vertices.push_back(chunkGeometry[i][p].c.p); - } - pxSubchunks[i].transform = physx::PxTransform(physx::PxIdentity); - 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]; - } - - // only effect when chunk is support - pxChunks[0].isStatic = true; -} - -void saveFractureToObj(std::vector<std::vector<Triangle> > chunksGeometry, std::string name, std::string path) -{ - std::vector<std::string> materialNames(2); - std::vector<std::string> materialPaths(2); - float diffuseColor[2][4]; - - SampleManager* pSampleManager = SampleManager::ins(); - BlastAsset* pCurBlastAsset = nullptr; - int nCurIndex = -1; - pSampleManager->getCurrentSelectedInstance(&pCurBlastAsset, nCurIndex); - if (pCurBlastAsset != nullptr && nCurIndex != -1) - { - pSampleManager->getMaterialForCurrentFamily(materialNames[0], true); - pSampleManager->getMaterialForCurrentFamily(materialNames[1], false); - - BPPGraphicsMaterial* pMaterialEx = BlastProject::ins().getGraphicsMaterial(materialNames[0].c_str()); - BPPGraphicsMaterial* pMaterialIn = BlastProject::ins().getGraphicsMaterial(materialNames[1].c_str()); - - diffuseColor[0][0] = pMaterialEx->diffuseColor.x; - diffuseColor[0][1] = pMaterialEx->diffuseColor.y; - diffuseColor[0][2] = pMaterialEx->diffuseColor.z; - diffuseColor[0][3] = pMaterialEx->diffuseColor.w; - if (pMaterialEx->diffuseTextureFilePath != nullptr) - { - materialPaths[0] = pMaterialEx->diffuseTextureFilePath; - } - - if (pMaterialIn == nullptr) - { - pMaterialIn = pMaterialEx; - } - - diffuseColor[1][0] = pMaterialIn->diffuseColor.x; - diffuseColor[1][1] = pMaterialIn->diffuseColor.y; - diffuseColor[1][2] = pMaterialIn->diffuseColor.z; - diffuseColor[1][3] = pMaterialIn->diffuseColor.w; - if (pMaterialIn->diffuseTextureFilePath != nullptr) - { - materialPaths[1] = pMaterialIn->diffuseTextureFilePath; - } - } - else - { - MaterialAssignmentsPanel* pMaterialAssignmentsPanel = MaterialAssignmentsPanel::ins(); - pMaterialAssignmentsPanel->getMaterialNameAndPaths(materialNames, materialPaths); - - if (materialPaths[0] == "") - { - RenderMaterial* pMaterialEx = RenderMaterial::getDefaultRenderMaterial(); - pMaterialEx->getDiffuseColor(diffuseColor[0][0], diffuseColor[0][1], diffuseColor[0][2], diffuseColor[0][3]); - } - if (materialPaths[1] == "") - { - RenderMaterial* pMaterialIn = RenderMaterial::getDefaultRenderMaterial(); - pMaterialIn->getDiffuseColor(diffuseColor[1][0], diffuseColor[1][1], diffuseColor[1][2], diffuseColor[1][3]); - } - } - - uint32_t submeshCount = 2; - // export materials (mtl file) - { - std::string mtlFilePath = GlobalSettings::MakeFileName(path.c_str(), std::string(name + ".mtl").c_str()); - FILE* f = fopen(mtlFilePath.c_str(), "w"); - if (!f) - return; - - for (uint32_t submeshIndex = 0; submeshIndex < submeshCount; ++submeshIndex) - { - // Add By Lixu Begin - std::string& matName = materialNames[submeshIndex]; - fprintf(f, "newmtl %s\n", matName.size()? matName.c_str() : "neverMat123XABCnever"); // this speical string is also used in another BlastModel.cpp. - // Add By Lixu End - fprintf(f, "\tmap_Kd %s\n", materialPaths[submeshIndex].c_str()); - fprintf(f, "\tKd %f %f %f\n", diffuseColor[submeshIndex][0], diffuseColor[submeshIndex][1], diffuseColor[submeshIndex][2]); - fprintf(f, "\n"); - } - - fclose(f); - } - - { - std::string objFilePath = GlobalSettings::MakeFileName(path.c_str(), std::string(name + ".obj").c_str()); - FILE* outStream = fopen(objFilePath.c_str(), "w"); - - fprintf(outStream, "mtllib %s.mtl\n", name.c_str()); - fprintf(outStream, "o frac \n"); - - - for (uint32_t vc = 0; vc < chunksGeometry.size(); ++vc) - { - std::vector<Triangle>& chunk = chunksGeometry[vc]; - for (uint32_t i = 0; i < chunk.size(); ++i) - { - fprintf(outStream, "v %lf %lf %lf\n", chunk[i].a.p.x, chunk[i].a.p.y, chunk[i].a.p.z); - fprintf(outStream, "v %lf %lf %lf\n", chunk[i].b.p.x, chunk[i].b.p.y, chunk[i].b.p.z); - fprintf(outStream, "v %lf %lf %lf\n", chunk[i].c.p.x, chunk[i].c.p.y, chunk[i].c.p.z); - } - - for (uint32_t i = 0; i < chunk.size(); ++i) - { - fprintf(outStream, "vt %lf %lf \n", chunk[i].a.uv[0].x, chunk[i].a.uv[0].y); - fprintf(outStream, "vt %lf %lf \n", chunk[i].b.uv[0].x, chunk[i].b.uv[0].y); - fprintf(outStream, "vt %lf %lf \n", chunk[i].c.uv[0].x, chunk[i].c.uv[0].y); - } - - for (uint32_t i = 0; i < chunk.size(); ++i) - { - fprintf(outStream, "vn %lf %lf %lf\n", chunk[i].a.n.x, chunk[i].a.n.y, chunk[i].a.n.z); - fprintf(outStream, "vn %lf %lf %lf\n", chunk[i].b.n.x, chunk[i].b.n.y, chunk[i].b.n.z); - fprintf(outStream, "vn %lf %lf %lf\n", chunk[i].c.n.x, chunk[i].c.n.y, chunk[i].c.n.z); - } - } - int indx = 1; - for (uint32_t vc = 0; vc < chunksGeometry.size(); ++vc) - { - fprintf(outStream, "g %d_%d \n", vc, 0); - fprintf(outStream, "usemtl %s\n", materialNames[0].c_str()); - int totalSize = chunksGeometry[vc].size(); - std::vector<int> internalSurfaces; - for (uint32_t i = 0; i < totalSize; ++i) - { - if (chunksGeometry[vc][i].materialId != 0) - { - internalSurfaces.push_back(indx++); - internalSurfaces.push_back(indx++); - internalSurfaces.push_back(indx++); - continue; - } - fprintf(outStream, "f %d/%d/%d ", indx, indx, indx); - indx++; - fprintf(outStream, "%d/%d/%d ", indx, indx, indx); - indx++; - fprintf(outStream, "%d/%d/%d \n", indx, indx, indx); - indx++; - } - int internalSize = internalSurfaces.size(); - if (internalSize > 0) - { - fprintf(outStream, "g %d_%d \n", vc, 1); - fprintf(outStream, "usemtl %s\n", materialNames[1].c_str()); - int isIndex; - for (uint32_t is = 0; is < internalSize;) - { - isIndex = internalSurfaces[is++]; - fprintf(outStream, "f %d/%d/%d ", isIndex, isIndex, isIndex); - isIndex = internalSurfaces[is++]; - fprintf(outStream, "%d/%d/%d ", isIndex, isIndex, isIndex); - isIndex = internalSurfaces[is++]; - fprintf(outStream, "%d/%d/%d \n", isIndex, isIndex, isIndex); - } - } - } - fclose(outStream); - } -} - -#include "NvBlastExtLlSerialization.h" -#include "NvBlastExtTkSerialization.h" -#include "NvBlastExtPxSerialization.h" -#include "NvBlastExtSerialization.h" - -bool saveBlastObject(const std::string& outputDir, const std::string& objectName, const void* object, uint32_t objectTypeID) -{ - ExtSerialization* mSerialization = SampleManager::ins()->getBlastController().getExtSerialization(); - - void* buffer; - const uint64_t bufferSize = mSerialization->serializeIntoBuffer(buffer, object, objectTypeID); - if (bufferSize == 0) - { - std::cerr << "saveBlastObject: Serialization failed.\n"; - return false; - } - - // Add By Lixu Begin - physx::PsFileBuffer fileBuf((outputDir + "/" + objectName).c_str(), physx::PxFileBuf::OPEN_WRITE_ONLY); - // Add By Lixu End - - bool result = fileBuf.isOpen(); - - if (!result) - { - std::cerr << "Can't open output buffer.\n"; - } - else - { - result = (bufferSize == (size_t)fileBuf.write(buffer, (uint32_t)bufferSize)); - if (!result) - { - std::cerr << "Buffer write failed.\n"; - } - fileBuf.close(); - } - - NVBLAST_FREE(buffer); - - return result; -} - -bool saveLlAsset(const std::string& outputDir, const std::string& objectName, const NvBlastAsset* assetLL) -{ - return saveBlastObject(outputDir, objectName, assetLL, LlObjectTypeID::Asset); -} - -bool saveTkAsset(const std::string& outputDir, const std::string& objectName, const TkAsset* tkAsset) -{ - return saveBlastObject(outputDir, objectName, tkAsset, TkObjectTypeID::Asset); -} - -bool saveExtAsset(const std::string& outputDir, const std::string& objectName, const ExtPxAsset* pxAsset) -{ - return saveBlastObject(outputDir, objectName, pxAsset, ExtPxObjectTypeID::Asset); -} - -void FractureExecutor::setSourceAsset(BlastAsset* blastAsset) -{ - assert(m_fractureTool); - m_fractureTool->setSourceAsset(blastAsset); - m_pCurBlastAsset = blastAsset; -} - -VoronoiFractureExecutor::VoronoiFractureExecutor() -: m_voronoi(nullptr) -{ - if (sSampleManager) - m_fractureTool = sSampleManager->m_fTool; -} - -bool VoronoiFractureExecutor::execute() -{ - std::vector<uint32_t>::iterator it; - for (it = m_chunkIds.begin(); it != m_chunkIds.end(); it++) - { - Nv::Blast::Mesh* mesh = m_fractureTool->getSourceMesh(*it); - if (mesh == nullptr) - continue; - - VoronoiSitesGenerator* siteGenerator = NvBlastExtAuthoringCreateVoronoiSitesGenerator(mesh, m_randomGenerator == nullptr ? &sRandomGenerator : m_randomGenerator); - if (m_voronoi) - { -// siteGenerator = new VoronoiSitesGenerator(mesh, m_randomGenerator == nullptr ? &sRandomGenerator : m_randomGenerator); - if (0 == m_voronoi->siteGeneration) - { - siteGenerator->uniformlyGenerateSitesInMesh(m_voronoi->numSites); - } - else if (1 == m_voronoi->siteGeneration) - { - siteGenerator->clusteredSitesGeneration(m_voronoi->numberOfClusters, m_voronoi->sitesPerCluster, m_voronoi->clusterRadius); - } - } - else - { -// siteGenerator = new VoronoiSitesGenerator(mesh, m_randomGenerator == nullptr ? &sRandomGenerator : m_randomGenerator); - siteGenerator->uniformlyGenerateSitesInMesh(DEFAULT_VORONOI_UNIFORM_SITES_NUMBER); - } - - const physx::PxVec3* sites = nullptr; - uint32_t sitesCount = siteGenerator->getVoronoiSites(sites); - m_fractureTool->voronoiFracturing(*it, sitesCount, sites, false); - delete siteGenerator; - } - m_fractureTool->finalizeFracturing(); - - std::vector<bool> supports; - std::vector<bool> statics; - std::vector<uint8_t> joints; - std::vector<uint32_t> worlds; - BlastAsset* pNewBlastAsset = sSampleManager->_replaceAsset(m_pCurBlastAsset, supports, statics, joints, worlds); - if (nullptr == pNewBlastAsset) - { - return false; - } - - std::vector<uint32_t> NewChunkIndexes; - for (uint32_t ci = 0; ci < m_fractureTool->getChunkCount(); ci++) - { - for (uint32_t chunkId : m_chunkIds) - { - if (m_fractureTool->getChunkInfo(ci).parent == chunkId) - { - NewChunkIndexes.push_back(ci); - } - } - } - - sSampleManager->ApplyAutoSelectNewChunks(pNewBlastAsset, NewChunkIndexes); - - return true; -} - -SliceFractureExecutor::SliceFractureExecutor() -: m_slice(nullptr) -{ - if (sSampleManager) - m_fractureTool = sSampleManager->m_fTool; -} - -bool SliceFractureExecutor::execute() -{ - SlicingConfiguration config; - if (m_slice) - { - config.x_slices = m_slice->numSlicesX; - config.y_slices = m_slice->numSlicesY; - config.z_slices = m_slice->numSlicesZ; - config.offset_variations = m_slice->offsetVariation; - config.angle_variations = m_slice->rotationVariation; - config.noiseAmplitude = m_slice->noiseAmplitude; - config.noiseFrequency = m_slice->noiseFrequency; - config.noiseOctaveNumber = m_slice->noiseOctaveNumber; - config.surfaceResolution = m_slice->surfaceResolution; - } - - if (m_randomGenerator == nullptr) - { - sRandomGenerator.seed(m_slice->noiseSeed); - } - else - { - m_randomGenerator->seed(m_slice->noiseSeed); - } - - std::vector<uint32_t>::iterator it; - for (it = m_chunkIds.begin(); it != m_chunkIds.end(); it++) - { - m_fractureTool->slicing(*it, config, false, (m_randomGenerator == nullptr ? &sRandomGenerator : m_randomGenerator)); - } - m_fractureTool->finalizeFracturing(); - - std::vector<bool> supports; - std::vector<bool> statics; - std::vector<uint8_t> joints; - std::vector<uint32_t> worlds; - BlastAsset* pNewBlastAsset = sSampleManager->_replaceAsset(m_pCurBlastAsset, supports, statics, joints, worlds); - if (nullptr == pNewBlastAsset) - { - return false; - } - - std::vector<uint32_t> NewChunkIndexes; - for (uint32_t ci = 0; ci < m_fractureTool->getChunkCount(); ci++) - { - for (uint32_t chunkId : m_chunkIds) - { - if (m_fractureTool->getChunkInfo(ci).parent == chunkId) - { - NewChunkIndexes.push_back(ci); - } - } - } - - sSampleManager->ApplyAutoSelectNewChunks(pNewBlastAsset, NewChunkIndexes); - - return true; -} - -static VoronoiFractureExecutor sVoronoiFracture; - -SampleManager* SampleManager::ins() -{ - return sSampleManager; -} - -SampleManager::SampleManager(DeviceManager* pDeviceManager) -{ - sSampleManager = this; - m_bNeedRefreshTree = false; - - m_renderer = new Renderer(); - m_physXController = new PhysXController(ExtImpactDamageManager::FilterShader); - m_blastController = new BlastController(); - m_sceneController = new SceneController(); - m_damageToolController = new DamageToolController(); - m_selectionToolController = new SelectionToolController(); - m_explodeToolController = new ExplodeToolController(); - m_gizmoToolController = new GizmoToolController(); - m_editionToolController = new EditionToolController(); - m_sampleController = new SampleController(); - m_commonUIController = nullptr; // new CommonUIController(); - - m_pApplication = new Application(pDeviceManager); - - Application& app = *m_pApplication; - - app.addControllerToFront(m_renderer); - app.addControllerToFront(m_physXController); - app.addControllerToFront(m_blastController); - app.addControllerToFront(m_sceneController); - app.addControllerToFront(m_damageToolController); - app.addControllerToFront(m_selectionToolController); - app.addControllerToFront(m_explodeToolController); - app.addControllerToFront(m_gizmoToolController); -// app.addControllerToFront(m_editionToolController); - app.addControllerToFront(m_sampleController); -// app.addControllerToFront(m_commonUIController); - - for (IApplicationController* c : app.getControllers()) - { - (static_cast<ISampleController*>(c))->setManager(this); - } - - m_fTool = new BlastFractureTool(); - m_fractureExecutor = nullptr; - - setFractureExecutor(&sVoronoiFracture); - - m_pCurBlastAsset = nullptr; - m_nCurFamilyIndex = -1; - EnableSimulating(false); -} - -SampleManager::~SampleManager() -{ - delete m_renderer; - delete m_physXController; - delete m_blastController; - delete m_sceneController; - delete m_damageToolController; - delete m_selectionToolController; - delete m_explodeToolController; - delete m_gizmoToolController; - delete m_editionToolController; - delete m_sampleController; - delete m_fTool; -// delete m_commonUIController; -} - -int SampleManager::init() -{ - Application& app = *m_pApplication; - app.init(); - - m_damageToolController->DisableController(); - m_selectionToolController->EnableController(); - m_explodeToolController->DisableController(); - m_gizmoToolController->DisableController(); - BlastPlugin::Inst().GetMainToolbar()->updateCheckIconsStates(); - - EnableSimulating(false); - - return 0; -} - -int SampleManager::run() -{ - m_physXController->setPlaneVisible(AppMainWindow::Inst().m_bShowPlane); - - Application& app = *m_pApplication; - app.run(); - - std::vector<std::string>::iterator itStr; - std::vector<Renderable*>::iterator itRenderable; - std::map<std::string, RenderMaterial*>::iterator itRenderMaterial; - for (itStr = m_NeedDeleteRenderMaterials.begin(); itStr != m_NeedDeleteRenderMaterials.end(); itStr++) - { - itRenderMaterial = m_RenderMaterialMap.find(*itStr); - if (itRenderMaterial == m_RenderMaterialMap.end()) - { - continue; - } - RenderMaterial* pRenderMaterial = itRenderMaterial->second; - - std::vector<Renderable*>& renderables = pRenderMaterial->getRelatedRenderables(); - for (itRenderable = renderables.begin(); itRenderable != renderables.end(); itRenderable++) - { - Renderable* pRenderable = *itRenderable; - pRenderable->setMaterial(*RenderMaterial::getDefaultRenderMaterial()); - } - - delete pRenderMaterial; - pRenderMaterial = nullptr; - m_RenderMaterialMap.erase(itRenderMaterial); - } - m_NeedDeleteRenderMaterials.clear(); - - return 0; -} - -int SampleManager::free() -{ - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator it; - for (it = m_AssetFamiliesMap.begin(); it != m_AssetFamiliesMap.end(); it++) - { - std::vector<BlastFamily*>& fs = it->second; - fs.clear(); - } - m_AssetFamiliesMap.clear(); - m_AssetDescMap.clear(); - - Application& app = *m_pApplication; - app.free(); - - return 0; -} - -bool SampleManager::createAsset( - BlastAssetModelSimple** ppBlastAsset, - std::vector<Nv::Blast::Mesh*>& meshes, - std::vector<int32_t>& parentIds, - std::vector<bool>& supports, - std::vector<bool>& statics, - std::vector<uint8_t>& joints, - std::vector<uint32_t>& worlds) -{ - m_fTool->setSourceMeshes(meshes, parentIds); - m_fTool->finalizeFracturing(); - - _createAsset(ppBlastAsset, supports, statics, joints, worlds); - - return true; -} - -bool SampleManager::saveAsset(BlastAsset* pBlastAsset) -{ - if (pBlastAsset == nullptr) - { - return false; - } - - AssetList::ModelAsset& desc = m_AssetDescMap[pBlastAsset]; - - PhysXController& pc = getPhysXController(); - BlastController& bc = getBlastController(); - physics = &pc.getPhysics(); - foundation = &physics->getFoundation(); - cooking = &pc.getCooking(); - physicsManager = &bc.getExtPxManager(); - - std::string outDir = GlobalSettings::Inst().m_projectFileDir; - - std::string outBlastFilePath = GlobalSettings::MakeFileName(outDir.c_str(), std::string(desc.name + ".blast").c_str()); - const ExtPxAsset* asset = pBlastAsset->getPxAsset(); - if (asset == nullptr) - { - return false; - } - saveExtAsset(outDir, std::string(desc.name + ".blast"), asset); - - m_fTool->setSourceAsset(pBlastAsset); - m_fTool->finalizeFracturing(); - - size_t nChunkListSize = m_fTool->getChunkCount(); - std::vector<Triangle*> chunkMeshes(nChunkListSize); - std::vector<uint32_t> chunkMeshesTriangleCount(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.get()[i] = m_fTool->getChunkInfo(i).isLeaf; - } - - 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; - if (bondCount == 0) - { - std::cout << "Can't create bonds descriptors..." << std::endl; - } - - std::vector<uint32_t> chunkReorderInvMap; - { - std::vector<uint32_t> chunkReorderMap(chunkCount); - std::vector<char> scratch(chunkCount * sizeof(NvBlastChunkDesc)); - 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())); - } - - std::vector<std::vector<Triangle>> resultGeometry(nChunkListSize); - for (uint32_t i = 0; i < nChunkListSize; ++i) - { - uint32_t chunkIndex = chunkReorderInvMap[i]; - resultGeometry[chunkIndex].resize(chunkMeshesTriangleCount[i]); - memcpy(resultGeometry[chunkIndex].data(), chunkMeshes[i], chunkMeshesTriangleCount[i] * sizeof(Triangle)); - } - - saveFractureToObj(resultGeometry, desc.name, outDir); - - char message[MAX_PATH]; - sprintf(message, "Blast file %s was saved.", outBlastFilePath.c_str()); - output(message); - - return true; -} - -#include "fbxsdk.h" - -uint32_t currentDepth; -bool bOutputFBXAscii = true; - -void PxVec3ToFbx(physx::PxVec3& inVector, FbxVector4& outVector) -{ - outVector[0] = inVector.x; - outVector[1] = inVector.y; - outVector[2] = inVector.z; - outVector[3] = 0; -} - -void PxVec2ToFbx(physx::PxVec2& inVector, FbxVector2& outVector) -{ - outVector[0] = inVector.x; - outVector[1] = inVector.y; -} - -void VertexToFbx(Nv::Blast::Vertex& vert, FbxVector4& outVertex, FbxVector4& outNormal, FbxVector2& outUV) -{ - PxVec3ToFbx(vert.p, outVertex); - PxVec3ToFbx(vert.n, outNormal); - PxVec2ToFbx(vert.uv[0], outUV); -} - -uint32_t createChunkRecursive(FbxManager* sdkManager, uint32_t currentCpIdx, uint32_t chunkIndex, FbxNode *meshNode, FbxNode* parentNode, FbxSkin* skin, const NvBlastAsset* asset, std::vector<std::vector<Nv::Blast::Triangle>> chunksGeometry) -{ - currentDepth++; - - auto chunks = NvBlastAssetGetChunks(asset, nullptr); - const NvBlastChunk* chunk = &chunks[chunkIndex]; - auto triangles = chunksGeometry[chunkIndex]; - physx::PxVec3 centroid = physx::PxVec3(chunk->centroid[0], chunk->centroid[1], chunk->centroid[2]); - - std::ostringstream namestream; - - //mesh->InitTextureUV(triangles.size() * 3); - - std::ostringstream().swap(namestream); // Swap namestream with a default constructed ostringstream - namestream << "bone_" << chunkIndex; - std::string boneName = namestream.str(); - - FbxSkeleton* skelAttrib; - if (chunk->parentChunkIndex == UINT32_MAX) - { - skelAttrib = FbxSkeleton::Create(sdkManager, "SkelRootAttrib"); - skelAttrib->SetSkeletonType(FbxSkeleton::eRoot); - - // Change the centroid to origin - centroid = physx::PxVec3(0.0f); - } - else - { - skelAttrib = FbxSkeleton::Create(sdkManager, boneName.c_str()); - skelAttrib->SetSkeletonType(FbxSkeleton::eLimbNode); - } - - skelAttrib->Size.Set(1.0); // What's this for? - - - FbxNode* boneNode = FbxNode::Create(sdkManager, boneName.c_str()); - boneNode->SetNodeAttribute(skelAttrib); - - auto mat = parentNode->EvaluateGlobalTransform().Inverse(); - - FbxVector4 vec(centroid.x, centroid.y, centroid.z, 0); - FbxVector4 c2 = mat.MultT(vec); - - boneNode->LclTranslation.Set(c2); - - parentNode->AddChild(boneNode); - - std::ostringstream().swap(namestream); // Swap namestream with a default constructed ostringstream - namestream << "cluster_" << std::setw(5) << std::setfill('0') << chunkIndex; - std::string clusterName = namestream.str(); - - FbxCluster* cluster = FbxCluster::Create(sdkManager, clusterName.c_str()); - cluster->SetTransformMatrix(FbxAMatrix()); - cluster->SetLink(boneNode); - cluster->SetLinkMode(FbxCluster::eTotalOne); - - skin->AddCluster(cluster); - - FbxMesh* mesh = static_cast<FbxMesh*>(meshNode->GetNodeAttribute()); - - FbxVector4* controlPoints = mesh->GetControlPoints(); - auto geNormal = mesh->GetElementNormal(); - auto geUV = mesh->GetElementUV("diffuseElement"); - FbxGeometryElementMaterial* matElement = mesh->GetElementMaterial(); - - auto addVert = [&](Nv::Blast::Vertex vert, int controlPointIdx) - { - FbxVector4 vertex; - FbxVector4 normal; - FbxVector2 uv; - - VertexToFbx(vert, vertex, normal, uv); - - controlPoints[controlPointIdx] = vertex; - geNormal->GetDirectArray().Add(normal); - geUV->GetDirectArray().Add(uv); - // Add this control point to the bone with weight 1.0 - cluster->AddControlPointIndex(controlPointIdx, 1.0); - }; - - uint32_t cpIdx = 0; - uint32_t polyCount = mesh->GetPolygonCount(); - for (auto tri : triangles) - { - addVert(tri.a, currentCpIdx + cpIdx + 0); - addVert(tri.b, currentCpIdx + cpIdx + 1); - addVert(tri.c, currentCpIdx + cpIdx + 2); - - mesh->BeginPolygon(); - mesh->AddPolygon(currentCpIdx + cpIdx + 0); - mesh->AddPolygon(currentCpIdx + cpIdx + 1); - mesh->AddPolygon(currentCpIdx + cpIdx + 2); - mesh->EndPolygon(); - if (tri.materialId == 0) - { - matElement->GetIndexArray().SetAt(polyCount, 0); - } - else - { - matElement->GetIndexArray().SetAt(polyCount, 1); - } - polyCount++; - cpIdx += 3; - } - - mat = meshNode->EvaluateGlobalTransform(); - cluster->SetTransformMatrix(mat); - - mat = boneNode->EvaluateGlobalTransform(); - cluster->SetTransformLinkMatrix(mat); - - uint32_t addedCps = static_cast<uint32_t>(triangles.size() * 3); - - for (uint32_t i = chunk->firstChildIndex; i < chunk->childIndexStop; i++) - { - addedCps += createChunkRecursive(sdkManager, currentCpIdx + addedCps, i, meshNode, boneNode, skin, asset, chunksGeometry); - } - - return addedCps; -} - -bool finalizeFbxAndSave(FbxManager* sdkManager, FbxScene* scene, FbxSkin* skin, const std::string& outputFilePath) -{ - // Store the bind pose - - std::unordered_set<FbxNode*> clusterNodes; - - std::function<void(FbxNode*)> addRecursively = [&](FbxNode* node) - { - if (node) - { - addRecursively(node->GetParent()); - - clusterNodes.insert(node); - } - }; - - for (uint32_t i = 0; i < (uint32_t)skin->GetClusterCount(); i++) - { - FbxNode* clusterNode = skin->GetCluster(i)->GetLink(); - - addRecursively(clusterNode); - } - - assert(clusterNodes.size() > 0); - - FbxPose* pose = FbxPose::Create(sdkManager, "BasePose"); - pose->SetIsBindPose(true); - - for (auto node : clusterNodes) - { - FbxMatrix bindMat = node->EvaluateGlobalTransform(); - - pose->Add(node, bindMat); - } - - scene->AddPose(pose); - - FbxExporter* exporter = FbxExporter::Create(sdkManager, "Scene Exporter"); - - int lFormat; - - if (bOutputFBXAscii) - { - lFormat = sdkManager->GetIOPluginRegistry()->FindWriterIDByDescription("FBX ascii (*.fbx)"); - } - else - { - lFormat = sdkManager->GetIOPluginRegistry()->FindWriterIDByDescription("FBX binary (*.fbx)"); - } - - bool exportStatus = exporter->Initialize(outputFilePath.c_str(), lFormat, sdkManager->GetIOSettings()); - - if (!exportStatus) - { - std::cerr << "Call to FbxExporter::Initialize failed" << std::endl; - std::cerr << "Error returned: " << exporter->GetStatus().GetErrorString() << std::endl; - return false; - } - - exportStatus = exporter->Export(scene); - - if (!exportStatus) - { - auto fbxStatus = exporter->GetStatus(); - - std::cerr << "Call to FbxExporter::Export failed" << std::endl; - std::cerr << "Error returned: " << fbxStatus.GetErrorString() << std::endl; - return false; - } - - return true; -} - -bool SampleManager::exportAsset() -{ - if (m_pCurBlastAsset == nullptr) - { - viewer_err("Please select one asset instance before saving!"); - return false; - } - - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = m_AssetDescMap.find(m_pCurBlastAsset); - if (itADM == m_AssetDescMap.end()) - { - viewer_err("Fails to find out the selected asset instance in current project!"); - return false; - } - - BPParams& projectParams = BlastProject::ins().getParams(); - - AssetList::ModelAsset& desc = itADM->second; - - BPPAssetArray& assetArray = projectParams.blast.blastAssets; - BPPAsset asset; - int aaas = 0; - for (; aaas < assetArray.arraySizes[0]; aaas++) - { - asset = assetArray.buf[aaas]; - std::string assetname = asset.name; - if (assetname == desc.name) - break; - } - if (aaas == assetArray.arraySizes[0]) - { - return false; - } - - PhysXController& pc = getPhysXController(); - BlastController& bc = getBlastController(); - physics = &pc.getPhysics(); - foundation = &physics->getFoundation(); - cooking = &pc.getCooking(); - physicsManager = &bc.getExtPxManager(); - - std::string outDir = GlobalSettings::Inst().m_projectFileDir; - - m_fTool->setSourceAsset(m_pCurBlastAsset); - m_fTool->finalizeFracturing(); - - size_t nChunkListSize = m_fTool->getChunkCount(); - std::vector<Triangle*> chunkMeshes(nChunkListSize); - std::vector<uint32_t> chunkMeshesTriangleCount(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.get()[i] = m_fTool->getChunkInfo(i).isLeaf; - } - - 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; - if (bondCount == 0) - { - std::cout << "Can't create bonds descriptors..." << std::endl; - } - - std::vector<uint32_t> chunkReorderInvMap; - { - std::vector<uint32_t> chunkReorderMap(chunkCount); - std::vector<char> scratch(chunkCount * sizeof(NvBlastChunkDesc)); - 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())); - } - - std::vector<std::vector<Triangle>> resultGeometry(nChunkListSize); - for (uint32_t i = 0; i < nChunkListSize; ++i) - { - uint32_t chunkIndex = chunkReorderInvMap[i]; - resultGeometry[chunkIndex].resize(chunkMeshesTriangleCount[i]); - 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); - // Set some properties on the io settings - - sdkManager->SetIOSettings(ios); - - sdkManager->GetIOSettings()->SetBoolProp(EXP_ASCIIFBX, bOutputFBXAscii); - - FbxScene* scene = FbxScene::Create(sdkManager, "Export Scene"); - /* - if (getConvertToUE4()) - { - FbxAxisSystem::EFrontVector FrontVector = (FbxAxisSystem::EFrontVector) - FbxAxisSystem::eParityOdd; - const FbxAxisSystem UnrealZUp(FbxAxisSystem::eZAxis, FrontVector, FbxAxisSystem::eRightHanded); - - scene->GetGlobalSettings().SetAxisSystem(UnrealZUp); - } - */ - // Otherwise default to Maya defaults - - FbxMesh* mesh = FbxMesh::Create(sdkManager, "meshgeo"); - - FbxGeometryElementNormal* geNormal = mesh->CreateElementNormal(); - geNormal->SetMappingMode(FbxGeometryElement::eByControlPoint); - geNormal->SetReferenceMode(FbxGeometryElement::eDirect); - - FbxGeometryElementUV* geUV = mesh->CreateElementUV("diffuseElement"); - geUV->SetMappingMode(FbxGeometryElement::eByPolygonVertex); - geUV->SetReferenceMode(FbxGeometryElement::eDirect); - - // Get the triangles count for all of the mesh parts - - size_t triangleCount = 0; - for (auto triangles : resultGeometry) - { - triangleCount += triangles.size(); - } - - mesh->InitControlPoints((int)triangleCount * 3); - - FbxNode* meshNode = FbxNode::Create(scene, "meshnode"); - meshNode->SetNodeAttribute(mesh); - meshNode->SetShadingMode(FbxNode::eTextureShading); - - FbxNode* lRootNode = scene->GetRootNode(); - lRootNode->AddChild(meshNode); - - FbxSkin* skin = FbxSkin::Create(sdkManager, "Skin of the thing"); - skin->SetGeometry(mesh); - - mesh->AddDeformer(skin); - - // Add a material otherwise UE4 freaks out on import - - FbxGeometryElementMaterial* matElement = mesh->CreateElementMaterial(); - matElement->SetMappingMode(FbxGeometryElement::eByPolygon); - matElement->SetReferenceMode(FbxGeometryElement::eIndexToDirect); - - FbxSurfacePhong* material = FbxSurfacePhong::Create(sdkManager, "FirstExportMaterial"); - - material->Diffuse.Set(FbxDouble3(1.0, 1.0, 0)); - material->DiffuseFactor.Set(1.0); - - meshNode->AddMaterial(material); - - FbxSurfacePhong* material2 = FbxSurfacePhong::Create(sdkManager, "SecondExportMaterial"); - - material2->Diffuse.Set(FbxDouble3(1.0, 0.0, 1.0)); - material2->DiffuseFactor.Set(1.0); - - meshNode->AddMaterial(material2); - - const ExtPxAsset* pExtPxAsset = m_pCurBlastAsset->getPxAsset(); - if (pExtPxAsset == nullptr) - { - return false; - } - - const TkAsset& tkAsset = pExtPxAsset->getTkAsset(); - const NvBlastAsset* pAssetLL = tkAsset.getAssetLL(); - uint32_t chunkCount = NvBlastAssetGetChunkCount(pAssetLL, nullptr); - - auto chunks = NvBlastAssetGetChunks(pAssetLL, nullptr); - - currentDepth = 0; - uint32_t cpIdx = 0; - for (uint32_t i = 0; i < chunkCount; i++) - { - const NvBlastChunk* chunk = &chunks[i]; - - if (chunk->parentChunkIndex == UINT32_MAX) - { - uint32_t addedCps = createChunkRecursive(sdkManager, cpIdx, i, meshNode, lRootNode, skin, pAssetLL, resultGeometry); - - cpIdx += addedCps; - } - } - - std::string outputFilePath = GlobalSettings::MakeFileName(outDir.c_str(), asset.fbx.buf); - finalizeFbxAndSave(sdkManager, scene, skin, outputFilePath); - - sdkManager->Destroy(); - sdkManager = nullptr; -#endif - - std::string info = outputFilePath + " is saved."; - viewer_info(info.c_str()); - } - - if (asset.exportOBJ) - { - std::string filename = asset.obj.buf; - filename = filename.substr(0, filename.find_last_of('.')); - saveFractureToObj(resultGeometry, filename, outDir); - - std::string outputFilePath = GlobalSettings::MakeFileName(outDir.c_str(), asset.obj.buf); - std::string info = outputFilePath + " is saved."; - viewer_info(info.c_str()); - } - - if (asset.exportBPXA) - { - std::string outputFilePath = GlobalSettings::MakeFileName(outDir.c_str(), asset.bpxa.buf); - const ExtPxAsset* pExtPxAsset = m_pCurBlastAsset->getPxAsset(); - if (pExtPxAsset == nullptr) - { - return false; - } - saveExtAsset(outDir, std::string(asset.bpxa.buf), pExtPxAsset); - - 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); - const ExtPxAsset* pExtPxAsset = m_pCurBlastAsset->getPxAsset(); - if (pExtPxAsset == nullptr) - { - return false; - } - - const TkAsset& tkAsset = pExtPxAsset->getTkAsset(); - - saveTkAsset(outDir, std::string(asset.tkasset.buf), &tkAsset); - - std::string info = outputFilePath + " is saved."; - viewer_info(info.c_str()); - } - - if (asset.exportLLAsset) - { - std::string outputFilePath = GlobalSettings::MakeFileName(outDir.c_str(), asset.llasset.buf); - const ExtPxAsset* pExtPxAsset = m_pCurBlastAsset->getPxAsset(); - if (pExtPxAsset == nullptr) - { - return false; - } - - const TkAsset& tkAsset = pExtPxAsset->getTkAsset(); - const NvBlastAsset* pAssetLL = tkAsset.getAssetLL(); - - saveLlAsset(outDir, std::string(asset.llasset.buf), pAssetLL); - - std::string info = outputFilePath + " is saved."; - viewer_info(info.c_str()); - } - - return true; -} - -void SampleManager::_createAsset(BlastAssetModelSimple** ppBlastAsset, - std::vector<bool>& supports, - std::vector<bool>& statics, - std::vector<uint8_t>& joints, - std::vector<uint32_t>& worlds) -{ - PhysXController& pc = getPhysXController(); - BlastController& bc = getBlastController(); - - physics = &pc.getPhysics(); - foundation = &physics->getFoundation(); - cooking = &pc.getCooking(); - physicsManager = &bc.getExtPxManager(); - TkFramework& tk = bc.getTkFramework(); - - size_t nChunkListSize = m_fTool->getChunkCount(); - - std::vector<Triangle*> chunkMeshes; - std::vector<uint32_t> chunkMeshesTriangleCount(nChunkListSize); - std::shared_ptr<bool> isSupport(new bool[nChunkListSize] { false }, [](bool* b) {delete[] b; }); - - chunkMeshes.resize(nChunkListSize); - for (uint32_t i = 0; i < nChunkListSize; ++i) - { - chunkMeshesTriangleCount[i] = m_fTool->getBaseMesh(i, chunkMeshes[i]); - isSupport.get()[i] = supports.size() == 0 ? m_fTool->getChunkInfo(i).isLeaf : supports[i]; - } - - 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++) - { - if (worlds[bds] == 0xFFFFFFFF) - { - bondDescs[bds].chunkIndices[1] = worlds[bds]; - } - } - } - - if (bondCount == 0) - { - std::cout << "Can't create bonds descriptors..." << std::endl; - } - - // order chunks, build map - std::vector<uint32_t> chunkReorderInvMap; - { - std::vector<uint32_t> chunkReorderMap(chunkCount); - std::vector<char> scratch(chunkCount * sizeof(NvBlastChunkDesc)); - 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())); - } - - // get result geometry - std::vector<std::vector<Triangle>> resultGeometry(nChunkListSize); - for (uint32_t i = 0; i < nChunkListSize; ++i) - { - uint32_t chunkIndex = chunkReorderInvMap[i]; - resultGeometry[chunkIndex].resize(chunkMeshesTriangleCount[i]); - memcpy(resultGeometry[chunkIndex].data(), chunkMeshes[i], chunkMeshesTriangleCount[i] * sizeof(Triangle)); - } - - // prepare physics data (convexes) - std::vector<ExtPxAssetDesc::ChunkDesc> pxChunks(chunkCount); - std::vector<ExtPxAssetDesc::SubchunkDesc> pxSubchunks; - buildPxChunks(resultGeometry, pxChunks, pxSubchunks, statics); - - // build and serialize ExtPhysicsAsset - ExtPxAssetDesc descriptor; - descriptor.bondCount = bondCount; - descriptor.bondDescs = bondDescs; - descriptor.chunkCount = chunkCount; - descriptor.chunkDescs = chunkDesc; - descriptor.bondFlags = joints.data(); - descriptor.pxChunks = pxChunks.data(); - ExtPxAsset* asset = ExtPxAsset::create(descriptor, tk); - if (asset == nullptr) - { - return; - } - - std::string tempFilePath = utils::GetTempFilePath(); - QFileInfo tempFileInfo(tempFilePath.c_str()); - std::string tempdir = QDir::toNativeSeparators(tempFileInfo.absoluteDir().absolutePath()).toLocal8Bit(); - std::string tempfile = tempFileInfo.fileName().toLocal8Bit(); - saveFractureToObj(resultGeometry, tempfile, tempdir); - std::string objFilePath = tempFilePath + ".obj"; - std::string mtlFilePath = tempFilePath + ".mtl"; - BlastModel* pBlastModel = BlastModel::loadFromFileTinyLoader(objFilePath.c_str()); - DeleteFileA(tempFilePath.c_str()); - DeleteFileA(objFilePath.c_str()); - DeleteFileA(mtlFilePath.c_str()); - - *ppBlastAsset = new BlastAssetModelSimple(asset, pBlastModel, getRenderer()); -} - -BlastAsset* SampleManager::_replaceAsset(BlastAsset* pBlastAsset, - std::vector<bool>& supports, - std::vector<bool>& statics, - std::vector<uint8_t>& joints, - std::vector<uint32_t>& worlds) -{ - if (pBlastAsset == nullptr) - { - return false; - } - - BlastAsset* pCurBlastAsset = nullptr; - int nFamilyIndex = -1; - getCurrentSelectedInstance(&pCurBlastAsset, nFamilyIndex); - - std::vector<BlastFamily*> familiesOld = m_AssetFamiliesMap[pBlastAsset]; - int familiesSize = familiesOld.size(); - std::vector<physx::PxTransform> transforms(familiesSize); - std::vector<std::string> extMaterials(familiesSize); - std::vector<std::string> intMaterials(familiesSize); - for (int fs = 0; fs < familiesSize; fs++) - { - transforms[fs] = familiesOld[fs]->getSettings().transform; - - setCurrentSelectedInstance(pBlastAsset, fs); - getMaterialForCurrentFamily(extMaterials[fs], true); - getMaterialForCurrentFamily(intMaterials[fs], false); - } - - BlastAssetModelSimple* pBlastAssetNew; - _createAsset(&pBlastAssetNew, supports, statics, joints, worlds); - - BlastAssetModelSimple* pBlastAssetOld = (BlastAssetModelSimple*)pBlastAsset; - AssetList::ModelAsset desc = m_AssetDescMap[pBlastAsset]; - removeBlastAsset(pBlastAssetOld); - addBlastAsset(pBlastAssetNew, desc); - - for (int fs = 0; fs < familiesSize; fs++) - { - addBlastFamily(pBlastAssetNew, transforms[fs]); - - setCurrentSelectedInstance(pBlastAssetNew, fs); - - setMaterialForCurrentFamily(extMaterials[fs], true); - setMaterialForCurrentFamily(intMaterials[fs], false); - } - - if (pCurBlastAsset == pBlastAsset) - { - pCurBlastAsset = pBlastAssetNew; - } - setCurrentSelectedInstance(pCurBlastAsset, nFamilyIndex); - - return pBlastAssetNew; -} - -std::vector<uint32_t> SampleManager::getCurrentSelectedChunks() -{ - std::vector<uint32_t> selectedChunks; - std::vector<BlastFamilyPtr>& spFamilies = m_blastController->getFamilies(); - if (spFamilies.size() > 0) - { - return spFamilies.back()->getSelectedChunks(); - } - return selectedChunks; -} - -std::map<BlastAsset*, std::vector<uint32_t>> SampleManager::getSelectedChunks() -{ - std::map<BlastAsset*, std::vector<uint32_t>> selectedChunks; - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itrBlast = m_AssetFamiliesMap.begin(); - for (; itrBlast != m_AssetFamiliesMap.end(); ++itrBlast) - { - std::set<uint32_t> assetChunks; - std::vector<BlastFamily*>& families = itrBlast->second; - std::vector<BlastFamily*>::iterator itrFamily = families.begin(); - for (; itrFamily != families.end(); ++itrFamily) - { - std::vector<uint32_t> familyChunks = (*itrFamily)->getSelectedChunks(); - for (std::vector<uint32_t>::iterator itrChunk = familyChunks.begin(); itrChunk != familyChunks.end(); ++itrChunk) - { - assetChunks.insert(*itrChunk); - } - } - - if (assetChunks.size() == 0) - continue; - - std::vector<uint32_t> vecAssetChunks; - for (std::set<uint32_t>::iterator itrChunk = assetChunks.begin(); itrChunk != assetChunks.end(); ++itrChunk) - { - vecAssetChunks.push_back(*itrChunk); - } - - selectedChunks.insert(std::make_pair(itrBlast->first, vecAssetChunks)); - } - - return selectedChunks; -} - -void SampleManager::clearChunksSelected() -{ - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itr = m_AssetFamiliesMap.begin(); - for (; itr != m_AssetFamiliesMap.end(); ++itr) - { - BlastAsset* pBlastAsset = itr->first; - std::vector<BlastFamily*>& fs = itr->second; - - for (BlastFamily* f : fs) - { - f->clearChunksSelected(); - } - } -} - -void SampleManager::setChunkSelected(std::vector<uint32_t> depths, bool selected) -{ - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itrBlast = m_AssetFamiliesMap.begin(); - for (; itrBlast != m_AssetFamiliesMap.end(); ++itrBlast) - { - std::vector<BlastFamily*>& families = itrBlast->second; - std::vector<BlastFamily*>::iterator itrFamily = families.begin(); - for (; itrFamily != families.end(); ++itrFamily) - { - (*itrFamily)->setChunkSelected(depths, selected); - } - } -} - -void SampleManager::setChunkVisible(std::vector<uint32_t> depths, bool bVisible) -{ - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itrBlast = m_AssetFamiliesMap.begin(); - for (; itrBlast != m_AssetFamiliesMap.end(); ++itrBlast) - { - std::vector<BlastFamily*>& families = itrBlast->second; - std::vector<BlastFamily*>::iterator itrFamily = families.begin(); - for (; itrFamily != families.end(); ++itrFamily) - { - (*itrFamily)->setChunkVisible(depths, bVisible); - } - } -} - -void SampleManager::setFractureExecutor(FractureExecutor* executor) -{ - m_fractureExecutor = executor; - if (executor) - { - executor->m_fractureTool = m_fTool; - if (executor->m_randomGenerator == nullptr) - executor->m_randomGenerator = &sRandomGenerator; - } -} - -void SampleManager::EnableStepforward(bool bStepforward) -{ - m_stepforward = bStepforward; -} - -void SampleManager::EnableSimulating(bool bSimulating) -{ - m_simulating = bSimulating; - m_stepforward = false; - m_physXController->setPaused(!m_simulating); - - if (!m_simulating) - { - m_damageToolController->DisableController(); -#if 0 - BlastSceneTree* pBlastSceneTree = BlastSceneTree::ins(); - if (pBlastSceneTree) - { - pBlastSceneTree->hideAllChunks(); - // make sure chunk0 shows. - std::vector<uint32_t> depths(1, 0); - pBlastSceneTree->setChunkVisible(depths, true); - // refresh in scene tree and viewport - //pBlastSceneTree->updateValues(false); - SampleManager::ins()->m_bNeedRefreshTree = true; - } -#endif - } -} - -#include <ViewerOutput.h> -void SampleManager::output(const char* str) -{ - viewer_msg("%s", str); -} - -void SampleManager::output(float value) -{ - viewer_msg("%f", value); -} - -void SampleManager::output(physx::PxVec3& vec) -{ - viewer_msg("%f,%f,%f", vec.x, vec.y, vec.z); -} - -void SampleManager::clearScene() -{ - m_gizmoToolController->resetPos(); - /* - BPPAssetArray& assets = BlastProject::ins().getParams().blast.blastAssets; - int assetSize = assets.arraySizes[0]; - for (int as = 0; as < assetSize; as++) - { - BPPAsset& asset = assets.buf[as]; - BlastSceneTree::ins()->removeBlastInstances(asset); - BlastSceneTree::ins()->removeBlastAsset(asset); - } - BlastSceneTree::ins()->clearProjectile(); - */ - m_sceneController->ClearScene(); - - EnableSimulating(false); - - std::map<std::string, RenderMaterial*>::iterator itRenderMaterial; - for (itRenderMaterial = m_RenderMaterialMap.begin(); - itRenderMaterial != m_RenderMaterialMap.end(); itRenderMaterial++) - { - RenderMaterial* pRenderMaterial = itRenderMaterial->second; - delete pRenderMaterial; - pRenderMaterial = nullptr; - } - m_RenderMaterialMap.clear(); - - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itAssetFamilies; - for (itAssetFamilies = m_AssetFamiliesMap.begin(); - itAssetFamilies != m_AssetFamiliesMap.end(); itAssetFamilies++) - { - std::vector<BlastFamily*>& fs = itAssetFamilies->second; - fs.clear(); - } - m_AssetFamiliesMap.clear(); - m_AssetDescMap.clear(); - m_instanceFamilyMap.clear(); - - physx::PxVec3 zero(0.0f, 0.0f, 0.0f); - m_assetExtents = zero; - - m_bNeedRefreshTree = true; - - m_pCurBlastAsset = nullptr; - m_nCurFamilyIndex = -1; - - SimpleScene::Inst()->m_pCamera->SetDefaults(); -} - -void SampleManager::resetScene() -{ - std::map<BPPAssetInstance*, std::set<uint32_t>> selectChunks; - - if (m_selectionToolController->IsEnabled()) - { - std::set<PxActor*> actors = m_selectionToolController->getTargetActors(); - for (PxActor* actor : actors) - { - BlastFamily* pBlastFamily = m_blastController->getFamilyByPxActor(*actor); - if (pBlastFamily) - { - BPPAssetInstance* assetInstance = getInstanceByFamily(pBlastFamily); - uint32_t chunkIndex = pBlastFamily->getChunkIndexByPxActor(*actor); - selectChunks[assetInstance].insert(chunkIndex); - } - } - } - else if (m_gizmoToolController->IsEnabled()) - { - PxActor* actor = m_gizmoToolController->getTargetActor(); - - if (actor) - { - BlastFamily* pBlastFamily = m_blastController->getFamilyByPxActor(*actor); - if (pBlastFamily) - { - BPPAssetInstance* assetInstance = getInstanceByFamily(pBlastFamily); - uint32_t chunkIndex = pBlastFamily->getChunkIndexByPxActor(*actor); - selectChunks[assetInstance].insert(chunkIndex); - } - } - } - - m_selectionToolController->clearSelect(); - /* - std::map<BPPAssetInstance*, BlastFamily*>::iterator itIFM; - for (itIFM = m_instanceFamilyMap.begin(); itIFM != m_instanceFamilyMap.end(); itIFM++) - { - BPPAssetInstance* pInstance = itIFM->first; - BlastSceneTree::ins()->removeBlastInstance(*pInstance); - } - BlastSceneTree::ins()->clearProjectile(); - */ - getSceneController().ResetScene(); - EnableSimulating(false); - /* - for (itIFM = m_instanceFamilyMap.begin(); itIFM != m_instanceFamilyMap.end(); itIFM++) - { - BPPAssetInstance* pInstance = itIFM->first; - BlastSceneTree::ins()->addBlastInstance(*pInstance); - } - */ - std::set<PxActor*> actors; - for (std::map<BPPAssetInstance*, std::set<uint32_t>>::iterator itr = selectChunks.begin(); itr != selectChunks.end(); ++itr) - { - BlastFamily* family = getFamilyByInstance(itr->first); - std::set<uint32_t>& chunkIndexes = itr->second; - - if (nullptr != family) - { - for (uint32_t chunkIndex : chunkIndexes) - { - PxActor* actor = nullptr; - family->getPxActorByChunkIndex(chunkIndex, &actor); - - if (actor) - actors.insert(actor); - } - } - } - - if (m_selectionToolController->IsEnabled()) - { - m_selectionToolController->setTargetActors(actors); - } - else if (m_gizmoToolController->IsEnabled()) - { - if (actors.size() > 0) - m_gizmoToolController->setTargetActor(*actors.begin()); - } - - // reset scene should not restore camera - //SimpleScene::Inst()->m_pCamera->SetDefaults(); -} - -bool isChunkVisible(std::vector<BlastFamily*>& fs, uint32_t chunkIndex) -{ - int fsSize = fs.size(); - if (fsSize == 0) - { - return true; - } - - bool visible = false; - for (int i = 0; i < fsSize; i++) - { - if (fs[i]->isChunkVisible(chunkIndex)) - { - visible = true; - break; - } - } - return visible; -} - -void SampleManager::_setSourceAsset() -{ - std::vector<BlastFamilyPtr>& families = m_blastController->getFamilies(); - if (families.size() > 0) - { - BlastFamilyPtr spLastFamily = families.back(); - - m_fTool->setSourceAsset(&(spLastFamily->getBlastAsset())); - } -} - -BlastFamily* SampleManager::getFamilyByInstance(BPPAssetInstance* instance) -{ - if (instance) - { - if (m_instanceFamilyMap.find(instance) != m_instanceFamilyMap.end()) - { - return m_instanceFamilyMap[instance]; - } - } - return nullptr; -} - -BPPAssetInstance* SampleManager::getInstanceByFamily(BlastFamily* family) -{ - if (family) - { - std::map<BPPAssetInstance*, BlastFamily*>::iterator itr = m_instanceFamilyMap.begin(); - for (; itr != m_instanceFamilyMap.end(); ++itr) - { - if (itr->second == family) - { - return itr->first; - } - } - } - return nullptr; -} - -void SampleManager::updateFamily(BlastFamily* oldFamily, BlastFamily* newFamily) -{ - if (oldFamily) - { - BPPAssetInstance* instance = getInstanceByFamily(oldFamily); - if (instance) - { - m_instanceFamilyMap[instance] = newFamily; - } - } -} - -void SampleManager::removeRenderMaterial(std::string name) -{ - if (name.empty()) - { - return; - } - - std::map<std::string, RenderMaterial*>::iterator it = m_RenderMaterialMap.find(name); - if (it != m_RenderMaterialMap.end()) - { - m_NeedDeleteRenderMaterials.push_back(name); - } -} - -void SampleManager::renameRenderMaterial(std::string oldName, std::string newName) -{ - if (oldName.empty() || newName.empty()) - { - return; - } - - std::map<std::string, RenderMaterial*>::iterator it = m_RenderMaterialMap.find(oldName); - if (it != m_RenderMaterialMap.end()) - { - RenderMaterial* pRenderMaterial = it->second; - m_RenderMaterialMap.erase(it); - pRenderMaterial->setMaterialName(newName); - m_RenderMaterialMap[newName] = pRenderMaterial; - } -} - -void SampleManager::reloadRenderMaterial(std::string name, float r, float g, float b, bool diffuse) -{ - if (name.empty()) - { - return; - } - - std::map<std::string, RenderMaterial*>::iterator it = m_RenderMaterialMap.find(name); - if (it != m_RenderMaterialMap.end()) - { - RenderMaterial* pRenderMaterial = it->second; - if (diffuse) - { - pRenderMaterial->setDiffuseColor(r, g, b); - } - else - { - pRenderMaterial->setSpecularColor(r, g, b); - } - } -} - -void SampleManager::reloadRenderMaterial(std::string name, std::string texture, RenderMaterial::TextureType tt) -{ - if (name.empty()) - { - return; - } - - std::map<std::string, RenderMaterial*>::iterator it = m_RenderMaterialMap.find(name); - if (it != m_RenderMaterialMap.end()) - { - RenderMaterial* pRenderMaterial = it->second; - pRenderMaterial->setTextureFileName(texture, tt); - } -} - -void SampleManager::reloadRenderMaterial(std::string name, float specularShininess) -{ - if (name.empty()) - { - return; - } - - std::map<std::string, RenderMaterial*>::iterator it = m_RenderMaterialMap.find(name); - if (it != m_RenderMaterialMap.end()) - { - RenderMaterial* pRenderMaterial = it->second; - pRenderMaterial->setSpecularShininess(specularShininess); - } -} - -RenderMaterial* SampleManager::getRenderMaterial(std::string name, bool create) -{ - if (name == "" || name == "None") - { - return RenderMaterial::getDefaultRenderMaterial(); - } - - std::map<std::string, RenderMaterial*>::iterator itRenderMaterial = m_RenderMaterialMap.find(name); - RenderMaterial* pRenderMaterial = nullptr; - if (itRenderMaterial != m_RenderMaterialMap.end()) - { - pRenderMaterial = itRenderMaterial->second; - } - else if(create) - { - ResourceManager* pResourceManager = ResourceManager::ins(); - - BPPGraphicsMaterial* pBPPGraphicsMaterial = BlastProject::ins().getGraphicsMaterial(name.c_str()); - - if (pBPPGraphicsMaterial == nullptr) - { - return RenderMaterial::getDefaultRenderMaterial(); - } - else if (pBPPGraphicsMaterial->diffuseTextureFilePath.buf != nullptr) - { - pRenderMaterial = new RenderMaterial(name.c_str(), *pResourceManager, - "model_simple_textured_ex", - pBPPGraphicsMaterial->diffuseTextureFilePath.buf); - pRenderMaterial->setDiffuseColor( - pBPPGraphicsMaterial->diffuseColor[0], - pBPPGraphicsMaterial->diffuseColor[1], - pBPPGraphicsMaterial->diffuseColor[2], - pBPPGraphicsMaterial->diffuseColor[3]); - } - else - { - pRenderMaterial = new RenderMaterial(name.c_str(), *pResourceManager, - "model_simple_textured_ex", - pBPPGraphicsMaterial->diffuseColor[0], - pBPPGraphicsMaterial->diffuseColor[1], - pBPPGraphicsMaterial->diffuseColor[2], - pBPPGraphicsMaterial->diffuseColor[3]); - } - - m_RenderMaterialMap[name] = pRenderMaterial; - } - return pRenderMaterial; -} - -void SampleManager::getCurrentSelectedInstance(BlastAsset** ppBlastAsset, int& index) -{ - *ppBlastAsset = m_pCurBlastAsset; - index = m_nCurFamilyIndex; -} - -void SampleManager::setCurrentSelectedInstance(BlastAsset* pBlastAsset, int index) -{ - m_pCurBlastAsset = pBlastAsset; - m_nCurFamilyIndex = index; - - MaterialAssignmentsPanel::ins()->updateValues(); - FileReferencesPanel::ins()->updateValues(); -} - -void SampleManager::getMaterialForCurrentFamily(std::string& name, bool externalSurface) -{ - name = ""; - - if (m_pCurBlastAsset == nullptr || m_nCurFamilyIndex < 0) - { - return; - } - - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator it = m_AssetFamiliesMap.find(m_pCurBlastAsset); - if (it == m_AssetFamiliesMap.end()) - { - return; - } - - std::vector<BlastFamily*>& fs = it->second; - int fsSize = fs.size(); - if (fsSize == 0 || fsSize <= m_nCurFamilyIndex) - { - return; - } - - BlastFamily* pBlastFamily = fs[m_nCurFamilyIndex]; - RenderMaterial* pRenderMaterial = nullptr; - pBlastFamily->getMaterial(&pRenderMaterial, externalSurface); - if (pRenderMaterial != nullptr) - { - name = pRenderMaterial->getMaterialName(); - if (name != "") - { - return; - } - } - - AssetList::ModelAsset modelAsset = m_AssetDescMap[m_pCurBlastAsset]; - int assetID = BlastProject::ins().getAssetIDByName(modelAsset.name.c_str()); - BPPAssetInstance* instance = BlastProject::ins().getAssetInstance(assetID, m_nCurFamilyIndex); - if (externalSurface && instance->exMaterial.buf != nullptr) - { - name = instance->exMaterial.buf; - } - else if (!externalSurface && instance->inMaterial.buf != nullptr) - { - name = instance->inMaterial.buf; - } -} - -void SampleManager::setMaterialForCurrentFamily(std::string name, bool externalSurface) -{ - if (m_pCurBlastAsset == nullptr || m_nCurFamilyIndex < 0) - { - return; - } - - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator it = m_AssetFamiliesMap.find(m_pCurBlastAsset); - if (it == m_AssetFamiliesMap.end()) - { - return; - } - - std::vector<BlastFamily*>& fs = it->second; - int fsSize = fs.size(); - if (fsSize == 0 || fsSize <= m_nCurFamilyIndex) - { - return; - } - - RenderMaterial* pRenderMaterial = getRenderMaterial(name); - - BlastFamily* pBlastFamily = fs[m_nCurFamilyIndex]; - pBlastFamily->setMaterial(pRenderMaterial, externalSurface); - - AssetList::ModelAsset modelAsset = m_AssetDescMap[m_pCurBlastAsset]; - int assetID = BlastProject::ins().getAssetIDByName(modelAsset.name.c_str()); - BPPAssetInstance* instance = BlastProject::ins().getAssetInstance(assetID, m_nCurFamilyIndex); - if (externalSurface) - { - copy(instance->exMaterial, name.c_str()); - } - else - { - copy(instance->inMaterial, name.c_str()); - } -} - -#if 0 -void SampleManager::applyAssetToProjectParam(BlastAsset* pBlastAsset, bool addTo) -{ - BlastAssetModel* assetModel = dynamic_cast<BlastAssetModel*>(pBlastAsset); - - BPPBlast& blast = BlastProject::ins().getParams().blast; - - std::map<BlastAsset*, std::vector<BlastFamily*>>& AssetFamiliesMap = getAssetFamiliesMap(); - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = getAssetDescMap(); - - AssetList::ModelAsset desc = AssetDescMap[pBlastAsset]; - std::vector<BlastFamily*>& fs = AssetFamiliesMap[pBlastAsset]; - - BlastController& blastController = getBlastController(); - SceneController& sceneController = getSceneController(); - - char str[MAX_PATH]; - - // asset array - BPPAssetArray assetArray; - assetArray.arraySizes[0] = 1; - assetArray.buf = new BPPAsset[1]; - BPPAsset& asset = assetArray.buf[0]; - ::init(asset); - copy(asset.name, desc.name.c_str()); - if (addTo) - { - asset.ID = BlastProject::ins().generateNewAssetID(); - merge(blast.blastAssets, assetArray); - } - else - { - asset.ID = BlastProject::ins().getAssetIDByName(asset.name.buf); - apart(blast.blastAssets, assetArray); - } - - const ExtPxAsset* pExtPxAsset = pBlastAsset->getPxAsset(); - const ExtPxChunk* pExtPxChunk = pExtPxAsset->getChunks(); - - const TkAsset& tkAsset = pExtPxAsset->getTkAsset(); - uint32_t chunkCount = tkAsset.getChunkCount(); - const NvBlastChunk* pNvBlastChunk = tkAsset.getChunks(); - uint32_t bondCount = tkAsset.getBondCount(); - const NvBlastBond* pNvBlastBond = tkAsset.getBonds(); - - const NvBlastSupportGraph supportGraph = tkAsset.getGraph(); - uint32_t* chunkIndices = supportGraph.chunkIndices; - uint32_t* adjacencyPartition = supportGraph.adjacencyPartition; - uint32_t* adjacentNodeIndices = supportGraph.adjacentNodeIndices; - uint32_t* adjacentBondIndices = supportGraph.adjacentBondIndices; - - std::vector<bool> isSupports(chunkCount); - isSupports.assign(chunkCount, false); - std::vector<uint32_t> fromIDs(bondCount); - std::vector<uint32_t> toIDs(bondCount); - fromIDs.assign(bondCount, -1); - toIDs.assign(bondCount, -1); - - for (uint32_t node0 = 0; node0 < supportGraph.nodeCount; ++node0) - { - const uint32_t chunkIndex0 = supportGraph.chunkIndices[node0]; - if (chunkIndex0 >= chunkCount) - { - continue; - } - - isSupports[chunkIndex0] = true; - - for (uint32_t adjacencyIndex = adjacencyPartition[node0]; adjacencyIndex < adjacencyPartition[node0 + 1]; adjacencyIndex++) - { - uint32_t node1 = supportGraph.adjacentNodeIndices[adjacencyIndex]; - - // add this condition if you don't want to iterate all bonds twice - if (node0 > node1) - continue; - - const uint32_t chunkIndex1 = supportGraph.chunkIndices[node1]; - - uint32_t bondIndex = supportGraph.adjacentBondIndices[adjacencyIndex]; - - if (chunkIndex0 < chunkIndex1) - { - fromIDs[bondIndex] = chunkIndex0; - toIDs[bondIndex] = chunkIndex1; - } - else - { - fromIDs[bondIndex] = chunkIndex1; - toIDs[bondIndex] = chunkIndex0; - } - } - } - - // chunks - BPPChunkArray chunkArray; - { - chunkArray.buf = new BPPChunk[chunkCount]; - chunkArray.arraySizes[0] = chunkCount; - char chunkname[10]; - 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::string strChunkName = "Chunk"; - 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; - chunk.ID = cc; - chunk.parentID = pNvBlastChunk[cc].parentChunkIndex; - chunk.staticFlag = pExtPxChunk[cc].isStatic; - chunk.visible = isChunkVisible(fs, cc); - chunk.support = isSupports[cc]; - - if (assetModel != nullptr) - { - const BlastModel& model = assetModel->getModel(); - - BPPGraphicsMesh& graphicsMesh = chunk.graphicsMesh; - ::init(graphicsMesh); - - const BlastModel::Chunk& chunk = model.chunks[cc]; - - const std::vector<BlastModel::Chunk::Mesh>& meshes = chunk.meshes; - int meshSize = meshes.size(); - - if (meshSize == 0) - { - continue; - } - - std::vector<physx::PxVec3> positions; - std::vector<physx::PxVec3> normals; - std::vector<physx::PxVec2> uv; - std::vector<uint32_t> ind; - std::vector<int> faceBreakPoint; - std::vector<uint32_t> materialIndexes; - uint16_t curIndex = 0; - for (int ms = 0; ms < meshSize; ms++) - { - const BlastModel::Chunk::Mesh& mesh = meshes[ms]; - materialIndexes.push_back(mesh.materialIndex); - const SimpleMesh& simpleMesh = mesh.mesh; - const std::vector<SimpleMesh::Vertex>& vertices = simpleMesh.vertices; - const std::vector<uint16_t>& indices = simpleMesh.indices; - - int NumVertices = vertices.size(); - for (uint32_t i = 0; i < NumVertices; ++i) - { - positions.push_back(physx::PxVec3(vertices[i].position.x, vertices[i].position.y, vertices[i].position.z)); - normals.push_back(physx::PxVec3(vertices[i].normal.x, vertices[i].normal.y, vertices[i].normal.z)); - uv.push_back(physx::PxVec2(vertices[i].uv.x, vertices[i].uv.y)); - } - int NumIndices = indices.size(); - for (uint32_t i = 0; i < NumIndices; ++i) - { - ind.push_back(indices[i] + curIndex); - } - curIndex += NumIndices; - faceBreakPoint.push_back(NumIndices / 3); - } - - graphicsMesh.materialAssignments.buf = new BPPMaterialAssignments[materialIndexes.size()]; - graphicsMesh.materialAssignments.arraySizes[0] = materialIndexes.size(); - for (size_t i = 0; i < materialIndexes.size(); ++i) - { - BPPMaterialAssignments& assignment = graphicsMesh.materialAssignments.buf[i]; - assignment.libraryMaterialID = materialIndexes[i]; - assignment.faceMaterialID = materialIndexes[i]; - } - - graphicsMesh.positions.buf = new nvidia::NvVec3[positions.size()]; - graphicsMesh.positions.arraySizes[0] = positions.size(); - for (size_t i = 0; i < positions.size(); ++i) - { - nvidia::NvVec3& item = graphicsMesh.positions.buf[i]; - item.x = positions[i].x; - item.y = positions[i].y; - item.z = positions[i].z; - } - - graphicsMesh.normals.buf = new nvidia::NvVec3[normals.size()]; - graphicsMesh.normals.arraySizes[0] = normals.size(); - for (size_t i = 0; i < normals.size(); ++i) - { - nvidia::NvVec3& item = graphicsMesh.normals.buf[i]; - item.x = normals[i].x; - item.y = normals[i].y; - item.z = normals[i].z; - } - - graphicsMesh.texcoords.buf = new nvidia::NvVec2[uv.size()]; - graphicsMesh.texcoords.arraySizes[0] = uv.size(); - for (size_t i = 0; i < uv.size(); ++i) - { - nvidia::NvVec2& item = graphicsMesh.texcoords.buf[i]; - item.x = uv[i].x; - item.y = uv[i].y; - } - - size_t indexCount = ind.size(); - size_t faceCount = ind.size() / 3; - - graphicsMesh.vertextCountInFace = 3; - - graphicsMesh.positionIndexes.buf = new int32_t[indexCount]; - graphicsMesh.positionIndexes.arraySizes[0] = indexCount; - - graphicsMesh.normalIndexes.buf = new int32_t[indexCount]; - graphicsMesh.normalIndexes.arraySizes[0] = indexCount; - - graphicsMesh.texcoordIndexes.buf = new int32_t[indexCount]; - graphicsMesh.texcoordIndexes.arraySizes[0] = indexCount; - - graphicsMesh.materialIDs.buf = new int32_t[faceCount]; - graphicsMesh.materialIDs.arraySizes[0] = faceCount; - - for (size_t i = 0; i < indexCount; ++i) - { - graphicsMesh.positionIndexes.buf[i] = ind[i]; - graphicsMesh.normalIndexes.buf[i] = ind[i]; - graphicsMesh.texcoordIndexes.buf[i] = ind[i]; - /* - size_t j = 0; - for (; j < faceBreakPoint.size(); ++j) - { - if (i < faceBreakPoint[j]) - break; - } - graphicsMesh.materialIDs.buf[i / 3] = j; - */ - } - - for (size_t f = 0; f < faceCount; f++) - { - int32_t ex = f < faceBreakPoint[0] ? 0 : 1; - graphicsMesh.materialIDs.buf[f] = ex; - } - } - } - - if (addTo) - { - merge(blast.chunks, chunkArray); - } - else - { - apart(blast.chunks, chunkArray); - } - } - - // bonds - BPPBondArray bondArray; - { - bondArray.buf = new BPPBond[bondCount]; - bondArray.arraySizes[0] = bondCount; - char bondname[10]; - bool visible; - for (int bc = 0; bc < bondCount; ++bc) - { - BPPBond& bond = bondArray.buf[bc]; - bond.name.buf = nullptr; - ::init(bond); - - visible = isChunkVisible(fs, fromIDs[bc]) || isChunkVisible(fs, toIDs[bc]); - bond.visible = visible; - bond.fromChunk = fromIDs[bc]; - bond.toChunk = toIDs[bc]; - - sprintf(bondname, "Bond_%d_%d", bond.fromChunk, bond.toChunk); - copy(bond.name, bondname); - bond.asset = asset.ID; - - bond.support.healthMask.buf = nullptr; - bond.support.bondStrength = 1.0; - bond.support.enableJoint = false; - } - - if (addTo) - { - merge(blast.bonds, bondArray); - } - else - { - apart(blast.bonds, bondArray); - } - } - - freeBlast(bondArray); - freeBlast(chunkArray); - freeBlast(assetArray); - - m_bNeedRefreshTree = true; -} -#endif - -void SampleManager::updateAssetFamilyStressSolver(BPPAsset* bppAsset, BPPStressSolver& stressSolver) -{ - if (nullptr == bppAsset || nullptr == bppAsset->name.buf || 0 == strlen(bppAsset->name.buf)) - return; - - BlastAsset* blastAsset = nullptr; - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itr = m_AssetDescMap.begin(); - for (; itr != m_AssetDescMap.end(); ++itr) - { - if (itr->second.name == bppAsset->name.buf) - { - blastAsset = itr->first; - break; - } - } - - if (nullptr == blastAsset) - return; - - std::vector<BlastFamily*>& families = m_AssetFamiliesMap[blastAsset]; - - for (BlastFamily* family : families) - { - BlastFamily::Settings settings = family->getSettings(); - - ExtStressSolverSettings & stressSolverSettings = settings.stressSolverSettings; - stressSolverSettings.hardness = stressSolver.hardness; - stressSolverSettings.stressLinearFactor = stressSolver.linearFactor; - stressSolverSettings.stressAngularFactor = stressSolver.angularFactor; - stressSolverSettings.bondIterationsPerFrame = stressSolver.bondIterationsPerFrame; - stressSolverSettings.graphReductionLevel = stressSolver.graphReductionLevel; - family->setSettings(settings); - } -} - -void SampleManager::updateModelMeshToProjectParam(BlastAsset* pBlastAsset) -{ - BlastProject& project = BlastProject::ins(); - BlastAssetModel* assetModel = dynamic_cast<BlastAssetModel*>(pBlastAsset); - BPPBlast& blast = project.getParams().blast; - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = getAssetDescMap(); - AssetList::ModelAsset desc = AssetDescMap[pBlastAsset]; - - int assetId = project.getAssetIDByName(desc.name.c_str()); - if (-1 == assetId) - return; - - std::vector<BPPChunk*> chunks = project.getChildrenChunks(assetId); - - BPPChunk& chunk = *chunks[0];//unfracture model only has one chunk - - if (assetModel != nullptr) - { - const BlastModel& model = assetModel->getModel(); - - BPPGraphicsMesh& graphicsMesh = chunk.graphicsMesh; - - const BlastModel::Chunk& chunk = model.chunks[0];//unfracture model only has one chunk - - const std::vector<BlastModel::Chunk::Mesh>& meshes = chunk.meshes; - int meshSize = meshes.size(); - - if (meshSize == 0) - { - return; - } - - std::vector<physx::PxVec3> positions; - for (int ms = 0; ms < meshSize; ms++) - { - const BlastModel::Chunk::Mesh& mesh = meshes[ms]; - const SimpleMesh& simpleMesh = mesh.mesh; - const std::vector<SimpleMesh::Vertex>& vertices = simpleMesh.vertices; - - int NumVertices = vertices.size(); - for (uint32_t i = 0; i < NumVertices; ++i) - { - positions.push_back(physx::PxVec3(vertices[i].position.x, vertices[i].position.y, vertices[i].position.z)); - } - } - - for (size_t i = 0; i < positions.size(); ++i) - { - nvidia::NvVec3& item = graphicsMesh.positions.buf[i]; - item.x = positions[i].x; - item.y = positions[i].y; - item.z = positions[i].z; - } - } -} - -#if 0 -void SampleManager::applyFamilyToProjectParam(BlastFamily* pBlastFamily, bool addTo) -{ - const BlastAsset& blastAsset = pBlastFamily->getBlastAsset(); - BlastAsset* pBlastAsset = (BlastAsset*)&blastAsset; - - std::vector<BlastFamily*>& fs = m_AssetFamiliesMap[pBlastAsset]; - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = getAssetDescMap(); - AssetList::ModelAsset desc = AssetDescMap[pBlastAsset]; - - const BlastFamily::Settings& familySetting = pBlastFamily->getSettings(); - physx::PxTransform transform = familySetting.transform; - - char str[MAX_PATH]; - - BPPBlast& blast = BlastProject::ins().getParams().blast; - int assetID = BlastProject::ins().getAssetIDByName(desc.name.c_str()); - - // instance array - BPPAssetInstanceArray instanceArray; - instanceArray.arraySizes[0] = 1; - instanceArray.buf = new BPPAssetInstance[1]; - BPPAssetInstance& instance = instanceArray.buf[0]; - if (addTo) - { - ::init(instance); - int instanceIndex = fs.size() - 1; - sprintf(str, "%s_%d", desc.name.c_str(), instanceIndex); - copy(instance.name, str); - instance.asset = assetID; - PxVec3 p = transform.p; - PxQuat q = transform.q; - instance.transform.position = nvidia::NvVec3(p.x, p.y, p.z); - instance.transform.rotation = nvidia::NvVec4(q.x, q.y, q.z, q.w); - } - else - { - BPPAssetInstance* pInstance = getInstanceByFamily(pBlastFamily); - copy(instance, *pInstance); - } - - std::vector<BPPAssetInstance*> instances; - BlastProject::ins().getAssetInstances(assetID, instances); - int instanceSize = instances.size(); - std::vector<std::string> instanceNames(instanceSize); - std::vector<BlastFamily*> instanceFamilys(instanceSize); - for (int is = 0; is < instanceSize; is++) - { - instanceNames[is] = instances[is]->name; - instanceFamilys[is] = m_instanceFamilyMap[instances[is]]; - m_instanceFamilyMap.erase(m_instanceFamilyMap.find(instances[is])); - } - - if (addTo) - { - merge(blast.blastAssetInstances, instanceArray); - instanceNames.push_back(str); - instanceFamilys.push_back(pBlastFamily); - - std::vector<BPPChunk*> chunks = BlastProject::ins().getChildrenChunks(assetID); - for (size_t i = 0; i < chunks.size(); ++i) - { - chunks[i]->visible = isChunkVisible(fs, i); - } - } - else - { - apart(blast.blastAssetInstances, instanceArray); - } - - instanceSize = instanceNames.size(); - for (int is = 0; is < instanceSize; is++) - { - BPPAssetInstance* curInstance = BlastProject::ins().getAssetInstance(assetID, instanceNames[is].c_str()); - if (curInstance != nullptr) - { - m_instanceFamilyMap[curInstance] = instanceFamilys[is]; - } - } - - freeBlast(instanceArray); - - m_bNeedRefreshTree = true; -} -#endif - -BlastAsset* SampleManager::loadBlastFile(std::string dir, std::string file, AssetList::ModelAsset modelAsset) -{ - GlobalSettings::Inst().m_projectFileDir = dir; - GlobalSettings::Inst().m_projectFileName = file; - - TkFramework& framework = getBlastController().getTkFramework(); - PxPhysics& physics = getPhysXController().getPhysics(); - PxCooking& cooking = getPhysXController().getCooking(); - Renderer& renderer = getRenderer(); - ExtSerialization& serialization = *getBlastController().getExtSerialization(); - - BlastAssetModelSimple* pBlastAssetModelSimple = new BlastAssetModelSimple( - framework, physics, cooking, serialization, renderer, file.c_str()); - - addBlastAsset(pBlastAssetModelSimple, modelAsset); - - return pBlastAssetModelSimple; -} - -void SampleManager::addBlastAsset(BlastAssetModelSimple* pBlastAssetModelSimple, AssetList::ModelAsset modelAsset, bool inProject) -{ - // 1 - m_AssetDescMap[pBlastAssetModelSimple] = modelAsset; - m_AssetFamiliesMap[pBlastAssetModelSimple].clear(); - pBlastAssetModelSimple->initialize(); - - // 2 - m_sceneController->addBlastAsset(pBlastAssetModelSimple, modelAsset); - - if (!inProject) - { - // 3 - _addAssetToProjectParam(pBlastAssetModelSimple); - } - - //4 - const BlastModel& model = pBlastAssetModelSimple->getModel(); - const physx::PxVec3 extent = (model.bbMax - model.bbMin) * 0.5f; - atcore_float3 max = gfsdk_max(*(atcore_float3*)&m_assetExtents, *(atcore_float3*)&(extent)); - m_assetExtents = *(physx::PxVec3*)&max; - - getGizmoToolController().setAxisLength(m_assetExtents.magnitude()); - - m_bNeedRefreshTree = true; - /* - BPPAsset* pBPPAsset = BlastProject::ins().getAsset(modelAsset.name.c_str()); - BlastSceneTree::ins()->addBlastAsset(*pBPPAsset); - */ -} - -void SampleManager::removeBlastAsset(BlastAssetModelSimple* pBlastAssetModelSimple) -{ - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = m_AssetDescMap.find(pBlastAssetModelSimple); - /* - AssetList::ModelAsset modelAsset = itADM->second; - BPPAsset* pBPPAsset = BlastProject::ins().getAsset(modelAsset.name.c_str()); - BlastSceneTree::ins()->removeBlastInstances(*pBPPAsset); - BlastSceneTree::ins()->removeBlastAsset(*pBPPAsset); - */ - // 3 - _removeInstancesFromProjectParam(pBlastAssetModelSimple); - _removeAssetFromProjectParam(pBlastAssetModelSimple); - - // 2 - m_sceneController->removeBlastAsset(pBlastAssetModelSimple); - - _refreshInstanceFamilyMap(); - - // 1 - m_AssetDescMap.erase(itADM); - - m_bNeedRefreshTree = true; -} - -BlastFamily* SampleManager::addBlastFamily(BlastAsset* pBlastAsset, physx::PxTransform transform, bool inProject) -{ - if (pBlastAsset == nullptr) - { - return nullptr; - } - - BlastFamily* pBlastFamily = m_sceneController->addBlastFamily(pBlastAsset, transform); - - if (!inProject) - { - _addInstanceToProjectParam(pBlastFamily); - } - - _refreshInstanceFamilyMap(); - /* - BPPAssetInstance* pBPPAssetInstance = getInstanceByFamily(pBlastFamily); - BlastSceneTree::ins()->addBlastInstance(*pBPPAssetInstance); - */ - /* - AssetList::ModelAsset modelAsset = m_AssetDescMap[pBlastAsset]; - int assetID = BlastProject::ins().getAssetIDByName(modelAsset.name.c_str()); - std::vector<BPPAssetInstance*> instances; - BlastProject::ins().getAssetInstances(assetID, instances); - std::vector<BlastFamily*> families = m_AssetFamiliesMap[pBlastAsset]; - int familiesSize = families.size(); - for (int fs = 0; fs < familiesSize; fs++) - { - m_instanceFamilyMap.insert(std::make_pair(instances[fs], families[fs])); - } - */ - // should not quit here. we still need set up right bounding extent - m_bNeedRefreshTree = true; - return pBlastFamily; -} - -bool SampleManager::removeBlastFamily(BlastAsset* pBlastAsset, int nFamilyIndex) -{ - if (pBlastAsset == nullptr) - { - return false; - } - - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itAFM = m_AssetFamiliesMap.find(pBlastAsset); - if (itAFM == m_AssetFamiliesMap.end()) - { - return false; - } - - std::vector<BlastFamily*> families = itAFM->second; - int familySize = families.size(); - if (familySize == 0 || familySize <= nFamilyIndex) - { - return false; - } - - _removeInstanceFromProjectParam(families[nFamilyIndex]); - /* - BPPAssetInstance* pBPPAssetInstance = getInstanceByFamily(families[nFamilyIndex]); - BlastSceneTree::ins()->addBlastInstance(*pBPPAssetInstance); - */ - m_sceneController->removeBlastFamily(pBlastAsset, nFamilyIndex); - - _refreshInstanceFamilyMap(); - m_bNeedRefreshTree = true; - return true; -} - -void SampleManager::refreshAsset(BlastAsset* pBlastAsset) -{ - m_fTool->setSourceAsset(pBlastAsset); - m_fTool->finalizeFracturing(); - - std::map<BlastAsset*, AssetList::ModelAsset>::iterator it = m_AssetDescMap.find(pBlastAsset); - AssetList::ModelAsset desc = it->second; - - int nChunkCount = pBlastAsset->getPxAsset()->getChunkCount(); - int nBondCount = pBlastAsset->getPxAsset()->getTkAsset().getBondCount(); - - std::vector<bool> supports(nChunkCount); - std::vector<bool> statics(nChunkCount); - - int nCur = 0; - - BPPBlast& blast = BlastProject::ins().getParams().blast; - int assetID = BlastProject::ins().getAssetIDByName(desc.name.c_str()); - int chunkSize = blast.chunks.arraySizes[0]; - for (int cs = 0; cs < chunkSize; cs++) - { - BPPChunk& chunk = blast.chunks.buf[cs]; - if (chunk.asset == assetID) - { - supports[nCur] = chunk.support; - statics[nCur] = chunk.staticFlag; - nCur++; - } - } - - if (nCur != nChunkCount) - { - assert("chunk size not right"); - } - - nCur = 0; - - std::vector<uint8_t> joints(nBondCount); - std::vector<uint32_t> worlds(nBondCount); - int bondSize = blast.bonds.arraySizes[0]; - for (int bs = 0; bs < bondSize; bs++) - { - BPPBond& bond = blast.bonds.buf[bs]; - if (bond.asset == assetID) - { - joints[nCur] = bond.support.enableJoint; - worlds[nCur] = bond.toChunk; - nCur++; - } - } - - if (nCur != nBondCount) - { - assert("bond size not right"); - } - - _replaceAsset(pBlastAsset, supports, statics, joints, worlds); -} - -void SampleManager::UpdateCamera() -{ - m_renderer->UpdateCamera(); -} - -void SampleManager::ResetUpDir(bool zup) -{ - m_physXController->ResetUpDir(zup); -} - -void SampleManager::_addAssetToProjectParam(BlastAsset* pBlastAsset) -{ - BlastAssetModel* assetModel = dynamic_cast<BlastAssetModel*>(pBlastAsset); - - BPPBlast& blast = BlastProject::ins().getParams().blast; - - std::map<BlastAsset*, std::vector<BlastFamily*>>& AssetFamiliesMap = getAssetFamiliesMap(); - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = getAssetDescMap(); - - AssetList::ModelAsset desc = AssetDescMap[pBlastAsset]; - std::vector<BlastFamily*>& fs = AssetFamiliesMap[pBlastAsset]; - - BlastController& blastController = getBlastController(); - SceneController& sceneController = getSceneController(); - - char str[MAX_PATH]; - - // asset array - BPPAssetArray assetArray; - assetArray.arraySizes[0] = 1; - assetArray.buf = new BPPAsset[1]; - BPPAsset& asset = assetArray.buf[0]; - ::init(asset); - copy(asset.name, desc.name.c_str()); - asset.ID = BlastProject::ins().generateNewAssetID(); - merge(blast.blastAssets, assetArray); - - const ExtPxAsset* pExtPxAsset = pBlastAsset->getPxAsset(); - const ExtPxChunk* pExtPxChunk = pExtPxAsset->getChunks(); - - const TkAsset& tkAsset = pExtPxAsset->getTkAsset(); - uint32_t chunkCount = tkAsset.getChunkCount(); - const NvBlastChunk* pNvBlastChunk = tkAsset.getChunks(); - uint32_t bondCount = tkAsset.getBondCount(); - const NvBlastBond* pNvBlastBond = tkAsset.getBonds(); - - const NvBlastSupportGraph supportGraph = tkAsset.getGraph(); - uint32_t* chunkIndices = supportGraph.chunkIndices; - uint32_t* adjacencyPartition = supportGraph.adjacencyPartition; - uint32_t* adjacentNodeIndices = supportGraph.adjacentNodeIndices; - uint32_t* adjacentBondIndices = supportGraph.adjacentBondIndices; - - std::vector<bool> isSupports(chunkCount); - isSupports.assign(chunkCount, false); - std::vector<uint32_t> fromIDs(bondCount); - std::vector<uint32_t> toIDs(bondCount); - fromIDs.assign(bondCount, -1); - toIDs.assign(bondCount, -1); - - for (uint32_t node0 = 0; node0 < supportGraph.nodeCount; ++node0) - { - const uint32_t chunkIndex0 = supportGraph.chunkIndices[node0]; - if (chunkIndex0 >= chunkCount) - { - continue; - } - - isSupports[chunkIndex0] = true; - - for (uint32_t adjacencyIndex = adjacencyPartition[node0]; adjacencyIndex < adjacencyPartition[node0 + 1]; adjacencyIndex++) - { - uint32_t node1 = supportGraph.adjacentNodeIndices[adjacencyIndex]; - - // add this condition if you don't want to iterate all bonds twice - if (node0 > node1) - continue; - - const uint32_t chunkIndex1 = supportGraph.chunkIndices[node1]; - - uint32_t bondIndex = supportGraph.adjacentBondIndices[adjacencyIndex]; - - if (chunkIndex0 < chunkIndex1) - { - fromIDs[bondIndex] = chunkIndex0; - toIDs[bondIndex] = chunkIndex1; - } - else - { - fromIDs[bondIndex] = chunkIndex1; - toIDs[bondIndex] = chunkIndex0; - } - } - } - - // chunks - BPPChunkArray chunkArray; - { - chunkArray.buf = new BPPChunk[chunkCount]; - chunkArray.arraySizes[0] = chunkCount; - 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::string strChunkName = "Chunk"; - 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; - chunk.ID = cc; - chunk.parentID = pNvBlastChunk[cc].parentChunkIndex; - chunk.staticFlag = pExtPxChunk[cc].isStatic; - chunk.visible = isChunkVisible(fs, cc); - chunk.support = isSupports[cc]; - - if (assetModel != nullptr) - { - const BlastModel& model = assetModel->getModel(); - - BPPGraphicsMesh& graphicsMesh = chunk.graphicsMesh; - ::init(graphicsMesh); - - const BlastModel::Chunk& chunk = model.chunks[cc]; - - const std::vector<BlastModel::Chunk::Mesh>& meshes = chunk.meshes; - int meshSize = meshes.size(); - - if (meshSize == 0) - { - continue; - } - - std::vector<physx::PxVec3> positions; - std::vector<physx::PxVec3> normals; - std::vector<physx::PxVec3> tangents; - std::vector<physx::PxVec2> uv; - std::vector<uint32_t> ind; - std::vector<int> faceBreakPoint; - std::vector<uint32_t> materialIndexes; - uint16_t curIndex = 0; - for (int ms = 0; ms < meshSize; ms++) - { - const BlastModel::Chunk::Mesh& mesh = meshes[ms]; - materialIndexes.push_back(mesh.materialIndex); - const SimpleMesh& simpleMesh = mesh.mesh; - const std::vector<SimpleMesh::Vertex>& vertices = simpleMesh.vertices; - const std::vector<uint16_t>& indices = simpleMesh.indices; - - int NumVertices = vertices.size(); - for (uint32_t i = 0; i < NumVertices; ++i) - { - positions.push_back(physx::PxVec3(vertices[i].position.x, vertices[i].position.y, vertices[i].position.z)); - normals.push_back(physx::PxVec3(vertices[i].normal.x, vertices[i].normal.y, vertices[i].normal.z)); - tangents.push_back(physx::PxVec3(vertices[i].tangent.x, vertices[i].tangent.y, vertices[i].tangent.z)); - uv.push_back(physx::PxVec2(vertices[i].uv.x, vertices[i].uv.y)); - } - int NumIndices = indices.size(); - for (uint32_t i = 0; i < NumIndices; ++i) - { - ind.push_back(indices[i] + curIndex); - } - curIndex += NumVertices; - faceBreakPoint.push_back(NumIndices / 3); - } - - graphicsMesh.materialAssignments.buf = new BPPMaterialAssignments[materialIndexes.size()]; - graphicsMesh.materialAssignments.arraySizes[0] = materialIndexes.size(); - for (size_t i = 0; i < materialIndexes.size(); ++i) - { - BPPMaterialAssignments& assignment = graphicsMesh.materialAssignments.buf[i]; - assignment.libraryMaterialID = materialIndexes[i]; - assignment.faceMaterialID = materialIndexes[i]; - } - - graphicsMesh.positions.buf = new nvidia::NvVec3[positions.size()]; - graphicsMesh.positions.arraySizes[0] = positions.size(); - for (size_t i = 0; i < positions.size(); ++i) - { - nvidia::NvVec3& item = graphicsMesh.positions.buf[i]; - item.x = positions[i].x; - item.y = positions[i].y; - item.z = positions[i].z; - } - - graphicsMesh.normals.buf = new nvidia::NvVec3[normals.size()]; - graphicsMesh.normals.arraySizes[0] = normals.size(); - for (size_t i = 0; i < normals.size(); ++i) - { - nvidia::NvVec3& item = graphicsMesh.normals.buf[i]; - item.x = normals[i].x; - item.y = normals[i].y; - item.z = normals[i].z; - } - - graphicsMesh.tangents.buf = new nvidia::NvVec3[tangents.size()]; - graphicsMesh.tangents.arraySizes[0] = tangents.size(); - for (size_t i = 0; i < tangents.size(); ++i) - { - nvidia::NvVec3& item = graphicsMesh.tangents.buf[i]; - item.x = tangents[i].x; - item.y = tangents[i].y; - item.z = tangents[i].z; - } - - graphicsMesh.texcoords.buf = new nvidia::NvVec2[uv.size()]; - graphicsMesh.texcoords.arraySizes[0] = uv.size(); - for (size_t i = 0; i < uv.size(); ++i) - { - nvidia::NvVec2& item = graphicsMesh.texcoords.buf[i]; - item.x = uv[i].x; - item.y = uv[i].y; - } - - size_t indexCount = ind.size(); - size_t faceCount = ind.size() / 3; - - graphicsMesh.vertextCountInFace = 3; - - graphicsMesh.positionIndexes.buf = new int32_t[indexCount]; - graphicsMesh.positionIndexes.arraySizes[0] = indexCount; - - graphicsMesh.normalIndexes.buf = new int32_t[indexCount]; - graphicsMesh.normalIndexes.arraySizes[0] = indexCount; - - graphicsMesh.texcoordIndexes.buf = new int32_t[indexCount]; - graphicsMesh.texcoordIndexes.arraySizes[0] = indexCount; - - graphicsMesh.materialIDs.buf = new int32_t[faceCount]; - graphicsMesh.materialIDs.arraySizes[0] = faceCount; - - for (size_t i = 0; i < indexCount; ++i) - { - graphicsMesh.positionIndexes.buf[i] = ind[i]; - graphicsMesh.normalIndexes.buf[i] = ind[i]; - graphicsMesh.texcoordIndexes.buf[i] = ind[i]; - } - - for (size_t f = 0; f < faceCount; f++) - { - int32_t ex = f < faceBreakPoint[0] ? 0 : 1; - graphicsMesh.materialIDs.buf[f] = ex; - } - } - } - - merge(blast.chunks, chunkArray); - } - - // bonds - BPPBondArray bondArray; - { - bondArray.buf = new BPPBond[bondCount]; - bondArray.arraySizes[0] = bondCount; - char bondname[64]; - bool visible; - for (int bc = 0; bc < bondCount; ++bc) - { - BPPBond& bond = bondArray.buf[bc]; - bond.name.buf = nullptr; - ::init(bond); - - visible = isChunkVisible(fs, fromIDs[bc]) || isChunkVisible(fs, toIDs[bc]); - bond.visible = visible; - bond.fromChunk = fromIDs[bc]; - bond.toChunk = toIDs[bc]; - - if (bond.toChunk == 0xFFFFFFFF) - { - sprintf(bondname, "Bond_%d_world", bond.fromChunk); - } - else - { - sprintf(bondname, "Bond_%d_%d", bond.fromChunk, bond.toChunk); - } - copy(bond.name, bondname); - bond.asset = asset.ID; - - bond.support.healthMask.buf = nullptr; - bond.support.bondStrength = 1.0; - bond.support.enableJoint = false; - } - - merge(blast.bonds, bondArray); - } - - freeBlast(bondArray); - freeBlast(chunkArray); - freeBlast(assetArray); - - m_bNeedRefreshTree = true; -} - -void SampleManager::_removeAssetFromProjectParam(BlastAsset* pBlastAsset) -{ - if (pBlastAsset == nullptr) - { - return; - } - - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = m_AssetDescMap.find(pBlastAsset); - if (itADM == m_AssetDescMap.end()) - { - return; - } - - AssetList::ModelAsset desc = m_AssetDescMap[pBlastAsset]; - - BPPBlast& blast = BlastProject::ins().getParams().blast; - - int32_t assetId = BlastProject::ins().getAssetIDByName(desc.name.c_str()); - - apart(blast.blastAssets, assetId); - apart(blast.chunks, assetId); - apart(blast.bonds, assetId); -} - -void SampleManager::_addInstanceToProjectParam(BlastFamily* pBlastFamily) -{ - const BlastAsset& blastAsset = pBlastFamily->getBlastAsset(); - BlastAsset* pBlastAsset = (BlastAsset*)&blastAsset; - - std::vector<BlastFamily*>& fs = m_AssetFamiliesMap[pBlastAsset]; - AssetList::ModelAsset desc = m_AssetDescMap[pBlastAsset]; - - const BlastFamily::Settings& familySetting = pBlastFamily->getSettings(); - physx::PxTransform transform = familySetting.transform; - - char str[MAX_PATH]; - - BPPBlast& blast = BlastProject::ins().getParams().blast; - int assetID = BlastProject::ins().getAssetIDByName(desc.name.c_str()); - - // instance array - BPPAssetInstanceArray instanceArray; - instanceArray.arraySizes[0] = 1; - instanceArray.buf = new BPPAssetInstance[1]; - BPPAssetInstance& instance = instanceArray.buf[0]; - ::init(instance); - int instanceIndex = fs.size() - 1; - sprintf(str, "%s_%d", desc.name.c_str(), instanceIndex); - copy(instance.name, str); - instance.asset = assetID; - PxVec3 p = transform.p; - PxQuat q = transform.q; - instance.transform.position = nvidia::NvVec3(p.x, p.y, p.z); - instance.transform.rotation = nvidia::NvVec4(q.x, q.y, q.z, q.w); - - merge(blast.blastAssetInstances, instanceArray); - - std::vector<BPPChunk*> chunks = BlastProject::ins().getChildrenChunks(assetID); - for (size_t i = 0; i < chunks.size(); ++i) - { - chunks[i]->visible = isChunkVisible(fs, i); - } - - freeBlast(instanceArray); - - m_bNeedRefreshTree = true; -} - -void SampleManager::_removeInstanceFromProjectParam(BlastFamily* pBlastFamily) -{ - BPPAssetInstance* pInstance = getInstanceByFamily(pBlastFamily); - if (pInstance == nullptr) - { - return; - } - - BPPBlast& blast = BlastProject::ins().getParams().blast; - apart(blast.blastAssetInstances, pInstance->asset, pInstance->name.buf); -} - -void SampleManager::_removeInstancesFromProjectParam(BlastAsset* pBlastAsset) -{ - if (pBlastAsset == nullptr) - { - return; - } - - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM = m_AssetDescMap.find(pBlastAsset); - if (itADM == m_AssetDescMap.end()) - { - return; - } - - AssetList::ModelAsset desc = m_AssetDescMap[pBlastAsset]; - - BPPBlast& blast = BlastProject::ins().getParams().blast; - - int32_t assetId = BlastProject::ins().getAssetIDByName(desc.name.c_str()); - - apart(blast.blastAssetInstances, assetId); -} - -void SampleManager::_refreshInstanceFamilyMap() -{ - m_instanceFamilyMap.clear(); - - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itADM; - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itAFM; - for (itADM = m_AssetDescMap.begin(); itADM != m_AssetDescMap.end(); itADM++) - { - BlastAsset* pBlastAsset = itADM->first; - itAFM = m_AssetFamiliesMap.find(pBlastAsset); - if (itAFM == m_AssetFamiliesMap.end()) - { - continue; - } - - AssetList::ModelAsset modelAsset = itADM->second; - int assetID = BlastProject::ins().getAssetIDByName(modelAsset.name.c_str()); - std::vector<BPPAssetInstance*> instances; - BlastProject::ins().getAssetInstances(assetID, instances); - int instancesSize = instances.size(); - std::vector<BlastFamily*> families = itAFM->second; - int familiesSize = families.size(); - if (instancesSize != familiesSize) - { - assert("size of instance in scene and project not equal"); - } - for (int fs = 0; fs < familiesSize; fs++) - { - m_instanceFamilyMap.insert(std::make_pair(instances[fs], families[fs])); - } - } -} - -bool SampleManager::eventAlreadyHandled() -{ - bool isAlt = (GetAsyncKeyState(VK_MENU) && 0x8000); - bool isLight = (GetAsyncKeyState('L') && 0x8000); - return m_selectionToolController->IsEnabled() && !(isAlt || isLight); -} - -void SampleManager::ApplyAutoSelectNewChunks(BlastAsset* pNewBlastAsset, std::vector<uint32_t>& NewChunkIndexes) -{ - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itAFM = m_AssetFamiliesMap.find(pNewBlastAsset); - if (itAFM == m_AssetFamiliesMap.end()) - { - return; - } - - bool autoSelectNewChunks = BlastProject::ins().getParams().fracture.general.autoSelectNewChunks; - - std::vector<BlastFamily*> families = itAFM->second; - for (BlastFamily* pBlastFamily : families) - { - pBlastFamily->clearChunksSelected(); - - if (!autoSelectNewChunks) - { - continue; - } - - for (uint32_t chunkInd : NewChunkIndexes) - { - pBlastFamily->setChunkSelected(chunkInd, true); - pBlastFamily->setChunkVisible(chunkInd, true); - } - } - - BlastSceneTree::ins()->ApplyAutoSelectNewChunks(pNewBlastAsset, NewChunkIndexes); -} - -void SampleManager::ApplySelectionDepthTest() -{ - bool selectionDepthTest = BlastProject::ins().getParams().fracture.general.selectionDepthTest; - - std::vector<BlastFamily*>& families = m_blastController->getFamilies(); - - for (BlastFamily* pBlastFamily : families) - { - std::vector<uint32_t> selectedChunks = pBlastFamily->getSelectedChunks(); - - for (uint32_t chunkInd : selectedChunks) - { - pBlastFamily->setChunkSelected(chunkInd, true); - pBlastFamily->setChunkVisible(chunkInd, true); - } - } -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.h deleted file mode 100644 index 8daceb4..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/core/SampleManager.h +++ /dev/null @@ -1,363 +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. - - -#ifndef SAMPLE_MANAGER_H -#define SAMPLE_MANAGER_H - -#include "Application.h" -#include "Sample.h" -#include <map> -#include <functional> -#include "ProjectParams.h" -#include "RenderMaterial.h" -class SampleManager; -class BlastFractureTool; -class BlastAsset; -class BlastFamily; - -namespace Nv -{ - namespace Blast - { - class Mesh; - class RandomGeneratorBase; - class VoronoiSitesGenerator; - struct SlicingConfiguration; - } -} - -class ISampleController : public IApplicationController -{ -public: - - void setManager(SampleManager* manager) - { - m_manager = manager; - } -protected: - - SampleManager* getManager() const - { - return m_manager; - } - -private: - SampleManager* m_manager; -}; - -class FractureExecutor -{ - friend class SampleManager; -public: - FractureExecutor() - : m_fractureTool(0) - , m_randomGenerator(nullptr) - , m_pCurBlastAsset(nullptr) - { - m_chunkIds.clear(); - } - - virtual bool execute() = 0; - void setSourceAsset(BlastAsset* blastAsset); - void setTargetChunk(uint32_t chunkId) - { - m_chunkIds.clear(); - m_chunkIds.push_back(chunkId); - } - void setTargetChunks(std::vector<uint32_t>& chunkIds) - { - m_chunkIds.clear(); - std::vector<uint32_t>::iterator it; - for (it = chunkIds.begin(); it != chunkIds.end(); it++) - { - m_chunkIds.push_back(*it); - } - std::sort(m_chunkIds.begin(), m_chunkIds.end(), std::greater<uint32_t>()); - } - void setRandomGenerator(Nv::Blast::RandomGeneratorBase* randomGenerator) { m_randomGenerator = randomGenerator; } -protected: - BlastFractureTool* m_fractureTool; - std::vector<uint32_t> m_chunkIds; - Nv::Blast::RandomGeneratorBase* m_randomGenerator; - BlastAsset* m_pCurBlastAsset; -}; - -class VoronoiFractureExecutor : public FractureExecutor -{ -public: - VoronoiFractureExecutor(); - void setBPPVoronoi(BPPVoronoi* voronoi) { m_voronoi = voronoi; } - - virtual bool execute(); - -private: - BPPVoronoi* m_voronoi; -}; - -class SliceFractureExecutor : public FractureExecutor -{ -public: - SliceFractureExecutor(); - void setBPPSlice(BPPSlice* slice) { m_slice = slice; } - - virtual bool execute(); - -private: - BPPSlice* m_slice; -}; - -enum SelectMode -{ - SM_RESET = 0, - SM_ADD, - SM_SUB, - SM_REMAIN, -}; - -class Renderer; -class PhysXController; -class BlastController; -class SceneController; -class DamageToolController; -class SelectionToolController; -class ExplodeToolController; -class GizmoToolController; -class EditionToolController; -class SampleController; -class CommonUIController; -class SimpleRandomGenerator; -class BlastAssetModelSimple; -/** -*/ -class SampleManager -{ - friend class VoronoiFractureExecutor; - friend class SliceFractureExecutor; - public: - static SampleManager* ins(); - SampleManager(DeviceManager* pDeviceManager); - ~SampleManager(); - - int init(); - int run(); - int free(); - - bool createAsset( - BlastAssetModelSimple** ppBlastAsset, - std::vector<Nv::Blast::Mesh*>& meshes, - std::vector<int32_t>& parentIds, - std::vector<bool>& supports, - std::vector<bool>& statics, - std::vector<uint8_t>& joints, - std::vector<uint32_t>& worlds); - - bool saveAsset(BlastAsset* pBlastAsset); - - bool exportAsset(); - - Renderer& getRenderer() - { - return *m_renderer; - } - - PhysXController& getPhysXController() const - { - return *m_physXController; - } - - BlastController& getBlastController() const - { - return *m_blastController; - } - - SceneController& getSceneController() const - { - return *m_sceneController; - } - - DamageToolController& getDamageToolController() const - { - return *m_damageToolController; - } - - SelectionToolController& getSelectionToolController() const - { - return *m_selectionToolController; - } - - ExplodeToolController& getExplodeToolController() const - { - return *m_explodeToolController; - } - GizmoToolController& getGizmoToolController() const - { - return *m_gizmoToolController; - } - - EditionToolController& getEditionToolController() const - { - return *m_editionToolController; - } - - SampleController& getSampleController() const - { - return *m_sampleController; - } - - CommonUIController& getCommonUIController() const - { - return *m_commonUIController; - } - - std::vector<uint32_t> getCurrentSelectedChunks(); - std::map<BlastAsset*, std::vector<uint32_t>> getSelectedChunks(); - void clearChunksSelected(); - void setChunkSelected(std::vector<uint32_t> depths, bool selected); - void setChunkVisible(std::vector<uint32_t> depths, bool bVisible); - - void setFractureExecutor(FractureExecutor* executor); - - void output(const char* str); - void output(float value); - void output(physx::PxVec3& vec); - - void clearScene(); - void resetScene(); - - std::map<BlastAsset*, std::vector<BlastFamily*>>& getAssetFamiliesMap() - { - return m_AssetFamiliesMap; - } - std::map<BlastAsset*, AssetList::ModelAsset>& getAssetDescMap() - { - return m_AssetDescMap; - } - - BlastFamily* getFamilyByInstance(BPPAssetInstance* instance); - BPPAssetInstance* getInstanceByFamily(BlastFamily* family); - void updateFamily(BlastFamily* oldFamily, BlastFamily* newFamily); - - std::map<std::string, RenderMaterial*>& getRenderMaterials(){ return m_RenderMaterialMap; } - void removeRenderMaterial(std::string name); - void renameRenderMaterial(std::string oldName, std::string newName); - void reloadRenderMaterial(std::string name, float r, float g, float b, bool diffuse = true); - void reloadRenderMaterial(std::string name, std::string texture, RenderMaterial::TextureType tt = RenderMaterial::TT_Diffuse); - void reloadRenderMaterial(std::string name, float specularShininess); - RenderMaterial* getRenderMaterial(std::string name, bool create = true); - - bool m_bNeedRefreshTree; - - void getCurrentSelectedInstance(BlastAsset** ppBlastAsset, int& index); - void setCurrentSelectedInstance(BlastAsset* pBlastAsset, int index); - void getMaterialForCurrentFamily(std::string& name, bool externalSurface); - void setMaterialForCurrentFamily(std::string name, bool externalSurface); - - void updateAssetFamilyStressSolver(BPPAsset* bppAsset, BPPStressSolver& stressSolver); - // only update unfractured mode mesh - void updateModelMeshToProjectParam(BlastAsset* pBlastAsset); - - BlastAsset* loadBlastFile(std::string dir, std::string file, AssetList::ModelAsset modelAsset); - void addBlastAsset(BlastAssetModelSimple* pBlastAsset, AssetList::ModelAsset modelAsset, bool inProject = false); - void removeBlastAsset(BlastAssetModelSimple* pBlastAsset); - BlastFamily* addBlastFamily(BlastAsset* pBlastAsset, physx::PxTransform transform, bool inProject = false); - bool removeBlastFamily(BlastAsset* pBlastAsset, int nFamilyIndex); - - BlastAsset* getCurBlastAsset() { return m_pCurBlastAsset; } - - void refreshAsset(BlastAsset* pBlastAsset); - - void UpdateCamera(); - void ResetUpDir(bool zup); - - bool IsSimulating() { return m_simulating; } - void EnableSimulating(bool bSimulating); - bool IsStepforward() { return m_stepforward; } - void EnableStepforward(bool bStepforward); - - physx::PxVec3 getAssetExtent() { return m_assetExtents; } - - bool eventAlreadyHandled(); - - void ApplyAutoSelectNewChunks(BlastAsset* pNewBlastAsset, std::vector<uint32_t>& NewChunkIndexes); - void ApplySelectionDepthTest(); - -private: - void _createAsset(BlastAssetModelSimple** ppBlastAsset, - std::vector<bool>& supports, - std::vector<bool>& statics, - std::vector<uint8_t>& joints, - std::vector<uint32_t>& worlds); - - BlastAsset* _replaceAsset(BlastAsset* pBlastAsset, - std::vector<bool>& supports, - std::vector<bool>& statics, - std::vector<uint8_t>& joints, - std::vector<uint32_t>& worlds); - - void _setSourceAsset(); - - void _addAssetToProjectParam(BlastAsset* pBlastAsset); - void _removeAssetFromProjectParam(BlastAsset* pBlastAsset); - void _addInstanceToProjectParam(BlastFamily* pBlastFamily); - void _removeInstanceFromProjectParam(BlastFamily* pBlastFamily); - void _removeInstancesFromProjectParam(BlastAsset* pBlastAsset); - void _refreshInstanceFamilyMap(); - -private: - Renderer* m_renderer; - PhysXController* m_physXController; - BlastController* m_blastController; - SceneController* m_sceneController; - DamageToolController* m_damageToolController; - SelectionToolController* m_selectionToolController; - ExplodeToolController* m_explodeToolController; - GizmoToolController* m_gizmoToolController; - EditionToolController* m_editionToolController; - SampleController* m_sampleController; - CommonUIController* m_commonUIController; - - Application* m_pApplication; - - BlastFractureTool* m_fTool; - FractureExecutor* m_fractureExecutor; - - std::map<BlastAsset*, std::vector<BlastFamily*>> m_AssetFamiliesMap; - std::map<BlastAsset*, AssetList::ModelAsset> m_AssetDescMap; - std::map<std::string, RenderMaterial*> m_RenderMaterialMap; - std::vector<std::string> m_NeedDeleteRenderMaterials; - std::map<BPPAssetInstance*, BlastFamily*> m_instanceFamilyMap; - - BlastAsset* m_pCurBlastAsset; - int m_nCurFamilyIndex; - physx::PxVec3 m_assetExtents; - bool m_simulating; - bool m_stepforward; -}; - - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/physx/PhysXController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/physx/PhysXController.cpp deleted file mode 100644 index ba21a2e..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/physx/PhysXController.cpp +++ /dev/null @@ -1,1192 +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 "PhysXController.h" -#include "RenderMaterial.h" -#include "ResourceManager.h" -#include "Renderer.h" - -#include "XInput.h" -#include "DXUTMisc.h" -#include "DXUTCamera.h" -#include "ConvexRenderMesh.h" -#include "RenderUtils.h" -#include "SampleProfiler.h" -#include "NvBlastExtCustomProfiler.h" -#include "NvBlastPxCallbacks.h" -// Add By Lixu Begin -#include "Mesh.h" -// Add By Lixu End - -#include "PxPhysicsVersion.h" -#include "PxPvdTransport.h" -#include "PxDefaultCpuDispatcher.h" -#include "PxPhysics.h" -#include "PxScene.h" -#include "PxCooking.h" -#include "PxGpu.h" -#include "PxSimpleFactory.h" -#include "PxRigidBodyExt.h" -#include "PxRigidDynamic.h" -#include "PxRigidStatic.h" -#include "PxMaterial.h" -#include "PxFoundationVersion.h" -#include "PxMath.h" -// Add By Lixu Begin -#include "PxRigidActorExt.h" -#include "SimpleScene.h" -#include "GlobalSettings.h" -// Add By Lixu End - -#include <imgui.h> -#include <chrono> - -using namespace std::chrono; - -#define PVD_TO_FILE 0 - -const DirectX::XMFLOAT4 PLANE_COLOR(1.0f, 1.0f, 1.0f, 1.0f); -const DirectX::XMFLOAT4 HOOK_LINE_COLOR(1.0f, 1.0f, 1.0f, 1.0f); -const float DEFAULT_FIXED_TIMESTEP = 1.0f / 60.0f; - - -PhysXController::PhysXController(PxSimulationFilterShader filterShader) -: m_filterShader(filterShader) -, m_gpuPhysicsAvailable(true) -, m_isSimulating(false) -, m_useGPUPhysics(true) -, m_lastSimulationTime(0) -, m_paused(false) -, m_draggingActor(nullptr) -, m_draggingEnabled(false) -, m_draggingTryReconnect(false) -, m_perfWriter(NULL) -, m_fixedTimeStep(DEFAULT_FIXED_TIMESTEP) -, m_timeAccumulator(0) -, m_useFixedTimeStep(true) -, m_maxSubstepCount(1) -{ - QueryPerformanceFrequency(&m_performanceFreq); - -// Add By Lixu Begin - m_bFirstTime = true; -// Add By Lixu End -} - -PhysXController::~PhysXController() -{ -} - -void PhysXController::onInitialize() -{ - initPhysX(); - initPhysXPrimitives(); -} - -void PhysXController::onTerminate() -{ - simualtionSyncEnd(); - releasePhysXPrimitives(); - releasePhysX(); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PhysX init/release -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void PhysXController::initPhysX() -{ - m_foundation = PxCreateFoundation(PX_FOUNDATION_VERSION, NvBlastGetPxAllocatorCallback(), NvBlastGetPxErrorCallback()); - - m_pvd = PxCreatePvd(*m_foundation); - - static Nv::Blast::ExtCustomProfiler gBlastProfiler; - NvBlastProfilerSetCallback(&gBlastProfiler); - NvBlastProfilerSetDetail(Nv::Blast::ProfilerDetail::LOW); - gBlastProfiler.setPlatformEnabled(false); - - PxTolerancesScale scale; - - m_physics = PxCreatePhysics(PX_PHYSICS_VERSION, *m_foundation, scale, true, m_pvd); - - PxCookingParams cookingParams(scale); - cookingParams.buildGPUData = true; - m_cooking = PxCreateCooking(PX_PHYSICS_VERSION, m_physics->getFoundation(), cookingParams); - - PxCudaContextManagerDesc ctxMgrDesc; - m_cudaContext = PxCreateCudaContextManager(m_physics->getFoundation(), ctxMgrDesc); - if (m_cudaContext && !m_cudaContext->contextIsValid()) - { - m_cudaContext->release(); - m_cudaContext = NULL; - } - - PxSceneDesc sceneDesc(m_physics->getTolerancesScale()); - sceneDesc.gravity = PxVec3(0.0f, -9.81f, 0.0f); - m_dispatcher = PxDefaultCpuDispatcherCreate(4); - sceneDesc.cpuDispatcher = m_dispatcher; - sceneDesc.gpuDispatcher = m_cudaContext != NULL ? m_cudaContext->getGpuDispatcher() : NULL; - sceneDesc.filterShader = m_filterShader; - sceneDesc.flags |= PxSceneFlag::eENABLE_STABILIZATION; - sceneDesc.flags |= PxSceneFlag::eENABLE_PCM; - if (sceneDesc.gpuDispatcher == nullptr) - { - m_gpuPhysicsAvailable = false; - m_useGPUPhysics = false; - } - if (m_useGPUPhysics) - { - sceneDesc.flags |= PxSceneFlag::eENABLE_GPU_DYNAMICS; - sceneDesc.broadPhaseType = PxBroadPhaseType::eGPU; - - sceneDesc.gpuDynamicsConfig.constraintBufferCapacity *= 4; - sceneDesc.gpuDynamicsConfig.contactBufferCapacity *= 4; - sceneDesc.gpuDynamicsConfig.contactStreamSize *= 4; - sceneDesc.gpuDynamicsConfig.forceStreamCapacity *= 4; - sceneDesc.gpuDynamicsConfig.foundLostPairsCapacity *= 4; - sceneDesc.gpuDynamicsConfig.patchStreamSize *= 4; - sceneDesc.gpuDynamicsConfig.tempBufferCapacity *= 4; - - } - m_physicsScene = m_physics->createScene(sceneDesc); - m_editPhysicsScene = m_physics->createScene(sceneDesc); - - m_defaultMaterial = m_physics->createMaterial(0.8f, 0.7f, 0.1f); - - PxPvdSceneClient* pvdClient = m_physicsScene->getScenePvdClient(); - if(pvdClient) - { - pvdClient->setScenePvdFlag(PxPvdSceneFlag::eTRANSMIT_CONSTRAINTS, true); - pvdClient->setScenePvdFlag(PxPvdSceneFlag::eTRANSMIT_CONTACTS, true); - pvdClient->setScenePvdFlag(PxPvdSceneFlag::eTRANSMIT_SCENEQUERIES, true); - } - - m_physicsScene->setVisualizationParameter(PxVisualizationParameter::eSCALE, 0); - -#if NV_DEBUG || NV_CHECKED || NV_PROFILE - PxPvdTransport* transport = PxDefaultPvdSocketTransportCreate("localhost", 5425, 10); - if (transport) - { - m_pvd->connect(*transport, -#if NV_DEBUG || NV_CHECKED - PxPvdInstrumentationFlag::eALL -#else - PxPvdInstrumentationFlag::ePROFILE -#endif - ); - } -#endif -} - -void PhysXController::releasePhysX() -{ - m_defaultMaterial->release(); - m_physicsScene->release(); - m_editPhysicsScene->release(); - if (m_cudaContext) - m_cudaContext->release(); - m_dispatcher->release(); - m_physics->release(); - if (m_pvd) - { - PxPvdTransport* transport = m_pvd->getTransport(); - m_pvd->release(); - if (transport) - transport->release(); - } - m_cooking->release(); - m_foundation->release(); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// GPU toggle -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void PhysXController::setUseGPUPhysics(bool useGPUPhysics) -{ - if (!m_gpuPhysicsAvailable) - { - useGPUPhysics = false; - } - - if (m_useGPUPhysics == useGPUPhysics) - { - return; - } - - onTerminate(); - - m_useGPUPhysics = useGPUPhysics; - - onInitialize(); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PhysX wrappers -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -PxRigidDynamic* PhysXController::createRigidDynamic(const PxTransform& transform) -{ - return m_physics->createRigidDynamic(transform); -} - -void PhysXController::releaseRigidDynamic(PxRigidDynamic* rigidDynamic) -{ - notifyRigidDynamicDestroyed(rigidDynamic); - - m_physXActorsToRemove.push_back(rigidDynamic); -} - -void PhysXController::notifyRigidDynamicDestroyed(PxRigidDynamic* rigidDynamic) -{ - if (m_draggingActor == rigidDynamic) - { - m_draggingActor = nullptr; - m_draggingTryReconnect = true; - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Simulation control -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void PhysXController::simulationBegin(float dt) -{ - PROFILER_SCOPED_FUNCTION(); - -// Add By Lixu Begin - if (m_paused && !m_bFirstTime) - return; - if (m_bFirstTime) - { - m_paused = true; - m_bFirstTime = false; - } -// Add By Lixu End - - updateDragging(dt); - processExplosionQueue(); - - // slower physics if fps is too low - dt = PxClamp(dt, 0.0f, 0.0333f); - - { - PROFILER_SCOPED("PhysX simulate call"); - if (m_useFixedTimeStep) - { - m_timeAccumulator += dt; - m_substepCount = (uint32_t)std::floor(m_timeAccumulator / m_fixedTimeStep); - m_timeAccumulator -= m_fixedTimeStep * m_substepCount; - m_substepCount = m_maxSubstepCount > 0 ? physx::PxClamp<uint32_t>(m_substepCount, 0, m_maxSubstepCount) : m_substepCount; - if (m_substepCount > 0) - { - m_physicsScene->simulate(m_fixedTimeStep); - m_isSimulating = true; - } - } - else - { - m_substepCount = 1; - PX_ASSERT(!m_isSimulating); - m_physicsScene->simulate(dt); - m_isSimulating = true; - - } - } - -// Add By Lixu Begin - if (getManager()->IsStepforward()) - { - m_paused = true; - getManager()->EnableStepforward(false); - } -// Add By Lixu End -} - -void PhysXController::simualtionSyncEnd() -{ - PROFILER_SCOPED_FUNCTION(); - - if (m_isSimulating) - { - steady_clock::time_point start = steady_clock::now(); - m_physicsScene->fetchResults(true); - - // For fixed time step case it could be that we need more then one step (m_maxSubstepCount > 1). We will run leftover steps synchronously right there. - // Ideally is to make them overlap with other logic too, but it's much harder and requires more synchronization logic. Don't want to obfuscate sample code. - if (m_useFixedTimeStep && m_substepCount > 1) - { - for (uint32_t i = 0; i < m_substepCount - 1; i++) - { - m_physicsScene->simulate(m_fixedTimeStep); - m_physicsScene->fetchResults(true); - } - } - m_lastSimulationTime = duration_cast<microseconds>(steady_clock::now() - start).count() * 0.000001; - - m_isSimulating = false; - - updateActorTransforms(); - - PROFILER_BEGIN("Debug Render Buffer"); - getRenderer().queueRenderBuffer(&m_physicsScene->getRenderBuffer()); - PROFILER_END(); - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Dragging -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void PhysXController::setDraggingEnabled(bool enabled) -{ - m_draggingEnabled = enabled; - - if (!m_draggingEnabled) - { - m_draggingActor = nullptr; - } -} - -void PhysXController::updateDragging(double dt) -{ - PROFILER_SCOPED_FUNCTION(); - - // If dragging actor was recently removed we try to reconnect to new one once, using previous hook world point. - // Often it is removed because it was split into smaller chunks (actors), so we wont to stay connected for nicer user experience. - if (m_draggingActor == nullptr && m_draggingTryReconnect) - { - class OverlapCallback : public PxOverlapBufferN<32> - { - public: - OverlapCallback() : hitActor(nullptr) {} - - PxAgain processTouches(const PxOverlapHit* buffer, PxU32 nbHits) - { - for (PxU32 i = 0; i < nbHits; ++i) - { - PxRigidDynamic* rigidDynamic = buffer[i].actor->is<PxRigidDynamic>(); - if (rigidDynamic) - { - hitActor = rigidDynamic; - break; - } - } - return true; - } - - PxRigidDynamic* hitActor; - }; - - OverlapCallback overlapCallback; - PxSphereGeometry sphere(0.15f); - bool isHit = getPhysXScene().overlap(sphere, PxTransform(m_draggingActorLastHookWorldPoint), overlapCallback, PxQueryFilterData(PxQueryFlag::eDYNAMIC)); - if (isHit && overlapCallback.hitActor) - { - m_draggingActor = overlapCallback.hitActor; - } - - m_draggingTryReconnect = false; - } - - // Update dragging force and debug render (line) - if (m_draggingEnabled && m_draggingActor != NULL) - { - const float DRAGGING_FORCE_FACTOR = 10.0f; - const float DRAGGING_VELOCITY_FACTOR = 2.0f; - PxVec3 attractionPoint = m_dragAttractionPoint; - PxVec3 hookPoint = m_draggingActor->getGlobalPose().transform(m_draggingActorHookLocalPoint); - m_draggingActorLastHookWorldPoint = hookPoint; - m_dragVector = (m_dragAttractionPoint - hookPoint); - if (!m_draggingActor->getRigidBodyFlags().isSet(PxRigidBodyFlag::eKINEMATIC)) - { - PxVec3 dragVeloctiy = (m_dragVector * DRAGGING_FORCE_FACTOR - DRAGGING_VELOCITY_FACTOR * m_draggingActor->getLinearVelocity()) * dt; - PxRigidBodyExt::addForceAtLocalPos(*m_draggingActor, dragVeloctiy * m_draggingActor->getMass(), m_draggingActorHookLocalPoint, PxForceMode::eIMPULSE, true); - } - - // debug render line - m_dragDebugRenderBuffer.clear(); - m_dragDebugRenderBuffer.m_lines.push_back(PxDebugLine(attractionPoint, hookPoint, XMFLOAT4ToU32Color(HOOK_LINE_COLOR))); - getRenderer().queueRenderBuffer(&m_dragDebugRenderBuffer); - } -} - -void PhysXController::resetDragging() -{ - m_draggingActor = nullptr; -} - - -LRESULT PhysXController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - PROFILER_SCOPED_FUNCTION(); - - if (m_draggingEnabled && (uMsg == WM_LBUTTONDOWN || uMsg == WM_MOUSEMOVE || uMsg == WM_LBUTTONUP)) - { - float mouseX = (short)LOWORD(lParam); - float mouseY = (short)HIWORD(lParam); - - PxVec3 eyePos, pickDir; - getEyePoseAndPickDir(mouseX, mouseY, eyePos, pickDir); - pickDir = pickDir.getNormalized(); - - if (uMsg == WM_LBUTTONDOWN) - { - if (pickDir.magnitude() > 0) - { - PxRaycastHit hit; - PxRaycastBuffer rcBuffer(&hit, 1); - bool isHit = getPhysXScene().raycast(eyePos, pickDir, PX_MAX_F32, rcBuffer, PxHitFlag::ePOSITION, PxQueryFilterData(PxQueryFlag::eDYNAMIC)); - if (isHit) - { - m_dragDistance = (eyePos - hit.position).magnitude(); - m_draggingActor = hit.actor->is<PxRigidDynamic>(); - m_draggingActorHookLocalPoint = m_draggingActor->getGlobalPose().getInverse().transform(hit.position); - m_dragAttractionPoint = hit.position; - if (!m_draggingActor->getRigidBodyFlags().isSet(PxRigidBodyFlag::eKINEMATIC)) - { - m_draggingActor->setLinearVelocity(PxVec3(0, 0, 0)); - m_draggingActor->setAngularVelocity(PxVec3(0, 0, 0)); - } - } - } - } - else if (uMsg == WM_MOUSEMOVE) - { - PxRaycastHit hit; - PxRaycastBuffer rcBuffer(&hit, 1); - bool isHit = getPhysXScene().raycast(eyePos, pickDir, PX_MAX_F32, rcBuffer, PxHitFlag::ePOSITION, PxQueryFilterData(PxQueryFlag::eSTATIC)); - if (isHit) - { - m_dragDistance = PxMin(m_dragDistance, (eyePos - hit.position).magnitude()); - } - - m_dragAttractionPoint = eyePos + pickDir * m_dragDistance; - } - else if (uMsg == WM_LBUTTONUP) - { - m_draggingActor = NULL; - } - } - - return 1; -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Explosion -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class ExplodeOverlapCallback : public PxOverlapCallback -{ -public: - ExplodeOverlapCallback(PxVec3 worldPos, float radius, float explosiveImpulse) - : m_worldPos(worldPos) - , m_radius(radius) - , m_explosiveImpulse(explosiveImpulse) - , PxOverlapCallback(m_hitBuffer, sizeof(m_hitBuffer) / sizeof(m_hitBuffer[0])) {} - - PxAgain processTouches(const PxOverlapHit* buffer, PxU32 nbHits) - { - for (PxU32 i = 0; i < nbHits; ++i) - { - PxRigidActor* actor = buffer[i].actor; - PxRigidDynamic* rigidDynamic = actor->is<PxRigidDynamic>(); - if (rigidDynamic && !(rigidDynamic->getRigidBodyFlags() & PxRigidBodyFlag::eKINEMATIC)) - { - if (m_actorBuffer.find(rigidDynamic) == m_actorBuffer.end()) - { - m_actorBuffer.insert(rigidDynamic); - PxVec3 dr = rigidDynamic->getGlobalPose().transform(rigidDynamic->getCMassLocalPose()).p - m_worldPos; - float distance = dr.magnitude(); - float factor = PxClamp(1.0f - (distance * distance) / (m_radius * m_radius), 0.0f, 1.0f); - float impulse = factor * m_explosiveImpulse * 1000.0f; - PxVec3 vel = dr.getNormalized() * impulse / rigidDynamic->getMass(); - rigidDynamic->setLinearVelocity(rigidDynamic->getLinearVelocity() + vel); - } - } - } - return true; - } - -private: - PxOverlapHit m_hitBuffer[1000]; - float m_explosiveImpulse; - std::set<PxRigidDynamic*> m_actorBuffer; - PxVec3 m_worldPos; - float m_radius; -}; - -void PhysXController::explode(PxVec3 worldPos, float damageRadius, float explosiveImpulse) -{ - ExplodeOverlapCallback overlapCallback(worldPos, damageRadius, explosiveImpulse); - m_physicsScene->overlap(PxSphereGeometry(damageRadius), PxTransform(worldPos), overlapCallback); -} - -void PhysXController::explodeDelayed(PxVec3 worldPos, float damageRadius, float explosiveImpulse) -{ - m_explosionQueue.push_back({ worldPos, damageRadius, explosiveImpulse }); -} - -void PhysXController::processExplosionQueue() -{ - for (auto& e : m_explosionQueue) - { - explode(e.worldPos, e.damageRadius, e.explosiveImpulse); - } - m_explosionQueue.clear(); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// UI -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void PhysXController::drawUI() -{ - ImGui::Checkbox("Use Fixed Timestep", &m_useFixedTimeStep); - if (m_useFixedTimeStep) - { - ImGui::InputFloat("Fixed Timestep", &m_fixedTimeStep); - ImGui::InputInt("Max Substep Count", &m_maxSubstepCount); - } - - ImGui::Text("Substep Count: %d", m_substepCount); - ImGui::Text("Sync Simulation Time (total): %4.2f ms", getLastSimulationTime() * 1000); -} - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PhysX Primitive -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// Add By Lixu Begin -// 0 means GROUND_YUP 1 means GROUND_ZUP -PhysXController::Actor* planeActor_Pri[2] = { nullptr, nullptr }; -// Add By Lixu End - -void PhysXController::initPhysXPrimitives() -{ - // physx primitive render materials - { -// Add By Lixu Begin - m_physXPrimitiveRenderMaterial = new RenderMaterial("", getRenderer().getResourceManager(), "physx_primitive", ""); - m_physXPlaneRenderMaterial = new RenderMaterial("", getRenderer().getResourceManager(), "physx_primitive_plane", ""); - m_physXPrimitiveTransparentRenderMaterial = new RenderMaterial("", getRenderer().getResourceManager(), "physx_primitive_transparent", "", RenderMaterial::BLEND_ALPHA_BLENDING); -// Add By Lixu End - } - - // create plane - Actor* plane = spawnPhysXPrimitivePlane(PxPlane(PxVec3(0, 1, 0).getNormalized(), 0)); - plane->setColor(PLANE_COLOR); - -// Add By Lixu Begin - planeActor_Pri[0] = plane; - planeActor_Pri[0]->setHidden(true); - plane = spawnPhysXPrimitivePlane(PxPlane(PxVec3(0, 0, 1).getNormalized(), 0)); - plane->setColor(PLANE_COLOR); - planeActor_Pri[1] = plane; - planeActor_Pri[1]->setHidden(true); -// Add By Lixu End -} - -void PhysXController::releasePhysXPrimitives() -{ - // remove all actors - for (std::set<Actor*>::iterator it = m_actors.begin(); it != m_actors.end(); it++) - { - delete (*it); - } - m_actors.clear(); - - // remove all materials - SAFE_DELETE(m_physXPrimitiveRenderMaterial); - SAFE_DELETE(m_physXPlaneRenderMaterial); - SAFE_DELETE(m_physXPrimitiveTransparentRenderMaterial); - - // remove all convex render meshes - for (auto it = m_convexRenderMeshes.begin(); it != m_convexRenderMeshes.end(); it++) - { - SAFE_DELETE((*it).second); - } - m_convexRenderMeshes.clear(); -} - -void PhysXController::updateActorTransforms() -{ - PROFILER_SCOPED_FUNCTION(); - - for (std::set<Actor*>::iterator it = m_actors.begin(); it != m_actors.end(); it++) - { - (*it)->update(); - } -} - -PhysXController::Actor* PhysXController::spawnPhysXPrimitiveBox(const PxTransform& position, PxVec3 extents, float density) -{ - PxBoxGeometry geom = PxBoxGeometry(extents); - PxRigidDynamic* actor = PxCreateDynamic(*m_physics, position, geom, *m_defaultMaterial, density); - - return spawnPhysXPrimitive(actor); -} - -PhysXController::Actor* PhysXController::spawnPhysXPrimitivePlane(const PxPlane& plane) -{ - PxRigidStatic* actor = PxCreatePlane(*m_physics, plane, *m_defaultMaterial); - PhysXController::Actor* p = spawnPhysXPrimitive(actor, false, true); - return p; -} - -PhysXController::Actor* PhysXController::spawnPhysXPrimitive(PxRigidActor* actor, bool addToScene, bool ownPxActor) -{ - if (addToScene) - { - m_physicsScene->addActor(*actor); - } - - Actor* a = new Actor(this, actor, ownPxActor); - - m_actors.emplace(a); - - return a; -} - -void PhysXController::removePhysXPrimitive(Actor* actor) -{ - if (m_actors.find(actor) == m_actors.end()) - return; - - m_actors.erase(actor); - - if (!actor->ownsPxActor()) - { - m_physXActorsToRemove.push_back(actor->getActor()); - } - - if (m_draggingActor == actor->getActor()) - { - m_draggingActor = nullptr; - } - - delete actor; -} - -void PhysXController::removeUnownedPhysXActors() -{ - if (m_physXActorsToRemove.size()) - { - m_physicsScene->removeActors(m_physXActorsToRemove.data(), (PxU32)m_physXActorsToRemove.size()); - for (size_t i = 0; i < m_physXActorsToRemove.size(); ++i) - { - m_physXActorsToRemove[i]->release(); - } - m_physXActorsToRemove.resize(0); - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Actor -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -PhysXController::Actor::Actor(PhysXController* controller, PxRigidActor* actor, bool ownPxActor) : - m_controller(controller), - m_ownPxActor(ownPxActor), - m_hidden(false) -{ - m_actor = actor; - - uint32_t shapesCount = actor->getNbShapes(); - m_shapes.resize(shapesCount); - actor->getShapes(m_shapes.data(), shapesCount); - - m_renderables.resize(m_shapes.size()); - for (uint32_t i = 0; i < m_shapes.size(); i++) - { - PxShape* shape = m_shapes[i]; - IRenderMesh* mesh = m_controller->getRenderMeshForShape(shape); - RenderMaterial* material = shape->getGeometryType() == PxGeometryType::ePLANE ? m_controller->m_physXPlaneRenderMaterial : m_controller->m_physXPrimitiveRenderMaterial; - m_renderables[i] = m_controller->getRenderer().createRenderable(*mesh, *material); - m_renderables[i]->setScale(m_controller->getMeshScaleForShape(shape)); - } -} - -PhysXController::Actor::~Actor() -{ - for (uint32_t i = 0; i < m_renderables.size(); i++) - { - m_controller->getRenderer().removeRenderable(m_renderables[i]); - } - if (m_ownPxActor) - { - m_actor->release(); - } -} - -void PhysXController::Actor::setColor(DirectX::XMFLOAT4 color) -{ - m_color = color; - - for (uint32_t i = 0; i < m_renderables.size(); i++) - { - m_renderables[i]->setColor(color); - } -} - -void PhysXController::Actor::setHidden(bool hidden) -{ - m_hidden = hidden; - - for (uint32_t i = 0; i < m_renderables.size(); i++) - { - m_renderables[i]->setHidden(hidden); - } -} - -void PhysXController::Actor::update() -{ - for (uint32_t i = 0; i < m_renderables.size(); i++) - { - m_renderables[i]->setTransform(m_actor->getGlobalPose() * m_shapes[i]->getLocalPose()); - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PhysX Shapes Renderer -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -IRenderMesh* PhysXController::getConvexRenderMesh(const PxConvexMesh* mesh) -{ - auto it = m_convexRenderMeshes.find(mesh); - if (it != m_convexRenderMeshes.end()) - { - return (*it).second; - } - else - { - ConvexRenderMesh* renderMesh = new ConvexRenderMesh(mesh); - m_convexRenderMeshes[mesh] = renderMesh; - return renderMesh; - } -} - -IRenderMesh* PhysXController::getRenderMeshForShape(const PxShape* shape) -{ - switch (shape->getGeometryType()) - { - case PxGeometryType::eBOX: - return getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Box); - case PxGeometryType::ePLANE: - return getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Plane); - case PxGeometryType::eSPHERE: - return getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Sphere); - case PxGeometryType::eCONVEXMESH: - { - PxConvexMeshGeometry geom; - shape->getConvexMeshGeometry(geom); - return getConvexRenderMesh(geom.convexMesh); - } - default: - PX_ALWAYS_ASSERT_MESSAGE("Unsupported PxGeometryType"); - return NULL; - } -} - -PxVec3 PhysXController::getMeshScaleForShape(const PxShape* shape) -{ - switch (shape->getGeometryType()) - { - case PxGeometryType::eBOX: - { - PxBoxGeometry boxGeom; - shape->getBoxGeometry(boxGeom); - return boxGeom.halfExtents; - } - case PxGeometryType::ePLANE: - { - return PxVec3(1, 2000, 2000); - } - case PxGeometryType::eSPHERE: - { - PxSphereGeometry sphereGeom; - shape->getSphereGeometry(sphereGeom); - return PxVec3(sphereGeom.radius, sphereGeom.radius, sphereGeom.radius); - } - case PxGeometryType::eCONVEXMESH: - { - PxConvexMeshGeometry convexGeom; - shape->getConvexMeshGeometry(convexGeom); - return convexGeom.scale.scale; // maybe incorrect because of rotation not used - } - default: - return PxVec3(1, 1, 1); - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Utils -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// work right -PxVec3 unprojectRH(PxMat44& proj, PxMat44& view, float x, float y) -{ - PxVec4 screenPoint(x, y, 0, 1); - PxVec4 viewPoint = PxVec4(x / proj[0][0], y / proj[1][1], 1, 1); - PxVec4 nearPoint = view.inverseRT().transform(viewPoint); - if (nearPoint.w) - nearPoint *= 1.0f / nearPoint.w; - return PxVec3(nearPoint.x, nearPoint.y, nearPoint.z); -} - -// work wrong -PxVec3 unprojectRH2(PxMat44& proj, PxMat44& view, float x, float y) -{ - PxMat44 matProj = view * proj; - PxMat44 matInverse = matProj.inverseRT(); - - PxVec4 screenPoint(x, y, 0, 0); - PxVec4 pos = matInverse.transform(screenPoint); - return PxVec3(pos.x, pos.y, pos.z); -} - -// work right -PxVec3 unprojectLH(PxMat44& proj, PxMat44& view, float x, float y) -{ - DirectX::XMMATRIX proj1 = PxMat44ToXMMATRIX(proj); - DirectX::XMMATRIX view1 = PxMat44ToXMMATRIX(view); - DirectX::XMMATRIX invProjectionView = DirectX::XMMatrixInverse(&DirectX::XMMatrixDeterminant(view1 * proj1), (view1 * proj1)); - - DirectX::XMVECTOR mousePosition = DirectX::XMVectorSet(x, y, 0.0f, 0.0f); - DirectX::XMVECTOR mouseInWorldSpace = DirectX::XMVector3Transform(mousePosition, invProjectionView); - return PxVec3(DirectX::XMVectorGetX(mouseInWorldSpace), DirectX::XMVectorGetY(mouseInWorldSpace), DirectX::XMVectorGetZ(mouseInWorldSpace)); -} - -// work right -PxVec3 unprojectLH(DirectX::XMMATRIX& proj, DirectX::XMMATRIX& view, float x, float y) -{ - //DirectX::XMMATRIX invProjectionView = DirectX::XMMatrixInverse(&DirectX::XMMatrixDeterminant(view * proj), (view * proj)); - - //DirectX::XMVECTOR mousePosition = DirectX::XMVectorSet(x, y, 0.0f, 0.0f); - //DirectX::XMVECTOR mouseInWorldSpace = DirectX::XMVector3Transform(mousePosition, invProjectionView); - //return PxVec3(DirectX::XMVectorGetX(mouseInWorldSpace), DirectX::XMVectorGetY(mouseInWorldSpace), DirectX::XMVectorGetZ(mouseInWorldSpace)); - - - DirectX::XMMATRIX inView = DirectX::XMMatrixInverse(&DirectX::XMMatrixDeterminant(view), view); - - DirectX::XMVECTOR screenPoint = DirectX::XMVectorSet(x, y, 0, 1); - DirectX::XMVECTOR viewPoint = DirectX::XMVectorSet(x / DirectX::XMVectorGetX(proj.r[0]), y / DirectX::XMVectorGetY(proj.r[1]), 1, 1); - DirectX::XMVECTOR nearPoint = DirectX::XMVector3Transform(viewPoint, inView); - PxVec3 nearPnt = PxVec3(DirectX::XMVectorGetX(nearPoint), DirectX::XMVectorGetY(nearPoint), DirectX::XMVectorGetZ(nearPoint)); - if (DirectX::XMVectorGetW(nearPoint)) - nearPnt *= 1.0f / DirectX::XMVectorGetW(nearPoint); - return nearPnt; -} - -#include "SimpleScene.h" - -void PhysXController::getEyePoseAndPickDir(float mouseX, float mouseY, PxVec3& eyePos, PxVec3& pickDir) -{ -#if(0) - // Add By Lixu Begin - PxMat44 view, proj; - SimpleScene* simpleScene = SimpleScene::Inst(); - Camera* pSceneCamera = simpleScene->GetCamera(); - if (pSceneCamera->UseLHS()) - { - DirectX::XMMATRIX viewMatrix = SimpleScene::Inst()->GetViewMatrix(); - DirectX::XMMATRIX projMatrix = SimpleScene::Inst()->GetProjMatrix(); - view = XMMATRIXToPxMat44(viewMatrix); - proj = XMMATRIXToPxMat44(projMatrix); - } - else - { - view = XMMATRIXToPxMat44(getRenderer().getCamera().GetViewMatrix()); - proj = XMMATRIXToPxMat44(getRenderer().getCamera().GetProjMatrix()); - } - // Add By Lixu End - - PxMat44 eyeTransform = view.inverseRT(); - eyePos = eyeTransform.getPosition(); - PxVec3 nearPos = unprojectRH(proj, view, mouseX * 2 - 1, 1 - mouseY * 2); - pickDir = nearPos - eyePos; -#endif - -#if(0) - if (SimpleScene::Inst()->m_pCamera->UseLHS()) - { - DirectX::XMMATRIX view = SimpleScene::Inst()->GetViewMatrix(); - DirectX::XMMATRIX proj = SimpleScene::Inst()->GetProjMatrix(); - - DirectX::XMMATRIX eyeTransform = DirectX::XMMatrixInverse(&DirectX::XMMatrixDeterminant(view), view); - eyePos = PxVec3(DirectX::XMVectorGetX(eyeTransform.r[3]), DirectX::XMVectorGetY(eyeTransform.r[3]), DirectX::XMVectorGetZ(eyeTransform.r[3])); - - PxVec3 nearPos = unprojectLH(proj, view, mouseX * 2 - 1, 1 - mouseY * 2); - - pickDir = nearPos - eyePos; - } - else - { - PxMat44 view = XMMATRIXToPxMat44(getRenderer().getCamera().GetViewMatrix()); - PxMat44 proj = XMMATRIXToPxMat44(getRenderer().getCamera().GetProjMatrix()); - - PxMat44 eyeTransform = view.inverseRT(); - eyePos = eyeTransform.getPosition(); - - PxVec3 nearPos = unprojectRH(proj, view, mouseX * 2 - 1, 1 - mouseY * 2); - - pickDir = nearPos - eyePos; - } -#endif - - atcore_float3 eye = SimpleScene::Inst()->m_pCamera->GetEye(); - eyePos = PxVec3(eye.x, eye.y, eye.z); - - float x = 0, y = 0, z = 0; - SimpleScene::Inst()->m_pCamera->getWorldCoord(mouseX, mouseY, x, y, z); - - PxVec3 nearPos(x, y, z); - pickDir = nearPos - eyePos; -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Add By Lixu Begin -#include "PxExtensionsAPI.h" -#include "PxDefaultStreams.h" -#include "PxCollectionExt.h" -// export collision as RepX. In exported file, it includes collisions as convexMesh. But for Rigidbodies, it will only export those exists. -// if export as file A before damaging, it exports all of the chunks as convexMeshes. And Chunk 0 as Dynamic rigid body. -// if export as file B after damaging and fracturing in the middle of simulation, it exports all of the chunks as convexMeshes. And the existing chunks as dynamic rigid bodies. -bool PhysXController::ExportCollisionRepX(const char* fname, physx::PxPhysics* pSDK, physx::PxScene* pScene, bool asBinary) -{ - if ((pSDK == NULL) || (pScene == NULL) || (fname == NULL)) - return false; - - int count = pSDK->getNbScenes(); - - physx::PxSerializationRegistry* psr = physx::PxSerialization::createSerializationRegistry(*pSDK); - - physx::PxCollection* collectionSdk = physx::PxCollectionExt::createCollection(*pSDK); - PX_ASSERT(collectionSdk); - - physx::PxCollection* collectionScene = physx::PxCollectionExt::createCollection(*pScene); - PX_ASSERT(collectionScene); - - collectionSdk->add(*collectionScene); - physx::PxSerialization::complete(*collectionSdk, *psr, NULL, true); - - physx::PxDefaultFileOutputStream theStream(fname); - bool exportNames = true; - bool bExportOk = false; - if (asBinary) - bExportOk = physx::PxSerialization::serializeCollectionToBinary(theStream, *collectionSdk, *psr, NULL, exportNames); - else - bExportOk = physx::PxSerialization::serializeCollectionToXml(theStream, *collectionSdk, *psr); - - if (!bExportOk) - { - std::string warning = "Fail to save scene: "; - warning += fname; - warning += "!"; - MessageBoxA(NULL, warning.c_str(), "", MB_OK | MB_ICONWARNING); - bExportOk = false; - } - - collectionScene->release(); - collectionSdk->release(); - - psr->release(); - - return bExportOk; -} - -// we have to clear those convexMeshes when init scene. if not, they increase. -void PhysXController::ClearOldCOllisions() -{ - physx::PxU32 size = m_physics->getNbShapes(); - if (size > 0) - { - physx::PxShape** pShapes = new physx::PxShape*[size]; - memset(pShapes, 0, size); // clear - physx::PxU32 count = m_physics->getShapes(pShapes, size); - for (physx::PxU32 i = 0; i < count; i++) - { - physx::PxShape& shape = *pShapes[i]; - PxGeometryType::Enum type = shape.getGeometryType(); - if (type == PxGeometryType::eCONVEXMESH) - shape.release(); - } - delete[] pShapes; - size = m_physics->getNbShapes(); - } - // release convexMesh - size = m_physics->getNbConvexMeshes(); - if (size > 0) - { - physx::PxConvexMesh** pConvex = new physx::PxConvexMesh*[size]; - memset(pConvex, 0, size); // clear - physx::PxU32 count = m_physics->getConvexMeshes(pConvex, size); - for (physx::PxU32 i = 0; i < count; i++) - { - pConvex[i]->release(); - } - delete[] pConvex; - size = m_physics->getNbConvexMeshes(); - } -} - -bool PhysXController::isPlaneVisible() -{ - if (GlobalSettings::Inst().m_zup) - { - return !planeActor_Pri[1]->isHidden(); - } - else - { - return !planeActor_Pri[0]->isHidden(); - } -} - -void PhysXController::setPlaneVisible(bool bVisible) -{ - if (GlobalSettings::Inst().m_zup) - { - planeActor_Pri[0]->setHidden(true); - planeActor_Pri[1]->setHidden(!bVisible); - } - else - { - planeActor_Pri[0]->setHidden(!bVisible); - planeActor_Pri[1]->setHidden(true); - } -} - -PxRigidDynamic* PhysXController::createEditPhysXActor(const std::vector<BlastModel::Chunk::Mesh>& meshes, const PxTransform& pos) -{ - PxRigidDynamic *actor = m_physics->createRigidDynamic(PxTransform(pos)); - - for (size_t i = 0; i < meshes.size(); ++i) - { - const SimpleMesh& mesh = meshes[i].mesh; - - size_t vertexCount = mesh.vertices.size(); - if (vertexCount == 0) - { - continue; - } - PxVec3* verts = new PxVec3[vertexCount]; - for (size_t i = 0; i < vertexCount; ++i) - { - verts[i] = mesh.vertices[i].position; - } - - PxConvexMeshDesc convexDesc; - convexDesc.points.count = vertexCount; - convexDesc.points.stride = sizeof(PxVec3); - convexDesc.points.data = verts; - convexDesc.flags = PxConvexFlag::eCOMPUTE_CONVEX; - - { - PxCookingParams params = m_cooking->getParams(); - params.convexMeshCookingType = PxConvexMeshCookingType::eQUICKHULL; - m_cooking->setParams(params); - - PxDefaultMemoryOutputStream outStream; - bool bCooking = m_cooking->cookConvexMesh(convexDesc, outStream); - PxU8* outStreamData = outStream.getData(); - PxU32 outStreamSize = outStream.getSize(); - if (!bCooking || outStreamData == nullptr || outStreamSize == 0) - { - delete[] verts; - continue; - } - - PxDefaultMemoryInputData input(outStreamData, outStreamSize); - PxConvexMesh* convexMesh = m_physics->createConvexMesh(input); - if (convexMesh == nullptr) - { - delete[] verts; - continue; - } - PxShape* shape = m_physics->createShape(PxConvexMeshGeometry(convexMesh), *m_defaultMaterial); - if (shape) - { - actor->attachShape(*shape); - } - - } - - delete[] verts; - } - - actor->setRigidBodyFlag(PxRigidBodyFlag::eKINEMATIC, true); - m_editPhysicsScene->addActor(*actor); - return actor; -} - -void PhysXController::setPaused(bool paused) -{ - m_paused = paused; - if (m_paused) - { - return; - } - - if (GlobalSettings::Inst().m_zup) - { - m_physicsScene->removeActor(*planeActor_Pri[0]->getActor()); - m_physicsScene->addActor(*planeActor_Pri[1]->getActor()); - } - else - { - m_physicsScene->removeActor(*planeActor_Pri[1]->getActor()); - m_physicsScene->addActor(*planeActor_Pri[0]->getActor()); - } -} - -void PhysXController::ResetUpDir(bool zup) -{ - setPaused(m_paused); - setPlaneVisible(isPlaneVisible()); - if (zup) - { - m_physicsScene->setGravity(PxVec3(0.0f, 0.0f, -9.81f)); - } - else - { - m_physicsScene->setGravity(PxVec3(0.0f, -9.81f, 0.0f)); - } -} -// Add By Lixu End diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/physx/PhysXController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/physx/PhysXController.h deleted file mode 100644 index 9394adb..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/physx/PhysXController.h +++ /dev/null @@ -1,339 +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. - - -#ifndef PHYSX_CONTROLLER_H -#define PHYSX_CONTROLLER_H - -#include "SampleManager.h" -#include <DirectXMath.h> -#include "DebugRenderBuffer.h" -#include "PxFiltering.h" -#include <set> -#include <map> -// Add By Lixu Begin -#include "BlastModel.h" -// Add By Lixu End - - -using namespace physx; - -class PerformanceDataWriter; -class RenderMaterial; -class Renderable; -class IRenderMesh; -// Add By Lixu Begin -class SimpleMesh; -// Add By Lixu End - -namespace physx -{ -class PxCpuDispatcher; -class PxFoundation; -class PxPhysics; -class PxCooking; -class PxPvd; -class PxCudaContextManager; -class PxDefaultCpuDispatcher; -} - - -/** -SampleController which manages all the PhysX related work: -1. initialization, scene updates, release. -2. it can create update and render physx primitives. They are represented by PhysXController::Actor, see public API. -3. provides ability to drag actors by mouse or other similar input - -NOTE: this class does too much, probably should be split in a few smaller ones. -*/ -class PhysXController : public ISampleController -{ - public: - - //////// Actor //////// - - class Actor - { - public: - - Actor(PhysXController* controller, PxRigidActor* actor, bool ownPxActor = true); - ~Actor(); - - void setColor(DirectX::XMFLOAT4 color); - DirectX::XMFLOAT4 getColor() const { return m_color; } - - bool isHidden() { return m_hidden; } - void setHidden(bool hidden); - - void update(); - PxRigidActor* getActor() const { return m_actor; } - - bool ownsPxActor() const { return m_ownPxActor; } - - private: - PhysXController* m_controller; - PxRigidActor* m_actor; - std::vector<PxShape*> m_shapes; - - std::vector<Renderable*> m_renderables; - DirectX::XMFLOAT4 m_color; - - bool m_hidden; - bool m_ownPxActor; - }; - - - //////// ctor //////// - - PhysXController(PxSimulationFilterShader filterShader); - virtual ~PhysXController(); - - - //////// virtual callbacks //////// - - virtual void onInitialize() override; - virtual void onTerminate() override; - - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - - - //////// public API //////// - - void simulationBegin(float dt); - void simualtionSyncEnd(); - - void getEyePoseAndPickDir(float mouseX, float mouseY, PxVec3& eyePos, PxVec3& pickDir); - - // wrappers to physx calls - PxRigidDynamic* createRigidDynamic(const PxTransform& transform); - void releaseRigidDynamic(PxRigidDynamic*); - - Actor* spawnPhysXPrimitiveBox(const PxTransform& position, PxVec3 extents = PxVec3(1, 1, 1), float density = 2000.0f); - Actor* spawnPhysXPrimitivePlane(const PxPlane& plane); - Actor* spawnPhysXPrimitive(PxRigidActor* actor, bool addToScene = true, bool ownPxActor = true); - void removePhysXPrimitive(Actor*); - - IRenderMesh* getConvexRenderMesh(const PxConvexMesh* mesh); - IRenderMesh* getRenderMeshForShape(const PxShape* shape); - PxVec3 getMeshScaleForShape(const PxShape* shape); - - void removeUnownedPhysXActors(); - - bool isPaused() const - { - return m_paused; - } - - void setPaused(bool paused); - void ResetUpDir(bool zup); - - void setDraggingEnabled(bool enabled); - bool getDraggingEnabled() const { return m_draggingEnabled; } - void resetDragging(); - - void notifyRigidDynamicDestroyed(PxRigidDynamic*); - - void explode(PxVec3 worldPos, float damageRadius, float explosiveImpulse); - void explodeDelayed(PxVec3 worldPos, float damageRadius, float explosiveImpulse); - - void drawUI(); - - //////// public getters //////// - - double getLastSimulationTime() const - { - return m_lastSimulationTime; - } - - RenderMaterial* getPrimitiveRenderMaterial() - { - return m_physXPrimitiveRenderMaterial; - } - -// Add By Lixu Begin - bool ExportCollisionRepX(const char* fname, physx::PxPhysics* pSDK, physx::PxScene* pScene, bool asBinary); - void ClearOldCOllisions(); - RenderMaterial* getFBXRenderMaterial() - { - return m_physXPlaneRenderMaterial; - } - bool m_bFirstTime; - bool isPlaneVisible(); - void setPlaneVisible(bool bVisible); - - PxScene& getEditPhysXScene() const - { - return *m_editPhysicsScene; - } - - PxRigidDynamic* createEditPhysXActor(const std::vector<BlastModel::Chunk::Mesh>& meshes, const PxTransform& pos); -// Add By Lixu End - - PxPhysics& getPhysics() const - { - return *m_physics; - } - - PxScene& getPhysXScene() const - { - return *m_physicsScene; - } - - PxMaterial* getDefaultMaterial() const - { - return m_defaultMaterial; - } - - PxCooking& getCooking() const - { - return *m_cooking; - } - - PxDefaultCpuDispatcher* getCPUDispatcher() const - { - return m_dispatcher; - } - - void setPerformanceWriter(PerformanceDataWriter* perfWriter) - { - m_perfWriter = perfWriter; - } - - bool getGPUPhysicsAvailable() const - { - return m_gpuPhysicsAvailable; - } - - void setUseGPUPhysics(bool useGPUPhysics); - - bool getUseGPUPhysics() const - { - return m_useGPUPhysics; - } - - const PxVec3& getDragActorHookLocalPoint() const - { - return m_draggingActorHookLocalPoint; - } - - const PxVec3& getDragVector() const - { - return m_dragVector; - } - - PxRigidDynamic* getDraggingActor() const - { - return m_draggingActor; - } - - private: - //////// internal methods //////// - - void initPhysX(); - void releasePhysX(); - - void initPhysXPrimitives(); - void releasePhysXPrimitives(); - void updateActorTransforms(); - void updateDragging(double dt); - void processExplosionQueue(); - - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - - //////// internal data //////// - - // PhysX - PxFoundation* m_foundation; - PxPhysics* m_physics; - PxCooking* m_cooking; - PxPvd* m_pvd; - PxCudaContextManager* m_cudaContext; - PxDefaultCpuDispatcher* m_dispatcher; - PxMaterial* m_defaultMaterial; - PxSimulationFilterShader m_filterShader; - PxScene* m_physicsScene; - // Add By Lixu Begin - PxScene* m_editPhysicsScene; - // Add By Lixu End - - // PhysX API related - std::vector<PxActor*> m_physXActorsToRemove; - - // primitives/actors - std::set<Actor*> m_actors; - std::map<const PxConvexMesh*, IRenderMesh*> m_convexRenderMeshes; - RenderMaterial* m_physXPrimitiveRenderMaterial; - RenderMaterial* m_physXPlaneRenderMaterial; - RenderMaterial* m_physXPrimitiveTransparentRenderMaterial; - - // simulation - bool m_isSimulating; - bool m_gpuPhysicsAvailable; - bool m_useGPUPhysics; - double m_lastSimulationTime; - LARGE_INTEGER m_performanceFreq; - bool m_paused; - bool m_useFixedTimeStep; - float m_fixedTimeStep; - float m_timeAccumulator; - uint32_t m_substepCount; - int32_t m_maxSubstepCount; - - // dragging - bool m_draggingEnabled; - PxRigidDynamic* m_draggingActor; - PxVec3 m_draggingActorHookLocalPoint; - PxVec3 m_dragAttractionPoint; - PxVec3 m_dragVector; - float m_dragDistance; - DebugRenderBuffer m_dragDebugRenderBuffer; - PxVec3 m_draggingActorLastHookWorldPoint; - bool m_draggingTryReconnect; - - // Performance writer - PerformanceDataWriter* m_perfWriter; - - // explosion - struct ExplosionData - { - PxVec3 worldPos; - float damageRadius; - float explosiveImpulse; - }; - - std::vector<ExplosionData> m_explosionQueue; - -}; - -#endif diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ConvexRenderMesh.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ConvexRenderMesh.cpp deleted file mode 100644 index dc938b9..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ConvexRenderMesh.cpp +++ /dev/null @@ -1,100 +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 "ConvexRenderMesh.h" -#include "Renderer.h" -#include "PxConvexMesh.h" - - -struct Vertex -{ - PxVec3 position; - PxVec3 normal; -}; - -ConvexRenderMesh::ConvexRenderMesh(const PxConvexMesh* mesh) -{ - const uint32_t nbPolygons = mesh->getNbPolygons(); - const uint8_t* indexBuffer = mesh->getIndexBuffer(); - const PxVec3* meshVertices = mesh->getVertices(); - - uint32_t nbVerts = 0; - uint32_t nbFaces = 0; - - for (uint32_t i = 0; i < nbPolygons; i++) - { - PxHullPolygon data; - mesh->getPolygonData(i, data); - uint32_t nbPolyVerts = data.mNbVerts; - nbVerts += nbPolyVerts; - nbFaces += (nbPolyVerts - 2) * 3; - } - - std::vector<Vertex> vertices; - std::vector<uint16_t> faces; - - vertices.resize(nbVerts); - faces.resize(nbFaces); - - uint32_t vertCounter = 0; - uint32_t facesCounter = 0; - for (uint32_t i = 0; i < nbPolygons; i++) - { - PxHullPolygon data; - mesh->getPolygonData(i, data); - - PxVec3 normal(data.mPlane[0], data.mPlane[1], data.mPlane[2]); - - uint32_t vI0 = vertCounter; - for (uint32_t vI = 0; vI < data.mNbVerts; vI++) - { - vertices[vertCounter].position = meshVertices[indexBuffer[data.mIndexBase + vI]]; - vertices[vertCounter].normal = normal; - vertCounter++; - } - - for (uint32_t vI = 1; vI < uint32_t(data.mNbVerts) - 1; vI++) - { - faces[facesCounter++] = uint16_t(vI0); - faces[facesCounter++] = uint16_t(vI0 + vI + 1); - faces[facesCounter++] = uint16_t(vI0 + vI); - } - } - - std::vector<D3D11_INPUT_ELEMENT_DESC> layout; - layout.push_back({ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - layout.push_back({ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - - initialize(vertices.data(), (uint32_t)vertices.size(), sizeof(Vertex), layout, faces.data(), nbFaces); -} - - -ConvexRenderMesh::~ConvexRenderMesh() -{ -} - diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ConvexRenderMesh.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ConvexRenderMesh.h deleted file mode 100644 index f7bc5c6..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ConvexRenderMesh.h +++ /dev/null @@ -1,52 +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. - - -#ifndef CONVEX_RENDER_MESH_H -#define CONVEX_RENDER_MESH_H - -#include "CustomRenderMesh.h" - -namespace physx -{ -class PxConvexMesh; -} - - -/** -PxConvexMesh render mesh -(this class relates to PhysX more then to Renderer) -*/ -class ConvexRenderMesh : public CustomRenderMesh -{ -public: - ConvexRenderMesh(const PxConvexMesh* mesh); - virtual ~ConvexRenderMesh(); -}; - - -#endif //CONVEX_RENDER_MESH_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/CustomRenderMesh.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/CustomRenderMesh.cpp deleted file mode 100644 index 0feae3f..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/CustomRenderMesh.cpp +++ /dev/null @@ -1,114 +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 "CustomRenderMesh.h" - - -CustomRenderMesh::CustomRenderMesh() - : m_indexBuffer(nullptr) -{ -} - -CustomRenderMesh::CustomRenderMesh(const void* vertices, uint32_t numVertices, uint32_t vertexSize, std::vector<D3D11_INPUT_ELEMENT_DESC>& inputDesc, const uint16_t* faces, uint32_t numFaces) - : m_indexBuffer(nullptr) -{ - initialize(vertices, numVertices, vertexSize, inputDesc, faces, numFaces); -} - -void CustomRenderMesh::initialize(const void* vertices, uint32_t numVertices, uint32_t vertexSize, std::vector<D3D11_INPUT_ELEMENT_DESC>& inputDesc, const uint16_t* faces, uint32_t numFaces) -{ - ID3D11Device* device = GetDeviceManager()->GetDevice(); - - m_inputDesc = inputDesc; - m_numVertices = numVertices; - m_vertexSize = vertexSize; - m_numFaces = numFaces; - - // VB - { - D3D11_SUBRESOURCE_DATA vertexBufferData; - - ZeroMemory(&vertexBufferData, sizeof(vertexBufferData)); - vertexBufferData.pSysMem = vertices; - - D3D11_BUFFER_DESC bufferDesc; - - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.ByteWidth = vertexSize * numVertices; - bufferDesc.CPUAccessFlags = 0; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; - - V(device->CreateBuffer(&bufferDesc, &vertexBufferData, &m_vertexBuffer)); - } - - // IB - if (faces != nullptr) - { - D3D11_SUBRESOURCE_DATA indexBufferData; - - ZeroMemory(&indexBufferData, sizeof(indexBufferData)); - indexBufferData.pSysMem = faces; - - D3D11_BUFFER_DESC bufferDesc; - - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; - bufferDesc.ByteWidth = sizeof(uint16_t) * numFaces; - bufferDesc.CPUAccessFlags = 0; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; - - V(device->CreateBuffer(&bufferDesc, &indexBufferData, &m_indexBuffer)); - } -} - -CustomRenderMesh::~CustomRenderMesh() -{ - SAFE_RELEASE(m_vertexBuffer); - SAFE_RELEASE(m_indexBuffer); -} - - -void CustomRenderMesh::render(ID3D11DeviceContext& context) const -{ - context.IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - UINT strides[1] = { m_vertexSize }; - UINT offsets[1] = { 0 }; - context.IASetVertexBuffers(0, 1, &m_vertexBuffer, strides, offsets); - - context.IASetIndexBuffer(m_indexBuffer, DXGI_FORMAT_R16_UINT, 0); - - if (m_indexBuffer) - context.DrawIndexed(m_numFaces, 0, 0); - else - context.Draw(m_numVertices, 0); -} - diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/CustomRenderMesh.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/CustomRenderMesh.h deleted file mode 100644 index 025d3bf..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/CustomRenderMesh.h +++ /dev/null @@ -1,59 +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. - - -#ifndef CUSTOM_RENDER_MESH_H -#define CUSTOM_RENDER_MESH_H - -#include "Renderable.h" - - -class CustomRenderMesh : public IRenderMesh -{ -public: - const std::vector<D3D11_INPUT_ELEMENT_DESC>& getInputElementDesc() const { return m_inputDesc; } - void render(ID3D11DeviceContext& context) const; - - CustomRenderMesh(const void* vertices, uint32_t numVertices, uint32_t vertexSize, std::vector<D3D11_INPUT_ELEMENT_DESC>& inputDesc, const uint16_t* faces = nullptr, uint32_t numFaces = 0); - virtual ~CustomRenderMesh(); - -protected: - CustomRenderMesh(); - void initialize(const void* vertices, uint32_t numVertices, uint32_t vertexSize, std::vector<D3D11_INPUT_ELEMENT_DESC>& inputDesc, const uint16_t* faces, uint32_t numFaces); - -private: - ID3D11Buffer* m_vertexBuffer; - ID3D11Buffer* m_indexBuffer; - uint32_t m_numFaces; - uint32_t m_numVertices; - uint32_t m_vertexSize; - - std::vector<D3D11_INPUT_ELEMENT_DESC> m_inputDesc; -}; - - -#endif //CUSTOM_RENDER_MESH_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/DebugRenderBuffer.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/DebugRenderBuffer.h deleted file mode 100644 index 06cd509..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/DebugRenderBuffer.h +++ /dev/null @@ -1,68 +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. - - -#ifndef DEBUGRENDERBUFFER_H -#define DEBUGRENDERBUFFER_H - -#include "PxRenderBuffer.h" -#include <vector> - -using namespace physx; - - -/** -Simple PxRenderBuffer implementation for easy debug primitives adding -*/ -class DebugRenderBuffer : public PxRenderBuffer -{ -public: - ~DebugRenderBuffer() {} - - virtual PxU32 getNbPoints() const { return 0; } - virtual const PxDebugPoint* getPoints() const { return nullptr; } - - virtual PxU32 getNbLines() const { return static_cast<PxU32>(m_lines.size()); } - virtual const PxDebugLine* getLines() const { return m_lines.data(); } - - virtual PxU32 getNbTriangles() const { return 0; } - virtual const PxDebugTriangle* getTriangles() const { return nullptr; } - - virtual PxU32 getNbTexts() const { return 0; } - virtual const PxDebugText* getTexts() const { return nullptr; } - - virtual void append(const PxRenderBuffer& other) {} - virtual void clear() - { - m_lines.clear(); - } - - std::vector<PxDebugLine> m_lines; -}; - - -#endif //DEBUGRENDERBUFFER_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.cpp deleted file mode 100644 index c6c8398..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.cpp +++ /dev/null @@ -1,30 +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 "Mesh.h" - diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.h deleted file mode 100644 index 3ef7090..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Mesh.h +++ /dev/null @@ -1,74 +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. - - -#ifndef MESH_H -#define MESH_H - -#include <vector> -#include "PxVec2.h" -#include "PxVec3.h" - -// Add By Lixu Begin -class MeshBase -// Add By Lixu End -{ - virtual uint32_t getVertexStride() = 0; - // ... TBD -}; - -/** -SimpleMesh: position + normal + uv -We use only this type everywhere, once other versions will be required we should generalize Mesh and refactor code. -*/ -// Add By Lixu Begin -class SimpleMesh : public MeshBase -// Add By Lixu End -{ -public: - - class Vertex - { - public: - physx::PxVec3 position; - physx::PxVec3 normal; - physx::PxVec3 facenormal; - physx::PxVec3 tangent; - physx::PxVec2 uv; - }; - - virtual uint32_t getVertexStride() { return sizeof(Vertex); } - - std::vector<Vertex> vertices; - std::vector<uint16_t> indices; - - physx::PxVec3 extents; - physx::PxVec3 center; -}; - - -#endif //MESH_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/PrimitiveRenderMesh.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/PrimitiveRenderMesh.cpp deleted file mode 100644 index bcb1580..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/PrimitiveRenderMesh.cpp +++ /dev/null @@ -1,301 +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 "PrimitiveRenderMesh.h" -#include "Renderer.h" - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Base Mesh internal class -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -PrimitiveRenderMesh::PrimitiveRenderMesh(const float v[], UINT numVertices) -{ - std::vector<D3D11_INPUT_ELEMENT_DESC> layout; - layout.push_back({ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - layout.push_back({ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - - initialize(v, numVertices, sizeof(float) * 6, layout, nullptr, 0); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Box Mesh -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const float boxVertices[] = -{ - -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, - 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, - 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, - 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, - -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f, - -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, - - -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, - -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, - -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, - - -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, - -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, - -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, - -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, - -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, - -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, - - 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, - 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, - 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, - 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, - 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, - - -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, - 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, - 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, - 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, - -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f, - -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f, - - -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, - 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, - 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, - 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, - -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, - -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f -}; - -BoxRenderMesh::BoxRenderMesh() : PrimitiveRenderMesh(boxVertices, sizeof(boxVertices) / (6 * sizeof(boxVertices[0]))) {} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Plane Mesh -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const float planeSize = 1.0f; // we use scaling instead -const float planeTilesCount = 1000.0f; - -const float planeVertices[] = -{ - 0, planeSize, planeSize, 1.0f, 0.0f, 0.0f, planeTilesCount, planeTilesCount, - 0, planeSize, -planeSize, 1.0f, 0.0f, 0.0f, planeTilesCount, -planeTilesCount, - 0, -planeSize, -planeSize, 1.0f, 0.0f, 0.0f, -planeTilesCount, -planeTilesCount, - 0, -planeSize, -planeSize, 1.0f, 0.0f, 0.0f, -planeTilesCount, -planeTilesCount, - 0, -planeSize, planeSize, 1.0f, 0.0f, 0.0f, -planeTilesCount, planeTilesCount, - 0, planeSize, planeSize, 1.0f, 0.0f, 0.0f, planeTilesCount, planeTilesCount -}; - -PlaneRenderMesh::PlaneRenderMesh() -{ - std::vector<D3D11_INPUT_ELEMENT_DESC> layout; - layout.push_back({ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - layout.push_back({ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - layout.push_back({ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - - initialize(planeVertices, sizeof(planeVertices) / (8 * sizeof(planeVertices[0])), sizeof(float) * 8, layout, nullptr, 0); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Sphere Mesh -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -const uint32_t g_numSlices = 8; // along lines of longitude -const uint32_t g_numStacks = 16; // along lines of latitude - -const uint32_t g_numSphereVertices = (g_numSlices * 2 + 1)*(g_numStacks + 1); -const uint32_t g_numSphereIndices = g_numSlices * 2 * g_numStacks * 6; - -const uint32_t g_numConeVertices = (g_numSlices * 2 + 1) * 2; -const uint32_t g_numConeIndices = g_numSlices * 2 * 6; - -PxVec3 g_spherePositions[g_numSphereVertices]; -uint16_t g_sphereIndices[g_numSphereIndices]; - -void generateSphereMesh(uint16_t slices, uint16_t stacks, PxVec3* positions, uint16_t* indices) -{ - const PxF32 thetaStep = PxPi / stacks; - const PxF32 phiStep = PxTwoPi / (slices * 2); - - PxF32 theta = 0.0f; - - // generate vertices - for (uint16_t y = 0; y <= stacks; ++y) - { - PxF32 phi = 0.0f; - - PxF32 cosTheta = PxCos(theta); - PxF32 sinTheta = PxSin(theta); - - for (uint16_t x = 0; x <= slices * 2; ++x) - { - PxF32 cosPhi = PxCos(phi); - PxF32 sinPhi = PxSin(phi); - - PxVec3 p(cosPhi*sinTheta, cosTheta, sinPhi*sinTheta); - - // write vertex - *(positions++) = p; - - phi += phiStep; - } - - theta += thetaStep; - } - - const uint16_t numRingQuads = 2 * slices; - const uint16_t numRingVerts = 2 * slices + 1; - - // add faces - for (uint16_t y = 0; y < stacks; ++y) - { - for (uint16_t i = 0; i < numRingQuads; ++i) - { - // add a quad - *(indices++) = (y + 0)*numRingVerts + i; - *(indices++) = (y + 1)*numRingVerts + i; - *(indices++) = (y + 1)*numRingVerts + i + 1; - - *(indices++) = (y + 1)*numRingVerts + i + 1; - *(indices++) = (y + 0)*numRingVerts + i + 1; - *(indices++) = (y + 0)*numRingVerts + i; - } - } -} - - -struct SphereVertex -{ - PxVec3 position; - PxVec3 normal; -}; - -SphereRenderMesh::SphereRenderMesh() -{ - generateSphereMesh(g_numSlices, g_numStacks, g_spherePositions, g_sphereIndices); - - std::vector<SphereVertex> vertices; - for (uint32_t i = 0; i < g_numSphereVertices; i++) - { - vertices.push_back({ g_spherePositions[i], g_spherePositions[i] }); - } - - std::vector<D3D11_INPUT_ELEMENT_DESC> layout; - layout.push_back({ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - layout.push_back({ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - - initialize(vertices.data(), (uint32_t)vertices.size(), sizeof(SphereVertex), layout, g_sphereIndices, g_numSphereIndices); -} - - -SphereRenderMesh::~SphereRenderMesh() -{ -} - -// Add By Lixu Begin -const float coneVertices[] = -{ - 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f,//top - -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f,//left bottom - -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f,//left top - - 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f,//top - 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,//right top - 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f,//right bottom - - 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f,//top - -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,//left top - 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,//right top - - 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,//top - 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,//right bottom - -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,//left bottom - - -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,//left top - 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f,//right bottom - 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,//right top - - 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f,//right bottom - -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,//left top - -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f,//left bottom -}; - -ConeRenderMesh::ConeRenderMesh() : PrimitiveRenderMesh(coneVertices, sizeof(coneVertices) / (6 * sizeof(coneVertices[0]))) {} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// FBX Mesh class -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#include <AnimUtil.h> -#include <PxVec2.h> -#include <vector> - -struct FBXVertex -{ - PxVec3 position; - PxVec3 normal; - PxVec2 uv; -}; - -FBXRenderMesh::FBXRenderMesh(MeshDesc* pMeshData) -{ - std::vector<D3D11_INPUT_ELEMENT_DESC> layout; - layout.push_back({ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - layout.push_back({ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - layout.push_back({ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - - std::vector<FBXVertex> vertices; - std::vector<uint16_t> indices; - - for (uint32_t i = 0; i < pMeshData->m_NumVertices; ++i) - { - atcore_float3 pos = pMeshData->m_pVertices[i]; - atcore_float3 vertexNormal = pMeshData->m_pVertexNormals[i]; - atcore_float2 texcoord = pMeshData->m_pTexCoords[i]; - - FBXVertex newVertex; - newVertex.position = physx::PxVec3(pos.x, pos.y, pos.z); - newVertex.normal = physx::PxVec3(vertexNormal.x, vertexNormal.y, vertexNormal.z); - newVertex.uv = physx::PxVec2(texcoord.x, texcoord.y); - - vertices.push_back(newVertex); - } - - for (uint32_t i = 0; i < pMeshData->m_NumTriangles; ++i) - { - indices.push_back(pMeshData->m_pIndices[i * 3 + 0]); - indices.push_back(pMeshData->m_pIndices[i * 3 + 1]); - indices.push_back(pMeshData->m_pIndices[i * 3 + 2]); - } - - initialize(vertices.data(), (uint32_t)vertices.size(), sizeof(FBXVertex), layout, indices.data(), (uint32_t)indices.size()); -} -// Add By Lixu End
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/PrimitiveRenderMesh.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/PrimitiveRenderMesh.h deleted file mode 100644 index 107af25..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/PrimitiveRenderMesh.h +++ /dev/null @@ -1,99 +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. - - -#ifndef PRIMITIVE_RENDER_MESH_H -#define PRIMITIVE_RENDER_MESH_H - -#include "Utils.h" -#include <DirectXMath.h> - -#include <vector> -#include "Renderable.h" -#include "CustomRenderMesh.h" - - -class PrimitiveRenderMesh : public CustomRenderMesh -{ -protected: - PrimitiveRenderMesh(const float v[], UINT numVertices); -}; - -class BoxRenderMesh : public PrimitiveRenderMesh -{ -public: - BoxRenderMesh(); -}; - - -class PlaneRenderMesh : public CustomRenderMesh -{ -public: - PlaneRenderMesh(); -}; - - -class SphereRenderMesh : public CustomRenderMesh -{ -public: - SphereRenderMesh(); - virtual ~SphereRenderMesh(); -}; - - -// Add By Lixu Begin -class ConeRenderMesh : public PrimitiveRenderMesh -{ -public: - ConeRenderMesh(); -}; - -class MeshDesc; - -class FBXRenderMesh : public CustomRenderMesh -{ -public: - FBXRenderMesh(MeshDesc* pMeshData); -}; -// Add By Lixu End - - -struct PrimitiveRenderMeshType -{ - enum Enum - { - Box, - Plane, - Sphere, -// Add By Lixu Begin - Cone, -// Add By Lixu End - Count - }; -}; - -#endif //PRIMITIVE_RENDER_MESH_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.cpp deleted file mode 100644 index 88533cb..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.cpp +++ /dev/null @@ -1,353 +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 "RenderMaterial.h" -#include <DirectXMath.h> -#include "ShaderUtils.h" -#include "Renderer.h" -#include "SampleManager.h" -#include "Light.h" -#include "D3D11TextureResource.h" -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// RenderMaterial -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -RenderMaterial::RenderMaterial(const char* materialName, ResourceManager& resourceCallback, const char* shaderFileName, - const char* textureFileName, BlendMode blendMode) -{ - mMaterialName = materialName; - setDiffuseColor(0.5, 0.5, 0.5, 1.0); - mTextureFileNames[TT_Diffuse] = textureFileName; - - this->initialize(resourceCallback, shaderFileName, textureFileName, blendMode); -} - -RenderMaterial::RenderMaterial(const char* materialName, ResourceManager& resourceCallback, const char* shaderFileName, float r, float g, float b, float a, BlendMode blendMode) -{ - mMaterialName = materialName; - setDiffuseColor(r, g, b, a); - this->initialize(resourceCallback, shaderFileName, "", blendMode); -} - -void RenderMaterial::initialize(ResourceManager& resourceCallback, const char* shaderFileName, const char* textureFileName, BlendMode blendMode) -{ - std::vector<std::string> v; - v.push_back(shaderFileName); - initialize(resourceCallback, v, textureFileName, blendMode); -} - -void RenderMaterial::initialize(ResourceManager& resourceCallback, std::vector<std::string> shaderFileNames, const char* textureFileName, BlendMode blendMode) -{ - for (int i = 0; i < TT_Num; i++) - { - m_TextureSRVs[i] = nullptr; - mTextureResources[i] = nullptr; - } - mBlendState = nullptr; - - memset(mSpecularColor, 0, sizeof(float) * 4); - mSpecularShininess = 20; - - for (uint32_t i = 0; i < shaderFileNames.size(); i++) - { - const ShaderFileResource* resource = resourceCallback.requestShaderFile(shaderFileNames[i].c_str()); - if (resource) - { - std::string shaderFilePath = resource->path; - mShaderFilePathes.push_back(shaderFilePath); - } - } - mShaderGroups.reserve(mShaderFilePathes.size()); - - if (!mTextureFileNames[TT_Diffuse].empty()) - { - mTextureResources[TT_Diffuse] = resourceCallback.requestTexture(mTextureFileNames[TT_Diffuse].c_str()); - } - - setBlending(blendMode); - - reload(); -} - -void RenderMaterial::releaseReloadableResources() -{ - for (std::vector<ShaderGroup*>::iterator it = mShaderGroups.begin(); it != mShaderGroups.end(); it++) - { - delete *it; - } - mShaderGroups.clear(); - -// Add By Lixu Begin - for (std::map<const IRenderMesh*, Instance*>::iterator it = mRenderMeshToInstanceMap.begin(); - it != mRenderMeshToInstanceMap.end(); it++) - { - delete it->second; - } - mRenderMeshToInstanceMap.clear(); -// Add By Lixu End - - for (int i = 0; i < TT_Num; i++) - { - SAFE_RELEASE(m_TextureSRVs[i]); - } -} - -RenderMaterial::~RenderMaterial() -{ - releaseReloadableResources(); - SAFE_RELEASE(mBlendState); -} - -void RenderMaterial::setBlending(BlendMode blendMode) -{ - mBlendMode = blendMode; - - SAFE_RELEASE(mBlendState); - - D3D11_BLEND_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - - switch (blendMode) - { - case BLEND_NONE: - desc.RenderTarget[0].BlendEnable = FALSE; - desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - break; - case BLEND_ALPHA_BLENDING: - desc.AlphaToCoverageEnable = FALSE; - desc.IndependentBlendEnable = TRUE; - desc.RenderTarget[0].BlendEnable = TRUE; - desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - break; - case BLEND_ADDITIVE: // actually, is's additive by alpha - desc.AlphaToCoverageEnable = FALSE; - desc.IndependentBlendEnable = TRUE; - desc.RenderTarget[0].BlendEnable = TRUE; - desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_ONE; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - break; - default: - PX_ALWAYS_ASSERT_MESSAGE("Unknown blend mode"); - } - - ID3D11Device* device = GetDeviceManager()->GetDevice(); - V(device->CreateBlendState(&desc, &mBlendState)); -} - -void RenderMaterial::reload() -{ - releaseReloadableResources(); - - // load shaders - ID3D11Device* device = GetDeviceManager()->GetDevice(); - - for (std::vector<std::string>::iterator it = mShaderFilePathes.begin(); it != mShaderFilePathes.end(); it++) - { - const char* shaderFilePath = (*it).c_str(); - ShaderGroup* shaderGroup = new ShaderGroup(); - V(createShaderFromFile(device, shaderFilePath, "VS", &(shaderGroup->vs), shaderGroup->buffer)); - createShaderFromFile(device, shaderFilePath, "PS", &shaderGroup->ps); - createShaderFromFile(device, shaderFilePath, "GS", &shaderGroup->gs); - mShaderGroups.push_back(shaderGroup); - } - - // load texture - for (int i = 0; i < TT_Num; i++) - { - if (mTextureResources[i]) - { - V(DirectX::CreateShaderResourceView(device, - mTextureResources[i]->image.GetImages(), - mTextureResources[i]->image.GetImageCount(), - mTextureResources[i]->metaData, &m_TextureSRVs[i])); - } - } -} - - - -RenderMaterial::InstancePtr RenderMaterial::getMaterialInstance(const IRenderMesh* mesh) -{ - // look in cache - auto it = mRenderMeshToInstanceMap.find(mesh); - if (it != mRenderMeshToInstanceMap.end()) - { -// Add By Lixu Begin - /* - if (!(*it).second.expired()) - { - return (*it).second.lock(); - } - */ - return it->second; -// Add By Lixu End - } - - // create new - const std::vector<D3D11_INPUT_ELEMENT_DESC>& descs = mesh->getInputElementDesc(); - RenderMaterial::InstancePtr instance = getMaterialInstance(&descs[0], (uint32_t)descs.size()); - mRenderMeshToInstanceMap[mesh] = instance; - return instance; -} - -RenderMaterial::InstancePtr RenderMaterial::getMaterialInstance(const D3D11_INPUT_ELEMENT_DESC* elementDescs, uint32_t numElements) -{ - ID3D11Device* device = GetDeviceManager()->GetDevice(); - - for (uint32_t i = 0; i < mShaderGroups.size(); i++) - { - if (mShaderGroups[i]->buffer == NULL) - continue; - - ID3D11InputLayout* inputLayout = NULL; - device->CreateInputLayout(elementDescs, numElements, mShaderGroups[i]->buffer->GetBufferPointer(), mShaderGroups[i]->buffer->GetBufferSize(), &inputLayout); - - if (inputLayout) - { - RenderMaterial::InstancePtr materialInstance(new Instance(*this, inputLayout, i)); - return materialInstance; - } - } - PX_ALWAYS_ASSERT(); - return NULL; -} - -void RenderMaterial::Instance::bind(ID3D11DeviceContext& context, uint32_t slot, bool depthStencilOnly) -{ - mMaterial.mShaderGroups[mShaderNum]->Set(&context, !depthStencilOnly); - - GPUShaderResource* pResource = Light::GetEnvTextureSRV(); - ID3D11ShaderResourceView* pEnvTextureSRV = D3D11TextureResource::GetResource(pResource); - - context.OMSetBlendState(mMaterial.mBlendState, nullptr, 0xFFFFFFFF); - context.PSSetShaderResources(slot, TT_Num, mMaterial.m_TextureSRVs); - context.PSSetShaderResources(TT_Num, 1, &pEnvTextureSRV); - context.IASetInputLayout(mInputLayout); -} - -bool RenderMaterial::Instance::isValid() -{ - return mMaterial.mShaderGroups.size() > 0 && mMaterial.mShaderGroups[mShaderNum]->IsValid(); -} - -// Add By Lixu Begin -void RenderMaterial::setTextureFileName(std::string textureFileName, TextureType tt) -{ - if (mTextureFileNames[tt] == textureFileName) - { - return; - } - mTextureFileNames[tt] = textureFileName; - - mTextureResources[tt] = nullptr; - SAFE_RELEASE(m_TextureSRVs[tt]); - - if (mTextureFileNames[tt].empty()) - { - return; - } - - std::string searchDir = mTextureFileNames[tt]; - size_t ind = searchDir.find_last_of('/'); - if (ind > 0 && (ind != std::string::npos)) - searchDir = searchDir.substr(0, ind); - - ResourceManager* pResourceManager = ResourceManager::ins(); - pResourceManager->addSearchDir(searchDir.c_str()); - mTextureResources[tt] = pResourceManager->requestTexture(mTextureFileNames[tt].c_str()); - if (mTextureResources[tt] == nullptr) - { - return; - } - - ID3D11Device* device = GetDeviceManager()->GetDevice(); - DirectX::CreateShaderResourceView(device, - mTextureResources[tt]->image.GetImages(), - mTextureResources[tt]->image.GetImageCount(), - mTextureResources[tt]->metaData, &m_TextureSRVs[tt]); -} - -void RenderMaterial::setDiffuseColor(float r, float g, float b, float a) -{ - mDiffuseColor[0] = r; - mDiffuseColor[1] = g; - mDiffuseColor[2] = b; - mDiffuseColor[3] = a; -} - -void RenderMaterial::getDiffuseColor(float& r, float& g, float& b, float& a) -{ - r = mDiffuseColor[0]; - g = mDiffuseColor[1]; - b = mDiffuseColor[2]; - a = mDiffuseColor[3]; -} - -void RenderMaterial::setSpecularColor(float r, float g, float b, float a) -{ - mSpecularColor[0] = r; - mSpecularColor[1] = g; - mSpecularColor[2] = b; - mSpecularColor[3] = a; -} - -void RenderMaterial::getSpecularColor(float& r, float& g, float& b, float& a) -{ - r = mSpecularColor[0]; - g = mSpecularColor[1]; - b = mSpecularColor[2]; - a = mSpecularColor[3]; -} - -RenderMaterial* g_DefaultRenderMaterial = nullptr; -RenderMaterial* RenderMaterial::getDefaultRenderMaterial() -{ - if (g_DefaultRenderMaterial == nullptr) - { - ResourceManager* pResourceManager = ResourceManager::ins(); - g_DefaultRenderMaterial = new RenderMaterial("", *pResourceManager, "model_simple_textured_ex", 0.5, 0.5, 0.5); - } - return g_DefaultRenderMaterial; -} - -bool RenderMaterial::isBadTexture(TextureType tt) -{ - return (nullptr == m_TextureSRVs[tt]); -} -// Add By Lixu End
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.h deleted file mode 100644 index 27f0672..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderMaterial.h +++ /dev/null @@ -1,178 +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. - - -#ifndef RENDER_MATERIAL_H -#define RENDER_MATERIAL_H - -#include "Utils.h" -#include "DirectXTex.h" - -#include <string> -#include <vector> -#include <list> -#include <map> -#include <memory> - - -class IRenderMesh; -class ResourceManager; -struct TextureResource; -class Renderable; - - -class RenderMaterial -{ - public: - - enum BlendMode - { - BLEND_NONE, - BLEND_ALPHA_BLENDING, - BLEND_ADDITIVE - }; - - enum TextureType - { - TT_Diffuse, - TT_Specular, - TT_Normal, - TT_Num - }; - - RenderMaterial(const char* materialName, ResourceManager& resourceProvider, const char* shaderFileName, const char* textureFileName = "", BlendMode blendMode = BLEND_NONE); - RenderMaterial(const char* materialName, ResourceManager& resourceProvider, const char* shaderFileName, float r, float g, float b, float a = 1.0, BlendMode blendMode = BLEND_NONE); - ~RenderMaterial(); - - void setBlending(BlendMode blendMode); - BlendMode getBlending() const { return mBlendMode; } - - void reload(); - - class Instance - { - public: - Instance(RenderMaterial& material, ID3D11InputLayout* inputLayout, uint32_t shaderNum = 0) : mMaterial(material), mInputLayout(inputLayout), mShaderNum(shaderNum) {} - ~Instance() { SAFE_RELEASE(mInputLayout); } - - bool isValid(); - void bind(ID3D11DeviceContext& context, uint32_t slot, bool depthStencilOnly = false); - RenderMaterial& getMaterial() const { return mMaterial; } - private: - RenderMaterial& mMaterial; - ID3D11InputLayout* mInputLayout; - uint32_t mShaderNum; - }; - -// Add By Lixu Begin - typedef Instance* InstancePtr; - std::string getMaterialName(){ return mMaterialName; } - void setMaterialName(std::string materialName){ mMaterialName = materialName; } - std::string getTextureFileName(TextureType tt = TT_Diffuse){ return mTextureFileNames[tt]; } - void setTextureFileName(std::string textureFileName, TextureType tt = TT_Diffuse); - void getDiffuseColor(float& r, float& g, float& b, float& a); - void setDiffuseColor(float r, float g, float b, float a = 1.0); - void getSpecularColor(float& r, float& g, float& b, float& a); - void setSpecularColor(float r, float g, float b, float a = 1.0); - float getSpecularShininess() { return mSpecularShininess; } - void setSpecularShininess(float specularShininess) { mSpecularShininess = specularShininess; } - void addRelatedRenderable(Renderable* pRenderable){ mRelatedRenderables.push_back(pRenderable); } - std::vector<Renderable*>& getRelatedRenderables(){ return mRelatedRenderables; } - void clearRelatedRenderables(){ mRelatedRenderables.clear(); } - bool isBadTexture(TextureType tt = TT_Diffuse); - static RenderMaterial* getDefaultRenderMaterial(); -// Add By Lixu End - - InstancePtr getMaterialInstance(const IRenderMesh* mesh); - InstancePtr getMaterialInstance(const D3D11_INPUT_ELEMENT_DESC* elementDescs, uint32_t numElements); - - private: - void initialize(ResourceManager& resourceCallback, const char* shaderFileName, const char* textureFileName, BlendMode blendMode); - void initialize(ResourceManager&resourceProvider, std::vector<std::string> shaderFileNames, const char* textureFileName, BlendMode blendMode); - - void releaseReloadableResources(); - - std::string mMaterialName; - std::string mShaderFileName; -// std::string mTextureFileName; - - struct ShaderGroup - { - ShaderGroup() : vs(nullptr), gs(nullptr), ps(nullptr), buffer(nullptr) - { - } - ~ShaderGroup() - { - Release(); - } - void Release() - { - SAFE_RELEASE(vs); - SAFE_RELEASE(gs); - SAFE_RELEASE(ps); - SAFE_RELEASE(buffer); - } - void Set(ID3D11DeviceContext* c, bool setPixelShader = true) - { - c->VSSetShader(vs, nullptr, 0); - c->GSSetShader(gs, nullptr, 0); - c->PSSetShader(setPixelShader ? ps : nullptr, nullptr, 0); - } - bool IsValid() - { - return vs != nullptr; - } - ID3D11VertexShader* vs; - ID3D11GeometryShader* gs; - ID3D11PixelShader* ps; - ID3DBlob* buffer; - }; - -// Add By Lixu Begin - std::map<const IRenderMesh*, Instance*> mRenderMeshToInstanceMap; - std::vector<Renderable*> mRelatedRenderables; -// float mr; -// float mg; -// float mb; -// float ma; -// Add By Lixu End -// const TextureResource* mTexture; -// ID3D11ShaderResourceView* mTextureSRV; - std::vector<std::string> mShaderFilePathes; - std::vector<ShaderGroup*> mShaderGroups; - ID3D11BlendState* mBlendState; - BlendMode mBlendMode; - - std::string mTextureFileNames[TT_Num]; - const TextureResource* mTextureResources[TT_Num]; - ID3D11ShaderResourceView* m_TextureSRVs[TT_Num]; - float mDiffuseColor[4]; - float mSpecularColor[4]; - float mSpecularShininess; -}; - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderUtils.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderUtils.h deleted file mode 100644 index 098f7a9..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RenderUtils.h +++ /dev/null @@ -1,119 +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. - - -#ifndef RENDER_UTILS_H -#define RENDER_UTILS_H - -#include "DirectXTex.h" -#include <DirectXMath.h> -#include "PxMat44.h" -#include "PxVec3.h" -#include "PxVec4.h" - -static DirectX::XMFLOAT4 getRandomPastelColor() -{ - float r = ((double)rand() / (RAND_MAX)) * 0.5f + 0.5f; - float g = ((double)rand() / (RAND_MAX)) * 0.5f + 0.5f; - float b = ((double)rand() / (RAND_MAX)) * 0.5f + 0.5f; - return DirectX::XMFLOAT4(r, g, b, 1.0f); -} - -static physx::PxMat44 XMMATRIXToPxMat44(const DirectX::XMMATRIX& mat) -{ - physx::PxMat44 m; - memcpy(const_cast<float*>(m.front()), &mat.r[0], 4 * 4 * sizeof(float)); - return m; -} - -static DirectX::XMMATRIX PxMat44ToXMMATRIX(const physx::PxMat44& mat) -{ - return DirectX::XMMATRIX(mat.front()); -} - -static physx::PxVec4 XMVECTORToPxVec4(const DirectX::XMVECTOR& vec) -{ - DirectX::XMFLOAT4 f; - DirectX::XMStoreFloat4(&f, vec); - return physx::PxVec4(f.x, f.y, f.z, f.w); -} - -static physx::PxVec3 XMFLOAT3ToPxVec3(const DirectX::XMFLOAT3& vec) -{ - return physx::PxVec3(vec.x, vec.y, vec.z); -} - -static physx::PxVec4 XMFLOAT4ToPxVec4(const DirectX::XMFLOAT4& vec) -{ - return physx::PxVec4(vec.x, vec.y, vec.z, vec.w); -} - -static uint32_t XMFLOAT4ToU32Color(const DirectX::XMFLOAT4& color) -{ - uint32_t c = 0; - c |= (int)(color.w * 255); c <<= 8; - c |= (int)(color.z * 255); c <<= 8; - c |= (int)(color.y * 255); c <<= 8; - c |= (int)(color.x * 255); - return c; -} - -static DirectX::XMFLOAT4 XMFLOAT4Lerp(const DirectX::XMFLOAT4 v0, const DirectX::XMFLOAT4 v1, float val) -{ - DirectX::XMFLOAT4 v( - v0.x * (1 - val) + v1.x * val, - v0.y * (1 - val) + v1.y * val, - v0.z * (1 - val) + v1.z * val, - v0.w * (1 - val) + v1.w * val - ); - return v; -} - -static const physx::PxVec3 forwardVector = physx::PxVec3(0, 0, 1); -static const physx::PxVec3 upVector = physx::PxVec3(0, 1, 0); -static const physx::PxVec3 rightVector = physx::PxVec3(1, 0, 0); - -PX_INLINE physx::PxQuat quatLookAt(const physx::PxVec3 direction) -{ - float d = direction.dot(forwardVector); - if (physx::PxAbs(d + 1.0f) < 1e-5f) - { - return physx::PxQuat(physx::PxPi, upVector); - } - else if (physx::PxAbs(d - 1.0f) < 1e-5f) - { - return physx::PxQuat(physx::PxIdentity); - } - else - { - float angle = physx::PxAcos(d); - physx::PxVec3 axis = forwardVector.cross(direction).getNormalized(); - return physx::PxQuat(angle, axis); - } -} - -#endif //RENDER_UTILS_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.cpp deleted file mode 100644 index b72c3b0..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.cpp +++ /dev/null @@ -1,151 +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 "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) -// Add By Lixu Begin -, m_selected(false) -, m_depthTest(true) -, m_highlight(false) -// Add By Lixu End -{ - setMaterial(material); -} - -void Renderable::setMaterial(RenderMaterial& material) -{ - material.addRelatedRenderable(this); - m_materialInstance = material.getMaterialInstance(&m_mesh); -} - -void Renderable::render(Renderer& renderer, bool depthStencilOnly) const -{ - if (renderer.bFetchSelection) - { - RenderMaterial::InstancePtr materialInstance = renderer.getSelectionRenderMaterialInstance(); - if (!materialInstance->isValid()) - { - PX_ALWAYS_ASSERT(); - return; - } - - materialInstance->bind(*renderer.m_context, 0); - - // setup object CB - { - D3D11_MAPPED_SUBRESOURCE mappedResource; - renderer.m_context->Map(renderer.m_objectCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - Renderer::CBObject* objectBuffer = (Renderer::CBObject*)mappedResource.pData; - objectBuffer->worldMatrix = PxMat44ToXMMATRIX(getModelMatrix()); - // use selected to store mUniqueId - objectBuffer->selected = m_mesh.mUniqueId; - renderer.m_context->Unmap(renderer.m_objectCB, 0); - } - - m_mesh.render(*renderer.m_context); - - return; - } - - if (!m_materialInstance->isValid()) - { - PX_ALWAYS_ASSERT(); - return; - } - - m_materialInstance->bind(*renderer.m_context, 0, depthStencilOnly); - - DirectX::XMFLOAT4 diffuseColor = getColor(); - DirectX::XMFLOAT4 specularColor = diffuseColor; - float useDiffuseTexture = -1.0; - 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 != "") - { - float r, g, b, a; - std::string texName; - - renderMaterial.getDiffuseColor(r, g, b, a); - diffuseColor = DirectX::XMFLOAT4(r, g, b, a); - renderMaterial.getSpecularColor(r, g, b, a); - specularColor = DirectX::XMFLOAT4(r, g, b, a); - - texName = renderMaterial.getTextureFileName(); - if (useTexture && texName != "" && !renderMaterial.isBadTexture()) - { - useDiffuseTexture = 1.0; - } - - texName = renderMaterial.getTextureFileName(RenderMaterial::TT_Specular); - if (useTexture && texName != "" && !renderMaterial.isBadTexture(RenderMaterial::TT_Specular)) - { - useSpecularTexture = 1.0; - } - - texName = renderMaterial.getTextureFileName(RenderMaterial::TT_Normal); - if (useTexture && texName != "" && !renderMaterial.isBadTexture(RenderMaterial::TT_Normal)) - { - useNormalTexture = 1.0; - } - - specularShininess = renderMaterial.getSpecularShininess(); - } - - float selected = -1.0; - if (m_selected || m_highlight) - { - selected = 1.0; - } - - // setup object CB - { - D3D11_MAPPED_SUBRESOURCE mappedResource; - renderer.m_context->Map(renderer.m_objectCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - Renderer::CBObject* objectBuffer = (Renderer::CBObject*)mappedResource.pData; - objectBuffer->worldMatrix = PxMat44ToXMMATRIX(getModelMatrix()); - objectBuffer->diffuseColor = diffuseColor; - objectBuffer->specularColor = specularColor; - objectBuffer->useDiffuseTexture = useDiffuseTexture; - objectBuffer->useSpecularTexture = useSpecularTexture; - objectBuffer->useNormalTexture = useNormalTexture; - objectBuffer->specularShininess = specularShininess; - objectBuffer->selected = selected; - renderer.m_context->Unmap(renderer.m_objectCB, 0); - } - - m_mesh.render(*renderer.m_context); -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.h deleted file mode 100644 index 129b8f2..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderable.h +++ /dev/null @@ -1,204 +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. - - -#ifndef RENDERABLE_H -#define RENDERABLE_H - -#include "RenderMaterial.h" -#include <DirectXMath.h> -#include "PxMat44.h" -#include "PxVec3.h" -#include "PxVec4.h" - -using namespace physx; - -class Renderer; - -/** -RenderMesh interface, used by Renderable -*/ -class IRenderMesh -{ -public: - virtual ~IRenderMesh() {} - virtual const std::vector<D3D11_INPUT_ELEMENT_DESC>& getInputElementDesc() const = 0; - virtual void render(ID3D11DeviceContext& context) const = 0; -// Add By Lixu Begin - virtual void setScale(PxMat44 scale, bool replace) {}; - int mUniqueId; -// Add By Lixu End -}; - -/** -Renderable, represents single object renderer by Renderer. -Basically Renderable = RenderMaterial + RenderMesh -*/ -class Renderable -{ -public: - //////// public API //////// - - // suppose chunk count is less than 10000 - static int getRenderableId(int familyId, int chunkId) - { - int renderableId = familyId * 10000 + chunkId; - return renderableId; - } - static void getFamilyChunkId(int renderableId, int& familyId, int& chunkId) - { - familyId = renderableId / 10000; - chunkId = renderableId % 10000; - } - - void setMaterial(RenderMaterial& material); - - PxMat44 getModelMatrix() const - { - return PxMat44(m_transform) * PxMat44(PxVec4(m_scale, 1)); - } - - void setTransform(PxTransform& transform) - { - m_transform = transform; - } - - const PxTransform& getTransform() const - { - return m_transform; - } - - void setScale(PxVec3 scale) - { - m_scale = scale; - } - - const PxVec3& getScale() const - { - return m_scale; - } - - void setColor(DirectX::XMFLOAT4 color) - { - m_color = color; - } - DirectX::XMFLOAT4 getColor() const - { - return m_color; - } - - void setHidden(bool hidden) - { - m_hidden = hidden; - } - - bool isHidden() const - { - return m_hidden; - } - -// Add By Lixu Begin - void setSelected(bool selected) - { - m_selected = selected; - } - - bool isSelected() const - { - return m_selected; - } - - void setMeshScale(PxMat44 scale, bool replace) - { - m_mesh.setScale(scale, replace); - } - - void setDepthTest(bool depthTest) - { - m_depthTest = depthTest; - } - - bool isDepthTest() const - { - return m_depthTest; - } - - void setHighlight(bool highlight) - { - m_highlight = highlight; - } - - bool isHighlight() const - { - return m_highlight; - } -// Add By Lixu End - - bool isTransparent() const - { - return !(m_materialInstance->getMaterial().getBlending() == RenderMaterial::BLEND_NONE); - } - - RenderMaterial& getMaterial() const { return m_materialInstance->getMaterial(); } - -private: - //////// methods used by Renderer //////// - - friend class Renderer; - - void render(Renderer& renderer) const - { - render(renderer, false); - } - - void renderDepthStencilOnly(Renderer& renderer) const - { - render(renderer, true); - } - - Renderable(IRenderMesh& mesh, RenderMaterial& material); - - void render(Renderer& renderer, bool depthStencilOnly) const; - - - //////// internal data //////// - - DirectX::XMFLOAT4 m_color; - PxTransform m_transform; - PxVec3 m_scale; - - RenderMaterial::InstancePtr m_materialInstance; - IRenderMesh& m_mesh; - bool m_hidden; -// Add By Lixu Begin - bool m_selected; - bool m_depthTest; - bool m_highlight; -// Add By Lixu End -}; - -#endif //RENDERABLE_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.cpp deleted file mode 100644 index 05941df..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.cpp +++ /dev/null @@ -1,1245 +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 "Renderer.h" -#include "RenderUtils.h" -#include "UIHelpers.h" -#include "SampleProfiler.h" - -#include "PxRenderBuffer.h" - -#include <set> -#include "SimpleScene.h" -#include "GlobalSettings.h" -#include "Light.h" -#include "AppMainWindow.h" -#include "PxVec2.h" - - -const float CAMERA_CLIP_NEAR = 1.0f; -const float CAMERA_CLIP_FAR = 1000.00f; - -const float CLEAR_SCENE_COLOR[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - -const int RenderTarget_Size = 512; -const float SelectionTexture_InitData = -1; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Renderer -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -Renderer* g_Renderer = nullptr; -Renderer* Renderer::Inst() -{ - return g_Renderer; -} - - -Renderer::Renderer() -: m_cameraCB(nullptr) -, m_worldCB(nullptr) -, m_objectCB(nullptr) -, m_opaqueRenderDSState(nullptr) -, m_transparencyRenderDSState(nullptr) -, m_opaqueRenderNoDepthDSState(nullptr) -, m_DSTexture(nullptr) -, m_DSView(nullptr) -, m_DSTextureSRV(nullptr) -, m_selectionRenderTargetTexture(nullptr) -, m_selectionRenderTargetView(nullptr) -, m_selectionRenderTargetSRV(nullptr) -, m_selectionDepthStencilTexture(nullptr) -, m_selectionDepthStencilView(nullptr) -, m_selectionDepthStencilSRV(nullptr) -, m_selectionTextureForCPU(nullptr) -, m_pointSampler(nullptr) -, m_linearSampler(nullptr) -, m_wireframeMode(false) -, m_debugPrimitiveVB(nullptr) -, m_debugPrimitiveVBVerticesCount(0) -, m_screenPrimitiveVB(nullptr) -, m_screenPrimitiveVBVerticesCount(0) -, m_shadowEnabled(true) -, m_HBAOEnabled(true) -, m_visibleOpaqueRenderablesCount(0) -, m_visibleTransparentRenderablesCount(0) -{ - m_worldCBData.ambientColor = DirectX::XMFLOAT3(0.21f, 0.21f, 0.22f); - m_worldCBData.pointLightColor = DirectX::XMFLOAT3(1.0f, 1.0f, 1.0f); - m_worldCBData.pointLightPos = DirectX::XMFLOAT3(0.0f, 30.0f, 12.0f); - m_worldCBData.dirLightColor = DirectX::XMFLOAT3(0.0f, 0.0f, 0.0f); - 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); - - g_Renderer = this; - bFetchSelection = false; -} - -Renderer::~Renderer() -{ -} - -void Renderer::initializeDefaultRSState() -{ - D3D11_RASTERIZER_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.CullMode = D3D11_CULL_NONE; - desc.AntialiasedLineEnable = FALSE; - desc.DepthBias = 0; - desc.DepthBiasClamp = 0; - desc.DepthClipEnable = TRUE; - desc.FrontCounterClockwise = FALSE; - desc.MultisampleEnable = TRUE; - desc.ScissorEnable = FALSE; - desc.SlopeScaledDepthBias = 0; - - 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) -{ - m_device = device; - - // Camera constant buffer - { - D3D11_BUFFER_DESC buffer_desc; - ZeroMemory(&buffer_desc, sizeof(buffer_desc)); - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - buffer_desc.ByteWidth = sizeof(CBCamera); - _ASSERT((buffer_desc.ByteWidth % 16) == 0); - - V(device->CreateBuffer(&buffer_desc, nullptr, &m_cameraCB)); - } - - // World constant buffer - { - D3D11_BUFFER_DESC buffer_desc; - ZeroMemory(&buffer_desc, sizeof(buffer_desc)); - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - buffer_desc.ByteWidth = sizeof(CBWorld); - _ASSERT((buffer_desc.ByteWidth % 16) == 0); - - V(device->CreateBuffer(&buffer_desc, nullptr, &m_worldCB)); - } - - // Object constant buffer - { - D3D11_BUFFER_DESC buffer_desc; - ZeroMemory(&buffer_desc, sizeof(buffer_desc)); - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - buffer_desc.ByteWidth = sizeof(CBObject); - _ASSERT((buffer_desc.ByteWidth % 16) == 0); - - V(device->CreateBuffer(&buffer_desc, nullptr, &m_objectCB)); - } - - // Opaque Render Depth-Stencil state - { - D3D11_DEPTH_STENCIL_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.StencilEnable = FALSE; - desc.DepthEnable = TRUE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL; - - V(device->CreateDepthStencilState(&desc, &m_opaqueRenderDSState)); - } - - // Transparency Render Depth-Stencil state - { - D3D11_DEPTH_STENCIL_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.StencilEnable = FALSE; - desc.DepthEnable = TRUE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ZERO; - desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL; - - V(device->CreateDepthStencilState(&desc, &m_transparencyRenderDSState)); - } - - // Opaque Render Depth-Stencil state Without Depth Test - { - D3D11_DEPTH_STENCIL_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.StencilEnable = FALSE; - desc.DepthEnable = FALSE; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - desc.DepthFunc = D3D11_COMPARISON_LESS_EQUAL; - - V(device->CreateDepthStencilState(&desc, &m_opaqueRenderNoDepthDSState)); - } - - // Linear sampler - { - D3D11_SAMPLER_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - desc.MaxAnisotropy = 1; - desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; - desc.MinLOD = 0; - desc.MaxLOD = D3D11_FLOAT32_MAX; - V(device->CreateSamplerState(&desc, &m_linearSampler)); - } - - // Point sampler - { - D3D11_SAMPLER_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; - desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - desc.MaxAnisotropy = 1; - desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; - desc.MinLOD = 0; - desc.MaxLOD = D3D11_FLOAT32_MAX; - V(device->CreateSamplerState(&desc, &m_pointSampler)); - } - - // Rasterizer state - initializeDefaultRSState(); - - // init primitive render meshes - for (uint32_t i = 0; i < PrimitiveRenderMeshType::Count; i++) - { - m_primitiveRenderMeshes[i] = nullptr; - } - - // init shadows - ID3D11DeviceContext* pd3dDeviceContext; - m_device->GetImmediateContext(&pd3dDeviceContext); - m_shadow.createResources(m_device, pd3dDeviceContext, &m_camera); - - // init hbao - m_HBAO.createResources(m_device); - - return S_OK; -} - -void Renderer::DeviceDestroyed() -{ - SAFE_RELEASE(m_cameraCB); - SAFE_RELEASE(m_worldCB); - SAFE_RELEASE(m_objectCB); - SAFE_RELEASE(m_RSState[0]); - SAFE_RELEASE(m_RSState[1]); - SAFE_RELEASE(m_opaqueRenderDSState); - SAFE_RELEASE(m_transparencyRenderDSState); - SAFE_RELEASE(m_opaqueRenderNoDepthDSState); - SAFE_RELEASE(m_pointSampler); - SAFE_RELEASE(m_linearSampler); - SAFE_RELEASE(m_debugPrimitiveVB); - SAFE_RELEASE(m_screenPrimitiveVB); - SAFE_RELEASE(m_DSTexture); - SAFE_RELEASE(m_DSView); - SAFE_RELEASE(m_DSTextureSRV); - SAFE_RELEASE(m_selectionRenderTargetTexture); - SAFE_RELEASE(m_selectionRenderTargetView); - SAFE_RELEASE(m_selectionRenderTargetSRV); - SAFE_RELEASE(m_selectionDepthStencilTexture); - SAFE_RELEASE(m_selectionDepthStencilView); - SAFE_RELEASE(m_selectionDepthStencilSRV); - SAFE_RELEASE(m_selectionTextureForCPU); - - for (uint32_t i = 0; i < PrimitiveRenderMeshType::Count; i++) - { - SAFE_DELETE(m_primitiveRenderMeshes[i]); - } -} - -void Renderer::onInitialize() -{ - // search paths - m_resourceManager.addSearchDir("..\\resources"); - m_resourceManager.addSearchDir("..\\..\\..\\..\\bin\\resources"); - //m_resourceManager.addSearchDir("..\\..\\samples\\resources"); - //m_resourceManager.addSearchDir("..\\..\\..\\samples\\resources"); - - // debug primitive render material and input layout - { - m_debugPrimitiveRenderMaterial = new RenderMaterial("", m_resourceManager, "debug_primitive", ""); - - D3D11_INPUT_ELEMENT_DESC layout[] = { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 } - }; - - m_debugPrimitiveRenderMaterialInstance = m_debugPrimitiveRenderMaterial->getMaterialInstance(layout, ARRAYSIZE(layout)); - } - - // screen primitive render material and input layout - { - m_screenPrimitiveRenderMaterial = new RenderMaterial("", m_resourceManager, "screen_primitive_ex", ""); - - D3D11_INPUT_ELEMENT_DESC layout[] = { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 } - }; - - m_screenPrimitiveRenderMaterialInstance = m_screenPrimitiveRenderMaterial->getMaterialInstance(layout, ARRAYSIZE(layout)); - } - - // selection render material and input layout - { - m_selectionRenderMaterial = new RenderMaterial("idm", m_resourceManager, "model_simple_id_ex", ""); - - D3D11_INPUT_ELEMENT_DESC layout[] = { - { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "VERTEX_NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "FACE_NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 36, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 48, D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 1, DXGI_FORMAT_R32_FLOAT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 } - }; - - m_selectionRenderMaterialInstance = m_selectionRenderMaterial->getMaterialInstance(layout, ARRAYSIZE(layout)); - } -} - -void Renderer::onTerminate() -{ - SAFE_DELETE(m_debugPrimitiveRenderMaterial); - SAFE_DELETE(m_screenPrimitiveRenderMaterial); -} - -void Renderer::BackBufferResized(ID3D11Device* /*device*/, const DXGI_SURFACE_DESC* sd) -{ - // Setup the camera's projection parameters - m_screenWidth = sd->Width; - m_screenHeight = sd->Height; - float fAspectRatio = m_screenWidth / m_screenHeight; - float fov = (GlobalSettings::Inst().m_fovAngle / 360.0f) * 3.141592653589793; - m_camera.SetProjParams(fov, fAspectRatio, CAMERA_CLIP_NEAR, CAMERA_CLIP_FAR); - - SAFE_RELEASE(m_DSTexture); - SAFE_RELEASE(m_DSView); - SAFE_RELEASE(m_DSTextureSRV); - SAFE_RELEASE(m_selectionRenderTargetTexture); - SAFE_RELEASE(m_selectionRenderTargetView); - SAFE_RELEASE(m_selectionRenderTargetSRV); - SAFE_RELEASE(m_selectionDepthStencilTexture); - SAFE_RELEASE(m_selectionDepthStencilView); - SAFE_RELEASE(m_selectionDepthStencilSRV); - SAFE_RELEASE(m_selectionTextureForCPU); - - // create m_selectionRenderTargetTexture - { - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = RenderTarget_Size; - desc.Height = RenderTarget_Size; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_R32_FLOAT; // Use a typeless type here so that it can be both depth-stencil and shader resource. - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; - desc.CPUAccessFlags = 0; - desc.MiscFlags = 0; - V(m_device->CreateTexture2D(&desc, NULL, &m_selectionRenderTargetTexture)); - } - - // create m_selectionRenderTargetView - { - D3D11_RENDER_TARGET_VIEW_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - desc.Format = DXGI_FORMAT_R32_FLOAT; // Make the view see this as D32_FLOAT instead of typeless - desc.Texture2D.MipSlice = 0; - V(m_device->CreateRenderTargetView(m_selectionRenderTargetTexture, &desc, &m_selectionRenderTargetView)); - } - - // create m_selectionRenderTargetSRV - { - D3D11_SHADER_RESOURCE_VIEW_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Format = DXGI_FORMAT_R32_FLOAT; // Make the shaders see this as R32_FLOAT instead of typeless - desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - desc.Texture2D.MipLevels = 1; - desc.Texture2D.MostDetailedMip = 0; - V(m_device->CreateShaderResourceView(m_selectionRenderTargetTexture, &desc, &m_selectionRenderTargetSRV)); - } - - // create m_selectionDepthStencilTexture - { - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = RenderTarget_Size; - desc.Height = RenderTarget_Size; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_R32_TYPELESS; // Use a typeless type here so that it can be both depth-stencil and shader resource. - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; - desc.CPUAccessFlags = 0; - desc.MiscFlags = 0; - V(m_device->CreateTexture2D(&desc, NULL, &m_selectionDepthStencilTexture)); - } - - // create m_selectionDepthStencilView - { - D3D11_DEPTH_STENCIL_VIEW_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; - desc.Format = DXGI_FORMAT_D32_FLOAT; // Make the view see this as D32_FLOAT instead of typeless - desc.Texture2D.MipSlice = 0; - V(m_device->CreateDepthStencilView(m_selectionDepthStencilTexture, &desc, &m_selectionDepthStencilView)); - } - - // create m_selectionDepthStencilSRV - { - D3D11_SHADER_RESOURCE_VIEW_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Format = DXGI_FORMAT_R32_FLOAT; // Make the shaders see this as R32_FLOAT instead of typeless - desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - desc.Texture2D.MipLevels = 1; - desc.Texture2D.MostDetailedMip = 0; - V(m_device->CreateShaderResourceView(m_selectionDepthStencilTexture, &desc, &m_selectionDepthStencilSRV)); - } - - // create m_selectionTextureForCPU - { - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = RenderTarget_Size; - desc.Height = RenderTarget_Size; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_R32_FLOAT; // Use a typeless type here so that it can be both depth-stencil and shader resource. - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = D3D11_USAGE_STAGING; - desc.BindFlags = 0; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - desc.MiscFlags = 0; - V(m_device->CreateTexture2D(&desc, NULL, &m_selectionTextureForCPU)); - } - - // create a new Depth-Stencil texture - { - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = sd->Width; - desc.Height = sd->Height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_R32_TYPELESS; // Use a typeless type here so that it can be both depth-stencil and shader resource. - desc.SampleDesc.Count = sd->SampleDesc.Count; - desc.SampleDesc.Quality = sd->SampleDesc.Quality; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; - desc.CPUAccessFlags = 0; - desc.MiscFlags = 0; - V(m_device->CreateTexture2D(&desc, NULL, &m_DSTexture)); - } - - // create Depth-Stencil view - { - D3D11_DEPTH_STENCIL_VIEW_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.ViewDimension = sd->SampleDesc.Count > 1 ? D3D11_DSV_DIMENSION_TEXTURE2DMS : D3D11_DSV_DIMENSION_TEXTURE2D; - desc.Format = DXGI_FORMAT_D32_FLOAT; // Make the view see this as D32_FLOAT instead of typeless - desc.Texture2D.MipSlice = 0; - V(m_device->CreateDepthStencilView(m_DSTexture, &desc, &m_DSView)); - } - - // create Depth-Stencil shader resource view - { - D3D11_SHADER_RESOURCE_VIEW_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Format = DXGI_FORMAT_R32_FLOAT; // Make the shaders see this as R32_FLOAT instead of typeless - desc.ViewDimension = sd->SampleDesc.Count > 1 ? D3D11_SRV_DIMENSION_TEXTURE2DMS : D3D11_SRV_DIMENSION_TEXTURE2D; - desc.Texture2D.MipLevels = 1; - desc.Texture2D.MostDetailedMip = 0; - V(m_device->CreateShaderResourceView(m_DSTexture, &desc, &m_DSTextureSRV)); - } - - // setup viewport - m_viewport.Width = (FLOAT)sd->Width; - m_viewport.Height = (FLOAT)sd->Height; - m_viewport.MinDepth = 0; - m_viewport.MaxDepth = 1; - m_viewport.TopLeftX = 0; - m_viewport.TopLeftY = 0; - - // setup shadows - m_shadow.setScreenResolution(0, sd->Width, sd->Height, sd->SampleDesc.Count, nullptr); -} - -void Renderer::setAllConstantBuffers(ID3D11DeviceContext* ctx) -{ - ID3D11Buffer* cbs[3] = { m_cameraCB, m_worldCB, m_objectCB }; - ctx->VSSetConstantBuffers(0, 3, cbs); - ctx->GSSetConstantBuffers(0, 3, cbs); - ctx->PSSetConstantBuffers(0, 3, cbs); -} - -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; - - ctx->ClearDepthStencilView(m_DSView, D3D11_CLEAR_DEPTH, 1.0, 0); - ctx->RSSetViewports(1, &m_viewport); - - // needed matrices - DirectX::XMMATRIX viewMatrix = SimpleScene::Inst()->GetViewMatrix(); - DirectX::XMMATRIX projMatrix = SimpleScene::Inst()->GetProjMatrix(); - DirectX::XMMATRIX projMatrixInv = DirectX::XMMatrixInverse(NULL, projMatrix); - DirectX::XMMATRIX viewProjMatrix = viewMatrix * projMatrix; - - // Fill Camera constant buffer - { - D3D11_MAPPED_SUBRESOURCE mappedResource; - ctx->Map(m_cameraCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - CBCamera* cameraBuffer = (CBCamera*)mappedResource.pData; - cameraBuffer->viewProjection = viewProjMatrix; - cameraBuffer->projectionInv = projMatrixInv; - DirectX::XMStoreFloat3(&(cameraBuffer->viewPos), SimpleScene::Inst()->GetEyePt()); - ctx->Unmap(m_cameraCB, 0); - } - - // Fill World constant buffer - { - 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; - //worldBuffer->pointLightPos = m_CBWorldData.pointLightPos; - //worldBuffer->pointLightColor = m_CBWorldData.pointLightColor; - //worldBuffer->dirLightDir = m_CBWorldData.dirLightDir; - //worldBuffer->specularPower = m_CBWorldData.specularPower; - //worldBuffer->dirLightColor = m_CBWorldData.dirLightColor; - //worldBuffer->specularIntensity = m_CBWorldData.specularIntensity; - ctx->Unmap(m_worldCB, 0); - } - - 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); - - - if (m_shadowEnabled) - { - // render depth only - { - ctx->OMSetRenderTargets(0, nullptr, m_DSView); - ctx->OMSetDepthStencilState(m_opaqueRenderDSState, 0xFF); - - // set constants buffers - setAllConstantBuffers(ctx); - - for (auto it = m_renderables.begin(); it != m_renderables.end(); it++) - { - if (!(*it)->isTransparent() && !(*it)->isHidden()) - (*it)->renderDepthStencilOnly(*this); - } - } - - m_shadow.clearBuffer(); - - std::vector<Light>& lights = Light::GetDefaultLights(); - for (int l = 0; l < 3; l++) - { - if (!lights[l].m_useShadows) - { - continue; - } - - atcore_float3 eye = lights[l].m_lightCamera._eye; - eye.x = -eye.x; - atcore_float3 at = lights[l].m_lightCamera._at; - at.x = -at.x; - - ctx->OMSetRenderTargets(0, nullptr, m_DSView); - m_shadow.renderShadowMaps(this, eye, at); - ctx->OMSetRenderTargets(0, nullptr, nullptr); - m_shadow.renderShadowBuffer(m_DSTextureSRV, nullptr); - } - - m_shadow.finalizeBuffer(); - } - - // Opaque render - { - ctx->RSSetViewports(1, &m_viewport); - ctx->OMSetRenderTargets(1, &pRTV, m_DSView); - ctx->OMSetDepthStencilState(m_opaqueRenderDSState, 0xFF); - - // set constants buffers - setAllConstantBuffers(ctx); - - // Fill Camera constant buffer - { - D3D11_MAPPED_SUBRESOURCE mappedResource; - ctx->Map(m_cameraCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - CBCamera* cameraBuffer = (CBCamera*)mappedResource.pData; - cameraBuffer->viewProjection = viewProjMatrix; - cameraBuffer->projectionInv = projMatrixInv; - DirectX::XMStoreFloat3(&(cameraBuffer->viewPos), SimpleScene::Inst()->GetEyePt()); - ctx->Unmap(m_cameraCB, 0); - } - - std::vector<Renderable*> renderablesWithoutDepthTest; - - // Render opaque renderables - m_visibleOpaqueRenderablesCount = 0; - for (auto it = m_renderables.begin(); it != m_renderables.end(); it++) - { - if (!(*it)->isTransparent() && !(*it)->isHidden()) - { - if (!(*it)->isDepthTest()) - { - renderablesWithoutDepthTest.push_back(*it); - continue; - } - (*it)->render(*this); - m_visibleOpaqueRenderablesCount++; - } - } - - if (renderablesWithoutDepthTest.size() > 0) - { - ctx->OMSetDepthStencilState(m_opaqueRenderNoDepthDSState, 0xFF); - std::vector<Renderable*>::iterator itR; - for (itR = renderablesWithoutDepthTest.begin(); itR != renderablesWithoutDepthTest.end(); itR++) - { - (*itR)->render(*this); - } - ctx->OMSetDepthStencilState(m_opaqueRenderDSState, 0xFF); - } - } - - // draw overline - if (globalSettings.m_showWireframe) - { - if (globalSettings.m_renderStyle != MESH_RENDER_WIREFRAME) - { - 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 && globalSettings.m_useLighting) - { - m_shadow.modulateShadowBuffer(pRTV); - } - - // render AO - if (m_HBAOEnabled) - { - m_HBAO.renderAO(m_context, pRTV, m_DSTextureSRV, projMatrix); - } - - ctx->RSSetViewports(1, &m_viewport); - - // render debug render buffers - if (!AppMainWindow::Inst().m_bGizmoWithDepthTest) - { - ctx->OMSetDepthStencilState(m_opaqueRenderNoDepthDSState, 0xFF); - } - while (m_queuedRenderBuffers.size() > 0) - { - render(m_queuedRenderBuffers.back()); - m_queuedRenderBuffers.pop_back(); - } - while (m_screenRenderBuffers.size() > 0) - { - render(m_screenRenderBuffers.back(), true); - m_screenRenderBuffers.pop_back(); - } - - // Transparency render - ctx->OMSetRenderTargets(1, &pRTV, m_DSView); - ctx->OMSetDepthStencilState(m_transparencyRenderDSState, 0xFF); - - // depth as SRV isn't used now (uncommenting will produce a warning, probably need readonly depth?) - //ctx->PSSetShaderResources(1, 1, &mDSTextureSRV); - - // Render transparent renderables - m_visibleTransparentRenderablesCount = 0; - for (auto it = m_renderables.begin(); it != m_renderables.end(); it++) - { - if ((*it)->isTransparent() && !(*it)->isHidden()) - { - (*it)->render(*this); - m_visibleTransparentRenderablesCount++; - } - } - - // shadows debug render - if (0) - { - m_shadow.displayMapFrustums(pRTV, m_DSView); - } - - // Reset RT and SRV state - ID3D11ShaderResourceView* nullAttach[16] = { nullptr }; - ctx->PSSetShaderResources(0, 16, nullAttach); - ctx->OMSetRenderTargets(0, nullptr, nullptr); -} - -LRESULT Renderer::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - PX_UNUSED(hWnd); - PX_UNUSED(wParam); - PX_UNUSED(lParam); - - if (uMsg == WM_KEYDOWN || uMsg == WM_KEYUP) - { - // Camera overspeed event - int iKeyPressed = static_cast<int>(wParam); - if (iKeyPressed == VK_SHIFT) - { - toggleCameraSpeed(uMsg == WM_KEYDOWN); - } - } - - UpdateCamera(); - - return 0; - - // Camera events - return m_camera.HandleMessages(hWnd, uMsg, wParam, lParam); -} - -void Renderer::Animate(double fElapsedTimeSeconds) -{ - PROFILER_SCOPED_FUNCTION(); - - m_camera.FrameMove((float)fElapsedTimeSeconds); -} - -void Renderer::renderDepthOnly(DirectX::XMMATRIX* viewProjectionSubstitute) -{ - // Fill Camera constant buffer - if (viewProjectionSubstitute) - { - D3D11_MAPPED_SUBRESOURCE mappedResource; - m_context->Map(m_cameraCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - CBCamera* cameraBuffer = (CBCamera*)mappedResource.pData; - cameraBuffer->viewProjection = *viewProjectionSubstitute; - m_context->Unmap(m_cameraCB, 0); - } - - // set constants buffers - setAllConstantBuffers(m_context); - - // render - for (auto it = m_renderables.begin(); it != m_renderables.end(); it++) - { - if (!(*it)->isTransparent() && !(*it)->isHidden()) - (*it)->renderDepthStencilOnly(*this); - } -} - -void Renderer::render(const PxRenderBuffer* renderBuffer, bool bScreen) -{ - // points - uint32_t pointsCount = renderBuffer->getNbPoints(); - if (pointsCount > 0) - { - RenderDebugVertex* verts = new RenderDebugVertex[pointsCount]; - const PxDebugPoint* points = renderBuffer->getPoints(); - for (uint32_t i = 0; i < pointsCount; i++) - { - verts[i].mPos = points[i].pos; - verts[i].mColor = points[i].color; - } - - renderDebugPrimitive(verts, pointsCount, D3D11_PRIMITIVE_TOPOLOGY_POINTLIST); - delete[] verts; - } - - // lines - uint32_t linesCount = renderBuffer->getNbLines(); - if (linesCount > 0) - { - RenderDebugVertex* verts = new RenderDebugVertex[linesCount * 2]; - const PxDebugLine* lines = renderBuffer->getLines(); - for (uint32_t i = 0; i < linesCount; i++) - { - verts[i * 2].mPos = lines[i].pos0; - verts[i * 2].mColor = lines[i].color0; - verts[i * 2 + 1].mPos = lines[i].pos1; - verts[i * 2 + 1].mColor = lines[i].color1; - } - - renderDebugPrimitive(verts, linesCount * 2, D3D11_PRIMITIVE_TOPOLOGY_LINELIST, bScreen); - delete[] verts; - } - - // triangles - uint32_t trianglesCount = renderBuffer->getNbTriangles(); - if (trianglesCount > 0) - { - RenderDebugVertex* verts = new RenderDebugVertex[trianglesCount * 3]; - const PxDebugTriangle* triangles = renderBuffer->getTriangles(); - for (uint32_t i = 0; i < trianglesCount; i++) - { - verts[i * 3].mPos = triangles[i].pos0; - verts[i * 3].mColor = triangles[i].color0; - verts[i * 3 + 1].mPos = triangles[i].pos1; - verts[i * 3 + 1].mColor = triangles[i].color1; - verts[i * 3 + 2].mPos = triangles[i].pos2; - verts[i * 3 + 2].mColor = triangles[i].color2; - } - - renderDebugPrimitive(verts, trianglesCount * 3, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - delete[] verts; - } - - // texts? - // .... -} - -void Renderer::renderDebugPrimitive(const Renderer::RenderDebugVertex *vertices, uint32_t verticesCount, D3D11_PRIMITIVE_TOPOLOGY topology, bool bScreen) -{ - m_context->IASetPrimitiveTopology(topology); - - if (bScreen) - { - m_screenPrimitiveRenderMaterialInstance->bind(*m_context, 0); - } - else - { - m_debugPrimitiveRenderMaterialInstance->bind(*m_context, 0); - } - - D3D11_MAPPED_SUBRESOURCE mappedResource; - m_context->Map(m_objectCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - CBObject* objectBuffer = (CBObject*)mappedResource.pData; - - objectBuffer->worldMatrix = PxMat44ToXMMATRIX(PxMat44(PxIdentity)); - - m_context->Unmap(m_objectCB, 0); - - if (m_debugPrimitiveVBVerticesCount < verticesCount) - { - m_debugPrimitiveVBVerticesCount = verticesCount; - SAFE_RELEASE(m_debugPrimitiveVB); - - D3D11_BUFFER_DESC bufferDesc; - - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.ByteWidth = sizeof(Renderer::RenderDebugVertex) * m_debugPrimitiveVBVerticesCount; - bufferDesc.CPUAccessFlags = 0; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_DEFAULT; - - V(m_device->CreateBuffer(&bufferDesc, NULL, &m_debugPrimitiveVB)); - } - - CD3D11_BOX box(0, 0, 0, (LONG)(sizeof(Renderer::RenderDebugVertex) * verticesCount), 1, 1); - m_context->UpdateSubresource(m_debugPrimitiveVB, 0, &box, vertices, 0, 0); - - ID3D11Buffer* pBuffers[1] = { m_debugPrimitiveVB }; - UINT strides[1] = { sizeof(RenderDebugVertex) }; - UINT offsets[1] = { 0 }; - m_context->IASetVertexBuffers(0, 1, pBuffers, strides, offsets); - - m_context->Draw(verticesCount, 0); -} - -IRenderMesh* Renderer::getPrimitiveRenderMesh(PrimitiveRenderMeshType::Enum type) -{ - if (m_primitiveRenderMeshes[type] == NULL) - { - switch (type) - { - case PrimitiveRenderMeshType::Box: - m_primitiveRenderMeshes[type] = new BoxRenderMesh(); - break; - case PrimitiveRenderMeshType::Plane: - m_primitiveRenderMeshes[type] = new PlaneRenderMesh(); - break; - case PrimitiveRenderMeshType::Sphere: - m_primitiveRenderMeshes[type] = new SphereRenderMesh(); - break; -// Add By Lixu Begin - case PrimitiveRenderMeshType::Cone: - m_primitiveRenderMeshes[type] = new ConeRenderMesh(); - break; -// Add By Lixu End - default: - PX_ALWAYS_ASSERT_MESSAGE("Unsupported PxGeometryType"); - return NULL; - } - } - - return m_primitiveRenderMeshes[type]; -} - - -Renderable* Renderer::createRenderable(IRenderMesh& mesh, RenderMaterial& material) -{ - Renderable* renderable = new Renderable(mesh, material); - m_renderables.emplace(renderable); - return renderable; -} - -void Renderer::removeRenderable(Renderable* r) -{ - m_renderables.erase(m_renderables.find(r)); - delete r; -} - -void Renderer::toggleCameraSpeed(bool overspeed) -{ - m_camera.SetScalers(0.002f, overspeed ? 150.f : 25.f); -} - -void Renderer::reloadShaders() -{ - // iterate Renderables materials and call reload() - std::set<RenderMaterial*> materials; - for (auto it = m_renderables.begin(); it != m_renderables.end(); it++) - { - materials.emplace(&((*it)->getMaterial())); - } - for (std::set<RenderMaterial*>::iterator it = materials.begin(); it != materials.end(); it++) - { - (*it)->reload(); - } -} - -void Renderer::drawUI() -{ - // Lighting - if (ImGui::TreeNode("Lighting")) - { - ImGui::ColorEdit3("Ambient Color", &(m_worldCBData.ambientColor.x)); - ImGui::ColorEdit3("Point Light Color", &(m_worldCBData.pointLightColor.x)); - ImGui::DragFloat3("Point Light Pos", &(m_worldCBData.pointLightPos.x)); - ImGui::ColorEdit3("Dir Light Color", &(m_worldCBData.dirLightColor.x)); - ImGui_DragFloat3Dir("Dir Light Dir", &(m_worldCBData.dirLightDir.x)); - ImGui::DragFloat("Specular Power", &(m_worldCBData.specularPower), 1.0f, 1.0f, 500.0f); - ImGui::DragFloat("Specular Intensity", &(m_worldCBData.specularIntensity), 0.01f, 0.0f, 2.0f); - - ImGui::TreePop(); - } - - // Shadow - if (ImGui::TreeNode("Shadow")) - { - ImGui::Checkbox("Shadows Enabled", &m_shadowEnabled); - if (m_shadowEnabled) - { - m_shadow.drawUI(); - } - - ImGui::TreePop(); - } - - // HBAO+ - if (ImGui::TreeNode("HBAO+")) - { - ImGui::Checkbox("HBAO Enabled", &(m_HBAOEnabled)); - if (m_HBAOEnabled) - { - m_HBAO.drawUI(); - } - - ImGui::TreePop(); - } -} - -void Renderer::UpdateCamera() -{ - Camera* pCamera = SimpleScene::Inst()->m_pCamera; - DirectX::XMVECTORF32 eyePt = { pCamera->_eye.x, pCamera->_eye.y, pCamera->_eye.z, 0 }; - DirectX::XMVECTORF32 lookAtPt = { pCamera->_at.x, pCamera->_at.y, pCamera->_at.z, 0 }; - m_camera.SetViewParams(eyePt, lookAtPt); - m_camera.SetProjParams(pCamera->_fov, pCamera->_aspectRatio, pCamera->_znear, pCamera->_zfar); -} - -bool _pointInPolygon(std::vector<PxVec2>& screenPoints, PxVec2& test) -{ - int polySides = screenPoints.size(); - int i, j = polySides - 1; - bool oddNodes = false; - for (i = 0; i < polySides; i++) - { - if ((screenPoints[i].y < test.y && screenPoints[j].y >= test.y - || screenPoints[j].y <test.y && screenPoints[i].y >= test.y) - && (screenPoints[i].x <= test.x || screenPoints[j].x <= test.x)) - { - float temp = (test.y - screenPoints[i].y) / - (screenPoints[j].y - screenPoints[i].y) * - (screenPoints[j].x - screenPoints[i].x); - oddNodes ^= (screenPoints[i].x + temp < test.x); - } - j = i; - } - return oddNodes; -} - -void Renderer::fetchSelection(std::vector<PxVec2>& screenPoints, std::map<int, std::set<int>>& selection) -{ - PROFILER_SCOPED_FUNCTION(); - - selection.clear(); - - int pointSize = screenPoints.size(); - if (pointSize == 0) - { - return; - } - - GlobalSettings& globalSettings = GlobalSettings::Inst(); - if (!globalSettings.m_showGraphicsMesh) - return; - - ID3D11DeviceContext* ctx = m_context; - - // needed matrices - DirectX::XMMATRIX viewMatrix = SimpleScene::Inst()->GetViewMatrix(); - DirectX::XMMATRIX projMatrix = SimpleScene::Inst()->GetProjMatrix(); - DirectX::XMMATRIX projMatrixInv = DirectX::XMMatrixInverse(NULL, projMatrix); - DirectX::XMMATRIX viewProjMatrix = viewMatrix * projMatrix; - - // Fill Camera constant buffer - { - D3D11_MAPPED_SUBRESOURCE mappedResource; - ctx->Map(m_cameraCB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - CBCamera* cameraBuffer = (CBCamera*)mappedResource.pData; - cameraBuffer->viewProjection = viewProjMatrix; - ctx->Unmap(m_cameraCB, 0); - } - - int width = RenderTarget_Size; - int height = RenderTarget_Size; - float init_data = SelectionTexture_InitData; - int dataSize = width * height; - if (m_selectionTextureData.size() != dataSize) - { - m_selectionTextureData.resize(dataSize); - } - std::fill(m_selectionTextureData.begin(), m_selectionTextureData.end(), init_data); - - ctx->OMSetRenderTargets(1, &m_selectionRenderTargetView, m_selectionDepthStencilView); - float ClearColor[4] = { init_data, init_data, init_data, init_data }; - ctx->ClearRenderTargetView(m_selectionRenderTargetView, ClearColor); - ctx->ClearDepthStencilView(m_selectionDepthStencilView, D3D11_CLEAR_DEPTH, 1.0, 0); - D3D11_VIEWPORT vp = { 0.0f, 0.0f, (float)width, (float)height, 0.0f, 1.0f }; - ctx->RSSetViewports(1, &vp); - ctx->RSSetState(m_RSState[0]); - ctx->OMSetDepthStencilState(m_opaqueRenderDSState, 0xFF); - - // set constants buffers - setAllConstantBuffers(ctx); - - bFetchSelection = true; - - // Render renderables - for (auto it = m_renderables.begin(); it != m_renderables.end(); it++) - { - if (!(*it)->isHidden()) - { - (*it)->render(*this); - } - } - - bFetchSelection = false; - - { - ctx->CopyResource(m_selectionTextureForCPU, m_selectionRenderTargetTexture); - D3D11_MAPPED_SUBRESOURCE mapResource; - HRESULT hr = ctx->Map(m_selectionTextureForCPU, 0, D3D11_MAP_READ, NULL, &mapResource); - memcpy(m_selectionTextureData.data(), mapResource.pData, dataSize * sizeof(float)); - ctx->Unmap(m_selectionTextureForCPU, 0); - } - - std::set<int> vids; - if (pointSize == 1) - { - // point selection - int centerX = screenPoints[0].x * width; - int centerY = screenPoints[0].y * height; - - int ds = centerY * width + centerX; - int vid = m_selectionTextureData[ds]; - vids.emplace(vid); - } - else if (pointSize == 2) - { - // rect selection - PxVec2 lefttop = screenPoints[0]; - PxVec2 rightbottom = screenPoints[1]; - int startX = lefttop.x * width; - int startY = lefttop.y * height; - int endX = rightbottom.x * width; - int endY = rightbottom.y * height; - for (int h = startY; h <= endY; h++) - { - for (int w = startX; w <= endX; w++) - { - int ds = h * width + w; - int vid = m_selectionTextureData[ds]; - vids.emplace(vid); - } - } - } - else - { - // draw selection - PxVec2 pMin, pMax; - pMin = pMax = screenPoints[0]; - for (int ps = 1; ps < pointSize; ps++) - { - PxVec2& p = screenPoints[ps]; - if (p.x < pMin.x) - { - pMin.x = p.x; - } - if (p.y < pMin.y) - { - pMin.y = p.y; - } - if (p.x > pMax.x) - { - pMax.x = p.x; - } - if (p.y > pMax.y) - { - pMax.y = p.y; - } - } - int startX = pMin.x * width; - int startY = pMin.y * height; - int endX = pMax.x * width; - int endY = pMax.y * height; - for (int h = startY; h <= endY; h++) - { - for (int w = startX; w <= endX; w++) - { - PxVec2 test(1.0 * w / width, 1.0 * h / height); - bool valid = _pointInPolygon(screenPoints, test); - if (valid) - { - int ds = h * width + w; - int vid = m_selectionTextureData[ds]; - vids.emplace(vid); - } - } - } - } - - int familyId, chunkId; - for (int vid : vids) - { - if (vid < 0) - { - continue; - } - - Renderable::getFamilyChunkId(vid, familyId, chunkId); - selection[familyId].emplace(chunkId); - } -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.h deleted file mode 100644 index eeaf98c..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/Renderer.h +++ /dev/null @@ -1,317 +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. - - -#ifndef RENDERER_H -#define RENDERER_H - -#include "RenderMaterial.h" -#include <DirectXMath.h> -#include "XInput.h" -#include "DXUTMisc.h" -#include "DXUTCamera.h" -#include "SampleManager.h" -#include "Utils.h" -#include "ResourceManager.h" -#include "PrimitiveRenderMesh.h" -#include "RendererShadow.h" -#include "RendererHBAO.h" -#include <unordered_set> -#include "LightShaderParam.h" - -class CFirstPersonCamera; -class PhysXPrimitive; -class RenderDebugImpl; - -namespace physx -{ -class PxRenderBuffer; -} - - -/** -3D World Renderer -- use createRenderable() to add objects to render. -- use queueRenderBuffer() every frame to render debug primitives. -- contains ResourceManager to search for file and load resources. -- contains RendererShadow and RendererHBAO, use them through getters to control shadows. -*/ -class Renderer : public ISampleController -{ - friend class Renderable; - - public: - //////// ctor //////// - - Renderer(); - ~Renderer(); - - static Renderer* Inst(); - bool bFetchSelection; - void fetchSelection(std::vector<PxVec2>& screenPoints, std::map<int, std::set<int>>& selection); - //////// public API //////// - - void reloadShaders(); - - bool getWireframeMode() - { - return m_wireframeMode; - } - - void setWireframeMode(bool enabled) - { - if(m_wireframeMode != enabled) - { - m_wireframeMode = enabled; - initializeDefaultRSState(); - } - } - - IRenderMesh* getPrimitiveRenderMesh(PrimitiveRenderMeshType::Enum type); - - Renderable* createRenderable(IRenderMesh& mesh, RenderMaterial& material); - void removeRenderable(Renderable* r); - - void drawUI(); - - - //////// public getters //////// - - float getScreenWidth() const - { - return m_screenWidth; - } - - float getScreenHeight() const - { - return m_screenHeight; - } - - void queueRenderBuffer(const PxRenderBuffer* buffer, bool bScreen = false) - { - if (bScreen) - { - m_screenRenderBuffers.push_back(buffer); - } - else - { - m_queuedRenderBuffers.push_back(buffer); - } - } - - void clearQueue() - { - m_screenRenderBuffers.clear(); - m_queuedRenderBuffers.clear(); - } - - ResourceManager& getResourceManager() - { - return m_resourceManager; - } - - uint32_t getVisibleOpaqueRenderablesCount() - { - return m_visibleOpaqueRenderablesCount; - } - - uint32_t getVisibleTransparentRenderablesCount() - { - return m_visibleTransparentRenderablesCount; - } - - CFirstPersonCamera& getCamera() - { - return m_camera; - } - - RenderMaterial::InstancePtr getSelectionRenderMaterialInstance() - { - return m_selectionRenderMaterialInstance; - } - - //////// public 'internal' methods //////// - - // for internal usage (used by RenderShadows) - void renderDepthOnly(DirectX::XMMATRIX* viewProjectionSubstitute); - void UpdateCamera(); - protected: - - //////// controller callbacks //////// - - virtual HRESULT DeviceCreated(ID3D11Device* pDevice); - virtual void DeviceDestroyed(); - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual void Animate(double fElapsedTimeSeconds); - virtual void onInitialize(); - virtual void onTerminate(); - virtual void BackBufferResized(ID3D11Device* pDevice, const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc); - virtual void Render(ID3D11Device* /*device*/, ID3D11DeviceContext* ctx, ID3D11RenderTargetView* pRTV, - ID3D11DepthStencilView* pDSV); - - private: - - //////// internal methods //////// - - struct RenderDebugVertex - { - PxVec3 mPos; - uint32_t mColor; - }; - - void render(const PxRenderBuffer* renderBuffer, bool bScreen = false); - void render(Renderable* renderable); - void renderDebugPrimitive(const RenderDebugVertex *vertices, uint32_t verticesCount, D3D11_PRIMITIVE_TOPOLOGY topology, bool bScreen = false); - void initializeDefaultRSState(); - void setAllConstantBuffers(ID3D11DeviceContext* ctx); - void toggleCameraSpeed(bool overspeed); - - - //////// constant buffers //////// - - struct CBCamera - { - DirectX::XMMATRIX viewProjection; - DirectX::XMMATRIX projectionInv; - DirectX::XMFLOAT3 viewPos; - float unusedPad; - }; - struct CBWorld - { - DirectX::XMFLOAT3 ambientColor; - float unusedPad1; - DirectX::XMFLOAT3 pointLightPos; - float unusedPad2; - DirectX::XMFLOAT3 pointLightColor; - float unusedPad3; - DirectX::XMFLOAT3 dirLightDir; - 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 - { - DirectX::XMMATRIX worldMatrix; - DirectX::XMFLOAT4 diffuseColor; - DirectX::XMFLOAT4 specularColor; - float useDiffuseTexture; - float useSpecularTexture; - float useNormalTexture; - float specularShininess; - float selected; - }; - - - //////// internal data //////// - - // camera - CFirstPersonCamera m_camera; - float m_screenWidth; - float m_screenHeight; - - // resources - ResourceManager m_resourceManager; - - // additional render modules(libs) - RendererShadow m_shadow; - bool m_shadowEnabled; - RendererHBAO m_HBAO; - bool m_HBAOEnabled; - - // DX11 common - ID3D11Device* m_device; - ID3D11DeviceContext* m_context; - D3D11_VIEWPORT m_viewport; - - // DX11 states - ID3D11RasterizerState* m_RSState[2]; - ID3D11DepthStencilState* m_opaqueRenderDSState; - ID3D11DepthStencilState* m_transparencyRenderDSState; - ID3D11DepthStencilState* m_opaqueRenderNoDepthDSState; - - // DX11 samplers - ID3D11SamplerState* m_pointSampler; - ID3D11SamplerState* m_linearSampler; - - // Depth Buffer - ID3D11Texture2D* m_DSTexture; - ID3D11DepthStencilView* m_DSView; - ID3D11ShaderResourceView* m_DSTextureSRV; - - // Constant Buffers - ID3D11Buffer* m_cameraCB; - ID3D11Buffer* m_worldCB; - CBWorld m_worldCBData; - ID3D11Buffer* m_objectCB; - - // toggles (options) - bool m_wireframeMode; - - // renderables - std::unordered_set<Renderable*> m_renderables; - - // primitive meshes cache - IRenderMesh* m_primitiveRenderMeshes[PrimitiveRenderMeshType::Count]; - - // stats - uint32_t m_visibleOpaqueRenderablesCount; - uint32_t m_visibleTransparentRenderablesCount; - - // Debug Render - RenderMaterial* m_debugPrimitiveRenderMaterial; - RenderMaterial::InstancePtr m_debugPrimitiveRenderMaterialInstance; - ID3D11Buffer* m_debugPrimitiveVB; - uint32_t m_debugPrimitiveVBVerticesCount; - std::vector<const PxRenderBuffer*> m_queuedRenderBuffers; - - // Screen Render - RenderMaterial* m_screenPrimitiveRenderMaterial; - RenderMaterial::InstancePtr m_screenPrimitiveRenderMaterialInstance; - ID3D11Buffer* m_screenPrimitiveVB; - uint32_t m_screenPrimitiveVBVerticesCount; - std::vector<const PxRenderBuffer*> m_screenRenderBuffers; - - // Selection Render Resource - RenderMaterial* m_selectionRenderMaterial; - RenderMaterial::InstancePtr m_selectionRenderMaterialInstance; - ID3D11Texture2D* m_selectionRenderTargetTexture; - ID3D11RenderTargetView* m_selectionRenderTargetView; - ID3D11ShaderResourceView* m_selectionRenderTargetSRV; - ID3D11Texture2D* m_selectionDepthStencilTexture; - ID3D11DepthStencilView* m_selectionDepthStencilView; - ID3D11ShaderResourceView* m_selectionDepthStencilSRV; - ID3D11Texture2D* m_selectionTextureForCPU; - std::vector<float> m_selectionTextureData; -}; - - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererHBAO.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererHBAO.cpp deleted file mode 100644 index c674b2b..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererHBAO.cpp +++ /dev/null @@ -1,98 +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 "RendererHBAO.h" -#include "Renderer.h" -#include "imgui.h" - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Renderer HBAO (wrapper for hbao+) -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -RendererHBAO::RendererHBAO() -{ - m_SSAOContext = NULL; - - // default parameters - m_SSAOParameters.Radius = 2.0f; -} - - -RendererHBAO::~RendererHBAO() -{ - releaseResources(); -} - - -void RendererHBAO::createResources(ID3D11Device *pd3dDevice) -{ - GFSDK_SSAO_Status status; - status = GFSDK_SSAO_CreateContext_D3D11(pd3dDevice, &m_SSAOContext, nullptr); - assert(status == GFSDK_SSAO_OK); -} - - -void RendererHBAO::releaseResources() -{ - if (m_SSAOContext != NULL) - { - m_SSAOContext->Release(); - } -} - - -void RendererHBAO::renderAO(ID3D11DeviceContext *pd3dDeviceContext, ID3D11RenderTargetView* pRTV, ID3D11ShaderResourceView* pDepthSRV, DirectX::XMMATRIX& projMatrix) -{ - GFSDK_SSAO_InputData_D3D11 InputData; - InputData.DepthData.pFullResDepthTextureSRV = pDepthSRV; - InputData.DepthData.DepthTextureType = GFSDK_SSAO_HARDWARE_DEPTHS; - InputData.DepthData.MetersToViewSpaceUnits = 1.0f; - InputData.DepthData.ProjectionMatrix.Data = GFSDK_SSAO_Float4x4(reinterpret_cast<const GFSDK_SSAO_FLOAT*>(&(projMatrix.r[0]))); - InputData.DepthData.ProjectionMatrix.Layout = GFSDK_SSAO_ROW_MAJOR_ORDER; - - GFSDK_SSAO_Output_D3D11 Output; - Output.pRenderTargetView = pRTV;// m_pSceneRTs->ColorRTV; - Output.Blend.Mode = GFSDK_SSAO_MULTIPLY_RGB; - - m_SSAOContext->RenderAO(pd3dDeviceContext, InputData, m_SSAOParameters, Output); -} - - -void RendererHBAO::drawUI() -{ - ImGui::DragFloat("Radius", &(m_SSAOParameters.Radius), 0.05f, 0.0f, 100.0f); - ImGui::DragFloat("Bias", &(m_SSAOParameters.Bias), 0.01f, 0.0f, 0.5f); - ImGui::DragFloat("NearAO", &(m_SSAOParameters.NearAO), 0.01f, 1.0f, 4.0f); - ImGui::DragFloat("FarAO", &(m_SSAOParameters.FarAO), 0.01, 1.0f, 4.0f); - ImGui::DragFloat("PowerExponent", &(m_SSAOParameters.PowerExponent), 0.01f, 1.0f, 8.0f); - ImGui::Checkbox("ForegroundAO Enabled", (bool*)&(m_SSAOParameters.ForegroundAO.Enable)); - ImGui::DragFloat("ForegroundAO ViewDepth", &(m_SSAOParameters.ForegroundAO.ForegroundViewDepth), 0.01f, 0.0f, 100.0f); - ImGui::Checkbox("BackgroundAO Enabled", (bool*)&(m_SSAOParameters.BackgroundAO.Enable)); - ImGui::DragFloat("BackgroundAO ViewDepth", &(m_SSAOParameters.BackgroundAO.BackgroundViewDepth), 0.01f, 0.0f, 100.0f); -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererHBAO.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererHBAO.h deleted file mode 100644 index 3237ddf..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererHBAO.h +++ /dev/null @@ -1,58 +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. - - -#ifndef RENDERER_HBAO_H -#define RENDERER_HBAO_H - -#include <DirectXMath.h> -#include "GFSDK_SSAO.h" - - -class Renderer; - -class RendererHBAO -{ -public: - RendererHBAO(); - ~RendererHBAO(); - - void createResources(ID3D11Device *pd3dDevice); - void renderAO(ID3D11DeviceContext *pd3dDeviceContext, ID3D11RenderTargetView* pRTV, ID3D11ShaderResourceView* pDepthSRV, DirectX::XMMATRIX& projMatrix); - - void drawUI(); - -private: - void releaseResources(); - - GFSDK_SSAO_Parameters m_SSAOParameters; - - GFSDK_SSAO_Context_D3D11* m_SSAOContext; -}; - - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererShadow.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererShadow.cpp deleted file mode 100644 index c26358b..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererShadow.cpp +++ /dev/null @@ -1,446 +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 "RendererShadow.h" - -#include "XInput.h" -#include "DXUTMisc.h" -#include "DXUTCamera.h" -#include "Renderer.h" -#include "UIHelpers.h" -#include "SimpleScene.h" -#define CASCADES 1 - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Renderer Shadows (wrapper for shadow_lib) -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const float DEFAULT_LIGHT_SIZE = 3.0f; -const DirectX::XMFLOAT3 DEFAULT_LIGHT_POS(-25, 25, 25); -const DirectX::XMFLOAT3 DEFAULT_LIGHT_LOOK_AT(0, 0, 0); -const DirectX::XMFLOAT3 DEFAULT_SHADOW_COLOR(0.25f, 0.25f, 0.25f); - -RendererShadow::RendererShadow() -{ - m_shadowLibContext = NULL; - - m_PCSSEnabled = false; - m_lightSize = DEFAULT_LIGHT_SIZE; - m_lightPos = DEFAULT_LIGHT_POS; - m_lightLookAt = DEFAULT_LIGHT_LOOK_AT; - m_shadowColor = DEFAULT_SHADOW_COLOR; - - m_worldSpaceBBox0.x = m_worldSpaceBBox0.y = m_worldSpaceBBox0.z = -100; - m_worldSpaceBBox1.x = m_worldSpaceBBox1.y = m_worldSpaceBBox1.z = 100; - - // Penumbra params - m_PCSSParams.fMaxThreshold = 80.0f; - m_PCSSParams.fMaxClamp = 40.0f; - m_PCSSParams.fMinSizePercent = 3.0f; - m_PCSSParams.fMinWeightExponent = 5.0f; - m_PCSSParams.fMinWeightThresholdPercent = 20.0f; - - m_softShadowTestScale = 0.002f; - - memset(&m_shadowBufferSRV, 0, sizeof(m_shadowBufferSRV)); - - m_shadowMapHandle = NULL; - m_shadowBufferHandle = NULL; -} - - -RendererShadow::~RendererShadow() -{ - ReleaseResources(); -} - - -void RendererShadow::createResources(ID3D11Device *pd3dDevice, ID3D11DeviceContext* context, CFirstPersonCamera* camera) -{ - m_camera = camera; - -#if !CASCADES - uint32_t shadowMapScale = 5; - uint32_t shadowMapWidth = 1024; - uint32_t shadowMapHeight = 1024; - - // SM Desc - m_SMDesc.eViewType = GFSDK_ShadowLib_ViewType_Single; - m_SMDesc.eMapType = GFSDK_ShadowLib_MapType_Texture; -#else - - uint32_t shadowMapScale = 5; - uint32_t shadowMapWidth = 1024; - uint32_t shadowMapHeight = 1024; - - // SM Desc - m_SMDesc.eViewType = GFSDK_ShadowLib_ViewType_Cascades_2; - m_SMDesc.eMapType = GFSDK_ShadowLib_MapType_TextureArray; -#endif - - m_SMDesc.uResolutionWidth = shadowMapWidth * shadowMapScale; - m_SMDesc.uResolutionHeight = shadowMapHeight * shadowMapScale; - m_SMDesc.uArraySize = m_SMDesc.eViewType; - - for (int j = 0; j < GFSDK_ShadowLib_ViewType_Cascades_4; j++) - { - m_SMDesc.ViewLocation[j].uMapID = j; - m_SMDesc.ViewLocation[j].v2Origin.x = 0; - m_SMDesc.ViewLocation[j].v2Origin.y = 0; - m_SMDesc.ViewLocation[j].v2Dimension.x = shadowMapWidth * shadowMapScale; - m_SMDesc.ViewLocation[j].v2Dimension.y = shadowMapHeight * shadowMapScale; - } - - - // SM Render Params - m_SMRenderParams.iDepthBias = 1000; - m_SMRenderParams.fSlopeScaledDepthBias = 8; - - // SB Render Params - m_SBRenderParams.eTechniqueType = GFSDK_ShadowLib_TechniqueType_PCSS; - m_SBRenderParams.eQualityType = GFSDK_ShadowLib_QualityType_High; - - // DLL version - GFSDK_ShadowLib_Version DLLVersion; - GFSDK_ShadowLib_Status retCode = GFSDK_ShadowLib_GetDLLVersion(&DLLVersion); - - // Header version - GFSDK_ShadowLib_Version headerVersion; - headerVersion.uMajor = GFSDK_SHADOWLIB_MAJOR_VERSION; - headerVersion.uMinor = GFSDK_SHADOWLIB_MINOR_VERSION; - - // Do they match? - if (DLLVersion.uMajor == headerVersion.uMajor && DLLVersion.uMinor == headerVersion.uMinor) - { - GFSDK_ShadowLib_DeviceContext deviceAndContext; - deviceAndContext.pD3DDevice = pd3dDevice; - deviceAndContext.pDeviceContext = context; - - retCode = GFSDK_ShadowLib_Create(&headerVersion, &m_shadowLibContext, &deviceAndContext, NULL); - - if (retCode != GFSDK_ShadowLib_Status_Ok) assert(false); - } - else - { - assert(false); - } -} - - -void RendererShadow::ReleaseResources() -{ - SAFE_RELEASE(m_downsampledShadowMap.pTexture); - SAFE_RELEASE(m_downsampledShadowMap.pSRV); - SAFE_RELEASE(m_downsampledShadowMap.pRTV); - - if (m_shadowLibContext != NULL) - { - m_shadowLibContext->Destroy(); - m_shadowLibContext = NULL; - } -} - - -void RendererShadow::setScreenResolution(float FovyRad, UINT Width, UINT Height, UINT uSampleCount, ID3D11DepthStencilView* pReadOnlyDSV) -{ - changeShadowSettings(Width, Height, uSampleCount, pReadOnlyDSV); -} - - -void RendererShadow::changeShadowSettings(UINT Width, UINT Height, UINT uSampleCount, ID3D11DepthStencilView* pReadOnlyDSV) -{ - m_SBDesc.uResolutionWidth = Width; - m_SBDesc.uResolutionHeight = Height; - m_SBDesc.uSampleCount = uSampleCount; - m_SBDesc.ReadOnlyDSV.pDSV = pReadOnlyDSV; - - reloadBuffers(); -} - -void RendererShadow::reloadBuffers() -{ - { - if(m_shadowMapHandle != nullptr) - { - m_shadowLibContext->RemoveMap(&m_shadowMapHandle); - } - - if (m_SMDesc.eMapType == GFSDK_ShadowLib_MapType_Texture && - m_SMDesc.eViewType == GFSDK_ShadowLib_ViewType_Single && - m_SBRenderParams.eTechniqueType == GFSDK_ShadowLib_TechniqueType_PCSS) - { - m_SMDesc.bDownsample = true; - } - - m_shadowLibContext->AddMap(&m_SMDesc, &m_shadowMapHandle); - } - - if (m_SMDesc.eMapType == GFSDK_ShadowLib_MapType_Texture && m_SMDesc.eViewType == GFSDK_ShadowLib_ViewType_Single) - { - m_downsampledShadowMap.uWidth = m_SMDesc.uResolutionWidth >> 1; - m_downsampledShadowMap.uHeight = m_SMDesc.uResolutionHeight >> 1; - m_downsampledShadowMap.uSampleCount = 1; - m_downsampledShadowMap.Format = DXGI_FORMAT_R32_FLOAT; - SAFE_RELEASE(m_downsampledShadowMap.pTexture); - SAFE_RELEASE(m_downsampledShadowMap.pSRV); - SAFE_RELEASE(m_downsampledShadowMap.pRTV); - m_shadowLibContext->DevModeCreateTexture2D(&m_downsampledShadowMap); - } - - if (m_shadowBufferHandle != nullptr) - { - m_shadowLibContext->RemoveBuffer(&m_shadowBufferHandle); - } - m_shadowLibContext->AddBuffer(&m_SBDesc, &m_shadowBufferHandle); -} - - - -//-------------------------------------------------------------------------------------- -// Data passed to the shadow map render function -//-------------------------------------------------------------------------------------- -struct ShadowMapRenderFunctionParams -{ - Renderer* renderer; -}; -static ShadowMapRenderFunctionParams s_RenderParams; - -//-------------------------------------------------------------------------------------- -// Shadow map render function -//-------------------------------------------------------------------------------------- -static void ShadowMapRenderFunction(void* pParams, gfsdk_float4x4* pViewProj) -{ - ShadowMapRenderFunctionParams* pRP = (ShadowMapRenderFunctionParams*)pParams; - - DirectX::XMMATRIX viewProjection; - memcpy(&viewProjection, &pViewProj->_11, sizeof(gfsdk_float4x4)); - - pRP->renderer->renderDepthOnly(&viewProjection); -} - -void RendererShadow::renderShadowMaps(Renderer* renderer, atcore_float3& lightPos, atcore_float3& lightLookAt) -{ - // select technique - GFSDK_ShadowLib_TechniqueType technique = m_SBRenderParams.eTechniqueType; - m_SBRenderParams.eTechniqueType = m_PCSSEnabled ? GFSDK_ShadowLib_TechniqueType_PCSS : GFSDK_ShadowLib_TechniqueType_PCF; - if (technique != m_SBRenderParams.eTechniqueType) - reloadBuffers(); - - - DirectX::XMMATRIX viewMatrix = m_camera->GetViewMatrix(); - DirectX::XMMATRIX projMatrix = m_camera->GetProjMatrix(); - - memcpy(&m_SMRenderParams.m4x4EyeViewMatrix, &viewMatrix.r[0], sizeof(gfsdk_float4x4)); - memcpy(&m_SMRenderParams.m4x4EyeProjectionMatrix, &projMatrix.r[0], sizeof(gfsdk_float4x4)); - - // TODO: (better world space bbox needed) - m_SMRenderParams.v3WorldSpaceBBox[0] = m_worldSpaceBBox0; - m_SMRenderParams.v3WorldSpaceBBox[1] = m_worldSpaceBBox1; - - m_SMRenderParams.LightDesc.eLightType = GFSDK_ShadowLib_LightType_Directional; - memcpy(&m_SMRenderParams.LightDesc.v3LightPos, &lightPos, sizeof(gfsdk_float3)); - memcpy(&m_SMRenderParams.LightDesc.v3LightLookAt, &lightLookAt, sizeof(gfsdk_float3)); - m_SMRenderParams.LightDesc.fLightSize = m_lightSize; - m_SMRenderParams.LightDesc.bLightFalloff = false; - - // Scene specific setup for the shadow map phase that follows - s_RenderParams.renderer = renderer; - m_SMRenderParams.fnpDrawFunction = GFSDK_ShadowLib_FunctionPointer(ShadowMapRenderFunction); - m_SMRenderParams.pDrawFunctionParams = &s_RenderParams; - - // render shadow map - m_shadowLibContext->RenderMap(m_shadowMapHandle, &m_SMRenderParams); -} - - -void RendererShadow::renderShadowBuffer(ID3D11ShaderResourceView* pDepthStencilSRV, ID3D11ShaderResourceView* pResolvedDepthStencilSRV) -{ - if (m_SBRenderParams.eTechniqueType == GFSDK_ShadowLib_TechniqueType_PCSS && - m_SMDesc.eMapType == GFSDK_ShadowLib_MapType_Texture && - m_SMDesc.eViewType == GFSDK_ShadowLib_ViewType_Single) - { - m_tempResources.pDownsampledShadowMap = &m_downsampledShadowMap; - m_shadowLibContext->SetTempResources(&m_tempResources); - } - - m_SBRenderParams.PCSSPenumbraParams = m_PCSSParams; - m_SBRenderParams.fSoftShadowTestScale = m_softShadowTestScale; - - m_SBRenderParams.DepthBufferDesc.DepthStencilSRV.pSRV = pDepthStencilSRV; - - m_shadowLibContext->RenderBuffer(m_shadowMapHandle, m_shadowBufferHandle, &m_SBRenderParams); -} - - -void RendererShadow::modulateShadowBuffer(ID3D11RenderTargetView* pOutputRTV) -{ - GFSDK_ShadowLib_RenderTargetView ColorRTV; - ColorRTV.pRTV = pOutputRTV; - - gfsdk_float3 v3ShadowColor = { m_shadowColor.x, m_shadowColor.y, m_shadowColor.z }; - m_shadowLibContext->ModulateBuffer(m_shadowBufferHandle, &ColorRTV, v3ShadowColor, GFSDK_ShadowLib_ModulateBufferMask_RGB); -} - - -void RendererShadow::displayShadowMaps(ID3D11RenderTargetView* pOutputRTV, UINT Width, UINT Height) -{ - GFSDK_ShadowLib_RenderTargetView ColorRTV; - ColorRTV.pRTV = pOutputRTV; - - float fMapResW = (float)m_SMDesc.uResolutionWidth; - float fMapResH = (float)m_SMDesc.uResolutionHeight; - - float fWidthScale = Width / ((float)m_SMDesc.uArraySize * fMapResW); - fWidthScale = (fWidthScale > 1.0f) ? (1.0f) : (fWidthScale); - - float fOneFifth = (float)Height / (5.0f); - float fHeightScale = fOneFifth / fMapResH; - fHeightScale = (fHeightScale > 1.0f) ? (1.0f) : (fHeightScale); - - float fScale = (fHeightScale < fWidthScale) ? (fHeightScale) : (fWidthScale); - - fMapResW = floorf(fMapResW * fScale); - fMapResH = floorf(fMapResH * fScale); - - for (unsigned int j = 0; j < (unsigned int)m_SMDesc.uArraySize; j++) - { - m_shadowLibContext->DevModeDisplayMap(m_shadowBufferHandle, - &ColorRTV, - m_shadowMapHandle, - j, - j * (unsigned int)fMapResW + j, - Height - (unsigned int)fMapResH, - fScale); - } -} - - -void RendererShadow::displayMapFrustums(ID3D11RenderTargetView* pOutputRTV, ID3D11DepthStencilView* pDSV) -{ - gfsdk_float3 v3Color; - v3Color.x = 1.0f; - v3Color.y = 0.0f; - v3Color.z = 0.0f; - - GFSDK_ShadowLib_RenderTargetView ColorRTV; - ColorRTV.pRTV = pOutputRTV; - - GFSDK_ShadowLib_DepthStencilView DSV; - DSV.pDSV = pDSV; - - unsigned int NumViews; - NumViews = m_SMDesc.eViewType; - - for (unsigned int j = 0; j < NumViews; j++) - { - switch (j) - { - case 0: - v3Color.x = 1.0f; - v3Color.y = 0.0f; - v3Color.z = 0.0f; - break; - case 1: - v3Color.x = 0.0f; - v3Color.y = 1.0f; - v3Color.z = 0.0f; - break; - case 2: - v3Color.x = 0.0f; - v3Color.y = 0.0f; - v3Color.z = 1.0f; - break; - case 3: - v3Color.x = 1.0f; - v3Color.y = 1.0f; - v3Color.z = 0.0f; - break; - } - - m_shadowLibContext->DevModeDisplayMapFrustum(m_shadowBufferHandle, - &ColorRTV, - &DSV, - m_shadowMapHandle, - j, - v3Color); - } -} - - -void RendererShadow::displayShadowBuffer(ID3D11RenderTargetView* pOutputRTV) -{ - gfsdk_float2 v2Scale; - v2Scale.x = 1.0f; - v2Scale.y = 1.0f; - - GFSDK_ShadowLib_RenderTargetView ColorRTV; - ColorRTV.pRTV = pOutputRTV; - - m_shadowLibContext->DevModeDisplayBuffer(m_shadowBufferHandle, - &ColorRTV, - v2Scale, - NULL); -} - - -void RendererShadow::toggleDisplayCascades(bool bToggle) -{ - m_shadowLibContext->DevModeToggleDebugCascadeShader(m_shadowBufferHandle, - bToggle); -} - - -void RendererShadow::drawUI() -{ - ImGui::Checkbox("PCSS", &m_PCSSEnabled); - ImGui::ColorEdit3("Shadow Color", &(m_shadowColor.x)); - ImGui::DragFloat("Light Size", &m_lightSize, 0.05f, 0.0f, 100.0f); - ImGui::DragFloat3("Light Position", &(m_lightPos.x)); - ImGui_DragFloat3Dir("Light LookAt", &(m_lightLookAt.x)); - ImGui::DragFloat("SoftShadowTestScale", &(m_softShadowTestScale), 0.0001f, 0.0f, 10.0f); - if (m_PCSSEnabled) - { - ImGui::DragFloat("PCSS: fMaxClamp", &(m_PCSSParams.fMaxClamp), 0.001f, 0.0f, 100.0f); - ImGui::DragFloat("PCSS: fMaxThreshold", &(m_PCSSParams.fMaxThreshold), 0.001f, 0.0f, 100.0f); - ImGui::DragFloat("PCSS: fMinSizePercent", &(m_PCSSParams.fMinSizePercent), 0.001f, 0.0f, 100.0f); - ImGui::DragFloat("PCSS: fMinWeightExponent", &(m_PCSSParams.fMinWeightExponent), 0.001f, 0.0f, 100.0f); - ImGui::DragFloat("PCSS: fMinWeightThresholdPercent", &(m_PCSSParams.fMinWeightThresholdPercent), 0.001f, 0.0f, 100.0f); - ImGui::DragFloat("PCSS: fBlockerSearchDitherPercent", &(m_PCSSParams.fBlockerSearchDitherPercent), 0.001f, 0.0f, 100.0f); - ImGui::DragFloat("PCSS: fFilterDitherPercent", &(m_PCSSParams.fFilterDitherPercent), 0.001f, 0.0f, 100.0f); - } -} - -void RendererShadow::clearBuffer() -{ - m_shadowLibContext->ClearBuffer(m_shadowBufferHandle); -} - -void RendererShadow::finalizeBuffer() -{ - m_shadowLibContext->FinalizeBuffer(m_shadowBufferHandle, &m_shadowBufferSRV); -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererShadow.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererShadow.h deleted file mode 100644 index e16af1f..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/RendererShadow.h +++ /dev/null @@ -1,103 +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. - - -#ifndef RENDERER_SHADOW_H -#define RENDERER_SHADOW_H - -#include <DirectXMath.h> -#include "Utils.h" -#include "gfsdk_shadowlib.h" - -#include <string> - - -class CFirstPersonCamera; -class Renderer; - -class RendererShadow -{ -public: - RendererShadow(); - ~RendererShadow(); - - void createResources(ID3D11Device *pd3dDevice, ID3D11DeviceContext* context, CFirstPersonCamera* camera); - - void setScreenResolution(float FovyRad, UINT Width, UINT Height, UINT uSampleCount, ID3D11DepthStencilView* pReadOnlyDSV); - void changeShadowSettings(UINT Width, UINT Height, UINT uSampleCount, ID3D11DepthStencilView* pReadOnlyDSV); - void renderShadowMaps(Renderer* renderer, atcore_float3& lightPos, atcore_float3& lightLookAt); - void renderShadowBuffer(ID3D11ShaderResourceView* pDepthStencilSRV, ID3D11ShaderResourceView* pResolvedDepthStencilSRV); - void modulateShadowBuffer(ID3D11RenderTargetView* pOutputRTV); - void displayShadowMaps(ID3D11RenderTargetView* pOutputRTV, UINT Width, UINT Height); - void displayMapFrustums(ID3D11RenderTargetView* pOutputRTV, ID3D11DepthStencilView* pDSV); - void displayShadowBuffer(ID3D11RenderTargetView* pOutputRTV); - void toggleDisplayCascades(bool bToggle); - - - void drawUI(); - - void clearBuffer(); - void finalizeBuffer(); - -private: - void reloadBuffers(); - void ReleaseResources(); - - - GFSDK_ShadowLib_Context* m_shadowLibContext; - - GFSDK_ShadowLib_ShaderResourceView m_shadowBufferSRV; - - GFSDK_ShadowLib_Map* m_shadowMapHandle; - GFSDK_ShadowLib_MapDesc m_SMDesc; - GFSDK_ShadowLib_BufferDesc m_SBDesc; - GFSDK_ShadowLib_MapRenderParams m_SMRenderParams; - - GFSDK_ShadowLib_Buffer* m_shadowBufferHandle; - GFSDK_ShadowLib_BufferRenderParams m_SBRenderParams; - - GFSDK_ShadowLib_TempResources m_tempResources; - GFSDK_ShadowLib_Texture2D m_downsampledShadowMap; - - CFirstPersonCamera* m_camera; - - // params - bool m_PCSSEnabled; - float m_lightSize; - DirectX::XMFLOAT3 m_lightPos; - DirectX::XMFLOAT3 m_lightLookAt; - DirectX::XMFLOAT3 m_shadowColor; - GFSDK_ShadowLib_PCSSPenumbraParams m_PCSSParams; - float m_softShadowTestScale; - - gfsdk_float3 m_worldSpaceBBox0; - gfsdk_float3 m_worldSpaceBBox1; - -}; - - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.cpp deleted file mode 100644 index d1d04e2..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.cpp +++ /dev/null @@ -1,291 +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 "ResourceManager.h" -#include "PxAssert.h" -#include "PsString.h" -#include "Utils.h" - -#include <windows.h> - - -using namespace physx; - -#define PATH_MAX_LEN 512 - -// Add By Lixu Begin -ResourceManager* pResourceManager = nullptr; -ResourceManager* ResourceManager::ins() -{ - return pResourceManager; -} -// Add By Lixu End - -ResourceManager::ResourceManager() -{ - // search for root folder by default - addSearchDir("."); - -// Add By Lixu Begin - pResourceManager = this; -// Add By Lixu End -} - -const ShaderFileResource* ResourceManager::requestShaderFile(const char* name) -{ - const Resource* resource = requestResource(eSHADER_FILE, name); - return resource != nullptr ? static_cast<const ShaderFileResource*>(resource) : nullptr; -} - -const TextureResource* ResourceManager::requestTexture(const char* name) -{ - const Resource* resource = requestResource(eTEXTURE, name); - return resource != nullptr ? static_cast<const TextureResource*>(resource) : nullptr; -} - -void ResourceManager::releaseTexture(const char* name) -{ - std::pair<ResourceType, std::string> key(eTEXTURE, name); - auto val = m_loadedResources.find(key); - if (val != m_loadedResources.end()) - { - Resource* pResource = val->second; - delete pResource; - pResource = nullptr; - m_loadedResources.erase(key); - } -} - -const Resource* ResourceManager::requestResource(ResourceType type, const char* name) -{ - // search in loaded - std::pair<ResourceType, std::string> key(type, name); - auto val = m_loadedResources.find(key); - if (val != m_loadedResources.end()) - { - return val->second; - } - - Resource* resource = nullptr; - if (type == eSHADER_FILE) - { - char path[PATH_MAX_LEN]; - const char* exts[] = { "hlsl" }; - if (findFile(name, std::vector<const char*>(exts, exts + sizeof(exts) / sizeof(exts[0])), path)) - { - resource = new ShaderFileResource(path); - } - else - { - PX_ALWAYS_ASSERT_MESSAGE(name); - } - } - else if (type == eTEXTURE) - { - char path[PATH_MAX_LEN]; -// Add By Lixu Begin - const char* exts[] = { "dds", "tga", "jpg", "png", "bmp" }; -// Add By Lixu End - if (findFile(name, std::vector<const char*>(exts, exts + sizeof(exts) / sizeof(exts[0])), path)) - { - TextureResource* textureResource(new TextureResource()); - WCHAR wPath[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, path, -1, wPath, MAX_PATH); - wPath[MAX_PATH - 1] = 0; - - const char* ext = strext(path); - if (::stricmp(ext, "dds") == 0) - { - V(DirectX::LoadFromDDSFile(wPath, DirectX::DDS_FLAGS_NONE, &textureResource->metaData, - textureResource->image)); - } - else if (::stricmp(ext, "tga") == 0) - { - V(DirectX::LoadFromTGAFile(wPath, &textureResource->metaData, - textureResource->image)); - } -// Add By Lixu Begin - else if (::stricmp(ext, "jpg") == 0) - { - V(DirectX::LoadFromWICFile(wPath, DirectX::TEX_FILTER_DEFAULT | DirectX::WIC_FLAGS_ALL_FRAMES, &textureResource->metaData, - textureResource->image)); - } - else if (::stricmp(ext, "png") == 0) - { - V(DirectX::LoadFromWICFile(wPath, DirectX::TEX_FILTER_DEFAULT | DirectX::WIC_FLAGS_ALL_FRAMES, &textureResource->metaData, - textureResource->image)); - } - else if (::stricmp(ext, "bmp") == 0) - { - V(DirectX::LoadFromWICFile(wPath, DirectX::TEX_FILTER_DEFAULT | DirectX::WIC_FLAGS_ALL_FRAMES, &textureResource->metaData, - textureResource->image)); - } -// Add By Lixu End - else - { - PX_ALWAYS_ASSERT_MESSAGE("Unsupported texture extension"); - } - resource = textureResource; - } - } - - if (resource) - { - m_loadedResources.emplace(key, resource); - return resource; - } - else - { - PX_ALWAYS_ASSERT_MESSAGE(name); - return nullptr; - } -} - -bool dirExists(const char* dir) -{ - DWORD ftyp = GetFileAttributesA(dir); - if (ftyp == INVALID_FILE_ATTRIBUTES) - return false; // something is wrong with path! - - if (ftyp & FILE_ATTRIBUTE_DIRECTORY) - return true; // this is a directory! - - return false; // this is not a directory! -} - -bool ResourceManager::addSearchDir(const char* dir, bool recursive) -{ - if (dirExists(dir)) - { - m_searchDirs.push_back(SearchDir(dir, recursive)); - return true; - } - return false; -} - - -ResourceManager::~ResourceManager() -{ -} - - -bool ResourceManager::findFileInDir(std::string fileNameFull, const char* path, bool recursive, char* foundPath) -{ - WIN32_FIND_DATAA ffd; - char tmp[PATH_MAX_LEN]; - shdfnd::snprintf(tmp, sizeof(tmp), "%s\\*", path); - HANDLE hFind = FindFirstFileA(tmp, &ffd); - - if(INVALID_HANDLE_VALUE == hFind) - { - return NULL; - } - - do - { - if (0 == shdfnd::strcmp(".", ffd.cFileName) || 0 == shdfnd::strcmp("..", ffd.cFileName)) - continue; - - if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - shdfnd::snprintf(tmp, sizeof(tmp), "%s\\%s", path, ffd.cFileName); - if(findFileInDir(fileNameFull, tmp, recursive, foundPath)) - return true; - } - else if (shdfnd::stricmp(ffd.cFileName, fileNameFull.c_str()) == 0) - { - shdfnd::snprintf(foundPath, PATH_MAX_LEN, "%s\\%s", path, ffd.cFileName); - return true; - } - } while(FindNextFileA(hFind, &ffd) != 0); - // release handle - FindClose(hFind); - return false; -} - -bool ResourceManager::findFile(std::string fileName, const std::vector<const char*>& exts, char* foundPath) -{ - std::string fileNameOnly = fileName; - - std::string::size_type pos = 0; - pos = fileNameOnly.find("\\", pos); - while ((pos != std::string::npos)) - { - fileNameOnly.replace(pos, 1, "/"); - pos = fileNameOnly.find("\\", (pos + 1)); - } - - size_t ind = fileNameOnly.find_last_of('/'); - if (ind > 0 && (ind != std::string::npos)) - fileNameOnly = fileNameOnly.substr(ind + 1); - -// Add By Lixu Begin - std::string fileDir = "."; - size_t fl = fileName.length(); - if (ind >= 0 && ind < fl) - fileDir = fileName.substr(0, ind); - if (findFileInDir(fileNameOnly.c_str(), fileDir.c_str(), true, foundPath)) - return true; -// Add By Lixu End - - for(size_t i = 0; i < m_searchDirs.size(); i++) - { - const SearchDir& searchDir = m_searchDirs[i]; - - for(size_t j = 0; j < exts.size(); j++) - { - const char* ext = exts[j]; - const uint32_t fileMaxLen = 128; - char fileNameFull[fileMaxLen] = { 0 }; - - physx::shdfnd::snprintf(fileNameFull, fileMaxLen, "%s.%s", fileNameOnly.c_str(), ext); - if(findFileInDir(fileNameFull, searchDir.path.c_str(), searchDir.recursive, foundPath)) - return true; - } - - if (findFileInDir(fileNameOnly.c_str(), searchDir.path.c_str(), searchDir.recursive, foundPath)) - return true; - } - return false; -} - -bool ResourceManager::findFile(std::string fileName, std::string& foundPath) -{ - std::vector<const char*> exts; - char path[PATH_MAX_LEN]; - if (findFile(fileName, exts, path)) - { - foundPath = path; - return true; - } - else - { - return false; - } -} - diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.h deleted file mode 100644 index 697b16b..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ResourceManager.h +++ /dev/null @@ -1,117 +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. - - -#ifndef RESOURCE_MANAGER_H -#define RESOURCE_MANAGER_H - -#include <vector> -#include <string> -#include <map> -#include <memory> -#include "DirectXTex.h" - - -struct Resource -{ -private: - Resource& operator = (const Resource&); -}; - - -struct ShaderFileResource : public Resource -{ - ShaderFileResource(const std::string& p) : path(p) {} - std::string path; -}; - - -struct TextureResource : public Resource -{ - DirectX::TexMetadata metaData; - DirectX::ScratchImage image; -}; - - -/** -ResourceManager used to look for files in provided dirs (see addSearchDir). Also it loads resources and caches them. -*/ -class ResourceManager -{ -public: - //////// ctor //////// - - ResourceManager(); - ~ResourceManager(); - -// Add By Lixu Begin - static ResourceManager* ins(); -// Add By Lixu End - - //////// public API //////// - - bool addSearchDir(const char* dir, bool recursive = true); - - const ShaderFileResource* requestShaderFile(const char* name); - - const TextureResource* requestTexture(const char* name); - - void releaseTexture(const char* name); - - bool findFile(std::string fileName, std::string& foundPath); - - bool findFile(std::string fileName, const std::vector<const char*>& exts, char* foundPath); - - -private: - //////// internal methods //////// - - enum ResourceType - { - eSHADER_FILE, - eTEXTURE - }; - - const Resource* requestResource(ResourceType type, const char* name); - - bool findFileInDir(std::string fileNameFull, const char* path, bool recursive, char* foundPath); - - struct SearchDir - { - SearchDir(std::string path_, bool recursive_) : path(path_), recursive(recursive_) {} - - std::string path; - bool recursive; - }; - - - //////// internal data //////// - - std::vector<SearchDir> m_searchDirs; - std::map<std::pair<ResourceType, std::string>, Resource*> m_loadedResources; -}; -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ShaderUtils.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ShaderUtils.h deleted file mode 100644 index da9caa0..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/ShaderUtils.h +++ /dev/null @@ -1,117 +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. - - -#ifndef SHADER_UTILS_H -#define SHADER_UTILS_H - -#include "Utils.h" -#include <d3dcompiler.h> - - -static HRESULT CompileShaderFromFile(const char* szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, - ID3DBlob** ppBlobOut) -{ - HRESULT hr = S_OK; - ID3DBlob* pErrorBlob = NULL; - - WCHAR wFileName[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, szFileName, -1, wFileName, MAX_PATH); - wFileName[MAX_PATH - 1] = 0; - hr = D3DCompileFromFile(wFileName, NULL, D3D_COMPILE_STANDARD_FILE_INCLUDE, szEntryPoint, szShaderModel, D3D10_SHADER_ENABLE_STRICTNESS, 0, - ppBlobOut, &pErrorBlob); - if(FAILED(hr)) - { - OutputDebugStringA((char*)pErrorBlob->GetBufferPointer()); - SAFE_RELEASE(pErrorBlob); - return hr; - } - SAFE_RELEASE(pErrorBlob); - - return S_OK; -} - -static HRESULT createShader(ID3D11Device* pDev, const void* pData, size_t len, ID3D11VertexShader** ppShd, bool) -{ - return pDev->CreateVertexShader(pData, len, nullptr, ppShd); -} - -static HRESULT createShader(ID3D11Device* pDev, const void* pData, size_t len, ID3D11GeometryShader** ppShd, - bool forceFast) -{ - PX_UNUSED(forceFast); - return pDev->CreateGeometryShader(pData, len, nullptr, ppShd); -} - -static HRESULT createShader(ID3D11Device* pDev, const void* pData, size_t len, ID3D11PixelShader** ppShd, bool) -{ - return pDev->CreatePixelShader(pData, len, nullptr, ppShd); -} - -static const char* shaderModel(ID3D11VertexShader**) -{ - return "vs_5_0"; -} - -static const char* shaderModel(ID3D11GeometryShader**) -{ - return "gs_5_0"; -} - -static const char* shaderModel(ID3D11PixelShader**) -{ - return "ps_5_0"; -} - -// Give back the shader buffer blob for use in CreateVertexLayout. Caller must release the blob. -template <class S> -static HRESULT createShaderFromFile(ID3D11Device* pDev, const char* szFileName, LPCSTR szEntryPoint, S** ppShd, - ID3DBlob*& pShaderBuffer, bool forceFast = false) -{ - HRESULT hr = CompileShaderFromFile(szFileName, szEntryPoint, shaderModel(ppShd), &pShaderBuffer); - if(SUCCEEDED(hr) && pShaderBuffer) - { - const void* shaderBufferData = pShaderBuffer->GetBufferPointer(); - const UINT shaderBufferSize = pShaderBuffer->GetBufferSize(); - createShader(pDev, shaderBufferData, shaderBufferSize, ppShd, forceFast); - } - return hr; -} - -// Overloaded, same as above but don't give back the shader buffer blob. -template <class S> -static HRESULT createShaderFromFile(ID3D11Device* pDev, const char* szFileName, LPCSTR szEntryPoint, S** ppShd, - bool forceFast = false) -{ - ID3DBlob* pShaderBuffer = NULL; - HRESULT hr = createShaderFromFile(pDev, szFileName, szEntryPoint, ppShd, pShaderBuffer, forceFast); - SAFE_RELEASE(pShaderBuffer); - return hr; -} - - -#endif //SHADER_UTILS_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/SkinnedRenderMesh.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/SkinnedRenderMesh.cpp deleted file mode 100644 index ff121d6..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/SkinnedRenderMesh.cpp +++ /dev/null @@ -1,234 +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 "SkinnedRenderMesh.h" -#include "Renderer.h" - -SkinnedRenderMesh::SkinnedRenderMesh(const std::vector<const SimpleMesh*>& meshes) -{ - PX_ASSERT_WITH_MESSAGE(meshes.size() <= MeshesCountMax, "meshes.size() have to be <= SkinnedRenderMesh::MeshesCountMax"); - - m_device = GetDeviceManager()->GetDevice(); - - // input element desc setup - 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({ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - m_inputDesc.push_back({ "TEXCOORD", 1, DXGI_FORMAT_R32_UINT, 1, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }); - - // reserve VB - uint32_t verticesTotal = 0; - std::for_each(meshes.begin(), meshes.end(), [&](const SimpleMesh* c) { verticesTotal += (uint32_t)c->vertices.size(); }); - std::vector<SimpleMesh::Vertex> vertexBuffer; - vertexBuffer.reserve(verticesTotal); - - // reserve IB - uint32_t indicesTotal = 0; - std::for_each(meshes.begin(), meshes.end(), [&](const SimpleMesh* c) { indicesTotal += (uint32_t)c->indices.size(); }); - m_indices.reserve(indicesTotal); - - // fill VB, IB, MeshInfo - m_meshesInfo.resize(meshes.size()); - for (uint32_t meshIndex = 0; meshIndex < meshes.size(); ++meshIndex) - { - const SimpleMesh* mesh = meshes[meshIndex]; - MeshInfo& meshInfo = m_meshesInfo[meshIndex]; - - meshInfo.firstVertex = (uint32_t)vertexBuffer.size(); - vertexBuffer.insert(vertexBuffer.end(), mesh->vertices.begin(), mesh->vertices.end()); - meshInfo.verticesCount = (uint32_t)mesh->vertices.size(); - - meshInfo.firstIndex = (uint32_t)m_indices.size(); - uint32_t indexOffset = meshInfo.firstVertex; - for (uint32_t index : mesh->indices) - { - m_indices.push_back((uint32_t)index + indexOffset); - } - meshInfo.indicesCount = (uint32_t)mesh->indices.size(); - } - - // vertex buffer - { - D3D11_SUBRESOURCE_DATA vertexBufferData; - - ZeroMemory(&vertexBufferData, sizeof(vertexBufferData)); - vertexBufferData.pSysMem = vertexBuffer.data(); - - D3D11_BUFFER_DESC bufferDesc; - - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.ByteWidth = (uint32_t)(sizeof(SimpleMesh::Vertex) * vertexBuffer.size()); - bufferDesc.CPUAccessFlags = 0; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_IMMUTABLE; - - V(m_device->CreateBuffer(&bufferDesc, &vertexBufferData, &m_vertexBuffer)); - } - - // bone index buffer - { - D3D11_BUFFER_DESC bufferDesc; - - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bufferDesc.ByteWidth = (uint32_t)(sizeof(uint32_t) * vertexBuffer.size()); - bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_DYNAMIC; - - V(m_device->CreateBuffer(&bufferDesc, nullptr, &m_boneIndexBuffer)); - } - - // index buffer - { - D3D11_BUFFER_DESC bufferDesc; - - memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC)); - bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; - bufferDesc.ByteWidth = (uint32_t)(sizeof(uint32_t) * m_indices.size()); - bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - bufferDesc.MiscFlags = 0; - bufferDesc.Usage = D3D11_USAGE_DYNAMIC; - - V(m_device->CreateBuffer(&bufferDesc, nullptr, &m_indexBuffer)); - } - - // bone texture - { - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = 4; - desc.Height = (uint32_t)meshes.size(); - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - - V(m_device->CreateTexture2D(&desc, nullptr, &m_boneTexture)); - } - - // bone texture SRV - { - D3D11_SHADER_RESOURCE_VIEW_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; - desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - desc.Texture2D.MipLevels = 1; - desc.Texture2D.MostDetailedMip = 0; - V(m_device->CreateShaderResourceView(m_boneTexture, &desc, &m_boneTextureSRV)); - } -} - -SkinnedRenderMesh::~SkinnedRenderMesh() -{ - SAFE_RELEASE(m_vertexBuffer); - SAFE_RELEASE(m_boneIndexBuffer); - SAFE_RELEASE(m_indexBuffer); - SAFE_RELEASE(m_boneTexture); - SAFE_RELEASE(m_boneTextureSRV); -} - -void SkinnedRenderMesh::updateVisibleMeshes(const std::vector<uint32_t>& visibleMeshes) -{ - ID3D11DeviceContext* context; - m_device->GetImmediateContext(&context); - - // update bone index buffer - { - D3D11_MAPPED_SUBRESOURCE mappedRead; - V(context->Map(m_boneIndexBuffer, 0, D3D11_MAP_WRITE_DISCARD, NULL, &mappedRead)); - - uint32_t* boneIndexBuffer = (uint32_t*)mappedRead.pData; - for (uint32_t i = 0; i < visibleMeshes.size(); ++i) - { - const MeshInfo& info = m_meshesInfo[visibleMeshes[i]]; - for (uint32_t v = info.firstVertex; v < info.firstVertex + info.verticesCount; ++v) - { - boneIndexBuffer[v] = i; - } - } - - context->Unmap(m_boneIndexBuffer, 0); - } - - // update index buffer - { - D3D11_MAPPED_SUBRESOURCE mappedRead; - V(context->Map(m_indexBuffer, 0, D3D11_MAP_WRITE_DISCARD, NULL, &mappedRead)); - - uint32_t* indexBuffer = (uint32_t*)mappedRead.pData; - uint32_t indexCount = 0; - for (uint32_t meshIndex : visibleMeshes) - { - const MeshInfo& info = m_meshesInfo[meshIndex]; - memcpy(indexBuffer + indexCount, &m_indices[info.firstIndex], info.indicesCount * sizeof(uint32_t)); - indexCount += info.indicesCount; - } - context->Unmap(m_indexBuffer, 0); - m_indexCount = indexCount; - PX_ASSERT(m_indexCount % 3 == 0); - } -} - -void SkinnedRenderMesh::updateVisibleMeshTransforms(std::vector<PxMat44>& transforms) -{ - ID3D11DeviceContext* context; - m_device->GetImmediateContext(&context); - - // update bone transform texture - { - D3D11_MAPPED_SUBRESOURCE mappedRead; - V(context->Map(m_boneTexture, 0, D3D11_MAP_WRITE_DISCARD, NULL, &mappedRead)); - for (uint32_t i = 0; i < transforms.size(); ++i) - { - std::memcpy((uint8_t*)mappedRead.pData + i * mappedRead.RowPitch, &transforms[i], sizeof(PxMat44)); - } - context->Unmap(m_boneTexture, 0); - } -} - -void SkinnedRenderMesh::render(ID3D11DeviceContext& context) const -{ - context.IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - - UINT strides[2] = { sizeof(SimpleMesh::Vertex), sizeof(uint32_t) }; - UINT offsets[2] = { 0 }; - ID3D11Buffer* buffers[2] = { m_vertexBuffer, m_boneIndexBuffer }; - context.IASetVertexBuffers(0, 2, buffers, strides, offsets); - - context.IASetIndexBuffer(m_indexBuffer, DXGI_FORMAT_R32_UINT, 0); - - context.VSSetShaderResources(1, 1, &m_boneTextureSRV); - - context.DrawIndexed(m_indexCount, 0, 0); -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/SkinnedRenderMesh.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/SkinnedRenderMesh.h deleted file mode 100644 index f3643d8..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/renderer/SkinnedRenderMesh.h +++ /dev/null @@ -1,100 +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. - - -#ifndef SKINNED_RENDER_MESH_H -#define SKINNED_RENDER_MESH_H - -#include "Utils.h" -#include <DirectXMath.h> - -#include <vector> -#include "Renderable.h" -#include "Mesh.h" - -/** -SkinnedRenderMesh: - bonde indices are passed as vertex input, - bone transforms are stored in texture - max bone meshes count: SkinnedRenderMesh::MeshesCountMax -*/ -class SkinnedRenderMesh : public IRenderMesh -{ -public: - //////// ctor //////// - - SkinnedRenderMesh(const std::vector<const SimpleMesh*>& meshes); - ~SkinnedRenderMesh(); - - - //////// const //////// - - static const uint32_t MeshesCountMax = D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION; - - - //////// public API //////// - - void updateVisibleMeshes(const std::vector<uint32_t>& visibleMeshes); - void updateVisibleMeshTransforms(std::vector<PxMat44>& transforms); - - - //////// IRenderMesh implementation //////// - - virtual const std::vector<D3D11_INPUT_ELEMENT_DESC>& getInputElementDesc() const { return m_inputDesc; } - virtual void render(ID3D11DeviceContext& context) const; - -private: - //////// internal data //////// - - struct MeshInfo - { - uint32_t firstIndex; - uint32_t indicesCount; - - uint32_t firstVertex; - uint32_t verticesCount; - }; - - std::vector<D3D11_INPUT_ELEMENT_DESC> m_inputDesc; - - ID3D11Device* m_device; - - ID3D11Buffer* m_vertexBuffer; - ID3D11Buffer* m_boneIndexBuffer; - ID3D11Buffer* m_indexBuffer; - ID3D11Texture2D* m_boneTexture; - ID3D11ShaderResourceView* m_boneTextureSRV; - - uint32_t m_indexCount; - - std::vector<MeshInfo> m_meshesInfo; - std::vector<uint32_t> m_indices; -}; - - - -#endif //SKINNED_RENDER_MESH_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SampleAssetListParser.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SampleAssetListParser.cpp deleted file mode 100644 index b58f9f1..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SampleAssetListParser.cpp +++ /dev/null @@ -1,292 +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 "SampleAssetListParser.h" -#include <PsFastXml.h> -#include "Sample.h" -#include "PxVec4.h" -#include "PxInputDataFromPxFileBuf.h" -#include <bitset> - - -using namespace physx; - - -const float DEGREE_TO_RAD = acos(-1.0) / 180.0; - -class AssetListParser : public physx::shdfnd::FastXml::Callback -{ -public: - AssetListParser(AssetList& assetList): m_assetList(assetList){} -protected: - - // encountered a comment in the XML - virtual bool processComment(const char* /*comment*/) - { - return true; - } - - virtual bool processClose(const char* elementName, unsigned int /*depth*/, bool& /*isError*/) - { - if (::strcmp(elementName, "Box") == 0) - { - m_assetList.boxes.push_back(m_boxTemp); - m_boxTemp = AssetList::BoxAsset(); - } - else if (::strcmp(elementName, "Composite") == 0) - { - m_assetList.composites.push_back(m_compositeTemp); - m_compositeTemp = AssetList::CompositeAsset(); - } - return true; - } - - // return true to continue processing the XML document, false to skip. - virtual bool processElement(const char* elementName, // name of the element - const char* elementData, // element data, null if none - const physx::shdfnd::FastXml::AttributePairs& attr, - int /*lineno*/) // line number in the source XML file - { - if (::strcmp(elementName, "Model") == 0) - { - m_assetList.models.resize(m_assetList.models.size() + 1); - auto& model = m_assetList.models.back(); - for (int i = 0; i < attr.getNbAttr(); ++i) - { - if (::strcmp(attr.getKey(i), "id") == 0) - { - model.id = std::string(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "file") == 0) - { - model.file = std::string(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "name") == 0) - { - model.name = std::string(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "isSkinned") == 0) - { - std::string str = attr.getValue(i); - if (::strcmp(&str[0], "true") == 0) - { - model.isSkinned = true; - } - } - } - - model.transform = parseTransform(attr); - - if (model.name.empty()) - { - model.name = model.file; - } - if (model.id.empty()) - { - model.id = model.name; - } - } - else if (::strcmp(elementName, "Box") == 0) - { - for (int i = 0; i < attr.getNbAttr(); ++i) - { - if (::strcmp(attr.getKey(i), "id") == 0) - { - m_boxTemp.id = std::string(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "name") == 0) - { - m_boxTemp.name = std::string(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "jointAllBonds") == 0) - { - std::string str = attr.getValue(i); - if (::strcmp(&str[0], "true") == 0) - { - m_boxTemp.jointAllBonds = true; - } - } - else if (::strcmp(attr.getKey(i), "extents") == 0) - { - std::string str = attr.getValue(i); - sscanf(&str[0], "%f %f %f", &m_boxTemp.extents.x, &m_boxTemp.extents.y, &m_boxTemp.extents.z); - } - else if (::strcmp(attr.getKey(i), "bondFlagsMask") == 0) - { - std::string str = attr.getValue(i); - std::bitset<8> bondFlags(str); - m_boxTemp.bondFlags = static_cast<uint32_t>(bondFlags.to_ulong()); - } - } - - if (m_boxTemp.id.empty()) - { - m_boxTemp.id = m_boxTemp.name; - } - } - else if (::strcmp(elementName, "Level") == 0) - { - m_boxTemp.levels.push_back(AssetList::BoxAsset::Level()); - auto& level = m_boxTemp.levels.back(); - for (int i = 0; i < attr.getNbAttr(); ++i) - { - if (::strcmp(attr.getKey(i), "slices") == 0) - { - std::string str = attr.getValue(i); - sscanf(&str[0], "%d %d %d", &level.x, &level.y, &level.z); - } - if (::strcmp(attr.getKey(i), "isSupport") == 0) - { - std::string str = attr.getValue(i); - if (::strcmp(&str[0], "true") == 0) - { - level.isSupport = true; - } - } - } - } - else if (::strcmp(elementName, "Composite") == 0) - { - for (int i = 0; i < attr.getNbAttr(); ++i) - { - if (::strcmp(attr.getKey(i), "id") == 0) - { - m_compositeTemp.id = std::string(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "name") == 0) - { - m_compositeTemp.name = std::string(attr.getValue(i)); - } - } - m_compositeTemp.transform = parseTransform(attr); - - if (m_compositeTemp.id.empty()) - { - m_compositeTemp.id = m_compositeTemp.name; - } - } - else if (::strcmp(elementName, "AssetRef") == 0) - { - m_compositeTemp.assetRefs.push_back(AssetList::CompositeAsset::AssetRef()); - AssetList::CompositeAsset::AssetRef& assetRef = m_compositeTemp.assetRefs.back(); - for (int i = 0; i < attr.getNbAttr(); ++i) - { - if (::strcmp(attr.getKey(i), "id") == 0) - { - assetRef.id = attr.getValue(i); - } - } - assetRef.transform = parseTransform(attr); - } - else if (::strcmp(elementName, "Joint") == 0) - { - m_compositeTemp.joints.push_back(AssetList::CompositeAsset::Joint()); - AssetList::CompositeAsset::Joint& joint = m_compositeTemp.joints.back(); - for (int i = 0; i < attr.getNbAttr(); ++i) - { - if (::strcmp(attr.getKey(i), "asset0") == 0) - { - joint.assetIndices[0] = std::stoi(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "asset1") == 0) - { - joint.assetIndices[1] = std::stoi(attr.getValue(i)); - } - if (::strcmp(attr.getKey(i), "chunk0") == 0) - { - joint.chunkIndices[0] = std::stoi(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "chunk1") == 0) - { - joint.chunkIndices[1] = std::stoi(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "position0") == 0) - { - joint.attachPositions[0] = parsePosition(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "position1") == 0) - { - joint.attachPositions[1] = parsePosition(attr.getValue(i)); - } - } - } - return true; - } - -private: - PxTransform parseTransform(const physx::shdfnd::FastXml::AttributePairs& attr) - { - PxTransform transform(PxIdentity); - for (int i = 0; i < attr.getNbAttr(); ++i) - { - if (::strcmp(attr.getKey(i), "position") == 0) - { - transform.p = parsePosition(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "rotation") == 0) - { - transform.q = parseRotation(attr.getValue(i)); - } - } - return transform; - } - - PxVec3 parsePosition(const char* value) - { - PxVec3 ps; - sscanf(value, "%f %f %f", &ps.x, &ps.y, &ps.z); - return ps; - } - - PxQuat parseRotation(const char* value) - { - PxVec4 ps; - sscanf(value, "%f %f %f %f", &ps.x, &ps.y, &ps.z, &ps.w); - ps.w = ps.w * DEGREE_TO_RAD; - return PxQuat(ps.w, PxVec3(ps.x, ps.y, ps.z).getNormalized());; - } - - AssetList::BoxAsset m_boxTemp; - AssetList::CompositeAsset m_compositeTemp; - AssetList& m_assetList; -}; - - -void parseAssetList(AssetList& assetList, std::string filepath) -{ - physx::PsFileBuffer fileBuffer(filepath.c_str(), physx::general_PxIOStream2::PxFileBuf::OPEN_READ_ONLY); - if (!fileBuffer.isOpen()) - { - return; - } - PxInputDataFromPxFileBuf inputData(fileBuffer); - AssetListParser parser(assetList); - physx::shdfnd::FastXml* xml = physx::shdfnd::createFastXml(&parser); - xml->processXml(inputData, false); - xml->release(); -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SampleAssetListParser.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SampleAssetListParser.h deleted file mode 100644 index 5d22833..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SampleAssetListParser.h +++ /dev/null @@ -1,38 +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. - - -#ifndef SAMPLEASSETLISTPARSER_H -#define SAMPLEASSETLISTPARSER_H - -#include <string> - -struct AssetList; - -void parseAssetList(AssetList& assetList, std::string filepath); - -#endif // SAMPLEASSETLISTPARSER_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp deleted file mode 100644 index 05681d0..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp +++ /dev/null @@ -1,1736 +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 "SceneController.h" -#include "RenderUtils.h" -#include "Utils.h" - -#include "BlastAssetBoxes.h" -#include "BlastAssetModelSimple.h" -#include "BlastAssetModelSkinned.h" -#include "NvBlastExtPxAsset.h" -#include "NvBlastExtPxFamily.h" -#include "NvBlastExtPxManager.h" - -#include "SampleAssetListParser.h" -#include "BlastReplay.h" -#include "Renderer.h" - -#include "BlastController.h" -#include "CommonUIController.h" -#include "PhysXController.h" - -#include "PxRigidDynamic.h" -#include <PsFastXml.h> -#include "PxInputDataFromPxFileBuf.h" - -#include <algorithm> -#include <imgui.h> -#include <sstream> -#include <tuple> -#include <map> - -#include "BlastSceneTree.h" -#include "SimpleScene.h" -#include "SampleManager.h" -// Add By Lixu Begin -#include "ProjectParams.h" -// Add By Lixu End - -//////// Simple hash function //////// -static NvBlastID generateIDFromString(const char* str) -{ - uint32_t h[4] = { 5381, 5381, 5381, 5381 }; - int i = 0; - for (const char* ptr = str; *ptr; i = ((i + 1) & 3), ++ptr) - { - h[i] = ((h[i] << 5) + h[i]) ^ static_cast<uint32_t>(*ptr); - } - return *reinterpret_cast<NvBlastID*>(h); -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Scenes Setup -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const DirectX::XMFLOAT4 PICK_POINTER_ACTIVE_COLOR(1.0f, 0.f, 0.f, 0.6f); -const float RIGIDBODY_DENSITY = 2000.0f; - - -class SingleSceneAsset; - -class SceneAsset -{ -public: - SceneAsset() : spawnCount(0) {} - virtual ~SceneAsset() {} - - void initialize(Scene* scene) - { - m_scene = scene; - } - - virtual const char* getID() const = 0; - virtual const char* getName() const = 0; - - virtual void load() = 0; - virtual void unload() = 0; - virtual bool isLoaded() const = 0; - virtual void spawn(PxTransform transform) = 0; - - virtual ImVec4 getUIColor() const - { - return ImGui::GetStyle().Colors[ImGuiCol_Text]; - } - - uint32_t spawnCount; -protected: - Scene* m_scene; -}; - - -class SceneActor -{ -public: - SceneActor() : removeOnReload(false) {} - - virtual ~SceneActor() {} - virtual const char* getName() const = 0; - virtual const char* getSubname(int subindex) const { return nullptr; } - virtual ImVec4 getUIColor() const = 0; - virtual void drawUI(int subindex) {} - virtual void drawStatsUI(int subindex) {} - virtual uint32_t getSubactorCount() const { return 0; } - virtual PxVec3 getSpawnShift() const { return PxVec3(PxZero); } - virtual void reload() {} - virtual void removeSubactor(int subindex) {} - - bool removeOnReload; -}; - - -class Scene -{ -public: - struct ActorIndex - { - int index; - int subindex; - - ActorIndex() { reset(); } - ActorIndex(int i, int s = -1) : index(i), subindex(s) {} - - bool operator==(const ActorIndex& other) const - { - return index == other.index && subindex == other.subindex; - } - - void reset() - { - index = -1; - subindex = -1; - } - }; - - Scene(Renderer& renderer, PhysXController& physXController, BlastController& blastController, CommonUIController& commonUIController) : - m_renderer(renderer), m_physXController(physXController), m_blastController(blastController), m_commonUIController(commonUIController) - { - } - - ~Scene() - { - removeAllSceneActors(); - - for (uint32_t i = 0; i < m_assets.size(); i++) - { - SAFE_DELETE(m_assets[i]); - } - m_assets.clear(); - m_assetsByID.clear(); - m_tkAssetMap.clear(); - } - - void addAsset(SceneAsset* asset) - { - m_assets.push_back(asset); - asset->initialize(this); - std::string id = asset->getID(); - m_assetsByID[id] = asset; - } - -// Add By Lixu Begin - void removeAsset(SceneAsset* asset) - { - std::string id = asset->getID(); - m_assetsByID.erase(m_assetsByID.find(id)); - - std::vector<SceneAsset*>::iterator it; - for (it = m_assets.begin(); it != m_assets.end(); it++) - { - if (*it == asset) - { - m_assets.erase(it); - break; - } - } - } - - std::vector<SceneAsset*>& getAssets() - { - return m_assets; - } - - std::vector<SceneActor*>& getActors() - { - return m_sceneActors; - } -// Add By Lixu End - - void drawUI() - { - /////////////////////////////////////////////////////////////////////////////////////////// - // Assets Selection - /////////////////////////////////////////////////////////////////////////////////////////// - { - static int mode = 0; - ImGui::RadioButton("Replace", &mode, 0); ImGui::SameLine(); - ImGui::RadioButton("Append", &mode, 1); - - ImGui::ListBoxHeader("Assets", (int)m_assets.size()); - for (uint32_t i = 0; i < m_assets.size(); ++i) - { - ImVec4 color = m_assets[i]->getUIColor(); - color.w = color.w * (m_assets[i]->isLoaded() ? 1.0f : 0.5f); - ImGui::PushStyleColor(ImGuiCol_Text, color); - if (ImGui::Selectable(m_assets[i]->getName(), m_lastSpawnedAsset == i)) - { - m_lastSpawnedAsset = i; - if (mode == 0) - { - removeAllSceneActors(); - } - m_commonUIController.addDelayedCall([=]() { spawnAsset(m_lastSpawnedAsset); }, "Loading Asset"); - } - ImGui::PopStyleColor(); - } - ImGui::ListBoxFooter(); - } - - ImGui::Spacing(); - ImGui::Separator(); - - /////////////////////////////////////////////////////////////////////////////////////////// - // Actors Selection - /////////////////////////////////////////////////////////////////////////////////////////// - { - // actor's list - { - int itemCount = 0; - for (size_t i = 0; i < m_sceneActors.size(); ++i) - { - itemCount += 1 + m_sceneActors[i]->getSubactorCount(); - } - - ImGui::ListBoxHeader("Scene Actors", itemCount); - for (int i = 0; i < (int)m_sceneActors.size(); ++i) - { - ImVec4 color = m_sceneActors[i]->getUIColor(); - ImGui::PushStyleColor(ImGuiCol_Text, color); - - const bool isSelected = (m_selectedActor.index == i); - - ImGui::PushID(i); - if (ImGui::Selectable(m_sceneActors[i]->getName(), isSelected && m_selectedActor.subindex == -1)) - { - setSelectedActor(i); - } - - for (int s = 0; s < (int)m_sceneActors[i]->getSubactorCount(); ++s) - { - ImGui::PushID(s); - if (ImGui::Selectable(m_sceneActors[i]->getSubname(s), isSelected && m_selectedActor.subindex == s)) - { - setSelectedActor(i, s); - } - ImGui::PopID(); - } - - ImGui::PopID(); - ImGui::PopStyleColor(); - } - ImGui::ListBoxFooter(); - } - - SceneActor* selectedActor = getSelectedActor(); - if (selectedActor) - { - if (ImGui::Button("Remove")) - { - removeSceneActor(m_selectedActor); - } - - ImGui::SameLine(); - - if (ImGui::Button("Reload")) - { - selectedActor->reload(); - } - - ImGui::SameLine(); - } - - if (ImGui::Button("Remove All")) - { - removeAllSceneActors(); - } - ImGui::SameLine(); - if (ImGui::Button("Reload All (R)")) - { - reloadAllActors(); - } - } - - ImGui::Spacing(); - ImGui::Spacing(); - - /////////////////////////////////////////////////////////////////////////////////////////// - // Selected Actor - /////////////////////////////////////////////////////////////////////////////////////////// - { - SceneActor* selectedActor = getSelectedActor(); - if (selectedActor) - { - ImGui::Text("Selected Actor: "); - ImGui::SameLine(); - ImGui::PushStyleColor(ImGuiCol_Text, ImColor(40, 200, 80, 255)); - ImGui::Text(m_selectedActor.subindex >= 0 ? selectedActor->getSubname(m_selectedActor.subindex) : selectedActor->getName()); - ImGui::PopStyleColor(); - - ImGui::Spacing(); - - selectedActor->drawUI(m_selectedActor.subindex); - } - else - { - ImGui::Text("No Selected Actor"); - } - } - } - - void drawStatsUI() - { - SceneActor* selectedActor = getSelectedActor(); - if (selectedActor) - { - selectedActor->drawStatsUI(m_selectedActor.subindex); - } - } - - void spawnAsset(int32_t num) - { - m_lastSpawnedAsset = physx::PxClamp<int32_t>(num, -1, (uint32_t)m_assets.size() - 1); - - if (m_lastSpawnedAsset < 0) - { - return; - } - - PxTransform transform(PxIdentity); -// Add By Lixu Begin - /* - for (SceneActor* a : m_sceneActors) - { - shift += a->getSpawnShift(); - } - */ -// Add By Lixu End - - SceneAsset* asset = m_assets[m_lastSpawnedAsset]; - asset->spawn(transform); - } - - void addSceneActor(SceneActor* actor) - { - m_sceneActors.push_back(actor); - if (!getSelectedActor()) - { - setSelectedActor((uint32_t)m_sceneActors.size() - 1); - } - } - -// Add By Lixu Begin - void removeSceneActor(SceneActor* actor) - { - std::vector<SceneActor*>::iterator itActors; - for (itActors = m_sceneActors.begin(); itActors != m_sceneActors.end(); itActors++) - { - if (*itActors == actor) - { - m_sceneActors.erase(itActors); - break; - } - } - } -// Add By Lixu End - - void removeSceneActor(ActorIndex actorIndex) - { - SceneActor* actor = getActorByIndex(actorIndex.index); - if (actorIndex.subindex < 0) - { - delete actor; - m_sceneActors.erase(std::remove(m_sceneActors.begin(), m_sceneActors.end(), actor)); - } - else - { - actor->removeSubactor(actorIndex.subindex); - - if (actor->getSubactorCount() == 0) - { - removeSceneActor(ActorIndex(actorIndex.index, -1)); - return; - } - } - - SceneActor* selectedActor = getActorByIndex(m_selectedActor.index); - if (selectedActor == nullptr) - { - if (!m_sceneActors.empty()) - { - setSelectedActor((uint32_t)m_sceneActors.size() - 1); - } - } - else - { - int subactorCount = selectedActor->getSubactorCount(); - if (m_selectedActor.subindex >= subactorCount || (m_selectedActor.subindex < 0 && subactorCount > 0)) - { - setSelectedActor(m_selectedActor.index, subactorCount - 1); - } - } - } - - void removeAllSceneActors() - { - for (SceneActor* a : m_sceneActors) - { - delete a; - } - m_sceneActors.clear(); - setSelectedActor(-1); - } - - void setSelectedActor(int index, int subindex = -1) - { - m_selectedActor.index = physx::PxClamp<int32_t>(index, -1, (uint32_t)m_sceneActors.size() - 1); - m_selectedActor.subindex = subindex; - } - - SceneActor* getSelectedActor() const - { - return getActorByIndex(m_selectedActor.index); - } - - SceneActor* getActorByIndex(int index) const - { - return (index >= 0 && index < (int)m_sceneActors.size()) ? m_sceneActors[index] : nullptr; - } - - int releaseAll() - { - removeAllSceneActors(); - - for (size_t i = 0; i < m_assets.size(); ++i) - { - m_assets[i]->unload(); - } - - m_assets.clear(); - const int currentAsset = m_lastSpawnedAsset; - m_lastSpawnedAsset = -1; - return currentAsset; - } - - void reloadAllActors() - { - SceneActor* selectedActor = getSelectedActor(); - ActorIndex selectIndex(0); - - for (uint32_t i = 0; i < m_sceneActors.size(); i++) - { - if (m_sceneActors[i]->removeOnReload) - { - removeSceneActor(ActorIndex(i)); - i--; - } - } - - for (uint32_t i = 0; i < m_sceneActors.size(); i++) - { - if (m_sceneActors[i] == selectedActor) - { - selectIndex.index = i; - } - m_sceneActors[i]->reload(); - } - - setSelectedActor(selectIndex.index, selectIndex.subindex); - } - - void registerTkAsset(const TkAsset& tkAsset, SingleSceneAsset* asset) - { - m_tkAssetMap[&tkAsset] = asset; - } - - void unregisterTkAsset(const TkAsset& tkAsset) - { - m_tkAssetMap.erase(&tkAsset); - } - - SingleSceneAsset* findSingleSceneAsset(const TkAsset& tkAsset) - { - auto entry = m_tkAssetMap.find(&tkAsset); - return entry != m_tkAssetMap.end() ? entry->second : nullptr; - } - - SceneAsset* findSceneAsset(const std::string& id) - { - auto entry = m_assetsByID.find(id); - return entry != m_assetsByID.end() ? entry->second : nullptr; - } - - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return m_renderer; - } - - PhysXController& getPhysXController() const - { - return m_physXController; - } - - BlastController& getBlastController() const - { - return m_blastController; - } - - CommonUIController& getCommonUIController() const - { - return m_commonUIController; - } - -private: - - Renderer& m_renderer; - PhysXController& m_physXController; - BlastController& m_blastController; - CommonUIController& m_commonUIController; - - std::vector<SceneAsset*> m_assets; - std::vector<SceneActor*> m_sceneActors; - std::map<const TkAsset*, SingleSceneAsset*> m_tkAssetMap; - std::map<std::string, SceneAsset*> m_assetsByID; - - int m_lastSpawnedAsset; - - ActorIndex m_selectedActor; -}; - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Assets -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class SingleSceneActor; - -class SingleSceneAsset : public SceneAsset -{ -public: - SingleSceneAsset(BlastAsset* pBlastAsset) : m_asset(pBlastAsset) {} - virtual ~SingleSceneAsset() { unload(); } - - virtual void spawn(PxTransform transform) override; - - virtual void load() override - { - if (!m_asset) - { - m_asset = createAsset(); - } - - m_scene->registerTkAsset(m_asset->getPxAsset()->getTkAsset(), this); - } - - virtual void unload() override - { - if (m_asset) - { - m_scene->unregisterTkAsset(m_asset->getPxAsset()->getTkAsset()); - delete m_asset; - m_asset = nullptr; - } - } - - virtual bool isLoaded() const override - { - return m_asset != nullptr; - } - - BlastAsset* getAsset() const - { - return m_asset; - } - - virtual PxTransform getInitialTransform() = 0; - -protected: - virtual BlastAsset* createAsset() = 0; - -private: - BlastAsset* m_asset; -}; - - -class ModelSceneAsset : public SingleSceneAsset -{ -public: - ModelSceneAsset(BlastAsset* pBlastAsset) : SingleSceneAsset(pBlastAsset) {} - - virtual const char* getID() const override{ return desc.id.c_str(); } - virtual const char* getName() const override { return desc.name.c_str(); } - - AssetList::ModelAsset desc; - - virtual PxTransform getInitialTransform() { return desc.transform; } -}; - - -class SimpleModelSceneAsset : public ModelSceneAsset -{ -public: - SimpleModelSceneAsset(BlastAsset* pBlastAsset) : ModelSceneAsset(pBlastAsset) {} - - virtual BlastAsset* createAsset() - { - return new BlastAssetModelSimple(m_scene->getBlastController().getTkFramework(), m_scene->getPhysXController().getPhysics(), - m_scene->getPhysXController().getCooking(), *m_scene->getBlastController().getExtSerialization(), m_scene->getRenderer(), desc.file.c_str()); - } - - virtual ImVec4 getUIColor() const override - { - return ImColor(255, 255, 200, 255); - } -}; - - -class SkinnedModelSceneAsset : public ModelSceneAsset -{ -public: - SkinnedModelSceneAsset(BlastAsset* pBlastAsset) : ModelSceneAsset(pBlastAsset) {} - - virtual BlastAsset* createAsset() - { - return new BlastAssetModelSkinned(m_scene->getBlastController().getTkFramework(), m_scene->getPhysXController().getPhysics(), - m_scene->getPhysXController().getCooking(), *m_scene->getBlastController().getExtSerialization(), m_scene->getRenderer(), desc.file.c_str()); - } - - virtual ImVec4 getUIColor() const override - { - return ImColor(255, 200, 255, 255); - } -}; - - -class BoxesSceneAsset : public SingleSceneAsset -{ -public: - BoxesSceneAsset(const AssetList::BoxAsset& d) : SingleSceneAsset(nullptr) - { - desc = d; - - for (uint32_t lv = 0; lv < desc.levels.size(); ++lv) - { - const AssetList::BoxAsset::Level& level = desc.levels[lv]; - NvBlastChunkDesc::Flags fl = (level.isSupport) ? NvBlastChunkDesc::Flags::SupportFlag : NvBlastChunkDesc::Flags::NoFlags; - assetDesc.generatorSettings.depths.push_back({ GeneratorAsset::Vec3(level.x, level.y, level.z), fl }); - } - assetDesc.generatorSettings.extents = GeneratorAsset::Vec3(desc.extents.x, desc.extents.y, desc.extents.z); - assetDesc.staticHeight = desc.staticHeight; - assetDesc.jointAllBonds = desc.jointAllBonds; - assetDesc.generatorSettings.bondFlags = (CubeAssetGenerator::BondFlags)desc.bondFlags; - } - - virtual ImVec4 getUIColor() const override - { - return ImColor(255, 200, 200, 255); - } - - virtual const char* getID() const override { return desc.id.c_str(); } - virtual const char* getName() const override { return desc.name.c_str(); } - - - AssetList::BoxAsset desc; - BlastAssetBoxes::Desc assetDesc; - - virtual BlastAsset* createAsset() - { - return new BlastAssetBoxes(m_scene->getBlastController().getTkFramework(), m_scene->getPhysXController().getPhysics(), - m_scene->getPhysXController().getCooking(), m_scene->getRenderer(), assetDesc); - } - - virtual PxTransform getInitialTransform() { return PxTransform(PxVec3(0, assetDesc.generatorSettings.extents.y / 2, 0)); } -}; - - -class CompositeSceneAsset : public SceneAsset -{ -public: - CompositeSceneAsset(const AssetList::CompositeAsset& desc) - : m_desc(desc) - { - } - - virtual ~CompositeSceneAsset() { unload(); } - - virtual ImVec4 getUIColor() const override - { - return ImColor(200, 255, 255, 255); - } - - virtual const char* getID() const override { return m_desc.id.c_str(); } - virtual const char* getName() const override { return m_desc.name.c_str(); } - - virtual void spawn(PxTransform transform) override; - - virtual void load() override - { - if (!isLoaded()) - { - // load dependent assets - for (const auto& assetRef : m_desc.assetRefs) - { - SceneAsset* asset = m_scene->findSceneAsset(assetRef.id); - if (asset) - { - asset->load(); - m_sceneAssets.push_back(static_cast<SingleSceneAsset*>(asset)); - } - else - { - m_scene->getCommonUIController().addPopupMessage("Error", "Wrong asset dependency on composite"); - m_sceneAssets.clear(); - return; - } - } - - // check joints - for (const auto& joint : m_desc.joints) - { - bool ok = (joint.assetIndices[0] >= 0 || joint.assetIndices[1] >= 0); - for (char k = 0; k < 2 && ok; ++k) - { - if (joint.assetIndices[k] < 0) - continue; - ok &= (joint.assetIndices[k] < (int32_t)m_sceneAssets.size()); - if (!ok) - break; - ok &= joint.chunkIndices[k] < m_sceneAssets[joint.assetIndices[k]]->getAsset()->getPxAsset()->getTkAsset().getChunkCount(); - } - if (!ok) - { - m_scene->getCommonUIController().addPopupMessage("Error", "Wrong joint on composite"); - m_sceneAssets.clear(); - return; - } - } - } - } - - virtual void unload() override - { - m_sceneAssets.clear(); - } - - virtual bool isLoaded() const override - { - return !m_sceneAssets.empty(); - } - - virtual PxTransform getInitialTransform() - { - return m_desc.transform; - } - - const AssetList::CompositeAsset& getDesc() const - { - return m_desc; - } - - const std::vector<SingleSceneAsset*>& getSceneAssets() const - { - return m_sceneAssets; - } - -private: - AssetList::CompositeAsset m_desc; - std::vector<SingleSceneAsset*> m_sceneAssets; -}; - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Scene Actors -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class SingleSceneActor : public SceneActor -{ -public: - SingleSceneActor(Scene& scene, SingleSceneAsset* asset, PxTransform transform) - : m_scene(scene) - , m_asset(asset) - , m_transform(transform) - { - m_index = m_asset->spawnCount++; - spawn(); - } - - SingleSceneActor::~SingleSceneActor() - { - remove(); - } - -// Add By Lixu Begin - SingleSceneAsset* getSceneAsset() - { - return m_asset; - } -// Add By Lixu End - - virtual const char* getName() const override - { - return m_name.c_str(); - } - - virtual const char* getSubname(int) const override - { - return nullptr; - } - - virtual ImVec4 getUIColor() const override - { - return m_asset->getUIColor(); - } - - virtual void drawUI(int) override - { - m_actor->drawUI(); - } - - virtual void drawStatsUI(int) override - { - m_actor->drawStatsUI(); - } - - virtual PxVec3 getSpawnShift() const override - { - return PxVec3(-20, 0, 0); - } - - virtual void reload() override - { - BlastFamilyPtr oldFamily = m_actor; - auto settings = m_actor->getSettings(); - - RenderMaterial* pRenderMaterial[2]; - m_actor->getMaterial(&pRenderMaterial[0], true); - m_actor->getMaterial(&pRenderMaterial[1], false); - - m_transform = settings.transform; - remove(); - spawn(); - - m_actor->setMaterial(pRenderMaterial[0], true); - m_actor->setMaterial(pRenderMaterial[1], false); - - m_actor->setSettings(settings); - SampleManager::ins()->updateFamily(oldFamily, m_actor); - } - - BlastFamily* getFamily() { return m_actor; } - -private: - void remove() - { - m_scene.getBlastController().removeFamily(m_actor); - m_actor = nullptr; - } - - void spawn() - { - std::ostringstream str; - str << m_asset->getName(); - if (m_index) - str << " (" << m_index << ")"; - m_name = str.str(); - - PxTransform pose = m_transform; - - BlastAsset::ActorDesc actorDesc = { - actorDesc.id = generateIDFromString(m_name.c_str()), - pose, - m_scene.getBlastController().getTkGroup() - }; - - m_actor = m_scene.getBlastController().spawnFamily(m_asset->getAsset(), actorDesc); - // Add By Lixu Begin - BlastFamily::Settings settings = m_actor->getSettings(); - std::map<BlastAsset*, AssetList::ModelAsset>& assetDescMap = SampleManager::ins()->getAssetDescMap(); - AssetList::ModelAsset& assetDesc = assetDescMap[m_asset->getAsset()]; - BPPAsset* bppAsset = BlastProject::ins().getAsset(assetDesc.name.c_str()); - if (nullptr != bppAsset) - { - BPPStressSolver& stressSolver = bppAsset->stressSolver; - ExtStressSolverSettings & stressSolverSettings = settings.stressSolverSettings; - stressSolverSettings.hardness = stressSolver.hardness; - stressSolverSettings.stressLinearFactor = stressSolver.linearFactor; - stressSolverSettings.stressAngularFactor = stressSolver.angularFactor; - stressSolverSettings.bondIterationsPerFrame = stressSolver.bondIterationsPerFrame; - stressSolverSettings.graphReductionLevel = stressSolver.graphReductionLevel; - m_actor->setSettings(settings); - } - // Add By Lixu End - } - - Scene& m_scene; - BlastFamilyPtr m_actor; - SingleSceneAsset* m_asset; - PxTransform m_transform; - uint32_t m_index; - std::string m_name; -}; - -class CompositeSceneActor : public SceneActor -{ -public: - CompositeSceneActor(Scene& scene, CompositeSceneAsset* asset, PxTransform transform) - : m_scene(scene) - , m_asset(asset) - , m_transform(transform) - { - m_index = m_asset->spawnCount++; - spawn(); - } - - CompositeSceneActor::~CompositeSceneActor() - { - remove(); - } - - virtual uint32_t getSubactorCount() const - { - return (uint32_t)m_actors.size(); - } - - virtual const char* getName() const override - { - return m_name.c_str(); - } - - virtual const char* getSubname(int subindex) const override - { - return m_actors[subindex].name.c_str(); - } - - virtual ImVec4 getUIColor() const override - { - return m_asset->getUIColor(); - } - - virtual void drawUI(int subindex) override - { - if (subindex >= 0) - { - m_actors[subindex].actor->drawUI(); - } - else - { - ImGui::Text("Select subactor to edit settings."); - } - } - - virtual void drawStatsUI(int subindex) override - { - if (subindex >= 0) - { - m_actors[subindex].actor->drawStatsUI(); - } - } - - virtual PxVec3 getSpawnShift() const override - { - return PxVec3(-20, 0, 0); - } - - virtual void reload() override - { - std::map<uint32_t, BlastFamily::Settings> settings; - for (uint32_t i = 0; i < m_actors.size(); ++i) - { - settings[m_actors[i].initialIndex] = m_actors[i].actor->getSettings(); - } - remove(); - spawn(); - for (uint32_t i = 0; i < m_actors.size(); ++i) - { - if (settings.find(i) != settings.end()) - { - m_actors[i].actor->setSettings(settings[i]); - } - } - } - - virtual void removeSubactor(int subindex) - { - if (subindex >= 0 && subindex < (int)m_actors.size()) - { - m_scene.getBlastController().removeFamily(m_actors[subindex].actor); - m_actors[subindex] = m_actors.back(); - m_actors.resize(m_actors.size() - 1); - } - } - -private: - void remove() - { - for (uint32_t i = 0; i < m_actors.size(); ++i) - { - m_scene.getBlastController().removeFamily(m_actors[i].actor); - } - m_actors.clear(); - } - - void spawn() - { - std::ostringstream str; - str << m_asset->getName(); - if (m_index) - str << " (" << m_index << ")"; - m_name = str.str(); - - const AssetList::CompositeAsset& assetDesc = m_asset->getDesc(); - const std::vector<SingleSceneAsset*>& sceneAssets = m_asset->getSceneAssets(); - - const uint32_t actorCount = (uint32_t)sceneAssets.size(); - m_actors.resize(actorCount); - - for (uint32_t i = 0; i < actorCount; ++i) - { - std::ostringstream str; - str << " -> " << i << "." << sceneAssets[i]->getName(); - m_actors[i].name = str.str(); - } - - ExtPxManager& pxManager = m_scene.getBlastController().getExtPxManager(); - for (uint32_t i = 0; i < actorCount; ++i) - { - PxTransform pose = m_transform; - pose = assetDesc.assetRefs[i].transform.transform(pose); - - BlastAsset::ActorDesc actorDesc = { - generateIDFromString(m_actors[i].name.c_str()), - pose, - m_scene.getBlastController().getTkGroup() - }; - m_actors[i].actor = m_scene.getBlastController().spawnFamily(sceneAssets[i]->getAsset(), actorDesc); - m_actors[i].initialIndex = i; - } - - for (const auto& joint : assetDesc.joints) - { - TkJointDesc jointDesc; - for (char k = 0; k < 2; ++k) - { - jointDesc.attachPositions[k] = joint.attachPositions[k]; - jointDesc.chunkIndices[k] = joint.chunkIndices[k]; - jointDesc.families[k] = (joint.assetIndices[k] < 0) ? nullptr : &m_actors[joint.assetIndices[k]].actor->getFamily()->getTkFamily(); - } - TkJoint* joint = pxManager.getFramework().createJoint(jointDesc); - if (joint) - { - pxManager.createJoint(*joint); - } - else - { - m_scene.getCommonUIController().addPopupMessage("Error", "Some joints can't be created"); - } - } - } - - struct Subactor - { - BlastFamilyPtr actor; - uint32_t initialIndex; - std::string name; - }; - - Scene& m_scene; - std::vector<Subactor> m_actors; - CompositeSceneAsset* m_asset; - PxTransform m_transform; - uint32_t m_index; - std::string m_name; -}; - -class PhysXSceneActor : public SceneActor -{ -public: - PhysXSceneActor(PhysXController& physXController, PhysXController::Actor* actor, const char* name) - : m_physXController(physXController) - , m_actor(actor) - , m_name(name) - { - } - - PhysXSceneActor::~PhysXSceneActor() - { - m_physXController.removePhysXPrimitive(m_actor); - } - - virtual const char* getName() const override - { - // Add By Lixu Begin - return m_name.c_str(); - // Add By Lixu End - } - - virtual ImVec4 getUIColor() const override - { - return ImColor(255, 100, 100, 255); - } - - // Add By Lixu Begin - PhysXController::Actor* getActor() { return m_actor; } - // Add By Lixu End - -private: - PhysXController& m_physXController; - PhysXController::Actor* m_actor; - // Add By Lixu Begin - std::string m_name; - // Add By Lixu End - -}; - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Assets Implementation -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void SingleSceneAsset::spawn(PxTransform transform) -{ - load(); - SingleSceneActor* actor = new SingleSceneActor(*m_scene, this, transform); - m_scene->addSceneActor(actor); -} - -void CompositeSceneAsset::spawn(PxTransform transform) -{ - load(); - if (isLoaded()) - { - CompositeSceneActor* actor = new CompositeSceneActor(*m_scene, this, transform); - m_scene->addSceneActor(actor); - } -} - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// PackmanConfigParser -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -class PackmanConfigParser : public physx::shdfnd::FastXml::Callback -{ -public: - std::vector<std::pair<std::string, std::string>> dependencies; - -protected: - - // encountered a comment in the XML - virtual bool processComment(const char* /*comment*/) - { - return true; - } - - virtual bool processClose(const char* elementName, unsigned int /*depth*/, bool& /*isError*/) - { - return true; - } - - // return true to continue processing the XML document, false to skip. - virtual bool processElement(const char* elementName, // name of the element - const char* elementData, // element data, null if none - const physx::shdfnd::FastXml::AttributePairs& attr, - int /*lineno*/) // line number in the source XML file - { - if (::strcmp(elementName, "dependency") == 0) - { - dependencies.resize(dependencies.size() + 1); - for (int i = 0; i < attr.getNbAttr(); ++i) - { - if (::strcmp(attr.getKey(i), "name") == 0) - { - dependencies.back().first = std::string(attr.getValue(i)); - } - else if (::strcmp(attr.getKey(i), "version") == 0) - { - dependencies.back().second = std::string(attr.getValue(i)); - } - } - } - return true; - } -}; - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Controller -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -SceneController::SceneController() : m_cubeScale(1.0f), m_cubeThrowDownTime(-1.f) -{ - m_scene = NULL; - BlastToSceneMap.clear(); -} - -SceneController::~SceneController() -{ -} - -void SceneController::onSampleStart() -{ - // setup camera - CFirstPersonCamera* camera = &getRenderer().getCamera(); - Camera* pCamera = SimpleScene::Inst()->m_pCamera; - DirectX::XMVECTORF32 eyePt = { pCamera->_eye.x, pCamera->_eye.y, pCamera->_eye.z, 0 }; - DirectX::XMVECTORF32 lookAtPt = { pCamera->_at.x, pCamera->_at.y, pCamera->_at.z, 0 }; - camera->SetViewParams(eyePt, lookAtPt); - camera->SetRotateButtons(false, false, false, false); - camera->SetEnablePositionMovement(true); - - // setup scene - m_scene = new Scene(getRenderer(), getPhysXController(), getBlastController(), getCommonUIController()); - - // commented by Jun Ma to prevent a crash. We do not need those demo resources. We only need shaders. - //// add packman repo to search dirs - //bool packmanResourcesAdded = false; - //if (const char* packmanPath = std::getenv("PM_PACKAGES_ROOT")) - //{ - // const char* RESOURCES_CONFIG_FILE = "resources.xml"; - - // std::string path; - // if (getRenderer().getResourceManager().findFile(RESOURCES_CONFIG_FILE, path)) - // { - // physx::PsFileBuffer fileBuffer(path.c_str(), physx::general_PxIOStream2::PxFileBuf::OPEN_READ_ONLY); - // if (fileBuffer.isOpen()) - // { - // PxInputDataFromPxFileBuf inputData(fileBuffer); - // PackmanConfigParser parser; - // physx::shdfnd::FastXml* xml = physx::shdfnd::createFastXml(&parser); - // xml->processXml(inputData, false); - // xml->release(); - // for (auto& dep : parser.dependencies) - // { - // std::stringstream ss; - // ss << packmanPath << "\\" << dep.first << "\\" << dep.second; - // if (getRenderer().getResourceManager().addSearchDir(ss.str().c_str())) - // { - // packmanResourcesAdded = true; - // } - // } - // } - // } - //} - //if (!packmanResourcesAdded) - //{ - // getManager()->getCommonUIController().addPopupMessage("Error", "BlastSampleResources package wasn't found. Consider running download_sample_resources.bat in root folder.", 5.0f); - //} -} - -void SceneController::addAssets(const AssetList& assetList, bool loadModels) -{ - if (loadModels) - { - for (const auto& model : assetList.models) - { - ModelSceneAsset* asset; - if (!model.isSkinned) - { - asset = new SimpleModelSceneAsset(nullptr); - } - else - { - asset = new SkinnedModelSceneAsset(nullptr); - } - asset->desc = model; - m_scene->addAsset(asset); - } - - for (const auto& composite : assetList.composites) - { - m_scene->addAsset(new CompositeSceneAsset(composite)); - } - } - - for (const auto& box : assetList.boxes) - { - BoxesSceneAsset* asset = new BoxesSceneAsset(box); - m_scene->addAsset(asset); - } -} - -void SceneController::addBlastAsset(BlastAssetModelSimple* pBlastAsset, AssetList::ModelAsset modelAsset) -{ - // 1 - ModelSceneAsset* asset = new SimpleModelSceneAsset(pBlastAsset); - asset->desc = modelAsset; - BlastToSceneMap[pBlastAsset] = asset; - - // 2 - m_scene->addAsset(asset); - - // 3 - asset->load(); -} - -void deleteSceneActors(Scene* scene, SceneAsset* asset) -{ - std::vector<SceneActor*> deleteActors; - - std::vector<SceneActor*>& Actors = scene->getActors(); - std::vector<SceneActor*>::iterator itActors; - for (itActors = Actors.begin(); itActors != Actors.end(); ) - { - SingleSceneActor* pSceneActor = (SingleSceneActor*)*itActors; - SingleSceneAsset* pSingleSceneAsset = pSceneActor->getSceneAsset(); - if (pSingleSceneAsset == asset) - { - deleteActors.push_back(pSceneActor); - itActors = Actors.erase(itActors); - } - else - { - itActors++; - } - } - - for (itActors = deleteActors.begin(); itActors != deleteActors.end(); itActors++) - { - delete *itActors; - *itActors = nullptr; - } - deleteActors.clear(); -} - -void SceneController::removeBlastAsset(BlastAssetModelSimple* pBlastAsset) -{ - std::vector<SceneAsset*>& Assets = m_scene->getAssets(); - std::vector<SceneAsset*>::iterator itAssets; - for (itAssets = Assets.begin(); itAssets != Assets.end(); itAssets++) - { - ModelSceneAsset* pSceneAsset = (ModelSceneAsset*)*itAssets; - BlastAsset* pAsset = pSceneAsset->getAsset(); - if (pAsset == pBlastAsset) - { - deleteSceneActors(m_scene, pSceneAsset); - - // 3 - pSceneAsset->unload(); - - // 2 - m_scene->removeAsset(pSceneAsset); - - // 1 - delete pSceneAsset; - std::map<BlastAsset*, ModelSceneAsset*>::iterator itBSM; - itBSM = BlastToSceneMap.find(pBlastAsset); - BlastToSceneMap.erase(itBSM); - break; - } - } -} - -BlastFamily* SceneController::addBlastFamily(BlastAsset* pBlastAsset, physx::PxTransform transform) -{ - if (pBlastAsset == nullptr) - { - return nullptr; - } - - std::map<BlastAsset*, ModelSceneAsset*>::iterator itBSM; - itBSM = BlastToSceneMap.find(pBlastAsset); - if (itBSM == BlastToSceneMap.end()) - { - return nullptr; - } - - ModelSceneAsset* asset = itBSM->second; - if (asset == nullptr) - { - return nullptr; - } - - SingleSceneActor* actor = new SingleSceneActor(*m_scene, asset, transform); - m_scene->addSceneActor(actor); - - BlastFamily* pBlastFamily = actor->getFamily(); - if (pBlastFamily != nullptr) - { - pBlastFamily->updatePreSplit(0); - pBlastFamily->clearVisibleChangedChunks(); - } - return pBlastFamily; -} - -void SceneController::removeBlastFamily(BlastAsset* pBlastAsset, int nFamilyIndex) -{ - if (pBlastAsset == nullptr) - { - return; - } - - std::map<BlastAsset*, ModelSceneAsset*>::iterator itBSM; - itBSM = BlastToSceneMap.find(pBlastAsset); - if (itBSM == BlastToSceneMap.end()) - { - return; - } - - ModelSceneAsset* asset = itBSM->second; - if (asset == nullptr) - { - return; - } - - SceneActor* pSceneActor = m_scene->getActorByIndex(nFamilyIndex); - if (pSceneActor == nullptr) - { - return; - } - - m_scene->removeSceneActor(pSceneActor); - - delete pSceneActor; - pSceneActor = nullptr; -} - -void SceneController::onInitialize() -{ - -} - -void SceneController::onSampleStop() -{ - if (NULL != m_scene) - { - delete m_scene; - m_scene = nullptr; - } -} - -void SceneController::onTerminate() -{ -} - -void SceneController::Animate(double dt) -{ -} - -LRESULT SceneController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - if (uMsg == WM_KEYDOWN) - { - int iKeyPressed = static_cast<int>(wParam); - switch (iKeyPressed) - { - case 'R': - m_scene->reloadAllActors(); - return 0; - case 'F': - if (m_cubeThrowDownTime == -1.f) - { - m_cubeThrowDownTime = ImGui::GetTime(); - } - return 0; - default: - break; - } - } - else if (uMsg == WM_KEYUP) - { - int iKeyPressed = static_cast<int>(wParam); - switch (iKeyPressed) - { - case 'F': - throwCube(); - m_cubeThrowDownTime = -1.f; - return 0; - default: - break; - } - } - - return 1; -} - -void SceneController::drawUI() -{ - /////////////////////////////////////////////////////////////////////////////////////////// - // Scene UI - /////////////////////////////////////////////////////////////////////////////////////////// - - m_scene->drawUI(); - - - ImGui::Spacing(); - ImGui::Spacing(); - ImGui::Separator(); - ImGui::Spacing(); - ImGui::Spacing(); - - /////////////////////////////////////////////////////////////////////////////////////////// - // Replay - /////////////////////////////////////////////////////////////////////////////////////////// - { - ImGui::Text("Replay Control:"); - - BlastReplay* replay = getBlastController().getReplay(); - if (replay->isRecording()) - { - auto getAnimStr = []() - { - const uint32_t count = 5; - const uint64_t periodMS = 150; - static char str[count + 1] = ""; - for (uint32_t i = 0; i < count; i++) - { - uint64_t ts = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count(); - str[i] = (i == (ts % (periodMS * count)) / periodMS) ? '*' : ' '; - } - return str; - }; - ImGui::Text("State: Recording [%s] | Events: %d", getAnimStr(), replay->getEventCount()); - - if (ImGui::Button("Stop Recording")) - { - replay->stopRecording(); - } - } - else if (replay->isPlaying()) - { - ImGui::Text("State: Playing | Events: %d / %d", replay->getCurrentEventIndex(), replay->getEventCount()); - - if (ImGui::Button("Stop Playing")) - { - replay->stopPlayback(); - } - } - else - { - ImGui::Text("State: Idle | Events: %d", replay->getEventCount()); - - static bool syncFamilies = true; - static bool syncPhysics = true; - - ImGui::Checkbox("Sync Initial Actors", &syncFamilies); - if (ImGui::Checkbox("Sync Initial Transforms", &syncPhysics)) - { - syncFamilies = syncPhysics; - } - - if (ImGui::Button("Start Recording")) - { - replay->startRecording(getBlastController().getExtPxManager(), syncFamilies, syncPhysics); - } - - if (replay->hasRecord()) - { - static bool reload = false; - if (ImGui::Button("Start Playback")) - { - if (reload) - m_scene->reloadAllActors(); - replay->startPlayback(getBlastController().getExtPxManager(), getBlastController().getTkGroup()); - } - ImGui::SameLine(); - ImGui::Checkbox("Reload Scene On Playback", &reload); - } - } - } - - ImGui::Spacing(); - ImGui::Spacing(); - ImGui::Separator(); - - /////////////////////////////////////////////////////////////////////////////////////////// - // Cube - /////////////////////////////////////////////////////////////////////////////////////////// - { - ImGui::Text("Thrown Cube Params (F)"); - ImGui::DragFloat("Cube Size", &m_cubeScale, 1.0f, 0.0f, 100.0f); - ImGui::Text("Cube Speed (hold F): %1.f", getCubeSpeed()); - } - -} - -void SceneController::drawStatsUI() -{ - m_scene->drawStatsUI(); -} - -float SceneController::getCubeSpeed() -{ - const float CUBE_VELOCITY_SPEED_MIN = 70; - const float CUBE_VELOCITY_CHARGE_PER_SECOND = 300; - return m_cubeThrowDownTime > 0 ? CUBE_VELOCITY_SPEED_MIN + (ImGui::GetTime() - m_cubeThrowDownTime) * CUBE_VELOCITY_CHARGE_PER_SECOND : 0.f; -} - -void SceneController::throwCube() -{ - const float CUBE_VELOCITY = 400; - const float CUBE_DENSITY = 20000.0f; - - CFirstPersonCamera* camera = &getRenderer().getCamera(); - PxVec3 eyePos = XMVECTORToPxVec4(SimpleScene::Inst()->GetEyePt()).getXYZ(); - PxVec3 lookAtPos = XMVECTORToPxVec4(SimpleScene::Inst()->GetLookAtPt()).getXYZ(); - PhysXController::Actor* cube = getPhysXController().spawnPhysXPrimitiveBox(PxTransform(eyePos), PxVec3(m_cubeScale, m_cubeScale, m_cubeScale), CUBE_DENSITY); - PxRigidDynamic* rigidDynamic = cube->getActor()->is<PxRigidDynamic>(); - cube->setColor(DirectX::XMFLOAT4(1, 0, 0, 1)); - - PxVec3 dir = (lookAtPos - eyePos).getNormalized(); - rigidDynamic->setLinearVelocity(dir * CUBE_VELOCITY); - -// Add By Lixu Begin - std::string validname = ""; - if (m_ReusedNames.size() > 0) - { - validname = m_ReusedNames.back(); - m_ReusedNames.pop_back(); - } - else - { - int projectilesSize = m_Projectiles.size(); - char cubename[10]; - sprintf(cubename, "Cube_%d", projectilesSize); - validname = cubename; - } - cube->setColor(DirectX::XMFLOAT4(1, 1, 1, 1)); - PhysXSceneActor* p = new PhysXSceneActor(getPhysXController(), cube, validname.c_str()); - m_UsedNames.push_back(validname); - m_Projectiles.push_back(p); - m_scene->addSceneActor(p); - -// BlastSceneTree::ins()->addProjectile(p); - SampleManager::ins()->m_bNeedRefreshTree = true; -// Add By Lixu End -} - -void SceneController::spawnAsset(int32_t num) -{ - m_scene->spawnAsset(num); -} - -int SceneController::releaseAll() -{ - return m_scene->releaseAll(); -} - -// Add By Lixu Begin -void SceneController::addProjectile() -{ - throwCube(); -} - -void SceneController::clearProjectile() -{ - std::vector<PhysXSceneActor*>::iterator it; - for (it = m_Projectiles.begin(); it != m_Projectiles.end(); it++) - { - std::vector<SceneActor*>& actors = m_scene->getActors(); - std::map<SceneActor*, int> ActorIndexMap; - int actorSize = actors.size(); - for (int i = 0; i < actorSize; i++) - { - ActorIndexMap[actors[i]] = i; - } - - m_scene->removeSceneActor(Scene::ActorIndex(ActorIndexMap[*it], -1)); - } - m_Projectiles.clear(); - m_UsedNames.clear(); - m_ReusedNames.clear(); - -// BlastSceneTree::ins()->clearProjectile(); - SampleManager::ins()->m_bNeedRefreshTree = true; -} - -std::string SceneController::getProjectileName(PhysXSceneActor* projectile) -{ - return projectile->getName(); -} - -bool SceneController::getProjectileVisible(PhysXSceneActor* projectile) -{ - return !(projectile->getActor()->isHidden()); -} - -void SceneController::setProjectileVisible(PhysXSceneActor* projectile, bool val) -{ - projectile->getActor()->setHidden(!val); -} - -void SceneController::ResetScene() -{ - clearProjectile(); -// BlastSceneTree::ins()->clearProjectile(); - m_scene->reloadAllActors(); - SampleManager::ins()->m_bNeedRefreshTree = true; -} - -void SceneController::ClearScene() -{ - clearProjectile(); -// BlastSceneTree::ins()->clearProjectile(); - m_scene->releaseAll(); - PhysXController& pc = getPhysXController(); - pc.ClearOldCOllisions(); - SampleManager::ins()->m_bNeedRefreshTree = true; -} -// Add By Lixu End
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.h deleted file mode 100644 index 669ca40..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.h +++ /dev/null @@ -1,129 +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. - - -#ifndef SCENE_CONTROLLER_H -#define SCENE_CONTROLLER_H - -#include "SampleManager.h" -#include <map> - - -class CFirstPersonCamera; -class BlastAssetBoxes; -class SceneActor; -class BlastAsset; -class SingleSceneAsset; -class Scene; -// Add By Lixu Begin -class PhysXSceneActor; -class BlastAssetModelSimple; -class ModelSceneAsset; -// Add By Lixu End -class SceneController : public ISampleController -{ -public: - - SceneController(); - virtual ~SceneController(); - - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual void Animate(double dt); - void drawUI(); - void drawStatsUI(); - - virtual void onInitialize(); - virtual void onSampleStart(); - virtual void onSampleStop(); - virtual void onTerminate(); - - // commands - int releaseAll(); - void spawnAsset(int32_t); - -// Add By Lixu Begin - void addProjectile(); - void clearProjectile(); - std::vector<PhysXSceneActor*> getPrejectiles() { return m_Projectiles; } - std::string getProjectileName(PhysXSceneActor* projectile); - bool getProjectileVisible(PhysXSceneActor* projectile); - void setProjectileVisible(PhysXSceneActor* projectile, bool val); - void ResetScene(); - void ClearScene(); - void addBlastAsset(BlastAssetModelSimple* pBlastAsset, AssetList::ModelAsset modelAsset); - void removeBlastAsset(BlastAssetModelSimple* pBlastAsset); - BlastFamily* addBlastFamily(BlastAsset* pBlastAsset, physx::PxTransform transform); - void removeBlastFamily(BlastAsset* pBlastAsset, int nFamilyIndex); -// Add By Lixu End - -private: - void addAssets(const AssetList& assetList, bool loadModels = true); - void throwCube(); - float getCubeSpeed(); - - SceneController& operator= (SceneController&); - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - PhysXController& getPhysXController() const - { - return getManager()->getPhysXController(); - } - - BlastController& getBlastController() const - { - return getManager()->getBlastController(); - } - - CommonUIController& getCommonUIController() const - { - return getManager()->getCommonUIController(); - } - - - //////// internal data //////// - - Scene* m_scene; - - float m_cubeScale; - float m_cubeThrowDownTime; - -// Add By Lixu Begin - std::vector<std::string> m_UsedNames; - std::vector<std::string> m_ReusedNames; - std::vector<PhysXSceneActor*> m_Projectiles; - - std::map<BlastAsset*, ModelSceneAsset*> BlastToSceneMap; -// Add By Lixu End -}; - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/CommonUIController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/CommonUIController.cpp deleted file mode 100644 index f9e218b..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/CommonUIController.cpp +++ /dev/null @@ -1,639 +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 "CommonUIController.h" - -#include "Renderer.h" -#include "BlastController.h" -#include "DamageToolController.h" -#include "SceneController.h" -#include "SampleController.h" -#include "PhysXController.h" -#include "SampleProfiler.h" - -#include "PxVisualizationParameter.h" -#include "PxScene.h" - -#include <imgui.h> -#include "imgui_impl_dx11.h" -#include "UIHelpers.h" - -#include <cstdio> -#include <inttypes.h> - - -inline float memorySizeOutput(const char*& prefix, float value) -{ - for (prefix = "\0\0k\0M\0G\0T\0P\0E"; value >= 1024 && *prefix != 'E'; value /= 1024, prefix += 2); - return value; -} - -CommonUIController::CommonUIController() -{ -} - -HRESULT CommonUIController::DeviceCreated(ID3D11Device* pDevice) -{ - DeviceManager* manager = GetDeviceManager(); - ID3D11DeviceContext* pd3dDeviceContext; - pDevice->GetImmediateContext(&pd3dDeviceContext); - ImGui_ImplDX11_Init(manager->GetHWND(), pDevice, pd3dDeviceContext); - - ImGuiStyle& style = ImGui::GetStyle(); - style.WindowRounding = 8.0f; - style.ScrollbarRounding = 8.0f; - style.FrameRounding = 8.0f; - //style.IndentSpacing = 20; - int mainColor[3] = { 110, 110, 110 }; // previous green one { 50, 110, 30 } - style.Colors[ImGuiCol_TitleBg] = ImColor(mainColor[0], mainColor[1], mainColor[2], 62); - style.Colors[ImGuiCol_TitleBgCollapsed] = ImColor(mainColor[0], mainColor[1], mainColor[2], 52); - style.Colors[ImGuiCol_TitleBgActive] = ImColor(mainColor[0], mainColor[1], mainColor[2], 87); - style.Colors[ImGuiCol_Header] = ImColor(mainColor[0], mainColor[1], mainColor[2], 52); - style.Colors[ImGuiCol_HeaderHovered] = ImColor(mainColor[0], mainColor[1], mainColor[2], 92); - style.Colors[ImGuiCol_HeaderActive] = ImColor(mainColor[0], mainColor[1], mainColor[2], 72); - style.Colors[ImGuiCol_ScrollbarBg] = ImColor(mainColor[0], mainColor[1], mainColor[2], 12); - style.Colors[ImGuiCol_ScrollbarGrab] = ImColor(mainColor[0], mainColor[1], mainColor[2], 52); - style.Colors[ImGuiCol_ScrollbarGrabHovered] = ImColor(mainColor[0], mainColor[1], mainColor[2], 92); - style.Colors[ImGuiCol_ScrollbarGrabActive] = ImColor(mainColor[0], mainColor[1], mainColor[2], 72); - style.Colors[ImGuiCol_Button] = ImColor(40, 100, 80, 30); - style.Colors[ImGuiCol_ButtonHovered] = ImColor(40, 100, 80, 100); - style.Colors[ImGuiCol_ButtonActive] = ImColor(40, 100, 80, 70); - style.Colors[ImGuiCol_PopupBg] = ImColor(10, 23, 18, 230); - style.Colors[ImGuiCol_TextSelectedBg] = ImColor(10, 23, 18, 180); - style.Colors[ImGuiCol_FrameBg] = ImColor(70, 70, 70, 30); - style.Colors[ImGuiCol_FrameBgHovered] = ImColor(70, 70, 70, 70); - style.Colors[ImGuiCol_FrameBgActive] = ImColor(70, 70, 70, 50); - style.Colors[ImGuiCol_ComboBg] = ImColor(20, 20, 20, 252); - - return S_OK; -} - -void CommonUIController::DeviceDestroyed() -{ - ImGui_ImplDX11_Shutdown(); -} - -extern LRESULT ImGui_ImplDX11_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); - -LRESULT CommonUIController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - PX_UNUSED(hWnd); - PX_UNUSED(wParam); - PX_UNUSED(lParam); - - ImGui_ImplDX11_WndProcHandler(hWnd, uMsg, wParam, lParam); - - if (uMsg == WM_KEYDOWN && !ImGui::GetIO().WantCaptureKeyboard) - { - int iKeyPressed = static_cast<int>(wParam); - switch (iKeyPressed) - { - case 'P': - { - getPhysXController().setPaused(!getPhysXController().isPaused()); - break; - } - case 'O': - { - getRenderer().setWireframeMode(!getRenderer().getWireframeMode()); - break; - } - case 'I': - { - getBlastController().debugRenderMode = (BlastFamily::DebugRenderMode)(((int)getBlastController().debugRenderMode + 1) % BlastFamily::DebugRenderMode::DEBUG_RENDER_MODES_COUNT); - break; - } - case VK_F5: - { - getRenderer().reloadShaders(); - break; - } - default: - break; - } - } - - if (ImGui::GetIO().WantCaptureMouse) - return 0; - - return 1; -} - -void CommonUIController::Animate(double fElapsedTimeSeconds) -{ - m_dt = (float)fElapsedTimeSeconds; -} - -void CommonUIController::Render(ID3D11Device*, ID3D11DeviceContext*, ID3D11RenderTargetView*, ID3D11DepthStencilView*) -{ - ImGui_ImplDX11_NewFrame(); - drawUI(); - ImGui::Render(); -} - -void CommonUIController::addDelayedCall(const char* title, const char* message, std::function<void()> func, float delay) -{ - DelayedCall call = { func, title, message, delay, delay }; - m_delayedCalls.emplace(call); -} - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// IMGUI UI -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -void CommonUIController::drawUI() -{ - const float padding = 8.0f; - ImGui::SetNextWindowPos(ImVec2(padding, padding), ImGuiSetCond_Once/*ImGuiSetCond_FirstUseEver*/); - ImGui::SetNextWindowSize(ImVec2(420, getRenderer().getScreenHeight() - 2 * padding), ImGuiSetCond_Once/*ImGuiSetCond_FirstUseEver*/); - ImGui::SetNextWindowCollapsed(false, ImGuiSetCond_Once); - ImGui::Begin("New Shiny UI", 0, ImGuiWindowFlags_NoTitleBar); - { - ImGui::PushItemWidth(ImGui::GetWindowSize().x * 0.5f); - - /////////////////////////////////////////////////////////////////////////////////////////// - // Scene - /////////////////////////////////////////////////////////////////////////////////////////// - if (ImGui::CollapsingHeader("Scene")) - { - getSceneController().drawUI(); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Blast - /////////////////////////////////////////////////////////////////////////////////////////// - if (ImGui::CollapsingHeader("Blast")) - { - getBlastController().drawUI(); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Damage Tool - /////////////////////////////////////////////////////////////////////////////////////////// - if (ImGui::CollapsingHeader("Damage Tool")) - { - getDamageToolController().drawUI(); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Stats - /////////////////////////////////////////////////////////////////////////////////////////// - if (ImGui::CollapsingHeader("Stats")) - { - BlastController& blastController = getBlastController(); - - const char* prefix; - float sizeVal; - - // FPS - double averageTime = GetDeviceManager()->GetAverageFrameTime(); - float fps = (averageTime > 0) ? 1.0 / averageTime : 0.0; - float frameMs = 1000.0f / fps; - ImGui::Text("Frame Time %.3f ms (%.1f FPS)", frameMs, fps); - - static PlotLinesInstance<> fpsPlot; - fpsPlot.plot("FPS", frameMs, "ms/frame", 0.0f, 100.0f); - - // Render stats - ImGui::PushStyleColor(ImGuiCol_Text, ImColor(0xFF, 0x3B, 0xD8, 0xFF)); - ImGui::Text("Draw Calls (Opaque/Transparent): %d/%d", getRenderer().getVisibleOpaqueRenderablesCount(), getRenderer().getVisibleTransparentRenderablesCount()); - ImGui::PopStyleColor(); - - // Blast stats - const BlastTimers& timers = blastController.getLastBlastTimers(); - - ImGui::Text("Simulation Time: %.2f ms ", getPhysXController().getLastSimulationTime() * 1000); - ImGui::Text("Actor Count: %d", blastController.getActorCount()); - ImGui::Text("Visible Chunk Count: %d", blastController.getTotalVisibleChunkCount()); - - getManager()->getSceneController().drawStatsUI(); - - sizeVal = memorySizeOutput(prefix, (float)blastController.getFamilySize()); - ImGui::Text("Family Size: %.3g %sB", sizeVal, prefix); - sizeVal = memorySizeOutput(prefix, (float)blastController.getBlastAssetsSize()); - ImGui::Text("Blast asset Data size: %.3g %sB", sizeVal, prefix); - - //ImGui::Text(" Last Blast Extern Time: %8.3f ms", timers.mLastExternalTime * 1000); -// ImGui::Text(" Last Damage Time: %8.3f ms", timers.blastDamage * 1000); -#if NV_PROFILE - ImGui::Text("Last Material Time: %8.3f ms", timers.blastDamageMaterial * 1000); - ImGui::Text("Last Fracture Time: %8.3f ms", timers.blastDamageFracture * 1000); -#endif -// ImGui::Text("Last Physics Split Time: %.3f ms", timers.physicsSplit * 1000); -#if NV_PROFILE - ImGui::Text("Last Island Time: %8.3f ms", timers.blastSplitIsland * 1000); - ImGui::Text("Last Partition Time: %8.3f ms", timers.blastSplitPartition * 1000); - ImGui::Text("Last Visibility Time: %8.3f ms", timers.blastSplitVisibility * 1000); -#endif - -#if NV_PROFILE - // Sample Profiler - static bool s_showProfilerWindow = false; - if (ImGui::Button("Code Profiler")) - { - s_showProfilerWindow = !s_showProfilerWindow; - } - if (s_showProfilerWindow) - { - drawCodeProfiler(&s_showProfilerWindow); - } -#endif - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Application - /////////////////////////////////////////////////////////////////////////////////////////// - if (ImGui::CollapsingHeader("Application")) - { - // Paused - bool isPaused = getPhysXController().isPaused(); - if (ImGui::Checkbox("Pause (P)", &isPaused)) - { - getPhysXController().setPaused(isPaused); - } - - // Reload Shaders - if (ImGui::Button("Reload Shaders (F5)")) - { - getRenderer().reloadShaders(); - } - - // ImGui Test Window (just in case) - static bool s_showTestWindow = false; - if (ImGui::Button("ImGui Test Window")) - { - s_showTestWindow = !s_showTestWindow; - } - if (s_showTestWindow) - { - ImGui::ShowTestWindow(); - } - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Debug Render - /////////////////////////////////////////////////////////////////////////////////////////// - if (ImGui::CollapsingHeader("Debug Render")) - { - // WireFrame - bool wireFrameEnabled = getRenderer().getWireframeMode(); - if (ImGui::Checkbox("WireFrame (O)", &wireFrameEnabled)) - { - getRenderer().setWireframeMode(wireFrameEnabled); - } - - // - - - - - - - - - ImGui::Spacing(); - - // Blast Debug Render Mode - const char* debugRenderItems[] = - { - "Disabled", // DEBUG_RENDER_DISABLED - "Health Graph", // DEBUG_RENDER_HEALTH_GRAPH - "Centroids", // DEBUG_RENDER_CENTROIDS - "Health Graph + Centroids", // DEBUG_RENDER_HEALTH_GRAPH_CENTROIDS - "Joints", // DEBUG_RENDER_JOINTS - "Stress Graph", // DEBUG_RENDER_STRESS_GRAPH - "Stress Graph + Nodes Impulses", // DEBUG_RENDER_STRESS_GRAPH_NODES_IMPULSES - "Stress Graph + Bonds Impulses" // DEBUG_RENDER_STRESS_GRAPH_BONDS_IMPULSES - }; - ImGui::Combo("Blast Debug Render Mode (I)", (int*)&getBlastController().debugRenderMode, debugRenderItems, IM_ARRAYSIZE(debugRenderItems), -1); - - // Blast Debug Render Scale - ImGui::DragFloat("Blast Debug Render Scale", &getBlastController().debugRenderScale, 0.01f, 0.0f, 10.0f, "%.3f", 4.0f); - - // - - - - - - - - - ImGui::Spacing(); - - // PhysX Debug Render - if (ImGui::TreeNode("PhysX Debug Render")) - { - auto addParam = [&](physx::PxVisualizationParameter::Enum param, const char* uiName) - { - bool enabled = getPhysXController().getPhysXScene().getVisualizationParameter(param) != 0; - if (ImGui::Checkbox(uiName, &enabled)) - { - getPhysXController().getPhysXScene().setVisualizationParameter(param, enabled ? 1.0f : 0.0f); - } - }; - - addParam(PxVisualizationParameter::eSCALE, "Scale"); - addParam(PxVisualizationParameter::eBODY_AXES, "Body Axes"); - addParam(PxVisualizationParameter::eWORLD_AXES, "World Axes"); - addParam(PxVisualizationParameter::eBODY_MASS_AXES, "Body Mass Axes"); - addParam(PxVisualizationParameter::eBODY_LIN_VELOCITY, "Body Lin Velocity"); - addParam(PxVisualizationParameter::eBODY_ANG_VELOCITY, "Body Ang Velocity"); - addParam(PxVisualizationParameter::eBODY_JOINT_GROUPS, "Body Joint"); - addParam(PxVisualizationParameter::eCONTACT_POINT, "Contact Point"); - addParam(PxVisualizationParameter::eCONTACT_NORMAL, "Contact Normal"); - addParam(PxVisualizationParameter::eCONTACT_ERROR, "Contact Error"); - addParam(PxVisualizationParameter::eCONTACT_FORCE, "Contact Force"); - addParam(PxVisualizationParameter::eACTOR_AXES, "Actor Axes"); - addParam(PxVisualizationParameter::eCOLLISION_AABBS, "Collision AABBs"); - addParam(PxVisualizationParameter::eCOLLISION_SHAPES, "Collision Shapes"); - addParam(PxVisualizationParameter::eCOLLISION_AXES, "Collision Axes"); - addParam(PxVisualizationParameter::eCOLLISION_COMPOUNDS, "Collision Compounds"); - addParam(PxVisualizationParameter::eCOLLISION_FNORMALS, "Collision FNormals"); - addParam(PxVisualizationParameter::eCOLLISION_EDGES, "Collision Edges"); - addParam(PxVisualizationParameter::eCOLLISION_STATIC, "Collision Static"); - addParam(PxVisualizationParameter::eCOLLISION_DYNAMIC, "Collision Dynamic"); - //addParam(PxVisualizationParameter::eDEPRECATED_COLLISION_PAIRS, "Collision Pairs"); - addParam(PxVisualizationParameter::eJOINT_LOCAL_FRAMES, "Joint Local Frames"); - addParam(PxVisualizationParameter::eJOINT_LIMITS, "Joint Limits"); - //addParam(PxVisualizationParameter::ePARTICLE_SYSTEM_POSITION, "PS Position"); - //addParam(PxVisualizationParameter::ePARTICLE_SYSTEM_VELOCITY, "PS Velocity"); - //addParam(PxVisualizationParameter::ePARTICLE_SYSTEM_COLLISION_NORMAL, "PS Collision Normal"); - //addParam(PxVisualizationParameter::ePARTICLE_SYSTEM_BOUNDS, "PS Bounds"); - //addParam(PxVisualizationParameter::ePARTICLE_SYSTEM_GRID, "PS Grid"); - //addParam(PxVisualizationParameter::ePARTICLE_SYSTEM_BROADPHASE_BOUNDS, "PS Broadphase Bounds"); - //addParam(PxVisualizationParameter::ePARTICLE_SYSTEM_MAX_MOTION_DISTANCE, "PS Max Motion Distance"); - addParam(PxVisualizationParameter::eCULL_BOX, "Cull Box"); - //addParam(PxVisualizationParameter::eCLOTH_VERTICAL, "Cloth Vertical"); - //addParam(PxVisualizationParameter::eCLOTH_HORIZONTAL, "Cloth Horizontal"); - //addParam(PxVisualizationParameter::eCLOTH_BENDING, "Cloth Bending"); - //addParam(PxVisualizationParameter::eCLOTH_SHEARING, "Cloth Shearing"); - //addParam(PxVisualizationParameter::eCLOTH_VIRTUAL_PARTICLES, "Cloth Virtual Particles"); - addParam(PxVisualizationParameter::eMBP_REGIONS, "MBP Regions"); - - ImGui::TreePop(); - } - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // PhysX - /////////////////////////////////////////////////////////////////////////////////////////// - if (ImGui::CollapsingHeader("PhysX")) - { - // PhysX - getPhysXController().drawUI(); - - // GPU - getSampleController().drawPhysXGpuUI(); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Renderer - /////////////////////////////////////////////////////////////////////////////////////////// - if (ImGui::CollapsingHeader("Renderer")) - { - getRenderer().drawUI(); - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // Hints - /////////////////////////////////////////////////////////////////////////////////////////// - if (ImGui::CollapsingHeader("Hints / Help")) - { - ImGui::BulletText("Rotate camera - RMB"); - ImGui::BulletText("Move camera - WASDQE(SHIFT)"); - ImGui::BulletText("Play/Pause - P"); - ImGui::BulletText("Reload shaders - F5"); - ImGui::BulletText("Wireframe - O"); - ImGui::BulletText("Blast Debug Render - I"); - ImGui::BulletText("Apply damage - LMB"); - ImGui::BulletText("Damage radius - +/-/wheel"); - ImGui::BulletText("Damage profile - 1-9"); - ImGui::BulletText("Explosive - X"); - ImGui::BulletText("Throw cube - F"); - ImGui::BulletText("Restart - R"); - } - - ImGui::PopItemWidth(); - } - ImGui::End(); - - /////////////////////////////////////////////////////////////////////////////////////////// - // Mode Text - /////////////////////////////////////////////////////////////////////////////////////////// - { - ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4()); - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0,0)); - - const char* text = getDamageToolController().isDamageMode() ? "DAMAGE MODE (PRESS SPACE)" : "DRAG MODE (PRESS SPACE)"; - ImVec2 size = ImGui::CalcTextSize(text); - ImGui::SetNextWindowPos(ImVec2((getRenderer().getScreenWidth() - size.x) / 2, 0)); - ImGui::Begin("Mode Text", 0, ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar); - ImGui::Text(text); - ImGui::End(); - - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // FPS - /////////////////////////////////////////////////////////////////////////////////////////// - { - ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4()); - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); - - double averageTime = GetDeviceManager()->GetAverageFrameTime(); - float fps = (averageTime > 0) ? 1.0 / averageTime : 0.0; - static char buf[32]; - std::sprintf(buf, "%.1f FPS", fps); - ImVec2 size = ImGui::CalcTextSize(buf); - - size.x += 20.0; - ImGui::SetNextWindowSize(size); - ImGui::SetNextWindowPos(ImVec2(getRenderer().getScreenWidth() - size.x, 0)); - ImGui::Begin("FPS", 0, ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar); - ImGui::Text(buf); - ImGui::End(); - - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Loading overlay - /////////////////////////////////////////////////////////////////////////////////////////// - if (!m_delayedCalls.empty()) - { - DelayedCall& call = m_delayedCalls.front(); - if (call.delay > 0) - { - const int height = 50; - const char* message = call.message; - const float alpha = PxClamp(lerp(0.0f, 1.0f, (call.delayTotal - call.delay) * 10.0f), 0.0f, 1.0f); - - ImGui::PushStyleColor(ImGuiCol_WindowBg, ImColor(0, 0, 0, 200)); - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, alpha); - ImGui::SetNextWindowPosCenter(); - ImVec2 size = ImGui::CalcTextSize(message); - int width = std::max<float>(200, size.x) + 50; - ImGui::SetNextWindowSize(ImVec2(width, height)); - ImGui::Begin(call.title, 0, ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar); - ImGui::SetCursorPos(ImVec2((width - size.x) * 0.5f, (height - size.y) * 0.5f)); - ImGui::Text(message); - ImGui::End(); - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - - call.delay -= PxClamp(m_dt, 0.0f, 0.1f); - } - else - { - call.func(); - m_delayedCalls.pop(); - } - } -} - - -void CommonUIController::drawCodeProfiler(bool* open) -{ - ImGuiWindowFlags window_flags = 0; - const float padding = 8.0f; - const float width = 550; - const float height = 580; - ImGui::SetNextWindowPos(ImVec2(getRenderer().getScreenWidth() - width - padding, padding), ImGuiSetCond_Once/*ImGuiSetCond_FirstUseEver*/); - ImGui::SetNextWindowSize(ImVec2(width, height), ImGuiSetCond_Once); - if (!ImGui::Begin("Code Profiler", open, window_flags)) - { - // Early out if the window is collapsed, as an optimization. - ImGui::End(); - return; - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Control/Main Bar - /////////////////////////////////////////////////////////////////////////////////////////// - { - if (ImGui::Button("Reset")) - { - PROFILER_INIT(); - } - ImGui::SameLine(); - if (ImGui::Button("Dump To File (profile.txt)")) - { - SampleProfilerDumpToFile("profile.txt"); - } - ImGui::SameLine(); - ImGui::Text("Profiler overhead: %2.3f ms", SampleProfilerGetOverhead().count() * 0.001f); - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Legend - /////////////////////////////////////////////////////////////////////////////////////////// - { - ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); - ImGui::Text("Legend: name | calls | time | max time"); - ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Stats Tree - /////////////////////////////////////////////////////////////////////////////////////////// - ImGui::SetNextTreeNodeOpen(true, ImGuiSetCond_Once); - float plotMS = 0.0f; - float plotMaxMS = 0.0f; - const char* plotName = nullptr; - if (ImGui::TreeNode("Root")) - { - auto treeIt = SampleProfilerCreateTreeIterator(); - if (treeIt) - { - uint32_t depth = 1; - uint32_t openeDepth = 1; - while (!treeIt->isDone()) - { - const auto data = treeIt->data(); - - while (data->depth < depth) - { - ImGui::TreePop(); - depth--; - } - - const uint32_t maxLen = 30; - auto hash = data->hash; - static uint64_t selectedNodeHash = 0; - if (selectedNodeHash == hash) - { - plotMS = data->time.count() * 0.001f; - plotMaxMS = data->maxTime.count() * 0.001f; - plotName = data->name; - } - if (ImGui::TreeNodeEx(data->name, data->hasChilds ? 0 : ImGuiTreeNodeFlags_Leaf, "%-*.*s | %d | %2.3f ms | %2.3f ms", - maxLen, maxLen, data->name, data->calls, data->time.count() * 0.001f, data->maxTime.count() * 0.001f)) - { - depth++; - treeIt->next(); - } - else - { - treeIt->next(); - while (!treeIt->isDone() && treeIt->data()->depth > depth) - treeIt->next(); - } - - if (ImGui::IsItemClicked()) - { - selectedNodeHash = hash; - } - } - - while (depth > 0) - { - ImGui::TreePop(); - depth--; - } - - treeIt->release(); - } - else - { - ImGui::Text("Profiler Is Broken. Begin/End Mismatch."); - } - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // Selected Item Plot - /////////////////////////////////////////////////////////////////////////////////////////// - { - ImGui::Spacing(); ImGui::Separator(); ImGui::Spacing(); - if (plotName) - { - static PlotLinesInstance<> selectedNodePlot; - selectedNodePlot.plot("", plotMS, plotName, 0.0f, plotMaxMS); - } - else - { - ImGui::Text("Select item to plot."); - } - } - - ImGui::End(); -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/CommonUIController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/CommonUIController.h deleted file mode 100644 index 4656203..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/CommonUIController.h +++ /dev/null @@ -1,124 +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. - - -#ifndef COMMON_UI_CONTROLLER_H -#define COMMON_UI_CONTROLLER_H - -#include "SampleManager.h" -#include <DirectXMath.h> -#include <string> -#include <list> -#include <queue> -#include <functional> - - -class Renderer; -class PhysXController; -class BlastController; - - -class CommonUIController : public ISampleController -{ - public: - CommonUIController(); - virtual ~CommonUIController() {}; - - virtual HRESULT DeviceCreated(ID3D11Device* pDevice); - virtual void DeviceDestroyed(); - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual void Animate(double fElapsedTimeSeconds); - virtual void Render(ID3D11Device*, ID3D11DeviceContext*, ID3D11RenderTargetView*, ID3D11DepthStencilView*); - - void addDelayedCall(std::function<void()> func, const char* message) - { - addDelayedCall("PLEASE WAIT...", message, func); - } - - void addPopupMessage(const char* title, const char* message, float duration = 2.f) - { - addDelayedCall(title, message, [] {}, duration); - } - - private: - void addDelayedCall(const char* title, const char* message, std::function<void()> func, float delay = 0.1f); - - void drawUI(); - void drawCodeProfiler(bool*); - - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - PhysXController& getPhysXController() const - { - return getManager()->getPhysXController(); - } - - BlastController&getBlastController() const - { - return getManager()->getBlastController(); - } - - DamageToolController& getDamageToolController() const - { - return getManager()->getDamageToolController(); - } - - SceneController& getSceneController() const - { - return getManager()->getSceneController(); - } - - SampleController& getSampleController() const - { - return getManager()->getSampleController(); - } - - - //////// internal data //////// - - struct DelayedCall - { - std::function<void()> func; - const char* title; - const char* message; - float delay; - float delayTotal; - }; - - std::queue<DelayedCall> m_delayedCalls; - - float m_dt; - -}; - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/DamageToolController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/DamageToolController.cpp deleted file mode 100644 index ecc3cb9..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/DamageToolController.cpp +++ /dev/null @@ -1,488 +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 "DamageToolController.h" -#include "RenderUtils.h" -#include "BlastController.h" -#include "Renderer.h" -#include "PhysXController.h" -#include "SampleProfiler.h" - -#include <imgui.h> - -#include "NvBlastTkActor.h" -#include "NvBlastTkFamily.h" -#include "NvBlastExtDamageShaders.h" -#include "NvBlastExtPxActor.h" - -#include "PxRigidDynamic.h" -#include "PxScene.h" -#include "SimpleScene.h" -#include "BlastSceneTree.h" -#include "DefaultDamagePanel.h" -#include "ViewerOutput.h" - - -using namespace Nv::Blast; -using namespace physx; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Setup -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const DirectX::XMFLOAT4 PICK_POINTER_ACTIVE_COLOR(1.0f, 0.f, 0.f, 0.6f); -static const PxVec3 WEAPON_POSITION_IN_VIEW(0, -7, 23); -static const float SEGMENT_DAMAGE_MAX_DISTANCE = 100.0f; - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -DamageToolController* gDamageToolController = nullptr; -DamageToolController* DamageToolController::ins() -{ - return gDamageToolController; -} -void DamageToolController::setDamageAmount(float value) -{ - m_damage = value; -} -void DamageToolController::setExplosiveImpulse(float value) -{ - m_explosiveImpulse = value; -} -void DamageToolController::setStressForceFactor(float value) -{ - m_stressForceFactor = value; -} -void DamageToolController::setDamagerIndex(int index) -{ - m_damagerIndex = index; -} -void DamageToolController::setRadius(float value) -{ - m_damagers[m_damagerIndex].radius = value; -} -void DamageToolController::setDamageWhilePressed(bool value) -{ - m_damagers[m_damagerIndex].damageWhilePressed = value; -} - -DamageToolController::DamageToolController() - : m_damage(100.0f), m_toolColor(1.0f, 1.0f, 1.0f, 0.4f), - m_toolRenderMaterial(nullptr), m_sphereToolRenderable(nullptr), m_lineToolRenderable(nullptr), - m_explosiveImpulse(100), m_damagerIndex(0), m_stressForceFactor(1.0f), m_isMousePressed(false), m_damageCountWhilePressed(0) -{ - // damage amount calc using NvBlastExtMaterial - auto getDamageAmountFn = [](const float damage, ExtPxActor* actor) - { - const void* material = actor->getTkActor().getFamily().getMaterial(); - return material ? reinterpret_cast<const NvBlastExtMaterial*>(material)->getNormalizedDamage(damage) : 0.f; - }; - - // Damage functions - auto radialDamageExecute = [&](const Damager* damager, ExtPxActor* actor, PxVec3 origin, PxVec3 position, PxVec3 normal) - { - const float damage = getDamageAmountFn(m_damage, actor); - if (damage > 0.f) - { - NvBlastExtRadialDamageDesc desc = - { - damage, - { position.x, position.y, position.z }, - damager->radius, - damager->radius * 1.6f - }; - - actor->getTkActor().damage(damager->program, &desc, sizeof(desc)); - } - }; - auto lineSegmentDamageExecute = [&](const Damager* damager, ExtPxActor* actor, PxVec3 origin, PxVec3 position, PxVec3 normal) - { - const float damage = getDamageAmountFn(m_damage, actor); - if (damage > 0.f) - { - PxVec3 dir = (position - origin).getNormalized(); - PxVec3 farEnd = origin + dir * 10000.0f; - - NvBlastExtSegmentRadialDamageDesc desc = - { - damage, - { origin.x, origin.y, origin.z }, - { farEnd.x, farEnd.y, farEnd.z }, - damager->radius, - damager->radius * 1.6f - }; - - actor->getTkActor().damage(damager->program, &desc, sizeof(desc)); - } - }; - auto shearDamageExecute = [&](const Damager* damager, ExtPxActor* actor, PxVec3 origin, PxVec3 position, PxVec3 normal) - { - const float damage = getDamageAmountFn(m_damage, actor); - if (damage > 0.f) - { - PxVec3 impactNormal = -normal; - - NvBlastExtShearDamageDesc desc = - { - damage, - { impactNormal.x, impactNormal.y, impactNormal.z }, - { position.x, position.y, position.z }, - damager->radius, - damager->radius * 1.6f - }; - - actor->getTkActor().damage(damager->program, &desc, sizeof(desc)); - } - }; - auto stressDamageExecute = [&](const Damager* damager, ExtPxActor* actor, PxVec3 origin, PxVec3 position, PxVec3 normal) - { - PxVec3 force = -m_stressForceFactor * normal * actor->getPhysXActor().getMass(); - - getBlastController().stressDamage(actor, position, force); - }; - - // Damage Tools: - { - Damager dam; - dam.uiName = "Radial Damage (Falloff)"; - dam.program = NvBlastDamageProgram { NvBlastExtFalloffGraphShader, NvBlastExtFalloffSubgraphShader }; - dam.pointerType = Damager::PointerType::Sphere; - dam.pointerColor = DirectX::XMFLOAT4(1.0f, 1.0f, 1.0f, 0.4f); - dam.executeFunction = radialDamageExecute; - m_damagers.push_back(dam); - } - { - Damager dam; - dam.uiName = "Radial Damage (Cutter)"; - dam.program = NvBlastDamageProgram { NvBlastExtCutterGraphShader, NvBlastExtCutterSubgraphShader }; - dam.pointerType = Damager::PointerType::Sphere; - dam.pointerColor = DirectX::XMFLOAT4(0.5f, 0.5f, 1.0f, 0.4f); - dam.executeFunction = radialDamageExecute; - m_damagers.push_back(dam); - } - - { - Damager dam; - dam.uiName = "Segment Damage (Falloff)"; - dam.program = NvBlastDamageProgram{ NvBlastExtSegmentFalloffGraphShader, NvBlastExtSegmentFalloffSubgraphShader }; - dam.pointerType = Damager::PointerType::Line; - dam.pointerColor = DirectX::XMFLOAT4(0.1f, 1.0f, 0.1f, 0.4f); - dam.executeFunction = lineSegmentDamageExecute; - dam.damageWhilePressed = true; - dam.radius = .2f; - dam.radiusLimit = 20.0f; - m_damagers.push_back(dam); - } - - { - Damager dam; - dam.uiName = "Shear Damage"; - dam.program = NvBlastDamageProgram { NvBlastExtShearGraphShader, NvBlastExtShearSubgraphShader }; - dam.pointerType = Damager::PointerType::Sphere; - dam.pointerColor = DirectX::XMFLOAT4(0.5f, 1.0f, 0.5f, 0.4f); - dam.executeFunction = shearDamageExecute; - m_damagers.push_back(dam); - } - - { - Damager dam; - dam.uiName = "Stress Damage"; - dam.program = { nullptr, nullptr }; - dam.pointerType = Damager::PointerType::Sphere; - dam.pointerColor = DirectX::XMFLOAT4(0.5f, 0.5f, 1.0f, 0.4f); - dam.executeFunction = stressDamageExecute; - m_damagers.push_back(dam); - } - - // UI - DefaultDamagePanel* pDefaultDamagePanel = DefaultDamagePanel::ins(); - pDefaultDamagePanel->setUpdateData(false); - QComboBox* comboBoxDamageProfile = pDefaultDamagePanel->getDamageProfile(); - comboBoxDamageProfile->clear(); - - // project - BPPDefaultDamage& damage = BlastProject::ins().getParams().defaultDamage; - damage.damageAmount = m_damage; - damage.explosiveImpulse = m_explosiveImpulse; - damage.stressDamageForce = m_stressForceFactor; - int count = m_damagers.size(); - if (damage.damageStructs.buf != nullptr && damage.damageStructs.arraySizes[0] != count) - { - delete[] damage.damageStructs.buf; - damage.damageStructs.buf = nullptr; - damage.damageStructs.arraySizes[0] = 0; - } - if (damage.damageStructs.buf == nullptr) - { - damage.damageStructs.buf = new BPPDamageStruct[count]; - damage.damageStructs.arraySizes[0] = count; - } - damage.damageProfile = 0; - int damageIndex = 0; - - for (const Damager& d : m_damagers) - { - m_damagerNames.push_back(d.uiName); - - // UI - comboBoxDamageProfile->addItem(d.uiName); - - // project - BPPDamageStruct& damageStruct = damage.damageStructs.buf[damageIndex++]; - damageStruct.damageRadius = d.radius; - damageStruct.continuously = d.damageWhilePressed; - } - - pDefaultDamagePanel->updateValues(); - - gDamageToolController = this; -} - -DamageToolController::~DamageToolController() -{ -} - -void DamageToolController::onSampleStart() -{ - // damage tool pointer - m_toolRenderMaterial = new RenderMaterial("", getRenderer().getResourceManager(), "physx_primitive_transparent", "", RenderMaterial::BLEND_ALPHA_BLENDING); - { - IRenderMesh* mesh = getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Sphere); - m_sphereToolRenderable = getRenderer().createRenderable(*mesh, *m_toolRenderMaterial); - } - { - IRenderMesh* mesh = getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Box); - m_lineToolRenderable = getRenderer().createRenderable(*mesh, *m_toolRenderMaterial); - } - - // default tool - m_damagerIndex = 0; - - // start with damage mode by default - setDamageMode(false); -} - -void DamageToolController::onInitialize() -{ -} - - -void DamageToolController::onSampleStop() -{ - getRenderer().removeRenderable(m_sphereToolRenderable); - getRenderer().removeRenderable(m_lineToolRenderable); - SAFE_DELETE(m_toolRenderMaterial); -} - - -void DamageToolController::Animate(double dt) -{ - PROFILER_SCOPED_FUNCTION(); - - m_toolColor = XMFLOAT4Lerp(m_toolColor, m_damagers[m_damagerIndex].pointerColor, dt * 5.0f); - - m_sphereToolRenderable->setHidden(true); - m_lineToolRenderable->setHidden(true); - - // damage mode - if (m_damageMode) - { - // ray cast according to camera + mouse ray - PxVec3 eyePos, pickDir; - getPhysXController().getEyePoseAndPickDir(m_lastMousePos.x, m_lastMousePos.y, eyePos, pickDir); - pickDir = pickDir.getNormalized(); - - PxRaycastHit hit; hit.shape = NULL; - PxRaycastBuffer hit1; - getPhysXController().getPhysXScene().raycast(eyePos, pickDir, PX_MAX_F32, hit1, PxHitFlag::ePOSITION | PxHitFlag::eNORMAL); - hit = hit1.block; - - if (hit.shape) - { - PxMat44 cameraViewInv = XMMATRIXToPxMat44(getRenderer().getCamera().GetViewMatrix()).inverseRT(); - PxVec3 weaponOrigin = eyePos + cameraViewInv.rotate(WEAPON_POSITION_IN_VIEW); - - // damage function - const Damager& damager = m_damagers[m_damagerIndex]; - auto damageFunction = [&](ExtPxActor* actor) - { - auto t0 = actor->getPhysXActor().getGlobalPose(); - PxTransform t(t0.getInverse()); - PxVec3 localNormal = t.rotate(hit.normal); - PxVec3 localPosition = t.transform(hit.position); - PxVec3 localOrigin = t.transform(weaponOrigin); - damager.executeFunction(&damager, actor, localOrigin, localPosition, localNormal); - }; - - // should damage? - bool shouldDamage = false; - if (m_isMousePressed) - { - shouldDamage = damager.damageWhilePressed || m_damageCountWhilePressed == 0; - m_damageCountWhilePressed++; - } - else - { - m_damageCountWhilePressed = 0; - } - - // Update tool pointer and do damage with specific overlap - if (damager.pointerType == Damager::Sphere) - { - m_sphereToolRenderable->setHidden(false); - m_sphereToolRenderable->setColor(m_toolColor); - m_sphereToolRenderable->setScale(PxVec3(damager.radius)); - m_sphereToolRenderable->setTransform(PxTransform(hit.position)); - - if (shouldDamage) - { - if (getBlastController().overlap(PxSphereGeometry(damager.radius), PxTransform(hit.position), damageFunction)) - { - m_toolColor = PICK_POINTER_ACTIVE_COLOR; - } - getPhysXController().explodeDelayed(hit.position, damager.radius, m_explosiveImpulse); - } - } - else if (damager.pointerType == Damager::Line) - { - m_lineToolRenderable->setHidden(false); - m_lineToolRenderable->setColor(m_toolColor); - - PxVec3 scale(damager.radius, damager.radius, SEGMENT_DAMAGE_MAX_DISTANCE); - PxVec3 direction = (hit.position - weaponOrigin).getNormalized(); - PxVec3 position = weaponOrigin + direction * SEGMENT_DAMAGE_MAX_DISTANCE; - - m_lineToolRenderable->setScale(scale); - PxTransform t(position, quatLookAt(direction)); - m_lineToolRenderable->setTransform(t); - - if (shouldDamage) - { - if (this->getBlastController().overlap(PxBoxGeometry(scale), t, damageFunction)) - { - m_toolColor = PICK_POINTER_ACTIVE_COLOR; - } - } - } - else - { - PX_ASSERT(false); - } - } - } -} - - -LRESULT DamageToolController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - PROFILER_SCOPED_FUNCTION(); - - if (uMsg == WM_LBUTTONDOWN || uMsg == WM_MOUSEMOVE || uMsg == WM_LBUTTONUP) - { - m_lastMousePos.x = (float)LOWORD(lParam); - m_lastMousePos.y = (float)HIWORD(lParam); - } - - if (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP) - { - m_isMousePressed = (uMsg == WM_LBUTTONDOWN); - if (m_isMousePressed && !m_damageMode) - { - viewer_warn("damage mode is disable, please enable it first !"); - } - } - - if (uMsg == WM_MOUSEWHEEL) - { - /* - int delta = int((short)HIWORD(wParam)) / WHEEL_DELTA; - changeDamageRadius(delta * 0.3f); - */ - } - - if (uMsg == WM_KEYDOWN) - { - int iKeyPressed = static_cast<int>(wParam); - if (iKeyPressed == VK_OEM_PLUS) - { - changeDamageRadius(0.2f); - } - else if (iKeyPressed == VK_OEM_MINUS) - { - changeDamageRadius(-0.2f); - } - else if (iKeyPressed >= '1' && iKeyPressed <= '9') - { - m_damagerIndex = PxClamp<uint32_t>(iKeyPressed - '1', 0, (uint32_t)m_damagers.size() - 1); - } - else if (iKeyPressed == VK_SPACE) - { - //setDamageMode(!isDamageMode()); - } - } - - return 1; -} - -void DamageToolController::drawUI() -{ - ImGui::DragFloat("Damage Amount", &m_damage, 1.0f); - ImGui::DragFloat("Explosive Impulse", &m_explosiveImpulse); - ImGui::DragFloat("Stress Damage Force", &m_stressForceFactor); - - // - - - - - - - - - ImGui::Spacing(); - - // Armory - ImGui::Combo("Damage Profile", (int*)&m_damagerIndex, m_damagerNames.data(), (int)m_damagerNames.size(), -1); - Damager& damager = m_damagers[m_damagerIndex]; - ImGui::DragFloat("Damage Radius (Mouse WH)", &damager.radius); - ImGui::Checkbox("Damage Continuously", &damager.damageWhilePressed); -} - -void DamageToolController::setDamageMode(bool enabled) -{ - m_damageMode = enabled; - - //getPhysXController().setDraggingEnabled(!m_damageMode); - - if (!m_damageMode) - { - m_sphereToolRenderable->setHidden(true); - m_lineToolRenderable->setHidden(true); - } -} - -void DamageToolController::changeDamageRadius(float dr) -{ - Damager& damager = m_damagers[m_damagerIndex]; - damager.radius += dr; - damager.radius = PxClamp<float>(damager.radius, 0.05f, damager.radiusLimit); -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/DamageToolController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/DamageToolController.h deleted file mode 100644 index 0aeb0d7..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/DamageToolController.h +++ /dev/null @@ -1,165 +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. - - -#ifndef DAMAGE_TOOL_CONTROLLER_H -#define DAMAGE_TOOL_CONTROLLER_H - -#include "SampleManager.h" -#include "NvBlastTypes.h" -#include <DirectXMath.h> -#include <functional> -#include "PxVec2.h" -#include "PxVec3.h" - - -class Renderable; -class RenderMaterial; - -namespace Nv -{ -namespace Blast -{ -class ExtPxActor; -} -} - - - -class DamageToolController : public ISampleController -{ -public: - DamageToolController(); - virtual ~DamageToolController(); - - static DamageToolController* ins(); - void setDamageAmount(float value); - void setExplosiveImpulse(float value); - void setStressForceFactor(float value); - void setDamagerIndex(int index); - void setRadius(float value); - void setDamageWhilePressed(bool value); - - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual void Animate(double dt); - void drawUI(); - - - virtual void onInitialize(); - virtual void onSampleStart(); - virtual void onSampleStop(); - - bool isDamageMode() const - { - return m_damageMode; - } - -// Add By Lixu Begin - Renderable* getPickPointer() - { - return m_sphereToolRenderable; - } - - void setDamageMode(bool enabled); -// Add By Lixu End - -private: - DamageToolController& operator= (DamageToolController&); - - - //////// private methods //////// - - void changeDamageRadius(float dr); - - - - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - PhysXController& getPhysXController() const - { - return getManager()->getPhysXController(); - } - - BlastController& getBlastController() const - { - return getManager()->getBlastController(); - } - - - //////// internal data //////// - - RenderMaterial* m_toolRenderMaterial; - Renderable* m_sphereToolRenderable; - DirectX::XMFLOAT4 m_toolColor; - Renderable* m_lineToolRenderable; - - float m_damage; - float m_explosiveImpulse; - float m_stressForceFactor; - - struct Damager - { - Damager() : damageWhilePressed(false), radius(5.0f), radiusLimit(1000.0f) - { - } - - enum PointerType - { - Sphere, - Line - }; - - typedef std::function<void(const Damager* damager, Nv::Blast::ExtPxActor* actor, physx::PxVec3 origin, physx::PxVec3 position, physx::PxVec3 normal)> ExecuteFn; - - const char* uiName; - NvBlastDamageProgram program; - PointerType pointerType; - DirectX::XMFLOAT4 pointerColor; - float radius; - float radiusLimit; - bool damageWhilePressed; - ExecuteFn executeFunction; - }; - - std::vector<Damager> m_damagers; - std::vector<const char*> m_damagerNames; - uint32_t m_damagerIndex; - - bool m_damageMode; - - physx::PxVec2 m_lastMousePos; - bool m_isMousePressed; - uint32_t m_damageCountWhilePressed; -}; - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/EditionToolController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/EditionToolController.cpp deleted file mode 100644 index a3a6dd1..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/EditionToolController.cpp +++ /dev/null @@ -1,161 +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 "EditionToolController.h" -#include "BlastController.h" -#include "Renderer.h" -#include "PhysXController.h" -#include "SampleProfiler.h" -#include "PxRigidDynamic.h" -#include "PxScene.h" -#include "NvBlastExtPxManager.h" -#include "SceneController.h" -#include "NvBlastExtPxActor.h" -#include "GlobalSettings.h" -using namespace Nv::Blast; -using namespace physx; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Setup -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -EditionToolController::EditionToolController() -{ -} - -EditionToolController::~EditionToolController() -{ -} - -void EditionToolController::onSampleStart() -{ -} - -void EditionToolController::onInitialize() -{ -} - - -void EditionToolController::onSampleStop() -{ -} - -void EditionToolController::Animate(double dt) -{ - PROFILER_SCOPED_FUNCTION(); -} - - -LRESULT EditionToolController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - PROFILER_SCOPED_FUNCTION(); - - if (uMsg == WM_LBUTTONDOWN || uMsg == WM_MOUSEMOVE || uMsg == WM_LBUTTONUP) - { - float mouseX = (float)LOWORD(lParam); - float mouseY = (float)HIWORD(lParam); - bool press = uMsg == WM_LBUTTONDOWN; - - if (uMsg == WM_LBUTTONUP) - { - PxVec3 eyePos, pickDir; - getPhysXController().getEyePoseAndPickDir(mouseX, mouseY, eyePos, pickDir); - pickDir = pickDir.getNormalized(); - - PxRaycastHit hit; hit.shape = NULL; - PxRaycastBuffer hit1; - getPhysXController().getEditPhysXScene().raycast(eyePos, pickDir, PX_MAX_F32, hit1, PxHitFlag::ePOSITION | PxHitFlag::eNORMAL); - hit = hit1.block; - - PxRigidActor* actor = NULL; - if (hit.shape) - { - actor = hit.actor; - } - fracture(actor); - } - } - - return 1; -} - -void EditionToolController::drawUI() -{ -} - -void EditionToolController::fracture(PxActor* actor) -{ - if (NULL == actor) - { - return; - } - - BlastController& blastController = getBlastController(); - std::vector<BlastFamilyPtr>& families = blastController.getFamilies(); - if (families.size() == 0) - { - return; - } - - PxRigidDynamic* rigidDynamic = actor->is<PxRigidDynamic>(); - if (NULL == rigidDynamic) - { - return; - } - - BlastFamilyPtr pBlastFamily = NULL; - std::vector<BlastFamilyPtr>::iterator it = families.begin(); - for (; it != families.end(); it++) - { - BlastFamilyPtr f = *it; - if (f->find(*actor)) - { - pBlastFamily = f; - break; - } - } - if (NULL == pBlastFamily) - { - return; - } - - const uint32_t chunkIndex = pBlastFamily->getChunkIndexByPxActor(*actor); - - const BlastAsset& blastAsset = pBlastFamily->getBlastAsset(); - BlastAsset* pBlastAsset = (BlastAsset*)&blastAsset; - - VoronoiFractureExecutor executor; - executor.setSourceAsset(pBlastAsset); - executor.setTargetChunk(chunkIndex); - executor.execute(); -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/EditionToolController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/EditionToolController.h deleted file mode 100644 index 5f71b58..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/EditionToolController.h +++ /dev/null @@ -1,80 +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. - - -#ifndef EDITION_TOOL_CONTROLLER_H -#define EDITION_TOOL_CONTROLLER_H - -#include "SampleManager.h" - -namespace physx -{ - class PxActor; -} - -class EditionToolController : public ISampleController -{ -public: - EditionToolController(); - virtual ~EditionToolController(); - - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual void Animate(double dt); - void drawUI(); - - virtual void onInitialize(); - virtual void onSampleStart(); - virtual void onSampleStop(); - - void fracture(physx::PxActor* actor); - -private: - EditionToolController& operator= (EditionToolController&); - - //////// private methods //////// - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - PhysXController& getPhysXController() const - { - return getManager()->getPhysXController(); - } - - BlastController& getBlastController() const - { - return getManager()->getBlastController(); - } - - //////// internal data //////// -}; - -#endif // EDITION_TOOL_CONTROLLER_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/ExplodeToolController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/ExplodeToolController.cpp deleted file mode 100644 index 28ac182..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/ExplodeToolController.cpp +++ /dev/null @@ -1,256 +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 "ExplodeToolController.h" -#include "RenderUtils.h" -#include "BlastController.h" -#include "Renderer.h" -#include "PhysXController.h" -#include "SampleProfiler.h" -#include "GizmoToolController.h" - -#include <imgui.h> - -#include "NvBlastTkActor.h" -#include "NvBlastExtDamageShaders.h" - -#include "PxRigidDynamic.h" -#include "PxScene.h" -#include "BlastSceneTree.h" -#include "SimpleScene.h" -#include "ViewerOutput.h" - -using namespace Nv::Blast; -using namespace physx; - -const float EXPLODE_MIN = 0.0f; -const float EXPLODE_MAX = 2.0f; -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Setup -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -ExplodeToolController::ExplodeToolController() - : m_previousExplodeValue(0.0f) - , m_starDrag(false) -{ -} - -ExplodeToolController::~ExplodeToolController() -{ -} - -void ExplodeToolController::onSampleStart() -{ -} - -void ExplodeToolController::onInitialize() -{ - m_previousExplodeValue = 0.0f; -} - - -void ExplodeToolController::onSampleStop() -{ -} - -void ExplodeToolController::Animate(double dt) -{ - PROFILER_SCOPED_FUNCTION(); -} - - -LRESULT ExplodeToolController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - PROFILER_SCOPED_FUNCTION(); - - SampleManager* pSampleManager = SampleManager::ins(); - if (pSampleManager->IsSimulating()) - { - return 1; - } - - if (uMsg == WM_LBUTTONDOWN) - { - m_mouseStartPoint.x = (short)LOWORD(lParam); - m_mouseStartPoint.y = (short)HIWORD(lParam); - m_starDrag = true; - } - else if (uMsg == WM_MOUSEMOVE) - { - if (!m_starDrag) - return 1; - - float theDragDistance = (short)LOWORD(lParam) - m_mouseStartPoint.x; - // ignore shorter mouse move - if (fabs(theDragDistance) <= 3.0) - return 1; - - theDragDistance /= getRenderer().getScreenWidth(); - theDragDistance *= EXPLODE_MAX; - float theNewExplodeValue = m_previousExplodeValue + (float)theDragDistance; - - if (theNewExplodeValue < 0) - theNewExplodeValue = 0; - else if (theNewExplodeValue > EXPLODE_MAX) - theNewExplodeValue = EXPLODE_MAX; - - _explode(theNewExplodeValue); - } - else if (uMsg == WM_LBUTTONUP) - { - m_previousExplodeValue = 0.0f; - m_starDrag = false; - } - return 1; -} - -void ExplodeToolController::drawUI() -{ -} - -void ExplodeToolController::_explode(float value) -{ - SampleManager* pSampleManager = SampleManager::ins(); - - BlastAsset* pBlastAsset = nullptr; - int nFamilyIndex = -1; - pSampleManager->getCurrentSelectedInstance(&pBlastAsset, nFamilyIndex); - if (pBlastAsset == nullptr) - { - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = pSampleManager->getAssetDescMap(); - if (AssetDescMap.size() == 1) - { - std::map<BlastAsset*, AssetList::ModelAsset>::iterator itAssetDescMap = AssetDescMap.begin(); - pSampleManager->setCurrentSelectedInstance(itAssetDescMap->first, -1); - pBlastAsset = pSampleManager->getCurBlastAsset(); - viewer_msg("no asset selected, use the only one in current scene."); - } - } - if (pBlastAsset == nullptr) - { - viewer_msg("please select one asset before explode."); - return; - } - - std::map<BlastAsset*, std::vector<BlastFamily*>>& AssetFamiliesMap = pSampleManager->getAssetFamiliesMap(); - std::map<BlastAsset*, std::vector<BlastFamily*>>::iterator itAFM = AssetFamiliesMap.find(pBlastAsset); - if (itAFM == AssetFamiliesMap.end()) - { - return; - } - - std::vector<BlastFamily*> families = itAFM->second; - int familySize = families.size(); - if (familySize == 0) - { - viewer_msg("no instance for current asset."); - return; - } - - if (nFamilyIndex == -1 || nFamilyIndex >= familySize) - { - nFamilyIndex = 0; - viewer_msg("no instance selected, use the first one of current asset."); - } - - BlastFamily* pFamily = families[nFamilyIndex]; - - PxScene& scene = pSampleManager->getPhysXController().getEditPhysXScene(); - const PxU32 actorsCountTotal = scene.getNbActors(PxActorTypeFlag::eRIGID_DYNAMIC); - if (actorsCountTotal == 0) - { - return; - } - - std::vector<PxActor*> actorsTotal(actorsCountTotal); - PxU32 nbActors = scene.getActors(PxActorTypeFlag::eRIGID_DYNAMIC, &actorsTotal[0], actorsCountTotal, 0); - PX_ASSERT(actorsCountTotal == nbActors); - - std::vector<PxActor*> actors; - PxActor* pRootActor = nullptr; - for (int act = 0; act < actorsCountTotal; act++) - { - if (pFamily->find(*actorsTotal[act])) - { - if (pRootActor == nullptr) - { - uint32_t chunkIndex = pFamily->getChunkIndexByPxActor(*actorsTotal[act]); - std::vector<uint32_t> chunkIndexes; - chunkIndexes.push_back(chunkIndex); - std::vector<BlastChunkNode*> chunkNodes = BlastTreeData::ins().getChunkNodeByBlastChunk(pBlastAsset, chunkIndexes); - if (chunkNodes.size() > 0 && BlastTreeData::isRoot(chunkNodes[0])) - { - pRootActor = actorsTotal[act]; - } - else - { - actors.push_back(actorsTotal[act]); - } - } - else - { - actors.push_back(actorsTotal[act]); - } - } - } - - if (pRootActor == nullptr) - { - return; - } - - BlastController& blastController = pSampleManager->getBlastController(); - - PxVec3 origin = pRootActor->getWorldBounds().getCenter(); - - int actorsCount = actors.size(); - for (int ac = 0; ac < actorsCount; ac++) - { - PxActor* actor = actors[ac]; - PxRigidDynamic* dynamic = actor->is<PxRigidDynamic>(); - PX_ASSERT(dynamic != nullptr); - PxTransform transformOld = dynamic->getGlobalPose(); - PxTransform transformNew = transformOld; - - PxBounds3 bound = actor->getWorldBounds(); - PxVec3 target = bound.getCenter(); - - //PxVec3 tChange = (target - origin) * value; - //PxVec3 newTarget = target + tChange; - //transformNew.p = transformOld.p + tChange; - transformNew.p = (target - origin) * value; - - dynamic->setGlobalPose(transformNew); - blastController.updateActorRenderableTransform(*actor, transformNew, false); - } -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/ExplodeToolController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/ExplodeToolController.h deleted file mode 100644 index 9a417ca..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/ExplodeToolController.h +++ /dev/null @@ -1,100 +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. - - -#ifndef EXPLODE_TOOL_CONTROLLER_H -#define EXPLODE_TOOL_CONTROLLER_H - -#include "SampleManager.h" -#include "PxVec2.h" -#include "PxVec3.h" -#include "DebugRenderBuffer.h" -#include "BlastFamily.h" -#include "NvBlastExtPxManager.h" -#include "BlastSceneTree.h" - -class Renderable; -class RenderMaterial; - -namespace Nv -{ -namespace Blast -{ -class ExtPxActor; -} -} - -namespace physx -{ - class PxScene; -} - -class ExplodeToolController : public ISampleController -{ -public: - ExplodeToolController(); - virtual ~ExplodeToolController(); - - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual void Animate(double dt); - void drawUI(); - - virtual void onInitialize(); - virtual void onSampleStart(); - virtual void onSampleStop(); - -private: - ExplodeToolController& operator= (ExplodeToolController&); - - //////// private methods //////// - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - PhysXController& getPhysXController() const - { - return getManager()->getPhysXController(); - } - - BlastController& getBlastController() const - { - return getManager()->getBlastController(); - } - - void _explode(float value); - //////// internal data //////// - - float m_previousExplodeValue; - PxVec2 m_mouseStartPoint; - bool m_starDrag; -}; - -#endif // EXPLODE_TOOL_CONTROLLER_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/GizmoToolController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/GizmoToolController.cpp deleted file mode 100644 index 5942b45..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/GizmoToolController.cpp +++ /dev/null @@ -1,1311 +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 "GizmoToolController.h" -#include "RenderUtils.h" -#include "BlastController.h" -#include "SelectionToolController.h" -#include "Renderer.h" -#include "PhysXController.h" -#include "SampleProfiler.h" -#include "ViewerOutput.h" - -#include <imgui.h> - -#include "NvBlastTkActor.h" -#include "NvBlastExtDamageShaders.h" - -#include "PxRigidDynamic.h" -#include "PxScene.h" -#include "PxPhysics.h" -#include "cooking/PxCooking.h" -#include "NvBlastExtPxActor.h" -#include <AppMainWindow.h> -#include "BlastSceneTree.h" -#include "SimpleScene.h" -using namespace Nv::Blast; -using namespace physx; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Setup -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -const DirectX::XMFLOAT4 X_DIRECTION_COLOR_F = DirectX::XMFLOAT4(1, 0, 0, 1); -const DirectX::XMFLOAT4 Y_DIRECTION_COLOR_F = DirectX::XMFLOAT4(0, 1, 0, 1); -const DirectX::XMFLOAT4 Z_DIRECTION_COLOR_F = DirectX::XMFLOAT4(0, 0, 1, 1); -const DirectX::XMFLOAT4 HIGHLIGHT_COLOR_F = DirectX::XMFLOAT4(1, 1, 0, 1); - -const physx::PxU32 X_DIRECTION_COLOR_U = XMFLOAT4ToU32Color(X_DIRECTION_COLOR_F); -const physx::PxU32 Y_DIRECTION_COLOR_U = XMFLOAT4ToU32Color(Y_DIRECTION_COLOR_F); -const physx::PxU32 Z_DIRECTION_COLOR_U = XMFLOAT4ToU32Color(Z_DIRECTION_COLOR_F); -const physx::PxU32 HIGHLIGHT_COLOR_U = XMFLOAT4ToU32Color(HIGHLIGHT_COLOR_F); - -float defaultAxisLength = 10.0; -const float defaultAxisModifier = -1.0; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -void modifyPxActorByLocalWay(PxScene& pxScene, PxRigidDynamic& actor, PxTransform& gp_old, PxTransform& gp_new) -{ - uint32_t shapesCount = actor.getNbShapes(); - if (shapesCount > 0) - { - PxTransform gp_newInv = gp_new.getInverse(); - - PxTransform lp_old; - PxTransform lp_new; - - std::vector<PxShape*> shapes(shapesCount); - actor.getShapes(&shapes[0], shapesCount); - - pxScene.removeActor(actor); - for (uint32_t i = 0; i < shapesCount; i++) - { - PxShape* shape = shapes[i]; - - actor.detachShape(*shape); - - lp_old = shape->getLocalPose(); - lp_new = gp_newInv * gp_old * lp_old; - shape->setLocalPose(lp_new); - - actor.attachShape(*shape); - } - pxScene.addActor(actor); - } -} - -void scalePxActor(PxScene& pxScene, PxRigidDynamic& actor, PxMat44& scale) -{ - uint32_t shapesCount = actor.getNbShapes(); - if (shapesCount == 0) - { - return; - } - - std::vector<PxShape*> shapes(shapesCount); - actor.getShapes(&shapes[0], shapesCount); - - pxScene.removeActor(actor); - - for (uint32_t i = 0; i < shapesCount; i++) - { - PxShape* shape = shapes[i]; - - PxConvexMeshGeometry mesh; - bool valid = shape->getConvexMeshGeometry(mesh); - if (!valid) - { - continue; - } - - PxConvexMesh* pMesh = mesh.convexMesh; - if (NULL == pMesh) - { - continue; - } - - PxU32 numVertex = pMesh->getNbVertices(); - if (numVertex == 0) - { - continue; - } - - const PxVec3* pVertex = pMesh->getVertices(); - PxVec3* pVertexNew = new PxVec3[numVertex]; - for (PxU32 v = 0; v < numVertex; v++) - { - pVertexNew[v] = scale.transform(pVertex[v]); - } - - PxConvexMeshDesc convexMeshDesc; - convexMeshDesc.points.count = numVertex; - convexMeshDesc.points.data = pVertexNew; - convexMeshDesc.points.stride = sizeof(PxVec3); - convexMeshDesc.flags = PxConvexFlag::eCOMPUTE_CONVEX; - SampleManager* manager = SampleManager::ins(); - PxPhysics& physics = manager->getPhysXController().getPhysics(); - PxCooking& cooking = manager->getPhysXController().getCooking(); - PxConvexMesh* convexMesh = cooking.createConvexMesh(convexMeshDesc, physics.getPhysicsInsertionCallback()); - if (NULL == convexMesh) - { - delete[] pVertexNew; - continue; - } - - mesh.convexMesh = convexMesh; - - actor.detachShape(*shape); - shape->setGeometry(mesh); - actor.attachShape(*shape); - - pMesh->release(); - delete[] pVertexNew; - } - - pxScene.addActor(actor); -} - -GizmoToolController::GizmoToolController() -{ - m_bGizmoFollowed = false; - - UpdateCircleRenderData(defaultAxisLength); - - resetPos(); - - BlastSceneTree::ins()->addObserver(this); -} - -GizmoToolController::~GizmoToolController() -{ -} - -void GizmoToolController::onSampleStart() -{ - m_AxisRenderMaterial = new RenderMaterial("", getRenderer().getResourceManager(), "physx_primitive_transparent"); - - IRenderMesh* coneMesh = getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Cone); - m_AxisConeRenderable[AT_X] = getRenderer().createRenderable(*coneMesh, *m_AxisRenderMaterial); - m_AxisConeRenderable[AT_Y] = getRenderer().createRenderable(*coneMesh, *m_AxisRenderMaterial); - m_AxisConeRenderable[AT_Z] = getRenderer().createRenderable(*coneMesh, *m_AxisRenderMaterial); - m_AxisConeRenderable[AT_X]->setColor(X_DIRECTION_COLOR_F); - m_AxisConeRenderable[AT_Y]->setColor(Y_DIRECTION_COLOR_F); - m_AxisConeRenderable[AT_Z]->setColor(Z_DIRECTION_COLOR_F); - m_AxisConeRenderable[AT_X]->setScale(PxVec3(0.5, 1, 0.5)); - m_AxisConeRenderable[AT_Y]->setScale(PxVec3(0.5, 1, 0.5)); - m_AxisConeRenderable[AT_Z]->setScale(PxVec3(0.5, 1, 0.5)); - m_AxisConeRenderable[AT_X]->setHidden(true); - m_AxisConeRenderable[AT_Y]->setHidden(true); - m_AxisConeRenderable[AT_Z]->setHidden(true); - - IRenderMesh* boxMesh = getRenderer().getPrimitiveRenderMesh(PrimitiveRenderMeshType::Box); - m_AxisBoxRenderable[AT_X] = getRenderer().createRenderable(*boxMesh, *m_AxisRenderMaterial); - m_AxisBoxRenderable[AT_Y] = getRenderer().createRenderable(*boxMesh, *m_AxisRenderMaterial); - m_AxisBoxRenderable[AT_Z] = getRenderer().createRenderable(*boxMesh, *m_AxisRenderMaterial); - m_AxisBoxRenderable[AT_X]->setColor(X_DIRECTION_COLOR_F); - m_AxisBoxRenderable[AT_Y]->setColor(Y_DIRECTION_COLOR_F); - m_AxisBoxRenderable[AT_Z]->setColor(Z_DIRECTION_COLOR_F); - m_AxisBoxRenderable[AT_X]->setScale(PxVec3(0.5, 0.5, 0.5)); - m_AxisBoxRenderable[AT_Y]->setScale(PxVec3(0.5, 0.5, 0.5)); - m_AxisBoxRenderable[AT_Z]->setScale(PxVec3(0.5, 0.5, 0.5)); - m_AxisBoxRenderable[AT_X]->setHidden(true); - m_AxisBoxRenderable[AT_Y]->setHidden(true); - m_AxisBoxRenderable[AT_Z]->setHidden(true); - - m_Axis[AT_X] = PxVec3(defaultAxisLength, 0.0, 0.0); - m_Axis[AT_Y] = PxVec3(0.0, defaultAxisLength, 0.0); - m_Axis[AT_Z] = PxVec3(0.0, 0.0, defaultAxisLength); -} - -void GizmoToolController::onInitialize() -{ -} - - -void GizmoToolController::onSampleStop() -{ -} - -void GizmoToolController::dataSelected(std::vector<BlastNode*> selections) -{ - if (!IsEnabled()) - return; - - BlastController& blastController = getBlastController(); - std::vector<BlastFamilyPtr>& families = blastController.getFamilies(); - - std::set<PxActor*> selectedActors; - PxActor* targetActor = nullptr; - for (BlastFamily* family : families) - { - std::vector<uint32_t> selectedChunks = family->getSelectedChunks(); - for (uint32_t chunkIndex : selectedChunks) - { - PxActor* actor = nullptr; - family->getPxActorByChunkIndex(chunkIndex, &actor); - - if (actor) - { - selectedActors.insert(actor); - targetActor = actor; - } - } - } - - if (targetActor) - setTargetActor(targetActor); - getSelectionToolController().setTargetActors(selectedActors); -} - -void GizmoToolController::Animate(double dt) -{ - PROFILER_SCOPED_FUNCTION(); - - if (NULL == m_CurrentActor) - { - m_AxisConeRenderable[AT_X]->setHidden(true); - m_AxisConeRenderable[AT_Y]->setHidden(true); - m_AxisConeRenderable[AT_Z]->setHidden(true); - m_AxisBoxRenderable[AT_X]->setHidden(true); - m_AxisBoxRenderable[AT_Y]->setHidden(true); - m_AxisBoxRenderable[AT_Z]->setHidden(true); - - return; - } - - m_TargetPos = m_CurrentActor->getGlobalPose().p; - m_bNeedResetPos = true; - - bool isTranslation = m_GizmoToolMode == GTM_Translate; - bool isScale = m_GizmoToolMode == GTM_Scale; - bool isRotation = m_GizmoToolMode == GTM_Rotation; - bool isLocal = AppMainWindow::Inst().m_bGizmoWithLocal; - - bool showLine = isTranslation || isScale || (isRotation && isLocal); - bool showCone = isTranslation || (isRotation && isLocal); - bool showBox = isScale; - bool showCircle = isRotation; - - m_AxisConeRenderable[AT_X]->setHidden(!isTranslation); - m_AxisConeRenderable[AT_Y]->setHidden(!isTranslation); - m_AxisConeRenderable[AT_Z]->setHidden(!isTranslation); - m_AxisBoxRenderable[AT_X]->setHidden(!isScale); - m_AxisBoxRenderable[AT_Y]->setHidden(!isScale); - m_AxisBoxRenderable[AT_Z]->setHidden(!isScale); - - syncRenderableState(); - - if (showLine) - { - if (m_bNeedResetPos) - { - m_AxisRenderBuffer.clear(); - m_AxisRenderBuffer.m_lines.push_back(PxDebugLine(m_TargetPos, m_TargetPos + m_Axis[AT_X] * defaultAxisModifier, X_DIRECTION_COLOR_U)); - m_AxisRenderBuffer.m_lines.push_back(PxDebugLine(m_TargetPos, m_TargetPos + m_Axis[AT_Y], Y_DIRECTION_COLOR_U)); - m_AxisRenderBuffer.m_lines.push_back(PxDebugLine(m_TargetPos, m_TargetPos + m_Axis[AT_Z], Z_DIRECTION_COLOR_U)); - } - - if (m_bNeedResetColor) - { - if (m_AxisSelected == AT_X) - { - m_AxisRenderBuffer.m_lines[0].color0 = HIGHLIGHT_COLOR_U; - m_AxisRenderBuffer.m_lines[0].color1 = HIGHLIGHT_COLOR_U; - } - else - { - m_AxisRenderBuffer.m_lines[0].color0 = X_DIRECTION_COLOR_U; - m_AxisRenderBuffer.m_lines[0].color1 = X_DIRECTION_COLOR_U; - } - if (m_AxisSelected == AT_Y) - { - m_AxisRenderBuffer.m_lines[1].color0 = HIGHLIGHT_COLOR_U; - m_AxisRenderBuffer.m_lines[1].color1 = HIGHLIGHT_COLOR_U; - } - else - { - m_AxisRenderBuffer.m_lines[1].color0 = Y_DIRECTION_COLOR_U; - m_AxisRenderBuffer.m_lines[1].color1 = Y_DIRECTION_COLOR_U; - } - if (m_AxisSelected == AT_Z) - { - m_AxisRenderBuffer.m_lines[2].color0 = HIGHLIGHT_COLOR_U; - m_AxisRenderBuffer.m_lines[2].color1 = HIGHLIGHT_COLOR_U; - } - else - { - m_AxisRenderBuffer.m_lines[2].color0 = Z_DIRECTION_COLOR_U; - m_AxisRenderBuffer.m_lines[2].color1 = Z_DIRECTION_COLOR_U; - } - } - - getRenderer().queueRenderBuffer(&m_AxisRenderBuffer); - } - - if (showCone) - { - if (m_bNeedResetPos) - { - PxTransform transform; - - transform.p = m_TargetPos + m_Axis[AT_X] * defaultAxisModifier; - transform.q = CalDirectionQuat(AT_X); - m_AxisConeRenderable[AT_X]->setTransform(transform); - - transform.p = m_TargetPos + m_Axis[AT_Y]; - transform.q = CalDirectionQuat(AT_Y); - m_AxisConeRenderable[AT_Y]->setTransform(transform); - - transform.p = m_TargetPos + m_Axis[AT_Z]; - transform.q = CalDirectionQuat(AT_Z); - m_AxisConeRenderable[AT_Z]->setTransform(transform); - } - - if (m_bNeedResetColor) - { - if (m_AxisSelected == AT_X) - { - m_AxisConeRenderable[AT_X]->setColor(HIGHLIGHT_COLOR_F); - } - else - { - m_AxisConeRenderable[AT_X]->setColor(X_DIRECTION_COLOR_F); - } - if (m_AxisSelected == AT_Y) - { - m_AxisConeRenderable[AT_Y]->setColor(HIGHLIGHT_COLOR_F); - } - else - { - m_AxisConeRenderable[AT_Y]->setColor(Y_DIRECTION_COLOR_F); - } - if (m_AxisSelected == AT_Z) - { - m_AxisConeRenderable[AT_Z]->setColor(HIGHLIGHT_COLOR_F); - } - else - { - m_AxisConeRenderable[AT_Z]->setColor(Z_DIRECTION_COLOR_F); - } - } - } - - if (showBox) - { - if (m_bNeedResetPos) - { - PxTransform transform; - - transform.p = m_TargetPos + m_Axis[AT_X] * defaultAxisModifier; - transform.q = CalDirectionQuat(AT_X); - m_AxisBoxRenderable[AT_X]->setTransform(transform); - - transform.p = m_TargetPos + m_Axis[AT_Y]; - transform.q = CalDirectionQuat(AT_Y); - m_AxisBoxRenderable[AT_Y]->setTransform(transform); - - transform.p = m_TargetPos + m_Axis[AT_Z]; - transform.q = CalDirectionQuat(AT_Z); - m_AxisBoxRenderable[AT_Z]->setTransform(transform); - } - - if (m_bNeedResetColor) - { - if (m_AxisSelected == AT_X) - { - m_AxisBoxRenderable[AT_X]->setColor(HIGHLIGHT_COLOR_F); - } - else - { - m_AxisBoxRenderable[AT_X]->setColor(X_DIRECTION_COLOR_F); - } - if (m_AxisSelected == AT_Y) - { - m_AxisBoxRenderable[AT_Y]->setColor(HIGHLIGHT_COLOR_F); - } - else - { - m_AxisBoxRenderable[AT_Y]->setColor(Y_DIRECTION_COLOR_F); - } - if (m_AxisSelected == AT_Z) - { - m_AxisBoxRenderable[AT_Z]->setColor(HIGHLIGHT_COLOR_F); - } - else - { - m_AxisBoxRenderable[AT_Z]->setColor(Z_DIRECTION_COLOR_F); - } - } - } - - if (showCircle) - { - if (m_bNeedResetPos) - { - PxQuat q = CalConvertQuat(); - - m_CircleRenderBuffer.clear(); - std::vector<PxDebugLine>::iterator it; - for (it = m_CircleRenderData.begin(); it != m_CircleRenderData.end(); it++) - { - PxDebugLine line = (*it); - - line.pos0 = q.rotate(line.pos0); - line.pos1 = q.rotate(line.pos1); - - line.pos0 += m_TargetPos; - line.pos1 += m_TargetPos; - - m_CircleRenderBuffer.m_lines.push_back(line); - } - } - - if (m_bNeedResetColor) - { - std::vector<PxDebugLine>& datas = m_CircleRenderData; - std::vector<PxDebugLine>& lines = m_CircleRenderBuffer.m_lines; - int linesize = lines.size(); - int linesize_per_axis = linesize / 3; - float multiply; - physx::PxU32 color; - - if (m_AxisSelected == AT_X) - { - for (int l = 0; l < linesize_per_axis; l++) - { - multiply = 1.0 * (l + 1) / linesize_per_axis; - color = XMFLOAT4ToU32Color(DirectX::XMFLOAT4(multiply, multiply, 0, 1)); - lines[l].color0 = color; - lines[l].color1 = color; - } - } - else - { - for (int l = 0; l < linesize_per_axis; l++) - { - multiply = 1.0 * (l + 1) / linesize_per_axis; - color = XMFLOAT4ToU32Color(DirectX::XMFLOAT4(multiply, 0, 0, 1)); - lines[l].color0 = color; - lines[l].color1 = color; - } - } - if (m_AxisSelected == AT_Y) - { - for (int l = linesize_per_axis; l < linesize_per_axis * 2; l++) - { - multiply = 1.0 * (l + 1 - linesize_per_axis) / linesize_per_axis; - color = XMFLOAT4ToU32Color(DirectX::XMFLOAT4(multiply, multiply, 0, 1)); - lines[l].color0 = color; - lines[l].color1 = color; - } - } - else - { - for (int l = linesize_per_axis; l < linesize_per_axis * 2; l++) - { - multiply = 1.0 * (l + 1 - linesize_per_axis) / linesize_per_axis; - color = XMFLOAT4ToU32Color(DirectX::XMFLOAT4(0, multiply, 0, 1)); - lines[l].color0 = color; - lines[l].color1 = color; - } - } - if (m_AxisSelected == AT_Z) - { - for (int l = linesize_per_axis * 2; l < linesize; l++) - { - multiply = 1.0 * (l + 1 - linesize_per_axis * 2) / linesize_per_axis; - color = XMFLOAT4ToU32Color(DirectX::XMFLOAT4(multiply, multiply, 0, 1)); - lines[l].color0 = color; - lines[l].color1 = color; - } - } - else - { - for (int l = linesize_per_axis * 2; l < linesize; l++) - { - multiply = 1.0 * (l + 1 - linesize_per_axis * 2) / linesize_per_axis; - color = XMFLOAT4ToU32Color(DirectX::XMFLOAT4(0, 0, multiply, 1)); - lines[l].color0 = color; - lines[l].color1 = color; - } - } - } - - getRenderer().queueRenderBuffer(&m_CircleRenderBuffer); - } - - m_bNeedResetPos = false; - m_bNeedResetColor = false; -} - -LRESULT GizmoToolController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - PROFILER_SCOPED_FUNCTION(); - - if (uMsg == WM_LBUTTONDOWN || uMsg == WM_MOUSEMOVE || uMsg == WM_LBUTTONUP) - { - float mouseX = (float)LOWORD(lParam); - float mouseY = (float)HIWORD(lParam); - - PxVec3 eyePos, pickDir; - getPhysXController().getEyePoseAndPickDir(mouseX, mouseY, eyePos, pickDir); - pickDir = pickDir.getNormalized(); - - if (uMsg == WM_LBUTTONDOWN) - { - if (m_AxisSelected == AT_Num) - { - PxRaycastBufferN<32> hits; - GetPhysXScene().raycast(eyePos, pickDir, PX_MAX_F32, hits, PxHitFlag::ePOSITION | PxHitFlag::eMESH_MULTIPLE); - - PxU32 nbThouches = hits.getNbTouches(); - const PxRaycastHit* touches = hits.getTouches(); - - PxRigidActor* actor = NULL; - for (PxU32 u = 0; u < nbThouches; ++u) - { - const PxRaycastHit& t = touches[u]; - if (t.shape && getBlastController().isActorVisible(*(t.actor))) - { - actor = t.actor; - } - } - - if (actor) - { - PxRigidDynamic* rigidDynamic = actor->is<PxRigidDynamic>(); - if (NULL != rigidDynamic) - { - m_CurrentActor = rigidDynamic; - getSelectionToolController().pointSelect(m_CurrentActor); - - PxTransform gp = m_CurrentActor->getGlobalPose(); - - m_TargetPos = gp.p; - m_Axis[AT_X] = gp.q.rotate(PxVec3(defaultAxisLength, 0, 0)); - m_Axis[AT_Y] = gp.q.rotate(PxVec3(0, defaultAxisLength, 0)); - m_Axis[AT_Z] = gp.q.rotate(PxVec3(0, 0, defaultAxisLength)); - - m_bNeedResetPos = true; - } - else - { - m_CurrentActor = NULL; - getSelectionToolController().clearSelect(); - } - } - } - else - { - m_bGizmoFollowed = (m_CurrentActor != NULL); - - if (m_GizmoToolMode == GTM_Scale) - { - m_LastAxis[AT_X] = m_Axis[AT_X].getNormalized(); - m_LastAxis[AT_Y] = m_Axis[AT_Y].getNormalized(); - m_LastAxis[AT_Z] = m_Axis[AT_Z].getNormalized(); - } - } - } - else if (uMsg == WM_MOUSEMOVE) - { - if (m_bGizmoFollowed) - { - switch (m_GizmoToolMode) - { - case GTM_Translate: - { - if (AppMainWindow::Inst().m_bGizmoWithLocal && !CanModifyLocal(m_CurrentActor)) - { - char message[1024]; - sprintf(message, "Only unfractured model can be modify in local way in edit mode!"); - viewer_warn(message); - return 1; - } - - PxVec3 axis = m_Axis[m_AxisSelected]; - axis = axis.getNormalized(); - PxVec3 samplepoint = eyePos + pickDir; - PxVec3 normal = m_LastEyeRay.cross(axis); - normal = normal.getNormalized(); - PxVec3 foot; - GetFootFromPointToPlane(samplepoint, eyePos, normal, foot); - PxVec3 direction = foot - eyePos; - direction = direction.getNormalized(); - PxVec3 target; - GetIntersectBetweenLines(m_LastFoot, axis, eyePos, direction, target); - PxVec3 delta = target - m_LastFoot; - - m_LastEyeRay = direction; - m_LastFoot = target; - - PxTransform gp_old = m_CurrentActor->getGlobalPose(); - PxTransform gp_new(gp_old.p + delta, gp_old.q); - m_CurrentActor->setGlobalPose(gp_new); - - bool modifyLocal = AppMainWindow::Inst().m_bGizmoWithLocal && CanModifyLocal(m_CurrentActor); - - if (!SampleManager::ins()->IsSimulating()) - { - getBlastController().updateActorRenderableTransform(*m_CurrentActor, gp_new, modifyLocal); - if (CanMapToRootChunk(m_CurrentActor) && !modifyLocal) - UpdateAssetInstanceTransform(gp_new); - } - - m_TargetPos = gp_new.p; - - if (modifyLocal) - { - modifyPxActorByLocalWay(GetPhysXScene(), *m_CurrentActor, gp_old, gp_new); - } - - m_bNeedResetPos = true; - m_bNeedResetColor = true; - } - break; - case GTM_Scale: - { - if (AppMainWindow::Inst().m_bGizmoWithLocal && !CanModifyLocal(m_CurrentActor)) - { - char message[1024]; - sprintf(message, "Only unfractured model can be modify in local way in edit mode!"); - viewer_warn(message); - return 1; - } - - PxVec3 axis = m_LastAxis[m_AxisSelected]; - PxVec3 samplepoint = eyePos + pickDir; - PxVec3 normal = m_LastEyeRay.cross(axis); - normal = normal.getNormalized(); - PxVec3 foot; - GetFootFromPointToPlane(samplepoint, eyePos, normal, foot); - PxVec3 direction = foot - eyePos; - direction = direction.getNormalized(); - PxVec3 target; - GetIntersectBetweenLines(m_LastFoot, axis, eyePos, direction, target); - PxVec3 delta = target - m_LastFoot; - - if (m_AxisSelected == AT_X) - { - delta *= defaultAxisModifier; - } - m_Axis[m_AxisSelected] = m_LastAxis[m_AxisSelected] * defaultAxisLength + delta; - - bool isShift = (GetAsyncKeyState(VK_SHIFT) && 0x8000); - if (isShift) - { - float length = m_Axis[m_AxisSelected].magnitude(); - m_Axis[AT_X] = m_LastAxis[AT_X] * length; - m_Axis[AT_Y] = m_LastAxis[AT_Y] * length; - m_Axis[AT_Z] = m_LastAxis[AT_Z] * length; - } - - ScaleActor(false); - - m_bNeedResetPos = true; - m_bNeedResetColor = true; - } - break; - - case GTM_Rotation: - { - if (AppMainWindow::Inst().m_bGizmoWithLocal && !CanModifyLocal(m_CurrentActor)) - { - char message[1024]; - sprintf(message, "Only unfractured model can be modify in local way in edit mode!"); - viewer_warn(message); - return 1; - } - - PxVec3 planenormal = m_Axis[m_AxisSelected]; - planenormal = planenormal.getNormalized(); - - PxVec3 from, to; - CalPlaneLineIntersectPoint(from, planenormal, m_TargetPos, m_LastEyeRay, eyePos); - CalPlaneLineIntersectPoint(to, planenormal, m_TargetPos, pickDir, eyePos); - from = from - m_TargetPos; - to = to - m_TargetPos; - from = from.getNormalized(); - to = to.getNormalized(); - float cosangle = from.dot(to); - float angle = PxAcos(cosangle); - PxVec3 cross = from.cross(to); - cross = cross.getNormalized(); - - PxQuat q(angle, cross); - if (m_AxisSelected == AT_X) - { - m_Axis[AT_Y] = q.rotate(m_Axis[AT_Y]); - m_Axis[AT_Z] = q.rotate(m_Axis[AT_Z]); - } - else if (m_AxisSelected == AT_Y) - { - m_Axis[AT_X] = q.rotate(m_Axis[AT_X]); - m_Axis[AT_Z] = q.rotate(m_Axis[AT_Z]); - } - else if (m_AxisSelected == AT_Z) - { - m_Axis[AT_X] = q.rotate(m_Axis[AT_X]); - m_Axis[AT_Y] = q.rotate(m_Axis[AT_Y]); - } - - m_LastEyeRay = pickDir; - - PxTransform gp_old = m_CurrentActor->getGlobalPose(); - PxTransform gp_new = PxTransform(gp_old.p, CalConvertQuat()); - m_CurrentActor->setGlobalPose(gp_new); - bool modifyLocal = AppMainWindow::Inst().m_bGizmoWithLocal && CanModifyLocal(m_CurrentActor); - - if (!SampleManager::ins()->IsSimulating()) - { - getBlastController().updateActorRenderableTransform(*m_CurrentActor, gp_new, modifyLocal); - if (CanMapToRootChunk(m_CurrentActor)) - UpdateAssetInstanceTransform(gp_new); - } - - if (modifyLocal) - { - modifyPxActorByLocalWay(GetPhysXScene(), *m_CurrentActor, gp_old, gp_new); - } - - m_bNeedResetPos = true; - m_bNeedResetColor = true; - } - break; - } - } - else if(m_CurrentActor != NULL) - { - m_LastEyeRay = pickDir; - - // get axis which intersect with this eye ray - AxisType as = AT_Num; - { - double distanceMin = PX_MAX_F32; - double tolerance = defaultAxisLength / 20.0f; - int line_index = -1; - PxVec3 foot; - switch (m_GizmoToolMode) - { - case GTM_Translate: - { - std::vector<PxDebugLine>& lines = m_AxisRenderBuffer.m_lines; - int linesize = lines.size(); - for (int l = 0; l < linesize; l++) - { - PxVec3 start = lines[l].pos0; - PxVec3 end = lines[l].pos1; - PxVec3 dir = end - start; - - // separate the line to 10 segment - for (int segment = 0; segment <= 10; segment++) - { - PxVec3 vertex = start + 0.1 * segment * dir; - double distance = DistanceFromPointToLine(vertex, eyePos, pickDir, foot); - - if (distance < distanceMin) - { - distanceMin = distance; - line_index = l; - m_LastFoot = foot; - } - } - } - if (distanceMin < tolerance) - { - int axis_index = line_index * 3 / linesize; - as = (AxisType)axis_index; - } - } - break; - case GTM_Scale: - { - std::vector<PxDebugLine>& lines = m_AxisRenderBuffer.m_lines; - int linesize = lines.size(); - for (int l = 0; l < linesize; l++) - { - PxVec3 vertex = lines[l].pos1; - double distance = DistanceFromPointToLine(vertex, eyePos, pickDir, foot); - - if (distance < distanceMin) - { - distanceMin = distance; - line_index = l; - m_LastFoot = foot; - } - } - if (distanceMin < tolerance) - { - as = (AxisType)line_index; - } - } - break; - case GTM_Rotation: - { - std::vector<PxDebugLine>& lines = m_CircleRenderBuffer.m_lines; - int linesize = lines.size(); - for (int l = 0; l < linesize; l++) - { - PxVec3 vertex = lines[l].pos0; - double distance = DistanceFromPointToLine(vertex, eyePos, pickDir, foot); - - if (distance < distanceMin) - { - distanceMin = distance; - line_index = l; - m_LastFoot = foot; - } - } - if (distanceMin < tolerance) - { - int axis_index = line_index * 3 / linesize; - as = (AxisType)axis_index; - } - } - break; - default: - break; - } - } - setAxisSelected(as); - } - } - else if (uMsg == WM_LBUTTONUP) - { - if (m_GizmoToolMode == GTM_Scale) - { - if (m_AxisSelected != AT_Num) - { - if (NULL != m_CurrentActor) - { - ScaleActor(true); - } - - m_Axis[AT_X] = m_LastAxis[AT_X] * defaultAxisLength; - m_Axis[AT_Y] = m_LastAxis[AT_Y] * defaultAxisLength; - m_Axis[AT_Z] = m_LastAxis[AT_Z] * defaultAxisLength; - } - } - - if (m_AxisSelected != AT_Num && AppMainWindow::Inst().m_bGizmoWithLocal) - { - getBlastController().updateModelMeshToProjectParam(*m_CurrentActor); - } - - m_bNeedResetPos = true; - m_bNeedResetColor = true; - m_bGizmoFollowed = false; - } - } - - return 1; -} - -void GizmoToolController::drawUI() -{ -} - -void GizmoToolController::setGizmoToolMode(GizmoToolMode mode) -{ - if (mode == m_GizmoToolMode) - { - return; - } - - m_GizmoToolMode = mode; - - m_bNeedResetPos = true; - m_bNeedResetColor = true; - - showAxisRenderables(true); -} - -void GizmoToolController::setAxisSelected(AxisType type) -{ - if (type == m_AxisSelected) - { - return; - } - - m_AxisSelected = type; - m_bNeedResetColor = true; -} - -void GizmoToolController::setAxisLength(float axisLength) -{ - defaultAxisLength = axisLength; - UpdateCircleRenderData(axisLength); - - float scale = axisLength / 10.f * 0.2f; - m_AxisConeRenderable[AT_X]->setScale(PxVec3(scale, 2 * scale, scale)); - m_AxisConeRenderable[AT_Y]->setScale(PxVec3(scale, 2 * scale, scale)); - m_AxisConeRenderable[AT_Z]->setScale(PxVec3(scale, 2 * scale, scale)); - - m_AxisBoxRenderable[AT_X]->setScale(PxVec3(scale, scale, scale)); - m_AxisBoxRenderable[AT_Y]->setScale(PxVec3(scale, scale, scale)); - m_AxisBoxRenderable[AT_Z]->setScale(PxVec3(scale, scale, scale)); - - m_bNeedResetPos = true; -} - -void GizmoToolController::showAxisRenderables(bool show) -{ - bool isTranslate = m_GizmoToolMode == GTM_Translate; - bool isScale = m_GizmoToolMode == GTM_Scale; - - m_AxisConeRenderable[AT_X]->setHidden(!show || !isTranslate); - m_AxisConeRenderable[AT_Y]->setHidden(!show || !isTranslate); - m_AxisConeRenderable[AT_Z]->setHidden(!show || !isTranslate); - m_AxisBoxRenderable[AT_X]->setHidden(!show || !isScale); - m_AxisBoxRenderable[AT_Y]->setHidden(!show || !isScale); - m_AxisBoxRenderable[AT_Z]->setHidden(!show || !isScale); -} - -void GizmoToolController::resetPos() -{ - m_TargetPos = PxVec3(-100, -100, -100); - m_bNeedResetPos = true; - - m_AxisSelected = AT_Num; - m_bNeedResetColor = true; - - m_CurrentActor = NULL; -} - -void GizmoToolController::setTargetActor(PxActor* actor) -{ - m_bNeedResetPos = true; - m_CurrentActor = nullptr; - if (actor == nullptr) - { - return; - } - PxRigidDynamic* rigidDynamic = actor->is<PxRigidDynamic>(); - if (rigidDynamic == nullptr) - { - return; - } - - m_CurrentActor = rigidDynamic; - getSelectionToolController().pointSelect(m_CurrentActor); - - PxTransform gp = m_CurrentActor->getGlobalPose(); - - m_TargetPos = gp.p; - m_Axis[AT_X] = gp.q.rotate(PxVec3(defaultAxisLength, 0, 0)); - m_Axis[AT_Y] = gp.q.rotate(PxVec3(0, defaultAxisLength, 0)); - m_Axis[AT_Z] = gp.q.rotate(PxVec3(0, 0, defaultAxisLength)); -} - -PxActor* GizmoToolController::getTargetActor() -{ - return m_CurrentActor; -} - -physx::PxScene& GizmoToolController::GetPhysXScene() -{ - if (getManager()->IsSimulating()) - { - return getPhysXController().getPhysXScene(); - } - else - { - return getPhysXController().getEditPhysXScene(); - } -} - -void GizmoToolController::UpdateCircleRenderData(float axisLength) -{ - int segment = 36; - double span = PxTwoPi / segment; - PxVec3* vertex = new PxVec3[segment]; - m_CircleRenderData.clear(); - - for (int i = 0; i < segment; i++) - { - vertex[i].x = 0; - vertex[i].y = axisLength * PxSin(i * span); - vertex[i].z = axisLength * PxCos(i * span); - } - // x - for (int i = 0; i < segment - 1; i++) - { - m_CircleRenderData.push_back(PxDebugLine(vertex[i], vertex[i + 1], X_DIRECTION_COLOR_U)); - } - m_CircleRenderData.push_back(PxDebugLine(vertex[segment - 1], vertex[0], X_DIRECTION_COLOR_U)); - - for (int i = 0; i < segment; i++) - { - vertex[i].x = axisLength * PxCos(i * span); - vertex[i].y = 0; - vertex[i].z = axisLength * PxSin(i * span); - } - // y - for (int i = 0; i < segment - 1; i++) - { - m_CircleRenderData.push_back(PxDebugLine(vertex[i], vertex[i + 1], Y_DIRECTION_COLOR_U)); - } - m_CircleRenderData.push_back(PxDebugLine(vertex[segment - 1], vertex[0], Y_DIRECTION_COLOR_U)); - - for (int i = 0; i < segment; i++) - { - vertex[i].x = axisLength * PxCos(i * span); - vertex[i].y = axisLength * PxSin(i * span); - vertex[i].z = 0; - } - // z - for (int i = 0; i < segment - 1; i++) - { - m_CircleRenderData.push_back(PxDebugLine(vertex[i], vertex[i + 1], Z_DIRECTION_COLOR_U)); - } - m_CircleRenderData.push_back(PxDebugLine(vertex[segment - 1], vertex[0], Z_DIRECTION_COLOR_U)); - - delete[] vertex; - vertex = NULL; -} - -bool GizmoToolController::CalPlaneLineIntersectPoint(PxVec3& result, PxVec3 planeNormal, PxVec3 planePoint, PxVec3 linedirection, PxVec3 linePoint) -{ - float dot = planeNormal.dot(linedirection); - if (dot == 0) - { - return false; - } - else - { - float t = ((planePoint[0] - linePoint[0]) * planeNormal[0] + - (planePoint[1] - linePoint[1]) * planeNormal[1] + - (planePoint[2] - linePoint[2]) * planeNormal[2]) / dot; - result = linePoint + linedirection * t; - } - return true; -} - -float GizmoToolController::DistanceFromPointToLine(PxVec3& point, PxVec3& origin, PxVec3& direction, PxVec3& foot) -{ - direction = direction.getNormalized(); - PxVec3 sub = point - origin; - float t = direction.dot(sub); - foot = origin + direction * t; - PxVec3 dis = point - foot; - return dis.magnitude(); -} - -bool GizmoToolController::GetFootFromPointToPlane(PxVec3& point, PxVec3& origin, PxVec3& normal, PxVec3& foot) -{ - return CalPlaneLineIntersectPoint(foot, normal, origin, normal, point); -} - -bool GizmoToolController::GetIntersectBetweenLines(PxVec3& origin1, PxVec3& direction1, PxVec3& origin2, PxVec3& direction2, PxVec3& intersect) -{ - float test = ((origin2 - origin1).getNormalized()).dot(direction1.cross(direction2)); - if (direction1.cross(direction2).isZero()) - {// if two lines are parallel - return false; - } - else if (abs(test) >= 0.001) - {// if two lines aren't in the same plane - return false; - } - - PxVec3 normal1 = direction1.cross(direction2); - PxVec3 normal2 = normal1.cross(direction1); - normal2 = normal2.getNormalized(); - return CalPlaneLineIntersectPoint(intersect, normal2, origin1, direction2, origin2); -} - -PxQuat GizmoToolController::CalDirectionQuat(AxisType type) -{ - PxVec3 origin(0, 1, 0); - PxVec3 target = m_Axis[type]; - if (type == AT_X) - { - target *= defaultAxisModifier; - } - target = target.getNormalized(); - PxVec3 cross = origin.cross(target); - cross = cross.getNormalized(); - float cos = origin.dot(target); - float angle = PxAcos(cos); - PxQuat q(angle, cross); - return q; -} - -PxQuat GizmoToolController::CalConvertQuat() -{ - PxVec3 x_origin(1, 0, 0); - PxVec3 y_origin(0, 1, 0); - PxVec3 z_origin(0, 0, 1); - - PxVec3 x_target = m_Axis[AT_X]; - PxVec3 y_target = m_Axis[AT_Y]; - x_target = x_target.getNormalized(); - y_target = y_target.getNormalized(); - - PxVec3 x_cross = x_origin.cross(x_target); - x_cross = x_cross.getNormalized(); - float x_cos = x_origin.dot(x_target); - float x_angle = PxAcos(x_cos); - PxQuat x_quat(x_angle, x_cross); - - PxVec3 y_interval = x_quat.rotate(y_origin); - - PxVec3 y_cross = y_interval.cross(y_target); - y_cross = y_cross.getNormalized(); - float y_cos = y_interval.dot(y_target); - float y_angle = PxAcos(y_cos); - PxQuat y_quat(y_angle, y_cross); - - PxQuat q = y_quat * x_quat; - return q; -} - -void GizmoToolController::ScaleActor(bool replace) -{ - if (nullptr == m_CurrentActor) - { - return; - } - - bool isLocal = AppMainWindow::Inst().m_bGizmoWithLocal; - - if (isLocal && !CanModifyLocal(m_CurrentActor)) - { - char message[1024]; - sprintf(message, "Only unfractured model can be modify in local way in edit mode!"); - viewer_warn(message); - return; - } - - BlastFamilyPtr pBlastFamily = getBlastController().getFamilyByPxActor(*m_CurrentActor); - if (NULL == pBlastFamily) - { - return; - } - - float multiply = m_Axis[m_AxisSelected].magnitude() / defaultAxisLength; - if (m_Axis[m_AxisSelected].dot(m_LastAxis[m_AxisSelected]) < 0) - { - multiply = -multiply; - } - PxVec3 delta(1, 1, 1); - bool isShift = (GetAsyncKeyState(VK_SHIFT) && 0x8000); - if (isShift) - { - delta *= multiply; - } - else - { - delta[m_AxisSelected] = multiply; - } - PxMat44 scale = PxMat44(PxVec4(delta, 1)); - - if (!isLocal) - { - PxTransform gp = m_CurrentActor->getGlobalPose(); - uint32_t shapesCount = m_CurrentActor->getNbShapes(); - if (shapesCount > 0) - { - std::vector<PxShape*> shapes(shapesCount); - m_CurrentActor->getShapes(&shapes[0], shapesCount); - PxShape* shape = shapes[0]; - PxTransform lp = shape->getLocalPose(); - gp = gp * lp; - } - PxMat44 world = PxMat44(gp); - PxMat44 worldInv = world.inverseRT(); - scale = world * scale * worldInv; - } - - pBlastFamily->setActorScale(*m_CurrentActor, scale, replace); - - if (!replace) - { - return; - } - - scalePxActor(GetPhysXScene(), *m_CurrentActor, scale); -} - -bool GizmoToolController::CanMapToRootChunk(PxActor* actor) -{ - if (actor) - { - BlastFamily* family = getBlastController().getFamilyByPxActor(*actor); - if (family == nullptr) - return false; - - const BlastAsset& asset = family->getBlastAsset(); - uint32_t chunkIndex = family->getChunkIndexByPxActor(*actor); - - std::vector<uint32_t> chunkIndexes; - chunkIndexes.push_back(chunkIndex); - std::vector<BlastChunkNode*> chunkNodes = BlastTreeData::ins().getChunkNodeByBlastChunk(&asset, chunkIndexes); - if (chunkNodes.size() > 0) - return BlastTreeData::isRoot(chunkNodes[0]); - } - return false; -} - -bool GizmoToolController::CanModifyLocal(PxActor* actor) -{ - if (nullptr != actor - && !SampleManager::ins()->IsSimulating() - && !getBlastController().isAssetFractrued(*actor)) - { - return true; - } - - return false; -} - -void GizmoToolController::UpdateAssetInstanceTransform(const PxTransform& position) -{ - if (!m_CurrentActor) - return; - - BlastFamily* family = getBlastController().getFamilyByPxActor(*m_CurrentActor); - if (family) - { - BPPAssetInstance* bppInstance = SampleManager::ins()->getInstanceByFamily(family); - - if (bppInstance) - { - bppInstance->transform.position = *((nvidia::NvVec3*)(&position.p)); - bppInstance->transform.rotation = *((nvidia::NvVec4*)(&position.q)); - - family->initTransform(position); - // modify corresponding asset's transform, it's need to modify in future - { - const BlastAsset& asset = family->getBlastAsset(); - SampleManager* sampleManager = SampleManager::ins(); - std::map<BlastAsset*, std::vector<BlastFamily*>>& AssetFamiliesMap = sampleManager->getAssetFamiliesMap(); - std::map<BlastAsset*, AssetList::ModelAsset>& AssetDescMap = sampleManager->getAssetDescMap(); - - BlastAsset* pBlastAsset = (BlastAsset*)&asset; - - AssetList::ModelAsset& m = AssetDescMap[pBlastAsset]; - m.transform = position; - } - } - } -} - -void GizmoToolController::syncRenderableState() -{ - bool depthTest = AppMainWindow::Inst().m_bGizmoWithDepthTest; - m_AxisConeRenderable[AT_X]->setDepthTest(depthTest); - m_AxisConeRenderable[AT_Y]->setDepthTest(depthTest); - m_AxisConeRenderable[AT_Z]->setDepthTest(depthTest); - m_AxisBoxRenderable[AT_X]->setDepthTest(depthTest); - m_AxisBoxRenderable[AT_Y]->setDepthTest(depthTest); - m_AxisBoxRenderable[AT_Z]->setDepthTest(depthTest); -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/GizmoToolController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/GizmoToolController.h deleted file mode 100644 index 8586ad3..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/GizmoToolController.h +++ /dev/null @@ -1,167 +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. - - -#ifndef GIZMO_TOOL_CONTROLLER_H -#define GIZMO_TOOL_CONTROLLER_H - -#include "SampleManager.h" -#include "DebugRenderBuffer.h" -#include "NvBlastExtPxManager.h" -#include "BlastSceneTree.h" - -class Renderable; -class RenderMaterial; - -namespace Nv -{ -namespace Blast -{ -class ExtPhysicsActor; -} -} - -namespace physx -{ - class PxScene; -} - -enum AxisType -{ - AT_X = 0, - AT_Y = 1, - AT_Z = 2, - AT_Num -}; - -enum GizmoToolMode -{ - GTM_Translate = 0, - GTM_Scale, - GTM_Rotation -}; - -void modifyPxActorByLocalWay(PxScene& pxScene, PxRigidDynamic& actor, PxTransform& gp_old, PxTransform& gp_new); -void scalePxActor(PxScene& pxScene, PxRigidDynamic& actor, PxMat44& scale); - -class GizmoToolController : public ISampleController, public ISceneObserver -{ -public: - GizmoToolController(); - virtual ~GizmoToolController(); - - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual void Animate(double dt); - void drawUI(); - - virtual void onInitialize(); - virtual void onSampleStart(); - virtual void onSampleStop(); - - virtual void dataSelected(std::vector<BlastNode*> selections); - - void setGizmoToolMode(GizmoToolMode mode); - GizmoToolMode getGizmoToolMode() { return m_GizmoToolMode; } - void setAxisSelected(AxisType type); - void setAxisLength(float axisLength); - void showAxisRenderables(bool show); - void resetPos(); - void setTargetActor(PxActor* actor); - PxActor* getTargetActor(); - void syncRenderableState(); - bool CanMapToRootChunk(PxActor* actor); - -private: - GizmoToolController& operator= (GizmoToolController&); - - //////// private methods //////// - - physx::PxScene& GetPhysXScene(); - void UpdateCircleRenderData(float axisLength); - bool CalPlaneLineIntersectPoint(PxVec3& result, PxVec3 planeNormal, PxVec3 planePoint, PxVec3 linedirection, PxVec3 linePoint); - float DistanceFromPointToLine(PxVec3& point, PxVec3& origin, PxVec3& direction, PxVec3& foot); - bool GetFootFromPointToPlane(PxVec3& point, PxVec3& origin, PxVec3& normal, PxVec3& foot); - bool GetIntersectBetweenLines(PxVec3& origin1, PxVec3& direction1, PxVec3& origin2, PxVec3& direction2, PxVec3& intersect); - PxQuat CalDirectionQuat(AxisType type); - PxQuat CalConvertQuat(); - void ScaleActor(bool replace); - - bool CanModifyLocal(PxActor* actor); - void UpdateAssetInstanceTransform(const PxTransform& position); - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - PhysXController& getPhysXController() const - { - return getManager()->getPhysXController(); - } - - BlastController& getBlastController() const - { - return getManager()->getBlastController(); - } - - SelectionToolController& getSelectionToolController() const - { - return getManager()->getSelectionToolController(); - } - - //////// internal data //////// - - GizmoToolMode m_GizmoToolMode; - - bool m_bGizmoFollowed; - PxVec3 m_LastEyeRay; - PxVec3 m_LastFoot; - PxVec3 m_LastAxis[AT_Num]; - - PxRigidDynamic* m_CurrentActor; - - bool m_bNeedResetPos; - bool m_bNeedResetColor; - - PxVec3 m_TargetPos; - PxVec3 m_Axis[AT_Num]; - AxisType m_AxisSelected; - Renderable* m_AxisConeRenderable[AT_Num]; - Renderable* m_AxisBoxRenderable[AT_Num]; - - RenderMaterial* m_AxisRenderMaterial; - DebugRenderBuffer m_AxisRenderBuffer; - - std::vector<PxDebugLine> m_CircleRenderData; - DebugRenderBuffer m_CircleRenderBuffer; - - std::vector<BlastAssetInstanceNode*> m_assetInstances; -}; - -#endif // GIZMO_TOOL_CONTROLLER_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/SelectionToolController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/SelectionToolController.cpp deleted file mode 100644 index 4232fe4..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/SelectionToolController.cpp +++ /dev/null @@ -1,493 +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 "SelectionToolController.h" -#include "RenderUtils.h" -#include "BlastController.h" -#include "Renderer.h" -#include "PhysXController.h" -#include "SampleProfiler.h" -#include "GizmoToolController.h" - -#include <imgui.h> - -#include "NvBlastTkActor.h" -#include "NvBlastExtDamageShaders.h" - -#include "PxRigidDynamic.h" -#include "PxScene.h" -#include "BlastSceneTree.h" -#include "SimpleScene.h" -using namespace Nv::Blast; -using namespace physx; - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Setup -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -SelectionToolController::SelectionToolController() -{ - m_bRectSelecting = false; - m_bDrawSelecting = false; - m_bSelecting = false; - m_ScreenRenderBuffer.clear(); - m_DrawSelectScreenPos.clear(); - - BlastSceneTree::ins()->addObserver(this); -} - -SelectionToolController::~SelectionToolController() -{ -} - -void SelectionToolController::onSampleStart() -{ -} - -void SelectionToolController::onInitialize() -{ -} - - -void SelectionToolController::onSampleStop() -{ -} - -void SelectionToolController::dataSelected(std::vector<BlastNode*> selections) -{ - m_actorsSelected.clear(); - - BlastController& blastController = getBlastController(); - std::vector<BlastFamilyPtr>& families = blastController.getFamilies(); - - for (BlastFamily* family : families) - { - std::vector<uint32_t> selectedChunks = family->getSelectedChunks(); - for (uint32_t chunkIndex : selectedChunks) - { - PxActor* actor = nullptr; - family->getPxActorByChunkIndex(chunkIndex, &actor); - - if (actor) - { - m_actorsSelected.emplace(actor); - } - } - } -} - -void SelectionToolController::Animate(double dt) -{ - PROFILER_SCOPED_FUNCTION(); - - if (m_ScreenRenderBuffer.getNbLines() > 0) - { - getRenderer().queueRenderBuffer(&m_ScreenRenderBuffer, true); - } -} - - -LRESULT SelectionToolController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - PROFILER_SCOPED_FUNCTION(); - - if (uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONDOWN || uMsg == WM_MOUSEMOVE || uMsg == WM_LBUTTONUP || uMsg == WM_RBUTTONUP) - { - float mouseX = (short)LOWORD(lParam) / getRenderer().getScreenWidth(); - float mouseY = (short)HIWORD(lParam) / getRenderer().getScreenHeight(); - - if (uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONDOWN) - { - m_ScreenRenderBuffer.clear(); - - bool isCtrl = (GetAsyncKeyState(VK_CONTROL) && 0x8000); - bool isAlt = (GetAsyncKeyState(VK_MENU) && 0x8000); - bool isLight = (GetAsyncKeyState('L') && 0x8000); - // ctrl+leftbutton is used for light changing - // alt+leftbutton is used for camera rotate movement in AppMainWindow.cpp - // so, we use rect select when ctrl and alt off - bool Selecting = !(isAlt || isLight);// !(isCtrl || isAlt); - - if (uMsg == WM_LBUTTONDOWN && !m_bDrawSelecting) - { - m_RectSelectScreenPos.x = mouseX; - m_RectSelectScreenPos.y = mouseY; - - m_bRectSelecting = Selecting; - } - else // uMsg == WM_RBUTTONDOWN - { - m_DrawSelectScreenPos.push_back(PxVec2(mouseX, mouseY)); - - m_bDrawSelecting = Selecting; - } - - m_bSelecting = m_bRectSelecting || m_bDrawSelecting; - } - else if (uMsg == WM_MOUSEMOVE) - { - if (m_bRectSelecting) - { - float left, right, top, bottom; - left = right = mouseX; - top = bottom = mouseY; - if (mouseX > m_RectSelectScreenPos.x) - { - left = m_RectSelectScreenPos.x; - } - else - { - right = m_RectSelectScreenPos.x; - } - if (mouseY > m_RectSelectScreenPos.y) - { - top = m_RectSelectScreenPos.y; - } - else - { - bottom = m_RectSelectScreenPos.y; - } - - m_ScreenRenderBuffer.clear(); - - PxVec3 left_top(left, top, 0); - PxVec3 left_bottom(left, bottom, 0); - PxVec3 right_bottom(right, bottom, 0); - PxVec3 right_top(right, top, 0); - DirectX::XMFLOAT4 LINE_COLOR(1.0f, 0.0f, 0.0f, 1.0f); - m_ScreenRenderBuffer.m_lines.push_back(PxDebugLine(left_top, left_bottom, XMFLOAT4ToU32Color(LINE_COLOR))); - m_ScreenRenderBuffer.m_lines.push_back(PxDebugLine(left_bottom, right_bottom, XMFLOAT4ToU32Color(LINE_COLOR))); - m_ScreenRenderBuffer.m_lines.push_back(PxDebugLine(right_bottom, right_top, XMFLOAT4ToU32Color(LINE_COLOR))); - m_ScreenRenderBuffer.m_lines.push_back(PxDebugLine(right_top, left_top, XMFLOAT4ToU32Color(LINE_COLOR))); - } - } - else if (uMsg == WM_LBUTTONUP) - { - bool isAlt = (GetAsyncKeyState(VK_MENU) && 0x8000); - bool isLight = (GetAsyncKeyState('L') && 0x8000); - if (m_bSelecting && !(isAlt || isLight)) - { - bool isShift = (GetAsyncKeyState(VK_SHIFT) && 0x8000); - bool isCtrl = (GetAsyncKeyState(VK_CONTROL) && 0x8000); - - SelectMode selectMode = SM_RESET; - if (isShift && isCtrl) - { - selectMode = SM_REMAIN; - } - else if (isShift) - { - selectMode = SM_ADD; - } - else if (isCtrl) - { - selectMode = SM_SUB; - } - - Renderer* pRenderer = Renderer::Inst(); - std::vector<PxVec2> screenPoints; - std::map<int, std::set<int>> selection; - - if (m_bRectSelecting) - { - int width = getRenderer().getScreenWidth(); - int height = getRenderer().getScreenHeight(); - int deltaX = (mouseX - m_RectSelectScreenPos.x) * width; - int deltaY = (mouseY - m_RectSelectScreenPos.y) * height; - float distance = deltaX * deltaX + deltaY * deltaY; - if (distance < 1) - { - // point select - screenPoints.push_back(m_RectSelectScreenPos); - } - else - { - // rect select - float left, right, top, bottom; - left = right = mouseX; - top = bottom = mouseY; - if (mouseX > m_RectSelectScreenPos.x) - { - left = m_RectSelectScreenPos.x; - } - else - { - right = m_RectSelectScreenPos.x; - } - if (mouseY > m_RectSelectScreenPos.y) - { - top = m_RectSelectScreenPos.y; - } - else - { - bottom = m_RectSelectScreenPos.y; - } - - screenPoints.push_back(PxVec2(left, top)); - screenPoints.push_back(PxVec2(right, bottom)); - } - } - else if(m_bDrawSelecting) - { - // draw select - if (m_DrawSelectScreenPos.size() > 2) - { - screenPoints.swap(m_DrawSelectScreenPos); - } - } - - pRenderer->fetchSelection(screenPoints, selection); - - std::set<PxActor*> actors; - PxActor* pActor; - BlastController& blastController = getBlastController(); - for (std::pair<int, std::set<int>> familychunksId : selection) - { - BlastFamily* pBlastFamily = blastController.getFamilyById(familychunksId.first); - std::set<int>& chunkIds = familychunksId.second; - for (int chunkId : chunkIds) - { - pBlastFamily->getPxActorByChunkIndex(chunkId, &pActor); - if (pActor != nullptr) - { - actors.emplace(pActor); - } - } - } - rangeSelect(actors, selectMode); - } - - m_DrawSelectScreenPos.clear(); - m_ScreenRenderBuffer.clear(); - m_bRectSelecting = false; - m_bDrawSelecting = false; - m_bSelecting = false; - } - else if (uMsg == WM_RBUTTONUP) - { - /* - if (m_actorsSelected.size() > 1) - { - return 1; - } - */ - if (m_bDrawSelecting) - { - m_ScreenRenderBuffer.clear(); - - DirectX::XMFLOAT4 LINE_COLOR(1.0f, 0.0f, 0.0f, 1.0f); - - int size = m_DrawSelectScreenPos.size() - 1; - if (size == 0) - { - return 1; - } - - PxVec3 from(0, 0, 0); - PxVec3 to(0, 0, 0); - for (int i = 0; i < size; i++) - { - from.x = m_DrawSelectScreenPos[i].x; - from.y = m_DrawSelectScreenPos[i].y; - to.x = m_DrawSelectScreenPos[i + 1].x; - to.y = m_DrawSelectScreenPos[i + 1].y; - m_ScreenRenderBuffer.m_lines.push_back( - PxDebugLine(from, to, XMFLOAT4ToU32Color(LINE_COLOR))); - } - // connect tail and head to close - from.x = m_DrawSelectScreenPos[0].x; - from.y = m_DrawSelectScreenPos[0].y; - m_ScreenRenderBuffer.m_lines.push_back( - PxDebugLine(to, from, XMFLOAT4ToU32Color(LINE_COLOR))); - } - } - } - - return 1; -} - -void SelectionToolController::drawUI() -{ -} - -void SelectionToolController::pointSelect(PxActor* actor, SelectMode selectMode) -{ - std::set<PxActor*> actors; - actors.emplace(actor); - rangeSelect(actors, selectMode); -} - -void SelectionToolController::rangeSelect(std::set<PxActor*>& actorsToSelect, SelectMode selectMode) -{ - if (selectMode == SM_RESET) - { - clearSelect(); - - for (PxActor* actor : actorsToSelect) - { - if (getBlastController().isActorVisible(*actor)) - { - setActorSelected(*actor, true); - m_actorsSelected.emplace(actor); - } - } - } - else if (selectMode == SM_ADD) - { - for (PxActor* actor : actorsToSelect) - { - if (getBlastController().isActorVisible(*actor)) - { - setActorSelected(*actor, true); - m_actorsSelected.emplace(actor); - } - } - } - else if (selectMode == SM_SUB) - { - for (PxActor* actor : actorsToSelect) - { - setActorSelected(*actor, false); - m_actorsSelected.erase(actor); - } - } - - BlastSceneTree::ins()->updateChunkItemSelection(); - trySelectAssetInstanceNode(m_actorsSelected); -} - -void SelectionToolController::clearSelect() -{ - for (PxActor* actor : m_actorsSelected) - { - setActorSelected(*actor, false); - } - - m_actorsSelected.clear(); - SampleManager::ins()->clearChunksSelected(); -} - -void SelectionToolController::setTargetActor(PxActor* actor) -{ - if (actor == nullptr) - { - return; - } - - setActorSelected(*actor, true); - m_actorsSelected.emplace(actor); - - BlastSceneTree::ins()->updateChunkItemSelection(); - trySelectAssetInstanceNode(m_actorsSelected); -} - -PxActor* SelectionToolController::getTargetActor() -{ - PxActor* targetActor = nullptr; - if (m_actorsSelected.size() > 0) - { - targetActor = *m_actorsSelected.begin(); - } - return targetActor; -} - -void SelectionToolController::setTargetActors(std::set<PxActor*>& actors) -{ - for (PxActor* actor : actors) - { - setActorSelected(*actor, true); - m_actorsSelected.emplace(actor); - } - - BlastSceneTree::ins()->updateChunkItemSelection(); - trySelectAssetInstanceNode(m_actorsSelected); -} - -std::set<PxActor*> SelectionToolController::getTargetActors() -{ - return m_actorsSelected; -} - -void SelectionToolController::trySelectAssetInstanceNode(std::set<PxActor*>& selectedActors) -{ - BlastController& blastController = getBlastController(); - GizmoToolController& gizmoToolController = getManager()->getGizmoToolController(); - - for (PxActor* actor : selectedActors) - { - if (gizmoToolController.CanMapToRootChunk(actor)) - { - BlastFamily* family = getBlastController().getFamilyByPxActor(*actor); - BlastSceneTree::ins()->selectTreeItem(family); - } - } -} - -physx::PxScene& SelectionToolController::GetPhysXScene() -{ - if (getManager()->IsSimulating()) - { - return getPhysXController().getPhysXScene(); - } - else - { - return getPhysXController().getEditPhysXScene(); - } -} - -void SelectionToolController::setActorSelected(const PxActor& actor, bool selected) -{ - std::vector<BlastFamilyPtr>& families = getBlastController().getFamilies(); - if (families.size() == 0) - { - return; - } - - BlastFamilyPtr pBlastFamily = NULL; - std::vector<BlastFamilyPtr>::iterator it = families.begin(); - for (; it != families.end(); it++) - { - BlastFamilyPtr f = *it; - if (f->find(actor)) - { - pBlastFamily = f; - break; - } - } - if (NULL == pBlastFamily) - { - return; - } - - pBlastFamily->setActorSelected(actor, selected); -}
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/SelectionToolController.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/SelectionToolController.h deleted file mode 100644 index d90ae36..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/SelectionToolController.h +++ /dev/null @@ -1,121 +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. - - -#ifndef SELECTION_TOOL_CONTROLLER_H -#define SELECTION_TOOL_CONTROLLER_H - -#include "SampleManager.h" -#include "PxVec2.h" -#include "PxVec3.h" -#include "DebugRenderBuffer.h" -#include "BlastFamily.h" -#include "NvBlastExtPxManager.h" -#include "BlastSceneTree.h" - -class Renderable; -class RenderMaterial; - -namespace Nv -{ -namespace Blast -{ -class ExtPxActor; -} -} - -namespace physx -{ - class PxScene; -} - -class SelectionToolController : public ISampleController, public ISceneObserver -{ -public: - SelectionToolController(); - virtual ~SelectionToolController(); - - virtual LRESULT MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); - virtual void Animate(double dt); - void drawUI(); - - virtual void onInitialize(); - virtual void onSampleStart(); - virtual void onSampleStop(); - - virtual void dataSelected(std::vector<BlastNode*> selections); - - void pointSelect(PxActor* actor, SelectMode selectMode = SM_RESET); - void rangeSelect(std::set<PxActor*>& actors, SelectMode selectMode = SM_RESET); - void clearSelect(); - - void setTargetActor(PxActor* actor); - PxActor* getTargetActor(); - - void setTargetActors(std::set<PxActor*>& actors); - std::set<PxActor*> getTargetActors(); - - void trySelectAssetInstanceNode(std::set<PxActor*>& selectedActors); - -private: - SelectionToolController& operator= (SelectionToolController&); - - //////// private methods //////// - - physx::PxScene& GetPhysXScene(); - - //////// used controllers //////// - - Renderer& getRenderer() const - { - return getManager()->getRenderer(); - } - - PhysXController& getPhysXController() const - { - return getManager()->getPhysXController(); - } - - BlastController& getBlastController() const - { - return getManager()->getBlastController(); - } - - //////// internal data //////// - - PxVec2 m_RectSelectScreenPos; - bool m_bRectSelecting; - std::vector<PxVec2> m_DrawSelectScreenPos; - bool m_bDrawSelecting; - DebugRenderBuffer m_ScreenRenderBuffer; - bool m_bSelecting; - - void setActorSelected(const PxActor& actor, bool selected); - std::set<PxActor*> m_actorsSelected; -}; - -#endif // SELECTION_TOOL_CONTROLLER_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/imgui_impl_dx11.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/imgui_impl_dx11.cpp deleted file mode 100644 index 11f66f0..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/imgui_impl_dx11.cpp +++ /dev/null @@ -1,583 +0,0 @@ -// ImGui Win32 + DirectX11 binding -// In this binding, ImTextureID is used to store a 'ID3D11ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp. - -// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this. -// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown(). -// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp. -// https://github.com/ocornut/imgui - -#include <imgui.h> -#include "imgui_impl_dx11.h" - -// DirectX -#include <d3d11.h> -#include <d3dcompiler.h> -#define DIRECTINPUT_VERSION 0x0800 -#include <dinput.h> - -// Data -static INT64 g_Time = 0; -static INT64 g_TicksPerSecond = 0; - -static HWND g_hWnd = 0; -static ID3D11Device* g_pd3dDevice = NULL; -static ID3D11DeviceContext* g_pd3dDeviceContext = NULL; -static ID3D11Buffer* g_pVB = NULL; -static ID3D11Buffer* g_pIB = NULL; -static ID3D10Blob * g_pVertexShaderBlob = NULL; -static ID3D11VertexShader* g_pVertexShader = NULL; -static ID3D11InputLayout* g_pInputLayout = NULL; -static ID3D11Buffer* g_pVertexConstantBuffer = NULL; -static ID3D10Blob * g_pPixelShaderBlob = NULL; -static ID3D11PixelShader* g_pPixelShader = NULL; -static ID3D11SamplerState* g_pFontSampler = NULL; -static ID3D11ShaderResourceView*g_pFontTextureView = NULL; -static ID3D11RasterizerState* g_pRasterizerState = NULL; -static ID3D11BlendState* g_pBlendState = NULL; -static ID3D11DepthStencilState* g_pDepthStencilState = NULL; -static int g_VertexBufferSize = 5000, g_IndexBufferSize = 10000; - -struct VERTEX_CONSTANT_BUFFER -{ - float mvp[4][4]; -}; - -// This is the main rendering function that you have to implement and provide to ImGui (via setting up 'RenderDrawListsFn' in the ImGuiIO structure) -// If text or lines are blurry when integrating ImGui in your engine: -// - in your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f) -void ImGui_ImplDX11_RenderDrawLists(ImDrawData* draw_data) -{ - ID3D11DeviceContext* ctx = g_pd3dDeviceContext; - - // Create and grow vertex/index buffers if needed - if (!g_pVB || g_VertexBufferSize < draw_data->TotalVtxCount) - { - if (g_pVB) { g_pVB->Release(); g_pVB = NULL; } - g_VertexBufferSize = draw_data->TotalVtxCount + 5000; - D3D11_BUFFER_DESC desc; - memset(&desc, 0, sizeof(D3D11_BUFFER_DESC)); - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.ByteWidth = g_VertexBufferSize * sizeof(ImDrawVert); - desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - desc.MiscFlags = 0; - if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVB) < 0) - return; - } - if (!g_pIB || g_IndexBufferSize < draw_data->TotalIdxCount) - { - if (g_pIB) { g_pIB->Release(); g_pIB = NULL; } - g_IndexBufferSize = draw_data->TotalIdxCount + 10000; - D3D11_BUFFER_DESC desc; - memset(&desc, 0, sizeof(D3D11_BUFFER_DESC)); - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.ByteWidth = g_IndexBufferSize * sizeof(ImDrawIdx); - desc.BindFlags = D3D11_BIND_INDEX_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - if (g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pIB) < 0) - return; - } - - // Copy and convert all vertices into a single contiguous buffer - D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource; - if (ctx->Map(g_pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK) - return; - if (ctx->Map(g_pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK) - return; - ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData; - ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData; - for (int n = 0; n < draw_data->CmdListsCount; n++) - { - const ImDrawList* cmd_list = draw_data->CmdLists[n]; - memcpy(vtx_dst, &cmd_list->VtxBuffer[0], cmd_list->VtxBuffer.size() * sizeof(ImDrawVert)); - memcpy(idx_dst, &cmd_list->IdxBuffer[0], cmd_list->IdxBuffer.size() * sizeof(ImDrawIdx)); - vtx_dst += cmd_list->VtxBuffer.size(); - idx_dst += cmd_list->IdxBuffer.size(); - } - ctx->Unmap(g_pVB, 0); - ctx->Unmap(g_pIB, 0); - - // Setup orthographic projection matrix into our constant buffer - { - D3D11_MAPPED_SUBRESOURCE mapped_resource; - if (ctx->Map(g_pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK) - return; - VERTEX_CONSTANT_BUFFER* constant_buffer = (VERTEX_CONSTANT_BUFFER*)mapped_resource.pData; - float L = 0.0f; - float R = ImGui::GetIO().DisplaySize.x; - float B = ImGui::GetIO().DisplaySize.y; - float T = 0.0f; - float mvp[4][4] = - { - { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, - { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, - { 0.0f, 0.0f, 0.5f, 0.0f }, - { (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f }, - }; - memcpy(&constant_buffer->mvp, mvp, sizeof(mvp)); - ctx->Unmap(g_pVertexConstantBuffer, 0); - } - - // Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!) - struct BACKUP_DX11_STATE - { - UINT ScissorRectsCount, ViewportsCount; - D3D11_RECT ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; - D3D11_VIEWPORT Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; - ID3D11RasterizerState* RS; - ID3D11BlendState* BlendState; - FLOAT BlendFactor[4]; - UINT SampleMask; - UINT StencilRef; - ID3D11DepthStencilState* DepthStencilState; - ID3D11ShaderResourceView* PSShaderResource; - ID3D11SamplerState* PSSampler; - ID3D11PixelShader* PS; - ID3D11VertexShader* VS; - UINT PSInstancesCount, VSInstancesCount; - ID3D11ClassInstance* PSInstances[256], *VSInstances[256]; // 256 is max according to PSSetShader documentation - D3D11_PRIMITIVE_TOPOLOGY PrimitiveTopology; - ID3D11Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer; - UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset; - DXGI_FORMAT IndexBufferFormat; - ID3D11InputLayout* InputLayout; - }; - BACKUP_DX11_STATE old; - old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; - ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects); - ctx->RSGetViewports(&old.ViewportsCount, old.Viewports); - ctx->RSGetState(&old.RS); - ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask); - ctx->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef); - ctx->PSGetShaderResources(0, 1, &old.PSShaderResource); - ctx->PSGetSamplers(0, 1, &old.PSSampler); - old.PSInstancesCount = old.VSInstancesCount = 256; - ctx->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount); - ctx->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount); - ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer); - ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology); - ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset); - ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); - ctx->IAGetInputLayout(&old.InputLayout); - - // Setup viewport - D3D11_VIEWPORT vp; - memset(&vp, 0, sizeof(D3D11_VIEWPORT)); - vp.Width = ImGui::GetIO().DisplaySize.x; - vp.Height = ImGui::GetIO().DisplaySize.y; - vp.MinDepth = 0.0f; - vp.MaxDepth = 1.0f; - vp.TopLeftX = vp.TopLeftY = 0.0f; - ctx->RSSetViewports(1, &vp); - - // Bind shader and vertex buffers - unsigned int stride = sizeof(ImDrawVert); - unsigned int offset = 0; - ctx->IASetInputLayout(g_pInputLayout); - ctx->IASetVertexBuffers(0, 1, &g_pVB, &stride, &offset); - ctx->IASetIndexBuffer(g_pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0); - ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); - ctx->VSSetShader(g_pVertexShader, NULL, 0); - ctx->VSSetConstantBuffers(0, 1, &g_pVertexConstantBuffer); - ctx->PSSetShader(g_pPixelShader, NULL, 0); - ctx->PSSetSamplers(0, 1, &g_pFontSampler); - - // Setup render state - const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f }; - ctx->OMSetBlendState(g_pBlendState, blend_factor, 0xffffffff); - ctx->OMSetDepthStencilState(g_pDepthStencilState, 0); - ctx->RSSetState(g_pRasterizerState); - - // Render command lists - int vtx_offset = 0; - int idx_offset = 0; - for (int n = 0; n < draw_data->CmdListsCount; n++) - { - const ImDrawList* cmd_list = draw_data->CmdLists[n]; - for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.size(); cmd_i++) - { - const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; - if (pcmd->UserCallback) - { - pcmd->UserCallback(cmd_list, pcmd); - } - else - { - const D3D11_RECT r = { (LONG)pcmd->ClipRect.x, (LONG)pcmd->ClipRect.y, (LONG)pcmd->ClipRect.z, (LONG)pcmd->ClipRect.w }; - ctx->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView**)&pcmd->TextureId); - ctx->RSSetScissorRects(1, &r); - ctx->DrawIndexed(pcmd->ElemCount, idx_offset, vtx_offset); - } - idx_offset += pcmd->ElemCount; - } - vtx_offset += cmd_list->VtxBuffer.size(); - } - - // Restore modified DX state - ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects); - ctx->RSSetViewports(old.ViewportsCount, old.Viewports); - ctx->RSSetState(old.RS); if (old.RS) old.RS->Release(); - ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release(); - ctx->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release(); - ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release(); - ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release(); - ctx->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release(); - for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release(); - ctx->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release(); - ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release(); - for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release(); - ctx->IASetPrimitiveTopology(old.PrimitiveTopology); - ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release(); - ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release(); - ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release(); -} - -IMGUI_API LRESULT ImGui_ImplDX11_WndProcHandler(HWND, UINT msg, WPARAM wParam, LPARAM lParam) -{ - ImGuiIO& io = ImGui::GetIO(); - switch (msg) - { - case WM_LBUTTONDOWN: - io.MouseDown[0] = true; - return true; - case WM_LBUTTONUP: - io.MouseDown[0] = false; - return true; - case WM_RBUTTONDOWN: - io.MouseDown[1] = true; - return true; - case WM_RBUTTONUP: - io.MouseDown[1] = false; - return true; - case WM_MBUTTONDOWN: - io.MouseDown[2] = true; - return true; - case WM_MBUTTONUP: - io.MouseDown[2] = false; - return true; - case WM_MOUSEWHEEL: - io.MouseWheel += GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1.0f : -1.0f; - return true; - case WM_MOUSEMOVE: - io.MousePos.x = (signed short)(lParam); - io.MousePos.y = (signed short)(lParam >> 16); - return true; - case WM_KEYDOWN: - if (wParam < 256) - io.KeysDown[wParam] = 1; - return true; - case WM_KEYUP: - if (wParam < 256) - io.KeysDown[wParam] = 0; - return true; - case WM_CHAR: - // You can also use ToAscii()+GetKeyboardState() to retrieve characters. - if (wParam > 0 && wParam < 0x10000) - io.AddInputCharacter((unsigned short)wParam); - return true; - } - return 0; -} - -static void ImGui_ImplDX11_CreateFontsTexture() -{ - // Build texture atlas - ImGuiIO& io = ImGui::GetIO(); - unsigned char* pixels; - int width, height; - io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); - - // Upload texture to graphics system - { - D3D11_TEXTURE2D_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Width = width; - desc.Height = height; - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - desc.CPUAccessFlags = 0; - - ID3D11Texture2D *pTexture = NULL; - D3D11_SUBRESOURCE_DATA subResource; - subResource.pSysMem = pixels; - subResource.SysMemPitch = desc.Width * 4; - subResource.SysMemSlicePitch = 0; - g_pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture); - - // Create texture view - D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; - ZeroMemory(&srvDesc, sizeof(srvDesc)); - srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = desc.MipLevels; - srvDesc.Texture2D.MostDetailedMip = 0; - g_pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &g_pFontTextureView); - pTexture->Release(); - } - - // Store our identifier - io.Fonts->TexID = (void *)g_pFontTextureView; - - // Create texture sampler - { - D3D11_SAMPLER_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; - desc.MipLODBias = 0.f; - desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; - desc.MinLOD = 0.f; - desc.MaxLOD = 0.f; - g_pd3dDevice->CreateSamplerState(&desc, &g_pFontSampler); - } -} - -bool ImGui_ImplDX11_CreateDeviceObjects() -{ - if (!g_pd3dDevice) - return false; - if (g_pFontSampler) - ImGui_ImplDX11_InvalidateDeviceObjects(); - - // By using D3DCompile() from <d3dcompiler.h> / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A) - // If you would like to use this DX11 sample code but remove this dependency you can: - // 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [prefered solution] - // 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL. - // See https://github.com/ocornut/imgui/pull/638 for sources and details. - - // Create the vertex shader - { - static const char* vertexShader = - "cbuffer vertexBuffer : register(b0) \ - {\ - float4x4 ProjectionMatrix; \ - };\ - struct VS_INPUT\ - {\ - float2 pos : POSITION;\ - float4 col : COLOR0;\ - float2 uv : TEXCOORD0;\ - };\ - \ - struct PS_INPUT\ - {\ - float4 pos : SV_POSITION;\ - float4 col : COLOR0;\ - float2 uv : TEXCOORD0;\ - };\ - \ - PS_INPUT main(VS_INPUT input)\ - {\ - PS_INPUT output;\ - output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\ - output.col = input.col;\ - output.uv = input.uv;\ - return output;\ - }"; - - D3DCompile(vertexShader, strlen(vertexShader), NULL, NULL, NULL, "main", "vs_4_0", 0, 0, &g_pVertexShaderBlob, NULL); - if (g_pVertexShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! - return false; - if (g_pd3dDevice->CreateVertexShader((DWORD*)g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), NULL, &g_pVertexShader) != S_OK) - return false; - - // Create the input layout - D3D11_INPUT_ELEMENT_DESC local_layout[] = { - { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (size_t)(&((ImDrawVert*)0)->uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (size_t)(&((ImDrawVert*)0)->col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, - }; - if (g_pd3dDevice->CreateInputLayout(local_layout, 3, g_pVertexShaderBlob->GetBufferPointer(), g_pVertexShaderBlob->GetBufferSize(), &g_pInputLayout) != S_OK) - return false; - - // Create the constant buffer - { - D3D11_BUFFER_DESC desc; - desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER); - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - desc.MiscFlags = 0; - g_pd3dDevice->CreateBuffer(&desc, NULL, &g_pVertexConstantBuffer); - } - } - - // Create the pixel shader - { - static const char* pixelShader = - "struct PS_INPUT\ - {\ - float4 pos : SV_POSITION;\ - float4 col : COLOR0;\ - float2 uv : TEXCOORD0;\ - };\ - sampler sampler0;\ - Texture2D texture0;\ - \ - float4 main(PS_INPUT input) : SV_Target\ - {\ - float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \ - return out_col; \ - }"; - - D3DCompile(pixelShader, strlen(pixelShader), NULL, NULL, NULL, "main", "ps_4_0", 0, 0, &g_pPixelShaderBlob, NULL); - if (g_pPixelShaderBlob == NULL) // NB: Pass ID3D10Blob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! - return false; - if (g_pd3dDevice->CreatePixelShader((DWORD*)g_pPixelShaderBlob->GetBufferPointer(), g_pPixelShaderBlob->GetBufferSize(), NULL, &g_pPixelShader) != S_OK) - return false; - } - - // Create the blending setup - { - D3D11_BLEND_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.AlphaToCoverageEnable = false; - desc.RenderTarget[0].BlendEnable = true; - desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; - desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; - desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; - desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; - desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; - g_pd3dDevice->CreateBlendState(&desc, &g_pBlendState); - } - - // Create the rasterizer state - { - D3D11_RASTERIZER_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.FillMode = D3D11_FILL_SOLID; - desc.CullMode = D3D11_CULL_NONE; - desc.ScissorEnable = true; - desc.DepthClipEnable = true; - g_pd3dDevice->CreateRasterizerState(&desc, &g_pRasterizerState); - } - - // Create depth-stencil State - { - D3D11_DEPTH_STENCIL_DESC desc; - ZeroMemory(&desc, sizeof(desc)); - desc.DepthEnable = false; - desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - desc.DepthFunc = D3D11_COMPARISON_ALWAYS; - desc.StencilEnable = false; - desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; - desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; - desc.BackFace = desc.FrontFace; - g_pd3dDevice->CreateDepthStencilState(&desc, &g_pDepthStencilState); - } - - ImGui_ImplDX11_CreateFontsTexture(); - - return true; -} - -void ImGui_ImplDX11_InvalidateDeviceObjects() -{ - if (!g_pd3dDevice) - return; - - if (g_pFontSampler) { g_pFontSampler->Release(); g_pFontSampler = NULL; } - if (g_pFontTextureView) { g_pFontTextureView->Release(); g_pFontTextureView = NULL; ImGui::GetIO().Fonts->TexID = 0; } - if (g_pIB) { g_pIB->Release(); g_pIB = NULL; } - if (g_pVB) { g_pVB->Release(); g_pVB = NULL; } - - if (g_pBlendState) { g_pBlendState->Release(); g_pBlendState = NULL; } - if (g_pDepthStencilState) { g_pDepthStencilState->Release(); g_pDepthStencilState = NULL; } - if (g_pRasterizerState) { g_pRasterizerState->Release(); g_pRasterizerState = NULL; } - if (g_pPixelShader) { g_pPixelShader->Release(); g_pPixelShader = NULL; } - if (g_pPixelShaderBlob) { g_pPixelShaderBlob->Release(); g_pPixelShaderBlob = NULL; } - if (g_pVertexConstantBuffer) { g_pVertexConstantBuffer->Release(); g_pVertexConstantBuffer = NULL; } - if (g_pInputLayout) { g_pInputLayout->Release(); g_pInputLayout = NULL; } - if (g_pVertexShader) { g_pVertexShader->Release(); g_pVertexShader = NULL; } - if (g_pVertexShaderBlob) { g_pVertexShaderBlob->Release(); g_pVertexShaderBlob = NULL; } -} - -bool ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context) -{ - g_hWnd = (HWND)hwnd; - g_pd3dDevice = device; - g_pd3dDeviceContext = device_context; - - if (!QueryPerformanceFrequency((LARGE_INTEGER *)&g_TicksPerSecond)) - return false; - if (!QueryPerformanceCounter((LARGE_INTEGER *)&g_Time)) - return false; - - ImGuiIO& io = ImGui::GetIO(); - io.KeyMap[ImGuiKey_Tab] = VK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime. - io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT; - io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT; - io.KeyMap[ImGuiKey_UpArrow] = VK_UP; - io.KeyMap[ImGuiKey_DownArrow] = VK_DOWN; - io.KeyMap[ImGuiKey_PageUp] = VK_PRIOR; - io.KeyMap[ImGuiKey_PageDown] = VK_NEXT; - io.KeyMap[ImGuiKey_Home] = VK_HOME; - io.KeyMap[ImGuiKey_End] = VK_END; - io.KeyMap[ImGuiKey_Delete] = VK_DELETE; - io.KeyMap[ImGuiKey_Backspace] = VK_BACK; - io.KeyMap[ImGuiKey_Enter] = VK_RETURN; - io.KeyMap[ImGuiKey_Escape] = VK_ESCAPE; - io.KeyMap[ImGuiKey_A] = 'A'; - io.KeyMap[ImGuiKey_C] = 'C'; - io.KeyMap[ImGuiKey_V] = 'V'; - io.KeyMap[ImGuiKey_X] = 'X'; - io.KeyMap[ImGuiKey_Y] = 'Y'; - io.KeyMap[ImGuiKey_Z] = 'Z'; - - io.RenderDrawListsFn = ImGui_ImplDX11_RenderDrawLists; // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer. - io.ImeWindowHandle = g_hWnd; - - return true; -} - -void ImGui_ImplDX11_Shutdown() -{ - ImGui_ImplDX11_InvalidateDeviceObjects(); - ImGui::Shutdown(); - g_pd3dDevice = NULL; - g_pd3dDeviceContext = NULL; - g_hWnd = (HWND)0; -} - -void ImGui_ImplDX11_NewFrame() -{ - if (!g_pFontSampler) - ImGui_ImplDX11_CreateDeviceObjects(); - - ImGuiIO& io = ImGui::GetIO(); - - // Setup display size (every frame to accommodate for window resizing) - RECT rect; - GetClientRect(g_hWnd, &rect); - io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top)); - - // Setup time step - INT64 current_time; - QueryPerformanceCounter((LARGE_INTEGER *)¤t_time); - io.DeltaTime = (float)(current_time - g_Time) / g_TicksPerSecond; - g_Time = current_time; - - // Read keyboard modifiers inputs - io.KeyCtrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0; - io.KeyShift = (GetKeyState(VK_SHIFT) & 0x8000) != 0; - io.KeyAlt = (GetKeyState(VK_MENU) & 0x8000) != 0; - io.KeySuper = false; - // io.KeysDown : filled by WM_KEYDOWN/WM_KEYUP events - // io.MousePos : filled by WM_MOUSEMOVE events - // io.MouseDown : filled by WM_*BUTTON* events - // io.MouseWheel : filled by WM_MOUSEWHEEL events - - // Hide OS mouse cursor if ImGui is drawing it - SetCursor(io.MouseDrawCursor ? NULL : LoadCursor(NULL, IDC_ARROW)); - - // Start the frame - ImGui::NewFrame(); -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/imgui_impl_dx11.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/imgui_impl_dx11.h deleted file mode 100644 index 7d6f710..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/ui/imgui_impl_dx11.h +++ /dev/null @@ -1,25 +0,0 @@ -// ImGui Win32 + DirectX11 binding -// In this binding, ImTextureID is used to store a 'ID3D11ShaderResourceView*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp. - -// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this. -// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown(). -// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp. -// https://github.com/ocornut/imgui - -struct ID3D11Device; -struct ID3D11DeviceContext; - -IMGUI_API bool ImGui_ImplDX11_Init(void* hwnd, ID3D11Device* device, ID3D11DeviceContext* device_context); -IMGUI_API void ImGui_ImplDX11_Shutdown(); -IMGUI_API void ImGui_ImplDX11_NewFrame(); - -// Use if you want to reset your rendering device without losing ImGui state. -IMGUI_API void ImGui_ImplDX11_InvalidateDeviceObjects(); -IMGUI_API bool ImGui_ImplDX11_CreateDeviceObjects(); - -// Handler for Win32 messages, update mouse/keyboard data. -// You may or not need this for your implementation, but it can serve as reference for handling inputs. -// Commented out to avoid dragging dependencies on <windows.h> types. You can copy the extern declaration in your code. -/* -IMGUI_API LRESULT ImGui_ImplDX11_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); -*/ diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/PxInputDataFromPxFileBuf.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/PxInputDataFromPxFileBuf.h deleted file mode 100644 index e309abd..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/PxInputDataFromPxFileBuf.h +++ /dev/null @@ -1,69 +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. - - -#ifndef PXINPUTDATAFROMPXFILEBUF_H -#define PXINPUTDATAFROMPXFILEBUF_H - -#include <PsFileBuffer.h> - - -// Copied from APEX -class PxInputDataFromPxFileBuf : public physx::PxInputData -{ -public: - PxInputDataFromPxFileBuf(physx::PxFileBuf& fileBuf) : mFileBuf(fileBuf) {} - - // physx::PxInputData interface - virtual uint32_t getLength() const - { - return mFileBuf.getFileLength(); - } - - virtual void seek(uint32_t offset) - { - mFileBuf.seekRead(offset); - } - - virtual uint32_t tell() const - { - return mFileBuf.tellRead(); - } - - // physx::PxInputStream interface - virtual uint32_t read(void* dest, uint32_t count) - { - return mFileBuf.read(dest, count); - } - - PX_NOCOPY(PxInputDataFromPxFileBuf) -private: - physx::PxFileBuf& mFileBuf; -}; - - -#endif //PXINPUTDATAFROMPXFILEBUF_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/SampleProfiler.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/SampleProfiler.cpp deleted file mode 100644 index cb63eeb..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/SampleProfiler.cpp +++ /dev/null @@ -1,240 +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 "SampleProfiler.h" -#include <map> -#include <iostream> -#include <fstream> -#include <stack> - -using namespace std::chrono; - -struct ProfileData -{ - steady_clock::time_point start; - - microseconds time; - microseconds prevTime; - microseconds maxTime; - uint32_t calls; - uint32_t prevCalls; - - ProfileData() : time(0), prevTime(0), maxTime(0), calls(0), prevCalls(0) - {} -}; - -struct Node -{ - ProfileData data; - std::map<const char*, Node> childs; - Node* parent; -}; - -static std::map<const char*, Node> s_roots; -static Node* s_currentNode; -static bool s_beginEndMismatch; -static microseconds s_overhead; -static microseconds s_prevOverhead; - -void SampleProfilerInit() -{ - s_roots.clear(); - s_currentNode = nullptr; - s_beginEndMismatch = false; - s_overhead = microseconds(); -} - -void SampleProfilerBegin(const char* name) -{ - auto start = steady_clock::now(); - { - Node* parent = s_currentNode; - if (s_currentNode == nullptr) - { - s_currentNode = &s_roots[name]; - } - else - { - s_currentNode = &s_currentNode->childs[name]; - } - s_currentNode->parent = parent; - s_currentNode->data.calls++; - s_currentNode->data.start = steady_clock::now(); - } - s_overhead += duration_cast<microseconds>(steady_clock::now() - start); -} - -void SampleProfilerEnd() -{ - auto start = steady_clock::now(); - { - if (s_currentNode) - { - auto& data = s_currentNode->data; - data.time += duration_cast<microseconds>(steady_clock::now() - data.start); - data.maxTime = data.time > data.maxTime ? data.time : data.maxTime; - s_currentNode = s_currentNode->parent; - } - else - { - s_beginEndMismatch = true; - } - } - s_overhead += duration_cast<microseconds>(steady_clock::now() - start); -} - -struct SampleProfilerTreeIteratorImpl final : public SampleProfilerTreeIterator -{ - struct StackNode - { - Node* node; - const char* name; - }; - - SampleProfilerTreeIteratorImpl(std::map<const char*, Node>& roots) - { - for (auto& root : roots) - { - m_stack.emplace(StackNode { &root.second, root.first }); - } - - next(); - } - - virtual const Data* data() const override - { - return m_valid ? &m_data : nullptr; - } - - Node* node() - { - return m_node; - } - - virtual bool isDone() const - { - return !m_valid; - } - - virtual void next() - { - if (!m_stack.empty()) - { - auto& e = m_stack.top(); - m_stack.pop(); - m_node = e.node; - m_data.depth = 0; - m_data.hash = (uint64_t)m_node; - for (const Node* p = m_node; p != nullptr; p = p->parent) - { - m_data.depth++; - } - m_data.name = e.name; - m_data.calls = m_node->data.prevCalls; - m_data.time = m_node->data.prevTime; - m_data.maxTime = m_node->data.maxTime; - m_data.hasChilds = !m_node->childs.empty(); - - for (auto it = m_node->childs.rbegin(); it != m_node->childs.rend(); ++it) - { - m_stack.emplace(StackNode { &(*it).second, (*it).first }); - } - m_valid = true; - } - else - { - m_valid = false; - } - } - - virtual void release() - { - delete this; - } - - bool m_valid; - Data m_data; - Node* m_node; - std::stack<StackNode > m_stack; -}; - -void SampleProfilerReset() -{ - for (SampleProfilerTreeIteratorImpl it(s_roots); !it.isDone(); it.next()) - { - auto& data = it.node()->data; - data.prevTime = data.time; - data.prevCalls = data.calls; - data.time = microseconds(); - data.calls = 0; - } - s_currentNode = nullptr; - s_beginEndMismatch = false; - s_prevOverhead = s_overhead; - s_overhead = microseconds(); -} - -bool SampleProfilerIsValid() -{ - return !s_beginEndMismatch; -} - -microseconds SampleProfilerGetOverhead() -{ - return s_prevOverhead; -} - -SampleProfilerTreeIterator* SampleProfilerCreateTreeIterator() -{ - return SampleProfilerIsValid() ? new SampleProfilerTreeIteratorImpl(s_roots) : nullptr; -} - -void SampleProfilerDumpToFile(const char* path) -{ - std::ofstream myfile(path, std::ios_base::out); - if (myfile.is_open()) - { - if (s_beginEndMismatch) - { - myfile << "Error: Begin/End Mismatch.\n"; - } - else - { - myfile << "[Root]\n"; - for(SampleProfilerTreeIteratorImpl it(s_roots); !it.isDone(); it.next()) - { - auto data = it.data(); - for (uint32_t i = 0; i < data->depth; ++i) - myfile << "\t"; - myfile << data->name << " --> calls: " << data->calls << ", total: " << data->time.count() * 0.001 << "ms\n"; - } - } - - myfile.close(); - } -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/SampleProfiler.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/SampleProfiler.h deleted file mode 100644 index 5f8a326..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/SampleProfiler.h +++ /dev/null @@ -1,97 +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. - - -#ifndef SAMPLEPROFILER_H -#define SAMPLEPROFILER_H - -#include <chrono> - -#if NV_PROFILE - -void SampleProfilerInit(); -void SampleProfilerBegin(const char* name); -void SampleProfilerEnd(); -void SampleProfilerReset(); - -struct SampleProfilerScoped -{ - SampleProfilerScoped(const char* name) - { - SampleProfilerBegin(name); - } - - ~SampleProfilerScoped() - { - SampleProfilerEnd(); - } -}; - -#define PROFILER_INIT() SampleProfilerInit() -#define PROFILER_BEGIN(x) SampleProfilerBegin(x) -#define PROFILER_END() SampleProfilerEnd() -#define PROFILER_SCOPED(x) SampleProfilerScoped __scopedProfiler__(x) -#define PROFILER_SCOPED_FUNCTION() SampleProfilerScoped __scopedProfiler__(__FUNCTION__) -#define PROFILER_RESET() SampleProfilerReset() - -#else - -#define PROFILER_INIT() -#define PROFILER_BEGIN(x) -#define PROFILER_END() -#define PROFILER_SCOPED(x) -#define PROFILER_SCOPED_FUNCTION() -#define PROFILER_RESET() - -#endif - -void SampleProfilerDumpToFile(const char* path); -bool SampleProfilerIsValid(); -std::chrono::microseconds SampleProfilerGetOverhead(); - -struct SampleProfilerTreeIterator -{ - struct Data - { - uint64_t hash; - const char* name; - bool hasChilds; - uint32_t depth; - std::chrono::microseconds time; - std::chrono::microseconds maxTime; - uint32_t calls; - }; - - virtual const Data* data() const = 0; - virtual bool isDone() const = 0; - virtual void next() = 0; - virtual void release() = 0; -}; - -SampleProfilerTreeIterator* SampleProfilerCreateTreeIterator(); - -#endif //SAMPLEPROFILER_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/SampleTime.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/SampleTime.h deleted file mode 100644 index 8226cd4..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/SampleTime.h +++ /dev/null @@ -1,76 +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. - - -#ifndef SAMPLE_TIME_H -#define SAMPLE_TIME_H - -#include <stdint.h> - -class Time -{ -public: - Time() : m_lastTickCount(getTimeTicks()) {} - - double Time::getElapsedSeconds() - { - const int64_t lastTickCount = m_lastTickCount; - m_lastTickCount = getTimeTicks(); - return (m_lastTickCount - lastTickCount) * s_secondsPerTick; - } - - double Time::peekElapsedSeconds() const - { - return (getTimeTicks() - m_lastTickCount) * s_secondsPerTick; - } - - double Time::getLastTime() const - { - return m_lastTickCount * s_secondsPerTick; - } - -private: - static double getTickDuration() - { - LARGE_INTEGER a; - QueryPerformanceFrequency(&a); - return 1.0 / (double)a.QuadPart; - } - - int64_t getTimeTicks() const - { - LARGE_INTEGER a; - QueryPerformanceCounter(&a); - return a.QuadPart; - } - - int64_t m_lastTickCount; - static const double s_secondsPerTick; -}; - - -#endif
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/UIHelpers.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/UIHelpers.h deleted file mode 100644 index cdd50ff..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/UIHelpers.h +++ /dev/null @@ -1,74 +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. - - -#ifndef UI_HELPERS_H -#define UI_HELPERS_H - -#include "imgui.h" -#include "PxVec3.h" - - -static void ImGui_DragFloat3Dir(const char* label, float v[3]) -{ - if (ImGui::Button("Normalize")) - { - ((physx::PxVec3*)v)->normalize(); - } - ImGui::SameLine(); - ImGui::DragFloat3(label, v); -}; - - -#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR)/sizeof(*_ARR))) - -template<int valuesCount = 90> -class PlotLinesInstance -{ -public: - PlotLinesInstance() - { - memset(m_values, 0, sizeof(float) * valuesCount); - } - - void plot(const char* label, float newValue, const char* overlay_text, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 80)) - { - for (; ImGui::GetTime() > m_time + 1.0f / 60.0f; m_time += 1.0f / 60.0f) - { - m_values[m_offset] = newValue; - m_offset = (m_offset + 1) % valuesCount; - } - ImGui::PlotLines(label, m_values, valuesCount, m_offset, overlay_text, scale_min, scale_max, graph_size); - } - -private: - float m_values[valuesCount]; - int m_offset; - float m_time = ImGui::GetTime(); -}; - -#endif //UI_HELPERS_H
\ No newline at end of file diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/Utils.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/Utils.cpp deleted file mode 100644 index 9eafabc..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/Utils.cpp +++ /dev/null @@ -1,41 +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 "Utils.h" - -#include <string> -#include <cstdarg> - -HRESULT messagebox_printf(const char* caption, UINT mb_type, const char* format, ...) -{ - va_list args; - va_start(args, format); - char formatted_text[512]; - _vsnprintf(formatted_text, 512, format, args); - return MessageBoxA(nullptr, formatted_text, caption, mb_type); -} diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/Utils.h b/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/Utils.h deleted file mode 100644 index 42bf713..0000000 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/utils/Utils.h +++ /dev/null @@ -1,119 +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. - - -#ifndef UTILS_H -#define UTILS_H - -#include <DeviceManager.h> -#include <assert.h> - -#include "PxPreprocessor.h" - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// MACROS -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#ifndef V_RETURN -#define V_RETURN(x) \ - { \ - hr = (x); \ - if(FAILED(hr)) \ - { \ - return hr; \ - } \ - } -#endif - -#ifndef V -#define V(x) \ - { \ - HRESULT hr = (x); \ - _ASSERT(SUCCEEDED(hr)); \ - } -#endif - -#ifndef SAFE_RELEASE -#define SAFE_RELEASE(p) \ - { \ - if(p) \ - { \ - (p)->Release(); \ - (p) = NULL; \ - } \ - } -#endif - -#ifndef SAFE_DELETE -#define SAFE_DELETE(p) \ - { \ - if(p) \ - { \ - delete (p); \ - (p) = NULL; \ - } \ - } -#endif - -#define ASSERT_PRINT(cond, format, ...) \ - if(!(cond)) \ - { \ - messagebox_printf("Assertion Failed!", MB_OK | MB_ICONERROR, #cond "\n" format, __VA_ARGS__); \ - assert(cond); \ - } - -HRESULT messagebox_printf(const char* caption, UINT mb_type, const char* format, ...); - - - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -static const char* strext(const char* str) -{ - const char* ext = NULL; // by default no extension found! - while (str) - { - str = strchr(str, '.'); - if (str) - { - str++; - ext = str; - } - } - return ext; -} - -static inline float lerp(float a, float b, float t) { return a + (b - a) * t; } - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#endif
\ No newline at end of file |