Large snapshot update (part 2)

This commit is contained in:
Aleric Inglewood
2012-12-14 01:00:27 +01:00
parent d8bc84adb1
commit 15b6593143
21 changed files with 884 additions and 495 deletions

View File

@@ -50,7 +50,7 @@ BOOL LLCharacter::sAllowInstancesChange = TRUE ;
// LLCharacter()
// Class Constructor
//-----------------------------------------------------------------------------
LLCharacter::LLCharacter()
LLCharacter::LLCharacter(bool freeze_time)
:
mPreferredPelvisHeight( 0.f ),
mSex( SEX_FEMALE ),
@@ -62,6 +62,7 @@ LLCharacter::LLCharacter()
mMotionController.setCharacter( this );
mPauseRequest = new LLPauseRequestHandle();
mFreezeTimeHidden = freeze_time;
}

View File

@@ -62,7 +62,7 @@ class LLCharacter
{
public:
// Constructor
LLCharacter();
LLCharacter(bool freeze_time);
// Destructor
virtual ~LLCharacter();
@@ -277,6 +277,8 @@ public:
static std::vector< LLCharacter* > sInstances;
static BOOL sAllowInstancesChange ; //debug use
void resetFreezeTimeHidden() { mFreezeTimeHidden = false; }
protected:
LLMotionController mMotionController;
@@ -288,6 +290,7 @@ protected:
U32 mAppearanceSerialNum;
U32 mSkeletonSerialNum;
LLAnimPauseRequest mPauseRequest;
bool mFreezeTimeHidden; // True when this object was created during snapshot FreezeTime mode, and that mode is STILL active.
private:
// visual parameter stuff

View File

@@ -313,6 +313,32 @@ LLImageRaw::LLImageRaw(U8 *data, U16 width, U16 height, S8 components)
++sRawImageCount;
}
LLImageRaw::LLImageRaw(LLImageRaw const* src, U16 width, U16 height, U16 crop_offset, bool crop_vertically) : mCacheEntries(0)
{
mMemType = LLMemType::MTYPE_IMAGERAW;
llassert_always(src);
S8 const components = src->getComponents();
U8 const* const data = src->getData();
if (allocateDataSize(width, height, components))
{
if (crop_vertically)
{
llassert_always(width == src->getWidth());
memcpy(getData(), data + width * crop_offset * components, width * height * components);
}
else
{
llassert_always(height == src->getHeight());
U16 const src_width = src->getWidth();
for (U16 row = 0; row < height; ++row)
{
memcpy(getData() + width * row * components, data + (src_width * row + crop_offset) * components, width * components);
}
}
}
++sRawImageCount;
}
/*LLImageRaw::LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only)
: LLImageBase(), mCacheEntries(0)
{
@@ -529,7 +555,7 @@ void LLImageRaw::contractToPowerOfTwo(S32 max_dim, BOOL scale_image)
scale( new_width, new_height, scale_image );
}
void LLImageRaw::biasedScaleToPowerOfTwo(S32 max_dim)
void LLImageRaw::biasedScaleToPowerOfTwo(S32 target_width, S32 target_height, S32 max_dim)
{
// Strong bias towards rounding down (to save bandwidth)
// No bias would mean THRESHOLD == 1.5f;
@@ -538,22 +564,22 @@ void LLImageRaw::biasedScaleToPowerOfTwo(S32 max_dim)
// Find new sizes
S32 larger_w = max_dim; // 2^n >= mWidth
S32 smaller_w = max_dim; // 2^(n-1) <= mWidth
while( (smaller_w > getWidth()) && (smaller_w > MIN_IMAGE_SIZE) )
while( (smaller_w > target_width) && (smaller_w > MIN_IMAGE_SIZE) )
{
larger_w = smaller_w;
smaller_w >>= 1;
}
S32 new_width = ( (F32)getWidth() / smaller_w > THRESHOLD ) ? larger_w : smaller_w;
S32 new_width = ( (F32)target_width / smaller_w > THRESHOLD ) ? larger_w : smaller_w;
S32 larger_h = max_dim; // 2^m >= mHeight
S32 smaller_h = max_dim; // 2^(m-1) <= mHeight
while( (smaller_h > getHeight()) && (smaller_h > MIN_IMAGE_SIZE) )
while( (smaller_h > target_height) && (smaller_h > MIN_IMAGE_SIZE) )
{
larger_h = smaller_h;
smaller_h >>= 1;
}
S32 new_height = ( (F32)getHeight() / smaller_h > THRESHOLD ) ? larger_h : smaller_h;
S32 new_height = ( (F32)target_height / smaller_h > THRESHOLD ) ? larger_h : smaller_h;
scale( new_width, new_height );

View File

@@ -177,6 +177,7 @@ public:
LLImageRaw();
LLImageRaw(U16 width, U16 height, S8 components);
LLImageRaw(U8 *data, U16 width, U16 height, S8 components);
LLImageRaw(LLImageRaw const* src, U16 width, U16 height, U16 crop_offset, bool crop_vertically);
// Construct using createFromFile (used by tools)
//LLImageRaw(const std::string& filename, bool j2c_lowest_mip_only = false);
@@ -196,7 +197,8 @@ public:
void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
void biasedScaleToPowerOfTwo(S32 target_width, S32 target_height, S32 max_dim = MAX_IMAGE_SIZE);
void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE) { biasedScaleToPowerOfTwo(getWidth(), getHeight(), max_dim); }
BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
//BOOL scaleDownWithoutBlending( S32 new_width, S32 new_height) ;

View File

@@ -13563,6 +13563,17 @@ Found in Advanced->Rendering->Info Displays</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotOpenFreezeTime</key>
<map>
<key>Comment</key>
<string>When opening the snapshot floater, immediately freeze time.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SpeakingColor</key>
<map>
<key>Comment</key>
@@ -14275,12 +14286,12 @@ Found in Advanced->Rendering->Info Displays</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>UseFreezeFrame</key>
<key>UseFreezeTime</key>
<map>
<key>Comment</key>
<string>Freeze time when taking snapshots.</string>
<key>Persist</key>
<integer>1</integer>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>

View File

@@ -235,7 +235,10 @@ void LLDrawPoolWater::render(S32 pass)
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
// Slowly move over time.
F32 offset = fmod(gFrameTimeSeconds*2.f, 100.f);
static const LLCachedControl<bool> freeze_time("FreezeTime",false);
static F32 frame_time;
if (!freeze_time) frame_time = gFrameTimeSeconds;
F32 offset = fmod(frame_time*2.f, 100.f);
F32 tp0[4] = {16.f/256.f, 0.0f, 0.0f, offset*0.01f};
F32 tp1[4] = {0.0f, 16.f/256.f, 0.0f, offset*0.01f};
glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0);
@@ -387,11 +390,14 @@ void LLDrawPoolWater::renderOpaqueLegacyWater()
// Use the fact that we know all water faces are the same size
// to save some computation
// Slowly move texture coordinates over time so the watter appears
// Slowly move texture coordinates over time so the water appears
// to be moving.
F32 movement_period_secs = 50.f;
F32 offset = fmod(gFrameTimeSeconds, movement_period_secs);
static const LLCachedControl<bool> freeze_time("FreezeTime",false);
static F32 frame_time;
if (!freeze_time) frame_time = gFrameTimeSeconds;
F32 offset = fmod(frame_time, movement_period_secs);
if (movement_period_secs != 0)
{
@@ -549,7 +555,11 @@ void LLDrawPoolWater::shade()
shader->bind();
}
sTime = (F32)LLFrameTimer::getElapsedSeconds()*0.5f;
static const LLCachedControl<bool> freeze_time("FreezeTime",false);
if (!freeze_time)
{
sTime = (F32)LLFrameTimer::getElapsedSeconds()*0.5f;
}
S32 reftex = shader->enableTexture(LLViewerShaderMgr::WATER_REFTEX);

View File

@@ -181,7 +181,7 @@ void LLFloaterAuction::onClickSnapshot(void* data)
gViewerWindow->getWindowWidth(),
gViewerWindow->getWindowHeight(),
(F32)gViewerWindow->getWindowWidth() / gViewerWindow->getWindowHeight(),
FALSE, FALSE, FALSE);
FALSE, FALSE);
gForceRenderLandFence = FALSE;
if (success)

View File

@@ -902,7 +902,7 @@ void LLFloaterReporter::takeScreenshot()
LLPointer<LLImageRaw> raw = new LLImageRaw;
// Warning: This crops left and right in case of wide-screen monitor:
if( !gViewerWindow->rawSnapshot(raw, IMAGE_WIDTH, IMAGE_HEIGHT, (F32)IMAGE_WIDTH / IMAGE_HEIGHT, FALSE, TRUE, FALSE))
if( !gViewerWindow->rawSnapshot(raw, IMAGE_WIDTH, IMAGE_HEIGHT, (F32)IMAGE_WIDTH / IMAGE_HEIGHT, TRUE, FALSE))
{
llwarns << "Unable to take screenshot" << llendl;
return;

File diff suppressed because it is too large Load Diff

View File

@@ -47,7 +47,8 @@ public:
{
SNAPSHOT_FORMAT_PNG,
SNAPSHOT_FORMAT_JPEG,
SNAPSHOT_FORMAT_BMP
SNAPSHOT_FORMAT_BMP,
SNAPSHOT_FORMAT_J2C
} ESnapshotFormat;
LLFloaterSnapshot();
@@ -68,6 +69,7 @@ public:
static S32 getUIWinWidth() {return sUIWinWidth ;}
static void saveLocalDone(bool success);
static void saveFeedDone(bool success);
private:
class Impl;

View File

@@ -185,7 +185,8 @@ void display_update_camera(bool tiling=false)
// Cut draw distance in half when customizing avatar,
// but on the viewer only.
F32 final_far = gAgentCamera.mDrawDistance;
if(tiling) //Don't animate clouds and water if tiling!
static const LLCachedControl<bool> freeze_time("FreezeTime",false);
if(freeze_time || tiling) //Don't animate clouds and water if tiling!
{
LLViewerCamera::getInstance()->setFar(final_far);
gViewerWindow->setup3DRender();

View File

@@ -548,7 +548,6 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
width,
height,
ratio,
FALSE,
gSavedSettings.getBOOL("RenderUIInSnapshot"),
FALSE,
LLViewerWindow::SNAPSHOT_TYPE_COLOR,

View File

@@ -4120,7 +4120,7 @@ BOOL LLViewerWindow::saveSnapshot( const std::string& filepath, S32 image_width,
llinfos << "Saving snapshot to: " << filepath << llendl;
LLPointer<LLImageRaw> raw = new LLImageRaw;
BOOL success = rawSnapshot(raw, image_width, image_height, (F32)image_width / image_height, FALSE, show_ui, do_rebuild);
BOOL success = rawSnapshot(raw, image_width, image_height, (F32)image_width / image_height, show_ui, do_rebuild);
if (success)
{
@@ -4156,7 +4156,7 @@ void LLViewerWindow::playSnapshotAnimAndSound()
BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type)
{
return rawSnapshot(raw, preview_width, preview_height, (F32)gViewerWindow->getWindowWidthRaw() / gViewerWindow->getWindowHeightRaw(), TRUE, show_ui, do_rebuild, type);
return rawSnapshot(raw, preview_width, preview_height, (F32)gViewerWindow->getWindowWidthRaw() / gViewerWindow->getWindowHeightRaw(), show_ui, do_rebuild, type);
// *TODO below code was broken in deferred pipeline
/*
@@ -4296,24 +4296,28 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
}
// Saves the image from the screen to the image pointed to by raw.
S32 LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height,
F32 snapshot_aspect, BOOL /*is_texture*/, BOOL show_ui, BOOL do_rebuild, ESnapshotType type, S32 max_size, F32 supersample)
// This function does NOT yet scale the snapshot down to the requested size
// if that is smaller than the current window (scale_factor < 1) or if
// the aspect of the snapshot is unequal to the aspect of requested image.
bool LLViewerWindow::rawRawSnapshot(LLImageRaw *raw,
S32 image_width, S32 image_height, F32 snapshot_aspect, BOOL show_ui,
BOOL do_rebuild, ESnapshotType type, S32 max_size, F32 supersample)
{
if (!raw)
{
return 0;
return false;
}
//check if there is enough memory for the snapshot image
if(LLPipeline::sMemAllocationThrottled)
{
return 0; //snapshot taking is disabled due to memory restriction.
return false; //snapshot taking is disabled due to memory restriction.
}
if(image_width * image_height > (1 << 22)) //if snapshot image is larger than 2K by 2K
{
if(!LLMemory::tryToAlloc(NULL, image_width * image_height * 3))
{
llwarns << "No enough memory to take the snapshot with size (w : h): " << image_width << " : " << image_height << llendl ;
return 0; //there is no enough memory for taking this snapshot.
return false; //there is no enough memory for taking this snapshot.
}
}
@@ -4337,7 +4341,6 @@ S32 LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_heig
LLPipeline::sShowHUDAttachments = FALSE;
}
// Copy screen to a buffer
LLRect const window_rect = show_ui ? getWindowRectRaw() : getWorldViewRectRaw();
@@ -4373,7 +4376,6 @@ S32 LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_heig
F32 scale_factor;
S32 image_buffer_x;
S32 image_buffer_y;
S32 max_image_buffer;
F32 const window_aspect = (F32)window_width / window_height;
// snapshot fits precisely inside window, it is the portion of the window with the correct aspect.
@@ -4398,9 +4400,8 @@ S32 LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_heig
{
image_buffer_x = llround(snapshot_width * scale_factor);
image_buffer_y = llround(snapshot_height * scale_factor);
max_image_buffer = llmax(image_buffer_x, image_buffer_y);
if (max_image_buffer > max_size && // Boundary check to avoid memory overflow.
internal_scale <= 1.f) // SHY_MOD: If supersampling... Don't care about max_size.
if (llmax(image_buffer_x, image_buffer_y) > max_size && // Boundary check to avoid memory overflow.
internal_scale <= 1.f) // SHY_MOD: If supersampling... Don't care about max_size.
{
// Too big, clamp.
continue;
@@ -4413,17 +4414,24 @@ S32 LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_heig
buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f);
Dout(dc::notice, "rawSnapshot(" << image_width << ", " << image_height << ", " << snapshot_aspect << "): image_buffer_x = " << image_buffer_x << "; image_buffer_y = " << image_buffer_y);
if (image_buffer_x > 0 && image_buffer_y > 0)
bool error = !(image_buffer_x > 0 && image_buffer_y > 0);
if (!error)
{
raw->resize(image_buffer_x, image_buffer_y, 3);
error = raw->isBufferInvalid();
}
else
if (error)
{
return 0;
}
if(raw->isBufferInvalid())
{
return 0;
if (prev_draw_ui != gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
LLPipeline::toggleRenderDebugFeature((void*)LLPipeline::RENDER_DEBUG_FEATURE_UI);
}
if (hide_hud)
{
LLPipeline::sShowHUDAttachments = TRUE;
}
setCursor(UI_CURSOR_ARROW);
return false;
}
BOOL is_tiling = scale_factor > 1.f;
@@ -4490,7 +4498,7 @@ S32 LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_heig
// Ping the watchdog thread every 100 lines to keep us alive (arbitrary number, feel free to change)
if (out_y % 100 == 0)
{
LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot");
LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawRawSnapshot");
}
if (type == SNAPSHOT_TYPE_COLOR)
@@ -4553,31 +4561,6 @@ S32 LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_heig
LLHUDObject::reshapeAll();
}
// Pad image width such that the line length is a multiple of 4 bytes (for BMP encoding).
int n = 4;
for (int c = raw->getComponents(); c % 2 == 0 && n > 1; c /= 2) { n /= 2; } // n /= gcd(n, components)
image_width += (image_width * (n - 1)) % n; // Now n divides image_width, and thus four divides image_width * components, the line length.
BOOL ret = TRUE ;
// Resize image
if(llabs(image_width - image_buffer_x) > 4 || llabs(image_height - image_buffer_y) > 4)
{
ret = raw->scale( image_width, image_height );
}
else if(image_width != image_buffer_x || image_height != image_buffer_y)
{
ret = raw->scale( image_width, image_height, FALSE );
}
#if 1//SHY_MOD // screenshot improvement
if(raw->isBufferInvalid()) //Just checking!
return 0;
if(internal_scale != 1.f) //Scale down our render to the desired dimensions.
raw->scale( image_width/internal_scale, image_height/internal_scale );
if(raw->isBufferInvalid()) //Just checking!
return 0;
#endif //shy_mod
setCursor(UI_CURSOR_ARROW);
if (do_rebuild)
@@ -4595,7 +4578,46 @@ S32 LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_heig
send_agent_resume();
}
return ret ? max_image_buffer : 0;
return true;
}
// Same as the above, but does the resizing.
bool LLViewerWindow::rawSnapshot(LLImageRaw *raw,
S32 image_width, S32 image_height, F32 snapshot_aspect, BOOL show_ui,
BOOL do_rebuild, ESnapshotType type, S32 max_size, F32 supersample)
{
bool ret = rawRawSnapshot(raw, image_width, image_height, snapshot_aspect, show_ui, do_rebuild, type, max_size, supersample);
#if 1
if (ret && !raw->scale(image_width, image_height))
{
ret = false; // Failure.
}
#else // This was the old behavior.. but I don't think this is needed here.
if (ret)
{
// Pad image width such that the line length is a multiple of 4 bytes (for BMP encoding).
int n = 4;
for (int c = raw->getComponents(); c % 2 == 0 && n > 1; c /= 2) { n /= 2; } // n /= gcd(n, components)
image_width += (image_width * (n - 1)) % n; // Now n divides image_width, and thus four divides image_width * components, the line length.
// Resize image
if (llabs(image_width - image_buffer_x) > 4 || llabs(image_height - image_buffer_y) > 4)
{
ret = raw->scale( image_width, image_height );
}
else if (image_width != image_buffer_x || image_height != image_buffer_y)
{
ret = raw->scale( image_width, image_height, FALSE );
}
}
#endif
return ret;
}
void LLViewerWindow::destroyWindow()

