summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llui/llfloater.cpp21
-rw-r--r--indra/llui/llfloater.h2
-rw-r--r--indra/llui/llresizehandle.cpp12
-rw-r--r--indra/llui/llresizehandle.h7
-rw-r--r--indra/newview/CMakeLists.txt2
-rw-r--r--indra/newview/app_settings/commands.xml4
-rwxr-xr-xindra/newview/llagent.cpp38
-rw-r--r--indra/newview/llagent.h16
-rw-r--r--indra/newview/llbottomtray.cpp3
-rw-r--r--indra/newview/llcallfloater.cpp19
-rw-r--r--indra/newview/llcallfloater.h2
-rw-r--r--indra/newview/llfloateravatar.cpp54
-rw-r--r--indra/newview/llfloateravatar.h43
-rw-r--r--indra/newview/llfloaterdestinations.cpp1
-rw-r--r--indra/newview/llnearbychatbar.cpp7
-rw-r--r--indra/newview/llviewerfloaterreg.cpp3
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_destinations.xml5
18 files changed, 189 insertions, 56 deletions
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index cba14e21c3..90c41e99dc 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -459,15 +459,24 @@ void LLFloater::layoutResizeCtrls()
mResizeHandle[3]->setRect(rect);
}
-void LLFloater::enableResizeCtrls(bool enable)
+void LLFloater::enableResizeCtrls(bool enable, bool width, bool height)
{
+ mResizeBar[LLResizeBar::LEFT]->setVisible(enable && width);
+ mResizeBar[LLResizeBar::LEFT]->setEnabled(enable && width);
+
+ mResizeBar[LLResizeBar::TOP]->setVisible(enable && height);
+ mResizeBar[LLResizeBar::TOP]->setEnabled(enable && height);
+
+ mResizeBar[LLResizeBar::RIGHT]->setVisible(enable && width);
+ mResizeBar[LLResizeBar::RIGHT]->setEnabled(enable && width);
+
+ mResizeBar[LLResizeBar::BOTTOM]->setVisible(enable && height);
+ mResizeBar[LLResizeBar::BOTTOM]->setEnabled(enable && height);
+
for (S32 i = 0; i < 4; ++i)
{
- mResizeBar[i]->setVisible(enable);
- mResizeBar[i]->setEnabled(enable);
-
- mResizeHandle[i]->setVisible(enable);
- mResizeHandle[i]->setEnabled(enable);
+ mResizeHandle[i]->setVisible(enable && width && height);
+ mResizeHandle[i]->setEnabled(enable && width && height);
}
}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 5aff542049..af9665e599 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -291,6 +291,7 @@ public:
void updateTransparency(ETypeTransparency transparency_type);
+ void enableResizeCtrls(bool enable, bool width = true, bool height = true);
protected:
virtual void applySavedVariables();
@@ -340,7 +341,6 @@ private:
BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
void addResizeCtrls();
void layoutResizeCtrls();
- void enableResizeCtrls(bool enable);
void addDragHandle();
void layoutDragHandle(); // repair layout
diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp
index 942e84eeb6..c3a51c36c9 100644
--- a/indra/llui/llresizehandle.cpp
+++ b/indra/llui/llresizehandle.cpp
@@ -55,8 +55,6 @@ LLResizeHandle::LLResizeHandle(const LLResizeHandle::Params& p)
mImage( NULL ),
mMinWidth( p.min_width ),
mMinHeight( p.min_height ),
- mMaxWidth(S32_MAX),
- mMaxHeight(S32_MAX),
mCorner( p.corner )
{
if( RIGHT_BOTTOM == mCorner)
@@ -179,11 +177,6 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)
new_width = mMinWidth;
delta_x = x_multiple * (mMinWidth - orig_rect.getWidth());
}
- else if (new_width > mMaxWidth)
- {
- new_width = mMaxWidth;
- delta_x = x_multiple * (mMaxWidth - orig_rect.getWidth());
- }
S32 new_height = orig_rect.getHeight() + y_multiple * delta_y;
if( new_height < mMinHeight )
@@ -191,11 +184,6 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)
new_height = mMinHeight;
delta_y = y_multiple * (mMinHeight - orig_rect.getHeight());
}
- else if (new_height > mMaxHeight)
- {
- new_height = mMaxHeight;
- delta_y = y_multiple * (mMaxHeight - orig_rect.getHeight());
- }
switch( mCorner )
{
diff --git a/indra/llui/llresizehandle.h b/indra/llui/llresizehandle.h
index 5cfe3fb63c..7541b9e6c0 100644
--- a/indra/llui/llresizehandle.h
+++ b/indra/llui/llresizehandle.h
@@ -55,10 +55,7 @@ public:
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
void setResizeLimits( S32 min_width, S32 min_height ) { mMinWidth = min_width; mMinHeight = min_height; }
-
- void setMaxWidth(S32 width) { mMaxWidth = width;}
- void setMaxHeight(S32 height) { mMaxHeight = height;}
-
+
private:
BOOL pointInHandle( S32 x, S32 y );
@@ -69,9 +66,7 @@ private:
LLCoordGL mLastMouseDir;
LLPointer<LLUIImage> mImage;
S32 mMinWidth;
- S32 mMaxWidth;
S32 mMinHeight;
- S32 mMaxHeight;
const ECorner mCorner;
};
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 941cb6b9f9..97ccfeac29 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -168,6 +168,7 @@ set(viewer_SOURCE_FILES
llfloaterabout.cpp
llfloateranimpreview.cpp
llfloaterauction.cpp
+ llfloateravatar.cpp
llfloateravatarpicker.cpp
llfloateravatartextures.cpp
llfloaterbeacons.cpp
@@ -733,6 +734,7 @@ set(viewer_HEADER_FILES
llfloaterabout.h
llfloateranimpreview.h
llfloaterauction.h
+ llfloateravatar.h
llfloateravatarpicker.h
llfloateravatartextures.h
llfloaterbeacons.h
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index f5581baa19..881bc22144 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -217,11 +217,11 @@
icon="Command_Speak_Icon"
label_ref="Command_Speak_Label"
tooltip_ref="Command_Speak_Tooltip"
- execute_function="Floater.ToolbarToggle"
+ execute_function="Agent.ToggleMicrophone"
execute_parameters="speak"
is_enabled_function="Agent.IsActionAllowed"
is_enabled_parameters="speak"
- is_running_function="Floater.IsOpen"
+ is_running_function="Agent.IsMicrophoneOn"
is_running_parameters="speak"
/>
<command name="view"
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index ed29ac7960..8303a5942d 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -174,12 +174,43 @@ bool LLAgent::isActionAllowed(const LLSD& sdname)
}
else if (param == "speak")
{
- retval = true;
+ if ( gAgent.isVoiceConnected() )
+ {
+ retval = true;
+ }
+ else
+ {
+ retval = false;
+ }
}
return retval;
}
+// static
+void LLAgent::toggleMicrophone(const LLSD& name)
+{
+ gAgent.mMicrophoneOn = ! gAgent.mMicrophoneOn;
+
+ if ( gAgent.mMicrophoneOn )
+ {
+ LLFirstUse::speak(false);
+
+ LLVoiceClient::getInstance()->inputUserControlState(true);
+ LLVoiceClient::getInstance()->inputUserControlState(false);
+ }
+ else
+ {
+ LLVoiceClient::getInstance()->inputUserControlState(false);
+ LLVoiceClient::getInstance()->inputUserControlState(true);
+ }
+}
+
+// static
+bool LLAgent::isMicrophoneOn(const LLSD& sdname)
+{
+ return gAgent.mMicrophoneOn;
+}
// ************************************************************
// Enabled this definition to compile a 'hacked' viewer that
@@ -261,6 +292,9 @@ LLAgent::LLAgent() :
mCurrentFidget(0),
mFirstLogin(FALSE),
mGenderChosen(FALSE),
+
+ mVoiceConnected(false),
+ mMicrophoneOn(false),
mAppearanceSerialNum(0),
@@ -280,6 +314,8 @@ LLAgent::LLAgent() :
LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback));
LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsActionAllowed", boost::bind(&LLAgent::isActionAllowed, _2));
+ LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Agent.ToggleMicrophone", boost::bind(&LLAgent::toggleMicrophone, _2));
+ LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Agent.IsMicrophoneOn", boost::bind(&LLAgent::isMicrophoneOn, _2));
}
// Requires gSavedSettings to be initialized.
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 1775a0235c..0355e68b6e 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -282,7 +282,21 @@ public:
static void toggleFlying();
static bool enableFlying();
BOOL canFly(); // Does this parcel allow you to fly?
-
+
+ //--------------------------------------------------------------------
+ // Voice
+ //--------------------------------------------------------------------
+public:
+ bool isVoiceConnected() const { return mVoiceConnected; }
+ void setVoiceConnected(const bool b) { mVoiceConnected = b; }
+
+ static void toggleMicrophone(const LLSD& name);
+ static bool isMicrophoneOn(const LLSD& sdname);
+
+private:
+ bool mVoiceConnected;
+ bool mMicrophoneOn;
+
//--------------------------------------------------------------------
// Chat
//--------------------------------------------------------------------
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 98712f1334..af91702f9b 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -387,6 +387,9 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b
if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
{
bool voice_status = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
+
+ gAgent.setVoiceConnected(voice_status);
+
getChild<LLButton>("speak_flyout_btn")->setEnabled(voice_status);
gMenuBarView->getChild<LLView>("Nearby Voice")->setEnabled(voice_status);
if (voice_status)
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index 945a760d05..4c6ddc8be7 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -44,7 +44,6 @@
#include "llparticipantlist.h"
#include "llspeakers.h"
#include "lltextutil.h"
-#include "lltransientfloatermgr.h"
#include "llviewercontrol.h"
#include "llviewerdisplayname.h"
#include "llviewerwindow.h"
@@ -97,7 +96,7 @@ static void* create_non_avatar_caller(void*)
LLVoiceChannel* LLCallFloater::sCurrentVoiceChannel = NULL;
LLCallFloater::LLCallFloater(const LLSD& key)
-: LLTransientDockableFloater(NULL, false, key)
+: LLFloater(key)
, mSpeakerManager(NULL)
, mParticipants(NULL)
, mAvatarList(NULL)
@@ -113,10 +112,6 @@ LLCallFloater::LLCallFloater(const LLSD& key)
mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
LLVoiceClient::instance().addObserver(this);
- LLTransientFloaterMgr::getInstance()->addControlView(this);
-
- // force docked state since this floater doesn't save it between recreations
- setDocked(true);
// update the agent's name if display name setting change
LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this));
@@ -139,13 +134,11 @@ LLCallFloater::~LLCallFloater()
{
LLVoiceClient::getInstance()->removeObserver(this);
}
- LLTransientFloaterMgr::getInstance()->removeControlView(this);
}
// virtual
BOOL LLCallFloater::postBuild()
{
- LLTransientDockableFloater::postBuild();
mAvatarList = getChild<LLAvatarList>("speakers_list");
mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLCallFloater::onAvatarListRefreshed, this));
@@ -154,12 +147,6 @@ BOOL LLCallFloater::postBuild()
mNonAvatarCaller = findChild<LLNonAvatarCaller>("non_avatar_caller");
mNonAvatarCaller->setVisible(FALSE);
- LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn");
-
- setDockControl(new LLDockControl(
- anchor_panel, this,
- getDockTongue(), LLDockControl::TOP));
-
initAgentData();
connectToChannel(LLVoiceChannel::getCurrentVoiceChannel());
@@ -204,13 +191,13 @@ void LLCallFloater::draw()
if (mParticipants)
mParticipants->updateRecentSpeakersOrder();
- LLTransientDockableFloater::draw();
+ LLFloater::draw();
}
// virtual
void LLCallFloater::setFocus( BOOL b )
{
- LLTransientDockableFloater::setFocus(b);
+ LLFloater::setFocus(b);
// Force using active floater transparency (STORM-730).
// We have to override setFocus() for LLCallFloater because selecting an item
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index 00a3f76e56..ea78cd53b7 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -52,7 +52,7 @@ class LLSpeakersDelayActionsStorage;
* When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel
* also provides a 'Leave Call' button to allow the Resident to leave that voice channel.
*/
-class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipantObserver
+class LLCallFloater : public LLFloater, LLVoiceClientParticipantObserver
{
public:
diff --git a/indra/newview/llfloateravatar.cpp b/indra/newview/llfloateravatar.cpp
new file mode 100644
index 0000000000..bdc5b581a9
--- /dev/null
+++ b/indra/newview/llfloateravatar.cpp
@@ -0,0 +1,54 @@
+/**
+ * @file llfloateravatar.h
+ * @author Leyla Farazha
+ * @brief floater for the avatar changer
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+/**
+ * Floater that appears when buying an object, giving a preview
+ * of its contents and their permissions.
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloateravatar.h"
+#include "lluictrlfactory.h"
+
+
+LLFloaterAvatar::LLFloaterAvatar(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+LLFloaterAvatar::~LLFloaterAvatar()
+{
+}
+
+BOOL LLFloaterAvatar::postBuild()
+{
+ enableResizeCtrls(true, true, false);
+ return TRUE;
+}
+
+
diff --git a/indra/newview/llfloateravatar.h b/indra/newview/llfloateravatar.h
new file mode 100644
index 0000000000..cadc5e4028
--- /dev/null
+++ b/indra/newview/llfloateravatar.h
@@ -0,0 +1,43 @@
+/**
+ * @file llfloateravatar.h
+ * @author Leyla Farazha
+ * @brief floater for the avatar changer
+ *
+ * $LicenseInfo:firstyear=2011&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2011, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_FLOATER_AVATAR_H
+#define LL_FLOATER_AVATAR_H
+
+#include "llfloater.h"
+
+class LLFloaterAvatar:
+ public LLFloater
+{
+ friend class LLFloaterReg;
+private:
+ LLFloaterAvatar(const LLSD& key);
+ /*virtual*/ ~LLFloaterAvatar();
+ /*virtual*/ BOOL postBuild();
+};
+
+#endif
diff --git a/indra/newview/llfloaterdestinations.cpp b/indra/newview/llfloaterdestinations.cpp
index 52d1f67c36..af21cb593f 100644
--- a/indra/newview/llfloaterdestinations.cpp
+++ b/indra/newview/llfloaterdestinations.cpp
@@ -47,6 +47,7 @@ LLFloaterDestinations::~LLFloaterDestinations()
BOOL LLFloaterDestinations::postBuild()
{
+ enableResizeCtrls(true, true, false);
return TRUE;
}
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index cba4fafe42..caa20b767c 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -452,6 +452,8 @@ BOOL LLNearbyChatBar::postBuild()
mExpandedHeight = getMinHeight() + EXPANDED_HEIGHT;
+ enableResizeCtrls(true, true, false);
+
return TRUE;
}
@@ -462,6 +464,7 @@ void LLNearbyChatBar::applyRectControl()
{
getChildView("nearby_chat")->setVisible(true);
mExpandedHeight = getRect().getHeight();
+ enableResizeCtrls(true);
}
}
@@ -707,13 +710,13 @@ void LLNearbyChatBar::onToggleNearbyChatPanel()
mExpandedHeight = getRect().getHeight();
nearby_chat->setVisible(FALSE);
reshape(getRect().getWidth(), getMinHeight());
- mResizeHandle[0]->setMaxHeight(getMinHeight());
+ enableResizeCtrls(true, true, false);
}
else
{
nearby_chat->setVisible(TRUE);
reshape(getRect().getWidth(), mExpandedHeight);
- mResizeHandle[0]->setMaxHeight(S32_MAX);
+ enableResizeCtrls(true);
}
}
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index b0daf9f3c2..619d74e7ac 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -37,6 +37,7 @@
#include "llfloaterabout.h"
#include "llfloateranimpreview.h"
#include "llfloaterauction.h"
+#include "llfloateravatar.h"
#include "llfloateravatarpicker.h"
#include "llfloateravatartextures.h"
#include "llfloaterbeacons.h"
@@ -168,7 +169,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);
LLFloaterReg::add("appearance", "floater_my_appearance.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
- LLFloaterReg::add("avatar", "floater_avatar.xml", &LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("avatar", "floater_avatar.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatar>);
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>);
diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml
index a0c1f4c021..666aa2d164 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar.xml
@@ -3,11 +3,9 @@
legacy_header_height="225"
can_minimize="true"
can_close="true"
- user_resize="true"
can_resize="true"
min_height="230"
- min_width="455"
- max_height="230"
+ min_width="445"
height="230"
layout="topleft"
name="Avatar"
@@ -19,7 +17,7 @@
<web_browser
top="25"
height="200"
- width="435"
+ width="445"
follows="all"
name="avatar_picker_contents"
trusted_content="true"/>
diff --git a/indra/newview/skins/default/xui/en/floater_destinations.xml b/indra/newview/skins/default/xui/en/floater_destinations.xml
index 9dd9338f37..669b7eb15a 100644
--- a/indra/newview/skins/default/xui/en/floater_destinations.xml
+++ b/indra/newview/skins/default/xui/en/floater_destinations.xml
@@ -7,7 +7,6 @@
can_resize="true"
min_height="230"
min_width="525"
- max_height="230"
height="230"
layout="topleft"
name="Destinations"
@@ -15,11 +14,11 @@
help_topic="destinations"
save_rect="true"
title="Destinations"
- width="445">
+ width="525">
<web_browser
top="25"
height="200"
- width="435"
+ width="525"
follows="all"
name="destination_guide_contents"
start_url="http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/agni/guide.html"