svn merge -r 82272:82277 svn+ssh://svn.lindenlab.com/svn/linden/branches/maint-ui-9-merge-2 --> release

QAR-364 - merge of maint-ui-9
master
Josh Bell 2008-03-14 19:27:38 +00:00
parent a1cde743e7
commit 133a7b5fe2
21 changed files with 464 additions and 175 deletions

View File

@ -119,6 +119,7 @@ Gigs Taggart
VWR-234
VWR-315
VWR-326
VWR-442
VWR-493
VWR-1203
VWR-1217

View File

@ -0,0 +1,50 @@
/**
* @file llsmoothstep.h
* @brief Smoothstep - transition from 0 to 1 - function, first and second derivatives all continuous (smooth)
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
* Copyright (c) 2001-2007, Linden Research, Inc.
*
* 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://secondlife.com/developers/opensource/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://secondlife.com/developers/opensource/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_LLSMOOTHSTEP_H
#define LL_LLSMOOTHSTEP_H
template <class LLDATATYPE>
inline LLDATATYPE llsmoothstep(const LLDATATYPE& edge0, const LLDATATYPE& edge1, const LLDATATYPE& value)
{
if (value < edge0)
return (LLDATATYPE)0;
if (value >= edge1)
return (LLDATATYPE)1;
// Scale/bias into [0..1] range
LLDATATYPE scaled_value = (value - edge0) / (edge1 - edge0);
return scaled_value * scaled_value * (3 - 2 * scaled_value);
}
#endif // LL_LLSMOOTHSTEP_H

View File

@ -185,6 +185,8 @@ public:
// Defaults to destroy().
virtual void onClose(bool app_quitting) { destroy(); }
// This cannot be "const" until all derived floater canClose()
// methods are const as well. JC
virtual BOOL canClose() { return TRUE; }
virtual void setVisible(BOOL visible);

View File

@ -104,9 +104,8 @@ the Beta release of the Linux client.
stability. See PROBLEM 3 in the TROUBLESHOOTING section if you wish to
turn these on to possibly enhance your experience.
* MISC - The following features are known to not yet be fully operational on
the Linux client:
* Movie recording (soon to be deprecated)
* MISC - The following features are not currently fully implemented on the
Linux client and are therefore known not to work properly:
* Full Unicode font rendering
* UPLOAD / SAVE / COLOR-PICKER DIALOGS - These only appear when the client

View File

@ -51,6 +51,7 @@
#include "llquaternion.h"
#include "v3math.h"
#include "v4math.h"
#include "llsmoothstep.h"
#include "llsdutil.h"
//#include "vmath.h"
@ -176,6 +177,8 @@ const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f;
const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f;
const F32 MAX_CAMERA_SMOOTH_DISTANCE = 20.0f;
const F32 HEAD_BUFFER_SIZE = 0.3f;
const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.2f;
@ -272,6 +275,13 @@ void LLAgentFriendObserver::changed(U32 mask)
LLAgent::LLAgent()
: mViewerPort(NET_USE_OS_ASSIGNED_PORT),
mDrawDistance( DEFAULT_FAR_PLANE ),
mDoubleTapRunTimer(),
mDoubleTapRunMode(DOUBLETAP_NONE),
mbAlwaysRun(false),
mbRunning(false),
mAccess(SIM_ACCESS_PG),
mGroupPowers(0),
mGroupID(),
@ -303,7 +313,6 @@ LLAgent::LLAgent()
mLastCameraMode( CAMERA_MODE_THIRD_PERSON ),
mViewsPushed(FALSE),
mbAlwaysRun(FALSE),
mShowAvatar(TRUE),
mCameraAnimating( FALSE ),
@ -329,6 +338,8 @@ LLAgent::LLAgent()
mFocusObjectOffset(),
mFocusDotRadius( 0.1f ), // meters
mTrackFocusObject(TRUE),
mCameraSmoothingLastPositionGlobal(),
mCameraSmoothingLastPositionAgent(),
mFrameAgent(),
@ -3185,8 +3196,9 @@ void LLAgent::updateCamera()
}
// ...adjust position for animation
camera_pos_global = lerp(mAnimationCameraStartGlobal, camera_target_global, fraction_of_animation);
mFocusGlobal = lerp(mAnimationFocusStartGlobal, focus_target_global, fraction_of_animation);
F32 smooth_fraction_of_animation = llsmoothstep(0.0f, 1.0f, fraction_of_animation);
camera_pos_global = lerp(mAnimationCameraStartGlobal, camera_target_global, smooth_fraction_of_animation);
mFocusGlobal = lerp(mAnimationFocusStartGlobal, focus_target_global, smooth_fraction_of_animation);
}
else
{
@ -3205,13 +3217,52 @@ void LLAgent::updateCamera()
getAvatarObject()->updateAttachmentVisibility(mCameraMode);
}
}
else
else
{
camera_pos_global = camera_target_global;
mFocusGlobal = focus_target_global;
mShowAvatar = TRUE;
}
// smoothing
if (TRUE)
{
LLVector3d agent_pos = getPositionGlobal();
LLVector3d camera_pos_agent = camera_pos_global - agent_pos;
if (cameraThirdPerson()) // only smooth in third person mode
{
F32 smoothing = llclampf(1.f - pow(2.f, -4.f * gSavedSettings.getF32("CameraPositionSmoothing") / gFPSClamped));
// we use average FPS instead of LLCriticalDamp b/c exact frame time is jittery
if (!mFocusObject) // we differentiate on avatar mode
{
// for avatar-relative focus, we smooth in avatar space -
// the avatar moves too jerkily w/r/t global space to smooth there.
LLVector3d delta = camera_pos_agent - mCameraSmoothingLastPositionAgent;
if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please
{
camera_pos_agent = lerp(camera_pos_agent, mCameraSmoothingLastPositionAgent, smoothing);
camera_pos_global = camera_pos_agent + agent_pos;
}
}
else
{
LLVector3d delta = camera_pos_global - mCameraSmoothingLastPositionGlobal;
if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please
{
camera_pos_global = lerp(camera_pos_global, mCameraSmoothingLastPositionGlobal, smoothing);
}
}
}
mCameraSmoothingLastPositionGlobal = camera_pos_global;
mCameraSmoothingLastPositionAgent = camera_pos_agent;
}
mCameraCurrentFOVZoomFactor = lerp(mCameraCurrentFOVZoomFactor, mCameraFOVZoomFactor, LLCriticalDamp::getInterpolant(FOV_ZOOM_HALF_LIFE));
// llinfos << "Current FOV Zoom: " << mCameraCurrentFOVZoomFactor << " Target FOV Zoom: " << mCameraFOVZoomFactor << " Object penetration: " << mFocusObjectDist << llendl;
@ -4990,6 +5041,20 @@ void LLAgent::sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request)
sendReliableMessage();
}
void LLAgent::sendWalkRun(bool running)
{
LLMessageSystem* msgsys = gMessageSystem;
if (msgsys)
{
msgsys->newMessageFast(_PREHASH_SetAlwaysRun);
msgsys->nextBlockFast(_PREHASH_AgentData);
msgsys->addUUIDFast(_PREHASH_AgentID, getID());
msgsys->addUUIDFast(_PREHASH_SessionID, getSessionID());
msgsys->addBOOLFast(_PREHASH_AlwaysRun, BOOL(running) );
sendReliableMessage();
}
}
void LLAgent::friendsChanged()
{
LLCollectProxyBuddies collector;

View File

@ -201,16 +201,17 @@ public:
void heardChat(const LLUUID& id);
void lookAtLastChat();
LLUUID getLastChatter() { return mLastChatterID; }
F32 getTypingTime() { return mTypingTimer.getElapsedTimeF32(); }
F32 getTypingTime() { return mTypingTimer.getElapsedTimeF32(); }
void setAFK();
void clearAFK();
BOOL getAFK() const;
void setAlwaysRun() { mbAlwaysRun = TRUE; }
void clearAlwaysRun() { mbAlwaysRun = FALSE; }
BOOL getAlwaysRun() const { return mbAlwaysRun; }
void setAlwaysRun() { mbAlwaysRun = true; }
void clearAlwaysRun() { mbAlwaysRun = false; }
void setRunning() { mbRunning = true; }
void clearRunning() { mbRunning = false; }
void setBusy();
void clearBusy();
@ -220,8 +221,7 @@ public:
void setGodLevel(U8 god_level) { mGodLevel = god_level; }
void setFirstLogin(BOOL b) { mFirstLogin = b; }
void setGenderChosen(BOOL b) { mGenderChosen = b; }
BOOL getAdminOverride() const { return mAdminOverride; }
// update internal datastructures and update the server with the
// new contribution level. Returns true if the group id was found
// and contribution could be set.
@ -255,6 +255,11 @@ public:
F32 getFocusObjectDist() const { return mFocusObjectDist; }
BOOL inPrelude();
BOOL canManageEstate() const;
BOOL getAdminOverride() const { return mAdminOverride; }
LLUUID getLastChatter() const { return mLastChatterID; }
bool getAlwaysRun() const { return mbAlwaysRun; }
bool getRunning() const { return mbRunning; }
const LLUUID& getInventoryRootID() const { return mInventoryRootID; }
@ -535,6 +540,15 @@ public:
F32 getNearChatRadius() { return mNearChatRadius; }
enum EDoubleTapRunMode
{
DOUBLETAP_NONE,
DOUBLETAP_FORWARD,
DOUBLETAP_BACKWARD,
DOUBLETAP_SLIDELEFT,
DOUBLETAP_SLIDERIGHT
};
enum ETeleportState
{
TELEPORT_NONE = 0, // No teleport in progress
@ -637,6 +651,8 @@ public:
BOOL areWearablesLoaded() { return mWearablesLoaded; }
void sendWalkRun(bool running);
void observeFriends();
void friendsChanged();
@ -709,7 +725,13 @@ public:
static std::map<LLString, LLString> sTeleportErrorMessages;
static std::map<LLString, LLString> sTeleportProgressMessages;
LLFrameTimer mDoubleTapRunTimer;
EDoubleTapRunMode mDoubleTapRunMode;
private:
bool mbAlwaysRun; // should the avatar run by default rather than walk
bool mbRunning; // is the avatar trying to run right now
// Access or "maturity" level
U8 mAccess; // SIM_ACCESS_MATURE or SIM_ACCESS_PG
ETeleportState mTeleportState;
@ -738,7 +760,6 @@ private:
BOOL mViewsPushed; // keep track of whether or not we have pushed views.
BOOL mCustomAnim ; //current animation is ANIM_AGENT_CUSTOMIZE ?
BOOL mbAlwaysRun; // should the avatar run rather than walk
BOOL mShowAvatar; // should we render the avatar?
BOOL mCameraAnimating; // camera is transitioning from one mode to another
LLVector3d mAnimationCameraStartGlobal; // camera start position, global coords
@ -762,7 +783,9 @@ private:
BOOL mSitCameraEnabled; // use provided camera information when sitting?
LLVector3 mSitCameraPos; // root relative camera pos when sitting
LLVector3 mSitCameraFocus; // root relative camera target when sitting
LLVector3d mCameraSmoothingLastPositionGlobal;
LLVector3d mCameraSmoothingLastPositionAgent;
//Ventrella
LLVector3 mCameraUpVector; // camera's up direction in world coordinates (determines the 'roll' of the view)
//End Ventrella

View File

@ -187,6 +187,7 @@ public:
virtual void draw();
virtual BOOL canClose();
virtual void onClose(bool app_quitting);
/*virtual*/ void setMinimized(BOOL b);
private:
class SelectionObserver : public LLParcelObserver
@ -968,9 +969,27 @@ void LLFloaterBuyLandUI::draw()
}
}
// virtual
BOOL LLFloaterBuyLandUI::canClose()
{
return (mTransaction ? FALSE : TRUE) && mCurrency.canCancel();
bool can_close = (mTransaction ? FALSE : TRUE) && mCurrency.canCancel();
if (!can_close)
{
// explain to user why they can't do this, see DEV-9605
gViewerWindow->alertXml("CannotCloseFloaterBuyLand");
}
return can_close;
}
// virtual
void LLFloaterBuyLandUI::setMinimized(BOOL minimize)
{
bool restored = (isMinimized() && !minimize);
LLFloater::setMinimized(minimize);
if (restored)
{
refreshUI();
}
}
void LLFloaterBuyLandUI::onClose(bool app_quitting)

