diff options
| author | andreykproductengine <akleshchev@productengine.com> | 2016-10-18 15:32:01 +0300 | 
|---|---|---|
| committer | andreykproductengine <akleshchev@productengine.com> | 2016-10-18 15:32:01 +0300 | 
| commit | 6b1f96187d7a93a4bbaecf1a84162a141eed5971 (patch) | |
| tree | be7d682276238eee24b005462c9a0577ba554cd2 | |
| parent | 9564600206c0120f2249a48ba54920902c1a11eb (diff) | |
MAINT-6793 Rigged mesh sometimes full of holes
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 6 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llviewercontrol.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 38 | ||||
| -rw-r--r-- | indra/newview/llvovolume.h | 2 | 
5 files changed, 40 insertions, 12 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 28c632b498..017b2a5249 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10273,16 +10273,16 @@        <key>Value</key>        <real>1.0</real>      </map> -    <key>RenderRiggedFactorMultiplier</key> +    <key>RenderRiggedLodCompensation</key>      <map>        <key>Comment</key> -      <string>Affects level of detail for worn rigged meshes</string> +      <string>Affects visibility range of worn rigged meshes to compensate for missing LODs (limited by avatars own visibility)</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key>        <string>F32</string>        <key>Value</key> -      <real>7.5</real> +      <real>6.5</real>      </map>      <key>RenderWater</key>      <map> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index b0829a3da1..bf7e643d0b 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -592,7 +592,7 @@ static void settings_to_globals()  	LLImageGL::sGlobalUseAnisotropic	= gSavedSettings.getBOOL("RenderAnisotropic");  	LLImageGL::sCompressTextures		= gSavedSettings.getBOOL("RenderCompressTextures");  	LLVOVolume::sLODFactor				= gSavedSettings.getF32("RenderVolumeLODFactor"); -	LLVOVolume::sRiggedFactorMultiplier	= gSavedSettings.getF32("RenderRiggedFactorMultiplier"); +	LLVOVolume::sRiggedLODCompensation	= llmax(0.25f, gSavedSettings.getF32("RenderRiggedLodCompensation"));  	LLVOVolume::sDistanceFactor			= 1.f-LLVOVolume::sLODFactor * 0.1f;  	LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");  	LLVOTree::sTreeFactor				= gSavedSettings.getF32("RenderTreeLODFactor"); diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 5e74e9f019..bdd79b0da1 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -209,7 +209,7 @@ static bool handleVolumeLODChanged(const LLSD& newvalue)  static bool handleRiggedLODChanged(const LLSD& newvalue)  { -    LLVOVolume::sRiggedFactorMultiplier = (F32)newvalue.asReal(); +	LLVOVolume::sRiggedLODCompensation = llmax(0.25f, (F32)newvalue.asReal());      return true;  } @@ -625,7 +625,7 @@ void settings_setup_listeners()  	gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));  	gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2)); -	gSavedSettings.getControl("RenderRiggedFactorMultiplier")->getSignal()->connect(boost::bind(&handleRiggedLODChanged, _2)); +	gSavedSettings.getControl("RenderRiggedLodCompensation")->getSignal()->connect(boost::bind(&handleRiggedLODChanged, _2));  	gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));  	gSavedSettings.getControl("RenderAvatarPhysicsLODFactor")->getSignal()->connect(boost::bind(&handleAvatarPhysicsLODChanged, _2));  	gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2)); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 55739915a3..8d86623665 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -80,13 +80,14 @@  const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;  const F32 FORCE_CULL_AREA = 8.f; +static const F32 MINIMUM_RIGGED_RADIUS = 0.05f;  U32 JOINT_COUNT_REQUIRED_FOR_FULLRIG = 20;  BOOL gAnimateTextures = TRUE;  //extern BOOL gHideSelectedObjects;  F32 LLVOVolume::sLODFactor = 1.f; -F32 LLVOVolume::sRiggedFactorMultiplier = 6.f; +F32 LLVOVolume::sRiggedLODCompensation = 6.5f;  F32	LLVOVolume::sLODSlopDistanceFactor = 0.5f; //Changing this to zero, effectively disables the LOD transition slop   F32 LLVOVolume::sDistanceFactor = 1.0f;  S32 LLVOVolume::sNumLODChanges = 0; @@ -1254,12 +1255,39 @@ BOOL LLVOVolume::calcLOD()  		}  		// Note: when changing, take note that a lot of rigged meshes have only one LOD. -		lod_factor *= LLVOVolume::sRiggedFactorMultiplier;  		distance = avatar->mDrawable->mDistanceWRTCamera;  		F32 avatar_radius = avatar->getBinRadius(); -		F32 object_radius = getVolume() ? getVolume()->mLODScaleBias.scaledVec(getScale()).length() : getScale().length(); -		radius = object_radius * LLVOVolume::sRiggedFactorMultiplier; -		radius = llmin(radius, avatar_radius); +		F32 object_radius = 0; + +		LLDrawable* drawablep = mDrawable.get(); +		while (!drawablep->isRoot()) +		{ +			drawablep = drawablep->getParent(); +		} + +		// Mesh can consist of multiple objects that have to be treated as one item or we will +		// get strange deformations or partially missing meshes (smallest elements will disappear) +		LLSpatialBridge* bridge = drawablep->getSpatialBridge(); +		if (bridge) +		{ +			const LLVector4a* ext = bridge->getSpatialExtents(); +			LLVector4a diff; +			diff.setSub(ext[1], ext[0]); +			object_radius = diff.getLength3().getF32(); +		} + +		if (object_radius <= 0) +		{ +			// bridge missing or somehow not updated +			const LLVector4a* ext = mDrawable->getSpatialExtents(); +			LLVector4a diff; +			diff.setSub(ext[1], ext[0]); +			object_radius = diff.getLength3().getF32(); +		} + +		// sRiggedLODCompensation is made to compensate for missing lower lods +		radius = object_radius * LLVOVolume::sRiggedLODCompensation; +		radius = llclamp(radius, MINIMUM_RIGGED_RADIUS, avatar_radius);  	}  	else  	{ diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index ca9917069b..ff005f8dc5 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -379,7 +379,7 @@ private:  public:  	static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop  	static F32 sLODFactor;				// LOD scale factor -	static F32 sRiggedFactorMultiplier;	// Worn rigged LOD scale factor multiplier +	static F32 sRiggedLODCompensation;	// HACK: worn rigged LODs often have only high lod, so we are bumping them up withing avatar's visibility  	static F32 sDistanceFactor;			// LOD distance factor  	static LLPointer<LLObjectMediaDataClient> sObjectMediaClient; | 
