Merge with viewer-development

meow-7.2.2
Don Kjer 2011-04-19 21:50:08 +00:00
commit ee2cea657a
14 changed files with 141 additions and 87 deletions

View File

@ -88,8 +88,6 @@ f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start
c5bdef3aaa2744626aef3c217ce29e1900d357b3 DRTVWR-43_2.6.1-beta1
c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-beta1
9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2
9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2
c9182ed77d427c759cfacf49a7b71a2e20d522aa DRTVWR-42_2.6.1-release
c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
56b2778c743c2a964d82e1caf11084d76a87de2c 2.6.2-start
@ -97,8 +95,12 @@ c9182ed77d427c759cfacf49a7b71a2e20d522aa 2.6.1-release
42f32494bac475d0737799346f6831558ae8bf5d 2.6.0-release
d1203046bb653b763f835b04d184646949d8dd5c DRTVWR-45_2.6.2-beta1
d1203046bb653b763f835b04d184646949d8dd5c 2.6.2-beta1
214180ad5714ce8392b82bbebcc92f4babd98300 DRTVWR-44_2.6.2-release
214180ad5714ce8392b82bbebcc92f4babd98300 2.6.2-release
52b2263ab28f0976c689fd0b76c55a9eb027cdbf end-of-develop.py
ec32f1045e7c2644015245df3a9933620aa194b8 2.6.3-start
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc DRTVWR-47_2.6.3-beta1
d7fcefabdf32bb61a9ea6d6037c1bb26190a85bc 2.6.3-beta1
74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start
74cd32a06837b0c2cb793b2e8d4d82f5d49462b2 2.6.4-start
f632f87bb71b0f13d21f2f64b0c42cedb008c749 2.6.4-start

View File

