diff options
Diffstat (limited to 'indra/newview')
32 files changed, 421 insertions, 152 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index f3065d12b8..09eda2534c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10643,7 +10643,7 @@      <key>Type</key>      <string>F32</string>      <key>Value</key> -    <real>0.4</real> +    <real>0.5</real>    </map>      <key>RenderShaderLODThreshold</key>      <map> diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl index e0e97bb938..f6870c3ff0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl @@ -110,7 +110,7 @@ void main()      // Combine      vec3 color;      color = (cloudColorSun*(1.-alpha2) + cloudColorAmbient); -    color.rgb= max(vec3(0), color.rgb); +    color.rgb = clamp(color.rgb, vec3(0), vec3(1));      color.rgb *= 2.0;      /// Gamma correct for WL (soft clip effect). diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl index cc4c3b5dce..9d9ba49d82 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -84,6 +84,7 @@ void main()      color.rgb += rainbow(optic_d);      color.rgb += halo_22;      color.rgb *= 2.; +    color.rgb = clamp(color.rgb, vec3(0), vec3(5));      frag_data[0] = vec4(0);      frag_data[1] = vec4(0); diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl index b474a5803f..f51b0f4d9e 100644 --- a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl @@ -25,7 +25,6 @@  uniform mat3 normal_matrix;  uniform mat4 texture_matrix0; -uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix;  in vec3 position; @@ -54,14 +53,27 @@ float calcDirectionalLight(vec3 n, vec3 l)  //==================================================================================================== +#ifdef HAS_SKIN +mat4 getObjectSkinnedTransform(); +uniform mat4 modelview_matrix; +uniform mat4 projection_matrix; +#endif +  void main()  { -	//transform vertex -	vec4 pos = (modelview_matrix * vec4(position.xyz, 1.0)); -	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); +    vec3 norm; +#ifdef HAS_SKIN +    mat4 mat = getObjectSkinnedTransform(); +    mat = modelview_matrix * mat; +    vec4 pos = mat * vec4(position.xyz, 1.0); +    gl_Position = projection_matrix * pos; +    norm = normalize((mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz); +#else +	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  +    norm = normalize(normal_matrix * normal); +#endif +  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -	 -	vec3 norm = normalize(normal_matrix * normal);  	vec4 col = vec4(0,0,0,1); diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl index 1b2a34ef01..41821def8e 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl @@ -364,7 +364,8 @@ return texCUBE(envMap, ReflDirectionWS);  // dir - ray direction in clip space  // i - probe index in refBox/refSphere  // d - distance to nearest wall in clip space -vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d) +// scale - scale of box, default 1.0 +vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d, float scale)  {      // Intersection with OBB convert to unit box space      // Transform in local unit parallax cube space (scaled and rotated) @@ -375,7 +376,7 @@ vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d)      d = 1.0-max(max(abs(PositionLS.x), abs(PositionLS.y)), abs(PositionLS.z)); -    vec3 Unitary = vec3(1.0f, 1.0f, 1.0f); +    vec3 Unitary = vec3(scale);      vec3 FirstPlaneIntersect  = (Unitary - PositionLS) / RayLS;      vec3 SecondPlaneIntersect = (-Unitary - PositionLS) / RayLS;      vec3 FurthestPlane = max(FirstPlaneIntersect, SecondPlaneIntersect); @@ -387,6 +388,11 @@ vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d)      return IntersectPositionCS;  } +vec3 boxIntersect(vec3 origin, vec3 dir, int i, out float d) +{ +    return boxIntersect(origin, dir, i, d, 1.0); +} +  void debugBoxCol(vec3 ro, vec3 rd, float t, vec3 p, inout vec4 col)  {      vec3 v = ro + rd * t; @@ -531,7 +537,7 @@ vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int      if (refIndex[i].w < 0)      {          float d = 0.0; -        v = boxIntersect(pos, dir, i, d); +        v = boxIntersect(pos, dir, i, d, 3.0);          w = max(d, 0.001);      }      else diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index ec2467200a..39f7996c7c 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 57 +version 58  // The version number above should be incremented IF AND ONLY IF some  // change has been made that is sufficiently important to justify  // resetting the graphics preferences of all users to the recommended @@ -163,7 +163,7 @@ RenderScreenSpaceReflections 1  0  RenderReflectionProbeLevel  1   1  // -// Medium High Graphics Settings (deferred enabled) +// Medium High Graphics Settings  //  list MidHigh  RenderAnisotropic			1	1 @@ -192,7 +192,7 @@ RenderScreenSpaceReflections 1  0  RenderReflectionProbeLevel  1   2  // -// High Graphics Settings (deferred + SSAO) +// High Graphics Settings (SSAO + sun shadows)  //  list High  RenderAnisotropic			1	1 @@ -212,7 +212,7 @@ RenderTreeLODFactor			1	0.5  RenderVolumeLODFactor		1	1.5  RenderDeferredSSAO			1	1  RenderUseAdvancedAtmospherics 1 0 -RenderShadowDetail			1	0 +RenderShadowDetail			1	1  WLSkyDetail					1	96  RenderFSAASamples			1	2  RenderReflectionsEnabled    1   1 @@ -221,7 +221,7 @@ RenderScreenSpaceReflections 1  0  RenderReflectionProbeLevel  1   3  // -// High Ultra Graphics Settings (deferred + SSAO + shadows) +// High Ultra Graphics Settings (deferred + SSAO + all shadows)  //  list HighUltra  RenderAnisotropic			1	1 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 0687a3cea1..cce403c7aa 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 52 +version 53  // The version number above should be incremented IF AND ONLY IF some  // change has been made that is sufficiently important to justify  // resetting the graphics preferences of all users to the recommended @@ -161,7 +161,7 @@ RenderScreenSpaceReflections 1  0  RenderReflectionProbeLevel  1   0  // -// Medium High Graphics Settings (deferred enabled) +// Medium High Graphics Settings  //  list MidHigh  RenderAnisotropic			1	1 @@ -190,7 +190,7 @@ RenderScreenSpaceReflections 1  0  RenderReflectionProbeLevel  1   0  // -// High Graphics Settings (deferred + SSAO) +// High Graphics Settings (SSAO + sun shadows)  //  list High  RenderAnisotropic			1	1 @@ -210,7 +210,7 @@ RenderTreeLODFactor			1	0.5  RenderVolumeLODFactor		1	1.5  RenderDeferredSSAO			1	1  RenderUseAdvancedAtmospherics 1 0 -RenderShadowDetail			1	0 +RenderShadowDetail			1	1  WLSkyDetail					1	96  RenderFSAASamples			1	2  RenderReflectionsEnabled    1   1 @@ -219,7 +219,7 @@ RenderScreenSpaceReflections 1  0  RenderReflectionProbeLevel  1   1  // -// High Ultra Graphics Settings (deferred + SSAO + shadows) +// High Ultra Graphics Settings (SSAO + all shadows)  //  list HighUltra  RenderAnisotropic			1	1 diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index abef25e34f..cf84094aa4 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4675,7 +4675,6 @@ public:  static LLTrace::BlockTimerStatHandle FTM_AUDIO_UPDATE("Update Audio");  static LLTrace::BlockTimerStatHandle FTM_CLEANUP("Cleanup");  static LLTrace::BlockTimerStatHandle FTM_CLEANUP_DRAWABLES("Drawables"); -static LLTrace::BlockTimerStatHandle FTM_CLEANUP_OBJECTS("Objects");  static LLTrace::BlockTimerStatHandle FTM_IDLE_CB("Idle Callbacks");  static LLTrace::BlockTimerStatHandle FTM_LOD_UPDATE("Update LOD");  static LLTrace::BlockTimerStatHandle FTM_OBJECTLIST_UPDATE("Update Objectlist"); @@ -4972,7 +4971,6 @@ void LLAppViewer::idle()  	{  		LL_RECORD_BLOCK_TIME(FTM_CLEANUP);  		{ -			LL_RECORD_BLOCK_TIME(FTM_CLEANUP_OBJECTS);  			gObjectList.cleanDeadObjects();  		}  		{ diff --git a/indra/newview/llfloaterenvironmentadjust.cpp b/indra/newview/llfloaterenvironmentadjust.cpp index f9e8963479..18be4fffda 100644 --- a/indra/newview/llfloaterenvironmentadjust.cpp +++ b/indra/newview/llfloaterenvironmentadjust.cpp @@ -174,7 +174,8 @@ void LLFloaterEnvironmentAdjust::refresh()      getChild<LLTextureCtrl>(FIELD_SKY_CLOUD_MAP)->setValue(mLiveSky->getCloudNoiseTextureId());      getChild<LLTextureCtrl>(FIELD_WATER_NORMAL_MAP)->setValue(mLiveWater->getNormalMapID()); -    getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->setValue(mLiveSky->getReflectionProbeAmbiance()); +    static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", true); +    getChild<LLUICtrl>(FIELD_REFLECTION_PROBE_AMBIANCE)->setValue(mLiveSky->getReflectionProbeAmbiance(should_auto_adjust));      LLColor3 glow(mLiveSky->getGlow()); @@ -488,7 +489,9 @@ void LLFloaterEnvironmentAdjust::onReflectionProbeAmbianceChanged()  void LLFloaterEnvironmentAdjust::updateGammaLabel()  {      if (!mLiveSky) return; -    F32 ambiance = mLiveSky->getReflectionProbeAmbiance(); + +    static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", true); +    F32 ambiance = mLiveSky->getReflectionProbeAmbiance(should_auto_adjust);      if (ambiance != 0.f)      {          childSetValue("scene_gamma_label", getString("hdr_string")); diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp index b9dc14ac1a..bb6584302d 100644 --- a/indra/newview/llfloaterfixedenvironment.cpp +++ b/indra/newview/llfloaterfixedenvironment.cpp @@ -182,6 +182,12 @@ void LLFloaterFixedEnvironment::setEditSettingsAndUpdate(const LLSettingsBase::p      syncronizeTabs();      refresh();      LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT); + +    // teach user about HDR settings +    if (mSettings && ((LLSettingsSky*)mSettings.get())->canAutoAdjust()) +    { +        LLNotificationsUtil::add("AutoAdjustHDRSky"); +    }  }  void LLFloaterFixedEnvironment::syncronizeTabs() diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 67bf6827ad..57ac111fdf 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -4067,7 +4067,7 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol  			if (sys_volume)  			{  				sys_volume->copyVolumeFaces(volume); -				sys_volume->setMeshAssetLoaded(TRUE); +				sys_volume->setMeshAssetLoaded(true);  				LLPrimitive::getVolumeManager()->unrefVolume(sys_volume);  			}  			else @@ -4099,6 +4099,12 @@ void LLMeshRepository::notifyMeshUnavailable(const LLVolumeParams& mesh_params,  	{  		F32 detail = LLVolumeLODGroup::getVolumeScaleFromDetail(lod); +        LLVolume* sys_volume = LLPrimitive::getVolumeManager()->refVolume(mesh_params, detail); +        if (sys_volume) +        { +            sys_volume->setMeshAssetUnavaliable(true); +        } +  		for (LLVOVolume* vobj : obj_iter->second)  		{  			if (vobj) @@ -4255,6 +4261,37 @@ bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id)      return false;  } +bool LLMeshRepository::hasSkinInfo(const LLUUID& mesh_id) +{ +    if (mesh_id.isNull()) +    { +        return false; +    } + +    if (mThread->hasSkinInfoInHeader(mesh_id)) +    { +        return true; +    } + +    const LLMeshSkinInfo* skininfo = getSkinInfo(mesh_id); +    if (skininfo) +    { +        return true; +    } + +    return false; +} + +bool LLMeshRepository::hasHeader(const LLUUID& mesh_id) +{ +    if (mesh_id.isNull()) +    { +        return false; +    } + +    return mThread->hasHeader(mesh_id); +} +  bool LLMeshRepoThread::hasPhysicsShapeInHeader(const LLUUID& mesh_id)  {      LLMutexLock lock(mHeaderMutex); @@ -4271,6 +4308,29 @@ bool LLMeshRepoThread::hasPhysicsShapeInHeader(const LLUUID& mesh_id)      return false;  } +bool LLMeshRepoThread::hasSkinInfoInHeader(const LLUUID& mesh_id) +{ +    LLMutexLock lock(mHeaderMutex); +    mesh_header_map::iterator iter = mMeshHeader.find(mesh_id); +    if (iter != mMeshHeader.end() && iter->second.first > 0) +    { +        LLMeshHeader& mesh = iter->second.second; +        if (mesh.mSkinOffset >= 0 +            && mesh.mSkinSize > 0) +        { +            return true; +        } +    } + +    return false; +} + +bool LLMeshRepoThread::hasHeader(const LLUUID& mesh_id) +{ +    LLMutexLock lock(mHeaderMutex); +    mesh_header_map::iterator iter = mMeshHeader.find(mesh_id); +    return iter != mMeshHeader.end(); +}  void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,  								   bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position, diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 619e076fa6..89cd2d867f 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -401,6 +401,8 @@ public:  	bool decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size);  	EMeshProcessingResult physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size);  	bool hasPhysicsShapeInHeader(const LLUUID& mesh_id); +    bool hasSkinInfoInHeader(const LLUUID& mesh_id); +    bool hasHeader(const LLUUID& mesh_id);  	void notifyLoadedMeshes();  	S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod); @@ -650,6 +652,8 @@ public:  	LLModel::Decomposition* getDecomposition(const LLUUID& mesh_id);  	void fetchPhysicsShape(const LLUUID& mesh_id);  	bool hasPhysicsShape(const LLUUID& mesh_id); +    bool hasSkinInfo(const LLUUID& mesh_id); +    bool hasHeader(const LLUUID& mesh_id);  	void buildHull(const LLVolumeParams& params, S32 detail);  	void buildPhysicsMesh(LLModel::Decomposition& decomp); diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index c98e0e1bbe..6ceffd452e 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -2751,6 +2751,16 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)          base_iter++; +        bool skinned = include_skin_weights && !mdl->mSkinWeights.empty(); + +        LLMatrix4a mat_normal; +        if (skinned) +        { +            glh::matrix4f m((F32*)mdl->mSkinInfo.mBindShapeMatrix.getF32ptr()); +            m = m.inverse().transpose(); +            mat_normal.loadu(m.m); +        } +          S32 num_faces = mdl->getNumVolumeFaces();          for (S32 i = 0; i < num_faces; ++i)          { @@ -2765,7 +2775,7 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)              LLVertexBuffer* vb = NULL; -            bool skinned = include_skin_weights && !mdl->mSkinWeights.empty(); +                          U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; @@ -2803,6 +2813,15 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)              LLVector4a::memcpyNonAliased16((F32*)vertex_strider.get(), (F32*)vf.mPositions, num_vertices * 4 * sizeof(F32)); +            if (skinned) +            { +                for (U32 i = 0; i < num_vertices; ++i) +                { +                    LLVector4a* v = (LLVector4a*)vertex_strider.get(); +                    mdl->mSkinInfo.mBindShapeMatrix.affineTransform(*v, *v); +                    vertex_strider++; +                } +            }              if (vf.mTexCoords)              {                  vb->getTexCoord0Strider(tc_strider); @@ -2813,7 +2832,25 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights)              if (vf.mNormals)              {                  vb->getNormalStrider(normal_strider); -                LLVector4a::memcpyNonAliased16((F32*)normal_strider.get(), (F32*)vf.mNormals, num_vertices * 4 * sizeof(F32)); + +                if (skinned) +                { +                    F32* normals = (F32*)normal_strider.get(); +                    LLVector4a* src = vf.mNormals; +                    LLVector4a* end = src + num_vertices; + +                    while (src < end) +                    { +                        LLVector4a normal; +                        mat_normal.rotate(*src++, normal); +                        normal.store4a(normals); +                        normals += 4; +                    } +                } +                else +                { +                    LLVector4a::memcpyNonAliased16((F32*)normal_strider.get(), (F32*)vf.mNormals, num_vertices * 4 * sizeof(F32)); +                }              }              if (skinned) @@ -3276,7 +3313,7 @@ BOOL LLModelPreview::render()          refresh();      } -    gObjectPreviewProgram.bind(); +    gObjectPreviewProgram.bind(skin_weight);      gGL.loadIdentity();      gPipeline.enableLightsPreview(); @@ -3351,11 +3388,11 @@ BOOL LLModelPreview::render()                  }                  gGL.pushMatrix(); +                  LLMatrix4 mat = instance.mTransform;                  gGL.multMatrix((GLfloat*)mat.mMatrix); - - +                          U32 num_models = mVertexBuffer[mPreviewLOD][model].size();                  for (U32 i = 0; i < num_models; ++i)                  { @@ -3685,65 +3722,41 @@ BOOL LLModelPreview::render()                          {                              LLVertexBuffer* buffer = mVertexBuffer[mPreviewLOD][model][i]; -                            const LLVolumeFace& face = model->getVolumeFace(i); - -                            LLStrider<LLVector3> position; -                            buffer->getVertexStrider(position); - -                            LLStrider<LLVector4> weight; -                            buffer->getWeight4Strider(weight); +                            model->mSkinInfo.updateHash(); +                            LLRenderPass::uploadMatrixPalette(mPreviewAvatar, &model->mSkinInfo); -                            //quick 'n dirty software vertex skinning - -                            //build matrix palette - -                            LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT]; -                            LLSkinningUtil::initSkinningMatrixPalette(mat, joint_count, -                                skin, getPreviewAvatar()); +                            gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -                            const LLMatrix4a& bind_shape_matrix = skin->mBindShapeMatrix; -                            U32 max_joints = LLSkinningUtil::getMaxJointCount(); -                            for (U32 j = 0; j < buffer->getNumVerts(); ++j) +                            if (textures)                              { -                                LLMatrix4a final_mat; -                                F32 *wptr = weight[j].mV; -                                LLSkinningUtil::getPerVertexSkinMatrix(wptr, mat, true, final_mat, max_joints); - -                                //VECTORIZE THIS -                                LLVector4a& v = face.mPositions[j]; +                                int materialCnt = instance.mModel->mMaterialList.size(); +                                if (i < materialCnt) +                                { +                                    const std::string& binding = instance.mModel->mMaterialList[i]; +                                    const LLImportMaterial& material = instance.mMaterial[binding]; -                                LLVector4a t; -                                LLVector4a dst; -                                bind_shape_matrix.affineTransform(v, t); -                                final_mat.affineTransform(t, dst); +                                    gGL.diffuseColor4fv(material.mDiffuseColor.mV); -                                position[j][0] = dst[0]; -                                position[j][1] = dst[1]; -                                position[j][2] = dst[2]; +                                    // Find the tex for this material, bind it, and add it to our set +                                    // +                                    LLViewerFetchedTexture* tex = bindMaterialDiffuseTexture(material); +                                    if (tex) +                                    { +                                        mTextureSet.insert(tex); +                                    } +                                }                              } - -                            llassert(model->mMaterialList.size() > i); -                            const std::string& binding = instance.mModel->mMaterialList[i]; -                            const LLImportMaterial& material = instance.mMaterial[binding]; - -                            buffer->unmapBuffer(); - -                            buffer->setBuffer(); -                            gGL.diffuseColor4fv(material.mDiffuseColor.mV); -                            gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - -                            // Find the tex for this material, bind it, and add it to our set -                            // -                            LLViewerFetchedTexture* tex = bindMaterialDiffuseTexture(material); -                            if (tex) +                            else                              { -                                mTextureSet.insert(tex); +                                gGL.diffuseColor4fv(PREVIEW_BASE_COL.mV);                              } +                            buffer->setBuffer();                              buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);                              if (edges)                              { +                                gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);                                  gGL.diffuseColor4fv(PREVIEW_EDGE_COL.mV);                                  glLineWidth(PREVIEW_EDGE_WIDTH);                                  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); diff --git a/indra/newview/llpaneleditsky.cpp b/indra/newview/llpaneleditsky.cpp index a14af27e59..761d856aae 100644 --- a/indra/newview/llpaneleditsky.cpp +++ b/indra/newview/llpaneleditsky.cpp @@ -36,6 +36,7 @@  #include "llsettingssky.h"  #include "llenvironment.h"  #include "llatmosphere.h" +#include "llviewercontrol.h"  namespace  {    @@ -207,7 +208,9 @@ void LLPanelSettingsSkyAtmosTab::refresh()      F32 moisture_level  = mSkySettings->getSkyMoistureLevel();      F32 droplet_radius  = mSkySettings->getSkyDropletRadius();      F32 ice_level       = mSkySettings->getSkyIceLevel(); -    F32 rp_ambiance     = mSkySettings->getReflectionProbeAmbiance(); + +    static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", true); +    F32 rp_ambiance     = mSkySettings->getReflectionProbeAmbiance(should_auto_adjust);      getChild<LLUICtrl>(FIELD_SKY_DENSITY_MOISTURE_LEVEL)->setValue(moisture_level);      getChild<LLUICtrl>(FIELD_SKY_DENSITY_DROPLET_RADIUS)->setValue(droplet_radius); diff --git a/indra/newview/llreflectionmap.cpp b/indra/newview/llreflectionmap.cpp index 72dab0cba8..efaf068bd2 100644 --- a/indra/newview/llreflectionmap.cpp +++ b/indra/newview/llreflectionmap.cpp @@ -117,7 +117,7 @@ void LLReflectionMap::autoAdjustOrigin()              {                  int face = -1;                  LLVector4a intersection; -                LLDrawable* drawable = mGroup->lineSegmentIntersect(bounds[0], corners[i], true, false, true, &face, &intersection); +                LLDrawable* drawable = mGroup->lineSegmentIntersect(bounds[0], corners[i], false, false, true, &face, &intersection);                  if (drawable != nullptr)                  {                      hit = true; diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index 779fe8bfd9..bb0bb04797 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -253,6 +253,10 @@ void LLReflectionMapManager::update()          if (probe != mDefaultProbe)          { +            if (probe->mViewerObject) //make sure probes track the viewer objects they are attached to +            { +                probe->mOrigin.load3(probe->mViewerObject->getPositionAgent().mV); +            }              d.setSub(camera_pos, probe->mOrigin);              probe->mDistance = d.getLength3().getF32() - probe->mRadius;          } diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 978cb78083..f52f1a925d 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -777,7 +777,8 @@ void LLSpatialGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* c  	assert_states_valid(this);  } -void LLSpatialGroup::destroyGL(bool keep_occlusion)  + +void LLSpatialGroup::destroyGLState(bool keep_occlusion)   {  	setState(LLSpatialGroup::GEOM_DIRTY | LLSpatialGroup::IMAGE_DIRTY); @@ -1290,45 +1291,11 @@ void drawBoxOutline(const LLVector4a& pos, const LLVector4a& size)  	drawBoxOutline(reinterpret_cast<const LLVector3&>(pos), reinterpret_cast<const LLVector3&>(size));  } -class LLOctreeDirty : public OctreeTraveler -{ -public: -	virtual void visit(const OctreeNode* state) -	{ -		LLSpatialGroup* group = (LLSpatialGroup*) state->getListener(0); -		group->destroyGL(); - -		for (LLSpatialGroup::element_iter i = group->getDataBegin(); i != group->getDataEnd(); ++i) -		{ -			LLDrawable* drawable = (LLDrawable*)(*i)->getDrawable(); -			if(!drawable) -			{ -				continue; -			} -			if (drawable->getVObj().notNull() && !group->getSpatialPartition()->mRenderByGroup) -			{ -				gPipeline.markRebuild(drawable, LLDrawable::REBUILD_ALL); -			} -		} - -		for (LLSpatialGroup::bridge_list_t::iterator i = group->mBridgeList.begin(); i != group->mBridgeList.end(); ++i) -		{ -			LLSpatialBridge* bridge = *i; -			traverse(bridge->mOctree); -		} -	} -};  void LLSpatialPartition::restoreGL()  {  } -void LLSpatialPartition::resetVertexBuffers() -{ -	LLOctreeDirty dirty; -	dirty.traverse(mOctree); -} -  BOOL LLSpatialPartition::getVisibleExtents(LLCamera& camera, LLVector3& visMin, LLVector3& visMax)  {      LL_PROFILE_ZONE_SCOPED_CATEGORY_SPATIAL; diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 053ce9e60b..88584f535a 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -295,7 +295,9 @@ public:  	BOOL removeObject(LLDrawable *drawablep, BOOL from_octree = FALSE);  	BOOL updateInGroup(LLDrawable *drawablep, BOOL immediate = FALSE); // Update position if it's in the group  	void shift(const LLVector4a &offset); -	void destroyGL(bool keep_occlusion = false); + +    // TODO: this no longer appears to be called, figure out if it's important and if not remove it +	void destroyGLState(bool keep_occlusion = false);  	void updateDistance(LLCamera& camera);  	F32 getUpdateUrgency() const; @@ -419,7 +421,6 @@ public:  	void renderDebug();  	void renderIntersectingBBoxes(LLCamera* camera);  	void restoreGL(); -	void resetVertexBuffers();  	BOOL getVisibleExtents(LLCamera& camera, LLVector3& visMin, LLVector3& visMax); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index b9042b3496..6e5c268c00 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7826,10 +7826,6 @@ class LLToggleShaderControl : public view_listener_t  		BOOL checked = gSavedSettings.getBOOL( control_name );  		gSavedSettings.setBOOL( control_name, !checked );          LLPipeline::refreshCachedSettings(); -        //gPipeline.updateRenderDeferred(); -		//gPipeline.releaseGLBuffers(); -		//gPipeline.createGLBuffers(); -		//gPipeline.resetVertexBuffers();          LLViewerShaderMgr::instance()->setShaders();  		return !checked;  	} @@ -8560,6 +8556,9 @@ class LLViewHighlightTransparent : public view_listener_t  	bool handleEvent(const LLSD& userdata)  	{  		LLDrawPoolAlpha::sShowDebugAlpha = !LLDrawPoolAlpha::sShowDebugAlpha; + +        // invisible objects skip building their render batches unless sShowDebugAlpha is true, so rebuild batches whenever toggling this flag +        gPipeline.rebuildDrawInfo();   		return true;  	}  }; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 004674997b..d21d6f7027 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -418,6 +418,7 @@ void LLViewerObject::markDead()  {  	if (!mDead)  	{ +        LL_PROFILE_ZONE_SCOPED;  		//LL_INFOS() << "Marking self " << mLocalID << " as dead." << LL_ENDL;  		// Root object of this hierarchy unlinks itself. @@ -1153,6 +1154,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys,  					 const EObjectUpdateType update_type,  					 LLDataPacker *dp)  { +    LL_PROFILE_ZONE_SCOPED;  	LL_DEBUGS_ONCE("SceneLoadTiming") << "Received viewer object data" << LL_ENDL;      LL_DEBUGS("ObjectUpdate") << " mesgsys " << mesgsys << " dp " << dp << " id " << getID() << " update_type " << (S32) update_type << LL_ENDL; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index e576784db8..ce4f9b7e64 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1353,6 +1353,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)  BOOL LLViewerObjectList::killObject(LLViewerObject *objectp)  { +    LL_PROFILE_ZONE_SCOPED;  	// Don't ever kill gAgentAvatarp, just force it to the agent's region  	// unless region is NULL which is assumed to mean you are logging out.  	if ((objectp == gAgentAvatarp) && gAgent.getRegion()) @@ -1379,6 +1380,7 @@ BOOL LLViewerObjectList::killObject(LLViewerObject *objectp)  void LLViewerObjectList::killObjects(LLViewerRegion *regionp)  { +    LL_PROFILE_ZONE_SCOPED;  	LLViewerObject *objectp; @@ -1438,6 +1440,8 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)  		return;  	} +    LL_PROFILE_ZONE_SCOPED; +  	S32 num_removed = 0;  	LLViewerObject *objectp; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index d60fae4bd6..6b92b16ef4 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -716,6 +716,7 @@ static LLTrace::BlockTimerStatHandle FTM_SAVE_REGION_CACHE("Save Region Cache");  LLViewerRegion::~LLViewerRegion()   { +    LL_PROFILE_ZONE_SCOPED;  	mDead = TRUE;  	mImpl->mActiveSet.clear();  	mImpl->mVisibleEntries.clear(); @@ -1590,6 +1591,7 @@ void LLViewerRegion::lightIdleUpdate()  void LLViewerRegion::idleUpdate(F32 max_update_time)  {	 +    LL_PROFILE_ZONE_SCOPED;  	LLTimer update_timer;  	F32 max_time; @@ -1693,6 +1695,10 @@ BOOL LLViewerRegion::isViewerCameraStatic()  void LLViewerRegion::killInvisibleObjects(F32 max_time)  { +#if 1 // TODO: kill this.  This is ill-conceived, objects that aren't in the camera frustum should not be deleted from memory. +        // because of this, every time you turn around the simulator sends a swarm of full object update messages from cache +    // probe misses and objects have to be reloaded from scratch.  From some reason, disabling this causes holes to  +    // appear in the scene when flying back and forth between regions  	if(!sVOCacheCullingEnabled)  	{  		return; @@ -1769,6 +1775,7 @@ void LLViewerRegion::killInvisibleObjects(F32 max_time)  	}  	return; +#endif  }  void LLViewerRegion::killObject(LLVOCacheEntry* entry, std::vector<LLDrawable*>& delete_list) diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 5eae1dfb18..4559d71d6d 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -92,6 +92,7 @@ LLGLSLShader    gCopyDepthProgram;  //object shaders  LLGLSLShader		gObjectPreviewProgram; +LLGLSLShader        gSkinnedObjectPreviewProgram;  LLGLSLShader        gPhysicsPreviewProgram;  LLGLSLShader		gObjectFullbrightAlphaMaskProgram;  LLGLSLShader        gSkinnedObjectFullbrightAlphaMaskProgram; @@ -251,7 +252,6 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderList.push_back(&gWaterProgram);  	mShaderList.push_back(&gWaterEdgeProgram);  	mShaderList.push_back(&gAvatarEyeballProgram);  -	mShaderList.push_back(&gObjectPreviewProgram);  	mShaderList.push_back(&gImpostorProgram);  	mShaderList.push_back(&gObjectBumpProgram);      mShaderList.push_back(&gSkinnedObjectBumpProgram); @@ -2876,20 +2876,16 @@ BOOL LLViewerShaderMgr::loadShadersObject()  	if (success)  	{ -		gObjectPreviewProgram.mName = "Simple Shader"; -		gObjectPreviewProgram.mFeatures.calculatesLighting = false; -		gObjectPreviewProgram.mFeatures.calculatesAtmospherics = false; -		gObjectPreviewProgram.mFeatures.hasGamma = false; -		gObjectPreviewProgram.mFeatures.hasAtmospherics = false; -		gObjectPreviewProgram.mFeatures.hasLighting = false; -		gObjectPreviewProgram.mFeatures.mIndexedTextureChannels = 0; +		gObjectPreviewProgram.mName = "Object Preview Shader";  		gObjectPreviewProgram.mFeatures.disableTextureIndex = true;  		gObjectPreviewProgram.mShaderFiles.clear();  		gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewV.glsl", GL_VERTEX_SHADER));  		gObjectPreviewProgram.mShaderFiles.push_back(make_pair("objects/previewF.glsl", GL_FRAGMENT_SHADER));  		gObjectPreviewProgram.mShaderLevel = mShaderLevel[SHADER_OBJECT]; +        success = make_rigged_variant(gObjectPreviewProgram, gSkinnedObjectPreviewProgram);  		success = gObjectPreviewProgram.createShader(NULL, NULL);  		gObjectPreviewProgram.mFeatures.hasLighting = true; +        gSkinnedObjectPreviewProgram.mFeatures.hasLighting = true;  	}  	if (success) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index c7a2cea627..22cd9f71b3 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -7574,6 +7574,85 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO )  	}  } +bool LLVOAvatar::hasPendingAttachedMeshes() +{ +    for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); +         iter != mAttachmentPoints.end(); +         ++iter) +    { +        LLViewerJointAttachment* attachment = iter->second; +        if (attachment) +        { +            for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); +                 attachment_iter != attachment->mAttachedObjects.end(); +                 ++attachment_iter) +            { +                LLViewerObject* objectp = attachment_iter->get(); +                if (objectp) +                { +                    LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); +                    for (LLViewerObject::child_list_t::const_iterator iter1 = child_list.begin(); +                         iter1 != child_list.end(); ++iter1) +                    { +                        LLViewerObject* objectchild = *iter1; +                        if (objectchild && objectchild->getVolume()) +                        { +                            const LLUUID& mesh_id = objectchild->getVolume()->getParams().getSculptID(); +                            if (mesh_id.isNull()) +                            { +                                // No mesh nor skin info needed +                                continue; +                            } + +                            if (objectchild->getVolume()->isMeshAssetUnavaliable()) +                            { +                                // Mesh failed to load, do not expect it +                                continue; +                            } + +                            if (objectchild->mDrawable) +                            { +                                LLVOVolume* pvobj = objectchild->mDrawable->getVOVolume(); +                                if (pvobj) +                                { +                                    if (!pvobj->isMesh()) +                                    { +                                        // Not a mesh +                                        continue; +                                    } + +                                    if (!objectchild->getVolume()->isMeshAssetLoaded()) +                                    { +                                        // Waiting for mesh +                                        return true; +                                    } + +                                    const LLMeshSkinInfo* skin_data = pvobj->getSkinInfo(); +                                    if (skin_data) +                                    { +                                        // Skin info present, done +                                        continue; +                                    } + +                                    if (pvobj->isSkinInfoUnavaliable()) +                                    { +                                        // Load failed or info not present, don't expect it +                                        continue; +                                    } +                                } + +                                // objectchild is not ready +                                return true; +                            } +                        } +                    } +                } +            } +        } +    } +    return false; +} +  //-----------------------------------------------------------------------------  // detachObject()  //----------------------------------------------------------------------------- @@ -8150,6 +8229,7 @@ BOOL LLVOAvatar::updateIsFullyLoaded()                     || (mLoadedCallbackTextures < mCallbackTextureList.size() && mLastTexCallbackAddedTime.getElapsedTimeF32() < MAX_TEXTURE_WAIT_TIME_SEC)                     || !mPendingAttachment.empty()                     || (rez_status < 3 && !isFullyBaked()) +                   || hasPendingAttachedMeshes()                    );  	}  	updateRezzedStatusTimers(rez_status); diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index f1dc503c9e..48bfd5293a 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -917,6 +917,7 @@ public:  	virtual BOOL 		detachObject(LLViewerObject *viewer_object);  	static bool		    getRiggedMeshID( LLViewerObject* pVO, LLUUID& mesh_id );  	void				cleanupAttachedMesh( LLViewerObject* pVO ); +    bool                hasPendingAttachedMeshes();  	static LLVOAvatar*  findAvatarFromAttachment(LLViewerObject* obj);  	/*virtual*/ BOOL	isWearingWearableType(LLWearableType::EType type ) const;  	LLViewerObject *	findAttachmentByID( const LLUUID & target_id ) const; diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 7081ecaa4b..a4070a513c 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -105,7 +105,7 @@ bool LLGLTFOverrideCacheEntry::fromLLSD(const LLSD& data)                  std::string error, warn;                  if (override_mat->fromJSON(gltf_json_str, warn, error))                  { -                    mGLTFMaterial[i] = override_mat; +                    mGLTFMaterial[side_idx] = override_mat;                  }                  else                  { @@ -126,6 +126,16 @@ bool LLGLTFOverrideCacheEntry::fromLLSD(const LLSD& data)              LL_WARNS_IF(sides.size() != 0, "GLTF") << "broken override cache entry" << LL_ENDL;          }      } + +    llassert(mSides.size() == mGLTFMaterial.size()); +#ifdef SHOW_ASSERT +    for (auto const & side : mSides) +    { +        // check that mSides and mGLTFMaterial have exactly the same keys present +        llassert(mGLTFMaterial.count(side.first) == 1); +    } +#endif +      return true;  } @@ -141,8 +151,11 @@ LLSD LLGLTFOverrideCacheEntry::toLLSD() const      data["object_id"] = mObjectId;      data["local_id"] = (LLSD::Integer) mLocalId; +    llassert(mSides.size() == mGLTFMaterial.size());      for (auto const & side : mSides)      { +        // check that mSides and mGLTFMaterial have exactly the same keys present +        llassert(mGLTFMaterial.count(side.first) == 1);          data["sides"].append(LLSD::Integer(side.first));          data["gltf_json"].append(side.second);      } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 8160785d75..08d2e99c40 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -230,7 +230,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re      mColorChanged = FALSE;  	mSpotLightPriority = 0.f; -	mSkinInfoFailed = false; +    mSkinInfoUnavaliable = false;  	mSkinInfo = NULL;  	mMediaImplList.resize(getNumTEs()); @@ -244,6 +244,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re  LLVOVolume::~LLVOVolume()  { +    LL_PROFILE_ZONE_SCOPED;  	delete mTextureAnimp;  	mTextureAnimp = NULL;  	delete mVolumeImpl; @@ -267,6 +268,7 @@ void LLVOVolume::markDead()  {  	if (!mDead)  	{ +        LL_PROFILE_ZONE_SCOPED;          if (getVolume())          {              LLSculptIDSize::instance().rem(getVolume()->getParams().getSculptID()); @@ -1132,7 +1134,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo  				if (mSkinInfo && mSkinInfo->mMeshID != volume_params.getSculptID())  				{  					mSkinInfo = NULL; -					mSkinInfoFailed = false; +					mSkinInfoUnavaliable = false;  				}  				if (!getVolume()->isMeshAssetLoaded()) @@ -1145,13 +1147,24 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo  					}  				} -				if (!mSkinInfo && !mSkinInfoFailed) +				if (!mSkinInfo && !mSkinInfoUnavaliable)  				{ -					const LLMeshSkinInfo* skin_info = gMeshRepo.getSkinInfo(volume_params.getSculptID(), this); -					if (skin_info) -					{ -						notifySkinInfoLoaded(skin_info); -					} +                    LLUUID mesh_id = volume_params.getSculptID(); +                    if (gMeshRepo.hasHeader(mesh_id) && !gMeshRepo.hasSkinInfo(mesh_id)) +                    { +                        // If header is present but has no data about skin, +                        // no point fetching +                        mSkinInfoUnavaliable = true; +                    } + +                    if (!mSkinInfoUnavaliable) +                    { +                        const LLMeshSkinInfo* skin_info = gMeshRepo.getSkinInfo(mesh_id, this); +                        if (skin_info) +                        { +                            notifySkinInfoLoaded(skin_info); +                        } +                    }  				}  			}  			else // otherwise is sculptie @@ -1186,7 +1199,7 @@ void LLVOVolume::updateSculptTexture()  			mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);  		} -		mSkinInfoFailed = false; +        mSkinInfoUnavaliable = false;  		mSkinInfo = NULL;  	}  	else @@ -1227,6 +1240,16 @@ void LLVOVolume::notifyMeshLoaded()  	mSculptChanged = TRUE;  	gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY); +    if (!mSkinInfo && !mSkinInfoUnavaliable) +    { +        // Header was loaded, update skin info state from header +        LLUUID mesh_id = getVolume()->getParams().getSculptID(); +        if (!gMeshRepo.hasSkinInfo(mesh_id)) +        { +            mSkinInfoUnavaliable = true; +        } +    } +      LLVOAvatar *av = getAvatar();      if (av && !isAnimatedObject())      { @@ -1244,7 +1267,7 @@ void LLVOVolume::notifyMeshLoaded()  void LLVOVolume::notifySkinInfoLoaded(const LLMeshSkinInfo* skin)  { -	mSkinInfoFailed = false; +    mSkinInfoUnavaliable = false;  	mSkinInfo = skin;  	notifyMeshLoaded(); @@ -1252,7 +1275,7 @@ void LLVOVolume::notifySkinInfoLoaded(const LLMeshSkinInfo* skin)  void LLVOVolume::notifySkinInfoUnavailable()  { -	mSkinInfoFailed = true; +	mSkinInfoUnavaliable = true;  	mSkinInfo = nullptr;  } @@ -4676,7 +4699,12 @@ BOOL LLVOVolume::lineSegmentIntersect(const LLVector4a& start, const LLVector4a&  			end_face = face+1;  		}  		pick_transparent |= isHiglightedOrBeacon(); -		bool special_cursor = specialHoverCursor(); + +        // we *probably* shouldn't care about special cursor at all, but we *definitely* +        // don't care about special cursor for reflection probes -- makes alt-zoom +        // go through reflection probes on vehicles +		bool special_cursor = mReflectionProbe.isNull() && specialHoverCursor(); +  		for (S32 i = start_face; i < end_face; ++i)  		{  			if (!special_cursor && !pick_transparent && getTE(i) && getTE(i)->getColor().mV[3] == 0.f) @@ -5589,11 +5617,21 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)              std::string vobj_name = llformat("Vol%p", vobj);              bool is_mesh = vobj->isMesh(); -			if (is_mesh && -				((vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded()) || !gMeshRepo.meshRezEnabled())) -			{ -				continue; -			} +            if (is_mesh) +            { +                if ((vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded()) +                    || !gMeshRepo.meshRezEnabled()) +                { +                    // Waiting for asset to fetch +                    continue; +                } + +                if (!vobj->getSkinInfo() && !vobj->isSkinInfoUnavaliable()) +                { +                     // Waiting for skin info to fetch +                     continue; +                } +            }  			LLVolume* volume = vobj->getVolume();  			if (volume) diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index acba18383f..aadc1fbcf3 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -330,6 +330,7 @@ public:  	BOOL setIsFlexible(BOOL is_flexible);      const LLMeshSkinInfo* getSkinInfo() const; +    const bool isSkinInfoUnavaliable() const { return mSkinInfoUnavaliable; }      //convenience accessor for mesh ID (which is stored in sculpt id for legacy reasons)      const LLUUID& getMeshID() const { return getVolume()->getParams().getSculptID(); } @@ -480,7 +481,7 @@ private:  	LLPointer<LLRiggedVolume> mRiggedVolume; -	bool mSkinInfoFailed; +	bool mSkinInfoUnavaliable;  	LLConstPointer<LLMeshSkinInfo> mSkinInfo;  	// statics  public: diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 0e0dbdc071..709a457862 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -111,7 +111,7 @@ LLWorld::LLWorld() :  	gGL.getTexUnit(0)->bind(mDefaultWaterTexturep);  	mDefaultWaterTexturep->setAddressMode(LLTexUnit::TAM_CLAMP); -	LLViewerRegion::sVOCacheCullingEnabled = gSavedSettings.getBOOL("RequestFullRegionCache") && gSavedSettings.getBOOL("ObjectCacheEnabled"); +    LLViewerRegion::sVOCacheCullingEnabled = gSavedSettings.getBOOL("RequestFullRegionCache") && gSavedSettings.getBOOL("ObjectCacheEnabled");  } @@ -681,6 +681,7 @@ static LLTrace::SampleStatHandle<> sNumActiveCachedObjects("numactivecachedobjec  void LLWorld::updateRegions(F32 max_update_time)  { +    LL_PROFILE_ZONE_SCOPED;  	LLTimer update_timer;  	mNumOfActiveCachedObjects = 0; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 38f27d4dfa..0c767e7767 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -10593,8 +10593,42 @@ void LLPipeline::handleShadowDetailChanged()      }  } -void LLPipeline::overrideEnvironmentMap() +class LLOctreeDirty : public OctreeTraveler  { -    //mReflectionMapManager.mProbes.clear(); -    //mReflectionMapManager.addProbe(LLViewerCamera::instance().getOrigin()); +public: +    virtual void visit(const OctreeNode* state) +    { +        LLSpatialGroup* group = (LLSpatialGroup*)state->getListener(0); + +        if (group->getSpatialPartition()->mRenderByGroup) +        { +            group->setState(LLSpatialGroup::GEOM_DIRTY); +            gPipeline.markRebuild(group); +        } + +        for (LLSpatialGroup::bridge_list_t::iterator i = group->mBridgeList.begin(); i != group->mBridgeList.end(); ++i) +        { +            LLSpatialBridge* bridge = *i; +            traverse(bridge->mOctree); +        } +    } +}; + + +void LLPipeline::rebuildDrawInfo() +{ +    for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); +        iter != LLWorld::getInstance()->getRegionList().end(); ++iter) +    { +        LLViewerRegion* region = *iter; + +        LLOctreeDirty dirty; + +        LLSpatialPartition* part = region->getSpatialPartition(LLViewerRegion::PARTITION_VOLUME); +        dirty.traverse(part->mOctree); + +        part = region->getSpatialPartition(LLViewerRegion::PARTITION_BRIDGE); +        dirty.traverse(part->mOctree); +    }  } + diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 19c8b06a46..961a55330a 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -131,6 +131,10 @@ public:  	bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);      bool allocateShadowBuffer(U32 resX, U32 resY); +    // rebuild all LLVOVolume render batches +    void rebuildDrawInfo(); + +    // Clear LLFace mVertexBuffer pointers  	void resetVertexBuffers(LLDrawable* drawable);      // perform a profile of the given avatar @@ -449,7 +453,6 @@ public:      void handleShadowDetailChanged();      LLReflectionMapManager mReflectionMapManager; -    void overrideEnvironmentMap();  private:  	void unloadShaders(); diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 4949075f2d..f77b235408 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -12097,5 +12097,17 @@ Material successfully created.  Asset ID: [ASSET_ID]         notext="Cancel"         yestext="OK"/>    </notification> + +  <notification +    icon="notifytip.tga" +    name="AutoAdjustHDRSky" +    persist="true" +    type="alertmodal"> +      You are editing a non-HDR sky that has been automatically converted to HDR.  To remove HDR and tone mapping, set Reflection Probe Ambiance to zero. +    <usetemplate +        ignoretext="HDR Sky adjustment warning" +        name="okignore" +        yestext="OK"/> +  </notification>  </notifications>  | 
