merge changes for latest viewer-development

master
Oz Linden 2011-06-01 22:07:12 -04:00
commit 8bfd3201de
436 changed files with 20471 additions and 8606 deletions

13
.hgtags
View File

@ -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

View File

@ -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

File diff suppressed because it is too large Load Diff

0
indra/cmake/FMOD.cmake Executable file → Normal file
View File

0
indra/cmake/run_build_test.py Executable file → Normal file
View File

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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";

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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();
}
}

View File

@ -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);

View File

@ -91,6 +91,7 @@ public:
BOOL mHasShaderObjects;
BOOL mHasVertexShader;
BOOL mHasFragmentShader;
S32 mNumTextureImageUnits;
BOOL mHasOcclusionQuery;
BOOL mHasOcclusionQuery2;
BOOL mHasPointParameters;

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;

View File

@ -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]++;
}
}
}

View File

@ -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.

View File

@ -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

View File

@ -3980,7 +3980,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
<string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
<string>http://search-beta.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;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>

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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)

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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 );
}
//===============================================================================

View File

@ -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

View File

@ -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);
}

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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) :

0
indra/newview/llavataractions.cpp Normal file → Executable file
View File

View File

@ -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");

View File

@ -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

View File

@ -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 */

0
indra/newview/llcommandhandler.cpp Normal file → Executable file
View File

View File

@ -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 ;
}

View File

@ -765,7 +765,7 @@ void LLFeatureManager::applyBaseMasks()
{
maskFeatures("OpenGLPre30");
}
if (gGLManager.mNumTextureUnits <= 8)
if (gGLManager.mNumTextureImageUnits <= 8)
{
maskFeatures("TexUnit8orLess");
}

View File

@ -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

View File

@ -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)

View File

@ -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

0
indra/newview/llfloaterpreference.cpp Normal file → Executable file
View File

View File

@ -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);

View File

@ -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
indra/newview/llfloaterworldmap.cpp Normal file → Executable file
View File

View File

@ -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;
}
}

View File

@ -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

View File

@ -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());
}

View File

@ -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

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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));
}

View File

@ -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

View File

@ -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)

View File

@ -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;
};
}

View File

@ -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;
};
}

View File

@ -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 );

View File

@ -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;

0
indra/newview/llpanelpicks.cpp Normal file → Executable file
View File

0
indra/newview/llpanelpicks.h Normal file → Executable file
View File

0
indra/newview/llpanelprofile.cpp Normal file → Executable file
View File

0
indra/newview/llpanelprofile.h Normal file → Executable file
View File

View File

@ -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 )
{

View File

@ -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;

View File

@ -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;
}

View File

@ -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();
}

View File

@ -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);

View File

@ -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());
}

View File

@ -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:

View File

@ -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";

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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());

View File

@ -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) ;

View File

@ -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);
}

View File

@ -277,6 +277,7 @@ public:
F32 getLandHeightRegion(const LLVector3& region_pos);
void getInfo(LLSD& info);
typedef enum
{

View File

@ -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

View File

@ -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())

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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