diff options
| author | Dave Parks <davep@lindenlab.com> | 2023-03-06 10:59:16 -0600 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2023-03-06 10:59:16 -0600 | 
| commit | 56e5385bd25cc50ea0055f5703dc3c24a5acfc93 (patch) | |
| tree | e8c165ab7c2f1104229e253289387a364fcd6b2c | |
| parent | 81f2d5b1813288fac77c5d2884fe16aaa00709f3 (diff) | |
| parent | 3377b19de43dfe0922174240a7844ba8f82eba23 (diff) | |
Merge branch 'DRTVWR-559' of github.com:secondlife/viewer into DRTVWR-559
| -rw-r--r-- | indra/llmath/llvolume.cpp | 11 | ||||
| -rw-r--r-- | indra/newview/llface.cpp | 95 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.h | 1 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 23 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 80 | 
5 files changed, 132 insertions, 78 deletions
| diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 9919af5368..7a694ab10c 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -4863,17 +4863,6 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)  			mTangents = NULL;  		} -        if (src.mTangents) -        { -            allocateTangents(src.mNumVertices); -            LLVector4a::memcpyNonAliased16((F32*)mTangents, (F32*)src.mTangents, vert_size); -        } -        else -        { -            ll_aligned_free_16(mTangents); -            mTangents = nullptr; -        } -  		if (src.mWeights)  		{              llassert(!mWeights); // don't orphan an old alloc here accidentally 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/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 5c1467f28f..ad9e3da379 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -5206,7 +5206,12 @@ BOOL LLViewerWindow::simpleSnapshot(LLImageRaw* raw, S32 image_width, S32 image_          LLPipeline::toggleRenderDebugFeature(LLPipeline::RENDER_DEBUG_FEATURE_UI);      } -    LLPipeline::sShowHUDAttachments = FALSE; +    BOOL hide_hud = LLPipeline::sShowHUDAttachments; +	if (hide_hud) +	{ +		LLPipeline::sShowHUDAttachments = FALSE; +	} +      LLRect window_rect = getWorldViewRectRaw();      S32 original_width = LLPipeline::sRenderDeferred ? gPipeline.mRT->deferredScreen.getWidth() : gViewerWindow->getWorldViewWidthRaw(); @@ -5276,7 +5281,10 @@ BOOL LLViewerWindow::simpleSnapshot(LLImageRaw* raw, S32 image_width, S32 image_          }      } -    LLPipeline::sShowHUDAttachments = TRUE; +	if (hide_hud) +	{ +		LLPipeline::sShowHUDAttachments = TRUE; +	}      setCursor(UI_CURSOR_ARROW); @@ -5351,7 +5359,11 @@ BOOL LLViewerWindow::cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubea          LLPipeline::toggleRenderDebugFeature(LLPipeline::RENDER_DEBUG_FEATURE_UI);      } -    LLPipeline::sShowHUDAttachments = FALSE; +    BOOL hide_hud = LLPipeline::sShowHUDAttachments; +	if (hide_hud) +	{ +		LLPipeline::sShowHUDAttachments = FALSE; +	}      LLRect window_rect = getWorldViewRectRaw();      mWorldViewRectRaw.set(0, res, res, 0); @@ -5417,7 +5429,10 @@ BOOL LLViewerWindow::cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubea          }      } -    LLPipeline::sShowHUDAttachments = TRUE; +	if (hide_hud) +	{ +		LLPipeline::sShowHUDAttachments = TRUE; +	}      gPipeline.resetDrawOrders();      mWorldViewRectRaw = window_rect; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 42e764b492..853c580964 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -628,6 +628,14 @@ void LLVOVolume::animateTextures()                  LLGLTFMaterial *gltf_mat = te->getGLTFRenderMaterial();                  const bool is_pbr = gltf_mat != nullptr; +				if (!facep->mTextureMatrix) +				{ +					facep->mTextureMatrix = new LLMatrix4(); +				} + +				LLMatrix4& tex_mat = *facep->mTextureMatrix; +				tex_mat.setIdentity(); +                  if (!is_pbr)                  {                      if (!(result & LLViewerTextureAnim::ROTATE)) @@ -642,32 +650,50 @@ void LLVOVolume::animateTextures()                      {                          te->getScale(&scale_s, &scale_t);                      } -                } - -				if (!facep->mTextureMatrix) -				{ -					facep->mTextureMatrix = new LLMatrix4(); -				} -				LLMatrix4& tex_mat = *facep->mTextureMatrix; -				tex_mat.setIdentity(); +                    LLVector3 trans ; -				LLVector3 trans ; +                        trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f));			 +                        tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); -					trans.set(LLVector3(off_s+0.5f, off_t+0.5f, 0.f));			 -					tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); +                    LLVector3 scale(scale_s, scale_t, 1.f);			 +                    LLQuaternion quat; +                    quat.setQuat(rot, 0, 0, -1.f); +             +                    tex_mat.rotate(quat);				 -				LLVector3 scale(scale_s, scale_t, 1.f);			 -				LLQuaternion quat; -				quat.setQuat(rot, 0, 0, -1.f); -		 -				tex_mat.rotate(quat);				 +                    LLMatrix4 mat; +                    mat.initAll(scale, LLQuaternion(), LLVector3()); +                    tex_mat *= mat; +             +                    tex_mat.translate(trans); +                } +                else +                { +                    // For PBR materials, use Blinn-Phong rotation as hint for +                    // translation direction. In a Blinn-Phong material, the +                    // translation direction would be a byproduct the texture +                    // transform. +                    F32 rot_frame; +                    te->getRotation(&rot_frame); + +                    tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f)); + +                    LLQuaternion quat; +                    quat.setQuat(rot, 0, 0, -1.f); +                    tex_mat.rotate(quat);				 + +                    LLMatrix4 mat; +                    LLVector3 scale(scale_s, scale_t, 1.f);			 +                    mat.initAll(scale, LLQuaternion(), LLVector3()); +                    tex_mat *= mat; +             +                    LLVector3 off(off_s, off_t, 0.f); +                    off.rotVec(rot_frame, 0, 0, 1.f); +                    tex_mat.translate(off); -				LLMatrix4 mat; -				mat.initAll(scale, LLQuaternion(), LLVector3()); -				tex_mat *= mat; -		 -				tex_mat.translate(trans); +                    tex_mat.translate(LLVector3(0.5f, 0.5f, 0.f)); +                }  			}  		}  		else @@ -5105,6 +5131,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 +5168,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 +5183,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 +5192,7 @@ void LLVolumeGeometryManager::freeFaces()          sNormFaces[i] = NULL;          sSpecFaces[i] = NULL;          sNormSpecFaces[i] = NULL; +        sPbrFaces[i] = NULL;          sAlphaFaces[i] = NULL;      }  } @@ -5596,6 +5626,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 +5908,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 +6007,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 +6018,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 +6049,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; | 
