Merge branch 'master' of git://github.com/AlericInglewood/SingularityViewer

This commit is contained in:
Siana Gearz
2013-01-03 02:17:20 +01:00
58 changed files with 3575 additions and 1462 deletions

View File

@@ -196,8 +196,9 @@ set(viewer_SOURCE_FILES
llfloaterevent.cpp
llfloaterexploreanimations.cpp
llfloaterexploresounds.cpp
llfloaterfriends.cpp
llfloaterfeed.cpp
llfloaterfonttest.cpp
llfloaterfriends.cpp
llfloatergesture.cpp
llfloatergodtools.cpp
llfloatergroupinfo.cpp
@@ -704,6 +705,7 @@ set(viewer_HEADER_FILES
llfloaterexploreanimations.h
llfloaterexploresounds.h
llfloaterevent.h
llfloaterfeed.h
llfloaterfonttest.h
llfloaterfriends.h
llfloatergesture.h

View File

@@ -6776,6 +6776,22 @@ This should be as low as possible, but too low may break functionality</string>
<integer>0</integer>
</array>
</map>
<key>FloaterOutboxRect</key>
<map>
<key>Comment</key>
<string>Rectangle for merchant outbox window</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Rect</string>
<key>Value</key>
<array>
<integer>0</integer>
<integer>342</integer>
<integer>310</integer>
<integer>52</integer>
</array>
</map>
<key>FloaterPayRectB</key>
<map>
<key>Comment</key>
@@ -6856,6 +6872,38 @@ This should be as low as possible, but too low may break functionality</string>
<integer>400</integer>
</array>
</map>
<key>FloaterSnapshotFeedRect</key>
<map>
<key>Comment</key>
<string>Rectangle for snapshot feed window</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Rect</string>
<key>Value</key>
<array>
<integer>0</integer>
<integer>200</integer>
<integer>200</integer>
<integer>400</integer>
</array>
</map>
<key>FloaterSnapshotPostcardRect</key>
<map>
<key>Comment</key>
<string>Rectangle for snapshot postcard window</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Rect</string>
<key>Value</key>
<array>
<integer>0</integer>
<integer>346</integer>
<integer>450</integer>
<integer>400</integer>
</array>
</map>
<key>FloaterSoundsRect</key>
<map>
<key>Comment</key>
@@ -8163,17 +8211,6 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>64</integer>
</map>
<key>KeepAspectForSnapshot</key>
<map>
<key>Comment</key>
<string>Use full window when taking snapshot, regardless of requested image size</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>LandBrushSize</key>
<map>
<key>Comment</key>
@@ -8344,6 +8381,50 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<string>0.0.0</string>
</map>
<key>LastSnapshotToFeedAspect</key>
<map>
<key>Comment</key>
<string>The aspect ratio spinner value for snapshots uploaded to my.secondlife.com</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>1.33333</integer>
</map>
<key>LastSnapshotToFeedHeight</key>
<map>
<key>Comment</key>
<string>The height of the last my.secondlife.com feed snapshot, in px</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>525</integer>
</map>
<key>LastSnapshotToFeedWidth</key>
<map>
<key>Comment</key>
<string>The width of the last my.secondlife.com feed snapshot, in px</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>700</integer>
</map>
<key>LastSnapshotToEmailAspect</key>
<map>
<key>Comment</key>
<string>The aspect ratio spinner value for snapshots sent by email</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>LastSnapshotToEmailHeight</key>
<map>
<key>Comment</key>
@@ -8366,6 +8447,17 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>1024</integer>
</map>
<key>LastSnapshotToDiskAspect</key>
<map>
<key>Comment</key>
<string>The aspect ratio spinner value for snapshots written to disk</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>LastSnapshotToDiskHeight</key>
<map>
<key>Comment</key>
@@ -8388,6 +8480,17 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>1024</integer>
</map>
<key>LastSnapshotToInventoryAspect</key>
<map>
<key>Comment</key>
<string>The aspect ratio spinner value for snapshots uploaded to inventory</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>LastSnapshotToInventoryHeight</key>
<map>
<key>Comment</key>
@@ -8421,6 +8524,17 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotFeedAddLocation</key>
<map>
<key>Comment</key>
<string>Include your location in your uploads to profile feed.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>LeftClickShowMenu</key>
<map>
<key>Comment</key>
@@ -13686,6 +13800,28 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotFeedLastAspect</key>
<map>
<key>Comment</key>
<string>Take next feed snapshot at this aspect</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotFeedLastResolution</key>
<map>
<key>Comment</key>
<string>Take next feed snapshot at this resolution</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotFormat</key>
<map>
<key>Comment</key>
@@ -13697,6 +13833,28 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotLayerType</key>
<map>
<key>Comment</key>
<string>Save snapshots in this format (0 = Colors, 1 = Depth)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotLocalLastAspect</key>
<map>
<key>Comment</key>
<string>Take next local snapshot at this aspect</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotLocalLastResolution</key>
<map>
<key>Comment</key>
@@ -13708,6 +13866,17 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotPostcardLastAspect</key>
<map>
<key>Comment</key>
<string>Take next postcard snapshot at this aspect</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotPostcardLastResolution</key>
<map>
<key>Comment</key>
@@ -13730,6 +13899,17 @@ This should be as low as possible, but too low may break functionality</string>
<key>Value</key>
<integer>75</integer>
</map>
<key>SnapshotTextureLastAspect</key>
<map>
<key>Comment</key>
<string>Take next texture snapshot at this aspect</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>SnapshotTextureLastResolution</key>
<map>
<key>Comment</key>
@@ -13741,6 +13921,17 @@ This should be as low as possible, but too low may break functionality</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>
@@ -14453,12 +14644,12 @@ This should be as low as possible, but too low may break functionality</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

@@ -2514,9 +2514,10 @@ void LLAgentCamera::setFocusObject(LLViewerObject* object)
//-----------------------------------------------------------------------------
void LLAgentCamera::setFocusGlobal(const LLPickInfo& pick)
{
static const LLCachedControl<bool> freeze_time("FreezeTime",false);
LLViewerObject* objectp = gObjectList.findObject(pick.mObjectID);
if (objectp)
if (objectp && !freeze_time)
{
// focus on object plus designated offset
// which may or may not be same as pick.mPosGlobal

View File

@@ -237,7 +237,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);
@@ -418,11 +421,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)
{
@@ -580,7 +586,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

@@ -180,7 +180,7 @@ void LLFloaterAuction::onClickSnapshot(void* data)
BOOL success = gViewerWindow->rawSnapshot(raw,
gViewerWindow->getWindowWidth(),
gViewerWindow->getWindowHeight(),
TRUE, FALSE,
(F32)gViewerWindow->getWindowWidth() / gViewerWindow->getWindowHeight(),
FALSE, FALSE);
gForceRenderLandFence = FALSE;

View File

@@ -0,0 +1,177 @@
/**
* @file llfloaterfeed.cpp
* @brief Feed send floater, allows setting caption and whether or to add location, etc.
*
* $LicenseInfo:firstyear=2012&license=viewergpl$
*
* Copyright (c) 2004-2009, Linden Research, Inc.
* Copyright (c) 2012, Aleric Ingelwood.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llfloaterfeed.h"
#include "llfloatersnapshot.h"
#include "llimagepng.h"
#include "llnotificationsutil.h"
#include "lluictrlfactory.h"
#include "llviewertexture.h"
#include "llviewerwindow.h"
#include "llwebprofile.h"
#include <boost/bind.hpp>
///----------------------------------------------------------------------------
/// Class LLFloaterFeed
///----------------------------------------------------------------------------
LLFloaterFeed::LLFloaterFeed(LLImagePNG* png, LLViewerTexture* img, LLVector2 const& img_scale, int index) :
LLFloater(std::string("Feed Floater")),
mPNGImage(png), mViewerImage(img), mImageScale(img_scale), mSnapshotIndex(index)
{
}
// Destroys the object
LLFloaterFeed::~LLFloaterFeed()
{
mPNGImage = NULL;
}
BOOL LLFloaterFeed::postBuild()
{
getChild<LLUICtrl>("cancel_btn")->setCommitCallback(boost::bind(&LLFloaterFeed::onClickCancel, this));
getChild<LLUICtrl>("post_btn")->setCommitCallback(boost::bind(&LLFloaterFeed::onClickPost, this));
return true;
}
// static
LLFloaterFeed* LLFloaterFeed::showFromSnapshot(LLImagePNG* png, LLViewerTexture* img, LLVector2 const& image_scale, int index)
{
// Take the images from the caller
// It's now our job to clean them up
LLFloaterFeed* instance = new LLFloaterFeed(png, img, image_scale, index);
LLUICtrlFactory::getInstance()->buildFloater(instance, "floater_snapshot_feed.xml");
S32 left, top;
gFloaterView->getNewFloaterPosition(&left, &top);
instance->setOrigin(left, top - instance->getRect().getHeight());
instance->open();
return instance;
}
void LLFloaterFeed::draw(void)
{
LLGLSUIDefault gls_ui;
LLFloater::draw();
if (!isMinimized() && mViewerImage.notNull() && mPNGImage.notNull())
{
LLRect rect(getRect());
// First set the max extents of our preview.
rect.translate(-rect.mLeft, -rect.mBottom);
rect.mLeft += 10;
rect.mRight -= 10;
rect.mTop -= 25;
rect.mBottom = rect.mTop - 150;
// Then fix the aspect ratio.
F32 ratio = (F32)mPNGImage->getWidth() / (F32)mPNGImage->getHeight();
if ((F32)rect.getWidth() / (F32)rect.getHeight() >= ratio)
{
rect.mRight = (S32)((F32)rect.mLeft + ((F32)rect.getHeight() * ratio));
}
else
{
rect.mBottom = (S32)((F32)rect.mTop - ((F32)rect.getWidth() / ratio));
}
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f));
rect.stretch(-1);
}
{
gGL.matrixMode(LLRender::MM_TEXTURE);
gGL.pushMatrix();
{
gGL.scalef(mImageScale.mV[VX], mImageScale.mV[VY], 1.f);
gGL.matrixMode(LLRender::MM_MODELVIEW);
gl_draw_scaled_image(rect.mLeft, rect.mBottom, rect.getWidth(), rect.getHeight(), mViewerImage, LLColor4::white);
}
gGL.matrixMode(LLRender::MM_TEXTURE);
gGL.popMatrix();
gGL.matrixMode(LLRender::MM_MODELVIEW);
}
}
}
void LLFloaterFeed::onClickCancel()
{
// Return false on cancel, to enable the upload button again.
LLFloaterSnapshot::saveFeedDone(false, mSnapshotIndex);
close(false);
}
void LLFloaterFeed::onClose(bool app_quitting)
{
LLFloaterSnapshot::saveFeedDone(false, mSnapshotIndex);
destroy();
}
void LLFloaterFeed::onClickPost()
{
if (mPNGImage.notNull())
{
static LLCachedControl<bool> add_location("SnapshotFeedAddLocation");
const std::string caption = childGetValue("caption").asString();
LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::saveFeedDone, _1, mPNGImage));
LLWebProfile::uploadImage(mPNGImage, caption, add_location);
// give user feedback of the event
gViewerWindow->playSnapshotAnimAndSound();
// don't destroy the window until the upload is done
// this way we keep the information in the form
setVisible(FALSE);
// remove any dependency on snapshot floater
// so we outlive it during the upload.
LLFloater* dependee = getDependee();
if (dependee)
{
dependee->removeDependentFloater(this);
}
}
else
{
LLNotificationsUtil::add("ErrorProcessingSnapshot");
}
}

View File

@@ -0,0 +1,64 @@
/**
* @file llfloaterfeed.h
* @brief Feed send floater, allows setting caption and whether or not to include location.
*
* Copyright (c) 2004-2009, Linden Research, Inc.
* Copyright (c) 2012, Aleric Inglewood.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_LLFLOATERFEED_H
#define LL_LLFLOATERFEED_H
#include "llfloater.h" // LLFloater
#include "v2math.h" // LLVector2
#include "llpointer.h" // LLPointer
class LLImagePNG;
class LLViewerTexture;
class LLFloaterFeed : public LLFloater
{
public:
LLFloaterFeed(LLImagePNG* png, LLViewerTexture* img, LLVector2 const& img_scale, int index);
virtual ~LLFloaterFeed();
/*virtual*/ void onClose(bool app_quitting);
/*virtual*/ BOOL postBuild();
/*virtual*/ void draw();
static LLFloaterFeed* showFromSnapshot(LLImagePNG* png, LLViewerTexture* img, LLVector2 const& img_scale, int index);
void onClickCancel();
void onClickPost();
protected:
LLPointer<LLImagePNG> mPNGImage;
LLPointer<LLViewerTexture> mViewerImage;
LLVector2 const mImageScale;
int mSnapshotIndex;
};
#endif // LL_LLFLOATERFEED_H

View File

@@ -67,6 +67,7 @@
#include "llassetuploadresponders.h"
#include "hippogridmanager.h"
#include "llfloatersnapshot.h"
#if LL_MSVC
#pragma warning( disable : 4265 ) // "class has virtual functions, but destructor is not virtual"
@@ -84,13 +85,14 @@ LLFloaterPostcard::instance_list_t LLFloaterPostcard::sInstances;
/// Class LLFloaterPostcard
///----------------------------------------------------------------------------
LLFloaterPostcard::LLFloaterPostcard(LLImageJPEG* jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global)
LLFloaterPostcard::LLFloaterPostcard(LLImageJPEG* jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global, int index)
: LLFloater(std::string("Postcard Floater")),
mJPEGImage(jpeg),
mViewerImage(img),
mImageScale(img_scale),
mPosTakenGlobal(pos_taken_global),
mHasFirstMsgFocus(false)
mHasFirstMsgFocus(false),
mSnapshotIndex(index)
{
init();
}
@@ -146,11 +148,11 @@ BOOL LLFloaterPostcard::postBuild()
// static
LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2 &image_scale, const LLVector3d& pos_taken_global)
LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2 &image_scale, const LLVector3d& pos_taken_global, int index)
{
// Take the images from the caller
// It's now our job to clean them up
LLFloaterPostcard *instance = new LLFloaterPostcard(jpeg, img, image_scale, pos_taken_global);
LLFloaterPostcard *instance = new LLFloaterPostcard(jpeg, img, image_scale, pos_taken_global, index);
LLUICtrlFactory::getInstance()->buildFloater(instance, "floater_postcard.xml");
@@ -221,25 +223,47 @@ void LLFloaterPostcard::onClickCancel(void* data)
if (data)
{
LLFloaterPostcard *self = (LLFloaterPostcard *)data;
LLFloaterSnapshot::savePostcardDone(false, self->mSnapshotIndex);
self->close(false);
}
}
void LLFloaterPostcard::onClose(bool app_quitting)
{
LLFloaterSnapshot::savePostcardDone(false, mSnapshotIndex);
destroy();
}
class LLSendPostcardResponder : public LLAssetUploadResponder
{
private:
int mSnapshotIndex;
public:
LLSendPostcardResponder(const LLSD &post_data,
const LLUUID& vfile_id,
LLAssetType::EType asset_type):
LLAssetUploadResponder(post_data, vfile_id, asset_type)
LLAssetType::EType asset_type,
int index) :
LLAssetUploadResponder(post_data, vfile_id, asset_type),
mSnapshotIndex(index)
{
}
// *TODO define custom uploadFailed here so it's not such a generic message
void uploadComplete(const LLSD& content)
/*virtual*/ void uploadComplete(const LLSD& content)
{
// we don't care about what the server returns from this post, just clean up the UI
LLUploadDialog::modalUploadFinished();
LLFloaterSnapshot::savePostcardDone(true, mSnapshotIndex);
}
/*virtual*/ void uploadFailure(const LLSD& content)
{
LLAssetUploadResponder::uploadFailure(content);
LLFloaterSnapshot::savePostcardDone(false, mSnapshotIndex);
}
/*virtual*/ void error(U32 statusNum, const std::string& reason)
{
LLAssetUploadResponder::error(statusNum, reason);
LLFloaterSnapshot::savePostcardDone(false, mSnapshotIndex);
}
};
@@ -292,6 +316,8 @@ void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data,
LLUploadDialog::modalUploadFinished();
LLFloaterSnapshot::savePostcardDone(!result, self->mSnapshotIndex);
if (result)
{
LLSD args;
@@ -396,7 +422,7 @@ void LLFloaterPostcard::sendPostcard()
body["name"] = childGetValue("name_form").asString();
body["subject"] = childGetValue("subject_form").asString();
body["msg"] = childGetValue("msg_form").asString();
LLHTTPClient::post(url, body, new LLSendPostcardResponder(body, mAssetID, LLAssetType::AT_IMAGE_JPEG));
LLHTTPClient::post(url, body, new LLSendPostcardResponder(body, mAssetID, LLAssetType::AT_IMAGE_JPEG, mSnapshotIndex));
}
else
{

View File

@@ -50,14 +50,15 @@ class LLFloaterPostcard
: public LLFloater
{
public:
LLFloaterPostcard(LLImageJPEG* jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global);
virtual ~LLFloaterPostcard();
LLFloaterPostcard(LLImageJPEG* jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global, int index);
/*virtual*/ ~LLFloaterPostcard();
virtual void init();
virtual BOOL postBuild();
virtual void draw();
/*virtual*/ void init();
/*virtual*/ BOOL postBuild();
/*virtual*/ void draw();
/*virtual*/ void onClose(bool app_quitting);
static LLFloaterPostcard* showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global);
static LLFloaterPostcard* showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global, int index);
static void onClickCancel(void* data);
static void onClickSend(void* data);
@@ -82,6 +83,7 @@ protected:
LLVector2 mImageScale;
LLVector3d mPosTakenGlobal;
bool mHasFirstMsgFocus;
int mSnapshotIndex;
typedef std::set<LLFloaterPostcard*> instance_list_t;
static instance_list_t sInstances;