View File

@ -39,11 +39,9 @@
// Viewer includes
#include "llagent.h"
#include "llviewercontrol.h"
#include "llfontgl.h"
#include "llbutton.h"
#include "llviewerwindow.h"
#include "lljoystickbutton.h"
#include "llresmgr.h"
#include "llvieweruictrlfactory.h"
//
@ -54,8 +52,6 @@ const F32 MOVE_BUTTON_DELAY = 0.0f;
const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed
const F32 NUDGE_TIME = 0.25f; // in seconds
const char *MOVE_TITLE = "";
//
// Global statics
//
@ -69,8 +65,7 @@ LLFloaterMove* LLFloaterMove::sInstance = NULL;
// protected
LLFloaterMove::LLFloaterMove()
: LLFloater("move floater", "FloaterMoveRect", MOVE_TITLE, FALSE, 100, 100, DRAG_ON_TOP,
MINIMIZE_NO)
: LLFloater("move floater")
{
setIsChrome(TRUE);
gUICtrlFactory->buildFloater(this,"floater_moveview.xml");
@ -105,9 +100,6 @@ LLFloaterMove::LLFloaterMove()
mMoveDownButton->setHeldDownDelay(MOVE_BUTTON_DELAY);
mMoveDownButton->setHeldDownCallback( moveDown );
mFlyButton = LLUICtrlFactory::getButtonByName(this, "fly btn");
childSetAction("fly btn",onFlyButtonClicked,NULL);
sInstance = this;
}
@ -168,12 +160,6 @@ BOOL LLFloaterMove::visible(void*)
return (sInstance != NULL);
}
// protected static
void LLFloaterMove::onFlyButtonClicked(void *)
{
gAgent.toggleFlying();
}
// protected static
F32 LLFloaterMove::getYawRate( F32 time )

