diff options
| author | Anton Novoselov <[email protected]> | 2017-08-01 12:53:38 +0300 |
|---|---|---|
| committer | Anton Novoselov <[email protected]> | 2017-08-01 12:53:38 +0300 |
| commit | 236f03c0b9a4982328ed1201978f7f69d192d9b2 (patch) | |
| tree | e486f2fa39dba203563895541e92c60ed3e25759 /tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp | |
| parent | Added screens to welcome page (diff) | |
| download | blast-236f03c0b9a4982328ed1201978f7f69d192d9b2.tar.xz blast-236f03c0b9a4982328ed1201978f7f69d192d9b2.zip | |
Blast 1.1 release (windows / linux)
see docs/release_notes.txt for details
Diffstat (limited to 'tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp')
| -rw-r--r-- | tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp | 573 |
1 files changed, 400 insertions, 173 deletions
diff --git a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp b/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp index ec000b3..05681d0 100644 --- a/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp +++ b/tools/ArtistTools/source/BlastPlugin/SampleBase/scene/SceneController.cpp @@ -1,12 +1,30 @@ -/* -* Copyright (c) 2008-2015, NVIDIA CORPORATION. All rights reserved. -* -* NVIDIA CORPORATION and its licensors retain all intellectual property -* and proprietary rights in and to this software, related documentation -* and any modifications thereto. Any use, reproduction, disclosure or -* distribution of this software and related documentation without an express -* license agreement from NVIDIA CORPORATION is strictly prohibited. -*/ +// This code contains NVIDIA Confidential Information and is disclosed to you +// under a form of NVIDIA software license agreement provided separately to you. +// +// Notice +// NVIDIA Corporation and its licensors retain all intellectual property and +// proprietary rights in and to this software and related documentation and +// any modifications thereto. Any use, reproduction, disclosure, or +// distribution of this software and related documentation without an express +// license agreement from NVIDIA Corporation is strictly prohibited. +// +// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES +// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. +// +// Information and code furnished is believed to be accurate and reliable. +// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2008-2017 NVIDIA Corporation. All rights reserved. + #include "SceneController.h" #include "RenderUtils.h" @@ -35,8 +53,14 @@ #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) @@ -78,7 +102,7 @@ public: virtual void load() = 0; virtual void unload() = 0; virtual bool isLoaded() const = 0; - virtual void spawn(PxVec3 shift) = 0; + virtual void spawn(PxTransform transform) = 0; virtual ImVec4 getUIColor() const { @@ -94,6 +118,8 @@ protected: class SceneActor { public: + SceneActor() : removeOnReload(false) {} + virtual ~SceneActor() {} virtual const char* getName() const = 0; virtual const char* getSubname(int subindex) const { return nullptr; } @@ -104,6 +130,8 @@ public: virtual PxVec3 getSpawnShift() const { return PxVec3(PxZero); } virtual void reload() {} virtual void removeSubactor(int subindex) {} + + bool removeOnReload; }; @@ -116,7 +144,7 @@ public: int subindex; ActorIndex() { reset(); } - ActorIndex(int i, int s) : index(i), subindex(s) {} + ActorIndex(int i, int s = -1) : index(i), subindex(s) {} bool operator==(const ActorIndex& other) const { @@ -152,10 +180,27 @@ public: { m_assets.push_back(asset); asset->initialize(this); - m_assetsByID[asset->getID()] = asset; + 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; @@ -316,7 +361,7 @@ public: return; } - PxVec3 shift(PxZero); + PxTransform transform(PxIdentity); // Add By Lixu Begin /* for (SceneActor* a : m_sceneActors) @@ -327,7 +372,7 @@ public: // Add By Lixu End SceneAsset* asset = m_assets[m_lastSpawnedAsset]; - asset->spawn(shift); + asset->spawn(transform); } void addSceneActor(SceneActor* actor) @@ -339,6 +384,21 @@ public: } } +// 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); @@ -411,6 +471,7 @@ public: m_assets[i]->unload(); } + m_assets.clear(); const int currentAsset = m_lastSpawnedAsset; m_lastSpawnedAsset = -1; return currentAsset; @@ -418,10 +479,28 @@ public: void reloadAllActors() { - for (SceneActor* a : m_sceneActors) + SceneActor* selectedActor = getSelectedActor(); + ActorIndex selectIndex(0); + + for (uint32_t i = 0; i < m_sceneActors.size(); i++) { - a->reload(); + 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) @@ -496,18 +575,19 @@ class SingleSceneActor; class SingleSceneAsset : public SceneAsset { public: - SingleSceneAsset() : m_asset(nullptr) {} + SingleSceneAsset(BlastAsset* pBlastAsset) : m_asset(pBlastAsset) {} virtual ~SingleSceneAsset() { unload(); } - virtual void spawn(PxVec3 shift) override; + virtual void spawn(PxTransform transform) override; virtual void load() override { if (!m_asset) { m_asset = createAsset(); - m_scene->registerTkAsset(m_asset->getPxAsset()->getTkAsset(), this); } + + m_scene->registerTkAsset(m_asset->getPxAsset()->getTkAsset(), this); } virtual void unload() override @@ -543,7 +623,7 @@ private: class ModelSceneAsset : public SingleSceneAsset { public: - ModelSceneAsset() {} + 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(); } @@ -557,10 +637,12 @@ public: 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->getRenderer(), desc.file.c_str()); + m_scene->getPhysXController().getCooking(), *m_scene->getBlastController().getExtSerialization(), m_scene->getRenderer(), desc.file.c_str()); } virtual ImVec4 getUIColor() const override @@ -573,10 +655,12 @@ public: 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->getRenderer(), desc.file.c_str()); + m_scene->getPhysXController().getCooking(), *m_scene->getBlastController().getExtSerialization(), m_scene->getRenderer(), desc.file.c_str()); } virtual ImVec4 getUIColor() const override @@ -589,8 +673,10 @@ public: class BoxesSceneAsset : public SingleSceneAsset { public: - BoxesSceneAsset(const AssetList::BoxAsset& d) : desc(d) + 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]; @@ -600,6 +686,7 @@ public: 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 @@ -642,7 +729,7 @@ public: 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(PxVec3 shift) override; + virtual void spawn(PxTransform transform) override; virtual void load() override { @@ -726,10 +813,10 @@ private: class SingleSceneActor : public SceneActor { public: - SingleSceneActor(Scene& scene, SingleSceneAsset* asset, PxVec3 shift) + SingleSceneActor(Scene& scene, SingleSceneAsset* asset, PxTransform transform) : m_scene(scene) , m_asset(asset) - , m_shift(shift) + , m_transform(transform) { m_index = m_asset->spawnCount++; spawn(); @@ -740,6 +827,13 @@ public: 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(); @@ -772,12 +866,26 @@ public: 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() { @@ -793,8 +901,7 @@ private: str << " (" << m_index << ")"; m_name = str.str(); - PxTransform pose = m_asset->getInitialTransform(); - pose.p += m_shift; + PxTransform pose = m_transform; BlastAsset::ActorDesc actorDesc = { actorDesc.id = generateIDFromString(m_name.c_str()), @@ -803,12 +910,29 @@ private: }; 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; - PxVec3 m_shift; + PxTransform m_transform; uint32_t m_index; std::string m_name; }; @@ -816,10 +940,10 @@ private: class CompositeSceneActor : public SceneActor { public: - CompositeSceneActor(Scene& scene, CompositeSceneAsset* asset, PxVec3 shift) + CompositeSceneActor(Scene& scene, CompositeSceneAsset* asset, PxTransform transform) : m_scene(scene) , m_asset(asset) - , m_shift(shift) + , m_transform(transform) { m_index = m_asset->spawnCount++; spawn(); @@ -937,8 +1061,7 @@ private: ExtPxManager& pxManager = m_scene.getBlastController().getExtPxManager(); for (uint32_t i = 0; i < actorCount; ++i) { - PxTransform pose = m_asset->getInitialTransform(); - pose.p += m_shift; + PxTransform pose = m_transform; pose = assetDesc.assetRefs[i].transform.transform(pose); BlastAsset::ActorDesc actorDesc = { @@ -981,7 +1104,7 @@ private: Scene& m_scene; std::vector<Subactor> m_actors; CompositeSceneAsset* m_asset; - PxVec3 m_shift; + PxTransform m_transform; uint32_t m_index; std::string m_name; }; @@ -1003,7 +1126,9 @@ public: virtual const char* getName() const override { - return m_name; + // Add By Lixu Begin + return m_name.c_str(); + // Add By Lixu End } virtual ImVec4 getUIColor() const override @@ -1011,11 +1136,16 @@ public: 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; - const char* m_name; + // Add By Lixu Begin + std::string m_name; + // Add By Lixu End }; @@ -1024,19 +1154,19 @@ private: // Assets Implementation /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -void SingleSceneAsset::spawn(PxVec3 shift) +void SingleSceneAsset::spawn(PxTransform transform) { load(); - SingleSceneActor* actor = new SingleSceneActor(*m_scene, this, shift); + SingleSceneActor* actor = new SingleSceneActor(*m_scene, this, transform); m_scene->addSceneActor(actor); } -void CompositeSceneAsset::spawn(PxVec3 shift) +void CompositeSceneAsset::spawn(PxTransform transform) { load(); if (isLoaded()) { - CompositeSceneActor* actor = new CompositeSceneActor(*m_scene, this, shift); + CompositeSceneActor* actor = new CompositeSceneActor(*m_scene, this, transform); m_scene->addSceneActor(actor); } } @@ -1094,9 +1224,10 @@ protected: // Controller /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -SceneController::SceneController() : m_cubeScale(1.0f) +SceneController::SceneController() : m_cubeScale(1.0f), m_cubeThrowDownTime(-1.f) { m_scene = NULL; + BlastToSceneMap.clear(); } SceneController::~SceneController() @@ -1107,73 +1238,50 @@ void SceneController::onSampleStart() { // setup camera CFirstPersonCamera* camera = &getRenderer().getCamera(); - DirectX::XMVECTORF32 lookAtPt = { 0, 10, 0, 0 }; - DirectX::XMVECTORF32 eyePt = { 0, 20, 60, 0 }; + 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, true, false); + camera->SetRotateButtons(false, false, false, false); camera->SetEnablePositionMovement(true); // setup scene m_scene = new Scene(getRenderer(), getPhysXController(), getBlastController(), getCommonUIController()); - const SampleConfig& config = getManager()->getConfig(); - - // 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); - } - - // parse asset file - AssetList assetList; - if (!config.assetsFile.empty()) - { - std::string path; - if (getRenderer().getResourceManager().findFile(config.assetsFile, path)) - { - parseAssetList(assetList, path); - } - } - - // add both asset file and asset list from config - addAssets(config.additionalAssetList, packmanResourcesAdded); - addAssets(assetList, packmanResourcesAdded); - -// Add By Lixu Begin - int size = m_scene->getAssets().size(); - for (int i = 0; i < size; i++) - { - spawnAsset(i); - } -// Add By Lixu End + // 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) @@ -1185,11 +1293,11 @@ void SceneController::addAssets(const AssetList& assetList, bool loadModels) ModelSceneAsset* asset; if (!model.isSkinned) { - asset = new SimpleModelSceneAsset(); + asset = new SimpleModelSceneAsset(nullptr); } else { - asset = new SkinnedModelSceneAsset(); + asset = new SkinnedModelSceneAsset(nullptr); } asset->desc = model; m_scene->addAsset(asset); @@ -1208,6 +1316,141 @@ void SceneController::addAssets(const AssetList& assetList, bool loadModels) } } +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() { @@ -1241,12 +1484,28 @@ LRESULT SceneController::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPa m_scene->reloadAllActors(); return 0; case 'F': - throwCube(); + 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; } @@ -1346,6 +1605,7 @@ void SceneController::drawUI() { 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()); } } @@ -1355,14 +1615,21 @@ 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 = 100; + const float CUBE_VELOCITY = 400; const float CUBE_DENSITY = 20000.0f; CFirstPersonCamera* camera = &getRenderer().getCamera(); - PxVec3 eyePos = XMVECTORToPxVec4(camera->GetEyePt()).getXYZ(); - PxVec3 lookAtPos = XMVECTORToPxVec4(camera->GetLookAtPt()).getXYZ(); + 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)); @@ -1390,7 +1657,8 @@ void SceneController::throwCube() m_Projectiles.push_back(p); m_scene->addSceneActor(p); - getManager()->m_bNeedRefreshTree = true; +// BlastSceneTree::ins()->addProjectile(p); + SampleManager::ins()->m_bNeedRefreshTree = true; // Add By Lixu End } @@ -1428,82 +1696,41 @@ void SceneController::clearProjectile() 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(); -// Add By Lixu Begin PhysXController& pc = getPhysXController(); pc.ClearOldCOllisions(); -// Add By Lixu End -} - -bool SceneController::GetAssetDesc(const BlastAsset* asset, AssetList::ModelAsset& desc) -{ - SampleManager* pSampleManager = getManager(); - SampleConfig* config = (SampleConfig*)&(pSampleManager->getConfig()); - std::vector<AssetList::ModelAsset>& modelAssets = config->additionalAssetList.models; - std::vector<AssetList::ModelAsset>::iterator itModelAssets; - std::vector<SceneAsset*>& sceneAssets = m_scene->getAssets(); - std::vector<SceneAsset*>::iterator itSceneAssets; - - bool find = false; - for (itSceneAssets = sceneAssets.begin(); itSceneAssets != sceneAssets.end(); itSceneAssets++) - { - SceneAsset* sceneAsset = *itSceneAssets; - std::string id = sceneAsset->getID(); - for (itModelAssets = modelAssets.begin(); itModelAssets != modelAssets.end(); itModelAssets++) - { - AssetList::ModelAsset& modelAsset = *itModelAssets; - if (modelAsset.id == id) - { - if (!modelAsset.isSkinned) - { - SimpleModelSceneAsset* pSimpleModelSceneAsset = (SimpleModelSceneAsset*)sceneAsset; - if (pSimpleModelSceneAsset->getAsset() == asset) - { - desc = modelAsset; - find = true; - break; - } - } - else - { - SkinnedModelSceneAsset* pSkinnedModelSceneAsset = (SkinnedModelSceneAsset*)sceneAsset; - if (pSkinnedModelSceneAsset->getAsset() == asset) - { - desc = modelAsset; - find = true; - break; - } - } - } - } - - if (find) - { - break; - } - } - - return find; -} - -void SceneController::GetProjectilesNames(std::vector<std::string>& projectilesNames) -{ - projectilesNames.clear(); - std::vector<std::string>::iterator it = m_UsedNames.begin(); - for (; it != m_UsedNames.end(); it++) - { - projectilesNames.push_back(*it); - } + SampleManager::ins()->m_bNeedRefreshTree = true; } // Add By Lixu End
\ No newline at end of file |