mirror of
https://github.com/FirestormViewer/phoenix-firestorm.git
synced 2026-08-14 08:53:53 +00:00
Implement deep cloning for local mesh objects and faces
Needed to help restore after failed loads etc.
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user