Merge branch 'V2Renderer' into V2TextureSystem

Conflicts:
	indra/newview/llviewercontrol.cpp
This commit is contained in:
Shyotl
2011-04-23 19:33:20 -05:00
22 changed files with 238 additions and 240 deletions

View File

@@ -289,11 +289,13 @@ S32 LLImageGL::updateBoundTexMem(const S32 mem, const S32 ncomponents, S32 categ
//static
void LLImageGL::destroyGL(BOOL save_state)
{
deleteDeadTextures(); //Dump unimportant textures.
for (S32 stage = 0; stage < gGLManager.mNumTextureUnits; stage++)
{
gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);
}
int stored_count = 0;
sAllowReadBackRaw = true ;
for (std::set<LLImageGL*>::iterator iter = sImageList.begin();
iter != sImageList.end(); iter++)
@@ -308,18 +310,24 @@ void LLImageGL::destroyGL(BOOL save_state)
{
glimage->mSaveData = NULL ;
}
else
stored_count++;
}
glimage->destroyGLTexture();
stop_glerror();
}
}
llinfos << "Storing " << stored_count << " images..." << llendl;
sAllowReadBackRaw = false ;
deleteDeadTextures();//Now, actually call glDeleteTextures for everything.
}
//static
void LLImageGL::restoreGL()
{
int recovered_count = 0;
for (std::set<LLImageGL*>::iterator iter = sImageList.begin();
iter != sImageList.end(); iter++)
{
@@ -334,10 +342,12 @@ void LLImageGL::restoreGL()
{
glimage->createGLTexture(glimage->mCurrentDiscardLevel, glimage->mSaveData, 0, TRUE, glimage->getCategory());
stop_glerror();
recovered_count++;
}
glimage->mSaveData = NULL; // deletes data
}
}
llinfos << "Restored " << recovered_count << " images" << llendl;
}
//static
@@ -1250,7 +1260,7 @@ BOOL LLImageGL::readBackRaw(S32 discard_level, LLImageRaw* imageraw, bool compre
llverify(gGL.getTexUnit(0)->bindManual(mBindTarget, mTexName));
//debug code, leave it there commented.
//checkTexSize() ;
checkTexSize() ;
LLGLint glwidth = 0;
glGetTexLevelParameteriv(mTarget, gl_discard, GL_TEXTURE_WIDTH, (GLint*)&glwidth);

View File

@@ -248,6 +248,8 @@ void LLComboBox::onCommit()
mTextEntry->setValue(getSimple());
mTextEntry->setTentative(FALSE);
}
setControlValue(getValue());
LLUICtrl::onCommit();
}

View File

@@ -2841,8 +2841,16 @@ void LLSplashScreenWin32::updateImpl(const std::string& mesg)
{
if (!mWindow) return;
WCHAR w_mesg[1024];
mbstowcs(w_mesg, mesg.c_str(), 1024);
int output_str_len = MultiByteToWideChar(CP_UTF8, 0, mesg.c_str(), mesg.length(), NULL, 0);
if( output_str_len>1024 )
return;
WCHAR w_mesg[1025];//big enought to keep null terminatos
MultiByteToWideChar (CP_UTF8, 0, mesg.c_str(), mesg.length(), w_mesg, output_str_len);
//looks like MultiByteToWideChar didn't add null terminator to converted string, see EXT-4858
w_mesg[output_str_len] = 0;
SendDlgItemMessage(mWindow,
666, // HACK: text id
@@ -2970,78 +2978,6 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url )
sei.lpFile = url_utf16.c_str();
ShellExecuteEx( &sei );
//// TODO: LEAVING OLD CODE HERE SO I DON'T BONE OTHER MERGES
//// DELETE THIS ONCE THE MERGES ARE DONE
// Figure out the user's default web browser
// HKEY_CLASSES_ROOT\http\shell\open\command
/*
std::string reg_path_str = gURLProtocolWhitelistHandler[i] + "\\shell\\open\\command";
WCHAR reg_path_wstr[256];
mbstowcs( reg_path_wstr, reg_path_str.c_str(), LL_ARRAY_SIZE(reg_path_wstr) );
HKEY key;
WCHAR browser_open_wstr[1024];
DWORD buffer_length = 1024;
RegOpenKeyEx(HKEY_CLASSES_ROOT, reg_path_wstr, 0, KEY_QUERY_VALUE, &key);
RegQueryValueEx(key, NULL, NULL, NULL, (LPBYTE)browser_open_wstr, &buffer_length);
RegCloseKey(key);
// Convert to STL string
LLWString browser_open_wstring = utf16str_to_wstring(browser_open_wstr);
if (browser_open_wstring.length() < 2)
{
LL_WARNS("Window") << "Invalid browser executable in registry " << browser_open_wstring << LL_ENDL;
return;
}
// Extract the process that's supposed to be launched
LLWString browser_executable;
if (browser_open_wstring[0] == '"')
{
// executable is quoted, find the matching quote
size_t quote_pos = browser_open_wstring.find('"', 1);
// copy out the string including both quotes
browser_executable = browser_open_wstring.substr(0, quote_pos+1);
}
else
{
// executable not quoted, find a space
size_t space_pos = browser_open_wstring.find(' ', 1);
browser_executable = browser_open_wstring.substr(0, space_pos);
}
LL_DEBUGS("Window") << "Browser reg key: " << wstring_to_utf8str(browser_open_wstring) << LL_ENDL;
LL_INFOS("Window") << "Browser executable: " << wstring_to_utf8str(browser_executable) << LL_ENDL;
// Convert URL to wide string for Windows API
// Assume URL is UTF8, as can come from scripts
LLWString url_wstring = utf8str_to_wstring(escaped_url);
llutf16string url_utf16 = wstring_to_utf16str(url_wstring);
// Convert executable and path to wide string for Windows API
llutf16string browser_exec_utf16 = wstring_to_utf16str(browser_executable);
// ShellExecute returns HINSTANCE for backwards compatiblity.
// MS docs say to cast to int and compare to 32.
HWND our_window = NULL;
LPCWSTR directory_wstr = NULL;
int retval = (int) ShellExecute(our_window, // Flawfinder: ignore
L"open",
browser_exec_utf16.c_str(),
url_utf16.c_str(),
directory_wstr,
SW_SHOWNORMAL);
if (retval > 32)
{
LL_DEBUGS("Window") << "load_url success with " << retval << LL_ENDL;
}
else
{
LL_INFOS("Window") << "load_url failure with " << retval << LL_ENDL;
}
*/
}

