diff options
author | Cosmic Linden <cosmic@lindenlab.com> | 2023-03-01 16:15:26 -0800 |
---|---|---|
committer | Cosmic Linden <cosmic@lindenlab.com> | 2023-03-02 10:37:56 -0800 |
commit | db44e06d66cfa11e55660663ea33e604b604ace3 (patch) | |
tree | 1f617c2e2905bc1e319c6da106db3525345edf37 | |
parent | 099fe4a70a95339c1709c3eb2a925d7a77c642cc (diff) |
SL-19294: Fix Blinn-Phong texture transforms affecting GLTF materials
-rw-r--r-- | indra/newview/llface.cpp | 95 | ||||
-rw-r--r-- | indra/newview/llvovolume.cpp | 3 |
2 files changed, 58 insertions, 40 deletions
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index a74950dad2..d05e367c12 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1524,7 +1524,8 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, || mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD2); } - bool do_tex_mat = tex_mode && mTextureMatrix; + // For GLTF materials: Transforms will be applied later + bool do_tex_mat = tex_mode && mTextureMatrix && !gltf_mat; if (!do_bump) { //not bump mapped, might be able to do a cheap update @@ -1614,7 +1615,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, *tex_coords0++ = tc; } } - else + else if (do_xform) { for (S32 i = 0; i < num_vertices; i++) { @@ -1630,6 +1631,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, *tex_coords0++ = tc; } } + else + { + for (S32 i = 0; i < num_vertices; i++) + { + LLVector2 tc(vf.mTexCoords[i]); + LLVector4a& norm = vf.mNormals[i]; + LLVector4a& center = *(vf.mCenter); + LLVector4a vec = vf.mPositions[i]; + vec.mul(scalea); + planarProjection(tc, norm, center, vec); + + *tex_coords0++ = tc; + } + } } } else @@ -1694,44 +1709,44 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } - for (S32 i = 0; i < num_vertices; i++) - { - LLVector2 tc(vf.mTexCoords[i]); - - LLVector4a& norm = vf.mNormals[i]; - - LLVector4a& center = *(vf.mCenter); - - if (texgen != LLTextureEntry::TEX_GEN_DEFAULT) - { - LLVector4a vec = vf.mPositions[i]; - - vec.mul(scalea); - - if (texgen == LLTextureEntry::TEX_GEN_PLANAR) - { - planarProjection(tc, norm, center, vec); - } - } - - if (tex_mode && mTextureMatrix) - { - LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f); - tmp = tmp * *mTextureMatrix; - tc.mV[0] = tmp.mV[0]; - tc.mV[1] = tmp.mV[1]; - } - else - { - xform(tc, cos_ang, sin_ang, os, ot, ms, mt); - } - - *dst++ = tc; - if (do_bump) - { - bump_tc.push_back(tc); - } - } + for (S32 i = 0; i < num_vertices; i++) + { + LLVector2 tc(vf.mTexCoords[i]); + + LLVector4a& norm = vf.mNormals[i]; + + LLVector4a& center = *(vf.mCenter); + + if (texgen != LLTextureEntry::TEX_GEN_DEFAULT) + { + LLVector4a vec = vf.mPositions[i]; + + vec.mul(scalea); + + if (texgen == LLTextureEntry::TEX_GEN_PLANAR) + { + planarProjection(tc, norm, center, vec); + } + } + + if (tex_mode && mTextureMatrix) + { + LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f); + tmp = tmp * *mTextureMatrix; + tc.mV[0] = tmp.mV[0]; + tc.mV[1] = tmp.mV[1]; + } + else if (do_xform) + { + xform(tc, cos_ang, sin_ang, os, ot, ms, mt); + } + + *dst++ = tc; + if (do_bump) + { + bump_tc.push_back(tc); + } + } } if ((!mat && !gltf_mat) && do_bump) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 42e764b492..d88713a690 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -5878,6 +5878,9 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) if (gltf_mat != nullptr) { // all gltf materials have all vertex attributes for now + // *TODO: More finely enumerate vertex attributes for GLTF materials so + // that LLFace::getGeometryVolume can use a more optimal computation path + // as appropriate. (see: "whole expensive loop") -Cosmic,2023-03-01 add_face(sNormSpecFaces, normspec_count, facep); } else |