parent
869bb7f16a
commit
0eba1396dc
|
|
@ -213,13 +213,14 @@ void main()
|
|||
vec3 v = -normalize(pos.xyz);
|
||||
color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit_linear, scol, radiance, irradiance, colorEmissive, ao, additive, atten);
|
||||
|
||||
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
|
||||
color = textureLod(heroProbes, vec4(env_mat * refnormpersp, 0), (1.0 - gloss) * 11).xyz * specularColor;
|
||||
|
||||
if (do_atmospherics)
|
||||
{
|
||||
color = atmosFragLightingLinear(color, additive, atten);
|
||||
}
|
||||
|
||||
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
|
||||
color = texture(heroProbes, vec4(env_mat * refnormpersp, 0), 0).xyz;
|
||||
}
|
||||
else if (!GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_ATMOS))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -36,6 +36,11 @@
|
|||
#include "llviewercontrol.h"
|
||||
#include "llenvironment.h"
|
||||
#include "llstartup.h"
|
||||
#include "llagent.h"
|
||||
#include "llagentcamera.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llviewerjoystick.h"
|
||||
#include "llviewermediafocus.h"
|
||||
|
||||
extern BOOL gCubeSnapshot;
|
||||
extern BOOL gTeleportDisplay;
|
||||
|
|
@ -98,16 +103,60 @@ void LLHeroProbeManager::update()
|
|||
|
||||
llassert(mProbes[0] == mDefaultProbe);
|
||||
|
||||
LLVector4a camera_pos;
|
||||
camera_pos.load3(LLViewerCamera::instance().getOrigin().mV);
|
||||
LLVector3 camera_pos = LLViewerCamera::instance().getOrigin();
|
||||
|
||||
LLVector4a probe_pos;
|
||||
|
||||
LLVector3 focus_point;
|
||||
|
||||
LLViewerObject* obj = LLViewerMediaFocus::getInstance()->getFocusedObject();
|
||||
if (obj && obj->mDrawable && obj->isSelected())
|
||||
{ // focus on selected media object
|
||||
S32 face_idx = LLViewerMediaFocus::getInstance()->getFocusedFace();
|
||||
if (obj && obj->mDrawable)
|
||||
{
|
||||
LLFace* face = obj->mDrawable->getFace(face_idx);
|
||||
if (face)
|
||||
{
|
||||
focus_point = face->getPositionAgent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (focus_point.isExactlyZero())
|
||||
{
|
||||
if (LLViewerJoystick::getInstance()->getOverrideCamera())
|
||||
{ // focus on point under cursor
|
||||
focus_point.set(gDebugRaycastIntersection.getF32ptr());
|
||||
}
|
||||
else if (gAgentCamera.cameraMouselook())
|
||||
{ // focus on point under mouselook crosshairs
|
||||
LLVector4a result;
|
||||
result.clear();
|
||||
|
||||
gViewerWindow->cursorIntersect(-1, -1, 512.f, NULL, -1, FALSE, FALSE, TRUE, NULL, &result);
|
||||
|
||||
focus_point.set(result.getF32ptr());
|
||||
}
|
||||
else
|
||||
{
|
||||
// focus on alt-zoom target
|
||||
LLViewerRegion* region = gAgent.getRegion();
|
||||
if (region)
|
||||
{
|
||||
focus_point = LLVector3(gAgentCamera.getFocusGlobal() - region->getOriginGlobal());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
probe_pos.load3(((focus_point + camera_pos) / 2).mV);
|
||||
static LLCachedControl<S32> sDetail(gSavedSettings, "RenderHeroReflectionProbeDetail", -1);
|
||||
static LLCachedControl<S32> sLevel(gSavedSettings, "RenderHeroReflectionProbeLevel", 3);
|
||||
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("rmmu - realtime");
|
||||
// Probe 0 is always our mirror probe. Probe N - 1 is our water probe.
|
||||
mProbes[0]->mOrigin.load3(LLViewerCamera::instance().mOrigin.mV);
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_DISPLAY("hpmu - realtime");
|
||||
// Probe 0 is always our mirror probe.
|
||||
mProbes[0]->mOrigin = probe_pos;
|
||||
for (U32 j = 0; j < mProbes.size(); j++)
|
||||
{
|
||||
for (U32 i = 0; i < 6; ++i)
|
||||
|
|
@ -131,8 +180,6 @@ void LLHeroProbeManager::updateProbeFace(LLReflectionMap* probe, U32 face)
|
|||
// hacky hot-swap of camera specific render targets
|
||||
gPipeline.mRT = &gPipeline.mAuxillaryRT;
|
||||
|
||||
mLightScale = 1.f;
|
||||
|
||||
probe->update(mRenderTarget.getWidth(), face);
|
||||
|
||||
gPipeline.mRT = &gPipeline.mMainRT;
|
||||
|
|
@ -458,6 +505,9 @@ void LLHeroProbeManager::cleanup()
|
|||
|
||||
glDeleteBuffers(1, &mUBO);
|
||||
mUBO = 0;
|
||||
|
||||
mHeroList.clear();
|
||||
mNearestHero = nullptr;
|
||||
}
|
||||
|
||||
void LLHeroProbeManager::doOcclusion()
|
||||
|
|
@ -473,3 +523,19 @@ void LLHeroProbeManager::doOcclusion()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLHeroProbeManager::registerHeroDrawable(LLDrawable* drawablep)
|
||||
{
|
||||
if (mHeroList.find(drawablep) == mHeroList.end())
|
||||
{
|
||||
mHeroList.insert(drawablep);
|
||||
}
|
||||
}
|
||||
|
||||
void LLHeroProbeManager::unregisterHeroDrawable(LLDrawable *drawablep)
|
||||
{
|
||||
if (mHeroList.find(drawablep) != mHeroList.end())
|
||||
{
|
||||
mHeroList.erase(drawablep);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "llrendertarget.h"
|
||||
#include "llcubemaparray.h"
|
||||
#include "llcubemap.h"
|
||||
#include "lldrawable.h"
|
||||
|
||||
class LLSpatialGroup;
|
||||
class LLViewerObject;
|
||||
|
|
@ -67,6 +68,9 @@ public:
|
|||
// perform occlusion culling on all active reflection probes
|
||||
void doOcclusion();
|
||||
|
||||
void registerHeroDrawable(LLDrawable* drawablep);
|
||||
void unregisterHeroDrawable(LLDrawable* drawablep);
|
||||
|
||||
private:
|
||||
friend class LLPipeline;
|
||||
|
||||
|
|
@ -118,10 +122,10 @@ private:
|
|||
// maximum LoD of reflection probes (mip levels - 1)
|
||||
F32 mMaxProbeLOD = 6.f;
|
||||
|
||||
// amount to scale local lights during an irradiance map update (set during updateProbeFace and used by LLPipeline)
|
||||
F32 mLightScale = 1.f;
|
||||
|
||||
// if true, reset all probe render state on the next update (for teleports and sky changes)
|
||||
bool mReset = false;
|
||||
|
||||
LLDrawable::ordered_drawable_set_t mHeroList;
|
||||
LLDrawable* mNearestHero;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1045,7 +1045,7 @@ LLDrawable *LLVOVolume::createDrawable(LLPipeline *pipeline)
|
|||
updateReflectionProbePtr();
|
||||
}
|
||||
|
||||
gPipeline.setMirror(mDrawable, isMirror());
|
||||
gPipeline.mHeroProbeManager.registerHeroDrawable(mDrawable);
|
||||
|
||||
updateRadius();
|
||||
bool force_update = true; // avoid non-alpha mDistance update being optimized away
|
||||
|
|
@ -4454,7 +4454,10 @@ void LLVOVolume::parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_u
|
|||
|
||||
updateReflectionProbePtr();
|
||||
|
||||
gPipeline.setMirror(mDrawable, isMirror());
|
||||
if (isMirror())
|
||||
gPipeline.mHeroProbeManager.registerHeroDrawable(mDrawable);
|
||||
else
|
||||
gPipeline.mHeroProbeManager.unregisterHeroDrawable(mDrawable);
|
||||
}
|
||||
|
||||
void LLVOVolume::updateReflectionProbePtr()
|
||||
|
|
|
|||
|
|
@ -2783,23 +2783,6 @@ void LLPipeline::markShift(LLDrawable *drawablep)
|
|||
}
|
||||
}
|
||||
|
||||
void LLPipeline::setMirror(LLDrawable *drawablep, bool is_mirror)
|
||||
{
|
||||
if (drawablep && assertInitialized())
|
||||
{
|
||||
if (is_mirror)
|
||||
{
|
||||
drawablep->setState(LLDrawable::MIRROR);
|
||||
mMirrorList.insert(drawablep);
|
||||
}
|
||||
else
|
||||
{
|
||||
mMirrorList.erase(drawablep);
|
||||
drawablep->clearState(LLDrawable::MIRROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLPipeline::shiftObjects(const LLVector3 &offset)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE;
|
||||
|
|
@ -5852,11 +5835,6 @@ void LLPipeline::findReferences(LLDrawable *drawablep)
|
|||
{
|
||||
LL_INFOS() << "In mRetexturedList" << LL_ENDL;
|
||||
}
|
||||
|
||||
if (std::find(mMirrorList.begin(), mMirrorList.end(), drawablep) != mMirrorList.end())
|
||||
{
|
||||
LL_INFOS() << "In mMirrorList" << LL_ENDL;
|
||||
}
|
||||
|
||||
if (std::find(mBuildQ1.begin(), mBuildQ1.end(), drawablep) != mBuildQ1.end())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -358,7 +358,6 @@ public:
|
|||
void shiftObjects(const LLVector3 &offset);
|
||||
|
||||
void setLight(LLDrawable *drawablep, bool is_light);
|
||||
void setMirror(LLDrawable *drawablep, bool is_mirror);
|
||||
|
||||
bool hasRenderBatches(const U32 type) const;
|
||||
LLCullResult::drawinfo_iterator beginRenderMap(U32 type);
|
||||
|
|
@ -821,10 +820,6 @@ protected:
|
|||
LLDrawable::ordered_drawable_set_t mLights;
|
||||
light_set_t mNearbyLights; // lights near camera
|
||||
LLColor4 mHWLightColors[8];
|
||||
|
||||
|
||||
LLDrawable::ordered_drawable_set_t mMirrorList;
|
||||
LLDrawable* mNearestMirror;
|
||||
|
||||
/////////////////////////////////////////////
|
||||
//
|
||||
|
|
|
|||
Loading…
Reference in New Issue