View File

@@ -405,7 +405,15 @@ template <> inline void LLCachedControl<LLColor4>::setValue(const LLSD& newvalue
else
this->mCachedValue = (const LLColor4 &)newvalue;
}
template <> inline void LLCachedControl<U32>::setValue(const LLSD& newvalue)
{
if(mControl->isType(TYPE_U32) || mControl->isType(TYPE_S32)) //LLSD does not support U32 fully
mCachedValue = (U32)newvalue.asInteger();
else if(this->mControl->isType(TYPE_F32))
mCachedValue = (U32)newvalue.asReal();
else
mCachedValue = (U32)0; //What to do...
}
//Following is actually defined in newview/llviewercontrol.cpp, but extern access is fine (Unless GCC bites me)
template <> eControlType get_control_type<U32>(const U32& in, LLSD& out);

View File

@@ -68,17 +68,6 @@
<key>Value</key>
<real>2.0</real>
</map>
<key>SHHighResSnapshotForceTile</key>
<map>
<key>Comment</key>
<string>Force tiling of snapshots (enables AA and supersampling)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SHHighResSnapshotSuperSample</key>
<map>
<key>Comment</key>

View File

@@ -5,6 +5,8 @@
* $License$
*/
#version 120
uniform sampler2D diffuseMap;
uniform float glowStrength;

View File

@@ -5,6 +5,8 @@
* $License$
*/
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect RenderTexture;
uniform float bloomStrength;

View File

@@ -5,6 +5,8 @@
* $License$
*/
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect RenderTexture;
uniform float brightness;
uniform float contrast;

View File

@@ -5,6 +5,8 @@
* $License$
*/
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect RenderTexture;
uniform float extractLow;
uniform float extractHigh;

View File

@@ -1,3 +1,6 @@
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect RenderTexture;
uniform int horizontalPass;

View File

@@ -4,6 +4,8 @@
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
* $License$
*/
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect RenderTexture;
uniform sampler2D NoiseTexture;

View File

@@ -5,6 +5,8 @@
* $License$
*/
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect RenderTexture;
void main(void)

View File

@@ -554,7 +554,8 @@ void LLDrawPoolWater::shade()
}
LLVOWater* water = (LLVOWater*) face->getViewerObject();
gGL.getTexUnit(diffTex)->bind(face->getTexture());
if(diffTex > -1 && face->getTexture()->getHasGLTexture())
gGL.getTexUnit(diffTex)->bind(face->getTexture());
sNeedsReflectionUpdate = TRUE;
@@ -572,6 +573,8 @@ void LLDrawPoolWater::shade()
LLGLSquashToFarClip far_clip(glh_get_current_projection());
face->renderIndexed();
}
if(diffTex > -1 && face->getTexture()->getHasGLTexture())
gGL.getTexUnit(diffTex)->unbind(LLTexUnit::TT_TEXTURE);
}
}

View File

@@ -169,32 +169,20 @@ BOOL LLFloaterHardwareSettings::postBuild()
}
void LLFloaterHardwareSettings::apply()
void LLFloaterHardwareSettings::apply()
{
// Anisotropic rendering
BOOL old_anisotropic = LLImageGL::sGlobalUseAnisotropic;
LLImageGL::sGlobalUseAnisotropic = childGetValue("ani");
U32 fsaa = (U32) childGetValue("fsaa").asInteger();
U32 old_fsaa = gSavedSettings.getU32("RenderFSAASamples");
BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED);
if (old_fsaa != fsaa)
//Still do a bit of voodoo here. V2 forces restart to change FSAA with FBOs off.
//Let's not do that, and instead do pre-V2 FSAA change handling for that particular case
if(!LLRenderTarget::sUseFBO && (mFSAASamples != (U32)childGetValue("fsaa").asInteger()))
{
gSavedSettings.setU32("RenderFSAASamples", fsaa);
BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED);
LLWindow* window = gViewerWindow->getWindow();
LLCoordScreen size;
window->getSize(&size);
gViewerWindow->changeDisplaySettings(window->getFullscreen(),
size,
gSavedSettings.getBOOL("DisableVerticalSync"),
logged_in);
}
else if (old_anisotropic != LLImageGL::sGlobalUseAnisotropic)
{
LLImageGL::dirtyTexOptions();
gViewerWindow->restartDisplay(logged_in);
size,
gSavedSettings.getBOOL("DisableVerticalSync"),
logged_in);
}
refresh();