View File

@@ -898,7 +898,8 @@ void LLFloaterReporter::takeScreenshot()
const S32 IMAGE_HEIGHT = 768;
LLPointer<LLImageRaw> raw = new LLImageRaw;
if( !gViewerWindow->rawSnapshot(raw, IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, TRUE, FALSE))
// 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, TRUE, FALSE))
{
llwarns << "Unable to take screenshot" << llendl;
return;

File diff suppressed because it is too large Load Diff

View File

@@ -47,16 +47,22 @@ public:
{
SNAPSHOT_FORMAT_PNG,
SNAPSHOT_FORMAT_JPEG,
SNAPSHOT_FORMAT_BMP
SNAPSHOT_FORMAT_BMP,
SNAPSHOT_FORMAT_J2C
} ESnapshotFormat;
LLFloaterSnapshot();
virtual ~LLFloaterSnapshot();
LLRect getThumbnailAreaRect();
/*virtual*/ BOOL postBuild();
/*virtual*/ void draw();
/*virtual*/ void onClose(bool app_quitting);
/*virtual*/ void onOpen();
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
static void show(void*);
static void hide(void*);
@@ -66,6 +72,13 @@ public:
static S32 getUIWinHeightShort() {return sUIWinHeightShort ;}
static S32 getUIWinWidth() {return sUIWinWidth ;}
static void saveLocalDone(bool success, int index);
static void saveFeedDone(bool success, int index);
static void savePostcardDone(bool success, int index);
static void updateControls();
static void resetFeedAndPostcardAspect();
private:
class Impl;
Impl& impl;

View File

@@ -199,12 +199,19 @@ namespace LLMarketplaceImport
/*virtual*/ bool followRedir(void) const { return true; }
/*virtual*/ bool needsHeaders(void) const { return true; }
void completedHeaders(U32 status, std::string const& reason, AIHTTPReceivedHeaders const& headers)
/*virtual*/ void completedHeaders(U32 status, std::string const& reason, AIHTTPReceivedHeaders const& headers)
{
std::string set_cookie_string;
if (headers.getFirstValue("set-cookie", set_cookie_string) && !set_cookie_string.empty())
if (status == HTTP_OK)
{
sMarketplaceCookie = set_cookie_string;
std::string value = get_cookie("_slm_session");
if (!value.empty())
{
sMarketplaceCookie = value;
}
else if (sMarketplaceCookie.empty())
{
llwarns << "No such cookie \"_slm_session\" received!" << llendl;
}
}
}
@@ -226,7 +233,7 @@ namespace LLMarketplaceImport
{
if (gSavedSettings.getBOOL("InventoryOutboxLogging"))
{
llinfos << " SLM GET clearing marketplace cookie due to authentication failure or timeout" << llendl;
llinfos << " SLM GET clearing marketplace cookie due to authentication failure or timeout (" << status << " / " << reason << ")." << llendl;
}
sMarketplaceCookie.clear();
@@ -372,7 +379,7 @@ namespace LLMarketplaceImport
// Interface class
//
//static const F32 MARKET_IMPORTER_UPDATE_FREQUENCY = 300.0f; //1.0f;
static const F32 MARKET_IMPORTER_UPDATE_FREQUENCY = 1.0f;
//static
void LLMarketplaceInventoryImporter::update()
@@ -383,7 +390,7 @@ void LLMarketplaceInventoryImporter::update()
if (update_timer.hasExpired())
{
LLMarketplaceInventoryImporter::instance().updateImport();
static LLCachedControl<F32> MARKET_IMPORTER_UPDATE_FREQUENCY("MarketImporterUpdateFreq", 10.0f);
//static LLCachedControl<F32> MARKET_IMPORTER_UPDATE_FREQUENCY("MarketImporterUpdateFreq", 1.0f);
update_timer.setTimerExpirySec(MARKET_IMPORTER_UPDATE_FREQUENCY);
}
}

View File

@@ -70,7 +70,6 @@ LLMenuOptionPathfindingRebakeNavmesh::~LLMenuOptionPathfindingRebakeNavmesh()
void LLMenuOptionPathfindingRebakeNavmesh::initialize()
{
llassert(!mIsInitialized);
if (!mIsInitialized)
{
mIsInitialized = true;

View File

@@ -162,10 +162,6 @@ public:
LLLoginRefreshHandler gLoginRefreshHandler;
// <edit>
std::string gFullName;
// </edit>
// helper class that trys to download a URL from a web site and calls a method
// on parent class indicating if the web server is working or not
class LLIamHereLogin : public LLHTTPClient::ResponderHeadersOnly

View File

@@ -41,10 +41,6 @@
class LLUIImage;
class LLComboBox;
// <edit>
extern std::string gFullName;
// </edit>
class LLPanelLogin:
public LLPanel,
public LLViewerMediaObserver
@@ -165,8 +161,4 @@ private:
std::string load_password_from_disk(void);
void save_password_to_disk(const char* hashed_password);
// <edit>
extern std::string gFullName;
// </edit>
#endif

View File

@@ -4421,6 +4421,10 @@ public:
}
}
else if (avatar->isLangolier())
{
skip_check = true;
}
}
if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mFaceHit, &intersection, mTexCoord, mNormal, mBinormal))