View File

@ -51,7 +51,7 @@ protected:
public:
/*virtual*/ void onClose(bool app_quitting);
static void onFlyButtonClicked(void* userdata);
static F32 getYawRate(F32 time);
static void show(void*);
@ -72,8 +72,6 @@ protected:
static void moveDown(void* userdata);
public:
LLButton* mFlyButton;
LLJoystickAgentTurn* mForwardButton;
LLJoystickAgentTurn* mBackwardButton;
LLJoystickAgentSlide* mSlideLeftButton;

View File

@ -43,6 +43,7 @@
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
#include "llvieweruictrlfactory.h"
#include "llviewerwindow.h"
class LLPanelGroupInvite::impl
{
@ -65,6 +66,7 @@ public:
static void callbackAddUsers(const std::vector<std::string>& names,
const std::vector<LLUUID>& agent_ids,
void* user_data);
static void inviteOwnerCallback(S32 option, void* userdata);
public:
LLUUID mGroupID;
@ -75,6 +77,8 @@ public:
LLButton *mOKButton;
LLButton *mRemoveButton;
LLTextBox *mGroupName;
LLTextBox *mOwnerWarning;
bool mConfirmedOwnerInvite;
void (*mCloseCallback)(void* data);
@ -82,16 +86,19 @@ public:
};
LLPanelGroupInvite::impl::impl(const LLUUID& group_id)
LLPanelGroupInvite::impl::impl(const LLUUID& group_id):
mGroupID( group_id ),
mLoadingText (),
mInvitees ( NULL ),
mRoleNames( NULL ),
mOKButton ( NULL ),
mRemoveButton( NULL ),
mGroupName( NULL ),
mOwnerWarning ( NULL ),
mConfirmedOwnerInvite( false ),
mCloseCallback( NULL ),
mCloseCallbackUserData( NULL )
{
mGroupID = group_id;
mInvitees = NULL;
mRoleNames = NULL;
mRemoveButton = NULL;
mCloseCallback = NULL;
mCloseCallbackUserData = NULL;
}
LLPanelGroupInvite::impl::~impl()
@ -140,12 +147,23 @@ void LLPanelGroupInvite::impl::submitInvitations()
{
std::map<LLUUID, LLUUID> role_member_pairs;
LLGroupMgrGroupData* gdatap = gGroupMgr->getGroupData(mGroupID);
// Default to everyone role.
LLUUID role_id = LLUUID::null;
if (mRoleNames)
{
role_id = mRoleNames->getCurrentID();
// owner role: display confirmation and wait for callback
if ((role_id == gdatap->mOwnerRole) && (!mConfirmedOwnerInvite))
{
LLString::format_map_t args;
args["[MESSAGE]"] = mOwnerWarning->getText();
gViewerWindow->alertXml("GenericAlertYesCancel", args, inviteOwnerCallback, this);
return; // we'll be called again if user confirms
}
}
//loop over the users
@ -163,6 +181,28 @@ void LLPanelGroupInvite::impl::submitInvitations()
(*mCloseCallback)(mCloseCallbackUserData);
}
//static
void LLPanelGroupInvite::impl::inviteOwnerCallback(S32 option, void* userdata)
{
LLPanelGroupInvite::impl* self = (LLPanelGroupInvite::impl*)userdata;
if (!self) return;
switch(option)
{
case 0:
// user confirmed that they really want a new group owner
self->mConfirmedOwnerInvite = true;
self->submitInvitations();
break;
case 1:
// fall through
default:
break;
}
}
void LLPanelGroupInvite::impl::addRoleNames(LLGroupMgrGroupData* gdatap)
{
LLGroupMgrGroupData::member_list_t::iterator agent_iter =
@ -413,7 +453,7 @@ void LLPanelGroupInvite::update()
void LLPanelGroupInvite::updateLists()
{
LLGroupMgrGroupData* gdatap = gGroupMgr->getGroupData(mImplementation->mGroupID);
BOOL waiting = FALSE;
bool waiting = false;
if (gdatap)
{
@ -426,7 +466,7 @@ void LLPanelGroupInvite::updateLists()
}
else
{
waiting = TRUE;
waiting = true;
}
if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete())
{
@ -442,12 +482,12 @@ void LLPanelGroupInvite::updateLists()
}
else
{
waiting = TRUE;
waiting = true;
}
}
else
{
waiting = TRUE;
waiting = true;
}
if (waiting)
@ -523,6 +563,8 @@ BOOL LLPanelGroupInvite::postBuild()
button->setCallbackUserData(mImplementation);
}
mImplementation->mOwnerWarning = (LLTextBox*)getChildByName("confirm_invite_owner_str", recurse);
update();
return (mImplementation->mRoleNames &&

View File

@ -67,12 +67,10 @@ const S32 ANIMATION_FRAMES = 1; //13;
// XUI:translate
LLProgressView::LLProgressView(const std::string& name, const LLRect &rect)
: LLPanel(name, rect, FALSE),
mMouseDownInActiveArea( false )
: LLPanel(name, rect, FALSE),
mPercentDone( 0.f ),
mMouseDownInActiveArea( false )
{
mPercentDone = 0.f;
mDrawBackground = TRUE;
const S32 CANCEL_BTN_WIDTH = 70;
const S32 CANCEL_BTN_OFFSET = 16;
LLRect r;
@ -218,39 +216,37 @@ void LLProgressView::draw()
}
// Paint bitmap if we've got one
if (mDrawBackground)
glPushMatrix();
if (gStartImageGL)
{
glPushMatrix();
if (gStartImageGL)
LLGLSUIDefault gls_ui;
LLViewerImage::bindTexture(gStartImageGL);
gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f);
F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight;
F32 view_aspect = (F32)width / (F32)height;
// stretch image to maintain aspect ratio
if (image_aspect > view_aspect)
{
LLGLSUIDefault gls_ui;
LLViewerImage::bindTexture(gStartImageGL);
gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f);
F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight;
F32 view_aspect = (F32)width / (F32)height;
// stretch image to maintain aspect ratio
if (image_aspect > view_aspect)
{
glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f);
glScalef(image_aspect / view_aspect, 1.f, 1.f);
}
else
{
glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f);
glScalef(1.f, view_aspect / image_aspect, 1.f);
}
gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() );
gStartImageGL->unbindTexture(0, GL_TEXTURE_2D);
glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f);
glScalef(image_aspect / view_aspect, 1.f, 1.f);
}
else
{
LLGLSNoTexture gls_no_texture;
gGL.color4f(0.f, 0.f, 0.f, 1.f);
gl_rect_2d(getRect());
glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f);
glScalef(1.f, view_aspect / image_aspect, 1.f);
}
glPopMatrix();
gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() );
gStartImageGL->unbindTexture(0, GL_TEXTURE_2D);
}
else
{
LLGLSNoTexture gls_no_texture;
gGL.color4f(0.f, 0.f, 0.f, 1.f);
gl_rect_2d(getRect());
}
glPopMatrix();
// Handle fade-in animation
if (mFadeTimer.getStarted())
{
LLView::draw();
@ -294,31 +290,31 @@ void LLProgressView::draw()
S32 background_box_height = background_box_top - background_box_bottom + 1;
gl_draw_scaled_image_with_border( background_box_left + 2,
background_box_bottom - 2,
16,
16,
background_box_width,
background_box_height,
shadow_imagep,
gColors.getColor( "ColorDropShadow" ) );
background_box_bottom - 2,
16,
16,
background_box_width,
background_box_height,
shadow_imagep,
gColors.getColor( "ColorDropShadow" ) );
gl_draw_scaled_image_with_border( background_box_left,
background_box_bottom,
16,
16,
background_box_width,
background_box_height,
bar_imagep,
LLColor4( 0.0f, 0.0f, 0.0f, 0.5f ) );
background_box_bottom,
16,
16,
background_box_width,
background_box_height,
bar_imagep,
LLColor4( 0.0f, 0.0f, 0.0f, 0.4f ) );
gl_draw_scaled_image_with_border( background_box_left + 1,
background_box_bottom + 1,
16,
16,
background_box_width - 2,
background_box_height - 2,
bar_imagep,
LLColor4( 0.4f, 0.4f, 0.4f, 0.4f ) );
background_box_bottom + 1,
16,
16,
background_box_width - 2,
background_box_height - 2,
bar_imagep,
LLColor4( 0.4f, 0.4f, 0.4f, 0.3f ) );
// we'll need this later for catching a click if it looks like it contains a link
if ( mMessage.find( "http://" ) != std::string::npos )

