merge changes for latest viewer-development
commit
8bfd3201de
13
.hgtags
13
.hgtags
|
|
@ -121,11 +121,22 @@ e67da2c6e3125966dd49eef98b36317afac1fcfe 2.6.9-start
|
|||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef DRTVWR-55_2.6.8-beta1
|
||||
beafa8a9bd1d1b670b7523d865204dc4a4b38eef 2.6.8-beta1
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-57_2.6.9-beta1
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-beta1
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb DRTVWR-54_2.6.8-release
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-beta1
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 DRTVWR-56_2.6.9-release
|
||||
8835e0e3c0d3a48244c287bc05811dfc2fba43ec 2.7.0-start
|
||||
77e5a08344c95738ab879f9671b7758cddd712a3 2.6.9-release
|
||||
54fd44ac92e4c61435ea33effe093a3527e18d98 2.7.1-start
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb DRTVWR-54_2.6.8-release
|
||||
be2000b946f8cb3de5f44b2d419287d4c48ec4eb 2.6.8-release
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d DRTVWR-51_2.6.6-release
|
||||
dac76a711da5f1489a01c1fa62ec97d99c25736d 2.6.6-release
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 DRTVWR-46_2.6.3-release
|
||||
8f2da1701c81a62352df2b8d413d27fb2cade9a6 2.6.3-release
|
||||
43c7ee846b7eed80786acbbf35d03bd016a3e85d DRTVWR-59_2.7.0-beta1
|
||||
43c7ee846b7eed80786acbbf35d03bd016a3e85d 2.7.0-beta1
|
||||
|
|
|
|||
20
BuildParams
20
BuildParams
|
|
@ -142,24 +142,12 @@ gooey.viewer_grid = agni
|
|||
gooey.build_viewer_update_version_manager = false
|
||||
|
||||
# ========================================
|
||||
# Display Names project
|
||||
# Search Project
|
||||
# ========================================
|
||||
|
||||
#viewer-identity-evolution.email = leyla@lindenlab.com
|
||||
viewer-identity.build_Debug = false
|
||||
viewer-identity.build_RelWithDebInfo = false
|
||||
viewer-identity.build_viewer = true
|
||||
viewer-identity.build_server = false
|
||||
viewer-identity.build_server_tests = false
|
||||
viewer-identity.build_Linux = true
|
||||
viewer-identity.build_hg_bundle = true
|
||||
viewer-identity.bulld_docs = true
|
||||
viewer-identity.viewer_channel = "Second Life Project Viewer"
|
||||
viewer-identity.login_channel = "Second Life Project Viewer"
|
||||
viewer-identity.viewer_grid = aditi
|
||||
viewer-identity.build_viewer_update_version_manager = false
|
||||
|
||||
|
||||
search_project-viewer.build_debug_release_separately = true
|
||||
search_project-viewer.viewer_channel = "Second Life Project Viewer - Search"
|
||||
search_project-viewer.login_channel = "Second Life Project Viewer - Search"
|
||||
|
||||
# ========================================
|
||||
# palange
|
||||
|
|
|
|||
4982
autobuild.xml
4982
autobuild.xml
File diff suppressed because it is too large
Load Diff
|
|
@ -115,6 +115,7 @@ set(llcommon_HEADER_FILES
|
|||
indra_constants.h
|
||||
linden_common.h
|
||||
linked_lists.h
|
||||
llaccountingquota.h
|
||||
llallocator.h
|
||||
llallocator_heap_profile.h
|
||||
llagentconstants.h
|
||||
|
|
|
|||
|
|
@ -0,0 +1,78 @@
|
|||
/**
|
||||
* @file llaccountingquota.h
|
||||
* @
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, 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://secondlifegrid.net/programs/open_source/licensing/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://secondlifegrid.net/programs/open_source/licensing/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_ACCOUNTINGQUOTA_H
|
||||
#define LL_ACCOUNTINGQUOTA_H
|
||||
|
||||
struct ParcelQuota
|
||||
{
|
||||
ParcelQuota( F32 ownerRenderCost, F32 ownerPhysicsCost, F32 ownerNetworkCost, F32 ownerSimulationCost,
|
||||
F32 groupRenderCost, F32 groupPhysicsCost, F32 groupNetworkCost, F32 groupSimulationCost,
|
||||
F32 otherRenderCost, F32 otherPhysicsCost, F32 otherNetworkCost, F32 otherSimulationCost,
|
||||
F32 totalRenderCost, F32 totalPhysicsCost, F32 totalNetworkCost, F32 totalSimulationCost)
|
||||
: mOwnerRenderCost( ownerRenderCost ), mOwnerPhysicsCost( ownerPhysicsCost )
|
||||
, mOwnerNetworkCost( ownerNetworkCost ), mOwnerSimulationCost( ownerSimulationCost )
|
||||
, mGroupRenderCost( groupRenderCost ), mGroupPhysicsCost( groupPhysicsCost )
|
||||
, mGroupNetworkCost( groupNetworkCost ), mGroupSimulationCost( groupSimulationCost )
|
||||
, mOtherRenderCost( otherRenderCost ), mOtherPhysicsCost( otherPhysicsCost )
|
||||
, mOtherNetworkCost( otherNetworkCost ), mOtherSimulationCost( otherSimulationCost )
|
||||
, mTotalRenderCost( totalRenderCost ), mTotalPhysicsCost( totalPhysicsCost )
|
||||
, mTotalNetworkCost( totalNetworkCost ), mTotalSimulationCost( totalSimulationCost )
|
||||
{
|
||||
}
|
||||
ParcelQuota(){}
|
||||
F32 mOwnerRenderCost, mOwnerPhysicsCost, mOwnerNetworkCost, mOwnerSimulationCost;
|
||||
F32 mGroupRenderCost, mGroupPhysicsCost, mGroupNetworkCost, mGroupSimulationCost;
|
||||
F32 mOtherRenderCost, mOtherPhysicsCost, mOtherNetworkCost, mOtherSimulationCost;
|
||||
F32 mTotalRenderCost, mTotalPhysicsCost, mTotalNetworkCost, mTotalSimulationCost;
|
||||
};
|
||||
|
||||
struct SelectionQuota
|
||||
{
|
||||
SelectionQuota( S32 localId, F32 renderCost, F32 physicsCost, F32 networkCost, F32 simulationCost )
|
||||
: mLocalId( localId)
|
||||
, mRenderCost( renderCost )
|
||||
, mPhysicsCost( physicsCost )
|
||||
, mNetworkCost( networkCost )
|
||||
, mSimulationCost( simulationCost )
|
||||
{
|
||||
}
|
||||
SelectionQuota() {}
|
||||
|
||||
F32 mRenderCost, mPhysicsCost, mNetworkCost, mSimulationCost;
|
||||
S32 mLocalId;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
|
@ -49,7 +49,8 @@ typedef enum e_chat_type
|
|||
CHAT_TYPE_STOP = 5,
|
||||
CHAT_TYPE_DEBUG_MSG = 6,
|
||||
CHAT_TYPE_REGION = 7,
|
||||
CHAT_TYPE_OWNER = 8
|
||||
CHAT_TYPE_OWNER = 8,
|
||||
CHAT_TYPE_DIRECT = 9 // From llRegionSayTo()
|
||||
} EChatType;
|
||||
|
||||
typedef enum e_chat_audible_level
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
|
||||
const S32 LL_VERSION_MAJOR = 2;
|
||||
const S32 LL_VERSION_MINOR = 7;
|
||||
const S32 LL_VERSION_PATCH = 1;
|
||||
const S32 LL_VERSION_PATCH = 2;
|
||||
const S32 LL_VERSION_BUILD = 0;
|
||||
|
||||
const char * const LL_CHANNEL = "Second Life Developer";
|
||||
|
|
|
|||
|
|
@ -1348,3 +1348,12 @@ LLParcel::ECategory category_ui_string_to_category(const std::string& s)
|
|||
// is a distinct option from "None" and "Other"
|
||||
return LLParcel::C_ANY;
|
||||
}
|
||||
|
||||
void LLParcel::updateQuota( const LLUUID& objectId, const ParcelQuota& quota )
|
||||
{
|
||||
if ( mID == objectId )
|
||||
{
|
||||
mQuota = quota;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
#include "llpermissions.h"
|
||||
#include "lltimer.h"
|
||||
#include "v3math.h"
|
||||
|
||||
#include "llaccountingquota.h"
|
||||
|
||||
// Grid out of which parcels taken is stepped every 4 meters.
|
||||
const F32 PARCEL_GRID_STEP_METERS = 4.f;
|
||||
|
|
@ -586,7 +586,11 @@ public:
|
|||
LLUUID getPreviousOwnerID() const { return mPreviousOwnerID; }
|
||||
BOOL getPreviouslyGroupOwned() const { return mPreviouslyGroupOwned; }
|
||||
BOOL getSellWithObjects() const { return (mParcelFlags & PF_SELL_PARCEL_OBJECTS) ? TRUE : FALSE; }
|
||||
|
||||
|
||||
|
||||
void updateQuota( const LLUUID& objectId, const ParcelQuota& quota );
|
||||
const ParcelQuota& getQuota( void ) { return mQuota; }
|
||||
|
||||
protected:
|
||||
LLUUID mID;
|
||||
LLUUID mOwnerID;
|
||||
|
|
@ -657,8 +661,9 @@ protected:
|
|||
BOOL mRegionPushOverride;
|
||||
BOOL mRegionDenyAnonymousOverride;
|
||||
BOOL mRegionDenyAgeUnverifiedOverride;
|
||||
|
||||
|
||||
|
||||
ParcelQuota mQuota;
|
||||
|
||||
public:
|
||||
// HACK, make private
|
||||
S32 mLocalID;
|
||||
|
|
|
|||
|
|
@ -991,6 +991,9 @@ void LLModel::normalizeVolumeFaces()
|
|||
scale.splat(1.f);
|
||||
scale.div(size);
|
||||
|
||||
LLVector4a inv_scale(1.f);
|
||||
inv_scale.div(scale);
|
||||
|
||||
for (U32 i = 0; i < mVolumeFaces.size(); ++i)
|
||||
{
|
||||
LLVolumeFace& face = mVolumeFaces[i];
|
||||
|
|
@ -1007,10 +1010,14 @@ void LLModel::normalizeVolumeFaces()
|
|||
// For all the positions, we scale
|
||||
// the positions to fit within the unit cube.
|
||||
LLVector4a* pos = (LLVector4a*) face.mPositions;
|
||||
LLVector4a* norm = (LLVector4a*) face.mNormals;
|
||||
|
||||
for (U32 j = 0; j < face.mNumVertices; ++j)
|
||||
{
|
||||
pos[j].add(trans);
|
||||
pos[j].mul(scale);
|
||||
norm[j].mul(inv_scale);
|
||||
norm[j].normalize3();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -328,6 +328,7 @@ LLGLManager::LLGLManager() :
|
|||
mHasShaderObjects(FALSE),
|
||||
mHasVertexShader(FALSE),
|
||||
mHasFragmentShader(FALSE),
|
||||
mNumTextureImageUnits(0),
|
||||
mHasOcclusionQuery(FALSE),
|
||||
mHasOcclusionQuery2(FALSE),
|
||||
mHasPointParameters(FALSE),
|
||||
|
|
@ -534,6 +535,13 @@ bool LLGLManager::initGL()
|
|||
return false;
|
||||
}
|
||||
|
||||
if (mHasFragmentShader)
|
||||
{
|
||||
GLint num_tex_image_units;
|
||||
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units);
|
||||
mNumTextureImageUnits = num_tex_image_units;
|
||||
}
|
||||
|
||||
setToDebugGPU();
|
||||
|
||||
initGLStates();
|
||||
|
|
@ -878,11 +886,13 @@ void LLGLManager::initExtensions()
|
|||
LL_INFOS("RenderInit") << "Disabling mip-map generation for Intel GPUs" << LL_ENDL;
|
||||
mHasMipMapGeneration = FALSE;
|
||||
}
|
||||
#if !LL_DARWIN
|
||||
if (mIsATI && mHasMipMapGeneration)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Disabling mip-map generation for ATI GPUs (performance opt)" << LL_ENDL;
|
||||
mHasMipMapGeneration = FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Misc
|
||||
glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ public:
|
|||
BOOL mHasShaderObjects;
|
||||
BOOL mHasVertexShader;
|
||||
BOOL mHasFragmentShader;
|
||||
S32 mNumTextureImageUnits;
|
||||
BOOL mHasOcclusionQuery;
|
||||
BOOL mHasOcclusionQuery2;
|
||||
BOOL mHasPointParameters;
|
||||
|
|
|
|||
|
|
@ -119,14 +119,29 @@ void LLTexUnit::refreshState(void)
|
|||
gGL.flush();
|
||||
|
||||
glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
|
||||
|
||||
//
|
||||
// Per apple spec, don't call glEnable/glDisable when index exceeds max texture units
|
||||
// http://www.mailinglistarchive.com/html/mac-opengl@lists.apple.com/2008-07/msg00653.html
|
||||
//
|
||||
bool enableDisable = (mIndex < gGLManager.mNumTextureUnits);
|
||||
|
||||
if (mCurrTexType != TT_NONE)
|
||||
{
|
||||
glEnable(sGLTextureType[mCurrTexType]);
|
||||
if (enableDisable)
|
||||
{
|
||||
glEnable(sGLTextureType[mCurrTexType]);
|
||||
}
|
||||
|
||||
glBindTexture(sGLTextureType[mCurrTexType], mCurrTexture);
|
||||
}
|
||||
else
|
||||
{
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
if (enableDisable)
|
||||
{
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
}
|
||||
|
||||
|
|
@ -167,7 +182,11 @@ void LLTexUnit::enable(eTextureType type)
|
|||
mCurrTexType = type;
|
||||
|
||||
gGL.flush();
|
||||
glEnable(sGLTextureType[type]);
|
||||
|
||||
if (mIndex < gGLManager.mNumTextureUnits)
|
||||
{
|
||||
glEnable(sGLTextureType[type]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -180,7 +199,12 @@ void LLTexUnit::disable(void)
|
|||
activate();
|
||||
unbind(mCurrTexType);
|
||||
gGL.flush();
|
||||
glDisable(sGLTextureType[mCurrTexType]);
|
||||
|
||||
if (mIndex < gGLManager.mNumTextureUnits)
|
||||
{
|
||||
glDisable(sGLTextureType[mCurrTexType]);
|
||||
}
|
||||
|
||||
mCurrTexType = TT_NONE;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ void check_framebuffer_status()
|
|||
case GL_FRAMEBUFFER_COMPLETE:
|
||||
break;
|
||||
default:
|
||||
llwarns << "check_framebuffer_status failed -- " << std::hex << status << llendl;
|
||||
ll_fail("check_framebuffer_status failed");
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -258,38 +258,6 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma
|
|||
return (file_count);
|
||||
}
|
||||
|
||||
S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask)
|
||||
{
|
||||
glob_t g;
|
||||
S32 result = 0;
|
||||
|
||||
std::string tmp_str;
|
||||
tmp_str = dirname;
|
||||
tmp_str += mask;
|
||||
|
||||
if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0)
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i = 0; i < g.gl_pathc; i++)
|
||||
{
|
||||
// llinfos << "deleteFilesInDir: deleting number " << i << ", path is " << g.gl_pathv[i] << llendl;
|
||||
|
||||
if(unlink(g.gl_pathv[i]) != 0)
|
||||
{
|
||||
result = errno;
|
||||
|
||||
llwarns << "Problem removing " << g.gl_pathv[i] << " - errorcode: "
|
||||
<< result << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
globfree(&g);
|
||||
}
|
||||
|
||||
return(result);
|
||||
}
|
||||
|
||||
std::string LLDir_Mac::getCurPath()
|
||||
{
|
||||
char tmp_str[LL_MAX_PATH]; /* Flawfinder: ignore */
|
||||
|
|
|
|||
|
|
@ -44,7 +44,6 @@ public:
|
|||
/*virtual*/ void initAppDirs(const std::string &app_name,
|
||||
const std::string& app_read_only_data_dir);
|
||||
|
||||
virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask);
|
||||
virtual std::string getCurPath();
|
||||
virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask);
|
||||
virtual BOOL fileExists(const std::string &filename) const;
|
||||
|
|
|
|||
|
|
@ -46,5 +46,28 @@ MASK LLKeyboardHeadless::currentMask(BOOL for_mouse_event)
|
|||
{ return MASK_NONE; }
|
||||
|
||||
void LLKeyboardHeadless::scanKeyboard()
|
||||
{ }
|
||||
{
|
||||
for (S32 key = 0; key < KEY_COUNT; key++)
|
||||
{
|
||||
// Generate callback if any event has occurred on this key this frame.
|
||||
// Can't just test mKeyLevel, because this could be a slow frame and
|
||||
// key might have gone down then up. JC
|
||||
if (mKeyLevel[key] || mKeyDown[key] || mKeyUp[key])
|
||||
{
|
||||
mCurScanKey = key;
|
||||
mCallbacks->handleScanKey(key, mKeyDown[key], mKeyUp[key], mKeyLevel[key]);
|
||||
}
|
||||
}
|
||||
|
||||
// Reset edges for next frame
|
||||
for (S32 key = 0; key < KEY_COUNT; key++)
|
||||
{
|
||||
mKeyUp[key] = FALSE;
|
||||
mKeyDown[key] = FALSE;
|
||||
if (mKeyLevel[key])
|
||||
{
|
||||
mKeyLevelFrameCount[key]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -461,6 +461,9 @@ void LLScriptLibrary::init()
|
|||
addFunction(10.f, 0.f, dummy_func, "llGetDisplayName", "s", "k");
|
||||
addFunction(10.f, 0.f, dummy_func, "llRequestDisplayName", "k", "k");
|
||||
|
||||
addFunction(10.f, 0.f, dummy_func, "llGetEnv", "s", "s");
|
||||
addFunction(10.f, 0.f, dummy_func, "llRegionSayTo", NULL, "kis");
|
||||
|
||||
// energy, sleep, dummy_func, name, return type, parameters, help text, gods-only
|
||||
|
||||
// IF YOU ADD NEW SCRIPT CALLS, YOU MUST PUT THEM AT THE END OF THIS LIST.
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ include_directories(
|
|||
|
||||
set(viewer_SOURCE_FILES
|
||||
groupchatlistener.cpp
|
||||
llaccountingquotamanager.cpp
|
||||
llagent.cpp
|
||||
llagentaccess.cpp
|
||||
llagentcamera.cpp
|
||||
|
|
@ -249,6 +250,7 @@ set(viewer_SOURCE_FILES
|
|||
llfolderviewitem.cpp
|
||||
llfollowcam.cpp
|
||||
llfriendcard.cpp
|
||||
llgesturelistener.cpp
|
||||
llgesturemgr.cpp
|
||||
llgiveinventory.cpp
|
||||
llglsandbox.cpp
|
||||
|
|
@ -326,6 +328,7 @@ set(viewer_SOURCE_FILES
|
|||
llnearbychat.cpp
|
||||
llnearbychatbar.cpp
|
||||
llnearbychathandler.cpp
|
||||
llnearbychatbarlistener.cpp
|
||||
llnetmap.cpp
|
||||
llnotificationalerthandler.cpp
|
||||
llnotificationgrouphandler.cpp
|
||||
|
|
@ -633,6 +636,7 @@ set(viewer_HEADER_FILES
|
|||
CMakeLists.txt
|
||||
ViewerInstall.cmake
|
||||
groupchatlistener.h
|
||||
llaccountingquotamanager.h
|
||||
llagent.h
|
||||
llagentaccess.h
|
||||
llagentcamera.h
|
||||
|
|
@ -807,6 +811,7 @@ set(viewer_HEADER_FILES
|
|||
llfolderviewitem.h
|
||||
llfollowcam.h
|
||||
llfriendcard.h
|
||||
llgesturelistener.h
|
||||
llgesturemgr.h
|
||||
llgiveinventory.h
|
||||
llgroupactions.h
|
||||
|
|
@ -883,6 +888,7 @@ set(viewer_HEADER_FILES
|
|||
llnearbychat.h
|
||||
llnearbychatbar.h
|
||||
llnearbychathandler.h
|
||||
llnearbychatbarlistener.h
|
||||
llnetmap.h
|
||||
llnotificationhandler.h
|
||||
llnotificationmanager.h
|
||||
|
|
|
|||
|
|
@ -3980,7 +3980,7 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
<string>http://search-beta.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string>
|
||||
</map>
|
||||
<key>WebProfileURL</key>
|
||||
<map>
|
||||
|
|
@ -12760,6 +12760,17 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>SLURLPassToOtherInstance</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Pass execution to prevoius viewer instances if there is a given slurl</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>soundsbeacon</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
|
|||
//get distance
|
||||
float d = length(lv);
|
||||
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
float da = 0.0;
|
||||
|
||||
if (d > 0.0 && la > 0.0 && fa > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
}
|
||||
|
||||
return da;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -36,19 +36,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
|
|||
//get distance
|
||||
float d = length(lv);
|
||||
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
float da = 0.0;
|
||||
|
||||
if (d > 0.0 && la > 0.0 && fa > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
}
|
||||
|
||||
return da;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
|
|||
//get distance
|
||||
float d = length(lv);
|
||||
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
float da = 0.0;
|
||||
|
||||
if (d > 0.0 && la > 0.0 && fa > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
}
|
||||
|
||||
return da;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,8 +23,9 @@ uniform float sun_wash;
|
|||
|
||||
uniform int light_count;
|
||||
|
||||
uniform vec4 light[16];
|
||||
uniform vec4 light_col[16];
|
||||
#define MAX_LIGHT_COUNT 16
|
||||
uniform vec4 light[MAX_LIGHT_COUNT];
|
||||
uniform vec4 light_col[MAX_LIGHT_COUNT];
|
||||
|
||||
varying vec4 vary_fragcoord;
|
||||
uniform vec2 screen_res;
|
||||
|
|
@ -63,50 +64,56 @@ void main()
|
|||
float noise = texture2D(noiseMap, frag.xy/128.0).b;
|
||||
vec3 out_col = vec3(0,0,0);
|
||||
vec3 npos = normalize(-pos);
|
||||
|
||||
for (int i = 0; i < light_count; ++i)
|
||||
|
||||
// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
|
||||
for (int i = 0; i < MAX_LIGHT_COUNT; ++i)
|
||||
{
|
||||
bool light_contrib = (i < light_count);
|
||||
|
||||
vec3 lv = light[i].xyz-pos;
|
||||
float dist2 = dot(lv,lv);
|
||||
dist2 /= light[i].w;
|
||||
if (dist2 > 1.0)
|
||||
{
|
||||
continue;
|
||||
light_contrib = false;
|
||||
}
|
||||
|
||||
float da = dot(norm, lv);
|
||||
if (da < 0.0)
|
||||
{
|
||||
continue;
|
||||
light_contrib = false;
|
||||
}
|
||||
|
||||
lv = normalize(lv);
|
||||
da = dot(norm, lv);
|
||||
|
||||
float fa = light_col[i].a+1.0;
|
||||
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
dist_atten *= noise;
|
||||
|
||||
float lit = da * dist_atten;
|
||||
|
||||
vec3 col = light_col[i].rgb*lit*diff;
|
||||
//vec3 col = vec3(dist2, light_col[i].a, lit);
|
||||
|
||||
if (spec.a > 0.0)
|
||||
if (light_contrib)
|
||||
{
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
lv = normalize(lv);
|
||||
da = dot(norm, lv);
|
||||
|
||||
float fa = light_col[i].a+1.0;
|
||||
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
dist_atten *= noise;
|
||||
|
||||
float lit = da * dist_atten;
|
||||
|
||||
float sa = dot(normalize(lv+npos),norm);
|
||||
vec3 col = light_col[i].rgb*lit*diff;
|
||||
//vec3 col = vec3(dist2, light_col[i].a, lit);
|
||||
|
||||
if (sa > 0.0)
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
|
||||
sa *= noise;
|
||||
col += da*sa*light_col[i].rgb*spec.rgb;
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
|
||||
float sa = dot(normalize(lv+npos),norm);
|
||||
|
||||
if (sa > 0.0)
|
||||
{
|
||||
sa = texture2D(lightFunc,vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
|
||||
sa *= noise;
|
||||
col += da*sa*light_col[i].rgb*spec.rgb;
|
||||
}
|
||||
}
|
||||
|
||||
out_col += col;
|
||||
}
|
||||
|
||||
out_col += col;
|
||||
}
|
||||
|
||||
if (dot(out_col, out_col) <= 0.0)
|
||||
|
|
|
|||
|
|
@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
|
|||
//get distance
|
||||
float d = length(lv);
|
||||
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
float da = 0.0;
|
||||
|
||||
if (d > 0.0 && la > 0.0 && fa > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
}
|
||||
|
||||
return da;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,19 +35,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
|
|||
//get distance
|
||||
float d = length(lv);
|
||||
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
float da = 0.0;
|
||||
|
||||
if (d > 0.0 && la > 0.0 && fa > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
}
|
||||
|
||||
return da;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,19 +37,24 @@ float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, floa
|
|||
//get distance
|
||||
float d = length(lv);
|
||||
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
float da = 0.0;
|
||||
|
||||
if (d > 0.0 && la > 0.0 && fa > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv *= 1.0/d;
|
||||
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
float da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
//distance attenuation
|
||||
float dist2 = d*d/(la*la);
|
||||
da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
//angular attenuation
|
||||
da *= calcDirectionalLight(n, lv);
|
||||
}
|
||||
|
||||
return da;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -279,6 +279,9 @@ RenderVBOEnable 1 0
|
|||
list TexUnit8orLess
|
||||
RenderDeferredSSAO 0 0
|
||||
|
||||
list ATI
|
||||
RenderDeferredSSAO 0 0
|
||||
|
||||
list Intel
|
||||
RenderAnisotropic 1 0
|
||||
RenderLocalLights 1 0
|
||||
|
|
|
|||
|
|
@ -0,0 +1,264 @@
|
|||
/**
|
||||
* @file LLAccountingQuotaManager.cpp
|
||||
* @ Handles the setting and accessing for costs associated with mesh
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2010, 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://secondlifegrid.net/programs/open_source/licensing/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://secondlifegrid.net/programs/open_source/licensing/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$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
#include "llaccountingquotamanager.h"
|
||||
#include "llagent.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerparcelmgr.h"
|
||||
#include "llparcel.h"
|
||||
|
||||
//===============================================================================
|
||||
LLAccountingQuotaManager::LLAccountingQuotaManager()
|
||||
{
|
||||
}
|
||||
//===============================================================================
|
||||
class LLAccountingQuotaResponder : public LLCurl::Responder
|
||||
{
|
||||
public:
|
||||
LLAccountingQuotaResponder( const LLSD& objectIDs )
|
||||
: mObjectIDs( objectIDs )
|
||||
{
|
||||
}
|
||||
|
||||
void clearPendingRequests ( void )
|
||||
{
|
||||
for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
|
||||
{
|
||||
LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( iter->asUUID() );
|
||||
}
|
||||
}
|
||||
|
||||
void error( U32 statusNum, const std::string& reason )
|
||||
{
|
||||
llwarns << "Transport error "<<reason<<llendl;
|
||||
//prep#do we really want to remove all because of one failure - verify
|
||||
clearPendingRequests();
|
||||
}
|
||||
|
||||
void result( const LLSD& content )
|
||||
{
|
||||
if ( !content.isMap() || content.has("error") )
|
||||
{
|
||||
llwarns << "Error on fetched data"<< llendl;
|
||||
//prep#do we really want to remove all because of one failure - verify
|
||||
clearPendingRequests();
|
||||
return;
|
||||
}
|
||||
|
||||
//Differentiate what the incoming caps could be from the data
|
||||
//bool VOContent = content.has("Objects");
|
||||
bool containsParcel = content.has("parcel");
|
||||
bool containsSelection = content.has("selected");
|
||||
//bool VORegion = content.has("region");
|
||||
|
||||
//Loop over the stored object ids checking against the incoming data
|
||||
for ( LLSD::array_iterator iter = mObjectIDs.beginArray(); iter != mObjectIDs.endArray(); ++iter )
|
||||
{
|
||||
LLUUID objectID = iter->asUUID();
|
||||
|
||||
LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
|
||||
|
||||
if ( containsParcel )
|
||||
{
|
||||
//Typically should be one
|
||||
S32 dataCount = content["parcel"].size();
|
||||
for(S32 i = 0; i < dataCount; i++)
|
||||
{
|
||||
//prep#todo verify that this is safe, otherwise just add a bool
|
||||
S32 parcelId = 0;
|
||||
S32 parcelOwner = 0;
|
||||
if ( content["parcel"][i].has("parcel_id") )
|
||||
{
|
||||
parcelId = content["parcel"][i]["parcel_id"].asInteger();
|
||||
}
|
||||
if ( content["parcel"][i].has("parcel_owner") )
|
||||
{
|
||||
parcelOwner = content["parcel"][i]["parcel_owner"].asInteger();
|
||||
}
|
||||
|
||||
F32 ownerRenderCost = 0;
|
||||
F32 ownerPhysicsCost = 0;
|
||||
F32 ownerNetworkCost = 0;
|
||||
F32 ownerSimulationCost = 0;
|
||||
|
||||
F32 groupRenderCost = 0;
|
||||
F32 groupPhysicsCost = 0;
|
||||
F32 groupNetworkCost = 0;
|
||||
F32 groupSimulationCost = 0;
|
||||
|
||||
F32 otherRenderCost = 0;
|
||||
F32 otherPhysicsCost = 0;
|
||||
F32 otherNetworkCost = 0;
|
||||
F32 otherSimulationCost = 0;
|
||||
|
||||
F32 totalRenderCost = 0;
|
||||
F32 totalPhysicsCost = 0;
|
||||
F32 totalNetworkCost = 0;
|
||||
F32 totalSimulationCost = 0;
|
||||
|
||||
if ( content["parcel"][i].has("owner") )
|
||||
{
|
||||
ownerRenderCost = content["parcel"][i]["owner"]["render"].asReal();
|
||||
ownerPhysicsCost = content["parcel"][i]["owner"]["physics"].asReal();
|
||||
ownerNetworkCost = content["parcel"][i]["owner"]["network"].asReal();
|
||||
ownerSimulationCost = content["parcel"][i]["owner"]["simulation"].asReal();
|
||||
|
||||
}
|
||||
if ( content["parcel"][i].has("group") )
|
||||
{
|
||||
groupRenderCost = content["parcel"][i]["group"]["render"].asReal();
|
||||
groupPhysicsCost = content["parcel"][i]["group"]["physics"].asReal();
|
||||
groupNetworkCost = content["parcel"][i]["group"]["network"].asReal();
|
||||
groupSimulationCost = content["parcel"][i]["group"]["simulation"].asReal();
|
||||
|
||||
}
|
||||
if ( content["parcel"][i].has("other") )
|
||||
{
|
||||
otherRenderCost = content["parcel"][i]["other"]["render"].asReal();
|
||||
otherPhysicsCost = content["parcel"][i]["other"]["physics"].asReal();
|
||||
otherNetworkCost = content["parcel"][i]["other"]["network"].asReal();
|
||||
otherSimulationCost = content["parcel"][i]["other"]["simulation"].asReal();
|
||||
}
|
||||
|
||||
if ( content["parcel"][i].has("total") )
|
||||
{
|
||||
totalRenderCost = content["parcel"][i]["total"]["render"].asReal();
|
||||
totalPhysicsCost = content["parcel"][i]["total"]["physics"].asReal();
|
||||
totalNetworkCost = content["parcel"][i]["total"]["network"].asReal();
|
||||
totalSimulationCost = content["parcel"][i]["total"]["simulation"].asReal();
|
||||
|
||||
}
|
||||
|
||||
ParcelQuota parcelQuota( ownerRenderCost, ownerPhysicsCost, ownerNetworkCost, ownerSimulationCost,
|
||||
groupRenderCost, groupPhysicsCost, groupNetworkCost, groupSimulationCost,
|
||||
otherRenderCost, otherPhysicsCost, otherNetworkCost, otherSimulationCost,
|
||||
totalRenderCost, totalPhysicsCost, totalNetworkCost, totalSimulationCost );
|
||||
//Update the Parcel
|
||||
LLParcel* pParcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
|
||||
if ( pParcel )
|
||||
{
|
||||
pParcel->updateQuota( objectID, parcelQuota );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
if ( containsSelection )
|
||||
{
|
||||
S32 dataCount = content["selected"].size();
|
||||
for(S32 i = 0; i < dataCount; i++)
|
||||
{
|
||||
|
||||
F32 renderCost = 0;
|
||||
F32 physicsCost = 0;
|
||||
F32 networkCost = 0;
|
||||
F32 simulationCost = 0;
|
||||
|
||||
S32 localId = 0;
|
||||
|
||||
localId = content["selected"][i]["local_id"].asInteger();
|
||||
renderCost = content["selected"][i]["render"].asReal();
|
||||
physicsCost = content["selected"][i]["physics"].asReal();
|
||||
networkCost = content["selected"][i]["network"].asReal();
|
||||
simulationCost = content["selected"][i]["simulation"].asReal();
|
||||
|
||||
SelectionQuota selectionQuota( localId, renderCost, physicsCost, networkCost, simulationCost );
|
||||
|
||||
//Update the objects
|
||||
//gObjectList.updateQuota( localId, selectionQuota );
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Nothing in string
|
||||
LLAccountingQuotaManager::getInstance()->removePendingObjectQuota( objectID );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
//List of posted objects
|
||||
LLSD mObjectIDs;
|
||||
};
|
||||
//===============================================================================
|
||||
void LLAccountingQuotaManager::fetchQuotas( const std::string& url )
|
||||
{
|
||||
// Invoking system must have already determined capability availability
|
||||
if ( !url.empty() )
|
||||
{
|
||||
LLSD objectList;
|
||||
U32 objectIndex = 0;
|
||||
IDIt IDIter = mUpdateObjectQuota.begin();
|
||||
IDIt IDIterEnd = mUpdateObjectQuota.end();
|
||||
|
||||
for ( ; IDIter != IDIterEnd; ++IDIter )
|
||||
{
|
||||
// Check to see if a request for this object has already been made.
|
||||
if ( mPendingObjectQuota.find( *IDIter ) == mPendingObjectQuota.end() )
|
||||
{
|
||||
mPendingObjectQuota.insert( *IDIter );
|
||||
objectList[objectIndex++] = *IDIter;
|
||||
}
|
||||
}
|
||||
|
||||
mUpdateObjectQuota.clear();
|
||||
|
||||
//Post results
|
||||
if ( objectList.size() > 0 )
|
||||
{
|
||||
LLSD dataToPost = LLSD::emptyMap();
|
||||
dataToPost["object_ids"] = objectList;
|
||||
LLHTTPClient::post( url, dataToPost, new LLAccountingQuotaResponder( objectList ));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//url was empty - warn & continue
|
||||
llwarns<<"Supplied url is empty "<<llendl;
|
||||
mUpdateObjectQuota.clear();
|
||||
mPendingObjectQuota.clear();
|
||||
}
|
||||
}
|
||||
//===============================================================================
|
||||
void LLAccountingQuotaManager::updateObjectCost( const LLUUID& objectID )
|
||||
{
|
||||
mUpdateObjectQuota.insert( objectID );
|
||||
}
|
||||
//===============================================================================
|
||||
void LLAccountingQuotaManager::removePendingObjectQuota( const LLUUID& objectID )
|
||||
{
|
||||
mPendingObjectQuota.erase( objectID );
|
||||
}
|
||||
//===============================================================================
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
/**
|
||||
* @file lllAccountingQuotaManager.h
|
||||
* @
|
||||
*
|
||||
* $LicenseInfo:firstyear=2001&license=viewergpl$
|
||||
*
|
||||
* Copyright (c) 2001-2009, 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://secondlifegrid.net/programs/open_source/licensing/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://secondlifegrid.net/programs/open_source/licensing/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_ACCOUNTINGQUOTAMANAGER_H
|
||||
#define LL_ACCOUNTINGQUOTAMANAGER_H
|
||||
//===============================================================================
|
||||
#include "llaccountingquota.h"
|
||||
//===============================================================================
|
||||
class LLAccountingQuotaManager : public LLSingleton<LLAccountingQuotaManager>
|
||||
{
|
||||
public:
|
||||
//Ctor
|
||||
LLAccountingQuotaManager();
|
||||
//Store an object that will be eventually fetched
|
||||
void updateObjectCost( const LLUUID& objectID );
|
||||
//Request quotas for object list
|
||||
void fetchQuotas( const std::string& url );
|
||||
//Delete a specific object from the pending list
|
||||
void removePendingObjectQuota( const LLUUID& objectID );
|
||||
|
||||
private:
|
||||
//Set of objects that need to update their cost
|
||||
std::set<LLUUID> mUpdateObjectQuota;
|
||||
//During fetchQuota we move object into a the pending set to signify that
|
||||
//a fetch has been instigated.
|
||||
std::set<LLUUID> mPendingObjectQuota;
|
||||
typedef std::set<LLUUID>::iterator IDIt;
|
||||
};
|
||||
//===============================================================================
|
||||
|
||||
#endif // LLACCOUNTINGQUOTAMANAGER
|
||||
|
||||
|
|
@ -208,6 +208,7 @@ LLAgent::LLAgent() :
|
|||
|
||||
mAutoPilot(FALSE),
|
||||
mAutoPilotFlyOnStop(FALSE),
|
||||
mAutoPilotAllowFlying(TRUE),
|
||||
mAutoPilotTargetGlobal(),
|
||||
mAutoPilotStopDistance(1.f),
|
||||
mAutoPilotUseRotation(FALSE),
|
||||
|
|
@ -1245,17 +1246,26 @@ void LLAgent::startAutoPilotGlobal(
|
|||
const LLQuaternion *target_rotation,
|
||||
void (*finish_callback)(BOOL, void *),
|
||||
void *callback_data,
|
||||
F32 stop_distance, F32 rot_threshold)
|
||||
F32 stop_distance,
|
||||
F32 rot_threshold,
|
||||
BOOL allow_flying)
|
||||
{
|
||||
if (!isAgentAvatarValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Are there any pending callbacks from previous auto pilot requests?
|
||||
if (mAutoPilotFinishedCallback)
|
||||
{
|
||||
mAutoPilotFinishedCallback(dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
|
||||
}
|
||||
|
||||
mAutoPilotFinishedCallback = finish_callback;
|
||||
mAutoPilotCallbackData = callback_data;
|
||||
mAutoPilotRotationThreshold = rot_threshold;
|
||||
mAutoPilotBehaviorName = behavior_name;
|
||||
mAutoPilotAllowFlying = allow_flying;
|
||||
|
||||
LLVector3d delta_pos( target_global );
|
||||
delta_pos -= getPositionGlobal();
|
||||
|
|
@ -1283,14 +1293,23 @@ void LLAgent::startAutoPilotGlobal(
|
|||
}
|
||||
}
|
||||
|
||||
mAutoPilotFlyOnStop = getFlying();
|
||||
if (mAutoPilotAllowFlying)
|
||||
{
|
||||
mAutoPilotFlyOnStop = getFlying();
|
||||
}
|
||||
else
|
||||
{
|
||||
mAutoPilotFlyOnStop = FALSE;
|
||||
}
|
||||
|
||||
if (distance > 30.0)
|
||||
if (distance > 30.0 && mAutoPilotAllowFlying)
|
||||
{
|
||||
setFlying(TRUE);
|
||||
}
|
||||
|
||||
if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
|
||||
if ( distance > 1.f &&
|
||||
mAutoPilotAllowFlying &&
|
||||
heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
|
||||
{
|
||||
setFlying(TRUE);
|
||||
// Do not force flying for "Sit" behavior to prevent flying after pressing "Stand"
|
||||
|
|
@ -1300,22 +1319,8 @@ void LLAgent::startAutoPilotGlobal(
|
|||
}
|
||||
|
||||
mAutoPilot = TRUE;
|
||||
mAutoPilotTargetGlobal = target_global;
|
||||
setAutoPilotTargetGlobal(target_global);
|
||||
|
||||
// trace ray down to find height of destination from ground
|
||||
LLVector3d traceEndPt = target_global;
|
||||
traceEndPt.mdV[VZ] -= 20.f;
|
||||
|
||||
LLVector3d targetOnGround;
|
||||
LLVector3 groundNorm;
|
||||
LLViewerObject *obj;
|
||||
|
||||
LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
|
||||
F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
|
||||
|
||||
// clamp z value of target to minimum height above ground
|
||||
mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height;
|
||||
mAutoPilotTargetDist = (F32)dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal);
|
||||
if (target_rotation)
|
||||
{
|
||||
mAutoPilotUseRotation = TRUE;
|
||||
|
|
@ -1332,13 +1337,37 @@ void LLAgent::startAutoPilotGlobal(
|
|||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// setAutoPilotTargetGlobal
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLAgent::setAutoPilotTargetGlobal(const LLVector3d &target_global)
|
||||
{
|
||||
if (mAutoPilot)
|
||||
{
|
||||
mAutoPilotTargetGlobal = target_global;
|
||||
|
||||
// trace ray down to find height of destination from ground
|
||||
LLVector3d traceEndPt = target_global;
|
||||
traceEndPt.mdV[VZ] -= 20.f;
|
||||
|
||||
LLVector3d targetOnGround;
|
||||
LLVector3 groundNorm;
|
||||
LLViewerObject *obj;
|
||||
|
||||
LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
|
||||
F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
|
||||
|
||||
// clamp z value of target to minimum height above ground
|
||||
mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height;
|
||||
mAutoPilotTargetDist = (F32)dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// startFollowPilot()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLAgent::startFollowPilot(const LLUUID &leader_id)
|
||||
void LLAgent::startFollowPilot(const LLUUID &leader_id, BOOL allow_flying, F32 stop_distance)
|
||||
{
|
||||
if (!mAutoPilot) return;
|
||||
|
||||
mLeaderID = leader_id;
|
||||
if ( mLeaderID.isNull() ) return;
|
||||
|
||||
|
|
@ -1349,7 +1378,14 @@ void LLAgent::startFollowPilot(const LLUUID &leader_id)
|
|||
return;
|
||||
}
|
||||
|
||||
startAutoPilotGlobal(object->getPositionGlobal());
|
||||
startAutoPilotGlobal(object->getPositionGlobal(),
|
||||
std::string(), // behavior_name
|
||||
NULL, // target_rotation
|
||||
NULL, // finish_callback
|
||||
NULL, // callback_data
|
||||
stop_distance,
|
||||
0.03f, // rotation_threshold
|
||||
allow_flying);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1375,7 +1411,8 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
|
|||
//NB: auto pilot can terminate for a reason other than reaching the destination
|
||||
if (mAutoPilotFinishedCallback)
|
||||
{
|
||||
mAutoPilotFinishedCallback(!user_cancel && dist_vec_squared(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < (mAutoPilotStopDistance * mAutoPilotStopDistance), mAutoPilotCallbackData);
|
||||
mAutoPilotFinishedCallback(!user_cancel && dist_vec(gAgent.getPositionGlobal(), mAutoPilotTargetGlobal) < mAutoPilotStopDistance, mAutoPilotCallbackData);
|
||||
mAutoPilotFinishedCallback = NULL;
|
||||
}
|
||||
mLeaderID = LLUUID::null;
|
||||
|
||||
|
|
@ -1415,7 +1452,7 @@ void LLAgent::autoPilot(F32 *delta_yaw)
|
|||
|
||||
if (!isAgentAvatarValid()) return;
|
||||
|
||||
if (gAgentAvatarp->mInAir)
|
||||
if (gAgentAvatarp->mInAir && mAutoPilotAllowFlying)
|
||||
{
|
||||
setFlying(TRUE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -469,19 +469,29 @@ public:
|
|||
public:
|
||||
BOOL getAutoPilot() const { return mAutoPilot; }
|
||||
LLVector3d getAutoPilotTargetGlobal() const { return mAutoPilotTargetGlobal; }
|
||||
LLUUID getAutoPilotLeaderID() const { return mLeaderID; }
|
||||
F32 getAutoPilotStopDistance() const { return mAutoPilotStopDistance; }
|
||||
F32 getAutoPilotTargetDist() const { return mAutoPilotTargetDist; }
|
||||
BOOL getAutoPilotUseRotation() const { return mAutoPilotUseRotation; }
|
||||
LLVector3 getAutoPilotTargetFacing() const { return mAutoPilotTargetFacing; }
|
||||
F32 getAutoPilotRotationThreshold() const { return mAutoPilotRotationThreshold; }
|
||||
std::string getAutoPilotBehaviorName() const { return mAutoPilotBehaviorName; }
|
||||
|
||||
void startAutoPilotGlobal(const LLVector3d &pos_global,
|
||||
const std::string& behavior_name = std::string(),
|
||||
const LLQuaternion *target_rotation = NULL,
|
||||
void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL,
|
||||
F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f);
|
||||
void startFollowPilot(const LLUUID &leader_id);
|
||||
F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f,
|
||||
BOOL allow_flying = TRUE);
|
||||
void startFollowPilot(const LLUUID &leader_id, BOOL allow_flying = TRUE, F32 stop_distance = 0.5f);
|
||||
void stopAutoPilot(BOOL user_cancel = FALSE);
|
||||
void setAutoPilotGlobal(const LLVector3d &pos_global);
|
||||
void setAutoPilotTargetGlobal(const LLVector3d &target_global);
|
||||
void autoPilot(F32 *delta_yaw); // Autopilot walking action, angles in radians
|
||||
void renderAutoPilotTarget();
|
||||
private:
|
||||
BOOL mAutoPilot;
|
||||
BOOL mAutoPilotFlyOnStop;
|
||||
BOOL mAutoPilotAllowFlying;
|
||||
LLVector3d mAutoPilotTargetGlobal;
|
||||
F32 mAutoPilotStopDistance;
|
||||
BOOL mAutoPilotUseRotation;
|
||||
|
|
|
|||
|
|
@ -394,7 +394,9 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi
|
|||
LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation
|
||||
LLVector3 object_extents;
|
||||
const LLVector4a* oe4 = object->mDrawable->getSpatialExtents();
|
||||
object_extents.set( oe4[1][0], oe4[1][1], oe4[1][2] );
|
||||
LLVector4a size;
|
||||
size.setSub(oe4[1], oe4[0]);
|
||||
object_extents.set( size[0], size[1], size[2] );
|
||||
|
||||
// make sure they object extents are non-zero
|
||||
object_extents.clamp(0.001f, F32_MAX);
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include "llagentlistener.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llvoavatar.h"
|
||||
#include "llcommandhandler.h"
|
||||
#include "llslurl.h"
|
||||
#include "llurldispatcher.h"
|
||||
|
|
@ -39,93 +40,242 @@
|
|||
#include "llviewerregion.h"
|
||||
#include "llsdutil.h"
|
||||
#include "llsdutil_math.h"
|
||||
#include "lltoolgrab.h"
|
||||
#include "llhudeffectlookat.h"
|
||||
#include "llagentcamera.h"
|
||||
|
||||
LLAgentListener::LLAgentListener(LLAgent &agent)
|
||||
: LLEventAPI("LLAgent",
|
||||
"LLAgent listener to (e.g.) teleport, sit, stand, etc."),
|
||||
mAgent(agent)
|
||||
{
|
||||
add("requestTeleport",
|
||||
add("requestTeleport",
|
||||
"Teleport: [\"regionname\"], [\"x\"], [\"y\"], [\"z\"]\n"
|
||||
"If [\"skip_confirmation\"] is true, use LLURLDispatcher rather than LLCommandDispatcher.",
|
||||
&LLAgentListener::requestTeleport);
|
||||
add("requestSit",
|
||||
"Ask to sit on the object specified in [\"obj_uuid\"]",
|
||||
add("requestSit",
|
||||
"[\"obj_uuid\"]: id of object to sit on, use this or [\"position\"] to indicate the sit target"
|
||||
"[\"position\"]: region position {x, y, z} where to find closest object to sit on",
|
||||
&LLAgentListener::requestSit);
|
||||
add("requestStand",
|
||||
add("requestStand",
|
||||
"Ask to stand up",
|
||||
&LLAgentListener::requestStand);
|
||||
add("requestTouch",
|
||||
"[\"obj_uuid\"]: id of object to touch, use this or [\"position\"] to indicate the object to touch"
|
||||
"[\"position\"]: region position {x, y, z} where to find closest object to touch"
|
||||
"[\"face\"]: optional object face number to touch[Default: 0]",
|
||||
&LLAgentListener::requestTouch);
|
||||
add("resetAxes",
|
||||
"Set the agent to a fixed orientation (optionally specify [\"lookat\"] = array of [x, y, z])",
|
||||
&LLAgentListener::resetAxes);
|
||||
add("getAxes",
|
||||
"Obsolete - use getPosition instead\n"
|
||||
"Send information about the agent's orientation on [\"reply\"]:\n"
|
||||
"[\"euler\"]: map of {roll, pitch, yaw}\n"
|
||||
"[\"quat\"]: array of [x, y, z, w] quaternion values",
|
||||
&LLAgentListener::getAxes,
|
||||
LLSDMap("reply", LLSD()));
|
||||
add("getGroups",
|
||||
"Send on [\"reply\"], in [\"groups\"], an array describing agent's groups:\n"
|
||||
"[\"id\"]: UUID of group\n"
|
||||
"[\"name\"]: name of group",
|
||||
&LLAgentListener::getGroups,
|
||||
add("getPosition",
|
||||
"Send information about the agent's position and orientation on [\"reply\"]:\n"
|
||||
"[\"region\"]: array of region {x, y, z} position\n"
|
||||
"[\"global\"]: array of global {x, y, z} position\n"
|
||||
"[\"euler\"]: map of {roll, pitch, yaw}\n"
|
||||
"[\"quat\"]: array of [x, y, z, w] quaternion values",
|
||||
&LLAgentListener::getPosition,
|
||||
LLSDMap("reply", LLSD()));
|
||||
add("startAutoPilot",
|
||||
"Start the autopilot system using the following parameters:\n"
|
||||
"[\"target_global\"]: array of target global {x, y, z} position\n"
|
||||
"[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]\n"
|
||||
"[\"target_rotation\"]: array of [x, y, z, w] quaternion values [default: no target]\n"
|
||||
"[\"rotation_threshold\"]: target maximum angle from target facing rotation [default: 0.03 radians]\n"
|
||||
"[\"behavior_name\"]: name of the autopilot behavior [default: \"\"]"
|
||||
"[\"allow_flying\"]: allow flying during autopilot [default: True]",
|
||||
//"[\"callback_pump\"]: pump to send success/failure and callback data to [default: none]\n"
|
||||
//"[\"callback_data\"]: data to send back during a callback [default: none]",
|
||||
&LLAgentListener::startAutoPilot);
|
||||
add("getAutoPilot",
|
||||
"Send information about current state of the autopilot system to [\"reply\"]:\n"
|
||||
"[\"enabled\"]: boolean indicating whether or not autopilot is enabled\n"
|
||||
"[\"target_global\"]: array of target global {x, y, z} position\n"
|
||||
"[\"leader_id\"]: uuid of target autopilot is following\n"
|
||||
"[\"stop_distance\"]: target maximum distance from target\n"
|
||||
"[\"target_distance\"]: last known distance from target\n"
|
||||
"[\"use_rotation\"]: boolean indicating if autopilot has a target facing rotation\n"
|
||||
"[\"target_facing\"]: array of {x, y} target direction to face\n"
|
||||
"[\"rotation_threshold\"]: target maximum angle from target facing rotation\n"
|
||||
"[\"behavior_name\"]: name of the autopilot behavior",
|
||||
&LLAgentListener::getAutoPilot,
|
||||
LLSDMap("reply", LLSD()));
|
||||
add("startFollowPilot",
|
||||
"[\"leader_id\"]: uuid of target to follow using the autopilot system (optional with avatar_name)\n"
|
||||
"[\"avatar_name\"]: avatar name to follow using the autopilot system (optional with leader_id)\n"
|
||||
"[\"allow_flying\"]: allow flying during autopilot [default: True]\n"
|
||||
"[\"stop_distance\"]: target maxiumum distance from target [default: autopilot guess]",
|
||||
&LLAgentListener::startFollowPilot);
|
||||
add("setAutoPilotTarget",
|
||||
"Update target for currently running autopilot:\n"
|
||||
"[\"target_global\"]: array of target global {x, y, z} position",
|
||||
&LLAgentListener::setAutoPilotTarget);
|
||||
add("stopAutoPilot",
|
||||
"Stop the autopilot system:\n"
|
||||
"[\"user_cancel\"] indicates whether or not to act as though user canceled autopilot [default: false]",
|
||||
&LLAgentListener::stopAutoPilot);
|
||||
add("lookAt",
|
||||
"[\"type\"]: number to indicate the lookAt type, 0 to clear\n"
|
||||
"[\"obj_uuid\"]: id of object to look at, use this or [\"position\"] to indicate the target\n"
|
||||
"[\"position\"]: region position {x, y, z} where to find closest object or avatar to look at",
|
||||
&LLAgentListener::lookAt);
|
||||
}
|
||||
|
||||
void LLAgentListener::requestTeleport(LLSD const & event_data) const
|
||||
{
|
||||
if(event_data["skip_confirmation"].asBoolean())
|
||||
{
|
||||
LLSD params(LLSD::emptyArray());
|
||||
params.append(event_data["regionname"]);
|
||||
params.append(event_data["x"]);
|
||||
params.append(event_data["y"]);
|
||||
params.append(event_data["z"]);
|
||||
LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "clicked", true);
|
||||
// *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
|
||||
// should we just compose LLCommandHandler and LLDispatchListener?
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string url = LLSLURL(event_data["regionname"],
|
||||
LLVector3(event_data["x"].asReal(),
|
||||
event_data["y"].asReal(),
|
||||
event_data["z"].asReal())).getSLURLString();
|
||||
LLURLDispatcher::dispatch(url, "clicked", NULL, false);
|
||||
}
|
||||
if(event_data["skip_confirmation"].asBoolean())
|
||||
{
|
||||
LLSD params(LLSD::emptyArray());
|
||||
params.append(event_data["regionname"]);
|
||||
params.append(event_data["x"]);
|
||||
params.append(event_data["y"]);
|
||||
params.append(event_data["z"]);
|
||||
LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, "clicked", true);
|
||||
// *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
|
||||
// should we just compose LLCommandHandler and LLDispatchListener?
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string url = LLSLURL(event_data["regionname"],
|
||||
LLVector3(event_data["x"].asReal(),
|
||||
event_data["y"].asReal(),
|
||||
event_data["z"].asReal())).getSLURLString();
|
||||
LLURLDispatcher::dispatch(url, "clicked", NULL, false);
|
||||
}
|
||||
}
|
||||
|
||||
void LLAgentListener::requestSit(LLSD const & event_data) const
|
||||
{
|
||||
//mAgent.getAvatarObject()->sitOnObject();
|
||||
// shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()
|
||||
// *TODO - find a permanent place to share this code properly.
|
||||
LLViewerObject *object = gObjectList.findObject(event_data["obj_uuid"]);
|
||||
//mAgent.getAvatarObject()->sitOnObject();
|
||||
// shamelessly ripped from llviewermenu.cpp:handle_sit_or_stand()
|
||||
// *TODO - find a permanent place to share this code properly.
|
||||
|
||||
if (object && object->getPCode() == LL_PCODE_VOLUME)
|
||||
LLViewerObject *object = NULL;
|
||||
if (event_data.has("obj_uuid"))
|
||||
{
|
||||
gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, mAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, mAgent.getSessionID());
|
||||
gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
|
||||
gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3(0,0,0));
|
||||
object = gObjectList.findObject(event_data["obj_uuid"]);
|
||||
}
|
||||
else if (event_data.has("position"))
|
||||
{
|
||||
LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
|
||||
object = findObjectClosestTo(target_position);
|
||||
}
|
||||
|
||||
object->getRegion()->sendReliableMessage();
|
||||
if (object && object->getPCode() == LL_PCODE_VOLUME)
|
||||
{
|
||||
gMessageSystem->newMessageFast(_PREHASH_AgentRequestSit);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, mAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, mAgent.getSessionID());
|
||||
gMessageSystem->nextBlockFast(_PREHASH_TargetObject);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_TargetID, object->mID);
|
||||
gMessageSystem->addVector3Fast(_PREHASH_Offset, LLVector3(0,0,0));
|
||||
|
||||
object->getRegion()->sendReliableMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "LLAgent requestSit could not find the sit target: "
|
||||
<< event_data << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
void LLAgentListener::requestStand(LLSD const & event_data) const
|
||||
{
|
||||
mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
|
||||
mAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
|
||||
}
|
||||
|
||||
void LLAgentListener::resetAxes(const LLSD& event) const
|
||||
|
||||
LLViewerObject * LLAgentListener::findObjectClosestTo( const LLVector3 & position ) const
|
||||
{
|
||||
if (event.has("lookat"))
|
||||
LLViewerObject *object = NULL;
|
||||
|
||||
// Find the object closest to that position
|
||||
F32 min_distance = 10000.0f; // Start big
|
||||
S32 num_objects = gObjectList.getNumObjects();
|
||||
S32 cur_index = 0;
|
||||
while (cur_index < num_objects)
|
||||
{
|
||||
LLViewerObject * cur_object = gObjectList.getObject(cur_index++);
|
||||
if (cur_object)
|
||||
{ // Calculate distance from the target position
|
||||
LLVector3 target_diff = cur_object->getPositionRegion() - position;
|
||||
F32 distance_to_target = target_diff.length();
|
||||
if (distance_to_target < min_distance)
|
||||
{ // Found an object closer
|
||||
min_distance = distance_to_target;
|
||||
object = cur_object;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return object;
|
||||
}
|
||||
|
||||
|
||||
void LLAgentListener::requestTouch(LLSD const & event_data) const
|
||||
{
|
||||
LLViewerObject *object = NULL;
|
||||
|
||||
if (event_data.has("obj_uuid"))
|
||||
{
|
||||
object = gObjectList.findObject(event_data["obj_uuid"]);
|
||||
}
|
||||
else if (event_data.has("position"))
|
||||
{
|
||||
LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
|
||||
object = findObjectClosestTo(target_position);
|
||||
}
|
||||
|
||||
S32 face = 0;
|
||||
if (event_data.has("face"))
|
||||
{
|
||||
face = event_data["face"].asInteger();
|
||||
}
|
||||
|
||||
if (object && object->getPCode() == LL_PCODE_VOLUME)
|
||||
{
|
||||
mAgent.resetAxes(ll_vector3_from_sd(event["lookat"]));
|
||||
// Fake enough pick info to get it to (hopefully) work
|
||||
LLPickInfo pick;
|
||||
pick.mObjectFace = face;
|
||||
|
||||
/*
|
||||
These values are sent to the simulator, but face seems to be easiest to use
|
||||
|
||||
pick.mUVCoords "UVCoord"
|
||||
pick.mSTCoords "STCoord"
|
||||
pick.mObjectFace "FaceIndex"
|
||||
pick.mIntersection "Position"
|
||||
pick.mNormal "Normal"
|
||||
pick.mBinormal "Binormal"
|
||||
*/
|
||||
|
||||
// A touch is a sketchy message sequence ... send a grab, immediately
|
||||
// followed by un-grabbing, crossing fingers and hoping packets arrive in
|
||||
// the correct order
|
||||
send_ObjectGrab_message(object, pick, LLVector3::zero);
|
||||
send_ObjectDeGrab_message(object, pick);
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "LLAgent requestTouch could not find the touch target "
|
||||
<< event_data["obj_uuid"].asUUID() << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLAgentListener::resetAxes(const LLSD& event_data) const
|
||||
{
|
||||
if (event_data.has("lookat"))
|
||||
{
|
||||
mAgent.resetAxes(ll_vector3_from_sd(event_data["lookat"]));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -134,17 +284,210 @@ void LLAgentListener::resetAxes(const LLSD& event) const
|
|||
}
|
||||
}
|
||||
|
||||
void LLAgentListener::getAxes(const LLSD& event) const
|
||||
void LLAgentListener::getAxes(const LLSD& event_data) const
|
||||
{
|
||||
LLQuaternion quat(mAgent.getQuat());
|
||||
F32 roll, pitch, yaw;
|
||||
quat.getEulerAngles(&roll, &pitch, &yaw);
|
||||
// The official query API for LLQuaternion's [x, y, z, w] values is its
|
||||
// public member mQ...
|
||||
sendReply(LLSDMap
|
||||
("quat", llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ)))
|
||||
("euler", LLSDMap("roll", roll)("pitch", pitch)("yaw", yaw)),
|
||||
event);
|
||||
LLSD reply = LLSD::emptyMap();
|
||||
reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
|
||||
reply["euler"] = LLSD::emptyMap();
|
||||
reply["euler"]["roll"] = roll;
|
||||
reply["euler"]["pitch"] = pitch;
|
||||
reply["euler"]["yaw"] = yaw;
|
||||
sendReply(reply, event_data);
|
||||
}
|
||||
|
||||
void LLAgentListener::getPosition(const LLSD& event_data) const
|
||||
{
|
||||
F32 roll, pitch, yaw;
|
||||
LLQuaternion quat(mAgent.getQuat());
|
||||
quat.getEulerAngles(&roll, &pitch, &yaw);
|
||||
|
||||
LLSD reply = LLSD::emptyMap();
|
||||
reply["quat"] = llsd_copy_array(boost::begin(quat.mQ), boost::end(quat.mQ));
|
||||
reply["euler"] = LLSD::emptyMap();
|
||||
reply["euler"]["roll"] = roll;
|
||||
reply["euler"]["pitch"] = pitch;
|
||||
reply["euler"]["yaw"] = yaw;
|
||||
reply["region"] = ll_sd_from_vector3(mAgent.getPositionAgent());
|
||||
reply["global"] = ll_sd_from_vector3d(mAgent.getPositionGlobal());
|
||||
|
||||
sendReply(reply, event_data);
|
||||
}
|
||||
|
||||
|
||||
void LLAgentListener::startAutoPilot(LLSD const & event_data)
|
||||
{
|
||||
LLQuaternion target_rotation_value;
|
||||
LLQuaternion* target_rotation = NULL;
|
||||
if (event_data.has("target_rotation"))
|
||||
{
|
||||
target_rotation_value = ll_quaternion_from_sd(event_data["target_rotation"]);
|
||||
target_rotation = &target_rotation_value;
|
||||
}
|
||||
// *TODO: Use callback_pump and callback_data
|
||||
F32 rotation_threshold = 0.03f;
|
||||
if (event_data.has("rotation_threshold"))
|
||||
{
|
||||
rotation_threshold = event_data["rotation_threshold"].asReal();
|
||||
}
|
||||
|
||||
BOOL allow_flying = TRUE;
|
||||
if (event_data.has("allow_flying"))
|
||||
{
|
||||
allow_flying = (BOOL) event_data["allow_flying"].asBoolean();
|
||||
mAgent.setFlying(allow_flying);
|
||||
}
|
||||
|
||||
F32 stop_distance = 0.f;
|
||||
if (event_data.has("stop_distance"))
|
||||
{
|
||||
stop_distance = event_data["stop_distance"].asReal();
|
||||
}
|
||||
|
||||
// Clear follow target, this is doing a path
|
||||
mFollowTarget.setNull();
|
||||
|
||||
mAgent.startAutoPilotGlobal(ll_vector3d_from_sd(event_data["target_global"]),
|
||||
event_data["behavior_name"],
|
||||
target_rotation,
|
||||
NULL, NULL,
|
||||
stop_distance,
|
||||
rotation_threshold,
|
||||
allow_flying);
|
||||
}
|
||||
|
||||
void LLAgentListener::getAutoPilot(const LLSD& event_data) const
|
||||
{
|
||||
LLSD reply = LLSD::emptyMap();
|
||||
|
||||
LLSD::Boolean enabled = mAgent.getAutoPilot();
|
||||
reply["enabled"] = enabled;
|
||||
|
||||
reply["target_global"] = ll_sd_from_vector3d(mAgent.getAutoPilotTargetGlobal());
|
||||
|
||||
reply["leader_id"] = mAgent.getAutoPilotLeaderID();
|
||||
|
||||
reply["stop_distance"] = mAgent.getAutoPilotStopDistance();
|
||||
|
||||
reply["target_distance"] = mAgent.getAutoPilotTargetDist();
|
||||
if (!enabled &&
|
||||
mFollowTarget.notNull())
|
||||
{ // Get an actual distance from the target object we were following
|
||||
LLViewerObject * target = gObjectList.findObject(mFollowTarget);
|
||||
if (target)
|
||||
{ // Found the target AV, return the actual distance to them as well as their ID
|
||||
LLVector3 difference = target->getPositionRegion() - mAgent.getPositionAgent();
|
||||
reply["target_distance"] = difference.length();
|
||||
reply["leader_id"] = mFollowTarget;
|
||||
}
|
||||
}
|
||||
|
||||
reply["use_rotation"] = (LLSD::Boolean) mAgent.getAutoPilotUseRotation();
|
||||
reply["target_facing"] = ll_sd_from_vector3(mAgent.getAutoPilotTargetFacing());
|
||||
reply["rotation_threshold"] = mAgent.getAutoPilotRotationThreshold();
|
||||
reply["behavior_name"] = mAgent.getAutoPilotBehaviorName();
|
||||
reply["fly"] = (LLSD::Boolean) mAgent.getFlying();
|
||||
|
||||
sendReply(reply, event_data);
|
||||
}
|
||||
|
||||
void LLAgentListener::startFollowPilot(LLSD const & event_data)
|
||||
{
|
||||
LLUUID target_id;
|
||||
|
||||
BOOL allow_flying = TRUE;
|
||||
if (event_data.has("allow_flying"))
|
||||
{
|
||||
allow_flying = (BOOL) event_data["allow_flying"].asBoolean();
|
||||
}
|
||||
|
||||
if (event_data.has("leader_id"))
|
||||
{
|
||||
target_id = event_data["leader_id"];
|
||||
}
|
||||
else if (event_data.has("avatar_name"))
|
||||
{ // Find the avatar with matching name
|
||||
std::string target_name = event_data["avatar_name"].asString();
|
||||
|
||||
if (target_name.length() > 0)
|
||||
{
|
||||
S32 num_objects = gObjectList.getNumObjects();
|
||||
S32 cur_index = 0;
|
||||
while (cur_index < num_objects)
|
||||
{
|
||||
LLViewerObject * cur_object = gObjectList.getObject(cur_index++);
|
||||
if (cur_object &&
|
||||
cur_object->asAvatar() &&
|
||||
cur_object->asAvatar()->getFullname() == target_name)
|
||||
{ // Found avatar with matching name, extract id and break out of loop
|
||||
target_id = cur_object->getID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
F32 stop_distance = 0.f;
|
||||
if (event_data.has("stop_distance"))
|
||||
{
|
||||
stop_distance = event_data["stop_distance"].asReal();
|
||||
}
|
||||
|
||||
if (target_id.notNull())
|
||||
{
|
||||
mAgent.setFlying(allow_flying);
|
||||
mFollowTarget = target_id; // Save follow target so we can report distance later
|
||||
|
||||
mAgent.startFollowPilot(target_id, allow_flying, stop_distance);
|
||||
}
|
||||
}
|
||||
|
||||
void LLAgentListener::setAutoPilotTarget(LLSD const & event_data) const
|
||||
{
|
||||
if (event_data.has("target_global"))
|
||||
{
|
||||
LLVector3d target_global(ll_vector3d_from_sd(event_data["target_global"]));
|
||||
mAgent.setAutoPilotTargetGlobal(target_global);
|
||||
}
|
||||
}
|
||||
|
||||
void LLAgentListener::stopAutoPilot(LLSD const & event_data) const
|
||||
{
|
||||
BOOL user_cancel = FALSE;
|
||||
if (event_data.has("user_cancel"))
|
||||
{
|
||||
user_cancel = event_data["user_cancel"].asBoolean();
|
||||
}
|
||||
mAgent.stopAutoPilot(user_cancel);
|
||||
}
|
||||
|
||||
void LLAgentListener::lookAt(LLSD const & event_data) const
|
||||
{
|
||||
LLViewerObject *object = NULL;
|
||||
if (event_data.has("obj_uuid"))
|
||||
{
|
||||
object = gObjectList.findObject(event_data["obj_uuid"]);
|
||||
}
|
||||
else if (event_data.has("position"))
|
||||
{
|
||||
LLVector3 target_position = ll_vector3_from_sd(event_data["position"]);
|
||||
object = findObjectClosestTo(target_position);
|
||||
}
|
||||
|
||||
S32 look_at_type = (S32) LOOKAT_TARGET_NONE;
|
||||
if (event_data.has("type"))
|
||||
{
|
||||
look_at_type = event_data["type"].asInteger();
|
||||
}
|
||||
if (look_at_type >= (S32) LOOKAT_TARGET_NONE &&
|
||||
look_at_type < (S32) LOOKAT_NUM_TARGETS)
|
||||
{
|
||||
gAgentCamera.setLookAt((ELookAtType) look_at_type, object);
|
||||
}
|
||||
}
|
||||
|
||||
void LLAgentListener::getGroups(const LLSD& event) const
|
||||
|
|
|
|||
|
|
@ -34,22 +34,35 @@
|
|||
|
||||
class LLAgent;
|
||||
class LLSD;
|
||||
class LLViewerObject;
|
||||
class LLVector3d;
|
||||
|
||||
class LLAgentListener : public LLEventAPI
|
||||
{
|
||||
public:
|
||||
LLAgentListener(LLAgent &agent);
|
||||
LLAgentListener(LLAgent &agent);
|
||||
|
||||
private:
|
||||
void requestTeleport(LLSD const & event_data) const;
|
||||
void requestSit(LLSD const & event_data) const;
|
||||
void requestStand(LLSD const & event_data) const;
|
||||
void resetAxes(const LLSD& event) const;
|
||||
void getAxes(const LLSD& event) const;
|
||||
void requestTeleport(LLSD const & event_data) const;
|
||||
void requestSit(LLSD const & event_data) const;
|
||||
void requestStand(LLSD const & event_data) const;
|
||||
void requestTouch(LLSD const & event_data) const;
|
||||
void resetAxes(const LLSD& event_data) const;
|
||||
void getAxes(const LLSD& event_data) const;
|
||||
void getGroups(const LLSD& event) const;
|
||||
void getPosition(const LLSD& event_data) const;
|
||||
void startAutoPilot(const LLSD& event_data);
|
||||
void getAutoPilot(const LLSD& event_data) const;
|
||||
void startFollowPilot(const LLSD& event_data);
|
||||
void setAutoPilotTarget(const LLSD& event_data) const;
|
||||
void stopAutoPilot(const LLSD& event_data) const;
|
||||
void lookAt(LLSD const & event_data) const;
|
||||
|
||||
LLViewerObject * findObjectClosestTo( const LLVector3 & position ) const;
|
||||
|
||||
private:
|
||||
LLAgent & mAgent;
|
||||
LLAgent & mAgent;
|
||||
LLUUID mFollowTarget;
|
||||
};
|
||||
|
||||
#endif // LL_LLAGENTLISTENER_H
|
||||
|
|
|
|||
|
|
@ -695,6 +695,8 @@ bool LLAppViewer::init()
|
|||
if (!initConfiguration())
|
||||
return false;
|
||||
|
||||
LL_INFOS("InitInfo") << "Configuration initialized." << LL_ENDL ;
|
||||
|
||||
// write Google Breakpad minidump files to our log directory
|
||||
std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
|
||||
logdir += gDirUtilp->getDirDelimiter();
|
||||
|
|
@ -721,6 +723,8 @@ bool LLAppViewer::init()
|
|||
// *NOTE:Mani - LLCurl::initClass is not thread safe.
|
||||
// Called before threads are created.
|
||||
LLCurl::initClass();
|
||||
LL_INFOS("InitInfo") << "LLCurl initialized." << LL_ENDL ;
|
||||
|
||||
LLMachineID::init();
|
||||
|
||||
{
|
||||
|
|
@ -739,6 +743,8 @@ bool LLAppViewer::init()
|
|||
}
|
||||
|
||||
initThreads();
|
||||
LL_INFOS("InitInfo") << "Threads initialized." << LL_ENDL ;
|
||||
|
||||
writeSystemInfo();
|
||||
|
||||
// Initialize updater service (now that we have an io pump)
|
||||
|
|
@ -773,6 +779,7 @@ bool LLAppViewer::init()
|
|||
gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ALWAYS_SEND);
|
||||
gCrashSettings.saveToFile(crash_settings_filename, FALSE);
|
||||
}
|
||||
LL_INFOS("InitInfo") << "Crash settings done." << LL_ENDL ;
|
||||
|
||||
/////////////////////////////////////////////////
|
||||
// OS-specific login dialogs
|
||||
|
|
@ -821,6 +828,8 @@ bool LLAppViewer::init()
|
|||
// Let code in llui access the viewer help floater
|
||||
LLUI::sHelpImpl = LLViewerHelp::getInstance();
|
||||
|
||||
LL_INFOS("InitInfo") << "UI initialization is done." << LL_ENDL ;
|
||||
|
||||
// Load translations for tooltips
|
||||
LLFloater::initClass();
|
||||
|
||||
|
|
@ -870,6 +879,7 @@ bool LLAppViewer::init()
|
|||
// Early out from user choice.
|
||||
return false;
|
||||
}
|
||||
LL_INFOS("InitInfo") << "Hardware test initialization done." << LL_ENDL ;
|
||||
|
||||
// Prepare for out-of-memory situations, during which we will crash on
|
||||
// purpose and save a dump.
|
||||
|
|
@ -890,7 +900,8 @@ bool LLAppViewer::init()
|
|||
OSMessageBox(msg.str(),LLStringUtil::null,OSMB_OK);
|
||||
return 1;
|
||||
}
|
||||
|
||||
LL_INFOS("InitInfo") << "Cache initialization is done." << LL_ENDL ;
|
||||
|
||||
// Initialize the repeater service.
|
||||
LLMainLoopRepeater::instance().start();
|
||||
|
||||
|
|
@ -899,6 +910,7 @@ bool LLAppViewer::init()
|
|||
//
|
||||
gGLActive = TRUE;
|
||||
initWindow();
|
||||
LL_INFOS("InitInfo") << "Window is initialized." << LL_ENDL ;
|
||||
|
||||
// initWindow also initializes the Feature List, so now we can initialize this global.
|
||||
LLCubeMap::sUseCubeMaps = LLFeatureManager::getInstance()->isFeatureAvailable("RenderCubeMap");
|
||||
|
|
@ -1036,6 +1048,8 @@ bool LLAppViewer::init()
|
|||
}
|
||||
|
||||
LLViewerMedia::initClass();
|
||||
LL_INFOS("InitInfo") << "Viewer media initialized." << LL_ENDL ;
|
||||
|
||||
LLTextUtil::TextHelpers::iconCallbackCreationFunction = create_text_segment_icon_from_url_match;
|
||||
|
||||
//EXT-7013 - On windows for some locale (Japanese) standard
|
||||
|
|
@ -1179,11 +1193,11 @@ bool LLAppViewer::mainLoop()
|
|||
// Scan keyboard for movement keys. Command keys and typing
|
||||
// are handled by windows callbacks. Don't do this until we're
|
||||
// done initializing. JC
|
||||
if (gViewerWindow->mWindow->getVisible()
|
||||
if ((gHeadlessClient || gViewerWindow->mWindow->getVisible())
|
||||
&& gViewerWindow->getActive()
|
||||
&& !gViewerWindow->mWindow->getMinimized()
|
||||
&& LLStartUp::getStartupState() == STATE_STARTED
|
||||
&& !gViewerWindow->getShowProgress()
|
||||
&& (gHeadlessClient || !gViewerWindow->getShowProgress())
|
||||
&& !gFocusMgr.focusLocked())
|
||||
{
|
||||
LLMemType mjk(LLMemType::MTYPE_JOY_KEY);
|
||||
|
|
@ -2500,7 +2514,8 @@ bool LLAppViewer::initConfiguration()
|
|||
// it relies on checking a marker file which will not work when running
|
||||
// out of different directories
|
||||
|
||||
if (LLStartUp::getStartSLURL().isValid())
|
||||
if (LLStartUp::getStartSLURL().isValid() &&
|
||||
(gSavedSettings.getBOOL("SLURLPassToOtherInstance")))
|
||||
{
|
||||
if (sendURLToOtherInstance(LLStartUp::getStartSLURL().getSLURLString()))
|
||||
{
|
||||
|
|
@ -2810,6 +2825,8 @@ bool LLAppViewer::initWindow()
|
|||
gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
|
||||
gSavedSettings.getBOOL("WindowFullScreen"), ignorePixelDepth);
|
||||
|
||||
LL_INFOS("AppInit") << "gViewerwindow created." << LL_ENDL;
|
||||
|
||||
// Need to load feature table before cheking to start watchdog.
|
||||
const S32 NEVER_SUBMIT_REPORT = 2;
|
||||
bool use_watchdog = false;
|
||||
|
|
@ -2829,6 +2846,7 @@ bool LLAppViewer::initWindow()
|
|||
{
|
||||
LLWatchdog::getInstance()->init(watchdog_killer_callback);
|
||||
}
|
||||
LL_INFOS("AppInit") << "watchdog setting is done." << LL_ENDL;
|
||||
|
||||
LLNotificationsUI::LLNotificationManager::getInstance();
|
||||
|
||||
|
|
@ -2851,7 +2869,8 @@ bool LLAppViewer::initWindow()
|
|||
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
|
||||
|
||||
gPipeline.init();
|
||||
|
||||
LL_INFOS("AppInit") << "gPipeline Initialized" << LL_ENDL;
|
||||
|
||||
stop_glerror();
|
||||
gViewerWindow->initGLDefaults();
|
||||
|
||||
|
|
@ -2890,7 +2909,7 @@ bool LLAppViewer::initWindow()
|
|||
// show viewer window
|
||||
//gViewerWindow->mWindow->show();
|
||||
|
||||
|
||||
LL_INFOS("AppInit") << "Window initialization done." << LL_ENDL;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -3730,14 +3749,12 @@ bool LLAppViewer::initCache()
|
|||
dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
|
||||
|
||||
std::string mask;
|
||||
mask = gDirUtilp->getDirDelimiter();
|
||||
mask += VFS_DATA_FILE_BASE;
|
||||
mask = VFS_DATA_FILE_BASE;
|
||||
mask += "*";
|
||||
|
||||
gDirUtilp->deleteFilesInDir(dir, mask);
|
||||
|
||||
mask = gDirUtilp->getDirDelimiter();
|
||||
mask += VFS_INDEX_FILE_BASE;
|
||||
mask = VFS_INDEX_FILE_BASE;
|
||||
mask += "*";
|
||||
|
||||
gDirUtilp->deleteFilesInDir(dir, mask);
|
||||
|
|
@ -3803,11 +3820,11 @@ bool LLAppViewer::initCache()
|
|||
|
||||
void LLAppViewer::purgeCache()
|
||||
{
|
||||
LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << llendl;
|
||||
LL_INFOS("AppCache") << "Purging Cache and Texture Cache..." << LL_ENDL;
|
||||
LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE);
|
||||
LLVOCache::getInstance()->removeCache(LL_PATH_CACHE);
|
||||
std::string mask = gDirUtilp->getDirDelimiter() + "*.*";
|
||||
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
|
||||
std::string mask = "*.*";
|
||||
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""), mask);
|
||||
}
|
||||
|
||||
std::string LLAppViewer::getSecondLifeTitle() const
|
||||
|
|
|
|||
|
|
@ -295,23 +295,44 @@ void create_console()
|
|||
// redirect unbuffered STDOUT to the console
|
||||
l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
|
||||
fp = _fdopen( h_con_handle, "w" );
|
||||
*stdout = *fp;
|
||||
setvbuf( stdout, NULL, _IONBF, 0 );
|
||||
if (h_con_handle == -1)
|
||||
{
|
||||
llwarns << "create_console() failed to open stdout handle" << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
fp = _fdopen( h_con_handle, "w" );
|
||||
*stdout = *fp;
|
||||
setvbuf( stdout, NULL, _IONBF, 0 );
|
||||
}
|
||||
|
||||
// redirect unbuffered STDIN to the console
|
||||
l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE);
|
||||
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
|
||||
fp = _fdopen( h_con_handle, "r" );
|
||||
*stdin = *fp;
|
||||
setvbuf( stdin, NULL, _IONBF, 0 );
|
||||
if (h_con_handle == -1)
|
||||
{
|
||||
llwarns << "create_console() failed to open stdin handle" << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
fp = _fdopen( h_con_handle, "r" );
|
||||
*stdin = *fp;
|
||||
setvbuf( stdin, NULL, _IONBF, 0 );
|
||||
}
|
||||
|
||||
// redirect unbuffered STDERR to the console
|
||||
l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE);
|
||||
h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
|
||||
fp = _fdopen( h_con_handle, "w" );
|
||||
*stderr = *fp;
|
||||
setvbuf( stderr, NULL, _IONBF, 0 );
|
||||
if (h_con_handle == -1)
|
||||
{
|
||||
llwarns << "create_console() failed to open stderr handle" << llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
fp = _fdopen( h_con_handle, "w" );
|
||||
*stderr = *fp;
|
||||
setvbuf( stderr, NULL, _IONBF, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
LLAppViewerWin32::LLAppViewerWin32(const char* cmd_line) :
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
#include "llhints.h"
|
||||
#include "llimfloater.h" // for LLIMFloater
|
||||
#include "llnearbychatbar.h"
|
||||
#include "llnearbychatbarlistener.h"
|
||||
#include "llsidetray.h"
|
||||
#include "llspeakbutton.h"
|
||||
#include "llsplitbutton.h"
|
||||
|
|
@ -537,6 +538,8 @@ BOOL LLBottomTray::postBuild()
|
|||
mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar");
|
||||
LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle());
|
||||
|
||||
mListener.reset(new LLNearbyChatBarListener(*mNearbyChatBar));
|
||||
|
||||
mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel");
|
||||
mNearbyCharResizeHandlePanel = getChild<LLPanel>("chat_bar_resize_handle_panel");
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ class LLIMChiclet;
|
|||
class LLBottomTrayLite;
|
||||
class LLLayoutPanel;
|
||||
class LLMenuGL;
|
||||
class LLNearbyChatBarListener;
|
||||
|
||||
// Build time optimization, generate once in .cpp file
|
||||
#ifndef LLBOTTOMTRAY_CPP
|
||||
|
|
@ -555,6 +556,9 @@ protected:
|
|||
* Image used to show position where dragged button will be dropped.
|
||||
*/
|
||||
LLUIImage* mImageDragIndication;
|
||||
|
||||
// We want only one LLNearbyChatBarListener object, so it's tied to this singleton
|
||||
boost::shared_ptr<LLNearbyChatBarListener> mListener;
|
||||
};
|
||||
|
||||
#endif // LL_LLBOTTOMPANEL_H
|
||||
|
|
|
|||
|
|
@ -671,6 +671,9 @@ void LLChatBar::onCommitGesture(LLUICtrl* ctrl)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* Cruft - global gChatHandler declared below has been commented out,
|
||||
so this class is never used. See similar code in llnearbychatbar.cpp
|
||||
class LLChatHandler : public LLCommandHandler
|
||||
{
|
||||
public:
|
||||
|
|
@ -691,7 +694,7 @@ public:
|
|||
{
|
||||
S32 channel = tokens[0].asInteger();
|
||||
// VWR-19499 Restrict function to chat channels greater than 0.
|
||||
if ((channel > 0) && (channel < 2147483647))
|
||||
if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
|
||||
{
|
||||
retval = true;
|
||||
// Say mesg on channel
|
||||
|
|
@ -710,3 +713,4 @@ public:
|
|||
|
||||
// Creating the object registers with the dispatcher.
|
||||
//LLChatHandler gChatHandler;
|
||||
cruft */
|
||||
|
|
|
|||
|
|
@ -94,6 +94,13 @@ void LLStandardBumpmap::restoreGL()
|
|||
// static
|
||||
void LLStandardBumpmap::addstandard()
|
||||
{
|
||||
if(!gTextureList.isInitialized())
|
||||
{
|
||||
//Note: loading pre-configuration sometimes triggers this call.
|
||||
//But it is safe to return here because bump images will be reloaded during initialization later.
|
||||
return ;
|
||||
}
|
||||
|
||||
// can't assert; we destroyGL and restoreGL a lot during *first* startup, which populates this list already, THEN we explicitly init the list as part of *normal* startup. Sigh. So clear the list every time before we (re-)add the standard bumpmaps.
|
||||
//llassert( LLStandardBumpmap::sStandardBumpmapCount == 0 );
|
||||
clear();
|
||||
|
|
@ -891,6 +898,7 @@ void LLBumpImageList::restoreGL()
|
|||
{
|
||||
if(!gTextureList.isInitialized())
|
||||
{
|
||||
//safe to return here because bump images will be reloaded during initialization later.
|
||||
return ;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -765,7 +765,7 @@ void LLFeatureManager::applyBaseMasks()
|
|||
{
|
||||
maskFeatures("OpenGLPre30");
|
||||
}
|
||||
if (gGLManager.mNumTextureUnits <= 8)
|
||||
if (gGLManager.mNumTextureImageUnits <= 8)
|
||||
{
|
||||
maskFeatures("TexUnit8orLess");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -131,7 +131,7 @@ void LLFirstUse::notMoving(bool enable)
|
|||
// static
|
||||
void LLFirstUse::viewPopup(bool enable)
|
||||
{
|
||||
firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right"));
|
||||
// firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right"));
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -98,7 +98,8 @@
|
|||
#include "llvfile.h"
|
||||
#include "llvfs.h"
|
||||
#include "llcallbacklist.h"
|
||||
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llanimationstates.h"
|
||||
#include "glod/glod.h"
|
||||
|
||||
//static
|
||||
|
|
@ -381,12 +382,6 @@ LLFloaterModelPreview::~LLFloaterModelPreview()
|
|||
{
|
||||
sInstance = NULL;
|
||||
|
||||
if ( mModelPreview && mModelPreview->getResetJointFlag() )
|
||||
{
|
||||
gAgentAvatarp->resetJointPositions();
|
||||
}
|
||||
|
||||
|
||||
if ( mModelPreview )
|
||||
{
|
||||
delete mModelPreview;
|
||||
|
|
@ -1577,7 +1572,7 @@ bool LLModelLoader::doLoadModel()
|
|||
{
|
||||
//llinfos<<"joint "<<lookingForJoint.c_str()<<llendl;
|
||||
LLMatrix4 jointTransform = mJointList[lookingForJoint];
|
||||
LLJoint* pJoint = gAgentAvatarp->getJoint( lookingForJoint );
|
||||
LLJoint* pJoint = mPreview->getPreviewAvatar()->getJoint( lookingForJoint );
|
||||
if ( pJoint )
|
||||
{
|
||||
pJoint->storeCurrentXform( jointTransform.getTranslation() );
|
||||
|
|
@ -2597,6 +2592,7 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
|
|||
mLoading = false;
|
||||
mLoadState = LLModelLoader::STARTING;
|
||||
mGroup = 0;
|
||||
mLODFrozen = false;
|
||||
mBuildShareTolerance = 0.f;
|
||||
mBuildQueueMode = GLOD_QUEUE_GREEDY;
|
||||
mBuildBorderMode = GLOD_BORDER_UNLOCK;
|
||||
|
|
@ -2605,6 +2601,13 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
|
|||
for (U32 i = 0; i < LLModel::NUM_LODS; ++i)
|
||||
{
|
||||
mRequestedTriangleCount[i] = 0;
|
||||
mRequestedCreaseAngle[i] = -1.f;
|
||||
mRequestedLoDMode[i] = 0;
|
||||
mRequestedErrorThreshold[i] = 0.f;
|
||||
mRequestedBuildOperator[i] = 0;
|
||||
mRequestedQueueMode[i] = 0;
|
||||
mRequestedBorderMode[i] = 0;
|
||||
mRequestedShareTolerance[i] = 0.f;
|
||||
}
|
||||
|
||||
mViewOption["show_textures"] = false;
|
||||
|
|
@ -2649,6 +2652,8 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp)
|
|||
mMasterLegacyJointList.push_front("mHipLeft");
|
||||
mMasterLegacyJointList.push_front("mKneeLeft");
|
||||
mMasterLegacyJointList.push_front("mFootLeft");
|
||||
|
||||
createPreviewAvatar();
|
||||
}
|
||||
|
||||
LLModelPreview::~LLModelPreview()
|
||||
|
|
@ -2702,7 +2707,7 @@ U32 LLModelPreview::calcResourceCost()
|
|||
|
||||
if ( mFMP && mFMP->childGetValue("upload_joints").asBoolean() )
|
||||
{
|
||||
gAgentAvatarp->setPelvisOffset( mPelvisZOffset );
|
||||
getPreviewAvatar()->setPelvisOffset( mPelvisZOffset );
|
||||
}
|
||||
|
||||
F32 streaming_cost = 0.f;
|
||||
|
|
@ -3247,6 +3252,8 @@ void LLModelPreview::generateNormals()
|
|||
|
||||
F32 angle_cutoff = mFMP->childGetValue("crease_angle").asReal();
|
||||
|
||||
mRequestedCreaseAngle[which_lod] = angle_cutoff;
|
||||
|
||||
angle_cutoff *= DEG_TO_RAD;
|
||||
|
||||
if (which_lod == 3 && !mBaseModel.empty())
|
||||
|
|
@ -3266,7 +3273,7 @@ void LLModelPreview::generateNormals()
|
|||
|
||||
mVertexBuffer[which_lod].clear();
|
||||
refresh();
|
||||
|
||||
updateStatusMessages();
|
||||
}
|
||||
|
||||
void LLModelPreview::clearMaterials()
|
||||
|
|
@ -3342,6 +3349,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
|
|||
{
|
||||
lod_mode = iface->getFirstSelectedIndex();
|
||||
}
|
||||
mRequestedLoDMode[mPreviewLOD] = lod_mode;
|
||||
|
||||
F32 lod_error_threshold = mFMP->childGetValue("lod_error_threshold").asReal();
|
||||
|
||||
|
|
@ -3365,6 +3373,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
|
|||
{
|
||||
build_operator = iface->getFirstSelectedIndex();
|
||||
}
|
||||
mRequestedBuildOperator[mPreviewLOD] = build_operator;
|
||||
|
||||
if (build_operator == 0)
|
||||
{
|
||||
|
|
@ -3381,6 +3390,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
|
|||
{
|
||||
queue_mode = iface->getFirstSelectedIndex();
|
||||
}
|
||||
mRequestedQueueMode[mPreviewLOD] = queue_mode;
|
||||
|
||||
if (queue_mode == 0)
|
||||
{
|
||||
|
|
@ -3402,6 +3412,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
|
|||
{
|
||||
border_mode = iface->getFirstSelectedIndex();
|
||||
}
|
||||
mRequestedBorderMode[mPreviewLOD] = border_mode;
|
||||
|
||||
if (border_mode == 0)
|
||||
{
|
||||
|
|
@ -3437,6 +3448,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
|
|||
mBuildShareTolerance = share_tolerance;
|
||||
object_dirty = true;
|
||||
}
|
||||
mRequestedShareTolerance[mPreviewLOD] = share_tolerance;
|
||||
|
||||
if (mGroup == 0)
|
||||
{
|
||||
|
|
@ -3545,6 +3557,7 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
|
|||
U32 submeshes = 0;
|
||||
|
||||
mRequestedTriangleCount[lod] = triangle_count;
|
||||
mRequestedErrorThreshold[lod] = lod_error_threshold;
|
||||
|
||||
glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode);
|
||||
stop_gloderror();
|
||||
|
|
@ -3832,6 +3845,18 @@ void LLModelPreview::updateStatusMessages()
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
//make sure no hulls have more than 256 points in them
|
||||
for (U32 i = 0; upload_ok && i < mModel[LLModel::LOD_PHYSICS].size(); ++i)
|
||||
{
|
||||
LLModel* mdl = mModel[LLModel::LOD_PHYSICS][i];
|
||||
|
||||
for (U32 j = 0; upload_ok && j < mdl->mPhysics.mHull.size(); ++j)
|
||||
{
|
||||
upload_ok = upload_ok && mdl->mPhysics.mHull[i].size() <= 256;
|
||||
}
|
||||
}
|
||||
|
||||
bool errorStateFromLoader = getLoadState() >= LLModelLoader::ERROR_PARSING ? true : false;
|
||||
|
||||
bool skinAndRigOk = true;
|
||||
|
|
@ -3855,6 +3880,10 @@ void LLModelPreview::updateStatusMessages()
|
|||
{
|
||||
mFMP->childEnable("ok_btn");
|
||||
}
|
||||
else
|
||||
{
|
||||
mFMP->childDisable("ok_btn");
|
||||
}
|
||||
|
||||
//add up physics triangles etc
|
||||
S32 start = 0;
|
||||
|
|
@ -4021,6 +4050,9 @@ void LLModelPreview::updateStatusMessages()
|
|||
{ // auto generate, also the default case for wizard which has no radio selection
|
||||
fmp->mLODMode[mPreviewLOD] = 1;
|
||||
|
||||
//don't actually regenerate lod when refreshing UI
|
||||
mLODFrozen = true;
|
||||
|
||||
for (U32 i = 0; i < num_file_controls; ++i)
|
||||
{
|
||||
mFMP->childDisable(file_controls[i]);
|
||||
|
|
@ -4033,20 +4065,21 @@ void LLModelPreview::updateStatusMessages()
|
|||
|
||||
//if (threshold)
|
||||
{
|
||||
U32 lod_mode = 0;
|
||||
LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode");
|
||||
if (iface)
|
||||
{
|
||||
lod_mode = iface->getFirstSelectedIndex();
|
||||
}
|
||||
|
||||
LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold");
|
||||
LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit");
|
||||
|
||||
limit->setMaxValue(mMaxTriangleLimit);
|
||||
limit->setValue(mRequestedTriangleCount[mPreviewLOD]);
|
||||
limit->forceSetValue(mRequestedTriangleCount[mPreviewLOD]);
|
||||
|
||||
if (lod_mode == 0)
|
||||
threshold->forceSetValue(mRequestedErrorThreshold[mPreviewLOD]);
|
||||
|
||||
mFMP->getChild<LLComboBox>("lod_mode")->selectNthItem(mRequestedLoDMode[mPreviewLOD]);
|
||||
mFMP->getChild<LLComboBox>("build_operator")->selectNthItem(mRequestedBuildOperator[mPreviewLOD]);
|
||||
mFMP->getChild<LLComboBox>("queue_mode")->selectNthItem(mRequestedQueueMode[mPreviewLOD]);
|
||||
mFMP->getChild<LLComboBox>("border_mode")->selectNthItem(mRequestedBorderMode[mPreviewLOD]);
|
||||
mFMP->getChild<LLSpinCtrl>("share_tolerance")->setValue(mRequestedShareTolerance[mPreviewLOD]);
|
||||
|
||||
if (mRequestedLoDMode[mPreviewLOD] == 0)
|
||||
{
|
||||
limit->setVisible(true);
|
||||
threshold->setVisible(false);
|
||||
|
|
@ -4060,6 +4093,8 @@ void LLModelPreview::updateStatusMessages()
|
|||
threshold->setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
mLODFrozen = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4075,6 +4110,20 @@ void LLModelPreview::updateStatusMessages()
|
|||
mFMP->childDisable("physics_file");
|
||||
mFMP->childDisable("physics_browse");
|
||||
}
|
||||
|
||||
LLSpinCtrl* crease = mFMP->getChild<LLSpinCtrl>("crease_angle");
|
||||
|
||||
if (mRequestedCreaseAngle[mPreviewLOD] == -1.f)
|
||||
{
|
||||
mFMP->childSetColor("crease_label", LLColor4::grey);
|
||||
crease->forceSetValue(75.f);
|
||||
}
|
||||
else
|
||||
{
|
||||
mFMP->childSetColor("crease_label", LLColor4::white);
|
||||
crease->forceSetValue(mRequestedCreaseAngle[mPreviewLOD]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLModelPreview::setPreviewTarget(F32 distance)
|
||||
|
|
@ -4241,42 +4290,6 @@ void LLModelPreview::update()
|
|||
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// changeAvatarsJointPositions()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLModelPreview::changeAvatarsJointPositions( LLModel* pModel )
|
||||
{
|
||||
if ( mMasterJointList.empty() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<std::string> :: const_iterator jointListItBegin = pModel->mSkinInfo.mJointNames.begin();
|
||||
std::vector<std::string> :: const_iterator jointListItEnd = pModel->mSkinInfo.mJointNames.end();
|
||||
|
||||
S32 index = 0;
|
||||
for ( ; jointListItBegin!=jointListItEnd; ++jointListItBegin, ++index )
|
||||
{
|
||||
std::string elem = *jointListItBegin;
|
||||
//llinfos<<"joint "<<elem<<llendl;
|
||||
|
||||
S32 matrixCnt = pModel->mSkinInfo.mAlternateBindMatrix.size();
|
||||
if ( matrixCnt < 1 )
|
||||
{
|
||||
llinfos<<"Total WTF moment :"<<matrixCnt<<llendl;
|
||||
}
|
||||
else
|
||||
{
|
||||
LLMatrix4 jointTransform = pModel->mSkinInfo.mAlternateBindMatrix[index];
|
||||
|
||||
LLJoint* pJoint = gAgentAvatarp->getJoint( elem );
|
||||
if ( pJoint )
|
||||
{
|
||||
pJoint->storeCurrentXform( jointTransform.getTranslation() );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// getTranslationForJointOffset()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint )
|
||||
|
|
@ -4289,6 +4302,30 @@ LLVector3 LLModelPreview::getTranslationForJointOffset( std::string joint )
|
|||
}
|
||||
return LLVector3(0.0f,0.0f,0.0f);
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// createPreviewAvatar
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLModelPreview::createPreviewAvatar( void )
|
||||
{
|
||||
mPreviewAvatar = (LLVOAvatar*)gObjectList.createObjectViewer( LL_PCODE_LEGACY_AVATAR, gAgent.getRegion() );
|
||||
if ( mPreviewAvatar )
|
||||
{
|
||||
mPreviewAvatar->createDrawable( &gPipeline );
|
||||
mPreviewAvatar->mIsDummy = TRUE;
|
||||
mPreviewAvatar->mSpecialRenderMode = 1;
|
||||
mPreviewAvatar->setPositionAgent( LLVector3::zero );
|
||||
mPreviewAvatar->slamPosition();
|
||||
mPreviewAvatar->updateJointLODs();
|
||||
mPreviewAvatar->updateGeometry( mPreviewAvatar->mDrawable );
|
||||
mPreviewAvatar->startMotion( ANIM_AGENT_STAND );
|
||||
mPreviewAvatar->hideSkirt();
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos<<"Failed to create preview avatar for upload model window"<<llendl;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// render()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -4403,25 +4440,6 @@ BOOL LLModelPreview::render()
|
|||
|
||||
mFMP->childSetEnabled("upload_joints", upload_skin);
|
||||
|
||||
//poke at avatar when we upload custom joints
|
||||
/*
|
||||
if ( upload_joints )
|
||||
{
|
||||
for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
|
||||
{
|
||||
for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter)
|
||||
{
|
||||
LLModelInstance& instance = *model_iter;
|
||||
LLModel* model = instance.mModel;
|
||||
if ( !model->mSkinWeights.empty() )
|
||||
{
|
||||
changeAvatarsJointPositions( model );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
F32 explode = mFMP->childGetValue("physics_explode").asReal();
|
||||
|
||||
glClear(GL_DEPTH_BUFFER_BIT);
|
||||
|
|
@ -4441,7 +4459,7 @@ BOOL LLModelPreview::render()
|
|||
|
||||
if (skin_weight)
|
||||
{
|
||||
target_pos = gAgentAvatarp->getPositionAgent();
|
||||
target_pos = getPreviewAvatar()->getPositionAgent();
|
||||
z_near = 0.01f;
|
||||
z_far = 1024.f;
|
||||
mCameraDistance = 16.f;
|
||||
|
|
@ -4661,8 +4679,7 @@ BOOL LLModelPreview::render()
|
|||
}
|
||||
else
|
||||
{
|
||||
LLVOAvatarSelf* avatar = gAgentAvatarp;
|
||||
target_pos = avatar->getPositionAgent();
|
||||
target_pos = getPreviewAvatar()->getPositionAgent();
|
||||
|
||||
LLViewerCamera::getInstance()->setOriginAndLookAt(
|
||||
target_pos + ((LLVector3(mCameraDistance, 0.f, 0.f) + offset) * av_rot), // camera
|
||||
|
|
@ -4671,7 +4688,7 @@ BOOL LLModelPreview::render()
|
|||
|
||||
if (joint_positions)
|
||||
{
|
||||
avatar->renderCollisionVolumes();
|
||||
getPreviewAvatar()->renderCollisionVolumes();
|
||||
}
|
||||
|
||||
for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter)
|
||||
|
|
@ -4702,7 +4719,7 @@ BOOL LLModelPreview::render()
|
|||
LLMatrix4 mat[64];
|
||||
for (U32 j = 0; j < model->mSkinInfo.mJointNames.size(); ++j)
|
||||
{
|
||||
LLJoint* joint = avatar->getJoint(model->mSkinInfo.mJointNames[j]);
|
||||
LLJoint* joint = getPreviewAvatar()->getJoint(model->mSkinInfo.mJointNames[j]);
|
||||
if (joint)
|
||||
{
|
||||
mat[j] = model->mSkinInfo.mInvBindMatrix[j];
|
||||
|
|
@ -4925,9 +4942,12 @@ void LLModelPreview::textureLoadedCallback( BOOL success, LLViewerFetchedTexture
|
|||
|
||||
void LLModelPreview::onLODParamCommit(bool enforce_tri_limit)
|
||||
{
|
||||
genLODs(mPreviewLOD, 3, enforce_tri_limit);
|
||||
updateStatusMessages();
|
||||
refresh();
|
||||
if (!mLODFrozen)
|
||||
{
|
||||
genLODs(mPreviewLOD, 3, enforce_tri_limit);
|
||||
updateStatusMessages();
|
||||
refresh();
|
||||
}
|
||||
}
|
||||
|
||||
LLFloaterModelPreview::DecompRequest::DecompRequest(const std::string& stage, LLModel* mdl)
|
||||
|
|
|
|||
|
|
@ -341,6 +341,9 @@ public:
|
|||
|
||||
LLVector3 getTranslationForJointOffset( std::string joint );
|
||||
|
||||
void createPreviewAvatar( void );
|
||||
LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; }
|
||||
|
||||
protected:
|
||||
friend class LLModelLoader;
|
||||
friend class LLFloaterModelPreview;
|
||||
|
|
@ -373,13 +376,20 @@ public:
|
|||
std::map<std::string, bool> mViewOption;
|
||||
|
||||
//GLOD object parameters (must rebuild object if these change)
|
||||
bool mLODFrozen;
|
||||
F32 mBuildShareTolerance;
|
||||
U32 mBuildQueueMode;
|
||||
U32 mBuildOperator;
|
||||
U32 mBuildBorderMode;
|
||||
U32 mRequestedLoDMode[LLModel::NUM_LODS];
|
||||
S32 mRequestedTriangleCount[LLModel::NUM_LODS];
|
||||
F32 mRequestedErrorThreshold[LLModel::NUM_LODS];
|
||||
U32 mRequestedBuildOperator[LLModel::NUM_LODS];
|
||||
U32 mRequestedQueueMode[LLModel::NUM_LODS];
|
||||
U32 mRequestedBorderMode[LLModel::NUM_LODS];
|
||||
F32 mRequestedShareTolerance[LLModel::NUM_LODS];
|
||||
F32 mRequestedCreaseAngle[LLModel::NUM_LODS];
|
||||
|
||||
|
||||
LLModelLoader* mModelLoader;
|
||||
|
||||
LLModelLoader::scene mScene[LLModel::NUM_LODS];
|
||||
|
|
@ -415,6 +425,7 @@ public:
|
|||
std::deque<std::string> mMasterLegacyJointList;
|
||||
std::deque<std::string> mJointsFromNode;
|
||||
JointTransformMap mJointTransformMap;
|
||||
LLPointer<LLVOAvatar> mPreviewAvatar;
|
||||
};
|
||||
|
||||
#endif // LL_LLFLOATERMODELPREVIEW_H
|
||||
|
|
|
|||
|
|
@ -631,6 +631,12 @@ bool LLPanelRegionGeneralInfo::refreshFromRegion(LLViewerRegion* region)
|
|||
getChildView("im_btn")->setEnabled(allow_modify);
|
||||
getChildView("manage_telehub_btn")->setEnabled(allow_modify);
|
||||
|
||||
const bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
|
||||
gAgent.getRegion() &&
|
||||
!gAgent.getRegion()->getCapability("GetMesh").empty() &&
|
||||
!gAgent.getRegion()->getCapability("ObjectAdd").empty();
|
||||
getChildView("mesh_rez_enabled_check")->setVisible(enable_mesh);
|
||||
getChildView("mesh_rez_enabled_check")->setEnabled(getChildView("mesh_rez_enabled_check")->getEnabled() && enable_mesh);
|
||||
// Data gets filled in by processRegionInfo
|
||||
|
||||
return LLPanelRegionInfo::refreshFromRegion(region);
|
||||
|
|
|
|||
|
|
@ -85,6 +85,7 @@
|
|||
#include "llviewerwindow.h"
|
||||
#include "llvovolume.h"
|
||||
#include "lluictrlfactory.h"
|
||||
#include "llaccountingquotamanager.h"
|
||||
|
||||
// Globals
|
||||
LLFloaterTools *gFloaterTools = NULL;
|
||||
|
|
@ -422,7 +423,7 @@ void LLFloaterTools::refresh()
|
|||
// Refresh object and prim count labels
|
||||
LLLocale locale(LLLocale::USER_LOCALE);
|
||||
|
||||
if ((gAgent.getRegion() && gAgent.getRegion()->getCapability("GetMesh").empty()) || !gSavedSettings.getBOOL("MeshEnabled"))
|
||||
if ((gAgent.getRegion() && (gAgent.getRegion()->getCapability("GetMesh").empty() || gAgent.getRegion()->getCapability("ObjectAdd").empty())) || !gSavedSettings.getBOOL("MeshEnabled"))
|
||||
{
|
||||
std::string obj_count_string;
|
||||
LLResMgr::getInstance()->getIntegerString(obj_count_string, LLSelectMgr::getInstance()->getSelection()->getRootObjectCount());
|
||||
|
|
@ -789,7 +790,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
|
|||
|
||||
bool show_mesh_cost = gAgent.getRegion() &&
|
||||
!gAgent.getRegion()->getCapability("GetMesh").empty() &&
|
||||
gSavedSettings.getBOOL("MeshEnabled");
|
||||
gSavedSettings.getBOOL("MeshEnabled") &&
|
||||
!gAgent.getRegion()->getCapability("ObjectAdd").empty();
|
||||
|
||||
getChildView("obj_count")->setVisible( !land_visible && !show_mesh_cost);
|
||||
getChildView("prim_count")->setVisible( !land_visible && !show_mesh_cost);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,159 @@
|
|||
/**
|
||||
* @file llgesturelistener.cpp
|
||||
* @author Dave Simmons
|
||||
* @date 2011-03-28
|
||||
* @brief Implementation for LLGestureListener.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llgesturelistener.h"
|
||||
#include "llgesturemgr.h"
|
||||
#include "llmultigesture.h"
|
||||
|
||||
|
||||
LLGestureListener::LLGestureListener()
|
||||
: LLEventAPI("LLGesture",
|
||||
"LLGesture listener interface to control gestures")
|
||||
{
|
||||
add("getActiveGestures",
|
||||
"Return information about the agent's available gestures [\"reply\"]:\n"
|
||||
"[\"gestures\"]: a dictionary with UUID strings as keys\n"
|
||||
" and the following dict values for each entry:\n"
|
||||
" [\"name\"]: name of the gesture, may be empty\n"
|
||||
" [\"trigger\"]: trigger string used to invoke via user chat, may be empty\n"
|
||||
" [\"playing\"]: true or false indicating the playing state",
|
||||
&LLGestureListener::getActiveGestures,
|
||||
LLSDMap("reply", LLSD()));
|
||||
add("isGesturePlaying",
|
||||
"[\"id\"]: UUID of the gesture to query. Returns True or False in [\"playing\"] value of the result",
|
||||
&LLGestureListener::isGesturePlaying);
|
||||
add("startGesture",
|
||||
"[\"id\"]: UUID of the gesture to start playing",
|
||||
&LLGestureListener::startGesture);
|
||||
add("stopGesture",
|
||||
"[\"id\"]: UUID of the gesture to stop",
|
||||
&LLGestureListener::stopGesture);
|
||||
}
|
||||
|
||||
|
||||
// "getActiveGestures" command
|
||||
void LLGestureListener::getActiveGestures(const LLSD& event_data) const
|
||||
{
|
||||
LLSD reply = LLSD::emptyMap();
|
||||
LLSD gesture_map = LLSD::emptyMap();
|
||||
|
||||
const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
|
||||
|
||||
// Scan active gesture map and get all the names
|
||||
LLGestureMgr::item_map_t::const_iterator it;
|
||||
for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
|
||||
{
|
||||
LLMultiGesture* gesture = (*it).second;
|
||||
if (gesture)
|
||||
{ // Add an entry to the result map with the LLUUID as key with a map containing data
|
||||
LLSD info = LLSD::emptyMap();
|
||||
info["name"] = (LLSD::String) gesture->mName;
|
||||
info["trigger"] = (LLSD::String) gesture->mTrigger;
|
||||
info["playing"] = (LLSD::Boolean) gesture->mPlaying;
|
||||
|
||||
gesture_map[(*it).first.asString()] = info;
|
||||
}
|
||||
}
|
||||
|
||||
reply["gestures"] = gesture_map;
|
||||
sendReply(reply, event_data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// "isGesturePlaying" command
|
||||
void LLGestureListener::isGesturePlaying(const LLSD& event_data) const
|
||||
{
|
||||
bool is_playing = false;
|
||||
if (event_data.has("id"))
|
||||
{
|
||||
LLUUID gesture_id = event_data["id"].asUUID();
|
||||
if (gesture_id.notNull())
|
||||
{
|
||||
is_playing = LLGestureMgr::instance().isGesturePlaying(gesture_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "isGesturePlaying did not find a gesture object for " << gesture_id << llendl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "isGesturePlaying didn't have 'id' value passed in" << llendl;
|
||||
}
|
||||
|
||||
LLSD reply = LLSD::emptyMap();
|
||||
reply["playing"] = (LLSD::Boolean) is_playing;
|
||||
sendReply(reply, event_data);
|
||||
}
|
||||
|
||||
|
||||
// "startGesture" command
|
||||
void LLGestureListener::startGesture(LLSD const & event_data) const
|
||||
{
|
||||
startOrStopGesture(event_data, true);
|
||||
}
|
||||
|
||||
|
||||
// "stopGesture" command
|
||||
void LLGestureListener::stopGesture(LLSD const & event_data) const
|
||||
{
|
||||
startOrStopGesture(event_data, false);
|
||||
}
|
||||
|
||||
|
||||
// Real code for "startGesture" or "stopGesture"
|
||||
void LLGestureListener::startOrStopGesture(LLSD const & event_data, bool start) const
|
||||
{
|
||||
if (event_data.has("id"))
|
||||
{
|
||||
LLUUID gesture_id = event_data["id"].asUUID();
|
||||
if (gesture_id.notNull())
|
||||
{
|
||||
if (start)
|
||||
{
|
||||
LLGestureMgr::instance().playGesture(gesture_id);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLGestureMgr::instance().stopGesture(gesture_id);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "startOrStopGesture did not find a gesture object for " << gesture_id << llendl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llwarns << "startOrStopGesture didn't have 'id' value passed in" << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/**
|
||||
* @file llgesturelistener.h
|
||||
* @author Dave Simmons
|
||||
* @date 2011-03-15
|
||||
* @brief Class definition for LLGestureListener.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LL_LLGESTURELISTENER_H
|
||||
#define LL_LLGESTURELISTENER_H
|
||||
|
||||
#include "lleventapi.h"
|
||||
|
||||
class LLSD;
|
||||
|
||||
class LLGestureListener : public LLEventAPI
|
||||
{
|
||||
public:
|
||||
LLGestureListener();
|
||||
|
||||
private:
|
||||
void getActiveGestures(LLSD const & gesture_data) const;
|
||||
void isGesturePlaying(LLSD const & gesture_data) const;
|
||||
void startGesture(LLSD const & gesture_data) const;
|
||||
void stopGesture(LLSD const & gesture_data) const;
|
||||
|
||||
void startOrStopGesture(LLSD const & event_data, bool start) const;
|
||||
};
|
||||
|
||||
#endif // LL_LLGESTURELISTENER_H
|
||||
|
||||
|
|
@ -53,6 +53,7 @@
|
|||
#include "llviewerstats.h"
|
||||
#include "llnearbychatbar.h"
|
||||
#include "llappearancemgr.h"
|
||||
#include "llgesturelistener.h"
|
||||
|
||||
// Longest time, in seconds, to wait for all animations to stop playing
|
||||
const F32 MAX_WAIT_ANIM_SECS = 30.f;
|
||||
|
|
@ -70,6 +71,7 @@ LLGestureMgr::LLGestureMgr()
|
|||
mLoadingCount(0)
|
||||
{
|
||||
gInventory.addObserver(this);
|
||||
mListener.reset(new LLGestureListener());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include "llviewerinventory.h"
|
||||
|
||||
class LLMultiGesture;
|
||||
class LLGestureListener;
|
||||
class LLGestureStep;
|
||||
class LLUUID;
|
||||
class LLVFS;
|
||||
|
|
@ -154,9 +155,9 @@ protected:
|
|||
|
||||
// Used by loadGesture
|
||||
static void onLoadComplete(LLVFS *vfs,
|
||||
const LLUUID& asset_uuid,
|
||||
LLAssetType::EType type,
|
||||
void* user_data, S32 status, LLExtStat ext_status);
|
||||
const LLUUID& asset_uuid,
|
||||
LLAssetType::EType type,
|
||||
void* user_data, S32 status, LLExtStat ext_status);
|
||||
|
||||
// Used by playGesture to load an asset file
|
||||
// required to play a gesture step
|
||||
|
|
@ -185,6 +186,9 @@ private:
|
|||
BOOL mValid;
|
||||
|
||||
std::set<LLUUID> mLoadingAssets;
|
||||
|
||||
// LLEventHost interface
|
||||
boost::shared_ptr<LLGestureListener> mListener;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ F32 get_default_max_prim_scale(bool is_flora)
|
|||
if (gSavedSettings.getBOOL("MeshEnabled") &&
|
||||
gAgent.getRegion() &&
|
||||
!gAgent.getRegion()->getCapability("GetMesh").empty() &&
|
||||
!gAgent.getRegion()->getCapability("ObjectAdd").empty() &&
|
||||
!is_flora)
|
||||
{
|
||||
return DEFAULT_MAX_PRIM_SCALE;
|
||||
|
|
|
|||
|
|
@ -85,6 +85,8 @@ U32 LLMeshRepository::sPeakKbps = 0;
|
|||
|
||||
const U32 MAX_TEXTURE_UPLOAD_RETRIES = 5;
|
||||
|
||||
void dumpLLSDToFile(const LLSD& content, std::string filename);
|
||||
|
||||
std::string header_lod[] =
|
||||
{
|
||||
"lowest_lod",
|
||||
|
|
@ -489,15 +491,36 @@ public:
|
|||
mThread(thread)
|
||||
{
|
||||
}
|
||||
virtual void completedRaw(U32 status, const std::string& reason,
|
||||
const LLChannelDescriptors& channels,
|
||||
const LLIOPipe::buffer_ptr_t& buffer)
|
||||
virtual void completed(U32 status,
|
||||
const std::string& reason,
|
||||
const LLSD& content)
|
||||
{
|
||||
assert_main_thread();
|
||||
//assert_main_thread();
|
||||
llinfos << "completed" << llendl;
|
||||
mThread->mPendingUploads--;
|
||||
dumpLLSDToFile(content,"whole_model_response.xml");
|
||||
|
||||
mThread->mWholeModelUploadURL = content["uploader"].asString();
|
||||
}
|
||||
};
|
||||
|
||||
class LLWholeModelUploadResponder: public LLCurl::Responder
|
||||
{
|
||||
LLMeshUploadThread* mThread;
|
||||
public:
|
||||
LLWholeModelUploadResponder(LLMeshUploadThread* thread):
|
||||
mThread(thread)
|
||||
{
|
||||
}
|
||||
virtual void completed(U32 status,
|
||||
const std::string& reason,
|
||||
const LLSD& content)
|
||||
{
|
||||
//assert_main_thread();
|
||||
llinfos << "upload completed" << llendl;
|
||||
mThread->mPendingUploads--;
|
||||
dumpLLSDToFile(content,"whole_model_upload_response.xml");
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
LLMeshRepoThread::LLMeshRepoThread()
|
||||
|
|
@ -1261,7 +1284,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,
|
|||
|
||||
mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset");
|
||||
mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice");
|
||||
mWholeModelUploadCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
|
||||
mWholeModelFeeCapability = gAgent.getRegion()->getCapability("NewFileAgentInventory");
|
||||
|
||||
mOrigin += gAgent.getAtAxis() * scale.magVec();
|
||||
}
|
||||
|
|
@ -1363,10 +1386,10 @@ void LLMeshUploadThread::run()
|
|||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
void dumpLLSDToFile(LLSD& content, std::string& filename)
|
||||
#if 1
|
||||
void dumpLLSDToFile(const LLSD& content, std::string filename)
|
||||
{
|
||||
std::ofstream of(filename);
|
||||
std::ofstream of(filename.c_str());
|
||||
LLSDSerialize::toPrettyXML(content,of);
|
||||
}
|
||||
#endif
|
||||
|
|
@ -1374,9 +1397,10 @@ void dumpLLSDToFile(LLSD& content, std::string& filename)
|
|||
void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
|
||||
{
|
||||
// TODO where do textures go?
|
||||
|
||||
|
||||
LLSD result;
|
||||
|
||||
LLSD res;
|
||||
result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
|
||||
result["asset_type"] = "mesh";
|
||||
result["inventory_type"] = "object";
|
||||
|
|
@ -1385,9 +1409,9 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
|
|||
|
||||
// TODO "optional" fields from the spec
|
||||
|
||||
LLSD res;
|
||||
res["mesh_list"] = LLSD::emptyArray();
|
||||
res["texture_list"] = LLSD::emptyArray();
|
||||
// TODO Textures
|
||||
//res["texture_list"] = LLSD::emptyArray();
|
||||
S32 mesh_num = 0;
|
||||
S32 texture_num = 0;
|
||||
|
||||
|
|
@ -1433,10 +1457,15 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
|
|||
LLQuaternion rot;
|
||||
LLMatrix4 transformation = instance.mTransform;
|
||||
decomposeMeshMatrix(transformation,pos,rot,scale);
|
||||
|
||||
|
||||
#if 0
|
||||
mesh_entry["childpos"] = ll_sd_from_vector3(pos);
|
||||
mesh_entry["childrot"] = ll_sd_from_quaternion(rot);
|
||||
mesh_entry["scale"] = ll_sd_from_vector3(scale);
|
||||
#endif
|
||||
mesh_entry["position"] = ll_sd_from_vector3(LLVector3());
|
||||
mesh_entry["rotation"] = ll_sd_from_quaternion(rot);
|
||||
mesh_entry["scale"] = ll_sd_from_vector3(scale);
|
||||
|
||||
// TODO should be binary.
|
||||
std::string str = ostr.str();
|
||||
|
|
@ -1480,9 +1509,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
|
|||
}
|
||||
|
||||
result["asset_resources"] = res;
|
||||
#if 0
|
||||
std::string name("whole_model.xml");
|
||||
dumpLLSDToFile(result,name);
|
||||
#if 1
|
||||
dumpLLSDToFile(result,"whole_model.xml");
|
||||
#endif
|
||||
|
||||
dest = result;
|
||||
|
|
@ -1541,9 +1569,24 @@ void LLMeshUploadThread::doWholeModelUpload()
|
|||
|
||||
mPendingUploads++;
|
||||
LLCurlRequest::headers_t headers;
|
||||
mCurlRequest->post(mWholeModelUploadCapability, headers, model_data.asString(),
|
||||
mCurlRequest->post(mWholeModelFeeCapability, headers, model_data,
|
||||
new LLWholeModelFeeResponder(this));
|
||||
|
||||
do
|
||||
{
|
||||
mCurlRequest->process();
|
||||
} while (mCurlRequest->getQueued() > 0);
|
||||
|
||||
mCurlRequest->post(mWholeModelUploadURL, headers, model_data["asset_resources"], new LLWholeModelUploadResponder(this));
|
||||
|
||||
do
|
||||
{
|
||||
mCurlRequest->process();
|
||||
} while (mCurlRequest->getQueued() > 0);
|
||||
|
||||
delete mCurlRequest;
|
||||
mCurlRequest = NULL;
|
||||
|
||||
// Currently a no-op.
|
||||
mFinished = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -387,7 +387,8 @@ public:
|
|||
LLHost mHost;
|
||||
std::string mUploadObjectAssetCapability;
|
||||
std::string mNewInventoryCapability;
|
||||
std::string mWholeModelUploadCapability;
|
||||
std::string mWholeModelFeeCapability;
|
||||
std::string mWholeModelUploadURL;
|
||||
|
||||
std::queue<LLMeshUploadData> mUploadQ;
|
||||
std::queue<LLMeshUploadData> mConfirmedQ;
|
||||
|
|
|
|||
|
|
@ -889,11 +889,11 @@ void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32
|
|||
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
|
||||
}
|
||||
|
||||
class LLChatHandler : public LLCommandHandler
|
||||
class LLChatCommandHandler : public LLCommandHandler
|
||||
{
|
||||
public:
|
||||
// not allowed from outside the app
|
||||
LLChatHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
|
||||
LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
|
||||
|
||||
// Your code here
|
||||
bool handle(const LLSD& tokens, const LLSD& query_map,
|
||||
|
|
@ -909,7 +909,7 @@ public:
|
|||
{
|
||||
S32 channel = tokens[0].asInteger();
|
||||
// VWR-19499 Restrict function to chat channels greater than 0.
|
||||
if ((channel > 0) && (channel < 2147483647))
|
||||
if ((channel > 0) && (channel < CHAT_CHANNEL_DEBUG))
|
||||
{
|
||||
retval = true;
|
||||
// Send unescaped message, see EXT-6353.
|
||||
|
|
@ -927,6 +927,6 @@ public:
|
|||
};
|
||||
|
||||
// Creating the object registers with the dispatcher.
|
||||
LLChatHandler gChatHandler;
|
||||
LLChatCommandHandler gChatHandler;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,100 @@
|
|||
/**
|
||||
* @file llnearbychatbarlistener.cpp
|
||||
* @author Dave Simmons
|
||||
* @date 2011-03-15
|
||||
* @brief Implementation for LLNearbyChatBarListener.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llnearbychatbarlistener.h"
|
||||
#include "llnearbychatbar.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llchat.h"
|
||||
|
||||
|
||||
|
||||
LLNearbyChatBarListener::LLNearbyChatBarListener(LLNearbyChatBar & chatbar)
|
||||
: LLEventAPI("LLChatBar",
|
||||
"LLChatBar listener to (e.g.) sendChat, etc."),
|
||||
mChatbar(chatbar)
|
||||
{
|
||||
add("sendChat",
|
||||
"Send chat to the simulator:\n"
|
||||
"[\"message\"] chat message text [required]\n"
|
||||
"[\"channel\"] chat channel number [default = 0]\n"
|
||||
"[\"type\"] chat type \"whisper\", \"normal\", \"shout\" [default = \"normal\"]",
|
||||
&LLNearbyChatBarListener::sendChat);
|
||||
}
|
||||
|
||||
|
||||
// "sendChat" command
|
||||
void LLNearbyChatBarListener::sendChat(LLSD const & chat_data) const
|
||||
{
|
||||
// Extract the data
|
||||
std::string chat_text = chat_data["message"].asString();
|
||||
|
||||
S32 channel = 0;
|
||||
if (chat_data.has("channel"))
|
||||
{
|
||||
channel = chat_data["channel"].asInteger();
|
||||
if (channel < 0 || channel >= CHAT_CHANNEL_DEBUG)
|
||||
{ // Use 0 up to (but not including) CHAT_CHANNEL_DEBUG
|
||||
channel = 0;
|
||||
}
|
||||
}
|
||||
|
||||
EChatType type_o_chat = CHAT_TYPE_NORMAL;
|
||||
if (chat_data.has("type"))
|
||||
{
|
||||
std::string type_string = chat_data["type"].asString();
|
||||
if (type_string == "whisper")
|
||||
{
|
||||
type_o_chat = CHAT_TYPE_WHISPER;
|
||||
}
|
||||
else if (type_string == "shout")
|
||||
{
|
||||
type_o_chat = CHAT_TYPE_SHOUT;
|
||||
}
|
||||
}
|
||||
|
||||
// Have to prepend /42 style channel numbers
|
||||
std::string chat_to_send;
|
||||
if (channel == 0)
|
||||
{
|
||||
chat_to_send = chat_text;
|
||||
}
|
||||
else
|
||||
{
|
||||
chat_to_send += "/";
|
||||
chat_to_send += chat_data["channel"].asString();
|
||||
chat_to_send += " ";
|
||||
chat_to_send += chat_text;
|
||||
}
|
||||
|
||||
// Send it as if it was typed in
|
||||
mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, (BOOL)(channel == 0));
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/**
|
||||
* @file llnearbychatbarlistener.h
|
||||
* @author Dave Simmons
|
||||
* @date 2011-03-15
|
||||
* @brief Class definition for LLNearbyChatBarListener.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2011&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2011, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LL_LLNEARBYCHATBARLISTENER_H
|
||||
#define LL_LLNEARBYCHATBARLISTENER_H
|
||||
|
||||
#include "lleventapi.h"
|
||||
|
||||
class LLSD;
|
||||
class LLNearbyChatBar;
|
||||
|
||||
class LLNearbyChatBarListener : public LLEventAPI
|
||||
{
|
||||
public:
|
||||
LLNearbyChatBarListener(LLNearbyChatBar & chatbar);
|
||||
|
||||
private:
|
||||
void sendChat(LLSD const & chat_data) const;
|
||||
|
||||
LLNearbyChatBar & mChatbar;
|
||||
};
|
||||
|
||||
#endif // LL_LLNEARBYCHATBARLISTENER_H
|
||||
|
||||
|
|
@ -441,6 +441,8 @@ void LLNearbyChatScreenChannel::reshape (S32 width, S32 height, BOOL called_fr
|
|||
//-----------------------------------------------------------------------------------------------
|
||||
//LLNearbyChatHandler
|
||||
//-----------------------------------------------------------------------------------------------
|
||||
boost::scoped_ptr<LLEventPump> LLNearbyChatHandler::sChatWatcher(new LLEventStream("LLChat"));
|
||||
|
||||
LLNearbyChatHandler::LLNearbyChatHandler(e_notification_type type, const LLSD& id)
|
||||
{
|
||||
mType = type;
|
||||
|
|
@ -487,6 +489,27 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
|
|||
// tmp_chat.mFromName = tmp_chat.mFromID.asString();
|
||||
}
|
||||
|
||||
// Build notification data
|
||||
LLSD notification;
|
||||
notification["message"] = chat_msg.mText;
|
||||
notification["from"] = chat_msg.mFromName;
|
||||
notification["from_id"] = chat_msg.mFromID;
|
||||
notification["time"] = chat_msg.mTime;
|
||||
notification["source"] = (S32)chat_msg.mSourceType;
|
||||
notification["chat_type"] = (S32)chat_msg.mChatType;
|
||||
notification["chat_style"] = (S32)chat_msg.mChatStyle;
|
||||
// Pass sender info so that it can be rendered properly (STORM-1021).
|
||||
notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
|
||||
|
||||
if (chat_msg.mChatType == CHAT_TYPE_DIRECT &&
|
||||
chat_msg.mText.length() > 0 &&
|
||||
chat_msg.mText[0] == '@')
|
||||
{
|
||||
// Send event on to LLEventStream and exit
|
||||
sChatWatcher->post(notification);
|
||||
return;
|
||||
}
|
||||
|
||||
// don't show toast and add message to chat history on receive debug message
|
||||
// with disabled setting showing script errors or enabled setting to show script
|
||||
// errors in separate window.
|
||||
|
|
@ -529,6 +552,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
|
|||
|
||||
}
|
||||
|
||||
// Send event on to LLEventStream
|
||||
sChatWatcher->post(notification);
|
||||
|
||||
|
||||
if( nearby_chat->getVisible()
|
||||
|| ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
|
||||
&& gSavedSettings.getBOOL("UseChatBubbles") )
|
||||
|
|
@ -562,25 +589,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
|
|||
}
|
||||
*/
|
||||
|
||||
// Add a nearby chat toast.
|
||||
LLUUID id;
|
||||
id.generate();
|
||||
|
||||
LLNearbyChatScreenChannel* channel = dynamic_cast<LLNearbyChatScreenChannel*>(mChannel);
|
||||
|
||||
|
||||
if(channel)
|
||||
{
|
||||
LLSD notification;
|
||||
// Add a nearby chat toast.
|
||||
LLUUID id;
|
||||
id.generate();
|
||||
notification["id"] = id;
|
||||
notification["message"] = chat_msg.mText;
|
||||
notification["from"] = chat_msg.mFromName;
|
||||
notification["from_id"] = chat_msg.mFromID;
|
||||
notification["time"] = chat_msg.mTime;
|
||||
notification["source"] = (S32)chat_msg.mSourceType;
|
||||
notification["chat_type"] = (S32)chat_msg.mChatType;
|
||||
notification["chat_style"] = (S32)chat_msg.mChatStyle;
|
||||
|
||||
std::string r_color_name = "White";
|
||||
F32 r_color_alpha = 1.0f;
|
||||
LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
|
||||
|
|
@ -588,13 +604,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
|
|||
notification["text_color"] = r_color_name;
|
||||
notification["color_alpha"] = r_color_alpha;
|
||||
notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
|
||||
|
||||
// Pass sender info so that it can be rendered properly (STORM-1021).
|
||||
notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args);
|
||||
|
||||
channel->addNotification(notification);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLNearbyChatHandler::onDeleteToast(LLToast* toast)
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
|
||||
#include "llnotificationhandler.h"
|
||||
|
||||
class LLEventPump;
|
||||
|
||||
//add LLNearbyChatHandler to LLNotificationsUI namespace
|
||||
namespace LLNotificationsUI{
|
||||
|
||||
|
|
@ -44,6 +46,8 @@ public:
|
|||
protected:
|
||||
virtual void onDeleteToast(LLToast* toast);
|
||||
virtual void initChannel();
|
||||
|
||||
static boost::scoped_ptr<LLEventPump> sChatWatcher;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ public:
|
|||
private:
|
||||
//TODO (*)
|
||||
std::map<std::string, boost::shared_ptr<LLEventHandler> > mNotifyHandlers;
|
||||
std::map<std::string, LLChatHandler*> mChatHandlers;
|
||||
// cruft std::map<std::string, LLChatHandler*> mChatHandlers;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,11 +33,9 @@
|
|||
#include "lleconomy.h"
|
||||
#include "llerror.h"
|
||||
#include "llfontgl.h"
|
||||
#include "llmaterialtable.h"
|
||||
#include "llpermissionsflags.h"
|
||||
#include "llstring.h"
|
||||
#include "llvolume.h"
|
||||
#include "material_codes.h"
|
||||
#include "m3math.h"
|
||||
|
||||
// project includes
|
||||
|
|
@ -57,7 +55,6 @@
|
|||
#include "lltool.h"
|
||||
#include "lltoolcomp.h"
|
||||
#include "lltoolmgr.h"
|
||||
#include "lltrans.h"
|
||||
#include "llui.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerregion.h"
|
||||
|
|
@ -101,17 +98,6 @@ BOOL LLPanelObject::postBuild()
|
|||
{
|
||||
setMouseOpaque(FALSE);
|
||||
|
||||
std::map<std::string, std::string> material_name_map;
|
||||
material_name_map["Stone"]= LLTrans::getString("Stone");
|
||||
material_name_map["Metal"]= LLTrans::getString("Metal");
|
||||
material_name_map["Glass"]= LLTrans::getString("Glass");
|
||||
material_name_map["Wood"]= LLTrans::getString("Wood");
|
||||
material_name_map["Flesh"]= LLTrans::getString("Flesh");
|
||||
material_name_map["Plastic"]= LLTrans::getString("Plastic");
|
||||
material_name_map["Rubber"]= LLTrans::getString("Rubber");
|
||||
material_name_map["Light"]= LLTrans::getString("Light");
|
||||
|
||||
LLMaterialTable::basic.initTableTransNames(material_name_map);
|
||||
//--------------------------------------------------------
|
||||
// Top
|
||||
//--------------------------------------------------------
|
||||
|
|
@ -166,22 +152,6 @@ BOOL LLPanelObject::postBuild()
|
|||
|
||||
//--------------------------------------------------------
|
||||
|
||||
// material type popup
|
||||
mComboMaterial = getChild<LLComboBox>("material");
|
||||
childSetCommitCallback("material",onCommitMaterial,this);
|
||||
mComboMaterial->removeall();
|
||||
|
||||
for (LLMaterialTable::info_list_t::iterator iter = LLMaterialTable::basic.mMaterialInfoList.begin();
|
||||
iter != LLMaterialTable::basic.mMaterialInfoList.end(); ++iter)
|
||||
{
|
||||
LLMaterialInfo* minfop = *iter;
|
||||
if (minfop->mMCode != LL_MCODE_LIGHT)
|
||||
{
|
||||
mComboMaterial->add(minfop->mName);
|
||||
}
|
||||
}
|
||||
mComboMaterialItemCount = mComboMaterial->getItemCount();
|
||||
|
||||
// Base Type
|
||||
mComboBaseType = getChild<LLComboBox>("comboBaseType");
|
||||
childSetCommitCallback("comboBaseType",onCommitParametric,this);
|
||||
|
|
@ -309,7 +279,6 @@ BOOL LLPanelObject::postBuild()
|
|||
|
||||
LLPanelObject::LLPanelObject()
|
||||
: LLPanel(),
|
||||
mComboMaterialItemCount(0),
|
||||
mIsPhysical(FALSE),
|
||||
mIsTemporary(FALSE),
|
||||
mIsPhantom(FALSE),
|
||||
|
|
@ -527,43 +496,6 @@ void LLPanelObject::getState( )
|
|||
mCheckCastShadows->setEnabled( roots_selected==1 && editable );
|
||||
#endif
|
||||
|
||||
// Update material part
|
||||
// slightly inefficient - materials are unique per object, not per TE
|
||||
U8 material_code = 0;
|
||||
struct f : public LLSelectedTEGetFunctor<U8>
|
||||
{
|
||||
U8 get(LLViewerObject* object, S32 te)
|
||||
{
|
||||
return object->getMaterial();
|
||||
}
|
||||
} func;
|
||||
bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code );
|
||||
std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
|
||||
if (editable && single_volume && material_same)
|
||||
{
|
||||
mComboMaterial->setEnabled( TRUE );
|
||||
if (material_code == LL_MCODE_LIGHT)
|
||||
{
|
||||
if (mComboMaterial->getItemCount() == mComboMaterialItemCount)
|
||||
{
|
||||
mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);
|
||||
}
|
||||
mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mComboMaterial->getItemCount() != mComboMaterialItemCount)
|
||||
{
|
||||
mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
|
||||
}
|
||||
|
||||
mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mComboMaterial->setEnabled( FALSE );
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
S32 selected_item = MI_BOX;
|
||||
|
|
@ -1095,12 +1027,9 @@ void LLPanelObject::getState( )
|
|||
mCtrlSculptTexture->setVisible(sculpt_texture_visible);
|
||||
mLabelSculptType->setVisible(sculpt_texture_visible);
|
||||
mCtrlSculptType->setVisible(sculpt_texture_visible);
|
||||
mCtrlSculptMirror->setVisible(sculpt_texture_visible);
|
||||
mCtrlSculptInvert->setVisible(sculpt_texture_visible);
|
||||
|
||||
|
||||
// sculpt texture
|
||||
|
||||
if (selected_item == MI_SCULPT)
|
||||
{
|
||||
|
||||
|
|
@ -1145,7 +1074,7 @@ void LLPanelObject::getState( )
|
|||
if (mCtrlSculptMirror)
|
||||
{
|
||||
mCtrlSculptMirror->set(sculpt_mirror);
|
||||
mCtrlSculptMirror->setEnabled(editable);
|
||||
mCtrlSculptMirror->setEnabled(editable && !isMesh);
|
||||
}
|
||||
|
||||
if (mCtrlSculptInvert)
|
||||
|
|
@ -1166,6 +1095,9 @@ void LLPanelObject::getState( )
|
|||
mSculptTextureRevert = LLUUID::null;
|
||||
}
|
||||
|
||||
mCtrlSculptMirror->setVisible(sculpt_texture_visible && !isMesh);
|
||||
mCtrlSculptInvert->setVisible(sculpt_texture_visible && !isMesh);
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
mObject = objectp;
|
||||
|
|
@ -1244,25 +1176,6 @@ void LLPanelObject::sendCastShadows()
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelObject::onCommitMaterial( LLUICtrl* ctrl, void* userdata )
|
||||
{
|
||||
//LLPanelObject* self = (LLPanelObject*) userdata;
|
||||
LLComboBox* box = (LLComboBox*) ctrl;
|
||||
|
||||
if (box)
|
||||
{
|
||||
// apply the currently selected material to the object
|
||||
const std::string& material_name = box->getSimple();
|
||||
std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
|
||||
if (material_name != LEGACY_FULLBRIGHT_DESC)
|
||||
{
|
||||
U8 material_code = LLMaterialTable::basic.getMCode(material_name);
|
||||
LLSelectMgr::getInstance()->selectionSetMaterial(material_code);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelObject::onCommitParametric( LLUICtrl* ctrl, void* userdata )
|
||||
{
|
||||
|
|
@ -1829,7 +1742,8 @@ void LLPanelObject::refresh()
|
|||
|
||||
bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
|
||||
gAgent.getRegion() &&
|
||||
!gAgent.getRegion()->getCapability("GetMesh").empty();
|
||||
!gAgent.getRegion()->getCapability("GetMesh").empty() &&
|
||||
!gAgent.getRegion()->getCapability("ObjectAdd").empty();
|
||||
|
||||
F32 max_scale = get_default_max_prim_scale(LLPickInfo::isFlora(mObject));
|
||||
|
||||
|
|
@ -1937,7 +1851,6 @@ void LLPanelObject::clearCtrls()
|
|||
mCheckCastShadows->set(FALSE);
|
||||
mCheckCastShadows->setEnabled( FALSE );
|
||||
#endif
|
||||
mComboMaterial ->setEnabled( FALSE );
|
||||
// Disable text labels
|
||||
mLabelPosition ->setEnabled( FALSE );
|
||||
mLabelSize ->setEnabled( FALSE );
|
||||
|
|
|
|||
|
|
@ -66,7 +66,6 @@ public:
|
|||
static void onCommitPhantom( LLUICtrl* ctrl, void* userdata);
|
||||
static void onCommitCastShadows( LLUICtrl* ctrl, void* userdata);
|
||||
static void onCommitPhysics( LLUICtrl* ctrl, void* userdata);
|
||||
static void onCommitMaterial( LLUICtrl* ctrl, void* userdata);
|
||||
|
||||
static void onCommitParametric(LLUICtrl* ctrl, void* userdata);
|
||||
|
||||
|
|
@ -94,10 +93,6 @@ protected:
|
|||
void getVolumeParams(LLVolumeParams& volume_params);
|
||||
|
||||
protected:
|
||||
S32 mComboMaterialItemCount;
|
||||
|
||||
LLComboBox* mComboMaterial;
|
||||
|
||||
// Per-object options
|
||||
LLComboBox* mComboBaseType;
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@
|
|||
#include "lltool.h"
|
||||
#include "lltoolcomp.h"
|
||||
#include "lltoolmgr.h"
|
||||
#include "lltrans.h"
|
||||
#include "llui.h"
|
||||
#include "llviewerobject.h"
|
||||
#include "llviewerregion.h"
|
||||
|
|
@ -156,6 +157,34 @@ BOOL LLPanelVolume::postBuild()
|
|||
mSpinPhysicsRestitution = getChild<LLSpinCtrl>("Physics Restitution");
|
||||
mSpinPhysicsRestitution->setCommitCallback(boost::bind(&LLPanelVolume::sendPhysicsRestitution, this, _1, mSpinPhysicsRestitution));
|
||||
}
|
||||
|
||||
std::map<std::string, std::string> material_name_map;
|
||||
material_name_map["Stone"]= LLTrans::getString("Stone");
|
||||
material_name_map["Metal"]= LLTrans::getString("Metal");
|
||||
material_name_map["Glass"]= LLTrans::getString("Glass");
|
||||
material_name_map["Wood"]= LLTrans::getString("Wood");
|
||||
material_name_map["Flesh"]= LLTrans::getString("Flesh");
|
||||
material_name_map["Plastic"]= LLTrans::getString("Plastic");
|
||||
material_name_map["Rubber"]= LLTrans::getString("Rubber");
|
||||
material_name_map["Light"]= LLTrans::getString("Light");
|
||||
|
||||
LLMaterialTable::basic.initTableTransNames(material_name_map);
|
||||
|
||||
// material type popup
|
||||
mComboMaterial = getChild<LLComboBox>("material");
|
||||
childSetCommitCallback("material",onCommitMaterial,this);
|
||||
mComboMaterial->removeall();
|
||||
|
||||
for (LLMaterialTable::info_list_t::iterator iter = LLMaterialTable::basic.mMaterialInfoList.begin();
|
||||
iter != LLMaterialTable::basic.mMaterialInfoList.end(); ++iter)
|
||||
{
|
||||
LLMaterialInfo* minfop = *iter;
|
||||
if (minfop->mMCode != LL_MCODE_LIGHT)
|
||||
{
|
||||
mComboMaterial->add(minfop->mName);
|
||||
}
|
||||
}
|
||||
mComboMaterialItemCount = mComboMaterial->getItemCount();
|
||||
|
||||
// Start with everyone disabled
|
||||
clearCtrls();
|
||||
|
|
@ -164,7 +193,8 @@ BOOL LLPanelVolume::postBuild()
|
|||
}
|
||||
|
||||
LLPanelVolume::LLPanelVolume()
|
||||
: LLPanel()
|
||||
: LLPanel(),
|
||||
mComboMaterialItemCount(0)
|
||||
{
|
||||
setMouseOpaque(FALSE);
|
||||
|
||||
|
|
@ -379,6 +409,46 @@ void LLPanelVolume::getState( )
|
|||
getChildView("FlexForceZ")->setEnabled(false);
|
||||
}
|
||||
|
||||
// Material properties
|
||||
|
||||
// Update material part
|
||||
// slightly inefficient - materials are unique per object, not per TE
|
||||
U8 material_code = 0;
|
||||
struct f : public LLSelectedTEGetFunctor<U8>
|
||||
{
|
||||
U8 get(LLViewerObject* object, S32 te)
|
||||
{
|
||||
return object->getMaterial();
|
||||
}
|
||||
} func;
|
||||
bool material_same = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material_code );
|
||||
std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
|
||||
if (editable && single_volume && material_same)
|
||||
{
|
||||
mComboMaterial->setEnabled( TRUE );
|
||||
if (material_code == LL_MCODE_LIGHT)
|
||||
{
|
||||
if (mComboMaterial->getItemCount() == mComboMaterialItemCount)
|
||||
{
|
||||
mComboMaterial->add(LEGACY_FULLBRIGHT_DESC);
|
||||
}
|
||||
mComboMaterial->setSimple(LEGACY_FULLBRIGHT_DESC);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mComboMaterial->getItemCount() != mComboMaterialItemCount)
|
||||
{
|
||||
mComboMaterial->remove(LEGACY_FULLBRIGHT_DESC);
|
||||
}
|
||||
|
||||
mComboMaterial->setSimple(std::string(LLMaterialTable::basic.getName(material_code)));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mComboMaterial->setEnabled( FALSE );
|
||||
}
|
||||
|
||||
// Physics properties
|
||||
|
||||
mSpinPhysicsGravity->set(objectp->getPhysicsGravity());
|
||||
|
|
@ -462,12 +532,12 @@ void LLPanelVolume::refresh()
|
|||
|
||||
bool enable_mesh = gSavedSettings.getBOOL("MeshEnabled") &&
|
||||
gAgent.getRegion() &&
|
||||
!gAgent.getRegion()->getCapability("GetMesh").empty();
|
||||
!gAgent.getRegion()->getCapability("GetMesh").empty() &&
|
||||
!gAgent.getRegion()->getCapability("ObjectAdd").empty();
|
||||
|
||||
getChildView("label physicsshapetype")->setVisible(enable_mesh);
|
||||
getChildView("Physics Shape Type Combo Ctrl")->setVisible(enable_mesh);
|
||||
getChildView("Physics Gravity")->setVisible(enable_mesh);
|
||||
getChildView("Physics Material Override")->setVisible(enable_mesh);
|
||||
getChildView("Physics Friction")->setVisible(enable_mesh);
|
||||
getChildView("Physics Density")->setVisible(enable_mesh);
|
||||
getChildView("Physics Restitution")->setVisible(enable_mesh);
|
||||
|
|
@ -522,6 +592,8 @@ void LLPanelVolume::clearCtrls()
|
|||
mSpinPhysicsFriction->setEnabled(FALSE);
|
||||
mSpinPhysicsDensity->setEnabled(FALSE);
|
||||
mSpinPhysicsRestitution->setEnabled(FALSE);
|
||||
|
||||
mComboMaterial->setEnabled( FALSE );
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -673,6 +745,25 @@ void LLPanelVolume::onLightSelectTexture(const LLSD& data)
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelVolume::onCommitMaterial( LLUICtrl* ctrl, void* userdata )
|
||||
{
|
||||
//LLPanelObject* self = (LLPanelObject*) userdata;
|
||||
LLComboBox* box = (LLComboBox*) ctrl;
|
||||
|
||||
if (box)
|
||||
{
|
||||
// apply the currently selected material to the object
|
||||
const std::string& material_name = box->getSimple();
|
||||
std::string LEGACY_FULLBRIGHT_DESC = LLTrans::getString("Fullbright");
|
||||
if (material_name != LEGACY_FULLBRIGHT_DESC)
|
||||
{
|
||||
U8 material_code = LLMaterialTable::basic.getMCode(material_name);
|
||||
LLSelectMgr::getInstance()->selectionSetMaterial(material_code);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLPanelVolume::onCommitLight( LLUICtrl* ctrl, void* userdata )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -63,8 +63,8 @@ public:
|
|||
static void onCommitLight( LLUICtrl* ctrl, void* userdata);
|
||||
static void onCommitIsFlexible( LLUICtrl* ctrl, void* userdata);
|
||||
static void onCommitFlexible( LLUICtrl* ctrl, void* userdata);
|
||||
|
||||
static void onCommitPhysicsParam( LLUICtrl* ctrl, void* userdata);
|
||||
static void onCommitMaterial( LLUICtrl* ctrl, void* userdata);
|
||||
|
||||
void onLightCancelColor(const LLSD& data);
|
||||
void onLightSelectColor(const LLSD& data);
|
||||
|
|
@ -104,6 +104,10 @@ protected:
|
|||
LLSpinCtrl* mSpinForce[3];
|
||||
*/
|
||||
|
||||
S32 mComboMaterialItemCount;
|
||||
LLComboBox* mComboMaterial;
|
||||
|
||||
|
||||
LLColor4 mLightSavedColor;
|
||||
LLUUID mLightSavedTexture;
|
||||
LLPointer<LLViewerObject> mObject;
|
||||
|
|
|
|||
|
|
@ -1997,7 +1997,7 @@ void LLSelectMgr::selectionSetPhysicsType(U8 type)
|
|||
if (object->permModify())
|
||||
{
|
||||
object->setPhysicsShapeType(mType);
|
||||
object->updateFlags();
|
||||
object->updateFlags(TRUE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -2016,7 +2016,7 @@ void LLSelectMgr::selectionSetFriction(F32 friction)
|
|||
if (object->permModify())
|
||||
{
|
||||
object->setPhysicsFriction(mFriction);
|
||||
object->updateFlags();
|
||||
object->updateFlags(TRUE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -2035,7 +2035,7 @@ void LLSelectMgr::selectionSetGravity(F32 gravity )
|
|||
if (object->permModify())
|
||||
{
|
||||
object->setPhysicsGravity(mGravity);
|
||||
object->updateFlags();
|
||||
object->updateFlags(TRUE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -2054,7 +2054,7 @@ void LLSelectMgr::selectionSetDensity(F32 density )
|
|||
if (object->permModify())
|
||||
{
|
||||
object->setPhysicsDensity(mDensity);
|
||||
object->updateFlags();
|
||||
object->updateFlags(TRUE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -2073,7 +2073,7 @@ void LLSelectMgr::selectionSetRestitution(F32 restitution)
|
|||
if (object->permModify())
|
||||
{
|
||||
object->setPhysicsRestitution(mRestitution);
|
||||
object->updateFlags();
|
||||
object->updateFlags(TRUE);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1967,7 +1967,6 @@ bool idle_startup()
|
|||
// Start automatic replay if the flag is set.
|
||||
if (gSavedSettings.getBOOL("StatsAutoRun") || gAgentPilot.getReplaySession())
|
||||
{
|
||||
LLUUID id;
|
||||
LL_DEBUGS("AppInit") << "Starting automatic playback" << LL_ENDL;
|
||||
gAgentPilot.startPlayback();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1513,12 +1513,12 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
|
|||
{
|
||||
const char* subdirs = "0123456789abcdef";
|
||||
std::string delem = gDirUtilp->getDirDelimiter();
|
||||
std::string mask = delem + "*";
|
||||
std::string mask = "*";
|
||||
for (S32 i=0; i<16; i++)
|
||||
{
|
||||
std::string dirname = mTexturesDirName + delem + subdirs[i];
|
||||
llinfos << "Deleting files in directory: " << dirname << llendl;
|
||||
gDirUtilp->deleteFilesInDir(dirname,mask);
|
||||
gDirUtilp->deleteFilesInDir(dirname, mask);
|
||||
if (purge_directories)
|
||||
{
|
||||
LLFile::rmdir(dirname);
|
||||
|
|
|
|||
|
|
@ -54,7 +54,6 @@
|
|||
#include "llviewerobject.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llviewerregion.h"
|
||||
#include "llviewerwindow.h"
|
||||
#include "llvoavatarself.h"
|
||||
#include "llworld.h"
|
||||
|
||||
|
|
@ -387,22 +386,7 @@ void LLToolGrab::startGrab()
|
|||
mDragStartPointGlobal = grab_start_global;
|
||||
mDragStartFromCamera = grab_start_global - gAgentCamera.getCameraPositionGlobal();
|
||||
|
||||
LLMessageSystem *msg = gMessageSystem;
|
||||
msg->newMessageFast(_PREHASH_ObjectGrab);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_ObjectData);
|
||||
msg->addU32Fast(_PREHASH_LocalID, objectp->mLocalID);
|
||||
msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset );
|
||||
msg->nextBlock("SurfaceInfo");
|
||||
msg->addVector3("UVCoord", LLVector3(mGrabPick.mUVCoords));
|
||||
msg->addVector3("STCoord", LLVector3(mGrabPick.mSTCoords));
|
||||
msg->addS32Fast(_PREHASH_FaceIndex, mGrabPick.mObjectFace);
|
||||
msg->addVector3("Position", mGrabPick.mIntersection);
|
||||
msg->addVector3("Normal", mGrabPick.mNormal);
|
||||
msg->addVector3("Binormal", mGrabPick.mBinormal);
|
||||
msg->sendMessage( objectp->getRegion()->getHost());
|
||||
send_ObjectGrab_message(objectp, mGrabPick, grab_offset);
|
||||
|
||||
mGrabOffsetFromCenterInitial = grab_offset;
|
||||
mGrabHiddenOffsetFromCamera = mDragStartFromCamera;
|
||||
|
|
@ -1036,28 +1020,12 @@ void LLToolGrab::stopGrab()
|
|||
}
|
||||
|
||||
// Next, send messages to simulator
|
||||
LLMessageSystem *msg = gMessageSystem;
|
||||
switch(mMode)
|
||||
{
|
||||
case GRAB_ACTIVE_CENTER:
|
||||
case GRAB_NONPHYSICAL:
|
||||
case GRAB_LOCKED:
|
||||
msg->newMessageFast(_PREHASH_ObjectDeGrab);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_ObjectData);
|
||||
msg->addU32Fast(_PREHASH_LocalID, objectp->mLocalID);
|
||||
msg->nextBlock("SurfaceInfo");
|
||||
msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
|
||||
msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
|
||||
msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
|
||||
msg->addVector3("Position", pick.mIntersection);
|
||||
msg->addVector3("Normal", pick.mNormal);
|
||||
msg->addVector3("Binormal", pick.mBinormal);
|
||||
|
||||
msg->sendMessage(objectp->getRegion()->getHost());
|
||||
|
||||
send_ObjectDeGrab_message(objectp, pick);
|
||||
mVerticalDragging = FALSE;
|
||||
break;
|
||||
|
||||
|
|
@ -1109,3 +1077,66 @@ LLVector3d LLToolGrab::getGrabPointGlobal()
|
|||
return gAgent.getPositionGlobal();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset)
|
||||
{
|
||||
if (!object) return;
|
||||
|
||||
LLMessageSystem *msg = gMessageSystem;
|
||||
|
||||
msg->newMessageFast(_PREHASH_ObjectGrab);
|
||||
msg->nextBlockFast( _PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast( _PREHASH_ObjectData);
|
||||
msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
|
||||
msg->addVector3Fast(_PREHASH_GrabOffset, grab_offset);
|
||||
msg->nextBlock("SurfaceInfo");
|
||||
msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
|
||||
msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
|
||||
msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
|
||||
msg->addVector3("Position", pick.mIntersection);
|
||||
msg->addVector3("Normal", pick.mNormal);
|
||||
msg->addVector3("Binormal", pick.mBinormal);
|
||||
msg->sendMessage( object->getRegion()->getHost());
|
||||
|
||||
/* Diagnostic code
|
||||
llinfos << "mUVCoords: " << pick.mUVCoords
|
||||
<< ", mSTCoords: " << pick.mSTCoords
|
||||
<< ", mObjectFace: " << pick.mObjectFace
|
||||
<< ", mIntersection: " << pick.mIntersection
|
||||
<< ", mNormal: " << pick.mNormal
|
||||
<< ", mBinormal: " << pick.mBinormal
|
||||
<< llendl;
|
||||
|
||||
llinfos << "Avatar pos: " << gAgent.getPositionAgent() << llendl;
|
||||
llinfos << "Object pos: " << object->getPosition() << llendl;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick)
|
||||
{
|
||||
if (!object) return;
|
||||
|
||||
LLMessageSystem *msg = gMessageSystem;
|
||||
|
||||
msg->newMessageFast(_PREHASH_ObjectDeGrab);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_ObjectData);
|
||||
msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
|
||||
msg->nextBlock("SurfaceInfo");
|
||||
msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
|
||||
msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
|
||||
msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
|
||||
msg->addVector3("Position", pick.mIntersection);
|
||||
msg->addVector3("Normal", pick.mNormal);
|
||||
msg->addVector3("Binormal", pick.mBinormal);
|
||||
msg->sendMessage(object->getRegion()->getHost());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,13 @@ class LLTextBox;
|
|||
class LLViewerObject;
|
||||
class LLPickInfo;
|
||||
|
||||
|
||||
// Message utilities
|
||||
void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, const LLVector3 &grab_offset);
|
||||
void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick);
|
||||
|
||||
|
||||
|
||||
class LLToolGrab : public LLTool, public LLSingleton<LLToolGrab>
|
||||
{
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -80,6 +80,10 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
|
|||
{
|
||||
r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
|
||||
}
|
||||
else if ( chat.mChatType == CHAT_TYPE_DIRECT )
|
||||
{
|
||||
r_color = LLUIColorTable::instance().getColor("DirectChatColor");
|
||||
}
|
||||
else
|
||||
{
|
||||
r_color = LLUIColorTable::instance().getColor("ObjectChatColor");
|
||||
|
|
@ -146,6 +150,10 @@ void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F
|
|||
{
|
||||
r_color_name = "llOwnerSayChatColor";
|
||||
}
|
||||
else if ( chat.mChatType == CHAT_TYPE_DIRECT )
|
||||
{
|
||||
r_color_name = "DirectChatColor";
|
||||
}
|
||||
else
|
||||
{
|
||||
r_color_name = "ObjectChatColor";
|
||||
|
|
|
|||
|
|
@ -107,6 +107,7 @@
|
|||
#include "llappearancemgr.h"
|
||||
#include "lltrans.h"
|
||||
#include "lleconomy.h"
|
||||
#include "lltoolgrab.h"
|
||||
#include "boost/unordered_map.hpp"
|
||||
|
||||
using namespace LLVOAvatarDefines;
|
||||
|
|
@ -2421,50 +2422,23 @@ class LLObjectEnableReportAbuse : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
void handle_object_touch()
|
||||
{
|
||||
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
|
||||
if (!object) return;
|
||||
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
|
||||
if (!object) return;
|
||||
|
||||
LLPickInfo pick = LLToolPie::getInstance()->getPick();
|
||||
LLPickInfo pick = LLToolPie::getInstance()->getPick();
|
||||
|
||||
LLMessageSystem *msg = gMessageSystem;
|
||||
|
||||
msg->newMessageFast(_PREHASH_ObjectGrab);
|
||||
msg->nextBlockFast( _PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast( _PREHASH_ObjectData);
|
||||
msg->addU32Fast( _PREHASH_LocalID, object->mLocalID);
|
||||
msg->addVector3Fast(_PREHASH_GrabOffset, LLVector3::zero );
|
||||
msg->nextBlock("SurfaceInfo");
|
||||
msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
|
||||
msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
|
||||
msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
|
||||
msg->addVector3("Position", pick.mIntersection);
|
||||
msg->addVector3("Normal", pick.mNormal);
|
||||
msg->addVector3("Binormal", pick.mBinormal);
|
||||
msg->sendMessage( object->getRegion()->getHost());
|
||||
|
||||
// *NOTE: Hope the packets arrive safely and in order or else
|
||||
// there will be some problems.
|
||||
// *TODO: Just fix this bad assumption.
|
||||
msg->newMessageFast(_PREHASH_ObjectDeGrab);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_ObjectData);
|
||||
msg->addU32Fast(_PREHASH_LocalID, object->mLocalID);
|
||||
msg->nextBlock("SurfaceInfo");
|
||||
msg->addVector3("UVCoord", LLVector3(pick.mUVCoords));
|
||||
msg->addVector3("STCoord", LLVector3(pick.mSTCoords));
|
||||
msg->addS32Fast(_PREHASH_FaceIndex, pick.mObjectFace);
|
||||
msg->addVector3("Position", pick.mIntersection);
|
||||
msg->addVector3("Normal", pick.mNormal);
|
||||
msg->addVector3("Binormal", pick.mBinormal);
|
||||
msg->sendMessage(object->getRegion()->getHost());
|
||||
// *NOTE: Hope the packets arrive safely and in order or else
|
||||
// there will be some problems.
|
||||
// *TODO: Just fix this bad assumption.
|
||||
send_ObjectGrab_message(object, pick, LLVector3::zero);
|
||||
send_ObjectDeGrab_message(object, pick);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void init_default_item_label(const std::string& item_name)
|
||||
{
|
||||
boost::unordered_map<std::string, LLStringExplicit>::iterator it = sDefaultItemLabels.find(item_name);
|
||||
|
|
|
|||
|
|
@ -3213,7 +3213,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
|
|||
if (is_audible)
|
||||
{
|
||||
BOOL visible_in_chat_bubble = FALSE;
|
||||
std::string verb;
|
||||
|
||||
color.setVec(1.f,1.f,1.f,1.f);
|
||||
msg->getStringFast(_PREHASH_ChatData, _PREHASH_Message, mesg);
|
||||
|
|
@ -3262,18 +3261,19 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
|
|||
}
|
||||
else
|
||||
{
|
||||
chat.mText = "";
|
||||
switch(chat.mChatType)
|
||||
{
|
||||
case CHAT_TYPE_WHISPER:
|
||||
verb = LLTrans::getString("whisper") + " ";
|
||||
chat.mText = LLTrans::getString("whisper") + " ";
|
||||
break;
|
||||
case CHAT_TYPE_DEBUG_MSG:
|
||||
case CHAT_TYPE_OWNER:
|
||||
case CHAT_TYPE_NORMAL:
|
||||
verb = "";
|
||||
case CHAT_TYPE_DIRECT:
|
||||
break;
|
||||
case CHAT_TYPE_SHOUT:
|
||||
verb = LLTrans::getString("shout") + " ";
|
||||
chat.mText = LLTrans::getString("shout") + " ";
|
||||
break;
|
||||
case CHAT_TYPE_START:
|
||||
case CHAT_TYPE_STOP:
|
||||
|
|
@ -3281,13 +3281,9 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
|
|||
break;
|
||||
default:
|
||||
LL_WARNS("Messaging") << "Unknown type " << chat.mChatType << " in chat!" << LL_ENDL;
|
||||
verb = "";
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
chat.mText = "";
|
||||
chat.mText += verb;
|
||||
chat.mText += mesg;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -101,6 +101,7 @@
|
|||
#include "lltrans.h"
|
||||
#include "llsdutil.h"
|
||||
#include "llmediaentry.h"
|
||||
#include "llaccountingquota.h"
|
||||
|
||||
//#define DEBUG_UPDATE_TYPE
|
||||
|
||||
|
|
@ -5279,7 +5280,7 @@ bool LLViewerObject::specialHoverCursor() const
|
|||
|| (mClickAction != 0);
|
||||
}
|
||||
|
||||
void LLViewerObject::updateFlags()
|
||||
void LLViewerObject::updateFlags(BOOL physics_changed)
|
||||
{
|
||||
LLViewerRegion* regionp = getRegion();
|
||||
if(!regionp) return;
|
||||
|
|
@ -5292,12 +5293,15 @@ void LLViewerObject::updateFlags()
|
|||
gMessageSystem->addBOOL("IsTemporary", flagTemporaryOnRez() );
|
||||
gMessageSystem->addBOOL("IsPhantom", flagPhantom() );
|
||||
gMessageSystem->addBOOL("CastsShadows", flagCastShadows() );
|
||||
gMessageSystem->nextBlock("ExtraPhysics");
|
||||
gMessageSystem->addU8("PhysicsShapeType", getPhysicsShapeType() );
|
||||
gMessageSystem->addF32("Density", getPhysicsDensity() );
|
||||
gMessageSystem->addF32("Friction", getPhysicsFriction() );
|
||||
gMessageSystem->addF32("Restitution", getPhysicsRestitution() );
|
||||
gMessageSystem->addF32("GravityMultiplier", getPhysicsGravity() );
|
||||
if (physics_changed)
|
||||
{
|
||||
gMessageSystem->nextBlock("ExtraPhysics");
|
||||
gMessageSystem->addU8("PhysicsShapeType", getPhysicsShapeType() );
|
||||
gMessageSystem->addF32("Density", getPhysicsDensity() );
|
||||
gMessageSystem->addF32("Friction", getPhysicsFriction() );
|
||||
gMessageSystem->addF32("Restitution", getPhysicsRestitution() );
|
||||
gMessageSystem->addF32("GravityMultiplier", getPhysicsGravity() );
|
||||
}
|
||||
gMessageSystem->sendReliable( regionp->getHost() );
|
||||
}
|
||||
|
||||
|
|
@ -5696,3 +5700,10 @@ public:
|
|||
|
||||
LLHTTPRegistration<ObjectPhysicsProperties>
|
||||
gHTTPRegistrationObjectPhysicsProperties("/message/ObjectPhysicsProperties");
|
||||
|
||||
|
||||
void LLViewerObject::updateQuota( const SelectionQuota& quota )
|
||||
{
|
||||
//update quotas
|
||||
mSelectionQuota = quota;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@
|
|||
#include "v3dmath.h"
|
||||
#include "v3math.h"
|
||||
#include "llvertexbuffer.h"
|
||||
#include "llaccountingquota.h"
|
||||
|
||||
class LLAgent; // TODO: Get rid of this.
|
||||
class LLAudioSource;
|
||||
|
|
@ -488,7 +489,7 @@ public:
|
|||
void setRegion(LLViewerRegion *regionp);
|
||||
virtual void updateRegion(LLViewerRegion *regionp);
|
||||
|
||||
void updateFlags();
|
||||
void updateFlags(BOOL physics_changed = FALSE);
|
||||
BOOL setFlags(U32 flag, BOOL state);
|
||||
void setPhysicsShapeType(U8 type);
|
||||
void setPhysicsGravity(F32 gravity);
|
||||
|
|
@ -643,7 +644,11 @@ protected:
|
|||
void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id);
|
||||
void deleteParticleSource();
|
||||
void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id);
|
||||
|
||||
|
||||
public:
|
||||
void updateQuota( const SelectionQuota& quota );
|
||||
const SelectionQuota& getQuota( void ) { return mSelectionQuota; }
|
||||
|
||||
private:
|
||||
void setNameValueList(const std::string& list); // clears nv pairs and then individually adds \n separated NV pairs from \0 terminated string
|
||||
void deleteTEImages(); // correctly deletes list of images
|
||||
|
|
@ -705,6 +710,8 @@ protected:
|
|||
F32 mPhysicsCost;
|
||||
F32 mLinksetPhysicsCost;
|
||||
|
||||
SelectionQuota mSelectionQuota;
|
||||
|
||||
bool mCostStale;
|
||||
mutable bool mPhysicsShapeUnknown;
|
||||
|
||||
|
|
|
|||
|
|
@ -1417,6 +1417,15 @@ void LLViewerObjectList::onObjectCostFetchFailure(const LLUUID& object_id)
|
|||
mPendingObjectCost.erase(object_id);
|
||||
}
|
||||
|
||||
void LLViewerObjectList::updateQuotaCost( const LLUUID& objectId, const SelectionQuota& quota )
|
||||
{
|
||||
LLViewerObject* pVO = findObject( objectId );
|
||||
if ( pVO )
|
||||
{
|
||||
//pVO->updateQuota( quota );
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerObjectList::updatePhysicsFlags(const LLViewerObject* object)
|
||||
{
|
||||
mStalePhysicsFlags.insert(object->getID());
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
|
||||
// project includes
|
||||
#include "llviewerobject.h"
|
||||
#include "llaccountingquota.h"
|
||||
|
||||
class LLCamera;
|
||||
class LLNetMap;
|
||||
|
|
@ -101,6 +102,8 @@ public:
|
|||
F32 restitution,
|
||||
F32 gravity_multiplier);
|
||||
|
||||
void updateQuotaCost( const LLUUID& objectId, const SelectionQuota& costs );
|
||||
|
||||
void shiftObjects(const LLVector3 &offset);
|
||||
|
||||
bool hasMapObjectInRegion(LLViewerRegion* regionp) ;
|
||||
|
|
|
|||
|
|
@ -1543,6 +1543,11 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
|
|||
capabilityNames.append("ViewerMetrics");
|
||||
capabilityNames.append("ViewerStartAuction");
|
||||
capabilityNames.append("ViewerStats");
|
||||
//prep# Finalize these!!!!!!!!!
|
||||
//capabilityNames.append("AccountingVO");
|
||||
capabilityNames.append("AccountingParcel");
|
||||
capabilityNames.append("AccountingRegion");
|
||||
|
||||
// Please add new capabilities alphabetically to reduce
|
||||
// merge conflicts.
|
||||
|
||||
|
|
@ -1671,3 +1676,4 @@ std::string LLViewerRegion::getDescription() const
|
|||
{
|
||||
return stringize(*this);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -277,6 +277,7 @@ public:
|
|||
F32 getLandHeightRegion(const LLVector3& region_pos);
|
||||
|
||||
void getInfo(LLSD& info);
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
|
|
|
|||
|
|
@ -89,16 +89,14 @@ LLViewerTextureList::LLViewerTextureList()
|
|||
}
|
||||
|
||||
void LLViewerTextureList::init()
|
||||
{
|
||||
{
|
||||
sRenderThreadID = LLThread::currentID() ;
|
||||
|
||||
mInitialized = TRUE ;
|
||||
sNumImages = 0;
|
||||
mUpdateStats = TRUE;
|
||||
mMaxResidentTexMemInMegaBytes = 0;
|
||||
mMaxTotalTextureMemInMegaBytes = 0 ;
|
||||
|
||||
mUpdateStats = TRUE;
|
||||
|
||||
// Update how much texture RAM we're allowed to use.
|
||||
updateMaxResidentTexMem(0); // 0 = use current
|
||||
|
||||
|
|
|
|||
|
|
@ -1638,6 +1638,7 @@ LLViewerWindow::LLViewerWindow(
|
|||
gSavedSettings.setBOOL("RenderVBOEnable", FALSE);
|
||||
}
|
||||
LLVertexBuffer::initClass(gSavedSettings.getBOOL("RenderVBOEnable"), gSavedSettings.getBOOL("RenderVBOMappingDisable"));
|
||||
LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ;
|
||||
|
||||
if (LLFeatureManager::getInstance()->isSafe()
|
||||
|| (gSavedSettings.getS32("LastFeatureVersion") != LLFeatureManager::getInstance()->getVersion())
|
||||
|
|
|
|||
|
|
@ -287,8 +287,6 @@ LLVOCache::~LLVOCache()
|
|||
|
||||
void LLVOCache::setDirNames(ELLPath location)
|
||||
{
|
||||
std::string delem = gDirUtilp->getDirDelimiter();
|
||||
|
||||
mHeaderFileName = gDirUtilp->getExpandedFilename(location, object_cache_dirname, header_filename);
|
||||
mObjectCacheDirName = gDirUtilp->getExpandedFilename(location, object_cache_dirname);
|
||||
}
|
||||
|
|
@ -341,8 +339,7 @@ void LLVOCache::removeCache(ELLPath location)
|
|||
|
||||
llinfos << "about to remove the object cache due to settings." << llendl ;
|
||||
|
||||
std::string delem = gDirUtilp->getDirDelimiter();
|
||||
std::string mask = delem + "*";
|
||||
std::string mask = "*";
|
||||
std::string cache_dir = gDirUtilp->getExpandedFilename(location, object_cache_dirname);
|
||||
llinfos << "Removing cache at " << cache_dir << llendl;
|
||||
gDirUtilp->deleteFilesInDir(cache_dir, mask); //delete all files
|
||||
|
|
@ -363,8 +360,7 @@ void LLVOCache::removeCache()
|
|||
|
||||
llinfos << "about to remove the object cache due to some error." << llendl ;
|
||||
|
||||
std::string delem = gDirUtilp->getDirDelimiter();
|
||||
std::string mask = delem + "*";
|
||||
std::string mask = "*";
|
||||
llinfos << "Removing cache at " << mObjectCacheDirName << llendl;
|
||||
gDirUtilp->deleteFilesInDir(mObjectCacheDirName, mask);
|
||||
|
||||
|
|
|
|||
|
|
@ -625,8 +625,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
|
|||
mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
|
||||
addDeferredAttachments(mDeferredScreen);
|
||||
|
||||
mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
|
||||
mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
|
||||
|
||||
#if LL_DARWIN
|
||||
// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
|
||||
mEdgeMap.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
|
||||
#else
|
||||
mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
|
||||
#endif
|
||||
|
||||
if (shadow_detail > 0 || ssao)
|
||||
{ //only need mDeferredLight[0] for shadows OR ssao
|
||||
|
|
@ -651,7 +657,12 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
|
|||
mDeferredLight[2].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
|
||||
for (U32 i = 0; i < 2; i++)
|
||||
{
|
||||
#if LL_DARWIN
|
||||
// As of OS X 10.6.7, Apple doesn't support multiple color formats in a single FBO
|
||||
mGIMapPost[i].allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
|
||||
#else
|
||||
mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -666,8 +677,12 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
|
|||
|
||||
F32 scale = gSavedSettings.getF32("RenderShadowResolutionScale");
|
||||
|
||||
#if LL_DARWIN
|
||||
U32 shadow_fmt = 0;
|
||||
#else
|
||||
//HACK: make alpha masking work on ATI depth shadows (work around for ATI driver bug)
|
||||
U32 shadow_fmt = gGLManager.mIsATI ? GL_ALPHA : 0;
|
||||
#endif
|
||||
|
||||
if (shadow_detail > 0)
|
||||
{ //allocate 4 sun shadow maps
|
||||
|
|
|
|||
|
|
@ -760,7 +760,7 @@
|
|||
<color
|
||||
name="MenuBarProjectBgColor"
|
||||
reference="MdBlue" />
|
||||
|
||||
|
||||
<color
|
||||
name="MeshImportTableNormalColor"
|
||||
value="1 1 1 1"/>
|
||||
|
|
@ -768,6 +768,9 @@
|
|||
name="MeshImportTableHighlightColor"
|
||||
value="0.2 0.8 1 1"/>
|
||||
|
||||
<color
|
||||
name="DirectChatColor"
|
||||
reference="LtOrange" />
|
||||
|
||||
<!-- Generic color names (legacy) -->
|
||||
<color
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@
|
|||
left_pad="10"
|
||||
name="antialiasing restart"
|
||||
top_delta="0"
|
||||
width="188">
|
||||
width="230">
|
||||
(requires viewer restart)
|
||||
</text>
|
||||
<spinner
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -42,7 +42,7 @@
|
|||
<menu_item_call.on_enable
|
||||
function="File.EnableUpload" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
<menu_item_call
|
||||
label="Model..."
|
||||
layout="topleft"
|
||||
name="Upload Model">
|
||||
|
|
@ -54,6 +54,18 @@
|
|||
<menu_item_call.on_visible
|
||||
function="File.VisibleUploadModel"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Model Wizard..."
|
||||
layout="topleft"
|
||||
name="Upload Model Wizard">
|
||||
<menu_item_call.on_click
|
||||
function="Floater.Show"
|
||||
parameter="upload_model_wizard" />
|
||||
<menu_item_call.on_enable
|
||||
function="File.EnableUploadModel" />
|
||||
<menu_item_call.on_visible
|
||||
function="File.VisibleUploadModel"/>
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Bulk (L$[COST] per file)..."
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -5299,6 +5299,20 @@ Insufficient permissions to rez object.
|
|||
<tag>fail</tag>
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="IMAcrossParentEstates"
|
||||
type="notifytip">
|
||||
Unable to send IM across parent estates.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="TransferInventoryAcrossParentEstates"
|
||||
type="notifytip">
|
||||
Unable to transfer inventory across parent estates.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="notifytip.tga"
|
||||
name="UnableToLoadNotecard"
|
||||
|
|
|
|||
|
|
@ -206,6 +206,37 @@
|
|||
width="95">
|
||||
Errors
|
||||
</text>
|
||||
<color_swatch
|
||||
can_apply_immediately="true"
|
||||
color="LtOrange"
|
||||
follows="left|top"
|
||||
height="24"
|
||||
label_height="0"
|
||||
layout="topleft"
|
||||
left="360"
|
||||
name="direct"
|
||||
top_pad="-15"
|
||||
width="44" >
|
||||
<color_swatch.init_callback
|
||||
function="Pref.getUIColor"
|
||||
parameter="DirectChatColor" />
|
||||
<color_swatch.commit_callback
|
||||
function="Pref.applyUIColor"
|
||||
parameter="DirectChatColor" />
|
||||
</color_swatch>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="10"
|
||||
layout="topleft"
|
||||
left_pad="5"
|
||||
mouse_opaque="false"
|
||||
name="text_box10"
|
||||
top_delta="5"
|
||||
width="95">
|
||||
Direct
|
||||
</text>
|
||||
<color_swatch
|
||||
can_apply_immediately="true"
|
||||
color="LtYellow"
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue