SH-483 Fix for varioius issues with hi-rez snapshots -- mainly disable the ability to take hi-rez snapshots if UI or HUD attachments are in the snapshot, and go back to old tile compositing method instead of using huge framebuffer objects.

master
Dave Parks 2011-02-01 02:06:36 -06:00
parent faac42bca7
commit d3bfbd8ebb
4 changed files with 99 additions and 37 deletions

View File

@ -1363,6 +1363,36 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater)
floater->getChildView("auto_snapshot_check")->setVisible( is_advance);
floater->getChildView("image_quality_slider")->setVisible( is_advance && show_slider);
if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot"))
{ //clamp snapshot resolution to window size when showing UI or HUD in snapshot
LLSpinCtrl* width_ctrl = floater->getChild<LLSpinCtrl>("snapshot_width");
LLSpinCtrl* height_ctrl = floater->getChild<LLSpinCtrl>("snapshot_height");
S32 width = gViewerWindow->getWindowWidthRaw();
S32 height = gViewerWindow->getWindowHeightRaw();
width_ctrl->setMaxValue(width);
height_ctrl->setMaxValue(height);
if (width_ctrl->getValue().asInteger() > width)
{
width_ctrl->forceSetValue(width);
}
if (height_ctrl->getValue().asInteger() > height)
{
height_ctrl->forceSetValue(height);
}
}
else
{
LLSpinCtrl* width = floater->getChild<LLSpinCtrl>("snapshot_width");
width->setMaxValue(6016);
LLSpinCtrl* height = floater->getChild<LLSpinCtrl>("snapshot_height");
height->setMaxValue(6016);
}
LLSnapshotLivePreview* previewp = getPreviewView(floater);
BOOL got_bytes = previewp && previewp->getDataSize() > 0;
BOOL got_snap = previewp && previewp->getSnapshotUpToDate();
@ -1810,6 +1840,13 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL
previewp->getSize(width, height);
if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot"))
{ //clamp snapshot resolution to window size when showing UI or HUD in snapshot
width = llmin(width, gViewerWindow->getWindowWidthRaw());
height = llmin(height, gViewerWindow->getWindowHeightRaw());
}
if(checkImageSize(previewp, width, height, TRUE, previewp->getMaxImageSize()))
{
resetSnapshotSizeOnUI(view, width, height) ;

View File

@ -647,8 +647,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLGLState::checkTextureChannels();
LLGLState::checkClientArrays();
BOOL to_texture = !for_snapshot &&
gPipeline.canUseVertexShaders() &&
BOOL to_texture = gPipeline.canUseVertexShaders() &&
LLPipeline::sRenderGlow;
LLAppViewer::instance()->pingMainloopTimeout("Display:Swap");
@ -709,7 +708,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
if (!for_snapshot)
//if (!for_snapshot)
{
LLMemType mt_gw(LLMemType::MTYPE_DISPLAY_GEN_REFLECTION);
LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");
@ -1043,8 +1042,7 @@ LLRect get_whole_screen_region()
S32 tile_height = llround((F32)gViewerWindow->getWorldViewHeightScaled() / zoom_factor);
int tile_y = sub_region / num_horizontal_tiles;
int tile_x = sub_region - (tile_y * num_horizontal_tiles);
glh::matrix4f mat;
whole_screen.setLeftTopAndSize(tile_x * tile_width, gViewerWindow->getWorldViewHeightScaled() - (tile_y * tile_height), tile_width, tile_height);
}
return whole_screen;
@ -1124,10 +1122,14 @@ void render_ui(F32 zoom_factor, int subfield)
LLMemType mt_ru(LLMemType::MTYPE_DISPLAY_RENDER_UI);
LLGLState::checkStates();
glPushMatrix();
glLoadMatrixd(gGLLastModelView);
glh::matrix4f saved_view = glh_get_current_modelview();
glh_set_current_modelview(glh_copy_matrix(gGLLastModelView));
if (!gSnapshot)
{
glPushMatrix();
glLoadMatrixd(gGLLastModelView);
glh_set_current_modelview(glh_copy_matrix(gGLLastModelView));
}
{
BOOL to_texture = gPipeline.canUseVertexShaders() &&
@ -1178,8 +1180,11 @@ void render_ui(F32 zoom_factor, int subfield)
LLVertexBuffer::unbind();
}
glh_set_current_modelview(saved_view);
glPopMatrix();
if (!gSnapshot)
{
glh_set_current_modelview(saved_view);
glPopMatrix();
}
if (gDisplaySwapBuffers)
{
@ -1321,7 +1326,7 @@ void render_ui_2d()
// render outline for HUD
if (isAgentAvatarValid() && gAgentCamera.mHUDCurZoom < 0.98f)
{
glPushMatrix();
gGL.pushMatrix();
S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2);
S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2);
glScalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f);
@ -1330,7 +1335,7 @@ void render_ui_2d()
glScalef(zoom,zoom,1.f);
gGL.color4fv(LLColor4::white.mV);
gl_rect_2d(-half_width, half_height, half_width, -half_height, FALSE);
glPopMatrix();
gGL.popMatrix();
stop_glerror();
}
@ -1378,8 +1383,7 @@ void render_ui_2d()
gGL.setColorMask(true, false);
LLUI::sDirtyRect = t_rect;
}
}
LLGLDisable cull(GL_CULL_FACE);
LLGLDisable blend(GL_BLEND);