View File

@ -66,7 +66,6 @@ public:
static void onCancelButtonClicked( void* );
protected:
BOOL mDrawBackground;
F32 mPercentDone;
LLString mText;
LLString mMessage;
@ -75,8 +74,8 @@ protected:
LLFrameTimer mProgressTimer;
LLRect mOutlineRect;
bool mMouseDownInActiveArea;
static LLProgressView* sInstance;
static LLProgressView* sInstance;
};
#endif // LL_LLPROGRESSVIEW_H

View File

@ -2253,8 +2253,9 @@ BOOL idle_startup()
else
{
update_texture_fetch();
set_startup_status(0.60f + 0.40f * timeout_frac, "Precaching...",
gAgent.mMOTD.c_str());
set_startup_status(0.60f + 0.40f * timeout_frac,
"Loading world...",
gAgent.mMOTD.c_str());
}
return do_normal_idle;

View File

@ -1465,6 +1465,16 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
// Select the object only if we're editing.
BOOL rez_selected = gToolMgr->inEdit();
LLVector3 ray_start = regionp->getPosRegionFromGlobal(mLastCameraPos);
LLVector3 ray_end = regionp->getPosRegionFromGlobal(mLastHitPos);
// currently the ray's end point is an approximation,
// and is sometimes too short (causing failure.) so we
// double the ray's length:
LLVector3 ray_direction = ray_start - ray_end;
ray_end = ray_end - ray_direction;
// Message packing code should be it's own uninterrupted block
LLMessageSystem* msg = gMessageSystem;
if (mSource == SOURCE_NOTECARD)
@ -1488,8 +1498,8 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
// optimization.
msg->addUUIDFast(_PREHASH_FromTaskID, source_id);
msg->addU8Fast(_PREHASH_BypassRaycast, (U8) bypass_sim_raycast);
msg->addVector3Fast(_PREHASH_RayStart, regionp->getPosRegionFromGlobal(mLastCameraPos));
msg->addVector3Fast(_PREHASH_RayEnd, regionp->getPosRegionFromGlobal(mLastHitPos));
msg->addVector3Fast(_PREHASH_RayStart, ray_start);
msg->addVector3Fast(_PREHASH_RayEnd, ray_end);
msg->addUUIDFast(_PREHASH_RayTargetID, ray_target_id );
msg->addBOOLFast(_PREHASH_RayEndIsIntersection, FALSE);
msg->addBOOLFast(_PREHASH_RezSelected, rez_selected);