View File

@@ -122,8 +122,17 @@ static bool handleTerrainDetailChanged(const LLSD& newvalue)
static bool handleSetShaderChanged(const LLSD& newvalue)
{
// changing shader level may invalidate existing cached bump maps, as the shader type determines the format of the bump map it expects - clear and repopulate the bump cache
gBumpImageList.destroyGL();
gBumpImageList.restoreGL();
// Changing shader also changes the terrain detail to high, reflect that change here
if (newvalue.asBoolean())
{
// shaders enabled, set terrain detail to high
gSavedSettings.setS32("RenderTerrainDetail", 1);
}
// else, leave terrain detail as is
LLViewerShaderMgr::instance()->setShaders();
return true;
}
@@ -187,6 +196,13 @@ static bool handleReleaseGLBufferChanged(const LLSD& newvalue)
return true;
}
static bool handleAnisotropicChanged(const LLSD& newvalue)
{
LLImageGL::sGlobalUseAnisotropic = newvalue.asBoolean();
LLImageGL::dirtyTexOptions();
return true;
}
static bool handleVolumeLODChanged(const LLSD& newvalue)
{
LLVOVolume::sLODFactor = (F32) newvalue.asReal();
@@ -552,6 +568,8 @@ void settings_setup_listeners()
gSavedSettings.getControl("RenderAnimateTrees")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _1));
gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _1));
gSavedSettings.getControl("RenderAnisotropic")->getSignal()->connect(boost::bind(&handleAnisotropicChanged, _1));
gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _1));
gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));
gSavedSettings.getControl("EnableRippleWater")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1));

View File

@@ -103,6 +103,7 @@ BOOL gForceRenderLandFence = FALSE;
BOOL gDisplaySwapBuffers = FALSE;
BOOL gDepthDirty = FALSE;
BOOL gResizeScreenTexture = FALSE;
BOOL gWindowResized = FALSE;
BOOL gSnapshot = FALSE;
U32 gRecentFrameCount = 0; // number of 'recent' frames
@@ -112,7 +113,7 @@ LLFrameTimer gRecentMemoryTime;
// Rendering stuff
void pre_show_depth_buffer();
void post_show_depth_buffer();
void render_ui(F32 zoom_factor = 1.f, int subfield = 0);
void render_ui(F32 zoom_factor = 1.f, int subfield = 0, bool tiling = false);
void render_hud_attachments();
void render_ui_3d();
void render_ui_2d();
@@ -165,11 +166,7 @@ void display_startup()
glClear(GL_DEPTH_BUFFER_BIT);
}
#if SHY_MOD //screenshot improvement
void display_update_camera(bool tiling=false)
#else //shy_mod
void display_update_camera()
#endif //ignore
{
llpushcallstacks ;
// TODO: cut draw distance down if customizing avatar?
@@ -178,7 +175,6 @@ void display_update_camera()
// Cut draw distance in half when customizing avatar,
// but on the viewer only.
F32 final_far = gAgent.mDrawDistance;
#if SHY_MOD //screenshot improvement
if(tiling) //Don't animate clouds and water if tiling!
{
LLViewerCamera::getInstance()->setFar(final_far);
@@ -186,7 +182,6 @@ void display_update_camera()
LLWorld::getInstance()->setLandFarClip(final_far);
return;
}
#endif //shy_mod
if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode())
{
final_far *= 0.5f;
@@ -231,18 +226,26 @@ void display_stats()
}
// Paint the display!
#if SHY_MOD // screenshot improvement
void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot, BOOL tiling)
#else //shy_mod
void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
#endif //ignore
void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot, bool tiling)
{
LLFastTimer t(LLFastTimer::FTM_RENDER);
if (LLPipeline::sRenderDeferred)
if (gWindowResized)
{ //skip render on frames where window has been resized
gGL.flush();
glClear(GL_COLOR_BUFFER_BIT);
gViewerWindow->mWindow->swapBuffers();
gPipeline.resizeScreenTexture();
gResizeScreenTexture = FALSE;
gWindowResized = FALSE;
return;
}
//Nope
/*if (LLPipeline::sRenderDeferred)
{ //hack to make sky show up in deferred snapshots
for_snapshot = FALSE;
}
}*/
if (LLPipeline::sRenderFrameTest)
{
@@ -601,11 +604,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLGLNamePool::upkeepPools();
stop_glerror();
#if SHY_MOD //screenshot improvement
display_update_camera(tiling);
#else //shy_mod
display_update_camera();
#endif //ignore
stop_glerror();
// *TODO: merge these two methods
@@ -678,7 +677,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLGLState::checkTextureChannels();
LLGLState::checkClientArrays();
BOOL to_texture = gPipeline.canUseVertexShaders() && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderGlow && !gSnapshot));
BOOL to_texture = gPipeline.canUseVertexShaders() && LLPipeline::sRenderGlow;
LLAppViewer::instance()->pingMainloopTimeout("Display:Swap");
@@ -701,7 +700,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLGLState::checkTextureChannels();
LLGLState::checkClientArrays();
if (!for_snapshot)
if (!for_snapshot || LLPipeline::sRenderDeferred)
{
if (gFrameCount > 1)
{ //for some reason, ATI 4800 series will error out if you
@@ -737,11 +736,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
#if SHY_MOD // screenshot improvement
if (!for_snapshot || tiling)
#else //shy_mod
if (!for_snapshot)
#endif //ignore
{
LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");
gPipeline.generateWaterReflection(*LLViewerCamera::getInstance());
@@ -876,7 +871,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
glClearColor(0,0,0,0);
gPipeline.mDeferredScreen.clear();
}
else
else if(!tiling)
{
gPipeline.mScreen.bindTarget();
gPipeline.mScreen.clear();
@@ -920,7 +915,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
gPipeline.mDeferredScreen.flush();
}
else
else if(!tiling)
{
gPipeline.mScreen.flush();
}
@@ -1134,7 +1129,7 @@ BOOL setup_hud_matrices(const LLRect& screen_region)
}
void render_ui(F32 zoom_factor, int subfield)
void render_ui(F32 zoom_factor, int subfield, bool tiling)
{
LLGLState::checkStates();
@@ -1149,7 +1144,7 @@ void render_ui(F32 zoom_factor, int subfield)
if (to_texture)
{
gPipeline.renderBloom(gSnapshot, zoom_factor, subfield);
gPipeline.renderBloom(gSnapshot, zoom_factor, subfield, tiling);
gPipeline.mScreen.flush(); //blit, etc.
}
/// We copy the frame buffer straight into a texture here,

View File

@@ -38,11 +38,7 @@ class LLPostProcess;
void display_startup();
void display_cleanup();
#if SHY_MOD // screenshot improvement
void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0, BOOL for_snapshot = FALSE, BOOL tiling = FALSE);
#else //shy_mod
void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0, BOOL for_snapshot = FALSE);
#endif //ignore
void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0, BOOL for_snapshot = FALSE, bool tiling = false);
extern BOOL gDisplaySwapBuffers;
extern BOOL gDepthDirty;
@@ -50,6 +46,7 @@ extern BOOL gTeleportDisplay;
extern LLFrameTimer gTeleportDisplayTimer;
extern BOOL gForceRenderLandFence;
extern BOOL gResizeScreenTexture;
extern BOOL gWindowResized;
extern F32 gSavedDrawDistance;
#endif // LL_LLVIEWERDISPLAY_H

