Implement deep cloning for local mesh objects and faces

Needed to help restore after failed loads etc.
This commit is contained in:
Beq
2026-04-01 17:38:54 +01:00
parent d973e89d19
commit 69af780436
2 changed files with 45 additions and 0 deletions
+43
View File
@@ -129,6 +129,18 @@ void LLLocalMeshFace::logFaceInfo() const
}
}
std::unique_ptr<LLLocalMeshFace> LLLocalMeshFace::clone() const
{
auto cloned_face = std::make_unique<LLLocalMeshFace>();
cloned_face->mIndices = mIndices;
cloned_face->mPositions = mPositions;
cloned_face->mNormals = mNormals;
cloned_face->mUVs = mUVs;
cloned_face->mSkin = mSkin;
cloned_face->mFaceBoundingBox = mFaceBoundingBox;
return cloned_face;
}
/*==========================================*/
/* LLLocalMeshObject: collection of faces */
/* has object name, transform & skininfo, */
@@ -144,6 +156,37 @@ LLLocalMeshObject::LLLocalMeshObject(std::string_view name):
LLLocalMeshObject::~LLLocalMeshObject() = default;
std::unique_ptr<LLLocalMeshObject> LLLocalMeshObject::clone() const
{
auto cloned_object = std::make_unique<LLLocalMeshObject>(mObjectName);
for (S32 lod_iter = LOCAL_LOD_LOWEST; lod_iter < LOCAL_NUM_LODS; ++lod_iter)
{
auto current_lod = static_cast<LLLocalMeshFileLOD>(lod_iter);
auto& cloned_faces = cloned_object->getFaces(current_lod);
const auto& source_faces = mFaces[lod_iter];
cloned_faces.reserve(source_faces.size());
for (const auto& face : source_faces)
{
cloned_faces.push_back(face ? face->clone() : nullptr);
}
}
cloned_object->mObjectBoundingBox = mObjectBoundingBox;
cloned_object->mObjectTranslation = mObjectTranslation;
cloned_object->mObjectSize = mObjectSize;
cloned_object->mObjectScale = mObjectScale;
cloned_object->mSculptID = mSculptID;
cloned_object->mVolumeParams = mVolumeParams;
if (mMeshSkinInfoPtr.notNull())
{
cloned_object->mMeshSkinInfoPtr = new LLMeshSkinInfo(*mMeshSkinInfoPtr);
}
return cloned_object;
}
void LLLocalMeshObject::logObjectInfo() const
{
// log all of the attribute of the object using LL_DEBUGS("LocalMesh")
+2
View File
@@ -69,6 +69,7 @@ public:
std::vector<LLVector2>& getUVs() { return mUVs; };
std::vector<LLLocalMeshSkinUnit>& getSkin() { return mSkin; }
std::pair<LLVector4, LLVector4>& getFaceBoundingBox() { return mFaceBoundingBox; }
std::unique_ptr<LLLocalMeshFace> clone() const;
void logFaceInfo() const;
private:
@@ -113,6 +114,7 @@ public:
void setObjectMeshSkinInfo(LLPointer<LLMeshSkinInfo> skininfop) { mMeshSkinInfoPtr = skininfop; };
LLVolumeParams getVolumeParams() const { return mVolumeParams; };
bool getIsRiggedObject() const;
std::unique_ptr<LLLocalMeshObject> clone() const;
void logObjectInfo() const;
private: