# Conflicts:
#	indra/newview/llglsandbox.cpp
#	indra/newview/llphysicsshapebuilderutil.cpp
meow-7.2.2
Ansariel 2024-09-19 01:25:26 +02:00
commit b727a5e73c
22 changed files with 358 additions and 174 deletions

View File

@ -9,3 +9,5 @@ a0b3021bdcf76859054fda8e30abb3ed47749e83
1b67dd855c41f5a0cda7ec2a68d98071986ca703
6cc7dd09d5e69cf57e6de7fb568a0ad2693f9c9a
e2e37cced861b98de8c1a7c9c0d3a50d2d90e433
# multiple problems
5370a6d323e14d7b4e32a3f41ef78f7744e361c5

View File

@ -2655,6 +2655,34 @@ S32 LLTextBase::removeFirstLine()
return 0;
}
// virtual
void LLTextBase::copyContents(const LLTextBase* source)
{
llassert(source);
if (!source)
return;
beforeValueChange();
deselect();
mSegments.clear();
for (const LLTextSegmentPtr& segp : source->mSegments)
{
mSegments.emplace(segp->clone(*this));
}
mLineInfoList.clear();
for (const line_info& li : mLineInfoList)
{
mLineInfoList.push_back(line_info(li));
}
getViewModel()->setDisplay(source->getViewModel()->getDisplay());
onValueChange(0, getLength());
needsReflow();
}
void LLTextBase::appendLineBreakSegment(const LLStyle::Params& style_params)
{
segment_vec_t segments;
@ -3586,6 +3614,24 @@ boost::signals2::connection LLTextBase::setIsObjectBlockedCallback(const is_bloc
LLTextSegment::~LLTextSegment()
{}
// static
LLStyleSP LLTextSegment::cloneStyle(LLTextBase& target, const LLStyle* source)
{
// Take most params from target
LLStyle::Params params = target.getStyleParams();
LLStyle* style = new LLStyle(params);
// Take some params from source
style->setLinkHREF(source->getLinkHREF());
if (source->isImage())
{
style->setImage(source->getImage()->getName());
}
return style;
}
bool LLTextSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const { width = 0; height = 0; return false; }
bool LLTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
{
@ -3927,6 +3973,13 @@ void LLNormalTextSegment::setToolTip(const std::string& tooltip)
mTooltip = tooltip;
}
// virtual
LLTextSegmentPtr LLNormalTextSegment::clone(LLTextBase& target) const
{
LLStyleConstSP sp(cloneStyle(target, mStyle));
return new LLNormalTextSegment(sp, mStart, mEnd, target);
}
bool LLNormalTextSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const
{
height = 0;
@ -4067,6 +4120,13 @@ LLLabelTextSegment::LLLabelTextSegment( const LLUIColor& color, S32 start, S32 e
{
}
// virtual
LLTextSegmentPtr LLLabelTextSegment::clone(LLTextBase& target) const
{
LLStyleConstSP sp(cloneStyle(target, mStyle));
return new LLLabelTextSegment(sp, mStart, mEnd, target);
}
/*virtual*/
const LLWString& LLLabelTextSegment::getWText() const
{
@ -4091,6 +4151,13 @@ LLEmojiTextSegment::LLEmojiTextSegment(const LLUIColor& color, S32 start, S32 en
{
}
// virtual
LLTextSegmentPtr LLEmojiTextSegment::clone(LLTextBase& target) const
{
LLStyleConstSP sp(cloneStyle(target, mStyle));
return new LLEmojiTextSegment(sp, mStart, mEnd, target);
}
bool LLEmojiTextSegment::handleToolTip(S32 x, S32 y, MASK mask)
{
if (mTooltip.empty())
@ -4114,6 +4181,14 @@ LLOnHoverChangeableTextSegment::LLOnHoverChangeableTextSegment( LLStyleConstSP s
mHoveredStyle(style),
mNormalStyle(normal_style){}
// virtual
LLTextSegmentPtr LLOnHoverChangeableTextSegment::clone(LLTextBase& target) const
{
LLStyleConstSP hsp(cloneStyle(target, mHoveredStyle));
LLStyleConstSP nsp(cloneStyle(target, mNormalStyle));
return new LLOnHoverChangeableTextSegment(hsp, nsp, mStart, mEnd, target);
}
/*virtual*/
F32 LLOnHoverChangeableTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect)
{
@ -4153,6 +4228,13 @@ LLInlineViewSegment::~LLInlineViewSegment()
mView->die();
}
// virtual
LLTextSegmentPtr LLInlineViewSegment::clone(LLTextBase& target) const
{
llassert_always_msg(false, "NOT SUPPORTED");
return nullptr;
}
bool LLInlineViewSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const
{
if (first_char == 0 && num_chars == 0)
@ -4240,6 +4322,14 @@ LLLineBreakTextSegment::LLLineBreakTextSegment(LLStyleConstSP style,S32 pos):LLT
LLLineBreakTextSegment::~LLLineBreakTextSegment()
{
}
// virtual
LLTextSegmentPtr LLLineBreakTextSegment::clone(LLTextBase& target) const
{
LLLineBreakTextSegment* copy = new LLLineBreakTextSegment(mStart);
copy->mFontHeight = mFontHeight;
return copy;
}
bool LLLineBreakTextSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const
{
width = 0;
@ -4267,8 +4357,16 @@ LLImageTextSegment::~LLImageTextSegment()
{
}
// virtual
LLTextSegmentPtr LLImageTextSegment::clone(LLTextBase& target) const
{
LLStyleConstSP sp(cloneStyle(target, mStyle));
return new LLImageTextSegment(sp, mStart, target);
}
static const S32 IMAGE_HPAD = 3;
// virtual
bool LLImageTextSegment::getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const
{
width = 0;

View File

@ -45,6 +45,7 @@
class LLScrollContainer;
class LLContextMenu;
class LLUrlMatch;
class LLTextBase;
///
/// A text segment is used to specify a subsection of a text string
@ -62,6 +63,9 @@ public:
mEnd(end)
{}
virtual ~LLTextSegment();
virtual LLTextSegmentPtr clone(LLTextBase& terget) const { return new LLTextSegment(mStart, mEnd); }
static LLStyleSP cloneStyle(LLTextBase& target, const LLStyle* source);
bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
virtual bool getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const;
@ -128,6 +132,7 @@ public:
LLNormalTextSegment( LLStyleConstSP style, S32 start, S32 end, LLTextBase& editor );
LLNormalTextSegment( const LLUIColor& color, S32 start, S32 end, LLTextBase& editor, bool is_visible = true);
virtual ~LLNormalTextSegment();
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const;
/*virtual*/ bool getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const;
/*virtual*/ S32 getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const;
@ -180,6 +185,7 @@ class LLLabelTextSegment : public LLNormalTextSegment
public:
LLLabelTextSegment( LLStyleConstSP style, S32 start, S32 end, LLTextBase& editor );
LLLabelTextSegment( const LLUIColor& color, S32 start, S32 end, LLTextBase& editor, bool is_visible = true);
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const;
protected:
@ -194,6 +200,7 @@ class LLEmojiTextSegment : public LLNormalTextSegment
public:
LLEmojiTextSegment(LLStyleConstSP style, S32 start, S32 end, LLTextBase& editor);
LLEmojiTextSegment(const LLUIColor& color, S32 start, S32 end, LLTextBase& editor, bool is_visible = true);
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const override;
bool canEdit() const override { return false; }
bool handleToolTip(S32 x, S32 y, MASK mask) override;
@ -204,6 +211,7 @@ class LLOnHoverChangeableTextSegment : public LLNormalTextSegment
{
public:
LLOnHoverChangeableTextSegment( LLStyleConstSP style, LLStyleConstSP normal_style, S32 start, S32 end, LLTextBase& editor );
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const;
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
/*virtual*/ bool handleHover(S32 x, S32 y, MASK mask);
protected:
@ -218,6 +226,7 @@ class LLIndexSegment : public LLTextSegment
{
public:
LLIndexSegment() : LLTextSegment(0, 0) {}
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const { return new LLIndexSegment(); }
};
class LLInlineViewSegment : public LLTextSegment
@ -235,6 +244,8 @@ public:
LLInlineViewSegment(const Params& p, S32 start, S32 end);
~LLInlineViewSegment();
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const;
/*virtual*/ bool getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const;
/*virtual*/ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;
/*virtual*/ void updateLayout(const class LLTextBase& editor);
@ -259,6 +270,7 @@ public:
LLLineBreakTextSegment(LLStyleConstSP style,S32 pos);
LLLineBreakTextSegment(S32 pos);
~LLLineBreakTextSegment();
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const;
/*virtual*/ bool getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const;
S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars, S32 line_ind) const;
F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
@ -272,6 +284,8 @@ class LLImageTextSegment : public LLTextSegment
public:
LLImageTextSegment(LLStyleConstSP style,S32 pos,class LLTextBase& editor);
~LLImageTextSegment();
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const;
/*virtual*/ bool getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const;
S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 char_offset, S32 max_chars, S32 line_ind) const;
F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect);
@ -547,6 +561,7 @@ public:
const LLFontGL* getFont() const override { return mFont; }
virtual void copyContents(const LLTextBase* source);
virtual void appendLineBreakSegment(const LLStyle::Params& style_params);
virtual void appendImageSegment(const LLStyle::Params& style_params);
virtual void appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);

View File

@ -371,43 +371,46 @@ void GLTFSceneManager::addGLTFObject(LLViewerObject* obj, LLUUID gltf_id)
//static
void GLTFSceneManager::onGLTFBinLoadComplete(const LLUUID& id, LLAssetType::EType asset_type, void* user_data, S32 status, LLExtStat ext_status)
{
LLViewerObject* obj = (LLViewerObject*)user_data;
llassert(asset_type == LLAssetType::AT_GLTF_BIN);
if (status == LL_ERR_NOERR)
{
if (obj)
LLAppViewer::instance()->postToMainCoro([=]()
{
// find the Buffer with the given id in the asset
if (obj->mGLTFAsset)
LLViewerObject* obj = (LLViewerObject*)user_data;
llassert(asset_type == LLAssetType::AT_GLTF_BIN);
if (status == LL_ERR_NOERR)
{
obj->mGLTFAsset->mPendingBuffers--;
if (obj->mGLTFAsset->mPendingBuffers == 0)
if (obj)
{
if (obj->mGLTFAsset->prep())
// find the Buffer with the given id in the asset
if (obj->mGLTFAsset)
{
GLTFSceneManager& mgr = GLTFSceneManager::instance();
if (std::find(mgr.mObjects.begin(), mgr.mObjects.end(), obj) == mgr.mObjects.end())
obj->mGLTFAsset->mPendingBuffers--;
if (obj->mGLTFAsset->mPendingBuffers == 0)
{
GLTFSceneManager::instance().mObjects.push_back(obj);
if (obj->mGLTFAsset->prep())
{
GLTFSceneManager& mgr = GLTFSceneManager::instance();
if (std::find(mgr.mObjects.begin(), mgr.mObjects.end(), obj) == mgr.mObjects.end())
{
GLTFSceneManager::instance().mObjects.push_back(obj);
}
}
else
{
LL_WARNS("GLTF") << "Failed to prepare GLTF asset: " << id << LL_ENDL;
obj->mGLTFAsset = nullptr;
}
}
}
else
{
LL_WARNS("GLTF") << "Failed to prepare GLTF asset: " << id << LL_ENDL;
obj->mGLTFAsset = nullptr;
}
}
}
}
}
else
{
LL_WARNS("GLTF") << "Failed to load GLTF asset: " << id << LL_ENDL;
obj->unref();
}
else
{
LL_WARNS("GLTF") << "Failed to load GLTF asset: " << id << LL_ENDL;
obj->unref();
}
});
}
//static

View File

@ -41,6 +41,16 @@ public:
mEditor(NULL)
{}
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const
{
ChatSeparator* copy = new ChatSeparator(mStart, mEnd);
if (mEditor)
{
copy->mEditor = &target;
}
return copy;
}
/*virtual*/ void linkToDocument(class LLTextBase* editor)
{
mEditor = editor;

View File

@ -44,6 +44,14 @@ public:
mExpanderLabel(utf8str_to_wstring(more_text))
{}
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const
{
LLStyleSP sp(cloneStyle(target, mStyle));
LLExpanderSegment* copy = new LLExpanderSegment(sp, mStart, mEnd, LLStringUtil::null, target);
copy->mExpanderLabel = mExpanderLabel;
return copy;
}
/*virtual*/ bool getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const
{
// more label always spans width of text box

View File

@ -2399,6 +2399,14 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
center.mul(0.5f);
size.setSub(mRiggedExtents[1], mRiggedExtents[0]);
}
else if (mDrawablep && mVObjp.notNull() && mVObjp->getPartitionType() == LLViewerRegion::PARTITION_PARTICLE && mDrawablep->getSpatialGroup())
{ // use box of spatial group for particles (over approximates size, but we don't actually have a good size per particle)
LLSpatialGroup* group = mDrawablep->getSpatialGroup();
const LLVector4a* extents = group->getExtents();
size.setSub(extents[1], extents[0]);
center.setAdd(extents[1], extents[0]);
center.mul(0.5f);
}
else
{
center.load3(getPositionAgent().mV);

View File

@ -163,6 +163,7 @@ public:
void updateParcelInfo();
void updateCovenantInfo();
static void onChangeAgreeCovenant(LLUICtrl* ctrl, void* user_data);
void updateFloaterCovenant(const LLTextBase* source, const LLUUID &asset_id);
void updateFloaterCovenantText(const std::string& string, const LLUUID &asset_id);
void updateFloaterEstateName(const std::string& name);
void updateFloaterLastModified(const std::string& text);
@ -201,6 +202,8 @@ public:
void onVisibilityChanged ( const LLSD& new_visibility );
private:
void onCovenantTextUpdated(const LLUUID& asset_id);
};
// static
@ -221,6 +224,15 @@ void LLFloaterBuyLand::buyLand(
}
}
// static
void LLFloaterBuyLand::updateCovenant(const LLTextBase* source, const LLUUID& asset_id)
{
if (LLFloaterBuyLandUI* floater = LLFloaterReg::findTypedInstance<LLFloaterBuyLandUI>("buy_land"))
{
floater->updateFloaterCovenant(source, asset_id);
}
}
// static
void LLFloaterBuyLand::updateCovenantText(const std::string& string, const LLUUID &asset_id)
{
@ -560,11 +572,24 @@ void LLFloaterBuyLandUI::onChangeAgreeCovenant(LLUICtrl* ctrl, void* user_data)
}
}
void LLFloaterBuyLandUI::updateFloaterCovenant(const LLTextBase* source, const LLUUID& asset_id)
{
LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("covenant_editor");
editor->copyContents(source);
onCovenantTextUpdated(asset_id);
}
void LLFloaterBuyLandUI::updateFloaterCovenantText(const std::string &string, const LLUUID& asset_id)
{
LLViewerTextEditor* editor = getChild<LLViewerTextEditor>("covenant_editor");
editor->setText(string);
onCovenantTextUpdated(asset_id);
}
void LLFloaterBuyLandUI::onCovenantTextUpdated(const LLUUID& asset_id)
{
LLCheckBoxCtrl* check = getChild<LLCheckBoxCtrl>("agree_covenant");
LLTextBox* box = getChild<LLTextBox>("covenant_text");
if (asset_id.isNull())

View File

@ -27,6 +27,7 @@
#ifndef LL_LLFLOATERBUYLAND_H
#define LL_LLFLOATERBUYLAND_H
class LLTextBase;
class LLFloater;
class LLViewerRegion;
class LLParcelSelection;
@ -37,6 +38,7 @@ public:
static void buyLand(LLViewerRegion* region,
LLSafeHandle<LLParcelSelection> parcel,
bool is_for_group);
static void updateCovenant(const LLTextBase* source, const LLUUID& asset_id);
static void updateCovenantText(const std::string& string, const LLUUID& asset_id);
static void updateEstateName(const std::string& name);
static void updateLastModified(const std::string& text);

View File

@ -78,9 +78,10 @@
// </FS:Zi>
// <FS:Zi> detect and strip empty alpha layers from images on upload
const U8 ALPHA_EMPTY_THRESHOLD = 253;
const F32 ALPHA_EMPTY_THRESHOLD_RATIO = 0.999f;
constexpr U8 ALPHA_EMPTY_THRESHOLD = 253;
constexpr F32 ALPHA_EMPTY_THRESHOLD_RATIO = 0.999f;
// </FS:Zi>
//-----------------------------------------------------------------------------
// LLFloaterImagePreview()
//-----------------------------------------------------------------------------
@ -435,6 +436,21 @@ void LLFloaterImagePreview::draw()
gGL.color3f(1.f, 1.f, 1.f);
gGL.begin(LLRender::TRIANGLES);
{
// <FS:Zi> Make preview area position to be not hard-coded
//gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mTop);
//gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
//gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mBottom);
//gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
//gGL.texCoord2f(mPreviewImageRect.mRight, mPreviewImageRect.mBottom);
//gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
//gGL.texCoord2f(mPreviewImageRect.mRight, mPreviewImageRect.mBottom);
//gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
//gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mTop);
//gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
//gGL.texCoord2f(mPreviewImageRect.mRight, mPreviewImageRect.mTop);
//gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mTop);
gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mTop);
gGL.texCoord2f(mPreviewImageRect.mLeft, mPreviewImageRect.mBottom);
@ -448,6 +464,7 @@ void LLFloaterImagePreview::draw()
gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mBottom);
gGL.texCoord2f(mPreviewImageRect.mRight, mPreviewImageRect.mTop);
gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mTop);
// </FS:Zi>
}
gGL.end();
@ -472,6 +489,21 @@ void LLFloaterImagePreview::draw()
gGL.begin(LLRender::TRIANGLES);
{
// <FS:Zi> Make preview area position to be not hard-coded
//gGL.texCoord2f(0.f, 1.f);
//gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
//gGL.texCoord2f(0.f, 0.f);
//gGL.vertex2i(PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
//gGL.texCoord2f(1.f, 0.f);
//gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
//gGL.texCoord2f(1.f, 0.f);
//gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_HPAD + PREF_BUTTON_HEIGHT + PREVIEW_HPAD);
//gGL.texCoord2f(0.f, 1.f);
//gGL.vertex2i(PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
//gGL.texCoord2f(1.f, 1.f);
//gGL.vertex2i(r.getWidth() - PREVIEW_HPAD, PREVIEW_TEXTURE_HEIGHT + PREVIEW_VPAD);
gGL.texCoord2f(0.f, 1.f);
gGL.vertex2i(mPreviewRect.mLeft, mPreviewRect.mTop);
gGL.texCoord2f(0.f, 0.f);
@ -485,6 +517,7 @@ void LLFloaterImagePreview::draw()
gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mBottom);
gGL.texCoord2f(1.f, 1.f);
gGL.vertex2i(mPreviewRect.mRight, mPreviewRect.mTop);
// </FS:Zi>
}
gGL.end();

View File

@ -3356,6 +3356,16 @@ void LLPanelLandCovenant::refresh()
}
}
// static
void LLPanelLandCovenant::updateCovenant(const LLTextBase* source)
{
if (LLPanelLandCovenant* self = LLFloaterLand::getCurrentPanelLandCovenant())
{
LLViewerTextEditor* editor = self->getChild<LLViewerTextEditor>("covenant_editor");
editor->copyContents(source);
}
}
// static
void LLPanelLandCovenant::updateCovenantText(const std::string &string)
{

View File

@ -51,6 +51,7 @@ class LLRadioGroup;
class LLParcelSelectionObserver;
class LLSpinCtrl;
class LLTabContainer;
class LLTextBase;
class LLTextBox;
class LLTextEditor;
class LLTextureCtrl;
@ -434,6 +435,7 @@ public:
virtual ~LLPanelLandCovenant();
virtual bool postBuild();
void refresh();
static void updateCovenant(const LLTextBase* source);
static void updateCovenantText(const std::string& string);
static void updateEstateName(const std::string& name);
static void updateLastModified(const std::string& text);

View File

@ -3054,6 +3054,16 @@ void LLPanelEstateCovenant::setEstateName(const std::string& name)
mEstateNameText->setText(name);
}
// static
void LLPanelEstateCovenant::updateCovenant(const LLTextBase* source, const LLUUID& asset_id)
{
if (LLPanelEstateCovenant* panelp = LLFloaterRegionInfo::getPanelCovenant())
{
panelp->mEditor->copyContents(source);
panelp->setCovenantID(asset_id);
}
}
// static
void LLPanelEstateCovenant::updateCovenantText(const std::string& string, const LLUUID& asset_id)
{

View File

@ -412,6 +412,7 @@ public:
void* user_data, S32 status, LLExtStat ext_status);
// Accessor functions
static void updateCovenant(const LLTextBase* source, const LLUUID& asset_id);
static void updateCovenantText(const std::string& string, const LLUUID& asset_id);
static void updateEstateName(const std::string& name);
static void updateLastModified(const std::string& text);

View File

@ -73,7 +73,7 @@
#include <vector>
// Height of the yellow selection highlight posts for land
const F32 PARCEL_POST_HEIGHT = 0.666f;
constexpr F32 PARCEL_POST_HEIGHT = 0.666f;
// Returns true if you got at least one object
void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
@ -235,36 +235,27 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
{
std::vector<LLDrawable*> potentials;
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
for (LLViewerRegion* region : LLWorld::getInstance()->getRegionList())
{
LLViewerRegion* region = *iter;
for (U32 i = 0; i < LLViewerRegion::NUM_PARTITIONS; i++)
{
LLSpatialPartition* part = region->getSpatialPartition(i);
if (part)
if (LLSpatialPartition* part = region->getSpatialPartition(i))
{
part->cull(camera, &potentials, true);
}
}
}
for (std::vector<LLDrawable*>::iterator iter = potentials.begin();
iter != potentials.end(); iter++)
for (LLDrawable* drawable : potentials)
{
LLDrawable* drawable = *iter;
// <FS:Ansariel> FIRE-15206: Crash fixing
if (!drawable)
{
continue;
}
// </FS:Ansariel>
LLViewerObject* vobjp = drawable->getVObj();
// <FS:Ansariel> FIRE-15206: Crash fixing
//if (!drawable || !vobjp ||
if (!vobjp ||
// </FS:Ansariel>
vobjp->getPCode() != LL_PCODE_VOLUME ||
vobjp->isAttachment() ||
(deselect && !vobjp->isSelected()))
@ -317,7 +308,7 @@ void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
gViewerWindow->setup3DRender();
}
const F32 WIND_RELATIVE_ALTITUDE = 25.f;
constexpr F32 WIND_RELATIVE_ALTITUDE = 25.f;
void LLWind::renderVectors()
{
@ -342,14 +333,14 @@ void LLWind::renderVectors()
x = mVelX[i + j*mSize] * WIND_SCALE_HACK;
y = mVelY[i + j*mSize] * WIND_SCALE_HACK;
gGL.pushMatrix();
gGL.translatef((F32)i * region_width_meters/mSize, (F32)j * region_width_meters/mSize, 0.0);
gGL.color3f(0,1,0);
gGL.translatef((F32)i * region_width_meters/mSize, (F32)j * region_width_meters/mSize, 0.f);
gGL.color3f(0.f, 1.f, 0.f);
gGL.begin(LLRender::POINTS);
gGL.vertex3f(0,0,0);
gGL.vertex3f(0.f, 0.f, 0.f);
gGL.end();
gGL.color3f(1,0,0);
gGL.color3f(1.f, 0.f, 0.f);
gGL.begin(LLRender::LINES);
gGL.vertex3f(x * 0.1f, y * 0.1f ,0.f);
gGL.vertex3f(x * 0.1f, y * 0.1f, 0.f);
gGL.vertex3f(x, y, 0.f);
gGL.end();
gGL.popMatrix();
@ -363,7 +354,7 @@ void LLWind::renderVectors()
// Used by lltoolselectland
void LLViewerParcelMgr::renderRect(const LLVector3d &west_south_bottom_global,
const LLVector3d &east_north_top_global )
const LLVector3d &east_north_top_global)
{
LLGLSUIDefault gls_ui;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
@ -434,92 +425,6 @@ void LLViewerParcelMgr::renderRect(const LLVector3d &west_south_bottom_global,
LLUI::setLineWidth(1.f);
}
/*
void LLViewerParcelMgr::renderParcel(LLParcel* parcel )
{
S32 i;
S32 count = parcel->getBoxCount();
for (i = 0; i < count; i++)
{
const LLParcelBox& box = parcel->getBox(i);
F32 west = box.mMin.mV[VX];
F32 south = box.mMin.mV[VY];
F32 east = box.mMax.mV[VX];
F32 north = box.mMax.mV[VY];
// HACK: At edge of last region of world, we need to make sure the region
// resolves correctly so we can get a height value.
const F32 FUDGE = 0.01f;
F32 sw_bottom = LLWorld::getInstance()->resolveLandHeightAgent( LLVector3( west, south, 0.f ) );
F32 se_bottom = LLWorld::getInstance()->resolveLandHeightAgent( LLVector3( east-FUDGE, south, 0.f ) );
F32 ne_bottom = LLWorld::getInstance()->resolveLandHeightAgent( LLVector3( east-FUDGE, north-FUDGE, 0.f ) );
F32 nw_bottom = LLWorld::getInstance()->resolveLandHeightAgent( LLVector3( west, north-FUDGE, 0.f ) );
// little hack to make nearby lines not Z-fight
east -= 0.1f;
north -= 0.1f;
F32 sw_top = sw_bottom + POST_HEIGHT;
F32 se_top = se_bottom + POST_HEIGHT;
F32 ne_top = ne_bottom + POST_HEIGHT;
F32 nw_top = nw_bottom + POST_HEIGHT;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLGLDepthTest gls_depth(GL_TRUE);
LLUI::setLineWidth(2.f);
gGL.color4f(0.f, 1.f, 1.f, 1.f);
// Cheat and give this the same pick-name as land
gGL.begin(LLRender::LINES);
gGL.vertex3f(west, north, nw_bottom);
gGL.vertex3f(west, north, nw_top);
gGL.vertex3f(east, north, ne_bottom);
gGL.vertex3f(east, north, ne_top);
gGL.vertex3f(east, south, se_bottom);
gGL.vertex3f(east, south, se_top);
gGL.vertex3f(west, south, sw_bottom);
gGL.vertex3f(west, south, sw_top);
gGL.end();
gGL.color4f(0.f, 1.f, 1.f, 0.2f);
gGL.begin(LLRender::QUADS);
gGL.vertex3f(west, north, nw_bottom);
gGL.vertex3f(west, north, nw_top);
gGL.vertex3f(east, north, ne_top);
gGL.vertex3f(east, north, ne_bottom);
gGL.vertex3f(east, north, ne_bottom);
gGL.vertex3f(east, north, ne_top);
gGL.vertex3f(east, south, se_top);
gGL.vertex3f(east, south, se_bottom);
gGL.vertex3f(east, south, se_bottom);
gGL.vertex3f(east, south, se_top);
gGL.vertex3f(west, south, sw_top);
gGL.vertex3f(west, south, sw_bottom);
gGL.vertex3f(west, south, sw_bottom);
gGL.vertex3f(west, south, sw_top);
gGL.vertex3f(west, north, nw_top);
gGL.vertex3f(west, north, nw_bottom);
gGL.end();
LLUI::setLineWidth(1.f);
}
}
*/
// north = a wall going north/south. Need that info to set up texture
// coordinates correctly.

View File

@ -753,7 +753,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
case IM_NOTHING_SPECIAL: // p2p IM
// Don't show dialog, just do IM
if (!gAgent.isGodlike()
&& gAgent.getRegion()->isPrelude()
&& gAgent.inPrelude()
&& to_id.isNull())
{
// do nothing -- don't distract newbies in

View File

@ -655,6 +655,11 @@ void LLPanelPlaceProfile::updateCovenantText(const std::string &text)
mCovenantText->setText(text);
}
void LLPanelPlaceProfile::updateCovenant(const LLTextBase* source)
{
mCovenantText->copyContents(source);
}
void LLPanelPlaceProfile::onForSaleBannerClick()
{
LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();

View File

@ -31,6 +31,7 @@
class LLAccordionCtrl;
class LLIconCtrl;
class LLTextBase;
class LLTextEditor;
class LLPanelPlaceProfile : public LLPanelPlaceInfo
@ -60,6 +61,7 @@ public:
void updateEstateName(const std::string& name);
void updateEstateOwnerName(const std::string& name);
void updateCovenantText(const std::string &text);
void updateCovenant(const LLTextBase* source);
private:
void onForSaleBannerClick();

View File

@ -28,6 +28,26 @@
#include "llphysicsshapebuilderutil.h"
#include "llmeshrepository.h"
bool LLPhysicsVolumeParams::hasDecomposition() const
{
if (!isMeshSculpt())
{
return false;
}
LLUUID mesh_id = getSculptID();
if (mesh_id.isNull())
{
return false;
}
LLModel::Decomposition* decomp = gMeshRepo.getDecomposition(mesh_id);
return decomp != NULL;
}
/* static */
// <FS:Beq> FIRE-23053 - analysed mesh physics is not correctly displayed for thin meshes
//void LLPhysicsShapeBuilderUtil::determinePhysicsShape( const LLPhysicsVolumeParams& volume_params, const LLVector3& scale, PhysicsShapeSpecification& specOut)
@ -203,35 +223,32 @@ void LLPhysicsShapeBuilderUtil::determinePhysicsShape(const LLPhysicsVolumeParam
{
specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX;
}
// <FS:Beq> restore proper behaviour.
// else if (volume_params.isMeshSculpt() &&
// // Check overall dimensions, not individual triangles.
// (scale.mV[0] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE ||
// scale.mV[1] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE ||
// scale.mV[2] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE
// ) )
// {
// // Server distinguishes between user-specified or default convex mesh, vs server's thin-triangle override, but we don't.
// specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX;
// }
// </FS:Beq>
else if ( volume_params.isSculpt() ) // Is a sculpt of any kind (mesh or legacy)
else if (volume_params.isMeshSculpt())
{
//<FS:Beq> [BUG-134006] Viewer code is not aligned to server code when calculating physics shape for thin objects.
specOut.mType = PhysicsShapeSpecification::INVALID;
// <FS:Beq> FIRE-23053 - add decomp check analysed mesh physics is not correctly displayed for thin meshes
// if (volume_params.isMeshSculpt()){
if ( (volume_params.isMeshSculpt() && !hasDecomp) &&
(scale.mV[0] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE ||
scale.mV[1] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE ||
scale.mV[2] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE
) )
// Check overall dimensions, not individual triangles.
if (scale.mV[0] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE
|| scale.mV[1] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE
|| scale.mV[2] < SHAPE_BUILDER_USER_MESH_CONVEXIFICATION_SIZE
)
{
specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX;
if (volume_params.hasDecomposition())
{
specOut.mType = PhysicsShapeSpecification::USER_MESH;
}
else
{
// Server distinguishes between user-specified or default convex mesh, vs server's thin-triangle override, but we don't.
specOut.mType = PhysicsShapeSpecification::PRIM_CONVEX;
}
}
if (specOut.mType == PhysicsShapeSpecification::INVALID)
//</FS:Beq> note: dangling if....(hopefully this will go away with PR sent to LL)
specOut.mType = volume_params.isMeshSculpt() ? PhysicsShapeSpecification::USER_MESH : PhysicsShapeSpecification::SCULPT;
else
{
specOut.mType = PhysicsShapeSpecification::USER_MESH;
}
}
else if ( volume_params.isSculpt() )
{
specOut.mType = PhysicsShapeSpecification::SCULPT;
}
else // Resort to mesh
{

View File

@ -79,6 +79,8 @@ public:
bool shouldForceConvex() const { return mForceConvex; }
bool hasDecomposition() const;
private:
bool mForceConvex;
};

View File

@ -8539,7 +8539,8 @@ void onCovenantLoadComplete(const LLUUID& asset_uuid,
{
LL_DEBUGS("Messaging") << "onCovenantLoadComplete()" << LL_ENDL;
std::string covenant_text;
if(0 == status)
std::unique_ptr<LLViewerTextEditor> editorp;
if (0 == status)
{
LLFileSystem file(asset_uuid, type, LLFileSystem::READ);
@ -8560,13 +8561,13 @@ void onCovenantLoadComplete(const LLUUID& asset_uuid,
{
LL_WARNS("Messaging") << "Problem importing estate covenant." << LL_ENDL;
covenant_text = "Problem importing estate covenant.";
delete editor;
}
else
{
// Version 0 (just text, doesn't include version number)
covenant_text = editor->getText();
editorp.reset(editor); // Use covenant from editorp;
}
delete editor;
}
else
{
@ -8592,14 +8593,30 @@ void onCovenantLoadComplete(const LLUUID& asset_uuid,
LL_WARNS("Messaging") << "Problem loading notecard: " << status << LL_ENDL;
}
LLPanelEstateCovenant::updateCovenantText(covenant_text, asset_uuid);
LLPanelLandCovenant::updateCovenantText(covenant_text);
LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid);
LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile");
if (panel)
if (editorp)
{
panel->updateCovenantText(covenant_text);
LLPanelEstateCovenant::updateCovenant(editorp.get(), asset_uuid);
LLPanelLandCovenant::updateCovenant(editorp.get());
LLFloaterBuyLand::updateCovenant(editorp.get(), asset_uuid);
}
else
{
LLPanelEstateCovenant::updateCovenantText(covenant_text, asset_uuid);
LLPanelLandCovenant::updateCovenantText(covenant_text);
LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid);
}
if (LLPanelPlaceProfile* panel = LLFloaterSidePanelContainer::getPanel<LLPanelPlaceProfile>("places", "panel_place_profile"))
{
if (editorp)
{
panel->updateCovenant(editorp.get());
}
else
{
panel->updateCovenantText(covenant_text);
}
}
// <FS:Ansariel> Standalone location profile floater
@ -8611,7 +8628,6 @@ void onCovenantLoadComplete(const LLUUID& asset_uuid,
// </FS:Ansariel>
}
void process_feature_disabled_message(LLMessageSystem* msg, void**)
{
// Handle Blacklisted feature simulator response...

View File

@ -219,6 +219,16 @@ public:
mToolTip = inv_item->getName() + '\n' + inv_item->getDescription();
}
/*virtual*/ LLTextSegmentPtr clone(LLTextBase& target) const
{
LLTextEditor* editor = dynamic_cast<LLTextEditor*>(&target);
llassert(editor);
if (!editor)
return nullptr;
return new LLEmbeddedItemSegment(mStart, mImage, mItem, *editor);
}
/*virtual*/ bool getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const
{
if (num_chars == 0)