View File

@@ -569,12 +569,15 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
S32 width = gViewerWindow->getWindowDisplayWidth();
S32 height = gViewerWindow->getWindowDisplayHeight();
F32 supersample = 1.f;
if (gSavedSettings.getBOOL("HighResSnapshot"))
{
#if SHY_MOD // screenshot improvement
#if 1//SHY_MOD // screenshot improvement
const F32 mult = gSavedSettings.getF32("SHHighResSnapshotScale");
width *= mult;
height *= mult;
static const LLCachedControl<F32> super_sample_scale("SHHighResSnapshotSuperSample",1.f);
supersample = super_sample_scale;
#else //shy_mod
width *= 2;
height *= 2;
@@ -587,7 +590,10 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
TRUE,
FALSE,
gSavedSettings.getBOOL("RenderUIInSnapshot"),
FALSE))
FALSE,
LLViewerWindow::SNAPSHOT_TYPE_COLOR,
6144,
supersample))
{
gViewerWindow->playSnapshotAnimAndSound();

View File

@@ -200,7 +200,7 @@
//
// Globals
//
void render_ui(F32 zoom_factor = 1.f, int subfield = 0);
void render_ui(F32 zoom_factor = 1.f, int subfield = 0, bool tiling = false);
LLBottomPanel* gBottomPanel = NULL;
extern BOOL gDebugClicks;
@@ -686,11 +686,12 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask
llinfos << "Left Mouse Down not handled by view" << llendl;
}
// Do not allow tool manager to handle mouseclicks if we have disconnected
if (gDisconnected)
{
return FALSE;
}
if(LLToolMgr::getInstance()->getCurrentTool()->handleMouseDown( x, y, mask ) )
{
// This is necessary to force clicks in the world to cause edit
@@ -1499,6 +1500,15 @@ LLViewerWindow::LLViewerWindow(
LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL;
}
LLCoordScreen scr;
mWindow->getSize(&scr);
if(fullscreen && ( scr.mX!=width || scr.mY!=height))
{
llwarns << "Fullscreen has forced us in to a different resolution now using "<<scr.mX<<" x "<<scr.mY<<llendl;
gSavedSettings.setS32("FullScreenWidth",scr.mX);
gSavedSettings.setS32("FullScreenHeight",scr.mY);
}
if (NULL == mWindow)
{
@@ -2133,6 +2143,7 @@ void LLViewerWindow::reshape(S32 width, S32 height)
return;
}
gWindowResized = TRUE;
glViewport(0, 0, width, height );
if (height > 0)
@@ -4251,7 +4262,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
// Saves the image from the screen to the specified filename and path.
BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height,
BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size)
BOOL keep_window_aspect, BOOL is_texture, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size, F32 supersample)
{
if (!raw)
{
@@ -4281,25 +4292,26 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// Copy screen to a buffer
// crop sides or top and bottom, if taking a snapshot of different aspect ratio
// from window
S32 snapshot_width = mWindowRect.getWidth();
S32 snapshot_height = mWindowRect.getHeight();
// SNAPSHOT
S32 window_width = mWindowRect.getWidth();
S32 window_height = mWindowRect.getHeight();
LLRect window_rect = mWindowRect;
BOOL use_fbo = FALSE;
LLRenderTarget target;
S32 snapshot_width = window_rect.getWidth();
S32 snapshot_height = window_rect.getHeight();
// SNAPSHOT
S32 window_width = snapshot_width;
S32 window_height = snapshot_height;
F32 scale_factor = 1.0f ;
bool is_tiling = false;
#if SHY_MOD // screenshot improvement
F32 internal_scale = 1.f;
static const LLCachedControl<bool> force_tile("SHHighResSnapshotForceTile",false);
if(force_tile)
{
static const LLCachedControl<F32> super_sample_scale("SHHighResSnapshotSuperSample",1.f);
internal_scale = llmax(super_sample_scale.get(),1.f);
}
//fbo method no longer supported. Good riddance
/*LLRenderTarget target;
bool use_fbo = false;
static const LLCachedControl<bool> force_tile("SHHighResSnapshotForceTile",false);*/
#if 1//SHY_MOD // screenshot improvement
F32 internal_scale = llmin(llmax(supersample,1.f),3.f);
// render at specified internal resolution. >1 results in supersampling.
image_height *= internal_scale;
image_width *= internal_scale;
@@ -4316,10 +4328,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
{
if(image_width > window_width || image_height > window_height) //need to enlarge the scene
{
#if SHY_MOD // screenshot improvement
if(!force_tile)
#endif //shy_mod
if (gGLManager.mHasFramebufferObject && !show_ui)
//Unsupported
/*if (!force_tile && gGLManager.mHasFramebufferObject && !show_ui)
{
GLint max_size = 0;
glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &max_size);
@@ -4339,12 +4349,13 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
}
}
if(!use_fbo) //no re-projection, so tiling the scene
if(!use_fbo) //no re-projection, so tiling the scene*/
{
F32 ratio = llmin( (F32)window_width / image_width , (F32)window_height / image_height) ;
snapshot_width = (S32)(ratio * image_width) ;
snapshot_height = (S32)(ratio * image_height) ;
scale_factor = llmax(1.0f, 1.0f / ratio) ;
is_tiling = true;
}
}
//else: keep the current scene scale, re-scale it if necessary after reading out.
@@ -4354,9 +4365,9 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
S32 buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f);
S32 image_buffer_x = llfloor(snapshot_width*scale_factor) ;
S32 image_buffer_y = llfloor(snapshot_height *scale_factor) ;
#if SHY_MOD // screenshot improvement
if(internal_scale > 1.f) //If supersampling... Don't care about max_size.
S32 image_buffer_y = llfloor(snapshot_height*scale_factor) ;
#if 1//SHY_MOD // screenshot improvement
if(internal_scale <= 1.f) //If supersampling... Don't care about max_size.
#endif //shy_mod
if(image_buffer_x > max_size || image_buffer_y > max_size) //boundary check to avoid memory overflow
{
@@ -4421,20 +4432,16 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
else
{
const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor));
#if SHY_MOD // screenshot improvement
//tiling requires gPipeline.generateWaterReflection to be called in display(). CANNOT be done if using an fbo.
display(do_rebuild, scale_factor, subfield, TRUE, !use_fbo && (scale_factor > 1.0f));
#else //shy_mod
display(do_rebuild, scale_factor, subfield, TRUE);
#endif
display(do_rebuild, scale_factor, subfield, TRUE, is_tiling);
// Required for showing the GUI in snapshots? See DEV-16350 for details. JC
render_ui(scale_factor, subfield);
render_ui(scale_factor, subfield, is_tiling);
}
S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width);
// handle fractional rows
U32 read_width = llmax(0, (window_width - subimage_x_offset) -
llmax(0, (window_width * (subimage_x + 1)) - (buffer_x_offset + raw->getWidth())));
for(U32 out_y = 0; out_y < read_height ; out_y++)
{
S32 output_buffer_offset = (
@@ -4454,7 +4461,8 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
if (type == SNAPSHOT_TYPE_OBJECT_ID || type == SNAPSHOT_TYPE_COLOR)
{
glReadPixels(
subimage_x_offset, out_y + subimage_y_offset,
subimage_x_offset,
out_y + subimage_y_offset,
read_width, 1,
GL_RGB, GL_UNSIGNED_BYTE,
raw->getData() + output_buffer_offset
@@ -4490,12 +4498,12 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
output_buffer_offset_y += subimage_y_offset;
}
if (use_fbo)
/*if (use_fbo)
{
mWindowRect = window_rect;
target.flush();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
}*/
gDisplaySwapBuffers = FALSE;
gDepthDirty = TRUE;
@@ -4531,7 +4539,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
ret = raw->scale( image_width, image_height, FALSE );
}
#if SHY_MOD // screenshot improvement
#if 1//SHY_MOD // screenshot improvement
if(raw->isBufferInvalid()) //Just checking!
return FALSE;
if(internal_scale != 1.f) //Scale down our render to the desired dimensions.
@@ -4796,6 +4804,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)
LLVOAvatar::restoreGL();
gResizeScreenTexture = TRUE;
gWindowResized = TRUE;
if (gFloaterCustomize && gFloaterCustomize->getVisible())
{

View File

@@ -289,7 +289,7 @@ public:
} ESnapshotType;
BOOL saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR);
BOOL rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, BOOL is_texture = FALSE,
BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE );
BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR, S32 max_size = MAX_SNAPSHOT_IMAGE_SIZE, F32 supersample = 1.f );
BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ;
BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }
void resetSnapshotLoc() const { sSnapshotDir.clear(); }