View File

@ -88,6 +88,11 @@ private:
// Returns true if handled.
static void regionHandleCallback(U64 handle, const std::string& url,
const LLUUID& snapshot_id, bool teleport);
// Called by LLWorldMap when a location has been resolved to a
// region name
static void regionNameCallback(U64 handle, const std::string& url,
const LLUUID& snapshot_id, bool teleport);
// Called by LLWorldMap when a region name has been resolved to a
// location in-world, used by places-panel display.
@ -220,14 +225,14 @@ bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, BOOL right_mous
// Request a region handle by name
gWorldMap->sendNamedRegionRequest(region_name,
LLURLDispatcherImpl::regionHandleCallback,
url,
false); // don't teleport
LLURLDispatcherImpl::regionNameCallback,
url,
false); // don't teleport
return true;
}
/*static*/
void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
{
std::string sim_string = stripProtocol(url);
std::string region_name;
@ -241,6 +246,54 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::str
local_pos.mV[VY] = (F32)y;
local_pos.mV[VZ] = (F32)z;
// determine whether the point is in this region
if ((x >= 0) && (x < REGION_WIDTH_UNITS) &&
(y >= 0) && (y < REGION_WIDTH_UNITS))
{
// if so, we're done
regionHandleCallback(region_handle, url, snapshot_id, teleport);
}
else
{
// otherwise find the new region from the location
// add the position to get the new region
LLVector3d global_pos = from_region_handle(region_handle) + LLVector3d(local_pos);
U64 new_region_handle = to_region_handle(global_pos);
gWorldMap->sendHandleRegionRequest(new_region_handle,
LLURLDispatcherImpl::regionHandleCallback,
url, teleport);
}
}
/* static */
void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
{
std::string sim_string = stripProtocol(url);
std::string region_name;
S32 x = 128;
S32 y = 128;
S32 z = 0;
LLURLSimString::parse(sim_string, &region_name, &x, &y, &z);
// remap x and y to local coordinates
S32 local_x = x % REGION_WIDTH_UNITS;
S32 local_y = y % REGION_WIDTH_UNITS;
if (local_x < 0)
local_x += REGION_WIDTH_UNITS;
if (local_y < 0)
local_y += REGION_WIDTH_UNITS;
LLVector3 local_pos;
local_pos.mV[VX] = (F32)local_x;
local_pos.mV[VY] = (F32)local_y;
local_pos.mV[VZ] = (F32)z;
if (teleport)
{
LLVector3d global_pos = from_region_handle(region_handle);

View File

@ -83,82 +83,101 @@ void agent_push_down( EKeystate s )
gAgent.moveUp(-1);
}
void agent_push_forward( EKeystate s )
static void agent_handle_doubletap_run(EKeystate s, LLAgent::EDoubleTapRunMode mode)
{
if( KEYSTATE_UP == s ) return;
if (KEYSTATE_UP == s)
{
// Releasing a walk-key resets the double-tap timer
gAgent.mDoubleTapRunTimer.reset();
if (gAgent.mDoubleTapRunMode == mode &&
gAgent.getRunning() &&
!gAgent.getAlwaysRun())
{
// Turn off temporary running.
gAgent.clearRunning();
gAgent.sendWalkRun(gAgent.getRunning());
}
gAgent.mDoubleTapRunMode = mode;
}
else if (KEYSTATE_DOWN == s &&
gAgent.mDoubleTapRunMode == mode &&
gAgent.mDoubleTapRunTimer.getElapsedTimeF32() < NUDGE_TIME)
{
// Same walk-key was pushed again quickly; this is a double-tap
// so engage temporary running.
gAgent.setRunning();
gAgent.sendWalkRun(gAgent.getRunning());
}
}
static void agent_push_forwardbackward( EKeystate s, S32 direction, LLAgent::EDoubleTapRunMode mode )
{
agent_handle_doubletap_run(s, mode);
if (KEYSTATE_UP == s) return;
F32 time = gKeyboard->getCurKeyElapsedTime();
S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount());
if( time < NUDGE_TIME || frame_count <= NUDGE_FRAMES)
{
gAgent.moveAtNudge(1);
gAgent.moveAtNudge(direction);
}
else
{
gAgent.moveAt(1);
gAgent.moveAt(direction);
}
}
void agent_push_forward( EKeystate s )
{
agent_push_forwardbackward(s, 1, LLAgent::DOUBLETAP_FORWARD);
}
void agent_push_backward( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount());
agent_push_forwardbackward(s, -1, LLAgent::DOUBLETAP_BACKWARD);
}
static void agent_slide_leftright( EKeystate s, S32 direction, LLAgent::EDoubleTapRunMode mode )
{
agent_handle_doubletap_run(s, mode);
if( KEYSTATE_UP == s ) return;
F32 time = gKeyboard->getCurKeyElapsedTime();
S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount());
if( time < NUDGE_TIME || frame_count <= NUDGE_FRAMES)
{
gAgent.moveAtNudge(-1);
gAgent.moveLeftNudge(direction);
}
else
{
gAgent.moveAt(-1);
gAgent.moveLeft(direction);
}
}
void agent_slide_left( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
F32 time = gKeyboard->getCurKeyElapsedTime();
S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount());
if( time < NUDGE_TIME || frame_count <= NUDGE_FRAMES)
{
gAgent.moveLeftNudge(1);
}
else
{
gAgent.moveLeft(1);
}
agent_slide_leftright(s, 1, LLAgent::DOUBLETAP_SLIDELEFT);
}
void agent_slide_right( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
F32 time = gKeyboard->getCurKeyElapsedTime();
S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount());
if( time < NUDGE_TIME || frame_count <= NUDGE_FRAMES)
{
gAgent.moveLeftNudge(-1);
}
else
{
gAgent.moveLeft(-1);
}
agent_slide_leftright(s, -1, LLAgent::DOUBLETAP_SLIDERIGHT);
}
void agent_turn_left( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
F32 time = gKeyboard->getCurKeyElapsedTime();
if (gToolCamera->mouseSteerMode())
{
agent_slide_left(s);
}
else
{
if (KEYSTATE_UP == s) return;
F32 time = gKeyboard->getCurKeyElapsedTime();
gAgent.moveYaw( LLFloaterMove::getYawRate( time ) );
}
}
@ -166,14 +185,14 @@ void agent_turn_left( EKeystate s )
void agent_turn_right( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
F32 time = gKeyboard->getCurKeyElapsedTime();
if (gToolCamera->mouseSteerMode())
{
agent_slide_right(s);
}
else
{
if (KEYSTATE_UP == s) return;
F32 time = gKeyboard->getCurKeyElapsedTime();
gAgent.moveYaw( -LLFloaterMove::getYawRate( time ) );
}
}