View File

@ -3993,16 +3993,26 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
LLPipeline::sShowHUDAttachments = FALSE;
}
// if not showing ui, use full window to render world view
updateWorldViewRect(!show_ui);
// Copy screen to a buffer
// crop sides or top and bottom, if taking a snapshot of different aspect ratio
// from window
S32 snapshot_width = mWindowRectRaw.getWidth();
S32 snapshot_height = mWindowRectRaw.getHeight();
LLRect window_rect = show_ui ? getWindowRectRaw() : getWorldViewRectRaw();
S32 snapshot_width = window_rect.getWidth();
S32 snapshot_height = window_rect.getHeight();
// SNAPSHOT
S32 window_width = mWindowRectRaw.getWidth();
S32 window_height = mWindowRectRaw.getHeight();
LLRect window_rect = mWindowRectRaw;
S32 window_width = snapshot_width;
S32 window_height = snapshot_height;
if (show_ui)
{
image_width = llmin(image_width, window_width);
image_height = llmin(image_height, window_height);
}
F32 scale_factor = 1.0f ;
if(!keep_window_aspect) //image cropping
{
@ -4022,14 +4032,17 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
}
}
// if not showing ui, use full window to render world view
updateWorldViewRect(!show_ui);
if (show_ui && scale_factor > 1.f)
{
llwarns << "over scaling UI not supported." << llendl;
}
S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f);
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(image_buffer_x > max_size || image_buffer_y > max_size) //boundary check to avoid memory overflow
{
scale_factor *= llmin((F32)max_size / image_buffer_x, (F32)max_size / image_buffer_y) ;
@ -4038,7 +4051,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
}
if(image_buffer_x > 0 && image_buffer_y > 0)
{
raw->resize(image_buffer_x, image_buffer_y, 3);
raw->resize(image_buffer_x, image_buffer_y, 3);
}
else
{
@ -4050,12 +4063,13 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
}
BOOL high_res = scale_factor >= 2.f; // Font scaling is slow, only do so if rez is much higher
if (high_res)
if (high_res && show_ui)
{
send_agent_pause();
llwarns << "High res UI snapshot not supported. " << llendl;
/*send_agent_pause();
//rescale fonts
initFonts(scale_factor);
LLHUDObject::reshapeAll();
LLHUDObject::reshapeAll();*/
}
S32 output_buffer_offset_y = 0;
@ -4165,11 +4179,11 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
LLPipeline::sShowHUDAttachments = TRUE;
}
if (high_res)
/*if (high_res)
{
initFonts(1.f);
LLHUDObject::reshapeAll();
}
}*/
// Pre-pad image to number of pixels such that the line length is a multiple of 4 bytes (for BMP encoding)
// Note: this formula depends on the number of components being 3. Not obvious, but it's correct.

View File

@ -5432,7 +5432,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 (for_snapshot)
{
gGL.getTexUnit(0)->bind(&mGlow[1]);
{
@ -5443,14 +5443,21 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
// If the snapshot is constructed from tiles, calculate which
// tile we're in.
const S32 num_horizontal_tiles = llceil(zoom_factor);
const LLVector2 tile(subfield % num_horizontal_tiles,
(S32)(subfield / num_horizontal_tiles));
llassert(zoom_factor > 0.0); // Non-zero, non-negative.
const F32 tile_size = 1.0/zoom_factor;
tc1 = tile*tile_size; // Top left texture coordinates
tc2 = (tile+LLVector2(1,1))*tile_size; // Bottom right texture coordinates
//from LLViewerCamera::setPerpsective
if (zoom_factor > 1.f)
{
int pos_y = subfield / llceil(zoom_factor);
int pos_x = subfield - (pos_y*llceil(zoom_factor));
F32 size = 1.f/zoom_factor;
tc1.set(pos_x*size, pos_y*size);
tc2 = tc1 + LLVector2(size,size);
}
else
{
tc2.set(1,1);
}
LLGLEnable blend(GL_BLEND);
gGL.setSceneBlendType(LLRender::BT_ADD);
@ -5483,7 +5490,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield)
glPopMatrix();
return;
}
}*/
{
{