View File

@@ -224,11 +224,7 @@ glh::matrix4f gl_ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
return ret;
}
#if SHY_MOD //screenshot improvement
void display_update_camera(bool tiling=false);
#else //shy_mod
void display_update_camera();
#endif //ignore
//----------------------------------------
S32 LLPipeline::sCompiles = 0;
@@ -490,22 +486,21 @@ void LLPipeline::resizeScreenTexture()
GLuint resX = gViewerWindow->getWindowDisplayWidth();
GLuint resY = gViewerWindow->getWindowDisplayHeight();
U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
if (res_mod > 1 && res_mod < resX && res_mod < resY)
{
resX /= res_mod;
resY /= res_mod;
}
allocateScreenBuffer(resX,resY);
llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;
}
}
void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{
U32 samples = gSavedSettings.getU32("RenderFSAASamples");
U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
if (res_mod > 1 && res_mod < resX && res_mod < resY)
{
resX /= res_mod;
resY /= res_mod;
}
if (LLPipeline::sRenderDeferred)
{
//allocate deferred rendering color buffers
@@ -517,6 +512,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
{
mDeferredLight[i].allocate(resX, resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
}
//HACK: make alpha masking work on ATI depth shadows (work around for ATI driver bug)
U32 shadow_fmt = 0;/*gGLManager.mIsATI ? GL_ALPHA : 0;*/
for (U32 i = 0; i < 4; i++)
{
mSunShadow[i].allocate(1024,1024, shadow_fmt, TRUE, FALSE);
}
}
else
{
@@ -524,7 +527,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
}
if (gGLManager.mHasFramebufferMultisample && samples > 1)
if (LLRenderTarget::sUseFBO && gGLManager.mHasFramebufferMultisample && samples > 1)
{
if (LLPipeline::sRenderDeferred)
{
@@ -538,6 +541,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
}
mScreen.setSampleBuffer(&mSampleBuffer);
stop_glerror();
}
else if (LLPipeline::sRenderDeferred)
@@ -616,6 +620,9 @@ void LLPipeline::createGLBuffers()
stop_glerror();
GLuint resX = gViewerWindow->getWindowDisplayWidth();
GLuint resY = gViewerWindow->getWindowDisplayHeight();
if (LLPipeline::sRenderGlow)
{ //screen space glow buffers
const U32 glow_res = llmax(1,
@@ -625,19 +632,12 @@ void LLPipeline::createGLBuffers()
{
mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE,FALSE);
}
}
GLuint resX = gViewerWindow->getWindowDisplayWidth();
GLuint resY = gViewerWindow->getWindowDisplayHeight();
allocateScreenBuffer(resX,resY);
allocateScreenBuffer(resX,resY);
}
if (sRenderDeferred)
{
mSunShadow[0].allocate(1024,1024, 0, TRUE, FALSE);
mSunShadow[1].allocate(1024,1024, 0, TRUE, FALSE);
mSunShadow[2].allocate(1024,1024, 0, TRUE, FALSE);
mSunShadow[3].allocate(1024,1024, 0, TRUE, FALSE);
if (!mNoiseMap)
{
@@ -5297,7 +5297,7 @@ void LLPipeline::bindScreenToTexture()
}
void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield, bool tiling)
{
if (!(gPipeline.canUseVertexShaders() &&
sRenderGlow))
@@ -5316,7 +5316,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
static const LLCachedControl<U32> res_mod("RenderResolutionDivisor",1);
LLVector2 tc1(0,0);
LLVector2 tc2((F32) gViewerWindow->getWindowDisplayWidth()*2,
@@ -5349,7 +5349,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
gGL.setColorMask(true, true);
glClearColor(0,0,0,0);
if (for_snapshot)
if (tiling && !LLPipeline::sRenderDeferred) //Need to coax this into working with deferred now that tiling is back.
{
gGL.getTexUnit(0)->bind(&mGlow[1]);
{
@@ -5371,7 +5371,6 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ADD);
gGL.begin(LLRender::TRIANGLE_STRIP);
gGL.color4f(1,1,1,1);
@@ -5410,15 +5409,15 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
}
gGlowExtractProgram.bind();
F32 minLum = llmax(gSavedSettings.getF32("RenderGlowMinLuminance"), 0.0f);
F32 maxAlpha = gSavedSettings.getF32("RenderGlowMaxExtractAlpha");
F32 warmthAmount = gSavedSettings.getF32("RenderGlowWarmthAmount");
LLVector3 lumWeights = gSavedSettings.getVector3("RenderGlowLumWeights");
LLVector3 warmthWeights = gSavedSettings.getVector3("RenderGlowWarmthWeights");
gGlowExtractProgram.uniform1f("minLuminance", minLum);
static const LLCachedControl<F32> minLum("RenderGlowMinLuminance",2.5);
static const LLCachedControl<F32> maxAlpha("RenderGlowMaxExtractAlpha",0.065f);
static const LLCachedControl<F32> warmthAmount("RenderGlowWarmthAmount",0.0f);
static const LLCachedControl<LLVector3> lumWeights("RenderGlowLumWeights",LLVector3(.299f,.587f,.114f));
static const LLCachedControl<LLVector3> warmthWeights("RenderGlowWarmthWeights",LLVector3(1.f,.5f,.7f));
gGlowExtractProgram.uniform1f("minLuminance", llmax(minLum.get(),0.0f));
gGlowExtractProgram.uniform1f("maxExtractAlpha", maxAlpha);
gGlowExtractProgram.uniform3f("lumWeights", lumWeights.mV[0], lumWeights.mV[1], lumWeights.mV[2]);
gGlowExtractProgram.uniform3f("warmthWeights", warmthWeights.mV[0], warmthWeights.mV[1], warmthWeights.mV[2]);
gGlowExtractProgram.uniform3f("lumWeights", lumWeights.get().mV[0], lumWeights.get().mV[1], lumWeights.get().mV[2]);
gGlowExtractProgram.uniform3f("warmthWeights", warmthWeights.get().mV[0], warmthWeights.get().mV[1], warmthWeights.get().mV[2]);
gGlowExtractProgram.uniform1f("warmthAmount", warmthAmount);
LLGLEnable blend_on(GL_BLEND);
LLGLEnable test(GL_ALPHA_TEST);
@@ -5455,19 +5454,21 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
// power of two between 1 and 1024
U32 glowResPow = gSavedSettings.getS32("RenderGlowResolutionPow");
static const LLCachedControl<U32> glowResPow("RenderGlowResolutionPow",9);
const U32 glow_res = llmax(1,
llmin(1024, 1 << glowResPow));
S32 kernel = gSavedSettings.getS32("RenderGlowIterations")*2;
F32 delta = gSavedSettings.getF32("RenderGlowWidth") / glow_res;
static const LLCachedControl<S32> glow_iters("RenderGlowIterations",2);
S32 kernel = glow_iters*2;
static const LLCachedControl<F32> glow_width("RenderGlowWidth",1.3f);
F32 delta = glow_width*zoom_factor/glow_res;
// Use half the glow width if we have the res set to less than 9 so that it looks
// almost the same in either case.
if (glowResPow < 9)
{
delta *= 0.5f;
}
F32 strength = gSavedSettings.getF32("RenderGlowStrength");
static const LLCachedControl<F32> strength("RenderGlowStrength",.35f);
gGlowProgram.bind();
gGlowProgram.uniform1f("glowStrength", strength);
@@ -5775,6 +5776,12 @@ void LLPipeline::renderDeferredLighting()
}
LLViewerCamera* camera = LLViewerCamera::getInstance();
/*{
LLGLDepthTest depth(GL_TRUE);
mDeferredDepth.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
0, 0, mDeferredDepth.getWidth(), mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST);
}*/
LLGLEnable multisample(GL_MULTISAMPLE_ARB);
if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))
@@ -5830,6 +5837,10 @@ void LLPipeline::renderDeferredLighting()
{
bindDeferredShader(gDeferredSunProgram);
glClearColor(1,1,1,1);
mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT);
glClearColor(0,0,0,0);
glh::matrix4f inv_trans = glh_get_current_modelview().inverse().transpose();
const U32 slice = 32;
@@ -5854,6 +5865,9 @@ void LLPipeline::renderDeferredLighting()
{
LLGLDisable blend(GL_BLEND);
//TO-DO:
//V2 changed to LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
//Do this when multisample z-buffer issues are figured out
LLGLDepthTest depth(GL_FALSE);
stop_glerror();
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
@@ -5872,22 +5886,26 @@ void LLPipeline::renderDeferredLighting()
//mDeferredLight[1].copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
// 0, 0, mDeferredLight[0].getWidth(), mDeferredLight[0].getHeight(), GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
glClearColor(1,1,1,1);
mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT);
glClearColor(0,0,0,0);
bindDeferredShader(gDeferredBlurLightProgram);
LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian");
U32 kern_length = llclamp(gSavedSettings.getU32("RenderShadowBlurSamples"), (U32) 1, (U32) 16)*2 - 1;
F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize");
static const LLCachedControl<LLVector3> go("RenderShadowGaussian",LLVector3(2.f,2.f,0.f));
static const LLCachedControl<F32> blur_size("RenderShadowBlurSize",.7f);
static const LLCachedControl<U32> blur_samples("RenderShadowBlurSamples",(U32)5);
U32 kern_length = llclamp(blur_samples.get(), (U32) 1, (U32) 16)*2 - 1;
// sample symmetrically with the middle sample falling exactly on 0.0
// sample symmetrically with the middle sample falling exactly on 0.0
F32 x = -(kern_length/2.0f) + 0.5f;
LLVector3 gauss[32]; // xweight, yweight, offset
for (U32 i = 0; i < kern_length; i++)
{
gauss[i].mV[0] = llgaussian(x, go.mV[0]);
gauss[i].mV[1] = llgaussian(x, go.mV[1]);
gauss[i].mV[0] = llgaussian(x, go.get().mV[0]);
gauss[i].mV[1] = llgaussian(x, go.get().mV[1]);
gauss[i].mV[2] = x;
x += 1.f;
}
@@ -5997,6 +6015,7 @@ void LLPipeline::renderDeferredLighting()
gPipeline.popRenderTypeMask();
}
gGL.setSceneBlendType(LLRender::BT_ADD);
std::list<LLVector4> fullscreen_lights;
std::list<LLVector4> light_colors;
@@ -6349,9 +6368,10 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
}
if (gSavedSettings.getBOOL("RenderWaterReflections"))
static const LLCachedControl<bool> water_reflections("RenderWaterReflections",false);
if (water_reflections)
{ //mask out selected geometry based on reflection detail
S32 detail = gSavedSettings.getS32("RenderReflectionDetail");
static const LLCachedControl<S32> detail("RenderReflectionDetail",0);
//if (detail > 0)
{ //mask out selected geometry based on reflection detail
{
@@ -6376,7 +6396,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLPipeline::RENDER_TYPE_CLASSIC_CLOUDS,
LLPipeline::RENDER_TYPE_WL_CLOUDS,
LLPipeline::END_RENDER_TYPES);
static LLCachedControl<bool> skip_distortion_updates("SkipReflectOcclusionUpdates",false);
static const LLCachedControl<bool> skip_distortion_updates("SkipReflectOcclusionUpdates",false);
LLPipeline::sSkipUpdate = skip_distortion_updates;
LLGLUserClipPlane clip_plane(plane, mat, projection);
LLGLDisable cull(GL_CULL_FACE);
@@ -6553,7 +6573,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
//temporary hack to disable shadows but keep local lights
static BOOL clear = TRUE;
BOOL gen_shadow = gSavedSettings.getBOOL("RenderDeferredSunShadow");
static const LLCachedControl<bool> gen_shadow("RenderDeferredSunShadow",false);
if (!gen_shadow)
{
if (clear)
@@ -6605,10 +6625,10 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
LLVector3 up;
//clip contains parallel split distances for 3 splits
LLVector3 clip = gSavedSettings.getVector3("RenderShadowClipPlanes");
static const LLCachedControl<LLVector3> clip("RenderShadowClipPlanes",LLVector3(4.f,8.f,24.f));
//far clip on last split is minimum of camera view distance and 128
mSunClipPlanes = LLVector4(clip, clip.mV[2] * clip.mV[2]/clip.mV[1]);
mSunClipPlanes = LLVector4(clip, clip.get().mV[2] * clip.get().mV[2]/clip.get().mV[1]);
const LLPickInfo& pick_info = gViewerWindow->getLastPick();
@@ -6622,11 +6642,14 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
F32 dist[] = { 0.1f, mSunClipPlanes.mV[0], mSunClipPlanes.mV[1], mSunClipPlanes.mV[2], mSunClipPlanes.mV[3] };
//currently used for amount to extrude frusta corners for constructing shadow frusta
LLVector3 n = gSavedSettings.getVector3("RenderShadowNearDist");
F32 nearDist[] = { n.mV[0], n.mV[1], n.mV[2], n.mV[2] };
static const LLCachedControl<LLVector3> n("RenderShadowNearDist",LLVector3(256,256,256));
F32 nearDist[] = { n.get().mV[0], n.get().mV[1], n.get().mV[2], n.get().mV[2] };
for (S32 j = 0; j < 4; j++)
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+j;
//restore render matrices
glh_set_current_modelview(saved_view);
glh_set_current_projection(saved_proj);
@@ -6667,7 +6690,6 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
}
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_SHADOW0+j;
LLVector3 left = lightDir%at;
up = left%lightDir;
up.normVec();
@@ -6875,12 +6897,12 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
glPopMatrix();
gGLLastMatrix = NULL;
LLPipeline::sUseOcclusion = occlude;
sMinRenderSize = 0.f;
sMinRenderSize = 0.f;
mSunShadow[j].flush();
}
if (!gSavedSettings.getBOOL("CameraOffset"))
static const LLCachedControl<bool> camera_offset("CameraOffset",false);
if (!camera_offset)
{
glh_set_current_modelview(saved_view);
glh_set_current_projection(saved_proj);

View File

@@ -99,7 +99,7 @@ public:
void setDisableVBOMapping(BOOL no_vbo_mapping);
void generateImpostor(LLVOAvatar* avatar);
void bindScreenToTexture();
void renderBloom(BOOL for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
void renderBloom(BOOL for_snapshot, F32 zoom_factor = 1.f, int subfield = 0, bool tiling = false);
void init();
void cleanup();