summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autobuild.xml20
-rw-r--r--indra/llcommon/resultset.cpp14
-rw-r--r--indra/llcommon/resultset.h21
-rw-r--r--indra/llwindow/llgamecontrol.cpp8
-rw-r--r--indra/llwindow/llwindow.cpp4
-rw-r--r--indra/newview/llagentlistener.cpp24
-rw-r--r--indra/newview/llimprocessing.cpp10
-rw-r--r--indra/newview/llimview.cpp13
-rw-r--r--indra/newview/llimview.h4
-rw-r--r--indra/newview/llinventorylistener.cpp40
-rw-r--r--indra/newview/llmaterialeditor.cpp9
-rw-r--r--indra/newview/llselectmgr.cpp27
-rw-r--r--indra/newview/llselectmgr.h2
-rw-r--r--indra/newview/llurldispatcher.cpp2
14 files changed, 109 insertions, 89 deletions
diff --git a/autobuild.xml b/autobuild.xml
index 70d7216486..a508f207d1 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -26,11 +26,11 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>fd6368b53609b078b4ed8816bad1d1de2756f4f2</string>
+ <string>3f2f65cb135cd9d4704371eaf6d973517c372161</string>
<key>hash_algorithm</key>
<string>sha1</string>
<key>url</key>
- <string>https://github.com/secondlife/3p-sdl2/releases/download/v2.28.0/SDL2-2.28.0-darwin64-5991c8f.tar.zst</string>
+ <string>https://github.com/secondlife/3p-sdl2/releases/download/v2.30.8-r1/SDL2-2.30.8-darwin64-11540565100.tar.zst</string>
</map>
<key>name</key>
<string>darwin64</string>
@@ -40,11 +40,11 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>6bbad9b30ee93749e4701313c537d5bac0850e2b</string>
+ <string>27a431140f6f3f12f00b6a38f741fab43caa7708</string>
<key>hash_algorithm</key>
<string>sha1</string>
<key>url</key>
- <string>https://github.com/secondlife/3p-sdl2/releases/download/v2.30.6-r1/SDL2-2.30.6-linux64-10323260130.tar.zst</string>
+ <string>https://github.com/secondlife/3p-sdl2/releases/download/v2.30.8-r1/SDL2-2.30.8-linux64-11540565100.tar.zst</string>
</map>
<key>name</key>
<string>linux64</string>
@@ -54,16 +54,18 @@
<key>archive</key>
<map>
<key>hash</key>
- <string>48e8d971dfa8025353293ead7d41a2a77b004faa</string>
+ <string>f3485e4a02a7e8ba899e17cdc9ff0aaad661fcc1</string>
<key>hash_algorithm</key>
<string>sha1</string>
<key>url</key>
- <string>https://github.com/secondlife/3p-sdl2/releases/download/v2.28.0/SDL2-2.28.0-windows64-5991c8f.tar.zst</string>
+ <string>https://github.com/secondlife/3p-sdl2/releases/download/v2.30.8-r1/SDL2-2.30.8-windows64-11540565100.tar.zst</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
+ <key>version</key>
+ <string>2.30.8</string>
</map>
<key>apr_suite</key>
<map>
@@ -2076,11 +2078,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>archive</key>
<map>
<key>hash</key>
- <string>da16445129cc82d23d01709a912c99fd74388395</string>
+ <string>cbbcf3c5341e4ff4f956c0de960dc238faf20d54</string>
<key>hash_algorithm</key>
<string>sha1</string>
<key>url</key>
- <string>https://github.com/secondlife/3p-open-libndofdev/releases/download/v1.14-r3/open_libndofdev-0.14.10326946482-linux64-10326946482.tar.zst</string>
+ <string>https://github.com/secondlife/3p-open-libndofdev/releases/download/v1.14-r4/open_libndofdev-0.14.11545940352-linux64-11545940352.tar.zst</string>
</map>
<key>name</key>
<string>linux64</string>
@@ -2093,7 +2095,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
<key>copyright</key>
<string>Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com)</string>
<key>version</key>
- <string>0.14.8730039102</string>
+ <string>0.14.11545940352</string>
<key>name</key>
<string>open-libndofdev</string>
<key>description</key>
diff --git a/indra/llcommon/resultset.cpp b/indra/llcommon/resultset.cpp
index 4d7b00eabd..8bdfbec272 100644
--- a/indra/llcommon/resultset.cpp
+++ b/indra/llcommon/resultset.cpp
@@ -61,20 +61,6 @@ LLSD ResultSet::getSlice(int index, int count) const
return getSliceStart(index, count).first;
}
-/*==========================================================================*|
-LLSD ResultSet::getSingle(int index) const
-{
- if (0 <= index && index < getLength())
- {
- return getSingle_(index);
- }
- else
- {
- return {};
- }
-}
-|*==========================================================================*/
-
ResultSet::ResultSet(const std::string& name):
mName(name)
{
diff --git a/indra/llcommon/resultset.h b/indra/llcommon/resultset.h
index 90d52b6fe4..10d84c038f 100644
--- a/indra/llcommon/resultset.h
+++ b/indra/llcommon/resultset.h
@@ -17,6 +17,7 @@
#include "llsd.h"
#include <iosfwd> // std::ostream
#include <utility> // std::pair
+#include <vector>
namespace LL
{
@@ -41,11 +42,6 @@ struct ResultSet: public LLIntTracker<ResultSet>
LLSD getSlice(int index, int count) const;
// Like getSlice(), but also return adjusted start position.
std::pair<LLSD, int> getSliceStart(int index, int count) const;
-/*==========================================================================*|
- // Retrieve LLSD corresponding to a single entry from the result set,
- // with index validation.
- LLSD getSingle(int index) const;
-|*==========================================================================*/
/*---------------- the rest is solely for debug logging ----------------*/
std::string mName;
@@ -54,6 +50,21 @@ struct ResultSet: public LLIntTracker<ResultSet>
virtual ~ResultSet();
};
+// VectorResultSet is for the simple case of a ResultSet managing a single
+// std::vector<T>.
+template <typename T>
+struct VectorResultSet: public ResultSet
+{
+ using super = VectorResultSet<T>;
+
+ VectorResultSet(const std::string& name): ResultSet(name) {}
+ int getLength() const override { return narrow(mVector.size()); }
+ LLSD getSingle(int index) const override { return getSingleFrom(mVector[index]); }
+ virtual LLSD getSingleFrom(const T&) const = 0;
+
+ std::vector<T> mVector;
+};
+
} // namespace LL
std::ostream& operator<<(std::ostream& out, const LL::ResultSet& self);
diff --git a/indra/llwindow/llgamecontrol.cpp b/indra/llwindow/llgamecontrol.cpp
index 9d3c854ca2..67847600e7 100644
--- a/indra/llwindow/llgamecontrol.cpp
+++ b/indra/llwindow/llgamecontrol.cpp
@@ -1530,6 +1530,9 @@ void LLGameControl::init(const std::string& gamecontrollerdb_path,
llassert(saveObject);
llassert(updateUI);
+#ifndef LL_DARWIN
+ // SDL2 is temporarily disabled on Mac, so this needs to be a no-op on that platform
+
int result = SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_SENSOR);
if (result < 0)
{
@@ -1555,6 +1558,7 @@ void LLGameControl::init(const std::string& gamecontrollerdb_path,
LL_INFOS("SDL2") << "Total " << count << " mappings added from " << gamecontrollerdb_path << LL_ENDL;
}
}
+#endif // LL_DARWIN
g_gameControl = LLGameControl::getInstance();
@@ -1614,6 +1618,9 @@ void LLGameControl::clearAllStates()
// static
void LLGameControl::processEvents(bool app_has_focus)
{
+#ifndef LL_DARWIN
+ // SDL2 is temporarily disabled on Mac, so this needs to be a no-op on that platform
+
// This method used by non-linux platforms which only use SDL for GameController input
SDL_Event event;
if (!app_has_focus)
@@ -1631,6 +1638,7 @@ void LLGameControl::processEvents(bool app_has_focus)
{
handleEvent(event, app_has_focus);
}
+#endif // LL_DARWIN
}
void LLGameControl::handleEvent(const SDL_Event& event, bool app_has_focus)
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index 93ac58ca6f..066d29c624 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -416,7 +416,11 @@ LLWindow* LLWindowManager::createWindow(
if (use_gl)
{
+#ifndef LL_DARWIN
+ // SDL2 is temporarily disabled on Mac
init_sdl();
+#endif
+
#if LL_WINDOWS
new_window = new LLWindowWin32(callbacks,
title, name, x, y, width, height, flags,
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 2810cd6706..3d07ead95d 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -729,15 +729,11 @@ void LLAgentListener::getID(LLSD const& event_data)
Response response(llsd::map("id", gAgentID), event_data);
}
-struct AvResultSet : public LL::ResultSet
+struct AvResultSet : public LL::VectorResultSet<LLVOAvatar*>
{
- AvResultSet() : LL::ResultSet("nearby_avatars") {}
- std::vector<LLVOAvatar*> mAvatars;
-
- int getLength() const override { return narrow(mAvatars.size()); }
- LLSD getSingle(int index) const override
+ AvResultSet() : super("nearby_avatars") {}
+ LLSD getSingleFrom(LLVOAvatar* const& av) const override
{
- auto av = mAvatars[index];
LLAvatarName av_name;
LLAvatarNameCache::get(av->getID(), &av_name);
LLVector3 region_pos = av->getCharacterPosition();
@@ -749,15 +745,11 @@ struct AvResultSet : public LL::ResultSet
}
};
-struct ObjResultSet : public LL::ResultSet
+struct ObjResultSet : public LL::VectorResultSet<LLViewerObject*>
{
- ObjResultSet() : LL::ResultSet("nearby_objects") {}
- std::vector<LLViewerObject*> mObjects;
-
- int getLength() const override { return narrow(mObjects.size()); }
- LLSD getSingle(int index) const override
+ ObjResultSet() : super("nearby_objects") {}
+ LLSD getSingleFrom(LLViewerObject* const& obj) const override
{
- auto obj = mObjects[index];
return llsd::map("id", obj->getID(),
"global_pos", ll_sd_from_vector3d(obj->getPositionGlobal()),
"region_pos", ll_sd_from_vector3(obj->getPositionRegion()),
@@ -791,7 +783,7 @@ void LLAgentListener::getNearbyAvatarsList(LLSD const& event_data)
{
if ((dist_vec_squared(avatar->getPositionGlobal(), agent_pos) <= radius))
{
- avresult->mAvatars.push_back(avatar);
+ avresult->mVector.push_back(avatar);
}
}
}
@@ -813,7 +805,7 @@ void LLAgentListener::getNearbyObjectsList(LLSD const& event_data)
{
if ((dist_vec_squared(object->getPositionGlobal(), agent_pos) <= radius))
{
- objresult->mObjects.push_back(object);
+ objresult->mVector.push_back(object);
}
}
}
diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index f5b149335b..e050fb77e0 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -603,12 +603,13 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
}
}
+ std::string real_name;
+
if (!notice_name.empty())
{ // The simulator has injected some sort of notice into the conversation.
// findString will only replace the contents of buffer if the notice_id is found.
LLTrans::findString(buffer, notice_name, notice_args);
- name = SYSTEM_FROM;
- from_id = LLUUID::null;
+ real_name = SYSTEM_FROM;
}
gIMMgr->addMessage(session_id,
@@ -622,8 +623,9 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
region_id,
position,
region_message,
- timestamp);
-
+ timestamp,
+ LLUUID::null,
+ real_name);
}
else
{
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 8a54267292..beb32dd6fb 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -3143,9 +3143,16 @@ void LLIMMgr::addMessage(
const LLUUID& region_id,
const LLVector3& position,
bool is_region_msg,
- U32 timestamp) // May be zero
+ U32 timestamp, // May be zero
+ LLUUID display_id,
+ std::string_view display_name)
{
LLUUID other_participant_id = target_id;
+ std::string message_display_name = (display_name.empty()) ? from : std::string(display_name);
+ if (display_id.isNull() && (display_name.empty()))
+ {
+ display_id = other_participant_id;
+ }
LLUUID new_session_id = session_id;
if (new_session_id.isNull())
@@ -3241,7 +3248,7 @@ void LLIMMgr::addMessage(
}
//Play sound for new conversations
- if (!skip_message & !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation")))
+ if (!skip_message && !gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNewConversation")))
{
make_ui_sound("UISndNewIncomingIMSession");
}
@@ -3255,7 +3262,7 @@ void LLIMMgr::addMessage(
if (!LLMuteList::getInstance()->isMuted(other_participant_id, LLMute::flagTextChat) && !skip_message)
{
- LLIMModel::instance().addMessage(new_session_id, from, other_participant_id, msg, true, is_region_msg, timestamp);
+ LLIMModel::instance().addMessage(new_session_id, message_display_name, display_id, msg, true, is_region_msg, timestamp);
}
// Open conversation floater if offline messages are present
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 233fb075e8..162a8d93dd 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -368,7 +368,9 @@ public:
const LLUUID& region_id = LLUUID::null,
const LLVector3& position = LLVector3::zero,
bool is_region_msg = false,
- U32 timestamp = 0);
+ U32 timestamp = 0,
+ LLUUID display_id = LLUUID::null,
+ std::string_view display_name = "");
void addSystemMessage(const LLUUID& session_id, const std::string& message_name, const LLSD& args);
diff --git a/indra/newview/llinventorylistener.cpp b/indra/newview/llinventorylistener.cpp
index 88b07c0b0b..13ca12a69a 100644
--- a/indra/newview/llinventorylistener.cpp
+++ b/indra/newview/llinventorylistener.cpp
@@ -107,15 +107,11 @@ LLInventoryListener::LLInventoryListener()
// This struct captures (possibly large) category results from
// getDirectDescendants() and collectDescendantsIf().
-struct CatResultSet: public LL::ResultSet
+struct CatResultSet: public LL::VectorResultSet<LLInventoryModel::cat_array_t::value_type>
{
- CatResultSet(): LL::ResultSet("categories") {}
- LLInventoryModel::cat_array_t mCategories;
-
- int getLength() const override { return narrow(mCategories.size()); }
- LLSD getSingle(int index) const override
+ CatResultSet(): super("categories") {}
+ LLSD getSingleFrom(const LLPointer<LLViewerInventoryCategory>& cat) const override
{
- auto cat = mCategories[index];
return llsd::map("id", cat->getUUID(),
"name", cat->getName(),
"parent_id", cat->getParentUUID(),
@@ -125,15 +121,11 @@ struct CatResultSet: public LL::ResultSet
// This struct captures (possibly large) item results from
// getDirectDescendants() and collectDescendantsIf().
-struct ItemResultSet: public LL::ResultSet
+struct ItemResultSet: public LL::VectorResultSet<LLInventoryModel::item_array_t::value_type>
{
- ItemResultSet(): LL::ResultSet("items") {}
- LLInventoryModel::item_array_t mItems;
-
- int getLength() const override { return narrow(mItems.size()); }
- LLSD getSingle(int index) const override
+ ItemResultSet(): super("items") {}
+ LLSD getSingleFrom(const LLPointer<LLViewerInventoryItem>& item) const override
{
- auto item = mItems[index];
return llsd::map("id", item->getUUID(),
"name", item->getName(),
"parent_id", item->getParentUUID(),
@@ -160,14 +152,14 @@ void LLInventoryListener::getItemsInfo(LLSD const &data)
LLViewerInventoryItem* item = gInventory.getItem(it);
if (item)
{
- itemresult->mItems.push_back(item);
+ itemresult->mVector.push_back(item);
}
else
{
LLViewerInventoryCategory *cat = gInventory.getCategory(it);
if (cat)
{
- catresult->mCategories.push_back(cat);
+ catresult->mVector.push_back(cat);
}
}
}
@@ -202,8 +194,8 @@ void LLInventoryListener::getDirectDescendants(LLSD const &data)
auto catresult = new CatResultSet;
auto itemresult = new ItemResultSet;
- catresult->mCategories = *cats;
- itemresult->mItems = *items;
+ catresult->mVector = *cats;
+ itemresult->mVector = *items;
response["categories"] = catresult->getKeyLength();
response["items"] = itemresult->getKeyLength();
@@ -260,8 +252,8 @@ void LLInventoryListener::collectDescendantsIf(LLSD const &data)
// collectDescendentsIf() method so it doesn't steal too many cycles.
gInventory.collectDescendentsIf(
folder_id,
- catresult->mCategories,
- itemresult->mItems,
+ catresult->mVector,
+ itemresult->mVector,
LLInventoryModel::EXCLUDE_TRASH,
collector);
@@ -269,14 +261,6 @@ void LLInventoryListener::collectDescendantsIf(LLSD const &data)
response["items"] = itemresult->getKeyLength();
}
-/*==========================================================================*|
-void LLInventoryListener::getSingle(LLSD const& data)
-{
- auto result = LL::ResultSet::getInstance(data["result"]);
- sendReply(llsd::map("single", result->getSingle(data["index"])), data);
-}
-|*==========================================================================*/
-
void LLInventoryListener::getSlice(LLSD const& data)
{
auto result = LL::ResultSet::getInstance(data["result"]);
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp
index b5e494379d..dc7511b642 100644
--- a/indra/newview/llmaterialeditor.cpp
+++ b/indra/newview/llmaterialeditor.cpp
@@ -3177,14 +3177,7 @@ void LLMaterialEditor::applyToSelection()
{
LL_WARNS("MaterialEditor") << "Not connected to materials capable region, missing ModifyMaterialParams cap" << LL_ENDL;
- // Fallback local preview. Will be removed once override systems is finished and new cap is deployed everywhere.
- LLPointer<LLFetchedGLTFMaterial> mat = new LLFetchedGLTFMaterial();
- getGLTFMaterial(mat);
- static const LLUUID placeholder("984e183e-7811-4b05-a502-d79c6f978a98");
- gGLTFMaterialList.addMaterial(placeholder, mat);
- LLRenderMaterialFunctor mat_func(placeholder);
- LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
- selected_objects->applyToTEs(&mat_func);
+ LLNotificationsUtil::add("MissingMaterialCaps");
}
}
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 51da051340..d0347c7abf 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -3133,6 +3133,8 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
F32 scale_x = 1;
F32 scale_y = 1;
+ F32 offset_x = 0;
+ F32 offset_y = 0;
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
{
@@ -3149,6 +3151,21 @@ void LLSelectMgr::adjustTexturesByScale(bool send_to_sim, bool stretch)
scale_y = scale_ratio.mV[t_axis] * object_scale.mV[t_axis];
}
material->mTextureTransform[i].mScale.set(scale_x, scale_y);
+
+ LLVector2 scales = selectNode->mGLTFScales[te_num][i];
+ LLVector2 offsets = selectNode->mGLTFOffsets[te_num][i];
+ F64 int_part = 0;
+ offset_x = (F32)modf((offsets[VX] + (scales[VX] - scale_x)) / 2, &int_part);
+ if (offset_x < 0)
+ {
+ offset_x++;
+ }
+ offset_y = (F32)modf((offsets[VY] + (scales[VY] - scale_y)) / 2, &int_part);
+ if (offset_y < 0)
+ {
+ offset_y++;
+ }
+ material->mTextureTransform[i].mOffset.set(offset_x, offset_y);
}
LLFetchedGLTFMaterial* render_mat = (LLFetchedGLTFMaterial*)tep->getGLTFRenderMaterial();
@@ -6888,6 +6905,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
{
mTextureScaleRatios.clear();
mGLTFScaleRatios.clear();
+ mGLTFScales.clear();
+ mGLTFOffsets.clear();
if (mObject.notNull())
{
@@ -6928,6 +6947,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
F32 scale_x = 1;
F32 scale_y = 1;
std::vector<LLVector3> material_v_vec;
+ std::vector<LLVector2> material_scales_vec;
+ std::vector<LLVector2> material_offset_vec;
for (U32 i = 0; i < LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT; ++i)
{
if (material)
@@ -6935,12 +6956,16 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
LLGLTFMaterial::TextureTransform& transform = material->mTextureTransform[i];
scale_x = transform.mScale[VX];
scale_y = transform.mScale[VY];
+ material_scales_vec.push_back(transform.mScale);
+ material_offset_vec.push_back(transform.mOffset);
}
else
{
// Not having an override doesn't mean that there is no material
scale_x = 1;
scale_y = 1;
+ material_scales_vec.emplace_back(scale_x, scale_y);
+ material_offset_vec.emplace_back(0.f, 0.f);
}
if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR)
@@ -6956,6 +6981,8 @@ void LLSelectNode::saveTextureScaleRatios(LLRender::eTexIndex index_to_query)
material_v_vec.push_back(material_v);
}
mGLTFScaleRatios.push_back(material_v_vec);
+ mGLTFScales.push_back(material_scales_vec);
+ mGLTFOffsets.push_back(material_offset_vec);
}
}
}
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index f8242675dc..f2b1e691b5 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -240,6 +240,8 @@ public:
gltf_materials_vec_t mSavedGLTFOverrideMaterials;
std::vector<LLVector3> mTextureScaleRatios;
std::vector< std::vector<LLVector3> > mGLTFScaleRatios;
+ std::vector< std::vector<LLVector2> > mGLTFScales;
+ std::vector< std::vector<LLVector2> > mGLTFOffsets;
std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object
std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object
bool mSilhouetteExists; // need to generate silhouette?
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index 166542324d..647210b7e6 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -306,7 +306,7 @@ public:
if (tokens.size() < 1) return false;
LLVector3 coords(128, 128, 0);
- if (tokens.size() <= 4)
+ if (tokens.size() >= 3) // Require at least [1] and [2]
{
coords = LLVector3((F32)tokens[1].asReal(),
(F32)tokens[2].asReal(),