View File

@@ -757,9 +757,6 @@ bool idle_startup()
// We have at least some login information on a SLURL
firstname = gLoginHandler.getFirstName();
lastname = gLoginHandler.getLastName();
// <edit>
gFullName = utf8str_tolower(firstname + " " + lastname);
// </edit>
web_login_key = gLoginHandler.getWebLoginKey();
// Show the login screen if we don't have everything
@@ -771,9 +768,6 @@ bool idle_startup()
LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo");
firstname = cmd_line_login[0].asString();
lastname = cmd_line_login[1].asString();
// <edit>
gFullName = utf8str_tolower(firstname + " " + lastname);
// </edit>
LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str());
char md5pass[33]; /* Flawfinder: ignore */
@@ -791,9 +785,6 @@ bool idle_startup()
{
firstname = gSavedSettings.getString("FirstName");
lastname = gSavedSettings.getString("LastName");
// <edit>
gFullName = utf8str_tolower(firstname + " " + lastname);
// </edit>
password = LLStartUp::loadPasswordFromDisk();
gSavedSettings.setBOOL("RememberPassword", TRUE);
@@ -809,9 +800,6 @@ bool idle_startup()
// a valid grid is selected
firstname = gSavedSettings.getString("FirstName");
lastname = gSavedSettings.getString("LastName");
// <edit>
gFullName = utf8str_tolower(firstname + " " + lastname);
// </edit>
password = LLStartUp::loadPasswordFromDisk();
show_connect_box = true;
}
@@ -895,9 +883,6 @@ bool idle_startup()
else
{
LLPanelLogin::setFields(firstname, lastname, password);
// <edit>
gFullName = utf8str_tolower(firstname + " " + lastname);
// </edit>
LLPanelLogin::giveFocus();
}
display_startup();
@@ -969,9 +954,6 @@ bool idle_startup()
{
firstname = gLoginHandler.getFirstName();
lastname = gLoginHandler.getLastName();
// <edit>
gFullName = utf8str_tolower(firstname + " " + lastname);
// </edit>
web_login_key = gLoginHandler.getWebLoginKey();
}
@@ -990,15 +972,21 @@ bool idle_startup()
{
gSavedSettings.setString("FirstName", firstname);
gSavedSettings.setString("LastName", lastname);
// <edit>
gFullName = utf8str_tolower(firstname + " " + lastname);
// </edit>
if (!gSavedSettings.controlExists("RememberLogin")) gSavedSettings.declareBOOL("RememberLogin", false, "Remember login", false);
gSavedSettings.setBOOL("RememberLogin", LLPanelLogin::getRememberLogin());
LL_INFOS("AppInit") << "Attempting login as: " << firstname << " " << lastname << LL_ENDL;
gDebugInfo["LoginName"] = firstname + " " + lastname;
}
else
{
// User tried to login on a non-SecondLife grid with an empty lastname.
LLSD subs;
subs["GRIDNAME"] = gHippoGridManager->getConnectedGrid()->getGridName();
LLNotificationsUtil::add(firstname.empty() ? "EmptyFirstNameMessage" : "EmptyLastNameMessage", subs);
LLStartUp::setStartupState(STATE_LOGIN_SHOW);
return FALSE;
}
LLScriptEdCore::parseFunctions("lsl_functions_sl.xml"); //Singu Note: This parsing function essentially replaces the entirety of the lscript_library library
@@ -4099,9 +4087,6 @@ bool process_login_success_response(std::string& password)
if(!text.empty()) lastname.assign(text);
gSavedSettings.setString("FirstName", firstname);
gSavedSettings.setString("LastName", lastname);
// <edit>
gFullName = utf8str_tolower(firstname + " " + lastname);
// </edit>
if (gSavedSettings.getBOOL("RememberPassword"))
{

View File

@@ -188,7 +188,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

@@ -55,6 +55,7 @@
#include "llwindow.h"
#include "llvieweraudio.h"
#include "llweb.h"
#include "llwebprofile.h"
#include "llfloateravatarinfo.h" // for getProfileURL() function
//#include "viewerversion.h"
@@ -140,12 +141,7 @@ public:
{
LL_DEBUGS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL;
LL_DEBUGS("MediaAuth") << headers << LL_ENDL;
AIHTTPReceivedHeaders::range_type cookies;
if (headers.getValues("set-cookie", cookies))
{
for (AIHTTPReceivedHeaders::iterator_type cookie = cookies.first; cookie != cookies.second; ++cookie)
LLViewerMedia::openIDCookieResponse(cookie->second);
}
LLViewerMedia::openIDCookieResponse(get_cookie("agni_sl_session_id"));
}
/* virtual */ void completedRaw(
@@ -182,11 +178,29 @@ public:
LL_INFOS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL;
LL_INFOS("MediaAuth") << headers << LL_ENDL;
bool found = false;
AIHTTPReceivedHeaders::range_type cookies;
if (headers.getValues("set-cookie", cookies))
{
for (AIHTTPReceivedHeaders::iterator_type cookie = cookies.first; cookie != cookies.second; ++cookie)
{
LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie->second, mHost);
std::string key = cookie->second.substr(0, cookie->second.find('='));
if (key == "_my_secondlife_session")
{
// Set cookie for snapshot publishing.
std::string auth_cookie = cookie->second.substr(0, cookie->second.find(";")); // strip path
LL_INFOS("MediaAuth") << "Setting openID auth cookie \"" << auth_cookie << "\"." << LL_ENDL;
LLWebProfile::setAuthCookie(auth_cookie);
found = true;
break;
}
}
}
if (!found)
{
llwarns << "LLViewerMediaWebProfileResponder did not receive a session ID cookie \"_my_secondlife_session\"! OpenID authentications will fail!" << llendl;
}
}