@ -157,6 +157,7 @@ LLTextBase::Params::Params()
read_only("read_only", false),
v_pad("v_pad", 0),
h_pad("h_pad", 0),
clip("clip", true),
clip_partial("clip_partial", true),
line_spacing("line_spacing"),
max_text_length("max_length", 255),
@ -199,6 +200,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mVAlign(p.font_valign),
mLineSpacingMult(p.line_spacing.multiple),
mLineSpacingPixels(p.line_spacing.pixels),
mClip(p.clip),
mClipPartial(p.clip_partial && !p.allow_scroll),
mTrackEnd( p.track_end ),
mScrollIndex(-1),
@ -334,7 +336,7 @@ void LLTextBase::drawSelectionBackground()
// binary search for line that starts before top of visible buffer
line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mTop, compare_bottom());
line_list_t::const_iterator end_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top());
line_list_t::const_iterator end_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), content_display_rect.mBottom, compare_top());
bool done = false;
@ -512,7 +514,6 @@ void LLTextBase::drawText()
selection_right = llmax( mSelectionStart, mSelectionEnd );
}
LLRect scrolled_view_rect = getVisibleDocumentRect();
std::pair<S32, S32> line_range = getVisibleLines(mClipPartial);
S32 first_line = line_range.first;
S32 last_line = line_range.second;
@ -545,10 +546,10 @@ void LLTextBase::drawText()
line_end = next_start;
}
LLRect text_rect(line.mRect.mLeft + mVisibleTextRect.mLeft - scrolled_view_rect.mLeft,
line.mRect.mTop - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom,
llmin(mDocumentView->getRect().getWidth(), line.mRect.mRight) - scrolled_view_rect.mLeft,
line.mRect.mBottom - scrolled_view_rect.mBottom + mVisibleTextRect.mBottom);
LLRect text_rect(line.mRect);
text_rect.mRight = llmin(mDocumentView->getRect().getWidth(), text_rect.mRight); // clamp right edge to document extents
text_rect.translate(mVisibleTextRect.mLeft, mVisibleTextRect.mBottom); // translate into display region of text widget
text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom); // adjust by scroll position
// draw a single line of text
S32 seg_start = line_start;
@ -993,14 +994,28 @@ void LLTextBase::draw()
updateScrollFromCursor();
}
LLRect doc_rect;
LLRect text_rect;
if (mScroller)
{
mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &doc_rect, this);
mScroller->localRectToOtherView(mScroller->getContentWindowRect(), &text_rect, this);
}
else
{
doc_rect = getLocalRect();
LLRect visible_lines_rect;
std::pair<S32, S32> line_range = getVisibleLines(mClipPartial);
for (S32 i = line_range.first; i < line_range.second; i++)
{
if (visible_lines_rect.isEmpty())
{
visible_lines_rect = mLineInfoList[i].mRect;
}
else
{
visible_lines_rect.unionWith(mLineInfoList[i].mRect);
}
}
text_rect = visible_lines_rect;
text_rect.translate(mDocumentView->getRect().mLeft, mDocumentView->getRect().mBottom);
}
if (mBGVisible)
@ -1010,28 +1025,37 @@ void LLTextBase::draw()
LLRect bg_rect = mVisibleTextRect;
if (mScroller)
{
bg_rect.intersectWith(doc_rect);
bg_rect.intersectWith(text_rect);
}
LLColor4 bg_color = mReadOnly
? mReadOnlyBgColor.get()
: hasFocus()
? mFocusBgColor.get()
: mWriteableBgColor.get();
gl_rect_2d(doc_rect, bg_color % alpha, TRUE);
gl_rect_2d(text_rect, bg_color % alpha, TRUE);
}
// draw document view
LLUICtrl::draw();
{
// only clip if we support scrolling...
// since convention is that text boxes never vertically truncate their contents
// regardless of rect bounds
LLLocalClipRect clip(doc_rect, mScroller != NULL);
bool should_clip = mClip || mScroller != NULL;
{ LLLocalClipRect clip(text_rect, should_clip);
// draw document view
if (mScroller)
{
drawChild(mScroller);
}
else
{
drawChild(mDocumentView);
}
drawSelectionBackground();
drawText();
drawCursor();
}
mDocumentView->setVisible(FALSE);
LLUICtrl::draw();
mDocumentView->setVisible(TRUE);
}
@ -1415,7 +1439,7 @@ S32 LLTextBase::getFirstVisibleLine() const
return iter - mLineInfoList.begin();
}
std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible)
std::pair<S32, S32> LLTextBase::getVisibleLines(bool require_fully_visible)
{
LLRect visible_region = getVisibleDocumentRect();
line_list_t::const_iterator first_iter;
@ -1424,14 +1448,14 @@ std::pair<S32, S32> LLTextBase::getVisibleLines(bool fully_visible)
// make sure we have an up-to-date mLineInfoList
reflow();
if (fully_visible)
if (require_fully_visible)
{
first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_top());
last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom());
last_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_bottom());
}
else
{
first_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom());
first_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mTop, compare_bottom());
last_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), visible_region.mBottom, compare_top());
}
return std::pair<S32, S32>(first_iter - mLineInfoList.begin(), last_iter - mLineInfoList.begin());
@ -2405,14 +2429,41 @@ LLRect LLTextBase::getVisibleDocumentRect() const
{
return mScroller->getVisibleContentRect();
}
else
else if (mClip)
{
// entire document rect is visible when not scrolling
LLRect visible_text_rect = getVisibleTextRect();
LLRect doc_rect = mDocumentView->getRect();
visible_text_rect.translate(-doc_rect.mLeft, -doc_rect.mBottom);
// reject partially visible lines
LLRect visible_lines_rect;
for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end();
it != end_it;
++it)
{
bool line_visible = mClipPartial ? visible_text_rect.contains(it->mRect) : visible_text_rect.overlaps(it->mRect);
if (line_visible)
{
if (visible_lines_rect.isEmpty())
{
visible_lines_rect = it->mRect;
}
else
{
visible_lines_rect.unionWith(it->mRect);
}
}
}
return visible_lines_rect;
}
else
{ // entire document rect is visible
// but offset according to height of widget
LLRect doc_rect = mDocumentView->getLocalRect();
doc_rect.mLeft -= mDocumentView->getRect().mLeft;
// adjust for height of text above widget baseline
doc_rect.mBottom = doc_rect.getHeight() - mVisibleTextRect.getHeight();
doc_rect.mBottom = llmin(0, doc_rect.getHeight() - mVisibleTextRect.getHeight());
return doc_rect;
}
}

View File

@ -265,6 +265,7 @@ public:
use_ellipses,
parse_urls,
parse_highlights,
clip,
clip_partial;
Optional<S32> v_pad,
@ -338,7 +339,7 @@ public:
void addDocumentChild(LLView* view);
void removeDocumentChild(LLView* view);
const LLView* getDocumentView() const { return mDocumentView; }
LLRect getVisibleTextRect() { return mVisibleTextRect; }
LLRect getVisibleTextRect() const { return mVisibleTextRect; }
LLRect getTextBoundingRect();
LLRect getVisibleDocumentRect() const;
@ -552,6 +553,7 @@ protected:
bool mTrackEnd; // if true, keeps scroll position at end of document during resize
bool mReadOnly;
bool mBGVisible; // render background?
bool mClip; // clip text to widget rect
bool mClipPartial; // false if we show lines that are partially inside bounding rect
bool mPlainText; // didn't use Image or Icon segments
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes

View File

@ -4339,8 +4339,8 @@
wearable="shape"
edit_group="driven"
value_default="0"
value_min="-2"
value_max="2">
value_min="-3"
value_max="3">
<param_morph />
</param>
@ -4352,8 +4352,8 @@
wearable="shape"
edit_group="driven"
value_default="0"
value_min="-1"
value_max="1">
value_min="-1.5"
value_max="1.5">
<param_morph />
</param>
@ -11916,7 +11916,7 @@ render_pass="bump">
edit_group="physics_breasts_updown"
value_default=".1"
value_min="0"
value_max="1">
value_max="3">
<param_driver />
</param>
<param
@ -11971,7 +11971,7 @@ render_pass="bump">
edit_group="physics_breasts_inout"
value_default=".1"
value_min="0"
value_max="1">
value_max="3">
<param_driver />
</param>
<param
@ -12058,7 +12058,7 @@ render_pass="bump">
edit_group="physics_belly_updown"
value_default=".1"
value_min="0"
value_max="1">
value_max="3">
<param_driver />
</param>
<param
@ -12144,7 +12144,7 @@ render_pass="bump">
edit_group="physics_butt_updown"
value_default=".1"
value_min="0"
value_max="1">
value_max="3">
<param_driver />
</param>
<param
@ -12193,7 +12193,7 @@ render_pass="bump">
edit_group="physics_butt_leftright"
value_default=".1"
value_min="0"
value_max="1">
value_max="3">
<param_driver />
</param>
<param
@ -12244,7 +12244,7 @@ render_pass="bump">
edit_group="physics_breasts_leftright"
value_default=".1"
value_min="0"
value_max="1">
value_max="3">
<param_driver />
</param>
<param

View File

@ -2468,6 +2468,14 @@ bool LLAppViewer::initConfiguration()
}
}
// If automatic login from command line with --login switch
// init StartSLURL location. In interactive login, LLPanelLogin
// will take care of it.
if ((clp.hasOption("login") || clp.hasOption("autologin")) && !clp.hasOption("url") && !clp.hasOption("slurl"))
{
LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation")));
}
if (!gSavedSettings.getBOOL("AllowMultipleViewers"))
{
//

View File

@ -1059,12 +1059,11 @@ void LLInventoryModel::idleNotifyObservers()
{
return;
}
notifyObservers("");
notifyObservers();
}
// Call this method when it's time to update everyone on a new state.
// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
void LLInventoryModel::notifyObservers(const std::string service_name)
void LLInventoryModel::notifyObservers()
{
if (mIsNotifyObservers)
{
@ -1081,15 +1080,7 @@ void LLInventoryModel::notifyObservers(const std::string service_name)
{
LLInventoryObserver* observer = *iter;
if (service_name.empty())
{
observer->changed(mModifyMask);
}
else
{
observer->mMessageName = service_name;
observer->changed(mModifyMask);
}
observer->changed(mModifyMask);
// safe way to increment since changed may delete entries! (@!##%@!@&*!)
iter = mObservers.upper_bound(observer);
@ -1187,7 +1178,7 @@ void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)
{
changes |= gInventory.updateItem(*it);
}
gInventory.notifyObservers("fetchinventory");
gInventory.notifyObservers();
gViewerWindow->getWindow()->decBusyCount();
}
@ -1196,7 +1187,7 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str
{
llinfos << "fetchInventory::error "
<< status << ": " << reason << llendl;
gInventory.notifyObservers("fetchinventory");
gInventory.notifyObservers();
}
bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const

View File

@ -425,9 +425,8 @@ public:
// has been indicated.
void idleNotifyObservers();
// Call to explicitly update everyone on a new state. The optional argument
// 'service_name' is used by Agent Inventory Service [DEV-20328]
void notifyObservers(const std::string service_name="");
// Call to explicitly update everyone on a new state.
void notifyObservers();
// Allows outsiders to tell the inventory if something has
// been changed 'under the hood', but outside the control of the

View File

@ -388,7 +388,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
titem->setParent(lost_uuid);
titem->updateParentOnServer(FALSE);
gInventory.updateItem(titem);
gInventory.notifyObservers("fetchDescendents");
gInventory.notifyObservers();
}
}
@ -464,7 +464,7 @@ void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
fetcher->setAllFoldersFetched();
}
gInventory.notifyObservers("fetchDescendents");
gInventory.notifyObservers();
}
// If we get back an error (not found, etc...), handle it here.
@ -496,7 +496,7 @@ void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::str
fetcher->setAllFoldersFetched();
}
}
gInventory.notifyObservers("fetchDescendents");
gInventory.notifyObservers();
}
BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat_id) const

View File

@ -572,16 +572,7 @@ void LLInventoryAddedObserver::changed(U32 mask)
// the network, figure out which item was updated.
LLMessageSystem* msg = gMessageSystem;
std::string msg_name;
if (mMessageName.empty())
{
msg_name = msg->getMessageName();
}
else
{
msg_name = mMessageName;
}
std::string msg_name = msg->getMessageName();
if (msg_name.empty())
{
return;

View File

@ -63,7 +63,6 @@ public:
LLInventoryObserver();
virtual ~LLInventoryObserver();
virtual void changed(U32 mask) = 0;
std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -121,7 +121,8 @@ protected:
return mCharacter->getVisualParamWeight(param_name.c_str());
}
void setParamValue(LLViewerVisualParam *param,
const F32 new_value_local);
const F32 new_value_local,
F32 behavior_maxeffect);
F32 toLocal(const LLVector3 &world);
F32 calculateVelocity_local(const F32 time_delta);
@ -472,9 +473,6 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
F32 behavior_maxeffect = getParamValue("MaxEffect");
if (physics_test)
behavior_maxeffect = 1.0f;
// Maximum effect is [0,1] range.
const F32 min_val = 0.5f-behavior_maxeffect/2.0;
const F32 max_val = 0.5f+behavior_maxeffect/2.0;
// mPositon_local should be in normalized 0,1 range already. Just making sure...
F32 position_current_local = llclamp(mPosition_local,
@ -572,12 +570,12 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
position_new_local = position_user_local;
// Zero out the velocity if the param is being pushed beyond its limits.
if ((position_new_local < min_val && velocity_new_local < 0) ||
(position_new_local > max_val && velocity_new_local > 0))
if ((position_new_local < 0 && velocity_new_local < 0) ||
(position_new_local > 1 && velocity_new_local > 0))
{
velocity_new_local = 0;
}
// Check for NaN values. A NaN value is detected if the variables doesn't equal itself.
// If NaN, then reset everything.
if ((mPosition_local != mPosition_local) ||
@ -595,8 +593,8 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
}
const F32 position_new_local_clamped = llclamp(position_new_local,
min_val,
max_val);
0.0f,
1.0f);
LLDriverParam *driver_param = dynamic_cast<LLDriverParam *>(mParamDriver);
llassert_always(driver_param);
@ -617,7 +615,7 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
{
LLDrivenEntry &entry = (*iter);
LLViewerVisualParam *driven_param = entry.mParam;
setParamValue(driven_param,position_new_local_clamped);
setParamValue(driven_param,position_new_local_clamped, behavior_maxeffect);
}
}
@ -699,12 +697,19 @@ BOOL LLPhysicsMotion::onUpdate(F32 time)
// Range of new_value_local is assumed to be [0 , 1] normalized.
void LLPhysicsMotion::setParamValue(LLViewerVisualParam *param,
F32 new_value_normalized)
F32 new_value_normalized,
F32 behavior_maxeffect)
{
const F32 value_min_local = param->getMinWeight();
const F32 value_max_local = param->getMaxWeight();
const F32 min_val = 0.5f-behavior_maxeffect/2.0;
const F32 max_val = 0.5f+behavior_maxeffect/2.0;
const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_normalized;
// Scale from [0,1] to [min_val,max_val]
const F32 new_value_rescaled = min_val + (max_val-min_val) * new_value_normalized;
// Scale from [0,1] to [value_min_local,value_max_local]
const F32 new_value_local = value_min_local + (value_max_local-value_min_local) * new_value_rescaled;
mCharacter->setVisualParamWeight(param,
new_value_local,

View File

@ -310,7 +310,7 @@ void LLIMWellWindow::RowPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD&
S32 new_text_left = mChiclet->getRect().mRight + CHICLET_HPAD;
LLRect text_rect = text->getRect();
text_rect.mLeft = new_text_left;
text->setRect(text_rect);
text->setShape(text_rect);
}
//---------------------------------------------------------------------------------

View File

@ -144,7 +144,7 @@ BOOL LLWearableType::getDisableCameraSwitch(LLWearableType::EType type)
{
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
const WearableEntry *entry = dict->lookup(type);
if (!entry) return FALSE;
if (!entry) return FALSE;
return entry->mDisableCameraSwitch;
}
@ -153,7 +153,7 @@ BOOL LLWearableType::getAllowMultiwear(LLWearableType::EType type)
{
const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
const WearableEntry *entry = dict->lookup(type);
if (!entry) return FALSE;
if (!entry) return FALSE;
return entry->mAllowMultiwear;
}

View File

@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2008&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2010, Linden Research, Inc.
* 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
@ -2233,7 +2233,13 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e
case MEDIA_EVENT_LINK_HOVERED:
{
std::cerr << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << std::endl;
};
}
break;
default:
{
std::cerr << "Media event: <unknown>, code is: " << int(event) << std::endl;
}
break;
}
}