Large snapshot update (part 2)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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) ;
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -548,7 +548,6 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
|
||||
width,
|
||||
height,
|
||||
ratio,
|
||||
FALSE,
|
||||
gSavedSettings.getBOOL("RenderUIInSnapshot"),
|
||||
FALSE,
|
||||
LLViewerWindow::SNAPSHOT_TYPE_COLOR,
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -374,7 +374,7 @@ void LLWaterParamManager::updateShaderLinks()
|
||||
void LLWaterParamManager::update(LLViewerCamera * cam)
|
||||
{
|
||||
LLFastTimer ftm(FTM_UPDATE_WATERPARAM);
|
||||
|
||||
|
||||
// update the shaders and the menu
|
||||
propagateParameters();
|
||||
|
||||
|
||||
@@ -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; }
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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 >>" 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>>" 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="<< Default" left_delta="0"
|
||||
height="20" label="<<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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user