View File

@@ -527,6 +527,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
S32 width = gViewerWindow->getWindowDisplayWidth();
S32 height = gViewerWindow->getWindowDisplayHeight();
F32 ratio = (F32)width / height;
F32 supersample = 1.f;
if (gSavedSettings.getBOOL("HighResSnapshot"))
@@ -546,8 +547,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
if (gViewerWindow->rawSnapshot(raw,
width,
height,
TRUE,
FALSE,
ratio,
gSavedSettings.getBOOL("RenderUIInSnapshot"),
FALSE,
LLViewerWindow::SNAPSHOT_TYPE_COLOR,
@@ -574,7 +574,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
formatted->enableOverSize() ;
formatted->encode(raw, 0);
formatted->disableOverSize();
gViewerWindow->saveImageNumbered(formatted);
gViewerWindow->saveImageNumbered(formatted, -1);
}
return true;
}

View File

@@ -1340,7 +1340,7 @@ void LLViewerObjectList::killAllObjects()
killObject(objectp);
// Object must be dead, or it's the LLVOAvatarSelf which never dies.
llassert((objectp == gAgentAvatarp) || objectp->isDead());
llassert((objectp == gAgentAvatarp) || objectp->isDead() || (objectp->asAvatar() && objectp->asAvatar()->isFrozenDead()));
}
cleanDeadObjects(FALSE);

View File