View File

@@ -311,9 +311,12 @@ public:
SNAPSHOT_TYPE_DEPTH
};
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);
// Returns the largest dimension (x or y) of the buffer (which is never larger than max_size), or 0 on failure.
S32 rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, F32 aspect, BOOL is_texture = FALSE,
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 rawRawSnapshot(LLImageRaw* raw, S32 image_width, S32 image_height, F32 aspect,
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 rawSnapshot(LLImageRaw* raw, S32 image_width, S32 image_height, F32 aspect,
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

@@ -993,6 +993,12 @@ EmeraldGlobalBoobConfig LLVOAvatar::sBoobConfig;
static F32 calc_bouncy_animation(F32 x);
static U32 calc_shame(LLVOVolume* volume, std::set<LLUUID> &textures);
//-----------------------------------------------------------------------------
// Debug setting caches.
//-----------------------------------------------------------------------------
static LLCachedControl<bool> const freeze_time("FreezeTime", false);
static LLCachedControl<bool> const render_unloaded_avatar("RenderUnloadedAvatar", false);
//-----------------------------------------------------------------------------
// LLVOAvatar()
//-----------------------------------------------------------------------------
@@ -1000,6 +1006,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
const LLPCode pcode,
LLViewerRegion* regionp) :
LLViewerObject(id, pcode, regionp),
LLCharacter(freeze_time),
mIsDummy(FALSE),
mSpecialRenderMode(0),
mAttachmentGeometryBytes(0),
@@ -1045,7 +1052,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mSupportsAlphaLayers(FALSE),
mLoadedCallbacksPaused(FALSE),
mHasPelvisOffset( FALSE ),
mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar")),
mRenderUnloadedAvatar(render_unloaded_avatar),
mLastRezzedStatus(-1),
mFirstSetActualBoobGravRan( false ),
mSupportsPhysics( false ),
@@ -2871,6 +2878,11 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
return TRUE;
}
if (mFreezeTimeHidden)
{
return TRUE;
}
checkTextureLoading() ;
// force immediate pixel area update on avatars using last frames data (before drawable or camera updates)

