diff options
author | Jonathan "Geenz" Goodman <geenz@geenzo.com> | 2025-05-04 21:06:10 -0400 |
---|---|---|
committer | Jonathan "Geenz" Goodman <geenz@geenzo.com> | 2025-05-04 21:06:10 -0400 |
commit | e87c62940656aa740ddfa20bb2eed7a13cdb59c7 (patch) | |
tree | ae5b22e84ddc2e8b53f38a75494a8409bb5d0763 | |
parent | 3a4a2a525fe667250d014ad5d09a84a5c35aedf9 (diff) |
Transforms transmigrofied
-rw-r--r-- | indra/newview/gltf/llgltfloader.cpp | 75 | ||||
-rw-r--r-- | indra/newview/gltf/llgltfloader.h | 2 |
2 files changed, 32 insertions, 45 deletions
diff --git a/indra/newview/gltf/llgltfloader.cpp b/indra/newview/gltf/llgltfloader.cpp index 3f5dbb3f87..3f58f512e5 100644 --- a/indra/newview/gltf/llgltfloader.cpp +++ b/indra/newview/gltf/llgltfloader.cpp @@ -118,7 +118,6 @@ bool LLGLTFLoader::OpenFile(const std::string &filename) return false; } - mTransform.setIdentity(); mMeshesLoaded = parseMeshes(); if (mMeshesLoaded) uploadMeshes(); @@ -141,9 +140,10 @@ bool LLGLTFLoader::parseMeshes() LLVolumeParams volume_params; volume_params.setType(LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE); + mTransform.setIdentity(); for (auto node : mGLTFAsset.mNodes) { - LLMatrix4 transform; + LLMatrix4 transformation; material_map mats; auto meshidx = node.mMesh; @@ -156,30 +156,42 @@ bool LLGLTFLoader::parseMeshes() if (populateModelFromMesh(pModel, mesh, mats) && (LLModel::NO_ERRORS == pModel->getStatus()) && validate_model(pModel)) { mModelList.push_back(pModel); - LLMatrix4 mesh_translation; - mesh_translation.setTranslation(LLVector3(node.mTranslation)); - mesh_translation *= mTransform; - mTransform = mesh_translation; - mTransform.condition(); + LLMatrix4 saved_transform = mTransform; - LLMatrix4 mesh_rotation; - mesh_rotation.initRotation(LLQuaternion(node.mRotation[0], node.mRotation[1], node.mRotation[2], node.mRotation[3])); - mesh_rotation *= mTransform; - mTransform = mesh_rotation; + LLMatrix4 gltf_transform = LLMatrix4(glm::value_ptr(node.mMatrix)); + mTransform *= gltf_transform; mTransform.condition(); - LLMatrix4 mesh_scale; - mesh_scale.initScale(LLVector3(glm::abs(node.mScale))); - mesh_scale *= mTransform; - mTransform = mesh_scale; - mTransform.condition(); + transformation = mTransform; + // adjust the transformation to compensate for mesh normalization + LLVector3 mesh_scale_vector; + LLVector3 mesh_translation_vector; + pModel->getNormalizedScaleTranslation(mesh_scale_vector, mesh_translation_vector); - LLVector3 mesh_scale_vector = LLVector3(node.mScale); - LLVector3 mesh_translation_vector = LLVector3(node.mTranslation); + LLMatrix4 mesh_translation; + mesh_translation.setTranslation(mesh_translation_vector); + mesh_translation *= transformation; + transformation = mesh_translation; - transform = mTransform; + LLMatrix4 mesh_scale; + mesh_scale.initScale(mesh_scale_vector); + mesh_scale *= transformation; + transformation = mesh_scale; + + if (transformation.determinant() < 0) + { // negative scales are not supported + LL_INFOS() << "Negative scale detected, unsupported post-normalization transform. domInstance_geometry: " + << pModel->mLabel << LL_ENDL; + LLSD args; + args["Message"] = "NegativeScaleNormTrans"; + args["LABEL"] = pModel->mLabel; + mWarningsArray.append(args); + + } - mScene[transform].push_back(LLModelInstance(pModel, pModel->mLabel, transform, mats)); + mScene[transformation].push_back(LLModelInstance(pModel, pModel->mLabel, transformation, mats)); + stretch_extents(pModel, transformation); + mTransform = saved_transform; } else { @@ -268,29 +280,6 @@ bool LLGLTFLoader::populateModelFromMesh(LLModel* pModel, const LL::GLTF::Mesh & return true; } -void LLGLTFLoader::processPrimitive(const LL::GLTF::Primitive& primitive, const LL::GLTF::Node& node) -{ - LLMatrix4 translation; - translation.setTranslation(LLVector3(node.mTranslation)); - translation *= mTransform; - mTransform = translation; - mTransform.condition(); - - LLMatrix4 rotation; - rotation = LLMatrix4(LLQuaternion(node.mRotation[0], node.mRotation[1], node.mRotation[2], node.mRotation[3])); - rotation *= mTransform; - mTransform = rotation; - mTransform.condition(); - - LLMatrix4 scale; - scale.initScale(LLVector3(glm::abs(node.mScale))); - scale *= mTransform; - mTransform = scale; - mTransform.condition(); - - if (primitive.mPositions.size()) { - } -} /* LLModel::EModelStatus loadFaceFromGLTFModel(LLModel* pModel, const LL::GLTF::Mesh& mesh, material_map& mats, LLSD& log_msg) { diff --git a/indra/newview/gltf/llgltfloader.h b/indra/newview/gltf/llgltfloader.h index 32275d168d..cfb545be6f 100644 --- a/indra/newview/gltf/llgltfloader.h +++ b/indra/newview/gltf/llgltfloader.h @@ -168,8 +168,6 @@ private: bool populateModelFromMesh(LLModel* pModel, const LL::GLTF::Mesh &mesh, material_map& mats); LLUUID imageBufferToTextureUUID(const gltf_texture& tex); - void processPrimitive(const LL::GLTF::Primitive& primitive, const LL::GLTF::Node& node); - // bool mPreprocessGLTF; /* Below inherited from dae loader - unknown if/how useful here |