@@ -3990,10 +3990,11 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d
}
// Saves an image to the harddrive as "SnapshotX" where X >= 1.
void LLViewerWindow::saveImageNumbered(LLPointer<LLImageFormatted> image)
void LLViewerWindow::saveImageNumbered(LLPointer<LLImageFormatted> image, int index)
{
if (!image)
{
LLFloaterSnapshot::saveLocalDone(false, index);
return;
}
@@ -4022,15 +4023,15 @@ void LLViewerWindow::saveImageNumbered(LLPointer<LLImageFormatted> image)
// pick a directory in which to save
AIFilePicker* filepicker = AIFilePicker::create(); // Deleted in LLViewerWindow::saveImageNumbered_continued1
filepicker->open(proposed_name, pick_type, "", "snapshot");
filepicker->run(boost::bind(&LLViewerWindow::saveImageNumbered_continued1, this, image, extension, filepicker));
filepicker->run(boost::bind(&LLViewerWindow::saveImageNumbered_continued1, this, image, extension, filepicker, index));
return;
}
// LLViewerWindow::sSnapshotBaseName and LLViewerWindow::sSnapshotDir already known. Go straight to saveImageNumbered_continued2.
saveImageNumbered_continued2(image, extension);
saveImageNumbered_continued2(image, extension, index);
}
void LLViewerWindow::saveImageNumbered_continued1(LLPointer<LLImageFormatted> image, std::string const& extension, AIFilePicker* filepicker)
void LLViewerWindow::saveImageNumbered_continued1(LLPointer<LLImageFormatted> image, std::string const& extension, AIFilePicker* filepicker, int index)
{
if (filepicker->hasFilename())
{
@@ -4040,11 +4041,15 @@ void LLViewerWindow::saveImageNumbered_continued1(LLPointer<LLImageFormatted> im
LLViewerWindow::sSnapshotBaseName = gDirUtilp->getBaseFileName(filepath, true);
LLViewerWindow::sSnapshotDir = gDirUtilp->getDirName(filepath);
saveImageNumbered_continued2(image, extension);
saveImageNumbered_continued2(image, extension, index);
}
else
{
LLFloaterSnapshot::saveLocalDone(false, index);
}
}
void LLViewerWindow::saveImageNumbered_continued2(LLPointer<LLImageFormatted> image, std::string const& extension)
void LLViewerWindow::saveImageNumbered_continued2(LLPointer<LLImageFormatted> image, std::string const& extension, int index)
{
// Look for an unused file name
std::string filepath;
@@ -4068,6 +4073,11 @@ void LLViewerWindow::saveImageNumbered_continued2(LLPointer<LLImageFormatted> im
if (image->save(filepath))
{
playSnapshotAnimAndSound();
LLFloaterSnapshot::saveLocalDone(true, index);
}
else
{
LLFloaterSnapshot::saveLocalDone(false, index);
}
}
@@ -4118,7 +4128,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, TRUE, FALSE, show_ui, do_rebuild);
BOOL success = rawSnapshot(raw, image_width, image_height, (F32)image_width / image_height, show_ui, do_rebuild);
if (success)
{
@@ -4154,7 +4164,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, FALSE, FALSE, 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
/*
@@ -4293,25 +4303,29 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p
return TRUE;*/
}
// 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, F32 supersample)
// Saves the image from the screen to the image pointed to by raw.
// 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 FALSE;
return false;
}
//check if there is enough memory for the snapshot image
if(LLPipeline::sMemAllocationThrottled)
{
return FALSE ; //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 FALSE ; //there is no enough memory for taking this snapshot.
return false; //there is no enough memory for taking this snapshot.
}
}
@@ -4335,27 +4349,13 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
LLPipeline::sShowHUDAttachments = FALSE;
}
// Copy screen to a buffer
// crop sides or top and bottom, if taking a snapshot of different aspect ratio
// from window
LLRect window_rect = show_ui ? getWindowRectRaw() : getWorldViewRectRaw();
S32 snapshot_width = window_rect.getWidth();
S32 snapshot_height = window_rect.getHeight();
LLRect const window_rect = show_ui ? getWindowRectRaw() : getWorldViewRectRaw();
S32 const window_width = window_rect.getWidth();
S32 const window_height = window_rect.getHeight();
// SNAPSHOT
S32 window_width = snapshot_width;
S32 window_height = snapshot_height;
F32 scale_factor = 1.0f ;
bool is_tiling = false;
//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);
@@ -4379,86 +4379,79 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
}
}
if(!keep_window_aspect) //image cropping
{
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) ;
}
else //the scene(window) proportion needs to be maintained.
S32 buffer_x_offset = 0;
S32 buffer_y_offset = 0;
F32 scale_factor;
S32 image_buffer_x;
S32 image_buffer_y;
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.
F32 snapshot_width = (snapshot_aspect > window_aspect) ? (F32)window_width : window_height * snapshot_aspect;
F32 snapshot_height = (snapshot_aspect < window_aspect) ? (F32)window_height : window_width / snapshot_aspect;
// ratio is the ratio snapshot/image', where image' is a rectangle with aspect snapshot_aspect that precisely contains image.
// Thus image_width' / image_height' == aspect ==> snapshot_width / image_width' == snapshot_height / image_height'.
// Since image' precisely contains image, one of them is equal (ie, image_height' = image_height) and the other is larger
// (or equal) (ie, image_width' >= image_width), and therefore one of snapshot_width / image_width and
// snapshot_height / image_height is correct, and the other is larger. Therefore, the smallest value of the
// following equals the ratio we're looking for.
F32 ratio = llmin(snapshot_width / image_width, snapshot_height / image_height);
// buffer equals the largest of image' and snapshot. This is because in the first case we need the higher
// resolution because of the size of the target image, and in the second case there is no reason to go
// smaller because it takes the same amount of time (and a slightly better quality should result after
// the final scaling). Thus, if ratio < 1 then buffer equals image', otherwise it equals snapshot.
// scale_factor is the ratio buffer/snapshot, and is initiallly equal to the ratio between buffer
// and snapshot (which have the same aspect).
for(scale_factor = llmax(1.0f, 1.0f / ratio);; // Initial attempt.
// However, if the buffer turns out to be too large, then clamp it to max_size.
scale_factor = llmin(max_size / snapshot_width, max_size / snapshot_height)) // Clamp
{
if(image_width > window_width || image_height > window_height) //need to enlarge the scene
image_buffer_x = llround(snapshot_width * scale_factor);
image_buffer_y = llround(snapshot_height * scale_factor);
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.
{
//Unsupported
/*if (!force_tile && gGLManager.mHasFramebufferObject && !show_ui)
{
GLint max_size = 0;
glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &max_size);
if (image_width <= max_size && image_height <= max_size) //re-project the scene
{
use_fbo = TRUE;
snapshot_width = image_width;
snapshot_height = image_height;
target.allocate(snapshot_width, snapshot_height, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, TRUE);
window_width = snapshot_width;
window_height = snapshot_height;
scale_factor = 1.f;
mWindowRectRaw.set(0, snapshot_height, snapshot_width, 0);
target.bindTarget();
}
}
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;
}
// Too big, clamp.
continue;
}
//else: keep the current scene scale, re-scale it if necessary after reading out.
// Done.
break;
}
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);
// Center the buffer.
buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f);
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);
S32 image_buffer_x = llfloor(snapshot_width*scale_factor) ;
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
bool error = !(image_buffer_x > 0 && image_buffer_y > 0);
if (!error)
{
scale_factor *= llmin((F32)max_size / image_buffer_x, (F32)max_size / image_buffer_y) ;
image_buffer_x = llfloor(snapshot_width*scale_factor) ;
image_buffer_y = llfloor(snapshot_height *scale_factor) ;
raw->resize(image_buffer_x, image_buffer_y, 3);
error = raw->isBufferInvalid();
}
if (image_buffer_x > 0 && image_buffer_y > 0)
if (error)
{
raw->resize(image_buffer_x, image_buffer_y, 3);
}
else
{
return FALSE ;
}
if(raw->isBufferInvalid())
{
return FALSE ;
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 high_res = scale_factor > 1.f;
if (high_res)
BOOL is_tiling = scale_factor > 1.f;
if (is_tiling)
{
Dout(dc::warning, "USING TILING FOR SNAPSHOT!");
send_agent_pause();
if (show_ui || !hide_hud)
{
//rescale fonts
initFonts(scale_factor);
LLHUDObject::reshapeAll();
//rescale fonts
initFonts(scale_factor);
LLHUDObject::reshapeAll();
}
}
@@ -4471,7 +4464,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
for (int subimage_y = 0; subimage_y < scale_factor; ++subimage_y)
{
S32 subimage_y_offset = llclamp(buffer_y_offset - (subimage_y * window_height), 0, window_height);;
S32 subimage_y_offset = llclamp(buffer_y_offset - (subimage_y * window_height), 0, window_height);
// handle fractional columns
U32 read_height = llmax(0, (window_height - subimage_y_offset) -
llmax(0, (window_height * (subimage_y + 1)) - (buffer_y_offset + raw->getHeight())));
@@ -4513,7 +4506,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// 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)
@@ -4556,12 +4549,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
output_buffer_offset_y += subimage_y_offset;
}
/*if (use_fbo)
{
mWindowRect = window_rect;
target.flush();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}*/
gDisplaySwapBuffers = FALSE;
gDepthDirty = TRUE;
@@ -4576,36 +4563,12 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
LLPipeline::sShowHUDAttachments = TRUE;
}
if (high_res && (show_ui || !hide_hud))
if (is_tiling && (show_ui || !hide_hud))
{
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.
image_width += (image_width * 3) % 4;
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 FALSE;
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 FALSE;
#endif //shy_mod
setCursor(UI_CURSOR_ARROW);
if (do_rebuild)
@@ -4618,11 +4581,50 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
gPipeline.resetDrawOrders();
}
if (high_res)
if (is_tiling)
{
send_agent_resume();
}
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;
}

View File