View File

@@ -374,7 +374,7 @@ void LLWaterParamManager::updateShaderLinks()
void LLWaterParamManager::update(LLViewerCamera * cam)
{
LLFastTimer ftm(FTM_UPDATE_WATERPARAM);
// update the shaders and the menu
propagateParameters();

View File

@@ -124,6 +124,7 @@ public:
protected:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return webProfileResponders_timeout; }
/*virtual*/ bool followRedir(void) const { return true; }
private:
LLPointer<LLImageFormatted> mImagep;
@@ -160,6 +161,7 @@ public:
protected:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return webProfileResponders_timeout; }
/*virtual*/ bool followRedir(void) const { return true; }
private:
LLPointer<LLImageFormatted> mImagep;
@@ -207,6 +209,7 @@ public:
protected:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return webProfileResponders_timeout; }
/*virtual*/ bool followRedir(void) const { return true; }
};
///////////////////////////////////////////////////////////////////////////////

View File

@@ -475,7 +475,7 @@ void LLWLParamManager::propagateParameters(void)
void LLWLParamManager::update(LLViewerCamera * cam)
{
LLFastTimer ftm(FTM_UPDATE_WLPARAM);
// update clouds, sun, and general
mCurParams.updateCloudScrolling();

View File

@@ -682,6 +682,12 @@ void LLWorld::updateRegions(F32 max_update_time)
void LLWorld::updateParticles()
{
static const LLCachedControl<bool> freeze_time("FreezeTime",false);
if (freeze_time)
{
// don't move particles in snapshot mode
return;
}
LLViewerPartSim::getInstance()->updateSimulation();
}

View File

@@ -23,38 +23,47 @@
Save to my hard drive
</radio_item>
</radio_group>
<button bottom_delta="-28" follows="left|top" height="20" label="Refresh Snapshot" left="10"
name="new_snapshot_btn" width="195" />
<button bottom_delta="-28" follows="left|top" height="20" label="Take snapshot" left="10"
name="new_snapshot_btn" width="105" tool_tip="Make a snapshot of the current view. Use the save and/or upload button to actually save it. The latest snapshot is shown in the thumbnail. In Freeze Time mode a preview of the new snapshot is also shown full screen (note that this has NOT the same quality as the real thing that will be saved: it is downscaled from the actual formatted image to a power of two with a max. resolution of 1024x1024, in order to be displayed in openGL and then probably stretched again to fill your screen). Press ESC to go back to Freeze Time." />
<button bottom_delta="0" follows="left|top" height="20" label="Freeze time" left="119"
name="freeze_time_btn" width="90" tool_tip="Show a fullscreen preview. Allows to cam around as if time is frozen and make multiple snapshots of the same scene. Press ESC to undo!" />
<button bottom_delta="-22" follows="left|top" height="20" label="Upload" left="10"
name="feed_btn" width="105" />
<button bottom_delta="0" follows="left|top" height="20" label="Send" left="10"
name="send_btn" width="105" />
<button bottom_delta="0" follows="left|top" height="20" label="Upload ([UPLOADFEE])" left="10"
name="upload_btn" width="105" />
<flyout_button bottom_delta="0" follows="left|top" height="20" label="Save" left="10"
list_position="below" mouse_opaque="true" name="save_btn" tool_tip="Save image to a file"
width="105">
<flyout_button bottom_delta="-2" follows="left|top" height="20" label="Save" left="10"
list_position="below" mouse_opaque="true" name="save_btn" tool_tip="Save image to a file" width="105">
<flyout_button_item value="save" name="save_item">Save</flyout_button_item>
<flyout_button_item value="saveas" name="saveas_item">Save As...</flyout_button_item>
</flyout_button>
<button bottom_delta="0" follows="left|top" height="20" label="Cancel" left="120"
name="discard_btn" width="85" />
<button bottom_delta="-26" follows="left|top" font="SansSerifSmall" halign="center"
height="20" label="Advanced &gt;&gt;" left="10"
</flyout_button>
<combo_box bottom_delta="-4" follows="left|top" height="20" label="Format" left="139"
name="local_format_combo" width="70">
<combo_item name="PNG">
PNG
</combo_item>
<combo_item name="JPEG">
JPEG
</combo_item>
<combo_item name="BMP">
BMP
</combo_item>
</combo_box>
<button bottom_delta="-22" follows="left|top" font="SansSerifSmall" halign="center"
height="20" label="Advanced&gt;&gt;" left="10"
mouse_opaque="true" name="more_btn" scale_image="TRUE"
tool_tip="Advanced Options. Default uses current window size." width="80" />
tool_tip="Advanced Options. Default uses current window size." width="72" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" halign="center"
height="20" label="&lt;&lt; Default" left_delta="0"
height="20" label="&lt;&lt;Default" left_delta="0"
mouse_opaque="true" name="less_btn" scale_image="TRUE"
tool_tip="Advanced Options. Default uses current window size." width="80" />
<text bottom_delta="-20" follows="top|left" height="15" left="10" name="type_label2"
width="115">
tool_tip="Advanced Options. Default uses current window size." width="72" />
<slider bottom_delta="0" decimal_digits="0" follows="left|top" height="15"
increment="1" initial_val="75" left="80"
max_val="100" min_val="0" name="image_quality_slider" width="150" />
<text bottom_delta="-20" follows="top|left" height="15" left="10" name="type_label2" width="115">
Target size
</text>
<text bottom_delta="0" follows="top|left" height="15" left="130" name="format_label"
width="70">
Format
</text>
</text>
<combo_box bottom_delta="-22" follows="left|top" height="20" label="Resolution" left="10"
name="feed_size_combo" width="125">
<combo_item name="CurrentWindow" value="[i0,i0]">
@@ -166,19 +175,6 @@
Custom
</combo_item>
</combo_box>
<combo_box bottom_delta="0" follows="left|top" height="20" label="Format" left="130"
name="local_format_combo" width="70">
<combo_item name="PNG">
PNG
</combo_item>
<combo_item name="JPEG">
JPEG
</combo_item>
<combo_item name="BMP">
BMP
</combo_item>
</combo_box>
<spinner bottom_delta="-25" decimal_digits="0" follows="left|top" height="20"
increment="32" label="Width" label_width="30" left="10" max_val="6016"
min_val="32" name="snapshot_width" width="95" allow_text_entry="false"/>
@@ -200,7 +196,7 @@
</combo_box>
<combo_box bottom_delta="0" follows="left|top" height="20" label="Aspect" left="10"
name="postcard_aspect_combo" width="115">
<combo_item name="4:3" value="0">
<combo_item name="Default" value="-2">
Default
</combo_item>
<combo_item name="Custom" value="-1">
@@ -239,7 +235,10 @@
</combo_box>
<combo_box bottom_delta="0" follows="left|top" height="20" label="Aspect" left="10"
name="local_aspect_combo" width="115">
<combo_item name="CurrentWindow" value="[i0,i0]">
<combo_item name="Default" value="-2">
Default
</combo_item>
<combo_item name="CurrentWindow" value="0">
Current Window
</combo_item>
<combo_item name="1:1" value="1">
@@ -270,15 +269,12 @@
<spinner bottom_delta="0" decimal_digits="5" follows="left|top" height="20"
increment="0.01" label="" left="130" max_val="32"
min_val="0.03125" name="aspect_ratio" width="64" allow_text_entry="false"/>
<text bottom_delta="10" left="196">:1</text>
<slider bottom_delta="-30" decimal_digits="0" follows="left|top" height="15"
increment="1" initial_val="75" label="Image Quality" left="10"
max_val="100" min_val="0" name="image_quality_slider" width="210" />
<text bottom_delta="-28" follows="left|top" height="20" left="10"
<text bottom_delta="-10" left="196">:1</text>
<text bottom_delta="-20" follows="left|top" height="20" left="15"
name="layer_type_label" width="50">
Capture:
</text>
<combo_box bottom_delta="3" follows="left|top" height="20" label="Image Layers" left="60"
<combo_box bottom_delta="3" follows="left|top" height="20" label="Image Layers" left="61"
name="layer_types" width="145">
<combo_item name="Colors" value="colors">
Colors
@@ -287,14 +283,14 @@
Depth
</combo_item>
</combo_box>
<check_box bottom_delta="-20" follows="left|top" label="Show interface in snapshot"
<check_box bottom_delta="-18" follows="left|top" label="Show interface in snapshot"
left="10" name="ui_check" tool_tip="Show the UI in the snapshot. This enforces the resolution of the snapshot to that of your current window." />
<check_box bottom_delta="-20" follows="left|top" label="Show HUD objects in snapshot"
left="10" name="hud_check" tool_tip="Show your HUD objects in the snapshot. This enforces the resolution of the snapshot to that of your current window." />
<check_box bottom_delta="-20" follows="left|top" label="Keep open after saving" left="10"
name="keep_open_check" tool_tip="Do not close the snapshot floater after saving or uploading. This allows you to save, upload or send the SAME snapshot again with different formats and/or to a different destination." />
<check_box bottom_delta="-20" follows="left|top" label="Freeze time (CAM 3D preview)"
left="10" name="freeze_frame_check" tool_tip="Show a fullscreen preview. Allows to cam around as if time is frozen and make multiple snapshots of the same scene." />
<check_box bottom_delta="-20" follows="left|top" label="Open floater in Freeze Time mode"
left="10" name="freeze_time_check" tool_tip="This allows one to quickly press cntrl-shift-S and then take your time to choose the camera position and even make multiple shots of the frozen scene." />
<check_box bottom_delta="-20" follows="left|top" label="Auto-refresh" left="10"
name="auto_snapshot_check" tool_tip="Handy in conjunction with Freeze Time: creates a new fullscreen preview whenever you stop camming." />
<check_box bottom_delta="-20" follows="left|top" control_name="TemporaryUpload" enabled="true"

View File

@@ -405,6 +405,13 @@ There was a problem writing animation data. Please try again later.
There was a problem uploading the auction snapshot due to the following reason: [REASON]
</notification>
<notification
icon="alertmodal.tga"
name="UploadSnapshotFail"
type="alertmodal">
There was a problem uploading the snapshot due to the following reason: [REASON]
</notification>
<notification
icon="alertmodal.tga"
name="UnableToViewContentsMoreThanOne"