diff options
| author | RunitaiLinden <davep@lindenlab.com> | 2024-05-01 09:51:32 -0500 | 
|---|---|---|
| committer | RunitaiLinden <davep@lindenlab.com> | 2024-05-01 09:51:32 -0500 | 
| commit | a701cce8e0959503156a010683f6d0d57beaae36 (patch) | |
| tree | c9a3850ea63474f83fe2150fb71fb798ad71d001 | |
| parent | 170765fd3505410dced83b342f87030fd9151e35 (diff) | |
#1357 Preserve asset "extras" and switch to std::shared_ptr for referencing Asset from LLViewerObject to cut down rebuild time
| -rw-r--r-- | indra/newview/gltf/asset.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/gltf/asset.h | 4 | ||||
| -rw-r--r-- | indra/newview/gltfscenemanager.cpp | 29 | ||||
| -rw-r--r-- | indra/newview/gltfscenemanager.h | 10 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 7 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.h | 11 | 
6 files changed, 42 insertions, 25 deletions
| diff --git a/indra/newview/gltf/asset.cpp b/indra/newview/gltf/asset.cpp index 475cbcb6e5..42f064699c 100644 --- a/indra/newview/gltf/asset.cpp +++ b/indra/newview/gltf/asset.cpp @@ -34,8 +34,6 @@  using namespace LL::GLTF; -#pragma optimize("", off) -  namespace LL  {      namespace GLTF @@ -280,6 +278,7 @@ namespace LL              dst.asset.version = src.mVersion;              dst.asset.minVersion = src.mMinVersion;              dst.asset.generator = "Linden Lab Experimental GLTF Export"; +            dst.asset.extras = src.mExtras;              copy(src.mScenes, dst.scenes);              copy(src.mNodes, dst.nodes); @@ -739,9 +738,10 @@ const Asset& Asset::operator=(const tinygltf::Model& src)      mMinVersion = src.asset.minVersion;      mGenerator = src.asset.generator;      mCopyright = src.asset.copyright; +    mExtras = src.asset.extras;      mDefaultScene = src.defaultScene; - +          mScenes.resize(src.scenes.size());      for (U32 i = 0; i < src.scenes.size(); ++i) diff --git a/indra/newview/gltf/asset.h b/indra/newview/gltf/asset.h index cb28c4a572..5a62313705 100644 --- a/indra/newview/gltf/asset.h +++ b/indra/newview/gltf/asset.h @@ -265,7 +265,7 @@ namespace LL          };          // C++ representation of a GLTF Asset -        class Asset : public LLRefCount +        class Asset          {          public:              std::vector<Scene> mScenes; @@ -287,6 +287,8 @@ namespace LL              std::string mCopyright;              S32 mDefaultScene = INVALID_INDEX; +            tinygltf::Value mExtras; +              // the last time update() was called according to gFrameTimeSeconds              F32 mLastUpdateTime = gFrameTimeSeconds; diff --git a/indra/newview/gltfscenemanager.cpp b/indra/newview/gltfscenemanager.cpp index 0aedcd653d..6533f283e2 100644 --- a/indra/newview/gltfscenemanager.cpp +++ b/indra/newview/gltfscenemanager.cpp @@ -77,7 +77,7 @@ void GLTFSceneManager::load()  void GLTFSceneManager::saveAs()  {      LLViewerObject* obj = LLSelectMgr::instance().getSelection()->getFirstRootObject(); -    if (obj && obj->mGLTFAsset.notNull()) +    if (obj && obj->mGLTFAsset)      {          LLFilePickerReplyThread::startPicker(              [](const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter) @@ -103,7 +103,7 @@ void GLTFSceneManager::saveAs()  void GLTFSceneManager::decomposeSelection()  {      LLViewerObject* obj = LLSelectMgr::instance().getSelection()->getFirstRootObject(); -    if (obj && obj->mGLTFAsset.notNull()) +    if (obj && obj->mGLTFAsset)      {          LLFilePickerReplyThread::startPicker(              [](const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter) @@ -129,7 +129,7 @@ void GLTFSceneManager::decomposeSelection()  void GLTFSceneManager::decomposeSelection(const std::string& filename)  {      LLViewerObject* obj = LLSelectMgr::instance().getSelection()->getFirstRootObject(); -    if (obj && obj->mGLTFAsset.notNull()) +    if (obj && obj->mGLTFAsset)      {          // copy asset out for decomposition          Asset asset = *obj->mGLTFAsset; @@ -148,9 +148,9 @@ void GLTFSceneManager::decomposeSelection(const std::string& filename)  void GLTFSceneManager::save(const std::string& filename)  {      LLViewerObject* obj = LLSelectMgr::instance().getSelection()->getFirstRootObject(); -    if (obj && obj->mGLTFAsset.notNull()) +    if (obj && obj->mGLTFAsset)      { -        Asset* asset = obj->mGLTFAsset; +        Asset* asset = obj->mGLTFAsset.get();          tinygltf::Model model;          asset->save(model); @@ -163,7 +163,7 @@ void GLTFSceneManager::load(const std::string& filename)      tinygltf::Model model;      LLTinyGLTFHelper::loadModel(filename, model); -    LLPointer<Asset> asset = new Asset(); +    std::shared_ptr<Asset> asset = std::make_shared<Asset>();      *asset = model;      gDebugProgram.bind(); // bind a shader to satisfy LLVertexBuffer assertions @@ -210,10 +210,7 @@ void GLTFSceneManager::update()              continue;          } -        Asset* asset = mObjects[i]->mGLTFAsset; - -        asset->update(); -      +        mObjects[i]->mGLTFAsset->update();      }  } @@ -235,7 +232,7 @@ void GLTFSceneManager::render(bool opaque, bool rigged)              continue;          } -        Asset* asset = mObjects[i]->mGLTFAsset; +        Asset* asset = mObjects[i]->mGLTFAsset.get();          gGL.pushMatrix(); @@ -382,7 +379,7 @@ LLDrawable* GLTFSceneManager::lineSegmentIntersect(const LLVector4a& start, cons          }          // temporary debug -- always double check objects that have GLTF scenes hanging off of them even if the ray doesn't intersect the object bounds -        if (lineSegmentIntersect((LLVOVolume*) mObjects[i].get(), mObjects[i]->mGLTFAsset, start, local_end, -1, pick_transparent, pick_rigged, pick_unselectable, node_hit, primitive_hit, &position, tex_coord, normal, tangent)) +        if (lineSegmentIntersect((LLVOVolume*) mObjects[i].get(), mObjects[i]->mGLTFAsset.get(), start, local_end, -1, pick_transparent, pick_rigged, pick_unselectable, node_hit, primitive_hit, &position, tex_coord, normal, tangent))          {              local_end = position;              if (intersection) @@ -509,7 +506,7 @@ void GLTFSceneManager::renderDebug()          matMul(mat, modelview, modelview); -        Asset* asset = obj->mGLTFAsset; +        Asset* asset = obj->mGLTFAsset.get();          for (auto& node : asset->mNodes)          { @@ -524,7 +521,7 @@ void GLTFSceneManager::renderDebug()              continue;          } -        Asset* asset = obj->mGLTFAsset; +        Asset* asset = obj->mGLTFAsset.get();          LLMatrix4a mat = obj->getGLTFAssetToAgentTransform(); @@ -561,7 +558,7 @@ void GLTFSceneManager::renderDebug()                  matMul(mat, modelview, modelview); -                Asset* asset = obj->mGLTFAsset; +                Asset* asset = obj->mGLTFAsset.get();                  for (auto& node : asset->mNodes)                  { @@ -622,7 +619,7 @@ void GLTFSceneManager::renderDebug()          if (drawable)          {              gGL.pushMatrix(); -            Asset* asset = drawable->getVObj()->mGLTFAsset; +            Asset* asset = drawable->getVObj()->mGLTFAsset.get();              Node* node = &asset->mNodes[node_hit];              Primitive* primitive = &asset->mMeshes[node->mMesh].mPrimitives[primitive_hit]; diff --git a/indra/newview/gltfscenemanager.h b/indra/newview/gltfscenemanager.h index 57d9e019a5..e380be7e3c 100644 --- a/indra/newview/gltfscenemanager.h +++ b/indra/newview/gltfscenemanager.h @@ -28,6 +28,16 @@  #include "llsingleton.h"  #include "llviewerobject.h" +class LLVOVolume; +class LLDrawable; + +namespace LL +{ +    namespace GLTF +    { +        class Asset; +    } +}  namespace LL  { diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 5b21040a04..cc6f4403dd 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -107,6 +107,7 @@  #include "llmeshrepository.h"  #include "llgltfmateriallist.h"  #include "llgl.h" +#include "gltf/asset.h"  //#define DEBUG_UPDATE_TYPE @@ -4420,7 +4421,7 @@ LLMatrix4a LLViewerObject::getGLTFNodeTransformAgent(S32 node_index) const  {      LLMatrix4a mat; -    if (mGLTFAsset.notNull() && node_index >= 0 && node_index < mGLTFAsset->mNodes.size()) +    if (mGLTFAsset && node_index >= 0 && node_index < mGLTFAsset->mNodes.size())      {          auto& node = mGLTFAsset->mNodes[node_index]; @@ -4474,7 +4475,7 @@ void decomposeMatrix(const LLMatrix4a& mat, LLVector3& position, LLQuaternion& r  void LLViewerObject::setGLTFNodeRotationAgent(S32 node_index, const LLQuaternion& rotation)  { -    if (mGLTFAsset.notNull() && node_index >= 0 && node_index < mGLTFAsset->mNodes.size()) +    if (mGLTFAsset && node_index >= 0 && node_index < mGLTFAsset->mNodes.size())      {          auto& node = mGLTFAsset->mNodes[node_index]; @@ -4506,7 +4507,7 @@ void LLViewerObject::setGLTFNodeRotationAgent(S32 node_index, const LLQuaternion  void LLViewerObject::moveGLTFNode(S32 node_index, const LLVector3& offset)  { -    if (mGLTFAsset.notNull() && node_index >= 0 && node_index < mGLTFAsset->mNodes.size()) +    if (mGLTFAsset && node_index >= 0 && node_index < mGLTFAsset->mNodes.size())      {          auto& node = mGLTFAsset->mNodes[node_index]; diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 64c1ee6633..e314992532 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -45,7 +45,14 @@  #include "llbbox.h"  #include "llrigginginfo.h"  #include "llreflectionmap.h" -#include "gltf/asset.h" + +namespace LL +{ +    namespace GLTF +    { +        class Asset; +    } +}  class LLAgent;			// TODO: Get rid of this.  class LLAudioSource; @@ -736,7 +743,7 @@ public:  	F32             mPhysicsRestitution;      // Associated GLTF Asset -    LLPointer<LL::GLTF::Asset> mGLTFAsset; +    std::shared_ptr<LL::GLTF::Asset> mGLTFAsset;  	// Pipeline classes  	LLPointer<LLDrawable> mDrawable; | 