@@ -308,17 +308,21 @@ public:
enum ESnapshotType
{
SNAPSHOT_TYPE_COLOR,
SNAPSHOT_TYPE_DEPTH,
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);
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, 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(); }
void saveImageNumbered(LLPointer<LLImageFormatted> image);
void saveImageNumbered_continued1(LLPointer<LLImageFormatted> image, std::string const& extension, AIFilePicker* filepicker);
void saveImageNumbered_continued2(LLPointer<LLImageFormatted> image, std::string const& extension);
void saveImageNumbered(LLPointer<LLImageFormatted> image, int index);
void saveImageNumbered_continued1(LLPointer<LLImageFormatted> image, std::string const& extension, AIFilePicker* filepicker, int index);
void saveImageNumbered_continued2(LLPointer<LLImageFormatted> image, std::string const& extension, int index);
// Reset the directory where snapshots are saved.
// Client will open directory picker on next snapshot save.

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()
//-----------------------------------------------------------------------------
@@ -1005,6 +1011,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mAttachmentGeometryBytes(0),
mAttachmentSurfaceArea(0.f),
mTurning(FALSE),
mFreezeTimeLangolier(freeze_time),
mFreezeTimeDead(false),
mPelvisToFoot(0.f),
mLastSkeletonSerialNum( 0 ),
mHeadOffset(),
@@ -1045,7 +1053,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 ),
@@ -1229,6 +1237,13 @@ LLVOAvatar::~LLVOAvatar()
void LLVOAvatar::markDead()
{
static const LLCachedControl<bool> freeze_time("FreezeTime", false);
if (freeze_time && !mFreezeTimeLangolier)
{
// Delay the call to this function until FreezeTime is reset, otherwise avatars disappear from the frozen scene.
mFreezeTimeDead = true;
return;
}
if (mNameText)
{
mNameText->markDead();
@@ -3662,6 +3677,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
}
bool is_friend = LLAvatarTracker::instance().isBuddy(getID());
bool is_cloud = getIsCloud();
bool is_langolier = isLangolier();
if (is_appearance != mNameAppearance)
{
@@ -3687,7 +3703,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
|| is_muted != mNameMute
|| is_appearance != mNameAppearance
|| is_friend != mNameFriend
|| is_cloud != mNameCloud)
|| is_cloud != mNameCloud
|| is_langolier != mNameLangolier)
{
LLColor4 name_tag_color = getNameTagColor(is_friend);
@@ -3697,7 +3714,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
std::string firstnameText;
std::string lastnameText;
if (is_away || is_muted || is_busy || is_appearance || !idle_string.empty())
if (is_away || is_muted || is_busy || is_appearance || is_langolier || !idle_string.empty())
{
std::string line;
if (is_away)
@@ -3720,7 +3737,12 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
line += LLTrans::getString("AvatarEditingAppearance"); //"(Editing Appearance)"
line += ", ";
}
if (is_cloud)
if (is_langolier)
{
line += LLTrans::getString("AvatarLangolier"); //"Langolier"
line += ", ";
}
else if (is_cloud)
{
line += LLTrans::getString("LoadingData"); //"Loading..."
line += ", ";
@@ -3847,6 +3869,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name)
mNameAppearance = is_appearance;
mNameFriend = is_friend;
mNameCloud = is_cloud;
mNameLangolier = is_langolier;
mTitle = title ? title->getString() : "";
LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR);
new_name = TRUE;
@@ -4084,7 +4107,18 @@ bool LLVOAvatar::isVisuallyMuted() const
return LLMuteList::getInstance()->isMuted(getID()) ||
(mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) ||
(mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f);
(mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f) ||
isLangolier();
}
void LLVOAvatar::resetFreezeTime()
{
bool dead = mFreezeTimeDead;
mFreezeTimeLangolier = mFreezeTimeDead = false;
if (dead)
{
markDead();
}
}
//------------------------------------------------------------------------
@@ -4095,6 +4129,13 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
{
LLMemType mt(LLMemType::MTYPE_AVATAR);
// Frozen!
if (areAnimationsPaused())
{
updateMotions(LLCharacter::NORMAL_UPDATE); // This is necessary to get unpaused again.
return FALSE;
}
// clear debug text
mDebugText.clear();
if (LLVOAvatar::sShowAnimationDebug)

View File

@@ -341,6 +341,8 @@ public:
BOOL hasGray() const;
S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = fully textured.
void updateRezzedStatusTimers();
bool isLangolier() const { return mFreezeTimeLangolier; }
bool isFrozenDead() const { return mFreezeTimeDead; }
S32 mLastRezzedStatus;
protected:
@@ -358,6 +360,8 @@ private:
S32 mVisualComplexity;
LLFrameTimer mFullyLoadedTimer;
LLFrameTimer mRuthTimer;
bool mFreezeTimeLangolier; // True when this avatar was created during snapshot FreezeTime mode, and that mode is still active.
bool mFreezeTimeDead; // True when the avatar was marked dead (ie, TP-ed away) while in FreezeTime mode.
protected:
LLFrameTimer mInvisibleTimer;
@@ -453,6 +457,7 @@ private:
public:
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
bool isVisuallyMuted() const;
void resetFreezeTime();
U32 renderRigid();
U32 renderSkinned(EAvatarRenderPass pass);
@@ -1012,6 +1017,7 @@ private:
bool mNameAppearance;
bool mNameFriend;
bool mNameCloud;
bool mNameLangolier;
F32 mNameAlpha;
BOOL mRenderGroupTitles;

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

@@ -114,12 +114,13 @@ public:
config["caption"] = data.get("caption", "").asString();
// Do the actual image upload using the configuration.
LL_DEBUGS("Snapshots") << "Got upload config, POSTing image to " << upload_url << ", config=[" << config << "]" << llendl;
LL_DEBUGS("Snapshots") << "Got upload config, POSTing image to " << upload_url << ", config=[" << config << "]" << LL_ENDL;
LLWebProfile::post(mImagep, config, upload_url);
}
protected:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return webProfileResponders_timeout; }
/*virtual*/ bool followRedir(void) const { return true; }
private:
LLPointer<LLImageFormatted> mImagep;
@@ -150,12 +151,13 @@ public:
strstrm << istr.rdbuf();
const std::string body = strstrm.str();
llinfos << "Image uploaded." << llendl;
LL_DEBUGS("Snapshots") << "Uploading image succeeded. Response: [" << body << "]" << llendl;
LL_DEBUGS("Snapshots") << "Uploading image succeeded. Response: [" << body << "]" << LL_ENDL;
LLWebProfile::reportImageUploadStatus(true);
}
protected:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return webProfileResponders_timeout; }
/*virtual*/ bool followRedir(void) const { return true; }
private:
LLPointer<LLImageFormatted> mImagep;
@@ -171,10 +173,11 @@ class LLWebProfileResponders::PostImageResponder : public LLHTTPClient::Responde
public:
/*virtual*/ bool needsHeaders(void) const { return true; }
/*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
/*virtual*/ void completedHeaders(U32 status, std::string const& reason, AIHTTPReceivedHeaders const& received_headers)
{
// Viewer seems to fail to follow a 303 redirect on POST request
// (URLRequest Error: 65, Send failed since rewinding of the data stream failed).
// Server abuses 303 status; Curl can't handle it because it tries to resent
// the just uploaded data, which fails
// (CURLE_SEND_FAIL_REWIND: Send failed since rewinding of the data stream failed).
// Handle it manually.
if (status == 303)
{
@@ -182,14 +185,15 @@ public:
headers.addHeader("Accept", "*/*");
headers.addHeader("Cookie", LLWebProfile::getAuthCookie());
headers.addHeader("User-Agent", LLViewerMedia::getCurrentUserAgent());
const std::string& redir_url = content["location"];
LL_DEBUGS("Snapshots") << "Got redirection URL: " << redir_url << llendl;
std::string redir_url;
received_headers.getFirstValue("location", redir_url);
LL_DEBUGS("Snapshots") << "Got redirection URL: " << redir_url << LL_ENDL;
LLHTTPClient::get(redir_url, new LLWebProfileResponders::PostImageRedirectResponder, headers);
}
else
{
llwarns << "Unexpected POST status: " << status << " " << reason << llendl;
LL_DEBUGS("Snapshots") << "headers: [" << content << "]" << llendl;
LL_DEBUGS("Snapshots") << "received_headers: [" << received_headers << "]" << LL_ENDL;
LLWebProfile::reportImageUploadStatus(false);
}
}
@@ -203,6 +207,7 @@ public:
protected:
/*virtual*/ AIHTTPTimeoutPolicy const& getHTTPTimeoutPolicy(void) const { return webProfileResponders_timeout; }
/*virtual*/ bool redirect_status_ok(void) const { return true; }
};
///////////////////////////////////////////////////////////////////////////////
@@ -219,7 +224,7 @@ void LLWebProfile::uploadImage(LLPointer<LLImageFormatted> image, const std::str
config_url += "?caption=" + LLURI::escape(caption);
config_url += "&add_loc=" + std::string(add_location ? "1" : "0");
LL_DEBUGS("Snapshots") << "Requesting " << config_url << llendl;
LL_DEBUGS("Snapshots") << "Requesting " << config_url << LL_ENDL;
AIHTTPHeaders headers;
headers.addHeader("Accept", "*/*");
headers.addHeader("Cookie", LLWebProfile::getAuthCookie());
@@ -230,7 +235,7 @@ void LLWebProfile::uploadImage(LLPointer<LLImageFormatted> image, const std::str
// static
void LLWebProfile::setAuthCookie(const std::string& cookie)
{
LL_DEBUGS("Snapshots") << "Setting auth cookie: " << cookie << llendl;
LL_DEBUGS("Snapshots") << "Setting auth cookie: " << cookie << LL_ENDL;
sAuthCookie = cookie;
}
@@ -286,24 +291,22 @@ void LLWebProfile::post(LLPointer<LLImageFormatted> image, const LLSD& config, c
body << "--" << boundary << "\r\n"
<< "Content-Disposition: form-data; name=\"file\"; filename=\"snapshot.png\"\r\n"
<< "Content-Type: image/png\r\n\r\n";
size_t const body_size = body.str().size();
// Insert the image data.
// *FIX: Treating this as a string will probably screw it up ...
U8* image_data = image->getData();
for (S32 i = 0; i < image->getDataSize(); ++i)
{
body << image_data[i];
}
body << "\r\n--" << boundary << "--\r\n";
std::ostringstream footer;
footer << "\r\n--" << boundary << "--\r\n";
size_t const footer_size = footer.str().size();
size_t size = body_size + image->getDataSize() + footer_size;
// postRaw() takes ownership of the buffer and releases it later.
size_t size = body.str().size();
char* data = new char [size];
memcpy(data, body.str().data(), size);
memcpy(data, body.str().data(), body_size);
// Insert the image data.
memcpy(data + body_size, image->getData(), image->getDataSize());
memcpy(data + body_size + image->getDataSize(), footer.str().data(), footer_size);
// Send request, successful upload will trigger posting metadata.
LLHTTPClient::postRaw(url, data, size, new LLWebProfileResponders::PostImageResponder(), headers);
LLHTTPClient::postRaw(url, data, size, new LLWebProfileResponders::PostImageResponder(), headers/*,*/ DEBUG_CURLIO_PARAM(debug_off), no_keep_alive);
}
// static

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

@@ -10,6 +10,7 @@
name="floater_merchant_outbox"
save_rect="true"
save_visibility="false"
rect_control="FloaterOutboxRect"
reuse_instance="true"
title="Merchant Outbox"
width="333">

View File

@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater can_close="true" can_drag_on_left="false" can_minimize="false"
can_resize="true" height="380" min_height="380" min_width="450"
name="Postcard" title="Email Snapshot" width="450">
can_resize="true" height="346" min_height="346" min_width="450"
name="Postcard" title="Email Snapshot" width="450"
rect_control="FloaterSnapshotPostcardRect">
<text bottom="-35" follows="top|left" font="SansSerif" left="12" name="to_label">
Recipient&apos;s Email:
</text>
@@ -34,10 +35,6 @@
max_length="700" name="msg_form" width="420" spell_check="true">
Type your message here.
</text_editor>
<text bottom_delta="-37" follows="left|bottom" font="SansSerifSmall" left="12"
name="fine_print">
If your recipient joins our universe, you&apos;ll get a referral bonus.
</text>
<button bottom_delta="-32" follows="right|bottom" height="20" label="Cancel"
name="cancel_btn" right="-10" width="100" />
<button bottom_delta="0" follows="right|bottom" height="20" label="Send"

View File

@@ -1,58 +1,97 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater bottom="-300" can_close="true" can_drag_on_left="false" can_minimize="false"
can_resize="false" follows="left|top" height="566" name="Snapshot"
rect_control="FloaterSnapshotRect" title="Snapshot Preview" width="215">
<text bottom_delta="-40" follows="top|left" height="15" left="10" name="type_label"
width="195">
Snapshot destination
</text>
<radio_group bottom_delta="-65" follows="left|top" height="60" label="Snapshot type"
left="10" name="snapshot_type_radio" width="195">
<radio_item bottom="-19" height="16" name="postcard">
Send via email
</radio_item>
<radio_item bottom="-38" height="16" name="texture">
Save to your inventory ([UPLOADFEE])
</radio_item>
<radio_item bottom="-57" height="16" name="local">
Save to your hard drive
</radio_item>
</radio_group>
<text bottom="-236" follows="left|top" height="25" left="10" name="file_size_label"
width="195">
can_resize="false" follows="left|top" height="629" name="Snapshot"
rect_control="FloaterSnapshotRect" title="Snapshot Preview" width="219">
<text bottom="-201" right="-6" height="25" name="file_size_label" halign="right" width="120">
File size: [SIZE] KB
</text>
<button bottom="-246" follows="left|top" height="20" label="Refresh Snapshot" left="10"
name="new_snapshot_btn" width="195" />
<button bottom_delta="-22" follows="left|top" height="20" label="Send" left="10"
<text bottom="-195" height="15" left="10" name="type_label" halign="left">
Target
</text>
<radio_group bottom_delta="-79" follows="left|top" height="79" label="Snapshot type"
left="10" name="snapshot_type_radio" width="200">
<radio_item bottom="-19" height="16" name="feed">
Post to my.secondlife.com feed
</radio_item>
<radio_item bottom="-38" height="16" name="postcard">
Send via email
</radio_item>
<radio_item bottom="-57" height="16" name="texture">
Save to my inventory ([UPLOADFEE])
</radio_item>
<radio_item bottom="-76" height="16" name="local">
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="115" 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="129"
name="freeze_time_btn" width="80" tool_tip="Freeze time and 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="Save ([UPLOADFEE])" left="10"
<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="-290" follows="left|top" font="SansSerifSmall" halign="center"
height="20" label="More &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" width="80" />
tool_tip="Advanced Options. Default uses current window size (500x375 for profile feed)." width="72" />
<button bottom_delta="0" follows="left|top" font="SansSerifSmall" halign="center"
height="20" label="&lt;&lt; Less" 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" width="80" />
<text bottom_delta="-20" follows="top|left" height="15" left="10" name="type_label2"
width="115">
Size
</text>
<text bottom_delta="0" follows="top|left" height="15" left="130" name="format_label"
width="70">
Format
</text>
tool_tip="Advanced Options. Default uses current window size (500x375 for profile feed)." 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>
<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]">
Current Window
</combo_item>
<combo_item name="500x500" value="[i500,i500]">
500x500 (1:1)
</combo_item>
<combo_item name="500x375" value="[i500,i375]">
500x375 (4:3)
</combo_item>
<combo_item name="500x350" value="[i500,i350]">
500x350 (10:7)
</combo_item>
<combo_item name="500x313" value="[i500,i313]">
500x313 (16:10)
</combo_item>
<combo_item name="500x281" value="[i500,i281]">
500x281 (16:9)
</combo_item>
<combo_item name="500x250" value="[i500,i250]">
500x250 (2:1)
</combo_item>
<combo_item name="Custom" value="[i-1,i-1]">
Custom
</combo_item>
</combo_box>
<combo_box bottom_delta="0" follows="left|top" height="20" label="Resolution" left="10"
name="postcard_size_combo" width="115">
<combo_item name="CurrentWindow" value="[i0,i0]">
Current Window
@@ -60,6 +99,9 @@
<combo_item name="640x480" value="[i640,i480]">
640x480
</combo_item>
<combo_item name="700x525" value="[i700,i525]">
700x525
</combo_item>
<combo_item name="800x600" value="[i800,i600]">
800x600
</combo_item>
@@ -72,20 +114,32 @@
</combo_box>
<combo_box bottom_delta="0" follows="left|top" height="20" label="Resolution" left="10"
name="texture_size_combo" width="115">
<combo_item name="CurrentWindow" value="[i0,i0]">
Current Window
<combo_item name="512x512" value="[i512,i512]">
512x512 (1:1)
</combo_item>
<combo_item name="Small(128x128)" value="[i128,i128]">
Small (128x128)
<combo_item name="256x256" value="[i256,i256]">
256x256 (1:1)
</combo_item>
<combo_item name="Medium(256x256)" value="[i256,i256]">
Medium (256x256)
<combo_item name="128x128" value="[i128,i128]">
128x128 (1:1)
</combo_item>
<combo_item name="Large(512x512)" value="[i512,i512]">
Large (512x512)
<combo_item name="512x256" value="[i512,i256]">
512x256 (2:1)
</combo_item>
<combo_item name="Custom" value="[i-1,i-1]">
Custom
<combo_item name="256x128" value="[i256,i128]">
256x128 (2:1)
</combo_item>
<combo_item name="256x512" value="[i256,i512]">
256x512 (1:2)
</combo_item>
<combo_item name="128x256" value="[i128,i256]">
128x256 (1:2)
</combo_item>
<combo_item name="512x128" value="[i512,i128]">
512x128 (4:1)
</combo_item>
<combo_item name="128x512" value="[i128,i512]">
128x512 (1:4)
</combo_item>
</combo_box>
<combo_box bottom_delta="0" follows="left|top" height="20" label="Resolution" left="10"
@@ -105,45 +159,122 @@
<combo_item name="1024x768" value="[i1024,i768]">
1024x768
</combo_item>
<combo_item name="1280x960" value="[i1280,i960]">
1280x960
</combo_item>
<combo_item name="1280x1024" value="[i1280,i1024]">
1280x1024
</combo_item>
<combo_item name="1600x1200" value="[i1600,i1200]">
1600x1200
</combo_item>
<combo_item name="1680x1050" value="[i1680,i1050]">
1680x1050
</combo_item>
<combo_item name="Custom" value="[i-1,i-1]">
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"/>
<spinner bottom_delta="0" decimal_digits="0" follows="left|top" height="20"
increment="32" label="Height" label_width="35" left="110" max_val="6016"
min_val="32" name="snapshot_height" width="95" allow_text_entry="false"/>
<check_box bottom_delta="-20" follows="left|top" label="Constrain Proportions" left="10"
name="keep_aspect_check" />
<slider bottom_delta="-20" 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="-18" follows="top|left" height="15" left="10" name="type_label3"
width="115">
Target aspect ratio
</text>
<combo_box bottom_delta="-22" follows="left|top" height="20" label="Aspect" left="10"
name="feed_aspect_combo" width="115">
<combo_item name="Default" value="-2">
Default
</combo_item>
<combo_item name="Custom" value="-1">
Custom
</combo_item>
</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="Default" value="-2">
Default
</combo_item>
<combo_item name="Custom" value="-1">
Custom
</combo_item>
</combo_box>
<combo_box bottom_delta="0" follows="left|top" height="20" label="Aspect" left="10"
name="texture_aspect_combo" width="115">
<combo_item name="CurrentWindow" value="0">
Current Window
</combo_item>
<combo_item name="1:1" value="1">
1:1
</combo_item>
<combo_item name="4:3" value="1.33333">
4:3 (profile)
</combo_item>
<combo_item name="10:7" value="1.42857">
10:7
</combo_item>
<combo_item name="3:2" value="1.5">
3:2
</combo_item>
<combo_item name="16:10" value="1.6">
16:10
</combo_item>
<combo_item name="16:9" value="1.77778">
16:9
</combo_item>
<combo_item name="2:1" value="2">
2:1
</combo_item>
<combo_item name="Custom" value="-1">
Custom
</combo_item>
</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="Default" value="-2">
Default
</combo_item>
<combo_item name="CurrentWindow" value="0">
Current Window
</combo_item>
<combo_item name="1:1" value="1">
1:1
</combo_item>
<combo_item name="4:3" value="1.33333">
4:3 (profile)
</combo_item>
<combo_item name="10:7" value="1.42857">
10:7
</combo_item>
<combo_item name="3:2" value="1.5">
3:2
</combo_item>
<combo_item name="16:10" value="1.6">
16:10
</combo_item>
<combo_item name="16:9" value="1.77778">
16:9
</combo_item>
<combo_item name="2:1" value="2">
2:1
</combo_item>
<combo_item name="Custom" value="-1">
Custom
</combo_item>
</combo_box>
<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" height="20" left="196" name="aspect_one_label">: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
@@ -152,19 +283,19 @@
Depth
</combo_item>
</combo_box>
<check_box bottom_delta="-20" follows="left|top" label="Show interface in snapshot"
left="10" name="ui_check" />
<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" />
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" />
<check_box bottom_delta="-20" follows="left|top" label="Freeze frame (fullscreen preview)"
left="10" name="freeze_frame_check" />
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="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" />
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"
initial_value="false" label="Temporary Image (Free)" left="10"
name="temp_check" tooltip="Sets the asset to be temporary, meaning it's free, but in return, only good for a short time before it ceases to exist." />
name="temp_check" tool_tip="Uploads the texture to the sim instead of the asset server, meaning it's free but only visible in the current sim and deleted when you leave the sim." />
<string name="unknown">
unknown
</string>

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
can_minimize="false"
title="Post to My Profile Feed"
height="380"
width="370"
layout="topleft"
name="floater_snapshot_profile"
rect_control="FloaterSnapshotFeedRect">
<text_editor
follows="bottom|left"
bottom="40"
hide_scrollbar="true"
length="1"
max_length="700"
name="caption"
top="-180"
left="10"
right="-10"
type="string"
word_wrap="true"/>
<check_box
follows="left|bottom"
initial_value="true"
label="Include location"
layout="topleft"
left_delta="0"
name="add_location_cb"
control_name="SnapshotFeedAddLocation"
bottom_delta="-25" />
<button
follows="right|bottom"
height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
right="-10"
bottom="10"
width="100"/>
<button
follows="right|bottom"
height="23"
label="Post"
layout="topleft"
left_delta="-106"
name="post_btn"
bottom_delta="0"
width="100"/>
</floater>

View File

@@ -264,6 +264,22 @@ An error occurred while updating [APP_NAME]. Please download the latest version
yestext="Ok"/>
</notification>
<notification
icon="alertmodal.tga"
name="EmptyFirstNameMessage"
type="alertmodal">
[GRIDNAME] requires a non-empty first name to login.
Please try again.
</notification>
<notification
icon="alertmodal.tga"
name="EmptyLastNameMessage"
type="alertmodal">
[GRIDNAME] requires a non-empty last name to login.
Please try again.
</notification>
<notification
icon="alertmodal.tga"
name="LoginFailedNoNetwork"
@@ -309,9 +325,9 @@ You don't have permission to copy one or more of these items to the Merchant Out
</notification>
<notification
icon="OutboxStatus_Success"
icon="alert.tga"
name="OutboxFolderCreated"
type="outbox">
type="alert">
<unique/>
A new folder has been created for each item you have transferred into the top level of your Merchant Outbox.
@@ -322,9 +338,9 @@ A new folder has been created for each item you have transferred into the top le
</notification>
<notification
icon="OutboxStatus_Success"
icon="alert.tga"
name="OutboxImportComplete"
type="outbox">
type="alert">
Success
All folders were successfully sent to the Marketplace.
@@ -336,9 +352,9 @@ All folders were successfully sent to the Marketplace.
</notification>
<notification
icon="OutboxStatus_Warning"
icon="alert.tga"
name="OutboxImportHadErrors"
type="outbox">
type="alert">
Some folders did not transfer
Errors occurred when some folders were sent to the Marketplace. Those folders are still in your Merchant Outbox.
@@ -351,9 +367,9 @@ See the [[MARKETPLACE_IMPORTS_URL] error log] for more information.
</notification>
<notification
icon="OutboxStatus_Error"
icon="alertmodal.tga"
name="OutboxImportFailed"
type="outbox">
type="alertmodal">
Transfer failed
No folders were sent to the Marketplace because of a system or network error. Try again later.
@@ -364,9 +380,9 @@ No folders were sent to the Marketplace because of a system or network error. T
</notification>
<notification
icon="OutboxStatus_Error"
icon="alertmodal.tga"
name="OutboxInitFailed"
type="outbox">
type="alertmodal">
Marketplace initialization failed
Initialization with the Marketplace failed because of a system or network error. Try again later.
@@ -405,6 +421,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"
@@ -937,6 +960,14 @@ Error processing snapshot data
Error encoding snapshot.
</notification>
<notification
icon="alertmodal.tga"
name="ErrorSizeAspectSnapshot"
type="alertmodal">
It is not possible to make a snapshot with this size and aspect.
Try a smaller size or a less stretched aspect.
</notification>
<notification
icon="alertmodal.tga"
name="ErrorUploadingPostcard"

View File

@@ -196,6 +196,7 @@
<string name="AvatarAway">Away</string>
<string name="AvatarBusy">Busy</string>
<string name="AvatarMuted">Muted</string>
<string name="AvatarLangolier">Langolier</string>
<!-- animations -->
<string name="anim_express_afraid">Afraid</string>

View File

@@ -163,14 +163,14 @@ Asegurate que tu conexión a internet funciona correctamente.
<usetemplate name="okcancelbuttons" notext="No mover ítem(s)" yestext="Mover ítem(s)"/>
</notification>
<notification name="OutboxFolderCreated" type="outbox">
<notification name="OutboxFolderCreated" type="alert">
<unique/>
Una nueva carpeta ha sido creada por cada ítem que has transferido en el nivel superior de tu Merchant Outbox.
<usetemplate ignoretext="Una nueva carpeta ha sido creada en el Merchant Outbox" name="okignore" yestext="OK"/>
</notification>
<notification name="OutboxImportComplete" type="outbox">
<notification name="OutboxImportComplete" type="alert">
Completado
Todas las carpetas ha sido enviadas satisfactoriamente al Marketplace.
@@ -178,7 +178,7 @@ Todas las carpetas ha sido enviadas satisfactoriamente al Marketplace.
<usetemplate ignoretext="Todas las carpetas se han enviado al Marketplace" name="okignore" yestext="OK"/>
</notification>
<notification name="OutboxImportHadErrors" type="outbox">
<notification name="OutboxImportHadErrors" type="alert">
Algunas carpetas no fueron transferidas
Ha habido errores al enviar algunas carpetas al Markeplace. Estas carpetas aún están en tu Merchant Outbox.
@@ -188,7 +188,7 @@ Mira en el [log de errores [[MARKETPLACE_IMPORTS_URL]] para mayor información.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="OutboxImportFailed" type="outbox">
<notification name="OutboxImportFailed" type="alertmodal">
La transferencia ha fallado
No se han enviado carpetas al Marketplace debido a un error de sistema o de red. Inténtalo nuevamente más tarde.
@@ -196,7 +196,7 @@ No se han enviado carpetas al Marketplace debido a un error de sistema o de red.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="OutboxInitFailed" type="outbox">
<notification name="OutboxInitFailed" type="alertmodal">
Ha fallado la inicialización del Marketplace
La inicialización con el Marketplace ha fallado debido a un error de sistema o de red. Inténtalo nuevamente más tarde.

View File

@@ -869,16 +869,16 @@ class Linux_x86_64Manifest(LinuxManifest):
self.end_prefix("lib64")
# Vivox runtimes and libs
if self.prefix(src="vivox-runtime/i686-linux", dst="bin"):
self.path("SLVoice")
self.end_prefix("bin")
# Vivox runtimes and libs
if self.prefix(src="vivox-runtime/i686-linux", dst="bin"):
self.path("SLVoice")
self.end_prefix("bin")
if self.prefix(src="vivox-runtime/i686-linux", dst="lib32"):
#self.path("libalut.so")
self.path("libortp.so")
self.path("libvivoxsdk.so")
self.end_prefix("lib32")
if self.prefix(src="vivox-runtime/i686-linux", dst="lib32"):
#self.path("libalut.so")
self.path("libortp.so")
self.path("libvivoxsdk.so")
self.end_prefix("lib32")
# 32bit libs needed for voice
if self.prefix("../../libraries/x86_64-linux/lib/release/32bit-compat", dst="lib32"):