View File

@ -4881,23 +4881,22 @@ class LLWorldAlwaysRun : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
// as well as altering the default walk-vs-run state,
// we also change the *current* walk-vs-run state.
if (gAgent.getAlwaysRun())
{
gAgent.clearAlwaysRun();
gAgent.clearRunning();
}
else
{
gAgent.setAlwaysRun();
gAgent.setRunning();
}
LLMessageSystem *msg = gMessageSystem;
// tell the simulator.
gAgent.sendWalkRun(gAgent.getAlwaysRun());
msg->newMessageFast(_PREHASH_SetAlwaysRun);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->addBOOLFast(_PREHASH_AlwaysRun, gAgent.getAlwaysRun() );
gAgent.sendReliableMessage();
return true;
}
};

View File

@ -2834,13 +2834,8 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
avatarp->mFootPlane.clearVec();
}
// reset always run status
msg->newMessageFast(_PREHASH_SetAlwaysRun);
msg->nextBlockFast(_PREHASH_AgentData);
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
msg->addBOOLFast(_PREHASH_AlwaysRun, gAgent.getAlwaysRun());
gAgent.sendReliableMessage();
// send walk-vs-run status
gAgent.sendWalkRun(gAgent.getRunning() || gAgent.getAlwaysRun());
if (LLFloaterReleaseMsg::checkVersion(version_channel_char))
{

View File

@ -1802,9 +1802,11 @@ void adjust_rect_bottom_center(const LLString& control, const LLRect& window)
LLRect r = gSavedSettings.getRect(control);
if (r.mLeft == 0 && r.mBottom == 0)
{
// *TODO: Adjust based on XUI XML
const S32 TOOLBAR_HEIGHT = 64;
r.setOriginAndSize(
window.getWidth()/2 - r.getWidth()/2,
0,
TOOLBAR_HEIGHT,
r.getWidth(),
r.getHeight());
gSavedSettings.setRect(control, r);
@ -1838,9 +1840,9 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)
{
LLRect r;
adjust_rect_bottom_center("FloaterMoveRect", window);
adjust_rect_bottom_center("FloaterMoveRect2", window);
adjust_rect_bottom_center("FloaterCameraRect", window);
adjust_rect_bottom_center("FloaterCameraRect2", window);
adjust_rect_top_left("FloaterCustomizeAppearanceRect", window);
@ -1856,8 +1858,6 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)
adjust_rect_top_right("FloaterLagMeter", window);
adjust_rect_top_right("FloaterLagMeter", window);
adjust_rect_top_left("FloaterBuildOptionsRect", window);
// bottom-right

View File

@ -108,6 +108,7 @@ LLWorldMap::LLWorldMap() :
mNeighborMapWidth(0),
mNeighborMapHeight(0),
mSLURLRegionName(),
mSLURLRegionHandle(0),
mSLURL(),
mSLURLCallback(0),
mSLURLTeleport(false)
@ -409,6 +410,7 @@ void LLWorldMap::sendNamedRegionRequest(std::string region_name,
bool teleport) // immediately teleport when result returned
{
mSLURLRegionName = region_name;
mSLURLRegionHandle = 0;
mSLURL = callback_url;
mSLURLCallback = callback;
mSLURLTeleport = teleport;
@ -416,6 +418,26 @@ void LLWorldMap::sendNamedRegionRequest(std::string region_name,
sendNamedRegionRequest(region_name);
}
void LLWorldMap::sendHandleRegionRequest(U64 region_handle,
url_callback_t callback,
const std::string& callback_url,
bool teleport) // immediately teleport when result returned
{
mSLURLRegionName.clear();
mSLURLRegionHandle = region_handle;
mSLURL = callback_url;
mSLURLCallback = callback;
mSLURLTeleport = teleport;
U32 global_x;
U32 global_y;
from_region_handle(region_handle, &global_x, &global_y);
U16 grid_x = (U16)(global_x / REGION_WIDTH_UNITS);
U16 grid_y = (U16)(global_y / REGION_WIDTH_UNITS);
sendMapBlockRequest(grid_x, grid_y, grid_x, grid_y, true);
}
// public
void LLWorldMap::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent)
{
@ -566,17 +588,6 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)
found_null_sim = true;
}
else if(gWorldMap->mSLURLCallback != NULL)
{
// Server returns definitive capitalization, SLURL might
// not have that.
if (!stricmp(gWorldMap->mSLURLRegionName.c_str(), name))
{
gWorldMap->mSLURLCallback(handle, gWorldMap->mSLURL, image_id, gWorldMap->mSLURLTeleport);
gWorldMap->mSLURLCallback = NULL;
gWorldMap->mSLURLRegionName.clear();
}
}
else
{
adjust = gWorldMap->extendAABB(x_meters,
@ -642,6 +653,22 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)
}
}
}
if(gWorldMap->mSLURLCallback != NULL)
{
// Server returns definitive capitalization, SLURL might
// not have that.
if (!stricmp(gWorldMap->mSLURLRegionName.c_str(), name) || (gWorldMap->mSLURLRegionHandle == handle))
{
url_callback_t callback = gWorldMap->mSLURLCallback;
gWorldMap->mSLURLCallback = NULL;
gWorldMap->mSLURLRegionName.clear();
gWorldMap->mSLURLRegionHandle = 0;
callback(handle, gWorldMap->mSLURL, image_id, gWorldMap->mSLURLTeleport);
}
}
}
if(adjust) gFloaterWorldMap->adjustZoomSliderBounds();

View File

@ -153,6 +153,10 @@ public:
url_callback_t callback,
const std::string& callback_url,
bool teleport);
void sendHandleRegionRequest(U64 region_handle,
url_callback_t callback,
const std::string& callback_url,
bool teleport);
void sendItemRequest(U32 type, U64 handle = 0);
static void processMapLayerReply(LLMessageSystem*, void**);
@ -217,6 +221,7 @@ private:
// search for named region for url processing
std::string mSLURLRegionName;
U64 mSLURLRegionHandle;
std::string mSLURL;
url_callback_t mSLURLCallback;
bool mSLURLTeleport;