diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 11 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl | 8 | ||||
| -rw-r--r-- | indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl | 18 | ||||
| -rw-r--r-- | indra/newview/llpanelface.cpp | 18 | ||||
| -rw-r--r-- | indra/newview/llpanelface.h | 5 | ||||
| -rw-r--r-- | indra/newview/llreflectionmap.h | 11 | ||||
| -rw-r--r-- | indra/newview/llreflectionmapmanager.cpp | 138 | ||||
| -rw-r--r-- | indra/newview/llreflectionmapmanager.h | 13 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 41 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.h | 1 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.cpp | 22 | ||||
| -rw-r--r-- | indra/newview/llviewerobject.h | 1 | ||||
| -rw-r--r-- | indra/newview/llviewershadermgr.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llvovolume.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llvovolume.h | 1 | ||||
| -rw-r--r-- | indra/newview/pipeline.cpp | 7 | 
16 files changed, 270 insertions, 37 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index fca3f7e72a..f5e7f865ab 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9175,6 +9175,17 @@        <real>0.00</real>      </array>    </map> +  <key>RenderMirrors</key> +  <map> +    <key>Comment</key> +    <string>Renders realtime mirrors.</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>1</integer> +  </map>    <key>RenderScreenSpaceReflections</key>    <map>      <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl index 41821def8e..adbf7abdd1 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl @@ -31,6 +31,7 @@ float tapScreenSpaceReflection(int totalSamples, vec2 tc, vec3 viewPos, vec3 n,  uniform samplerCubeArray   reflectionProbes;  uniform samplerCubeArray   irradianceProbes; +  uniform sampler2D sceneMap;  uniform int cube_snapshot;  uniform float max_probe_lod; @@ -70,6 +71,9 @@ layout (std140) uniform ReflectionProbes      // number of reflection probes present in refSphere      int refmapCount; +     +    vec4 heroPosition[1]; +    int heroProbeCount;  };  // Inputs @@ -519,6 +523,10 @@ vec3 tapRefMap(vec3 pos, vec3 dir, out float w, out float dw, float lod, vec3 c,      v = env_mat * v; +#if defined(HERO_PROBES) +    vec3 mirror = textureLod(heroProbes, vec4(v.xyz, 0), lod).rgb; +#endif +          vec4 ret = textureLod(reflectionProbes, vec4(v.xyz, refIndex[i].x), lod) * refParams[i].y;      return ret.rgb; diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index 4ef003e0cb..0152c0612a 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -32,6 +32,14 @@ uniform sampler2D specularRect;  uniform sampler2D normalMap;  uniform sampler2D emissiveRect; // PBR linear packed Occlusion, Roughness, Metal. See: pbropaqueF.glsl +uniform samplerCubeArray   heroProbes; + +layout (std140) uniform HeroProbeData +{ +    vec4 heroPosition[1]; +    int heroProbeCount; +}; +  const float M_PI = 3.14159265;  #if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO) @@ -109,8 +117,8 @@ vec3 pbrBaseLight(vec3 diffuseColor,                    vec3 additive,                    vec3 atten); -vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,  -                    float perceptualRoughness,  +vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor, +                    float perceptualRoughness,                      float metallic,                      vec3 n, // normal                      vec3 v, // surface point to camera @@ -185,7 +193,7 @@ void main()      if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))      { -        vec3 orm = texture(specularRect, tc).rgb;  +        vec3 orm = texture(specularRect, tc).rgb;          float perceptualRoughness = orm.g;          float metallic = orm.b;          float ao = orm.r; @@ -209,6 +217,7 @@ void main()          {              color = atmosFragLightingLinear(color, additive, atten);          } +        color = texture(heroProbes, vec4(norm.xyz * env_mat, 0), 0).xyz;      }      else if (!GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_ATMOS))      { @@ -283,14 +292,11 @@ void main()              color = atmosFragLightingLinear(color, additive, atten);          }     } - -      #ifdef WATER_FOG          vec4 fogged = applyWaterFogViewLinear(pos.xyz, vec4(color, bloom));          color       = fogged.rgb;      #endif -      frag_color.rgb = max(color.rgb, vec3(0)); //output linear since local lights will be added to this shader's results      frag_color.a = 0.0;  } diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index ff21438085..9233ec6277 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -596,6 +596,17 @@ void LLPanelFace::sendFullbright()  	LLSelectMgr::getInstance()->selectionSetFullbright( fullbright );  } +void LLPanelFace::sendMirror() +{ +    LLCheckBoxCtrl* mCheckMirror = getChild<LLCheckBoxCtrl>("checkbox mirror"); +     +    if (!mCheckMirror) +        return; +     +    LLTextureEntry::eRenderableTarget target = mCheckMirror->get() ? LLTextureEntry::RT_MIRROR : LLTextureEntry::RT_DISABLED; +    LLSelectMgr::getInstance()->selectionSetRenderableTarget(target); +} +  void LLPanelFace::sendColor()  { @@ -1688,6 +1699,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)  					getChild<LLUICtrl>("shinyOffsetV")->setValue(offset_y);  					getChild<LLUICtrl>("glossiness")->setValue(material->getSpecularLightExponent());  					getChild<LLUICtrl>("environment")->setValue(material->getEnvironmentIntensity()); +                    getChild<LLUICtrl>("mirror")->setValue(material->getEnvironmentIntensity());  					updateShinyControls(!material->getSpecularID().isNull(), true);  				} @@ -2995,6 +3007,12 @@ void LLPanelFace::onCommitFullbright(LLUICtrl* ctrl, void* userdata)  	self->sendFullbright();  } +void LLPanelFace::onCommitMirror(LLUICtrl* ctrl, void* userdata) +{ +    LLPanelFace* self = (LLPanelFace*) userdata; +    self->sendMirror(); +} +  // static  void LLPanelFace::onCommitGlow(LLUICtrl* ctrl, void* userdata)  { diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h index 4dfef5d9bc..0b7486232d 100644 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -138,6 +138,8 @@ protected:  	void			sendTexGen();				// applies and sends bump map  	void			sendShiny(U32 shininess);			// applies and sends shininess  	void			sendFullbright();		// applies and sends full bright + +    void            sendMirror();  	void			sendGlow();      void            alignTestureLayer(); @@ -227,7 +229,8 @@ protected:  	static void		onCommitShiny(				LLUICtrl* ctrl, void* userdata);  	static void		onCommitAlphaMode(		LLUICtrl* ctrl, void* userdata);  	static void		onCommitFullbright(		LLUICtrl* ctrl, void* userdata); -	static void    onCommitGlow(				LLUICtrl* ctrl, void *userdata); +    static void     onCommitMirror(LLUICtrl* ctrl, void* userdata); +	static void     onCommitGlow(				LLUICtrl* ctrl, void *userdata);  	static void		onCommitPlanarAlign(		LLUICtrl* ctrl, void* userdata);  	static void		onCommitRepeatsPerMeter(	LLUICtrl* ctrl, void* userinfo); diff --git a/indra/newview/llreflectionmap.h b/indra/newview/llreflectionmap.h index 7ea0fe6187..831a6358ee 100644 --- a/indra/newview/llreflectionmap.h +++ b/indra/newview/llreflectionmap.h @@ -36,6 +36,15 @@ class alignas(16) LLReflectionMap : public LLRefCount  {      LL_ALIGN_NEW  public: +     +    enum class ProbeType +    { +        ALL = 0, +        RADIANCE, +        IRRADIANCE, +        REFLECTION +    }; +          // allocate an environment map of the given resolution       LLReflectionMap(); @@ -127,5 +136,7 @@ public:      GLuint mOcclusionQuery = 0;      bool mOccluded = false;      U32 mOcclusionPendingFrames = 0; +     +    ProbeType mType;  }; diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index bb0bb04797..99ebcf5231 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -130,6 +130,13 @@ void LLReflectionMapManager::update()          U32 targetRes = mProbeResolution * 4; // super sample          mRenderTarget.allocate(targetRes, targetRes, color_fmt, true);      } +     +    if (!mHeroRenderTarget.isComplete()) +    { +        U32 color_fmt = GL_RGB16F; +        U32 targetRes = mHeroProbeResolution * 2; +        mHeroRenderTarget.allocate(targetRes, targetRes, color_fmt, true); +    }      if (mMipChain.empty())      { @@ -319,13 +326,29 @@ void LLReflectionMapManager::update()          mRadiancePass = mRealtimeRadiancePass;          for (U32 i = 0; i < 6; ++i)          { -            updateProbeFace(closestDynamic, i); +            updateProbeFace(closestDynamic, i, mProbeResolution, mTexture);          }          mRealtimeRadiancePass = !mRealtimeRadiancePass;          // restore "isRadiancePass"          mRadiancePass = radiance_pass;      } +     +     +    { +        LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("rmmu - realtime"); +         +        mHeroProbe->mOrigin.load3(LLViewerCamera::instance().mOrigin.mV); +        bool radiance_pass = isRadiancePass(); +        mRadiancePass = true; +        for (U32 i = 0; i < 6; ++i) +        { +            updateProbeFace(mHeroProbe, i, mHeroProbeResolution, mHeroArray); +        } + +        // restore "isRadiancePass" +        mRadiancePass = radiance_pass; +    }      static LLCachedControl<F32> sUpdatePeriod(gSavedSettings, "RenderDefaultProbeUpdatePeriod", 2.f);      if ((gFrameTimeSeconds - mDefaultProbe->mLastUpdateTime) < sUpdatePeriod) @@ -532,7 +555,7 @@ void LLReflectionMapManager::doProbeUpdate()      LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;      llassert(mUpdatingProbe != nullptr); -    updateProbeFace(mUpdatingProbe, mUpdatingFace); +    updateProbeFace(mUpdatingProbe, mUpdatingFace, mProbeResolution, mTexture);      if (++mUpdatingFace == 6)      { @@ -559,10 +582,20 @@ void LLReflectionMapManager::doProbeUpdate()  // The next six passes render the scene with both radiance and irradiance into the same scratch space cube map and generate a simple mip chain.  // At the end of these passes, a radiance map is generated for this probe and placed into the radiance cube map array at the index for this probe.  // In effect this simulates single-bounce lighting. -void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face) +void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face, U32 probeResolution, LLPointer<LLCubeMapArray> cubeArray)  {      // hacky hot-swap of camera specific render targets      gPipeline.mRT = &gPipeline.mAuxillaryRT; +     +    LLRenderTarget* target = &mRenderTarget; +     +    S32 sourceIdx = mReflectionProbeCount; +     +    if (probeResolution == mHeroProbeResolution) +    { +        sourceIdx = 0; +        target = &mHeroRenderTarget; +    }      mLightScale = 1.f;      static LLCachedControl<F32> max_local_light_ambiance(gSavedSettings, "RenderReflectionProbeMaxLocalLightAmbiance", 8.f); @@ -581,20 +614,18 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY, LLPipeline::RENDER_TYPE_WL_SKY,              LLPipeline::RENDER_TYPE_WATER, LLPipeline::RENDER_TYPE_VOIDWATER, LLPipeline::RENDER_TYPE_CLOUDS, LLPipeline::RENDER_TYPE_TERRAIN, LLPipeline::END_RENDER_TYPES); -        probe->update(mRenderTarget.getWidth(), face); +        probe->update(target->getWidth(), face);          gPipeline.popRenderTypeMask();      }      else      { -        probe->update(mRenderTarget.getWidth(), face); +        probe->update(target->getWidth(), face);      }      gPipeline.mRT = &gPipeline.mMainRT; -    S32 sourceIdx = mReflectionProbeCount; - -    if (probe != mUpdatingProbe) +    if (probe != mUpdatingProbe && probe->mType != LLReflectionMap::ProbeType::REFLECTION)      { // this is the "realtime" probe that's updating every frame, use the secondary scratch space channel          sourceIdx += 1;      } @@ -615,7 +646,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          gGL.loadIdentity();          gGL.flush(); -        U32 res = mProbeResolution * 2; +        U32 res = probeResolution * 2;          static LLStaticHashedString resScale("resScale");          static LLStaticHashedString direction("direction"); @@ -627,20 +658,20 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          // perform a gaussian blur on the super sampled render before downsampling          {              gGaussianProgram.bind(); -            gGaussianProgram.uniform1f(resScale, 1.f / (mProbeResolution * 2)); +            gGaussianProgram.uniform1f(resScale, 1.f / (probeResolution * 2));              S32 diffuseChannel = gGaussianProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_TEXTURE);              // horizontal              gGaussianProgram.uniform2f(direction, 1.f, 0.f);              gGL.getTexUnit(diffuseChannel)->bind(screen_rt); -            mRenderTarget.bindTarget(); +            target->bindTarget();              gPipeline.mScreenTriangleVB->setBuffer();              gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); -            mRenderTarget.flush(); +            target->flush();              // vertical              gGaussianProgram.uniform2f(direction, 0.f, 1.f); -            gGL.getTexUnit(diffuseChannel)->bind(&mRenderTarget); +            gGL.getTexUnit(diffuseChannel)->bind(target);              screen_rt->bindTarget();              gPipeline.mScreenTriangleVB->setBuffer();              gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); @@ -648,7 +679,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          } -        S32 mips = log2((F32)mProbeResolution) + 0.5f; +        S32 mips = log2((F32)probeResolution) + 0.5f;          gReflectionMipProgram.bind();          S32 diffuseChannel = gReflectionMipProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_TEXTURE); @@ -667,7 +698,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)              } -            gReflectionMipProgram.uniform1f(resScale, 1.f/(mProbeResolution*2)); +            gReflectionMipProgram.uniform1f(resScale, 1.f/(probeResolution*2));              gPipeline.mScreenTriangleVB->setBuffer();              gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); @@ -679,14 +710,11 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)              if (mip >= 0)              {                  LL_PROFILE_GPU_ZONE("probe mip copy"); -                mTexture->bind(0); -                //glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, mip, 0, 0, probe->mCubeIndex * 6 + face, 0, 0, res, res); +                cubeArray->bind(0); +                                  glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, mip, 0, 0, sourceIdx * 6 + face, 0, 0, res, res); -                //if (i == 0) -                //{ -                    //glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, mip, 0, 0, probe->mCubeIndex * 6 + face, 0, 0, res, res); -                //} -                mTexture->unbind(); +                 +                cubeArray->unbind();              }              mMipChain[i].flush();          } @@ -711,7 +739,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)              mVertexBuffer->setBuffer();              S32 channel = gRadianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); -            mTexture->bind(channel); +            cubeArray->bind(channel);              gRadianceGenProgram.uniform1i(sSourceIdx, sourceIdx);              gRadianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); @@ -726,7 +754,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)                  gRadianceGenProgram.uniform1f(sRoughness, (F32)i / (F32)(mMipChain.size() - 1));                  gRadianceGenProgram.uniform1f(sMipLevel, i); -                gRadianceGenProgram.uniform1i(sWidth, mProbeResolution); +                gRadianceGenProgram.uniform1i(sWidth, probeResolution);                  for (int cf = 0; cf < 6; ++cf)                  { // for each cube face @@ -756,7 +784,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)              //generate irradiance map              gIrradianceGenProgram.bind();              S32 channel = gIrradianceGenProgram.enableTexture(LLShaderMgr::REFLECTION_PROBES, LLTexUnit::TT_CUBE_MAP_ARRAY); -            mTexture->bind(channel); +            cubeArray->bind(channel);              gIrradianceGenProgram.uniform1i(sSourceIdx, sourceIdx);              gIrradianceGenProgram.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mMaxProbeLOD); @@ -791,7 +819,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)                      S32 res = mMipChain[i].getWidth();                      mIrradianceMaps->bind(channel);                      glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, i - start_mip, 0, 0, probe->mCubeIndex * 6 + cf, 0, 0, res, res); -                    mTexture->bind(channel); +                    cubeArray->bind(channel);                  }              }          } @@ -894,7 +922,7 @@ void LLReflectionMapManager::updateUniforms()          GLint refBucket[256][4]; //lookup table for which index to start with for the given Z depth          // numbrer of active refmaps -        GLint refmapCount;   +        GLint refmapCount;      };      mReflectionMaps.resize(mReflectionProbeCount); @@ -1073,7 +1101,7 @@ void LLReflectionMapManager::updateUniforms()  #endif      rpd.refmapCount = count; - +          //copy rpd into uniform buffer object      if (mUBO == 0)      { @@ -1086,7 +1114,35 @@ void LLReflectionMapManager::updateUniforms()          glBufferData(GL_UNIFORM_BUFFER, sizeof(ReflectionProbeData), &rpd, GL_STREAM_DRAW);          glBindBuffer(GL_UNIFORM_BUFFER, 0);      } +     +    struct HeroProbeData +    { +        LLVector4 heroPosition[1]; +        GLint heroProbeCount = 1; +    }; +     +    HeroProbeData hpd; +     +    modelview.loadu(gGLModelView); +     +    oa.set(0, 0, 0, 0); +    hpd.heroProbeCount = 1; +    modelview.affineTransform(mHeroProbe->mOrigin, oa); +    hpd.heroPosition[0].set(oa.getF32ptr()); + +    //copy rpd into uniform buffer object +    if (mUBO == 0) +    { +        glGenBuffers(1, &mHeroUBO); +    } +    { +        LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("rmmsu - update buffer"); +        glBindBuffer(GL_UNIFORM_BUFFER, mHeroUBO); +        glBufferData(GL_UNIFORM_BUFFER, sizeof(HeroProbeData), &hpd, GL_STREAM_DRAW); +        glBindBuffer(GL_UNIFORM_BUFFER, 0); +    } +      #if 0      if (!gCubeSnapshot)      { @@ -1219,7 +1275,7 @@ void LLReflectionMapManager::initReflectionMaps()  {      U32 count = LL_MAX_REFLECTION_PROBE_COUNT; -    if (mTexture.isNull() || mReflectionProbeCount != count || mReset) +    if (mTexture.isNull() || mReflectionProbeCount != count || mReset || mHeroArray.isNull())      {          mReset = false;          mReflectionProbeCount = count; @@ -1268,6 +1324,23 @@ void LLReflectionMapManager::initReflectionMaps()          mDefaultProbe->mRadius = 4096.f;          mDefaultProbe->mProbeIndex = 0;          touch_default_probe(mDefaultProbe); +         +        mHeroProbeResolution = 128; +         +        mHeroArray = new LLCubeMapArray(); +        // Revise when we have both water and mirrors in hero probes. +        mHeroArray->allocate(mHeroProbeResolution, 3, 2, true); +         +        if (mHeroProbe.isNull()) { +            mHeroProbe = new LLReflectionMap(); +        } +         +        mHeroProbe->mCubeIndex = 0; +        mHeroProbe->mCubeArray = mHeroArray; +        mHeroProbe->mDistance = 64.f; +        mHeroProbe->mRadius = 4096.f; +        mHeroProbe->mProbeIndex = 0; +        touch_default_probe(mHeroProbe);      } @@ -1296,11 +1369,13 @@ void LLReflectionMapManager::cleanup()  {       mVertexBuffer = nullptr;      mRenderTarget.release(); +    mHeroRenderTarget.release();      mMipChain.clear();      mTexture = nullptr;      mIrradianceMaps = nullptr; +    mHeroArray = nullptr;      mProbes.clear();      mKillList.clear(); @@ -1311,9 +1386,14 @@ void LLReflectionMapManager::cleanup()      mDefaultProbe = nullptr;      mUpdatingProbe = nullptr; +     +    mHeroProbe = nullptr;      glDeleteBuffers(1, &mUBO);      mUBO = 0; +     +    glDeleteBuffers(1, &mHeroUBO); +    mHeroUBO = 0;      // note: also called on teleport (not just shutdown), so make sure we're in a good "starting" state      initCubeFree(); diff --git a/indra/newview/llreflectionmapmanager.h b/indra/newview/llreflectionmapmanager.h index 5a3901cae9..81b0ef8ed8 100644 --- a/indra/newview/llreflectionmapmanager.h +++ b/indra/newview/llreflectionmapmanager.h @@ -125,11 +125,15 @@ private:      // render target for cube snapshots      // used to generate mipmaps without doing a copy-to-texture      LLRenderTarget mRenderTarget; +     +    LLRenderTarget mHeroRenderTarget;      std::vector<LLRenderTarget> mMipChain;      // storage for reflection probe radiance maps (plus two scratch space cubemaps)      LLPointer<LLCubeMapArray> mTexture; +     +    LLPointer<LLCubeMapArray> mHeroArray;      // vertex buffer for pushing verts to filter shaders      LLPointer<LLVertexBuffer> mVertexBuffer; @@ -144,7 +148,7 @@ private:      void doProbeUpdate();      // update the specified face of the specified probe -    void updateProbeFace(LLReflectionMap* probe, U32 face); +    void updateProbeFace(LLReflectionMap* probe, U32 face, U32 probeResolution, LLPointer<LLCubeMapArray> cubeArray);      // list of active reflection maps      std::vector<LLPointer<LLReflectionMap> > mProbes; @@ -157,6 +161,9 @@ private:      // handle to UBO      U32 mUBO = 0; +     +    // Hero UBO +    U32 mHeroUBO = 0;      // list of maps being used for rendering      std::vector<LLReflectionMap*> mReflectionMaps; @@ -176,12 +183,16 @@ private:      bool mRealtimeRadiancePass = false;      LLPointer<LLReflectionMap> mDefaultProbe;  // default reflection probe to fall back to for pixels with no probe influences (should always be at cube index 0) +     +    LLPointer<LLReflectionMap> mHeroProbe;      // number of reflection probes to use for rendering      U32 mReflectionProbeCount;      // resolution of reflection probes      U32 mProbeResolution = 128; +     +    U32 mHeroProbeResolution = 512;      // maximum LoD of reflection probes (mip levels - 1)      F32 mMaxProbeLOD = 6.f; diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 5c1a339570..2b1b4b79b2 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -2355,6 +2355,47 @@ void LLSelectMgr::selectionSetFullbright(U8 fullbright)  	getSelection()->applyToObjects(&sendfunc);  } +void LLSelectMgr::selectionSetRenderableTarget(LLTextureEntry::eRenderableTarget target) +{ +    struct f : public LLSelectedTEFunctor +    { +        LLTextureEntry::eRenderableTarget mRenderableTarget; +         +        f(const LLTextureEntry::eRenderableTarget& t) : mRenderableTarget(t) {} +         +        bool apply(LLViewerObject* object, S32 te) +        { +            if (object->permModify()) +            { +                object->setTERenderableTarget(te, mRenderableTarget); +            } +             +            return true; +        } +    } setfunc(target); +     +    getSelection()->applyToTEs(&setfunc); +     +    struct g : public LLSelectedObjectFunctor +    { +        LLTextureEntry::eRenderableTarget mRenderableTarget; +         +        g(const LLTextureEntry::eRenderableTarget& t) : mRenderableTarget(t) {} +         +        virtual bool apply(LLViewerObject* object) +        { +            if (object->permModify()) +            { +                object->sendTEUpdate(); +            } +             +            return true; +        } +    } sendfunc(target); +     +    getSelection()->applyToObjects(&sendfunc); +} +  // This function expects media_data to be a map containing relevant  // media data name/value pairs (e.g. home_url, etc.)  void LLSelectMgr::selectionSetMedia(U8 media_type, const LLSD &media_data) diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index 327134a487..8ce59c6654 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -653,6 +653,7 @@ public:  	void selectionSetGlow(const F32 glow);  	void selectionSetMaterialParams(LLSelectedTEMaterialFunctor* material_func, int specific_te = -1);  	void selectionRemoveMaterial(); +    void selectionSetRenderableTarget(LLTextureEntry::eRenderableTarget target);  	void selectionSetObjectPermissions(U8 perm_field, BOOL set, U32 perm_mask, BOOL override = FALSE);  	void selectionSetObjectName(const std::string& name); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index d21d6f7027..7871815fda 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5296,6 +5296,28 @@ S32 LLViewerObject::setTEFullbright(const U8 te, const U8 fullbright)  	return retval;  } +S32 LLViewerObject::setTERenderableTarget(const U8 te, const LLTextureEntry::eRenderableTarget target) +{ +    S32 retval = 0; +     +    const LLTextureEntry *tep = getTE(te); +    if (!tep) +    { +        LL_WARNS() << "No texture entry for te " << (S32)te << ", object " << mID << LL_ENDL; +    } +    else if (target != tep->getRenderableTarget()) +    { +        retval = LLPrimitive::setTERenderableTarget(te, target); +        setChanged(TEXTURE); +        if (mDrawable.notNull() && retval) +        { +            //gPipeline.markMirror(mDrawable); +        } +    } +     +    return retval; +} +  S32 LLViewerObject::setTEMediaFlags(const U8 te, const U8 media_flags)  { diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 3665c64965..4d49c61b23 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -359,6 +359,7 @@ public:  	/*virtual*/	S32		setTEMediaTexGen(const U8 te, const U8 media ); // *FIXME: this confusingly acts upon a superset of setTETexGen's flags without absorbing its semantics  	/*virtual*/	S32		setTEShiny(const U8 te, const U8 shiny );  	/*virtual*/	S32		setTEFullbright(const U8 te, const U8 fullbright ); +    /*virtual*/ S32     setTERenderableTarget(const U8 te, const LLTextureEntry::eRenderableTarget target);  	/*virtual*/	S32		setTEMediaFlags(const U8 te, const U8 media_flags );  	/*virtual*/ S32     setTEGlow(const U8 te, const F32 glow);  	/*virtual*/ S32     setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 82b16d67bd..6e5d85bc88 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -2237,6 +2237,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()          {              gDeferredSoftenProgram.addPermutation("LOCAL_LIGHT_KILL", "1");          } +         +        gDeferredSoftenProgram.addPermutation("HERO_PROBES", "1");  		if (gSavedSettings.getBOOL("RenderDeferredSSAO"))  		{ //if using SSAO, take screen space light map into account as if shadows are enabled diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index b521dcba5a..556ec083a7 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -2367,6 +2367,16 @@ S32 LLVOVolume::setTEFullbright(const U8 te, const U8 fullbright)  	return  res;  } +S32 LLVOVolume::setTERenderableTarget(const U8 te, const LLTextureEntry::eRenderableTarget mirror) +{ +    S32 res = LLViewerObject::setTERenderableTarget(te, mirror); +    if (res) +    { +        //gPipeline.markMirror(mDrawable); +    } +    return res; +} +  S32 LLVOVolume::setTEBumpShinyFullbright(const U8 te, const U8 bump)  {  	S32 res = LLViewerObject::setTEBumpShinyFullbright(te, bump); diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index aadc1fbcf3..93aba9b8cb 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -209,6 +209,7 @@ public:  	/*virtual*/ S32		setTEBumpmap(const U8 te, const U8 bump) override;  	/*virtual*/ S32		setTEShiny(const U8 te, const U8 shiny) override;  	/*virtual*/ S32		setTEFullbright(const U8 te, const U8 fullbright) override; +    /*virtual*/ S32     setTERenderableTarget(const U8 te, const LLTextureEntry::eRenderableTarget target) override;  	/*virtual*/ S32		setTEBumpShinyFullbright(const U8 te, const U8 bump) override;  	/*virtual*/ S32		setTEMediaFlags(const U8 te, const U8 media_flags) override;  	/*virtual*/ S32		setTEGlow(const U8 te, const F32 glow) override; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index d50e671e05..d7188c0fe7 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8439,6 +8439,13 @@ void LLPipeline::bindReflectionProbes(LLGLSLShader& shader)          mReflectionMapManager.mIrradianceMaps->bind(channel);          bound = true;      } +     +    channel = shader.enableTexture(LLShaderMgr::HERO_PROBE, LLTexUnit::TT_CUBE_MAP_ARRAY); +    if (channel > -1 && mReflectionMapManager.mHeroArray.notNull()) +    { +        mReflectionMapManager.mHeroArray->bind(channel); +        bound = true; +    }      if (bound)      {  | 
