diff options
| author | cosmic-linden <111533034+cosmic-linden@users.noreply.github.com> | 2023-03-03 11:04:32 -0800 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-03 11:04:32 -0800 | 
| commit | f92dddcf1fbf5e7c8e71afa783f2712d08b652cd (patch) | |
| tree | 121eca245c727f4e0bb9ed33cf730b31932f0109 /indra | |
| parent | 9464065503f62ac2603b8cb0089540aaa494d36c (diff) | |
| parent | dc7ad02aa577bb572e8bf9d7f39a55de5cd2adef (diff) | |
Merge pull request #100 from secondlife/SL-19294
SL-19294: Fix Blinn-Phong texture transforms affecting PBR materials
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llface.cpp | 95 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.h | 1 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 12 | 
3 files changed, 66 insertions, 42 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/llspatialpartition.h b/indra/newview/llspatialpartition.h index bc0eabfa0e..9b2cb0d44c 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -686,6 +686,7 @@ private:  	static LLFace** sNormFaces[2];  	static LLFace** sSpecFaces[2];  	static LLFace** sNormSpecFaces[2]; +	static LLFace** sPbrFaces[2];  	static LLFace** sAlphaFaces[2];  }; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 42e764b492..2eb3db6765 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -5105,6 +5105,7 @@ LLFace** LLVolumeGeometryManager::sSimpleFaces[2] = { NULL };  LLFace** LLVolumeGeometryManager::sNormFaces[2] = { NULL };  LLFace** LLVolumeGeometryManager::sSpecFaces[2] = { NULL };  LLFace** LLVolumeGeometryManager::sNormSpecFaces[2] = { NULL }; +LLFace** LLVolumeGeometryManager::sPbrFaces[2] = { NULL };  LLFace** LLVolumeGeometryManager::sAlphaFaces[2] = { NULL };  LLVolumeGeometryManager::LLVolumeGeometryManager() @@ -5141,6 +5142,7 @@ void LLVolumeGeometryManager::allocateFaces(U32 pMaxFaceCount)          sNormFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*)));          sSpecFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*)));          sNormSpecFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*))); +        sPbrFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*)));          sAlphaFaces[i] = static_cast<LLFace**>(ll_aligned_malloc<64>(pMaxFaceCount * sizeof(LLFace*)));      }  } @@ -5155,6 +5157,7 @@ void LLVolumeGeometryManager::freeFaces()          ll_aligned_free<64>(sNormFaces[i]);          ll_aligned_free<64>(sSpecFaces[i]);          ll_aligned_free<64>(sNormSpecFaces[i]); +        ll_aligned_free<64>(sPbrFaces[i]);          ll_aligned_free<64>(sAlphaFaces[i]);          sFullbrightFaces[i] = NULL; @@ -5163,6 +5166,7 @@ void LLVolumeGeometryManager::freeFaces()          sNormFaces[i] = NULL;          sSpecFaces[i] = NULL;          sNormSpecFaces[i] = NULL; +        sPbrFaces[i] = NULL;          sAlphaFaces[i] = NULL;      }  } @@ -5596,6 +5600,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  	U32 norm_count[2] = { 0 };  	U32 spec_count[2] = { 0 };  	U32 normspec_count[2] = { 0 }; +	U32 pbr_count[2] = { 0 };  	static LLCachedControl<S32> max_vbo_size(gSavedSettings, "RenderMaxVBOSize", 512);  	static LLCachedControl<S32> max_node_size(gSavedSettings, "RenderMaxNodeSize", 65536); @@ -5877,8 +5882,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  							{                                  if (gltf_mat != nullptr)                                  { -                                    // all gltf materials have all vertex attributes for now -                                    add_face(sNormSpecFaces, normspec_count, facep); +                                    add_face(sPbrFaces, pbr_count, facep);                                  }                                  else                                  { @@ -5977,6 +5981,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  	U32 normspec_mask = norm_mask | LLVertexBuffer::MAP_TEXCOORD2;  	U32 spec_mask = simple_mask | LLVertexBuffer::MAP_TEXCOORD2; +	U32 pbr_mask = LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_COLOR | LLVertexBuffer::MAP_TANGENT; +  	if (emissive)  	{ //emissive faces are present, include emissive byte to preserve batching  		simple_mask = simple_mask | LLVertexBuffer::MAP_EMISSIVE; @@ -5986,6 +5992,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)  		norm_mask = norm_mask | LLVertexBuffer::MAP_EMISSIVE;  		normspec_mask = normspec_mask | LLVertexBuffer::MAP_EMISSIVE;  		spec_mask = spec_mask | LLVertexBuffer::MAP_EMISSIVE; +        pbr_mask = pbr_mask | LLVertexBuffer::MAP_EMISSIVE;  	}  	BOOL batch_textures = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT) > 1; @@ -6016,6 +6023,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)          geometryBytes += genDrawInfo(group, norm_mask | extra_mask, sNormFaces[i], norm_count[i], FALSE, FALSE, rigged);          geometryBytes += genDrawInfo(group, spec_mask | extra_mask, sSpecFaces[i], spec_count[i], FALSE, FALSE, rigged);          geometryBytes += genDrawInfo(group, normspec_mask | extra_mask, sNormSpecFaces[i], normspec_count[i], FALSE, FALSE, rigged); +        geometryBytes += genDrawInfo(group, pbr_mask | extra_mask, sPbrFaces[i], pbr_count[i], FALSE, FALSE, rigged);          // for rigged set, add weights and disable alpha sorting (rigged items use depth buffer)          extra_mask |= LLVertexBuffer::MAP_WEIGHT4;  | 
