diff options
author | Steven Bennetts <steve@lindenlab.com> | 2008-08-12 17:29:50 +0000 |
---|---|---|
committer | Steven Bennetts <steve@lindenlab.com> | 2008-08-12 17:29:50 +0000 |
commit | 80be4c1d2d73982ea2df6dd7ef3fc3465416c882 (patch) | |
tree | 9c5958572368be494b6302db8b03967a2c67b7ad /indra/newview | |
parent | a09f7d41efdb945755efaeb07f7418c1f6e2a78b (diff) |
QAR-767 Combined maint-render-7 and maint-viewer-9 merge
merge release@93398 viewer-merge-1@94007 -> release
dataserver-is-deprecated
Diffstat (limited to 'indra/newview')
94 files changed, 2231 insertions, 1247 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 0fea3076c3..699d13ea9b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -159,6 +159,7 @@ set(viewer_SOURCE_FILES llfloaterlandholdings.cpp llfloaterlandmark.cpp llfloatermap.cpp + llfloatermemleak.cpp llfloatermute.cpp llfloaternamedesc.cpp llfloaternewim.cpp @@ -549,6 +550,7 @@ set(viewer_HEADER_FILES llfloaterlandholdings.h llfloaterlandmark.h llfloatermap.h + llfloatermemleak.h llfloatermute.h llfloaternamedesc.h llfloaternewim.h @@ -1312,10 +1314,21 @@ if (WINDOWS) -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg - ${CMAKE_CURRENT_SOURCE_DIR}/app_settings/message_template.msg + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg COMMENT "Copying message_template.msg to the runtime folder." ) + add_custom_command( + TARGET secondlife-bin PRE_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml + COMMENT "Copying message.xml to the runtime folder." + ) + add_dependencies(secondlife-bin copy_win_libs) if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) @@ -1389,25 +1402,12 @@ set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH if (LINUX) add_custom_command( - OUTPUT secondlife-stripped-globalsyms + OUTPUT secondlife-stripped COMMAND strip - ARGS --strip-debug -o secondlife-stripped-globalsyms secondlife-bin + ARGS --strip-debug -o secondlife-stripped secondlife-bin DEPENDS secondlife-bin ) - add_custom_command( - OUTPUT secondlife-stripped - COMMAND objcopy - ARGS - --keep-global-symbols - ${CMAKE_CURRENT_SOURCE_DIR}/linux_tools/exposed-symbols.txt - secondlife-stripped-globalsyms - secondlife-stripped - DEPENDS - secondlife-stripped-globalsyms - ${CMAKE_CURRENT_SOURCE_DIR}/linux_tools/exposed-symbols.txt - ) - set(product SecondLife-${ARCH}-${viewer_VERSION}) add_custom_command( @@ -1483,6 +1483,7 @@ if (DARWIN) secondlife-bin ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) + add_dependencies(package mac-updater mac-crash-logger) endif (PACKAGE) endif (DARWIN) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 4c47cb45b2..fd4f293d66 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -670,6 +670,17 @@ <key>Value</key> <string>http://www.secondlife.com</string> </map> + <key>BlockAvatarAppearanceMessages</key> + <map> + <key>Comment</key> + <string>Ignore's appearance messages (for simulating Ruth)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>BrowserProxyAddress</key> <map> <key>Comment</key> @@ -888,7 +899,7 @@ <key>Type</key> <string>S32</string> <key>Value</key> - <integer>3</integer> + <integer>8</integer> </map> <key>ButtonFlashRate</key> <map> @@ -899,7 +910,7 @@ <key>Type</key> <string>F32</string> <key>Value</key> - <real>2.0</real> + <real>1.25</real> </map> <key>ButtonHPad</key> <map> @@ -4944,17 +4955,6 @@ <key>Value</key> <integer>0</integer> </map> - <key>NoQuickTime</key> - <map> - <key>Comment</key> - <string>Disable quicktime playback.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>NoVerifySSLCert</key> <map> <key>Comment</key> @@ -5701,6 +5701,28 @@ <key>Value</key> <integer>0</integer> </map> + <key>RenderAttachedLights</key> + <map> + <key>Comment</key> + <string>Render lighted prims that are attached to avatars</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>RenderAttachedParticles</key> + <map> + <key>Comment</key> + <string>Render particle systems that are attached to avatars</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RenderAvatarCloth</key> <map> <key>Comment</key> diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 032d9bfdc3..0a1295874d 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 16 +version 17 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -394,48 +394,20 @@ list ATI_Radeon_X1600 Disregard128DefaultDrawDistance 1 0 list ATI_Radeon_X1700 Disregard128DefaultDrawDistance 1 0 - list ATI_Mobility_Radeon_X1xxx Disregard128DefaultDrawDistance 1 0 - - - -// Avatar hardware skinning causes -// invisible avatars on x2600... so I masked -// out other possible bad ones till it's fixed in 8.2 - list ATI_Radeon_HD_2300 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 Disregard128DefaultDrawDistance 1 0 list ATI_Radeon_HD_2400 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_HD_2600 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_Radeon_HD_2900 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_Radeon_HD_3800 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 - list ATI_ASUS_AH24xx -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 Disregard128DefaultDrawDistance 1 0 -list ATI_ASUS_AH26xx -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_ASUS_EAH24xx -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_ASUS_EAH26xx -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_ASUS_EAH38xx + + +// Avatar hardware skinning causes invisible avatars +// on various ATI chipsets on drivers before 8.2 + +list ATIOldDriver RenderAvatarVP 0 0 RenderAvatarCloth 0 0 diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 88570e3e09..3eaa781206 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -1,4 +1,4 @@ -version 16 +version 17 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -45,6 +45,7 @@ RenderUseImpostors 1 1 RenderVBOEnable 1 1 RenderVolumeLODFactor 1 2.0 RenderWaterReflections 1 1 +UseStartScreen 1 1 UseOcclusion 1 1 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 @@ -241,25 +242,108 @@ RenderVBOEnable 1 0 list Intel RenderAnisotropic 1 0 RenderLightingDetail 1 0 -RenderTerrainDetail 1 0 -RenderVBOEnable 1 0 +// Avoid some Intel crashes on Linux RenderCubeMap 0 0 - list GeForce2 RenderAnisotropic 1 0 RenderLightingDetail 1 0 RenderMaxPartCount 1 2048 RenderTerrainDetail 1 0 +RenderVBOEnable 1 1 -list Intel_965 +list SiS UseOcclusion 0 0 -list ATI + +list Intel_830M +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_845G +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_855GM +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_865G +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_900 +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_915GM +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_915G +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_945GM +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_945G +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_950 +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_965 +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 UseOcclusion 0 0 -WindLightUseAtmosShaders 0 0 + +list Intel_G33 +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_Bear_Lake +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_Broadwater +RenderTerrainDetail 1 0 RenderVBOEnable 1 0 +list Intel_Brookdale +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_Montara +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + +list Intel_Springdale +RenderTerrainDetail 1 0 +RenderVBOEnable 1 0 + + +list ATI_FireGL_5200 +RenderVBOEnable 1 0 +WindLightUseAtmosShaders 0 0 + + +list ATI_Mobility_Radeon_7xxx +RenderVBOEnable 0 0 + +list ATI_Radeon_7xxx +RenderVBOEnable 0 0 + +list ATI_All-in-Wonder_Radeon +RenderVBOEnable 0 0 + +list ATI_All-in-Wonder_7500 +RenderVBOEnable 0 0 + + list ATI_Mobility_Radeon_9800 RenderAvatarCloth 0 0 VertexShaderEnable 0 0 @@ -302,58 +386,35 @@ list ATI_Radeon_X700 Disregard128DefaultDrawDistance 1 0 list ATI_Radeon_X1300 Disregard128DefaultDrawDistance 1 0 +UseStartScreen 0 0 list ATI_Radeon_X1400 Disregard128DefaultDrawDistance 1 0 list ATI_Radeon_X1500 Disregard128DefaultDrawDistance 1 0 +UseStartScreen 0 0 list ATI_Radeon_X1600 Disregard128DefaultDrawDistance 1 0 list ATI_Radeon_X1700 Disregard128DefaultDrawDistance 1 0 list ATI_Mobility_Radeon_X1xxx Disregard128DefaultDrawDistance 1 0 - - - - -// Avatar hardware skinning causes -// invisible avatars on HD 2400... so I masked -// out other possible bad ones till it's fixed - list ATI_Radeon_HD_2300 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 Disregard128DefaultDrawDistance 1 0 list ATI_Radeon_HD_2400 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 Disregard128DefaultDrawDistance 1 0 -list ATI_Radeon_HD_2600 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_Radeon_HD_2900 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_Radeon_HD_3800 -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 - list ATI_ASUS_AH24xx -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 Disregard128DefaultDrawDistance 1 0 -list ATI_ASUS_AH26xx -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_ASUS_EAH24xx -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_ASUS_EAH26xx -RenderAvatarVP 0 0 -RenderAvatarCloth 0 0 -list ATI_ASUS_EAH38xx + + +// Avatar hardware skinning causes invisible avatars +// on various ATI chipsets on drivers before 8.2 + +list ATIOldDriver RenderAvatarVP 0 0 RenderAvatarCloth 0 0 +// Avoid driver crashes with some features on Linux with old ATI drivers +UseOcclusion 0 0 +WindLightUseAtmosShaders 0 0 /// Tweaked NVIDIA @@ -387,6 +448,8 @@ Disregard128DefaultDrawDistance 1 0 list NVIDIA_GeForce_6600 Disregard128DefaultDrawDistance 1 0 +list NVIDIA_G73 +Disregard128DefaultDrawDistance 1 0 list NVIDIA_GeForce_Go_6100 RenderVBOEnable 1 0 diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index cffd4410c3..edf8967f46 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -126,11 +126,8 @@ #include "roles_constants.h" #include "llviewercontrol.h" #include "llappviewer.h" -#include "llvoiceclient.h" - -// Ventrella +#include "llviewerjoystick.h" #include "llfollowcam.h" -// end Ventrella extern LLMenuBarGL* gMenuBarView; @@ -176,7 +173,7 @@ const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f; const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f; -const F32 MAX_CAMERA_SMOOTH_DISTANCE = 20.0f; +const F32 MAX_CAMERA_SMOOTH_DISTANCE = 50.0f; const F32 HEAD_BUFFER_SIZE = 0.3f; const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.2f; @@ -1952,6 +1949,11 @@ void LLAgent::cameraPanLeft(F32 meters) mFocusTargetGlobal += meters * left_axis; mFocusGlobal = mFocusTargetGlobal; + + // effectively disable smoothing for camera pan, which causes some residents unhappiness + mCameraSmoothingLastPositionGlobal += meters * left_axis; + mCameraSmoothingLastPositionAgent += meters * left_axis; + cameraZoomIn(1.f); updateFocusOffset(); } @@ -1966,6 +1968,11 @@ void LLAgent::cameraPanUp(F32 meters) mFocusTargetGlobal += meters * up_axis; mFocusGlobal = mFocusTargetGlobal; + + // effectively disable smoothing for camera pan, which causes some residents unhappiness + mCameraSmoothingLastPositionGlobal += meters * up_axis; + mCameraSmoothingLastPositionAgent += meters * up_axis; + cameraZoomIn(1.f); updateFocusOffset(); } @@ -3226,9 +3233,9 @@ void LLAgent::updateCamera() if (cameraThirdPerson()) // only smooth in third person mode { - F32 smoothing = llclampf(1.f - pow(2.f, -4.f * gSavedSettings.getF32("CameraPositionSmoothing") / gFPSClamped)); - // we use average FPS instead of LLCriticalDamp b/c exact frame time is jittery - + const F32 SMOOTHING_HALF_LIFE = 0.02f; + + F32 smoothing = LLCriticalDamp::getInterpolant(gSavedSettings.getF32("CameraPositionSmoothing") * SMOOTHING_HALF_LIFE, FALSE); if (!mFocusObject) // we differentiate on avatar mode { @@ -3238,7 +3245,7 @@ void LLAgent::updateCamera() LLVector3d delta = camera_pos_agent - mCameraSmoothingLastPositionAgent; if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please { - camera_pos_agent = lerp(camera_pos_agent, mCameraSmoothingLastPositionAgent, smoothing); + camera_pos_agent = lerp(mCameraSmoothingLastPositionAgent, camera_pos_agent, smoothing); camera_pos_global = camera_pos_agent + agent_pos; } } @@ -3247,7 +3254,7 @@ void LLAgent::updateCamera() LLVector3d delta = camera_pos_global - mCameraSmoothingLastPositionGlobal; if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please { - camera_pos_global = lerp(camera_pos_global, mCameraSmoothingLastPositionGlobal, smoothing); + camera_pos_global = lerp(mCameraSmoothingLastPositionGlobal, camera_pos_global, smoothing); } } } @@ -3291,19 +3298,6 @@ void LLAgent::updateCamera() setLookAt(LOOKAT_TARGET_FOCUS, NULL, mCameraPositionAgent); } - // Send the camera position to the spatialized voice system. - if(gVoiceClient && getRegion()) - { - LLMatrix3 rot; - rot.setRows(LLViewerCamera::getInstance()->getAtAxis(), LLViewerCamera::getInstance()->getLeftAxis (), LLViewerCamera::getInstance()->getUpAxis()); - - // MBW -- XXX -- Setting velocity to 0 for now. May figure it out later... - gVoiceClient->setCameraPosition( - getRegion()->getPosGlobalFromRegion(LLViewerCamera::getInstance()->getOrigin()),// position - LLVector3::zero, // velocity - rot); // rotation matrix - } - // update the travel distance stat // this isn't directly related to the camera // but this seemed like the best place to do this @@ -3506,20 +3500,24 @@ LLVector3d LLAgent::calcFocusPositionTargetGlobal() } else { - // ...offset from avatar - LLVector3d focus_offset; - focus_offset.setVec(gSavedSettings.getVector3("FocusOffsetDefault")); - - LLQuaternion agent_rot = mFrameAgent.getQuaternion(); - if (!mAvatarObject.isNull() && mAvatarObject->getParent()) - { - agent_rot *= ((LLViewerObject*)(mAvatarObject->getParent()))->getRenderRotation(); - } + return getPositionGlobal() + calcThirdPersonFocusOffset(); + } +} - focus_offset = focus_offset * agent_rot; +LLVector3d LLAgent::calcThirdPersonFocusOffset() +{ + // ...offset from avatar + LLVector3d focus_offset; + focus_offset.setVec(gSavedSettings.getVector3("FocusOffsetDefault")); - return getPositionGlobal() + focus_offset; + LLQuaternion agent_rot = mFrameAgent.getQuaternion(); + if (!mAvatarObject.isNull() && mAvatarObject->getParent()) + { + agent_rot *= ((LLViewerObject*)(mAvatarObject->getParent()))->getRenderRotation(); } + + focus_offset = focus_offset * agent_rot; + return focus_offset; } void LLAgent::setupSitCamera() @@ -3947,6 +3945,11 @@ void LLAgent::resetCamera() //----------------------------------------------------------------------------- void LLAgent::changeCameraToMouselook(BOOL animate) { + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } + // visibility changes at end of animation gViewerWindow->getWindow()->resetBusyCount(); @@ -3973,7 +3976,7 @@ void LLAgent::changeCameraToMouselook(BOOL animate) if( mCameraMode != CAMERA_MODE_MOUSELOOK ) { - gViewerWindow->setKeyboardFocus( NULL ); + gFocusMgr.setKeyboardFocus( NULL ); mLastCameraMode = mCameraMode; mCameraMode = CAMERA_MODE_MOUSELOOK; @@ -4002,6 +4005,11 @@ void LLAgent::changeCameraToMouselook(BOOL animate) //----------------------------------------------------------------------------- void LLAgent::changeCameraToDefault() { + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } + if (LLFollowCamMgr::getActiveFollowCamParams()) { changeCameraToFollow(); @@ -4019,6 +4027,11 @@ void LLAgent::changeCameraToDefault() //----------------------------------------------------------------------------- void LLAgent::changeCameraToFollow(BOOL animate) { + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } + if( mCameraMode != CAMERA_MODE_FOLLOW ) { if (mCameraMode == CAMERA_MODE_MOUSELOOK) @@ -4077,7 +4090,10 @@ void LLAgent::changeCameraToFollow(BOOL animate) //----------------------------------------------------------------------------- void LLAgent::changeCameraToThirdPerson(BOOL animate) { -//printf( "changeCameraToThirdPerson\n" ); + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } gViewerWindow->getWindow()->resetBusyCount(); @@ -4159,6 +4175,11 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate) //----------------------------------------------------------------------------- void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_animate) { + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + return; + } + setControlFlags(AGENT_CONTROL_STAND_UP); // force stand up gViewerWindow->getWindow()->resetBusyCount(); @@ -4194,8 +4215,8 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_ani mbFlagsDirty = TRUE; } - gViewerWindow->setKeyboardFocus( NULL ); - gViewerWindow->setMouseCapture( NULL ); + gFocusMgr.setKeyboardFocus( NULL ); + gFocusMgr.setMouseCapture( NULL ); LLVOAvatar::onCustomizeStart(); } @@ -4475,7 +4496,7 @@ void LLAgent::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate) //RN: when focused on the avatar, we're not "looking" at it // looking implies intent while focusing on avatar means // you're just walking around with a camera on you...eesh. - if (focus_on_avatar && !mFocusOnAvatar) + if (!mFocusOnAvatar && focus_on_avatar) { setFocusGlobal(LLVector3d::zero); mCameraFOVZoomFactor = 0.f; @@ -4499,6 +4520,12 @@ void LLAgent::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate) } } } + // unlocking camera from avatar + else if (mFocusOnAvatar && !focus_on_avatar) + { + // keep camera focus point consistent, even though it is now unlocked + setFocusGlobal(getPositionGlobal() + calcThirdPersonFocusOffset(), gAgent.getID()); + } mFocusOnAvatar = focus_on_avatar; } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index ea9138fdd1..db7fafbba8 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -151,7 +151,9 @@ public: void sendReliableMessage(); LLVector3d calcCameraPositionTargetGlobal(BOOL *hit_limit = NULL); // Calculate the camera position target - LLVector3d calcFocusPositionTargetGlobal(); // target for this mode + LLVector3d calcFocusPositionTargetGlobal(); + LLVector3d calcThirdPersonFocusOffset(); + // target for this mode LLVector3d getCameraPositionGlobal() const; const LLVector3 &getCameraPositionAgent() const; F32 calcCameraFOVZoomFactor(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 76d5bcec34..211182f2b5 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -115,6 +115,7 @@ #include "llcontainerview.h" #include "llfloaterstats.h" #include "llhoverview.h" +#include "llfloatermemleak.h" #include "llsdserialize.h" @@ -550,7 +551,8 @@ LLAppViewer::LLAppViewer() : mQuitRequested(false), mLogoutRequestSent(false), mYieldTime(-1), - mMainloopTimeout(NULL) + mMainloopTimeout(NULL), + mAgentRegionLastAlive(false) { if(NULL != sInstance) { @@ -616,9 +618,11 @@ bool LLAppViewer::init() // *FIX: The following code isn't grouped into functions yet. // - // Various introspection concerning the libs we're using. + // Various introspection concerning the libs we're using - particularly + // the libs involved in getting to a full login screen. // - LL_DEBUGS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL; + LL_INFOS("InitInfo") << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << LL_ENDL; + LL_INFOS("InitInfo") << "libcurl version is: " << LLCurl::getVersionString() << LL_ENDL; // Get the single value from the crash settings file, if it exists std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE); @@ -899,7 +903,13 @@ bool LLAppViewer::mainLoop() { debugTime.reset(); } + #endif + //memory leaking simulation + if(LLFloaterMemLeak::getInstance()) + { + LLFloaterMemLeak::getInstance()->idle() ; + } if (!LLApp::isExiting()) { @@ -1056,6 +1066,12 @@ bool LLAppViewer::mainLoop() catch(std::bad_alloc) { llwarns << "Bad memory allocation in LLAppViewer::mainLoop()!" << llendl ; + + //stop memory leaking simulation + if(LLFloaterMemLeak::getInstance()) + { + LLFloaterMemLeak::getInstance()->stop() ; + } } } @@ -1069,6 +1085,12 @@ bool LLAppViewer::mainLoop() catch(std::bad_alloc) { llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ; + + //stop memory leaking simulation + if(LLFloaterMemLeak::getInstance()) + { + LLFloaterMemLeak::getInstance()->stop() ; + } } } @@ -1244,6 +1266,7 @@ bool LLAppViewer::cleanup() // Shut down the VFS's AFTER the decode manager cleans up (since it cleans up vfiles). // Also after viewerwindow is deleted, since it may have image pointers (which have vfiles) // Also after shutting down the messaging system since it has VFS dependencies + // LLVFile::cleanupClass(); llinfos << "VFS cleaned up" << llendflush; @@ -1951,7 +1974,7 @@ bool LLAppViewer::initConfiguration() _spawnl(_P_WAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL); #elif LL_DARWIN std::string command_str; - command_str = "crashreporter.app/Contents/MacOS/crashreporter "; + command_str = "mac-crash-logger.app/Contents/MacOS/mac-crash-logger "; command_str += "-previous"; // XXX -- We need to exit fullscreen mode for this to work. // XXX -- system() also doesn't wait for completion. Hmm... @@ -2590,6 +2613,38 @@ bool LLAppViewer::initCache() } } + // Delete old cache directory +#ifdef LL_DARWIN + if (LL_VERSION_MAJOR >= 1 && LL_VERSION_MINOR >= 21) + { + if (gLastRunVersion != gCurrentVersion) + { + // NOTE: (Nyx) as of 1.21, cache for mac is moving to /library/caches/SecondLife from + // /library/application support/SecondLife/cache This should clear/delete the old dir. + std::string cache_dir = gDirUtilp->getOSUserAppDir(); + std::string new_cache_dir = gDirUtilp->getOSCacheDir(); + cache_dir = cache_dir + "/cache"; + new_cache_dir = new_cache_dir + "/" + gSecondLife; + if (gDirUtilp->fileExists(cache_dir)) + { + gDirUtilp->setCacheDir(cache_dir); + purgeCache(); + gDirUtilp->setCacheDir(new_cache_dir); + + std::string ds_store = cache_dir + "/.DS_Store"; + if (gDirUtilp->fileExists(ds_store.c_str())) + { + LLFile::remove(ds_store.c_str()); + } + if (LLFile::remove(cache_dir.c_str()) != 0) + { + llwarns << "could not delete old cache directory" << llendl; + } + } + } + } +#endif + // Setup and verify the cache location std::string cache_location = gSavedSettings.getString("CacheLocation"); std::string new_cache_location = gSavedSettings.getString("NewCacheLocation"); @@ -3528,6 +3583,23 @@ void LLAppViewer::idleNetwork() gAssetStorage->checkForTimeouts(); gViewerThrottle.updateDynamicThrottle(); + + + // Check that the circuit between the viewer and the agent's current + // region is still alive + LLViewerRegion *agent_region = gAgent.getRegion(); + if (agent_region) + { + LLUUID this_region_id = agent_region->getRegionID(); + bool this_region_alive = agent_region->isAlive(); + if ((mAgentRegionLastAlive && !this_region_alive) // newly dead + && (mAgentRegionLastID == this_region_id)) // same region + { + forceDisconnect(LLTrans::getString("AgentLostConnection")); + } + mAgentRegionLastID = this_region_id; + mAgentRegionLastAlive = this_region_alive; + } } void LLAppViewer::disconnectViewer() @@ -3678,4 +3750,3 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs) } } - diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 66c4024c41..758b9cc3b4 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -206,6 +206,10 @@ private: LLSD mSettingsFileList; LLWatchdogTimeout* mMainloopTimeout; + + // for tracking viewer<->region circuit death + bool mAgentRegionLastAlive; + LLUUID mAgentRegionLastID; }; // consts from viewer.h diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 980ccd81fd..a40ee702c6 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -448,14 +448,18 @@ bool LLAppViewerLinux::initParseCommandLine(LLCommandLineParser& clp) { if (success >= 2 && locale->lang) // confident! { + LL_INFOS("AppInit") << "Language " << ll_safe_string(locale->lang) << LL_ENDL; + LL_INFOS("AppInit") << "Location " << ll_safe_string(locale->country) << LL_ENDL; + LL_INFOS("AppInit") << "Variant " << ll_safe_string(locale->variant) << LL_ENDL; + LLControlVariable* c = gSavedSettings.getControl("SystemLanguage"); if(c) { c->setValue(std::string(locale->lang), false); } } - FL_FreeLocale(&locale); } + FL_FreeLocale(&locale); return true; } diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index a6d93e5652..4d0b96ba73 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -202,7 +202,7 @@ void LLAppViewerMacOSX::handleCrashReporting() { // Macintosh std::string command_str; - command_str += "open crashreporter.app"; + command_str += "open mac-crash-logger.app"; clear_signals(); llinfos << "Launching crash reporter using: '" << command_str << "'" << llendl; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index b88bcb758b..1d8f6a218c 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -395,14 +395,17 @@ bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp) { if (success >= 2 && locale->lang) // confident! { + LL_INFOS("AppInit") << "Language: " << ll_safe_string(locale->lang) << LL_ENDL; + LL_INFOS("AppInit") << "Location: " << ll_safe_string(locale->country) << LL_ENDL; + LL_INFOS("AppInit") << "Variant: " << ll_safe_string(locale->variant) << LL_ENDL; LLControlVariable* c = gSavedSettings.getControl("SystemLanguage"); if(c) { c->setValue(std::string(locale->lang), false); } } - FL_FreeLocale(&locale); } + FL_FreeLocale(&locale); return true; } diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index b8166a98f6..57f65fed38 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -172,7 +172,7 @@ BOOL LLColorSwatchCtrl::handleMouseDown(S32 x, S32 y, MASK mask) { // Route future Mouse messages here preemptively. (Release on mouse up.) // No handler is needed for capture lost since this object has no state that depends on it. - gViewerWindow->setMouseCapture( this ); + gFocusMgr.setMouseCapture( this ); return TRUE; } @@ -184,7 +184,7 @@ BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask) if( hasMouseCapture() ) { // Release the mouse - gViewerWindow->setMouseCapture( NULL ); + gFocusMgr.setMouseCapture( NULL ); // If mouseup in the widget, it's been clicked if ( pointInView(x, y) ) diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 6f5dc1d3e7..b207c44e95 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -384,9 +384,14 @@ void LLDrawable::makeActive() gPipeline.setActive(this, TRUE); //all child objects must also be active - for (U32 i = 0; i < getChildCount(); i++) + llassert_always(mVObjp); + + LLViewerObject::const_child_list_t& child_list = mVObjp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLDrawable* drawable = getChild(i); + LLViewerObject* child = *iter; + LLDrawable* drawable = child->mDrawable; if (drawable) { drawable->makeActive(); @@ -430,11 +435,13 @@ void LLDrawable::makeStatic(BOOL warning_enabled) { LL_WARNS_ONCE("Drawable") << "Drawable becomes static with active parent!" << LL_ENDL; } - - S32 child_count = mVObjp->mChildList.size(); - for (S32 child_num = 0; child_num < child_count; child_num++) + + LLViewerObject::const_child_list_t& child_list = mVObjp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLDrawable* child_drawable = mVObjp->mChildList[child_num]->mDrawable; + LLViewerObject* child = *iter; + LLDrawable* child_drawable = child->mDrawable; if (child_drawable) { if (child_drawable->getParent() != this) @@ -1179,11 +1186,23 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* av = objparent->mDrawable; LLSpatialGroup* group = av->getSpatialGroup(); - BOOL impostor = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isImpostor(); - BOOL loaded = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isFullyLoaded(); - + BOOL impostor = FALSE; + BOOL loaded = FALSE; + if (objparent->isAvatar()) + { + LLVOAvatar* avatarp = (LLVOAvatar*) objparent; + if (avatarp->isVisible()) + { + impostor = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isImpostor(); + loaded = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isFullyLoaded(); + } + else + { + return; + } + } + if (!group || - av->getSpatialGroup()->mDistance > LLVOAvatar::sRenderDistance || LLDrawable::getCurrentFrame() - av->mVisible > 1 || impostor || !loaded) @@ -1214,9 +1233,16 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* if (for_select) { results->push_back(mDrawable); - for (U32 i = 0; i < mDrawable->getChildCount(); i++) + if (mDrawable->getVObj()) { - results->push_back(mDrawable->getChild(i)); + LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) + { + LLViewerObject* child = *iter; + LLDrawable* drawable = child->mDrawable; + results->push_back(drawable); + } } } else @@ -1240,18 +1266,24 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in) mDrawable->updateDistance(camera); - for (U32 i = 0; i < mDrawable->getChildCount(); ++i) + if (mDrawable->getVObj()) { - LLDrawable* child = mDrawable->getChild(i); - if (!child) + LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - llwarns << "Corrupt drawable found while updating spatial bridge distance." << llendl; - continue; - } + LLViewerObject* child = *iter; + LLDrawable* drawable = child->mDrawable; + if (!drawable) + { + llwarns << "Corrupt drawable found while updating spatial bridge distance." << llendl; + continue; + } - if (!child->isAvatar()) - { - child->updateDistance(camera); + if (!drawable->isAvatar()) + { + drawable->updateDistance(camera); + } } } } @@ -1287,12 +1319,18 @@ void LLSpatialBridge::cleanupReferences() if (mDrawable) { mDrawable->setSpatialGroup(NULL); - for (U32 i = 0; i < mDrawable->getChildCount(); i++) + if (mDrawable->getVObj()) { - LLDrawable* drawable = mDrawable->getChild(i); - if (drawable) + LLViewerObject::const_child_list_t& child_list = mDrawable->getVObj()->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - drawable->setSpatialGroup(NULL); + LLViewerObject* child = *iter; + LLDrawable* drawable = child->mDrawable; + if (drawable) + { + drawable->setSpatialGroup(NULL); + } } } diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index d6f77f2ab4..238c956cb7 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -116,8 +116,6 @@ public: virtual BOOL isSpatialBridge() const { return FALSE; } virtual LLSpatialPartition* asPartition() { return NULL; } LLDrawable* getParent() const { return mParent; } - LLDrawable* getChild(U32 index) { return mVObjp->mChildList[index]->mDrawable; } - U32 getChildCount() { return mVObjp ? mVObjp->mChildList.size() : 0; } // must set parent through LLViewerObject:: () //BOOL setParent(LLDrawable *parent); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 6d81edd7ca..e068d90caf 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -104,8 +104,7 @@ BOOL gRenderAvatar = TRUE; S32 LLDrawPoolAvatar::getVertexShaderLevel() const { - return sShaderLevel; - //return (S32) LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR); + return (S32) LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR); } void LLDrawPoolAvatar::prerender() @@ -586,6 +585,7 @@ void LLDrawPoolAvatar::renderForSelect() return; } + S32 curr_shader_level = getVertexShaderLevel(); S32 name = avatarp->mDrawable->getVObj()->mGLName; LLColor4U color((U8)(name >> 16), (U8)(name >> 8), (U8)name); @@ -602,7 +602,7 @@ void LLDrawPoolAvatar::renderForSelect() } sVertexProgram = &gAvatarPickProgram; - if (sShaderLevel > 0) + if (curr_shader_level > 0) { gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX]; } @@ -611,7 +611,7 @@ void LLDrawPoolAvatar::renderForSelect() glColor4ubv(color.mV); - if (sShaderLevel > 0) // for hardware blending + if (curr_shader_level > 0) // for hardware blending { sRenderingSkinned = TRUE; sVertexProgram->bind(); @@ -621,7 +621,7 @@ void LLDrawPoolAvatar::renderForSelect() avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done - if (sShaderLevel > 0) + if (curr_shader_level > 0) { sRenderingSkinned = FALSE; sVertexProgram->unbind(); diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 11391ee6fb..2f25c757cb 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -851,7 +851,7 @@ LLImageGL* LLBumpImageList::getBrightnessDarknessImage(LLViewerImage* src_image, bump->setExplicitFormat(GL_ALPHA8, GL_ALPHA); // Note: this may create an LLImageGL immediately - src_image->setLoadedCallback( callback_func, 0, TRUE, new LLUUID(src_image->getID()) ); + src_image->setLoadedCallback( callback_func, 0, TRUE, FALSE, new LLUUID(src_image->getID()) ); bump = (*entries_list)[src_image->getID()]; // In case callback was called immediately and replaced the image // bump_total++; diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index ea3999f93f..9f22d2aa0f 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -78,7 +78,8 @@ LLDrawPoolWLSky::LLDrawPoolWLSky(void) : LLDrawPoolWLSky::~LLDrawPoolWLSky() { //llinfos << "destructing wlsky draw pool." << llendl; - sCloudNoiseTexture = 0; + sCloudNoiseTexture = NULL; + sCloudNoiseRawImage = NULL; } LLViewerImage *LLDrawPoolWLSky::getDebugTexture() diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 73d8036122..ecc40aa094 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -587,6 +587,10 @@ void LLFeatureManager::applyBaseMasks() { maskFeatures("ATI"); } + if (gGLManager.mATIOldDriver) + { + maskFeatures("ATIOldDriver"); + } if (gGLManager.mIsGFFX) { maskFeatures("GeForceFX"); diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 9746b06500..2fe1781a96 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -39,6 +39,9 @@ #include "llui.h" // for tr() #include "v3dmath.h" +#include "llcurl.h" +#include "llimagej2c.h" + #include "llviewertexteditor.h" #include "llviewercontrol.h" #include "llagent.h" @@ -113,7 +116,7 @@ LLFloaterAbout::LLFloaterAbout() support.append("\n\n"); } - //*NOTE: Do not translate text like GPU, Graphics Card, etc - + // *NOTE: Do not translate text like GPU, Graphics Card, etc - // Most PC users that know what these mean will be used to the english versions, // and this info sometimes gets sent to support @@ -144,6 +147,16 @@ LLFloaterAbout::LLFloaterAbout() support.append( (const char*) glGetString(GL_VERSION) ); support.append("\n"); + support.append("\n"); + + support.append("libcurl Version: "); + support.append( LLCurl::getVersionString() ); + support.append("\n"); + + support.append("J2C Decoder Version: "); + support.append( LLImageJ2C::getEngineInfo() ); + support.append("\n"); + LLMediaManager *mgr = LLMediaManager::getInstance(); if (mgr) { diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 417ac0e868..2d595bc492 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -38,6 +38,7 @@ #include "lldir.h" #include "llvfile.h" #include "llapr.h" +#include "llstring.h" #include "llagent.h" #include "llbbox.h" @@ -48,6 +49,7 @@ #include "lldrawpoolavatar.h" #include "llrender.h" #include "llface.h" +#include "llfocusmgr.h" #include "llkeyframemotion.h" #include "lllineeditor.h" #include "llsliderctrl.h" @@ -451,7 +453,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask) if (mPreviewRect.pointInRect(x, y)) { bringToFront( x, y ); - gViewerWindow->setMouseCapture(this); + gFocusMgr.setMouseCapture(this); gViewerWindow->hideCursor(); mLastMouseX = x; mLastMouseY = y; @@ -466,7 +468,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask) { - gViewerWindow->setMouseCapture(FALSE); + gFocusMgr.setMouseCapture(FALSE); gViewerWindow->showCursor(); return LLFloater::handleMouseUp(x, y, mask); } diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index d02fd072e2..4218c4c65a 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -913,7 +913,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask ) if ( rgbAreaRect.pointInRect ( x, y ) ) { - gViewerWindow->setMouseCapture(this); + gFocusMgr.setMouseCapture(this); // mouse button down setMouseDownInHueRegion ( TRUE ); @@ -932,7 +932,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask ) if ( lumAreaRect.pointInRect ( x, y ) ) { - gViewerWindow->setMouseCapture(this); + gFocusMgr.setMouseCapture(this); // mouse button down setMouseDownInLumRegion ( TRUE ); @@ -1148,7 +1148,7 @@ handleMouseUp ( S32 x, S32 y, MASK mask ) if (hasMouseCapture()) { - gViewerWindow->setMouseCapture(NULL); + gFocusMgr.setMouseCapture(NULL); } // dispatch to base class for the rest of things diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp index 55d9aeead9..46727c3698 100644 --- a/indra/newview/llfloaterfriends.cpp +++ b/indra/newview/llfloaterfriends.cpp @@ -44,7 +44,6 @@ #include "llfloateravatarpicker.h" #include "llviewerwindow.h" #include "llbutton.h" -#include "llcallingcard.h" #include "llfloateravatarinfo.h" #include "llinventorymodel.h" #include "llnamelistctrl.h" @@ -143,7 +142,7 @@ void LLPanelFriends::updateFriends(U32 changed_mask) LLDynamicArray<LLUUID> selected_friends = getSelectedIDs(); if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE)) { - refreshNames(); + refreshNames(changed_mask); } else if(changed_mask & LLFriendObserver::POWERS) { @@ -185,7 +184,8 @@ BOOL LLPanelFriends::postBuild() childSetCommitCallback("friend_list", onSelectName, this); childSetDoubleClickCallback("friend_list", onClickIM); - refreshNames(); + U32 changed_mask = LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE; + refreshNames(changed_mask); childSetAction("im_btn", onClickIM, this); childSetAction("profile_btn", onClickProfile, this); @@ -206,7 +206,6 @@ BOOL LLPanelFriends::postBuild() return TRUE; } - BOOL LLPanelFriends::addFriend(const LLUUID& agent_id) { LLAvatarTracker& at = LLAvatarTracker::instance(); @@ -264,7 +263,8 @@ BOOL LLPanelFriends::addFriend(const LLUUID& agent_id) return have_name; } -// propagate actual relationship to UI +// propagate actual relationship to UI. +// Does not resort the UI list because it can be called frequently. JC BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationship* info) { if (!info) return FALSE; @@ -287,9 +287,7 @@ BOOL LLPanelFriends::updateFriendItem(const LLUUID& agent_id, const LLRelationsh // enable this item, in case it was disabled after user input itemp->setEnabled(TRUE); - // changed item in place, need to request sort - mFriendsList->sortItems(); - + // Do not resort, this function can be called frequently. return have_name; } @@ -359,7 +357,7 @@ struct SortFriendsByID } }; -void LLPanelFriends::refreshNames() +void LLPanelFriends::refreshNames(U32 changed_mask) { LLDynamicArray<LLUUID> selected_ids = getSelectedIDs(); S32 pos = mFriendsList->getScrollPos(); @@ -367,27 +365,67 @@ void LLPanelFriends::refreshNames() // get all buddies we know about LLAvatarTracker::buddy_map_t all_buddies; LLAvatarTracker::instance().copyBuddyList(all_buddies); - - // get all friends in list and sort by UUID + + BOOL have_names = TRUE; + + if(changed_mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE)) + { + have_names &= refreshNamesSync(all_buddies); + } + + if(changed_mask & LLFriendObserver::ONLINE) + { + have_names &= refreshNamesPresence(all_buddies); + } + + if (!have_names) + { + mEventTimer.start(); + } + // Changed item in place, need to request sort and update columns + // because we might have changed data in a column on which the user + // has already sorted. JC + mFriendsList->sortItems(); + + // re-select items + mFriendsList->selectMultiple(selected_ids); + mFriendsList->setScrollPos(pos); +} + +BOOL LLPanelFriends::refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies) +{ + mFriendsList->deleteAllItems(); + + BOOL have_names = TRUE; + LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); + + for(; buddy_it != all_buddies.end(); ++buddy_it) + { + have_names &= addFriend(buddy_it->first); + } + + return have_names; +} + +BOOL LLPanelFriends::refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies) +{ std::vector<LLScrollListItem*> items = mFriendsList->getAllData(); std::sort(items.begin(), items.end(), SortFriendsByID()); - std::vector<LLScrollListItem*>::iterator item_it = items.begin(); - std::vector<LLScrollListItem*>::iterator item_end = items.end(); - + LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin(); + std::vector<LLScrollListItem*>::const_iterator item_it = items.begin(); BOOL have_names = TRUE; - LLAvatarTracker::buddy_map_t::iterator buddy_it; - for (buddy_it = all_buddies.begin() ; buddy_it != all_buddies.end(); ++buddy_it) + + while(true) { - // erase any items that reflect residents who are no longer buddies - while(item_it != item_end && buddy_it->first > (*item_it)->getValue().asUUID()) + if(item_it == items.end() || buddy_it == all_buddies.end()) { - mFriendsList->deleteItems((*item_it)->getValue()); - ++item_it; + break; } - // update existing friends with new info - if (item_it != item_end && buddy_it->first == (*item_it)->getValue().asUUID()) + const LLUUID & buddy_uuid = buddy_it->first; + const LLUUID & item_uuid = (*item_it)->getValue().asUUID(); + if(item_uuid == buddy_uuid) { const LLRelationship* info = buddy_it->second; if (!info) @@ -402,27 +440,23 @@ void LLPanelFriends::refreshNames() // update existing item in UI have_names &= updateFriendItem(buddy_it->first, info); } + + ++buddy_it; ++item_it; } - // add new friend to list - else + else if(item_uuid < buddy_uuid) { - have_names &= addFriend(buddy_it->first); + ++item_it; + } + else //if(item_uuid > buddy_uuid) + { + ++buddy_it; } } - if (!have_names) - { - mEventTimer.start(); - } - // changed item in place, need to request sort and update columns - mFriendsList->sortItems(); - // re-select items - mFriendsList->selectMultiple(selected_ids); - mFriendsList->setScrollPos(pos); + return have_names; } - void LLPanelFriends::refreshUI() { BOOL single_selected = FALSE; @@ -732,6 +766,8 @@ void LLPanelFriends::modifyRightsConfirmation(S32 option, void* user_data) { const LLRelationship* info = LLAvatarTracker::instance().getBuddyInfo(rights_it->first); panelp->updateFriendItem(rights_it->first, info); + // Might have changed the column the user is sorted on. + panelp->mFriendsList->sortItems(); } } panelp->refreshUI(); diff --git a/indra/newview/llfloaterfriends.h b/indra/newview/llfloaterfriends.h index 211c6cf487..d934faa616 100644 --- a/indra/newview/llfloaterfriends.h +++ b/indra/newview/llfloaterfriends.h @@ -38,6 +38,7 @@ #include "llstring.h" #include "lluuid.h" #include "lltimer.h" +#include "llcallingcard.h" class LLFriendObserver; class LLRelationship; @@ -96,8 +97,9 @@ private: // protected members typedef std::map<LLUUID, S32> rights_map_t; - void reloadNames(); - void refreshNames(); + void refreshNames(U32 changed_mask); + BOOL refreshNamesSync(const LLAvatarTracker::buddy_map_t & all_buddies); + BOOL refreshNamesPresence(const LLAvatarTracker::buddy_map_t & all_buddies); void refreshUI(); void refreshRightsChangeList(); void applyRightsToFriends(); diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp index 50b8b39bd0..32dcf3ae0a 100644 --- a/indra/newview/llfloaterimagepreview.cpp +++ b/indra/newview/llfloaterimagepreview.cpp @@ -45,6 +45,7 @@ #include "lldrawpoolavatar.h" #include "llrender.h" #include "llface.h" +#include "llfocusmgr.h" #include "lltextbox.h" #include "lltoolmgr.h" #include "llui.h" @@ -54,6 +55,7 @@ #include "pipeline.h" #include "lluictrlfactory.h" #include "llviewerimagelist.h" +#include "llstring.h" //static S32 LLFloaterImagePreview::sUploadAmount = 10; @@ -426,7 +428,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask) if (mPreviewRect.pointInRect(x, y)) { bringToFront( x, y ); - gViewerWindow->setMouseCapture(this); + gFocusMgr.setMouseCapture(this); gViewerWindow->hideCursor(); mLastMouseX = x; mLastMouseY = y; @@ -441,7 +443,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask) //----------------------------------------------------------------------------- BOOL LLFloaterImagePreview::handleMouseUp(S32 x, S32 y, MASK mask) { - gViewerWindow->setMouseCapture(FALSE); + gFocusMgr.setMouseCapture(FALSE); gViewerWindow->showCursor(); return LLFloater::handleMouseUp(x, y, mask); } diff --git a/indra/newview/llfloatermemleak.cpp b/indra/newview/llfloatermemleak.cpp new file mode 100644 index 0000000000..62401dbc96 --- /dev/null +++ b/indra/newview/llfloatermemleak.cpp @@ -0,0 +1,265 @@ +/** + * @file llfloatermemleak.cpp + * @brief LLFloatermemleak class definition + * + * $LicenseInfo:firstyear=2007&license=viewergpl$ + * + * Copyright (c) 2007-2007, 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://secondlife.com/developers/opensource/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://secondlife.com/developers/opensource/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 "llfloatermemleak.h" + +#include "lluictrlfactory.h" +#include "llbutton.h" +#include "llspinctrl.h" +#include "llresmgr.h" + +#include "llmath.h" +#include "llviewerwindow.h" + +LLFloaterMemLeak* LLFloaterMemLeak::sInstance = NULL; +U32 LLFloaterMemLeak::sMemLeakingSpeed = 0 ; //bytes leaked per frame +U32 LLFloaterMemLeak::sMaxLeakedMem = 0 ; //maximum allowed leaked memory +U32 LLFloaterMemLeak::sTotalLeaked = 0 ; +S32 LLFloaterMemLeak::sStatus = LLFloaterMemLeak::STOP ; +BOOL LLFloaterMemLeak::sbAllocationFailed = FALSE ; + +LLFloaterMemLeak::LLFloaterMemLeak() : LLFloater("Memory Leaking Simulation Floater") +{ +} + +LLFloaterMemLeak::~LLFloaterMemLeak() +{ + release() ; + + sMemLeakingSpeed = 0 ; //bytes leaked per frame + sMaxLeakedMem = 0 ; //maximum allowed leaked memory + sInstance = NULL ; +} + +void LLFloaterMemLeak::release() +{ + for(S32 i = 0 ; i < (S32)mLeakedMem.size() ; i++) + { + delete[] mLeakedMem[i] ; + } + mLeakedMem.clear() ; + + sStatus = STOP ; + sTotalLeaked = 0 ; + sbAllocationFailed = FALSE ; +} + +void LLFloaterMemLeak::stop() +{ + sStatus = STOP ; + sbAllocationFailed = TRUE ; +} + +void LLFloaterMemLeak::idle() +{ + if(STOP == sStatus) + { + return ; + } + + sbAllocationFailed = FALSE ; + + if(RELEASE == sStatus) + { + release() ; + return ; + } + + char* p = NULL ; + if(sMemLeakingSpeed > 0 && sTotalLeaked < sMaxLeakedMem) + { + p = new char[sMemLeakingSpeed] ; + + if(p) + { + mLeakedMem.push_back(p) ; + sTotalLeaked += sMemLeakingSpeed ; + } + } + if(!p) + { + sStatus = STOP ; + sbAllocationFailed = TRUE ; + } +} + +//---------------------- +void LLFloaterMemLeak::onChangeLeakingSpeed(LLUICtrl* ctrl, void* userData) +{ + LLFloaterMemLeak *mem_leak = (LLFloaterMemLeak *)userData; + if (mem_leak) + { + F32 tmp ; + tmp = mem_leak->childGetValue("leak_speed").asReal(); + + if(tmp > (F32)0xFFFFFFFF) + { + sMemLeakingSpeed = 0xFFFFFFFF ; + } + else + { + sMemLeakingSpeed = (U32)tmp ; + } + } +} + +void LLFloaterMemLeak::onChangeMaxMemLeaking(LLUICtrl* ctrl, void* userData) +{ + LLFloaterMemLeak *mem_leak = (LLFloaterMemLeak *)userData; + if (mem_leak) + { + F32 tmp ; + tmp = mem_leak->childGetValue("max_leak").asReal(); + if(tmp > (F32)0xFFF) + { + sMaxLeakedMem = 0xFFFFFFFF ; + } + else + { + sMaxLeakedMem = ((U32)tmp) << 20 ; + } + } +} + +void LLFloaterMemLeak::onClickStart(void* userData) +{ + sStatus = START ; +} + +void LLFloaterMemLeak::onClickStop(void* userData) +{ + sStatus = STOP ; +} + +void LLFloaterMemLeak::onClickRelease(void* userData) +{ + sStatus = RELEASE ; +} + +void LLFloaterMemLeak::onClickClose(void* userData) +{ + if (sInstance) + { + sInstance->setVisible(FALSE); + } +} + +//---------------------------------------------- + +BOOL LLFloaterMemLeak::postBuild(void) +{ + childSetCommitCallback("leak_speed", onChangeLeakingSpeed, this); + childSetCommitCallback("max_leak", onChangeMaxMemLeaking, this); + + childSetAction("start_btn", onClickStart, this); + childSetAction("stop_btn", onClickStop, this); + childSetAction("release_btn", onClickRelease, this); + childSetAction("close_btn", onClickClose, this); + + return TRUE ; +} + +void LLFloaterMemLeak::draw() +{ + //show total memory leaked + if(sTotalLeaked > 0) + { + std::string bytes_string; + LLResMgr::getInstance()->getIntegerString(bytes_string, sTotalLeaked >> 10 ); + childSetTextArg("total_leaked_label", "[SIZE]", bytes_string); + } + else + { + childSetTextArg("total_leaked_label", "[SIZE]", LLStringExplicit("0")); + } + + if(sbAllocationFailed) + { + childSetTextArg("note_label_1", "[NOTE1]", LLStringExplicit("Memory leaking simulation stops. Reduce leaking speed or")); + childSetTextArg("note_label_2", "[NOTE2]", LLStringExplicit("increase max leaked memory, then press Start to continue.")); + } + else + { + childSetTextArg("note_label_1", "[NOTE1]", LLStringExplicit("")); + childSetTextArg("note_label_2", "[NOTE2]", LLStringExplicit("")); + } + + LLFloater::draw(); +} + +// static instance of it +LLFloaterMemLeak* LLFloaterMemLeak::instance() +{ + if (!sInstance) + { + sInstance = new LLFloaterMemLeak(); + LLUICtrlFactory::getInstance()->buildFloater(sInstance, "floater_mem_leaking.xml", NULL, FALSE); + + if(sInstance) + { + F32 a, b ; + a = sInstance->childGetValue("leak_speed").asReal(); + if(a > (F32)(0xFFFFFFFF)) + { + sMemLeakingSpeed = 0xFFFFFFFF ; + } + else + { + sMemLeakingSpeed = (U32)a ; + } + b = sInstance->childGetValue("max_leak").asReal(); + if(b > (F32)0xFFF) + { + sMaxLeakedMem = 0xFFFFFFFF ; + } + else + { + sMaxLeakedMem = ((U32)b) << 20 ; + } + + sbAllocationFailed = FALSE ; + } + } + return sInstance ; +} + +void LLFloaterMemLeak::show(void*) +{ + instance()->open(); +} + +LLFloaterMemLeak* LLFloaterMemLeak::getInstance() +{ + return sInstance ; +} + diff --git a/indra/newview/llfloatermemleak.h b/indra/newview/llfloatermemleak.h new file mode 100644 index 0000000000..d97cdc771b --- /dev/null +++ b/indra/newview/llfloatermemleak.h @@ -0,0 +1,89 @@ +/** + * @file llfloatermemleak.h + * @brief memory leaking simulation window, debug use only + * + * $LicenseInfo:firstyear=2004&license=viewergpl$ + * + * Copyright (c) 2004-2007, 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://secondlife.com/developers/opensource/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://secondlife.com/developers/opensource/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_LLFLOATERMEMLEAK_H +#define LL_LLFLOATERMEMLEAK_H + +#include "llfloater.h" + +class LLFloaterMemLeak : public LLFloater +{ +public: + LLFloaterMemLeak(); + virtual ~LLFloaterMemLeak(); + + /// initialize all the callbacks for the menu + //void initCallbacks(void); + virtual BOOL postBuild() ; + virtual void draw() ; + + /// one and one instance only + static LLFloaterMemLeak* instance(); + + static void onChangeLeakingSpeed(LLUICtrl* ctrl, void* userData); + static void onChangeMaxMemLeaking(LLUICtrl* ctrl, void* userData); + static void onClickStart(void* userData); + static void onClickStop(void* userData); + static void onClickRelease(void* userData); + static void onClickClose(void* userData); + + /// show off our menu + static void show(void*); + +public: + static LLFloaterMemLeak* getInstance() ; + void idle() ; + void stop() ; + +private: + void release() ; + +private: + enum + { + RELEASE = -1 , + STOP, + START + } ; + + // one instance on the inside + static LLFloaterMemLeak* sInstance; + + static U32 sMemLeakingSpeed ; //bytes leaked per frame + static U32 sMaxLeakedMem ; //maximum allowed leaked memory + static U32 sTotalLeaked ; + static S32 sStatus ; //0: stop ; >0: start ; <0: release + static BOOL sbAllocationFailed ; + + std::vector<char*> mLeakedMem ; +}; + +#endif // LL_LLFLOATERMEMLEAK_H diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index a95cafa7e4..f53482a476 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -46,6 +46,7 @@ #include "llviewercontrol.h" #include "llviewermenufile.h" // upload_new_resource() #include "lluictrlfactory.h" +#include "llstring.h" // linden includes #include "llassetstorage.h" diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index d193685432..65e5dc2bf9 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -1011,7 +1011,7 @@ void LLFloaterTools::setObjectType( void* data ) LLPCode pcode = *(LLPCode*) data; LLToolPlacer::setObjectType( pcode ); gSavedSettings.setBOOL("CreateToolCopySelection", FALSE); - gViewerWindow->setMouseCapture(NULL); + gFocusMgr.setMouseCapture(NULL); } // static diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index 2d0723f1eb..5ed50c0c2a 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -170,7 +170,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) F32 score; std::string name_buf; std::string owner_buf; - F32 mono_score; + F32 mono_score = 0.f; msg->getU32Fast(_PREHASH_ReportData, _PREHASH_TaskLocalID, task_local_id, block); msg->getUUIDFast(_PREHASH_ReportData, _PREHASH_TaskID, task_id, block); @@ -206,15 +206,16 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) element["columns"][3]["column"] = "time"; element["columns"][3]["value"] = formatted_time((time_t)time_stamp); element["columns"][3]["font"] = "SANSSERIF"; - + if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS) { - msg->getF32Fast(_PREHASH_ReportData, "MonoScore", mono_score, block); + // Not in the message template, needs to be checked against number of blocks + //msg->getF32Fast(_PREHASH_ReportData, "MonoScore", mono_score, block); element["columns"][4]["column"] = "Mono Time"; element["columns"][4]["value"] = llformat("%0.3f", mono_score); element["columns"][4]["font"] = "SANSSERIF"; } - + list->addElement(element); mObjectListData.append(element); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 2739a30031..016909cf7f 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -609,7 +609,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask ) { // No handler needed for focus lost since this class has no // state that depends on it. - gViewerWindow->setMouseCapture( this ); + gFocusMgr.setMouseCapture( this ); if (!mIsSelected) { @@ -680,7 +680,7 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask ) // Release keyboard focus, so that if stuff is dropped into the // world, pressing the delete key won't blow away the inventory // item. - gViewerWindow->setKeyboardFocus(NULL); + gFocusMgr.setKeyboardFocus(NULL); return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask ); } @@ -747,7 +747,7 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask ) if( hasMouseCapture() ) { getRoot()->setShowSelectionContext(FALSE); - gViewerWindow->setMouseCapture( NULL ); + gFocusMgr.setMouseCapture( NULL ); } return TRUE; } @@ -2585,9 +2585,9 @@ LLFolderView::~LLFolderView( void ) LLView::deleteViewByHandle(mPopupMenuHandle); - if(gViewerWindow->hasTopCtrl(mRenamer)) + if(mRenamer == gFocusMgr.getTopCtrl()) { - gViewerWindow->setTopCtrl(NULL); + gFocusMgr.setTopCtrl(NULL); } mAutoOpenItems.removeAllNodes(); @@ -3132,9 +3132,9 @@ void LLFolderView::draw() { closeAutoOpenedFolders(); } - if(gViewerWindow->hasKeyboardFocus(this) && !getVisible()) + if(this == gFocusMgr.getKeyboardFocus() && !getVisible()) { - gViewerWindow->setKeyboardFocus( NULL ); + gFocusMgr.setKeyboardFocus( NULL ); } // while dragging, update selection rendering to reflect single/multi drag status @@ -3199,7 +3199,7 @@ void LLFolderView::finishRenamingItem( void ) mRenamer->setFocus( FALSE ); mRenamer->setVisible( FALSE ); mRenamer->setCommitOnFocusLost( TRUE ); - gViewerWindow->setTopCtrl( NULL ); + gFocusMgr.setTopCtrl( NULL ); if( mRenameItem ) { @@ -3211,13 +3211,12 @@ void LLFolderView::finishRenamingItem( void ) scrollToShowSelection(); } -void LLFolderView::revertRenamingItem( void ) +void LLFolderView::closeRenamer( void ) { - mRenamer->setCommitOnFocusLost( FALSE ); + // will commit current name (which could be same as original name) mRenamer->setFocus( FALSE ); mRenamer->setVisible( FALSE ); - mRenamer->setCommitOnFocusLost( TRUE ); - gViewerWindow->setTopCtrl( NULL ); + gFocusMgr.setTopCtrl( NULL ); if( mRenameItem ) { @@ -3274,11 +3273,11 @@ void LLFolderView::removeSelectedItems( void ) // change selection on successful delete if (new_selection) { - setSelectionFromRoot(new_selection, new_selection->isOpen(), gViewerWindow->childHasKeyboardFocus(this)); + setSelectionFromRoot(new_selection, new_selection->isOpen(), gFocusMgr.childHasKeyboardFocus(this)); } else { - setSelectionFromRoot(NULL, gViewerWindow->childHasKeyboardFocus(this)); + setSelectionFromRoot(NULL, gFocusMgr.childHasKeyboardFocus(this)); } } } @@ -3304,11 +3303,11 @@ void LLFolderView::removeSelectedItems( void ) } if (new_selection) { - setSelectionFromRoot(new_selection, new_selection->isOpen(), gViewerWindow->childHasKeyboardFocus(this)); + setSelectionFromRoot(new_selection, new_selection->isOpen(), gFocusMgr.childHasKeyboardFocus(this)); } else { - setSelectionFromRoot(NULL, gViewerWindow->childHasKeyboardFocus(this)); + setSelectionFromRoot(NULL, gFocusMgr.childHasKeyboardFocus(this)); } for(S32 i = 0; i < count; ++i) @@ -3626,7 +3625,7 @@ void LLFolderView::startRenamingSelectedItem( void ) // set focus will fail unless item is visible mRenamer->setFocus( TRUE ); mRenamer->setLostTopCallback(onRenamerLost); - gViewerWindow->setTopCtrl( mRenamer ); + gFocusMgr.setTopCtrl( mRenamer ); } } @@ -3687,19 +3686,11 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask ) break; case KEY_ESCAPE: - // mark flag don't commit if( mRenameItem && mRenamer->getVisible() ) { - revertRenamingItem(); + closeRenamer(); handled = TRUE; } - else - { - if( gViewerWindow->childHasKeyboardFocus( this ) ) - { - gViewerWindow->setKeyboardFocus( NULL ); - } - } mSearchString.clear(); break; @@ -4107,9 +4098,9 @@ BOOL LLFolderView::handleScrollWheel(S32 x, S32 y, S32 clicks) void LLFolderView::deleteAllChildren() { - if(gViewerWindow->hasTopCtrl(mRenamer)) + if(mRenamer == gFocusMgr.getTopCtrl()) { - gViewerWindow->setTopCtrl(NULL); + gFocusMgr.setTopCtrl(NULL); } LLView::deleteViewByHandle(mPopupMenuHandle); mPopupMenuHandle = LLHandle<LLView>(); diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 32b0580a5c..841146db5a 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -880,7 +880,7 @@ protected: static void onRenamerLost( LLUICtrl* renamer, void* user_data); void finishRenamingItem( void ); - void revertRenamingItem( void ); + void closeRenamer( void ); protected: LLHandle<LLView> mPopupMenuHandle; diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index da9441e108..80e62aff8f 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -961,6 +961,21 @@ void LLHUDText::renderAllHUD() } } +void LLHUDText::shiftAll(const LLVector3& offset) +{ + TextObjectIterator text_it; + for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) + { + LLHUDText *textp = text_it->get(); + textp->shift(offset); + } +} + +void LLHUDText::shift(const LLVector3& offset) +{ + mPositionAgent += offset; +} + //static void LLHUDText::addPickable(std::set<LLViewerObject*> &pick_list) { diff --git a/indra/newview/llhudtext.h b/indra/newview/llhudtext.h index bb96c356bb..b46a1635dd 100644 --- a/indra/newview/llhudtext.h +++ b/indra/newview/llhudtext.h @@ -121,6 +121,9 @@ public: BOOL getHidden() const { return mHidden; } void setHidden( BOOL hide ) { mHidden = hide; } void setOnHUDAttachment(BOOL on_hud) { mOnHUDAttachment = on_hud; } + void shift(const LLVector3& offset); + + static void shiftAll(const LLVector3& offset); static void renderAllHUD(); static void addPickable(std::set<LLViewerObject*> &pick_list); static void reshape(); diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp index 40da1a4f3c..328cb85c1f 100644 --- a/indra/newview/llimpanel.cpp +++ b/indra/newview/llimpanel.cpp @@ -2173,11 +2173,17 @@ void LLFloaterIMPanel::chatFromLogFile(LLLogChat::ELogLineType type, std::string { case LLLogChat::LOG_EMPTY: // add warning log enabled message - message = LLFloaterChat::getInstance()->getUIString("IM_logging_string"); + if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) + { + message = LLFloaterChat::getInstance()->getUIString("IM_logging_string"); + } break; case LLLogChat::LOG_END: // add log end message - message = LLFloaterChat::getInstance()->getUIString("IM_logging_string"); + if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) + { + message = LLFloaterChat::getInstance()->getUIString("IM_logging_string"); + } break; case LLLogChat::LOG_LINE: // just add normal lines from file diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index c05eea7bd8..9aa7f54fa9 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -56,6 +56,7 @@ #include "llcallbacklist.h" #include "llpreview.h" #include "llviewercontrol.h" +#include "llvoavatar.h" #include "llsdutil.h" #include <deque> @@ -3064,6 +3065,45 @@ void LLInventoryModel::dumpInventory() /// LLInventoryCollectFunctor implementations ///---------------------------------------------------------------------------- +// static +bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(LLInventoryItem* item) +{ + if (!item) + return false; + + bool allowed = false; + LLVOAvatar* my_avatar = NULL; + + switch(item->getType()) + { + case LLAssetType::AT_CALLINGCARD: + // not allowed + break; + + case LLAssetType::AT_OBJECT: + my_avatar = gAgent.getAvatarObject(); + if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID())) + { + allowed = true; + } + break; + + case LLAssetType::AT_BODYPART: + case LLAssetType::AT_CLOTHING: + if(!gAgent.isWearingItem(item->getUUID())) + { + allowed = true; + } + break; + + default: + allowed = true; + break; + } + + return allowed; +} + bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { if(mType == LLAssetType::AT_CATEGORY) diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index 8d554e2673..85eb46404b 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -484,6 +484,8 @@ class LLInventoryCollectFunctor public: virtual ~LLInventoryCollectFunctor(){}; virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0; + + static bool itemTransferCommonlyAllowed(LLInventoryItem* item); }; diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index cb7af207d2..d129687a11 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -40,11 +40,24 @@ const S32 LOG_RECALL_SIZE = 2048; //static std::string LLLogChat::makeLogFileName(std::string filename) { + filename = cleanFileName(filename); filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS,filename); filename += ".txt"; return filename; } +std::string LLLogChat::cleanFileName(std::string filename) +{ + std::string invalidChars = "\"\'\\/?*:<>|"; + S32 position = filename.find_first_of(invalidChars); + while (position != filename.npos) + { + filename[position] = '_'; + position = filename.find_first_of(invalidChars, position); + } + return filename; +} + std::string LLLogChat::timestamp(bool withdate) { time_t utc_time; diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index 45279fd6ae..28e073de4c 100644 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -48,6 +48,8 @@ public: static void loadHistory(std::string filename, void (*callback)(ELogLineType,std::string,void*), void* userdata); +private: + static std::string cleanFileName(std::string filename); }; #endif diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index ca0812c8a0..f1a0fd4c67 100644 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -448,6 +448,19 @@ BOOL LLManipRotate::handleMouseUp(S32 x, S32 y, MASK mask) if( hasMouseCapture() ) { + for (LLObjectSelection::iterator iter = mObjectSelection->begin(); + iter != mObjectSelection->end(); iter++) + { + LLSelectNode* selectNode = *iter; + LLViewerObject* object = selectNode->getObject(); + + // have permission to move and object is root of selection or individually selected + if (object->permMove() && (object->isRootEdit() || selectNode->mIndividualSelection)) + { + object->mUnselectedChildrenPositions.clear() ; + } + } + mManipPart = LL_NO_PART; // Might have missed last update due to timing. @@ -544,16 +557,12 @@ void LLManipRotate::drag( S32 x, S32 y ) } LLQuaternion new_rot = selectNode->mSavedRotation * mRotation; - std::vector<LLVector3> child_positions; + std::vector<LLVector3>& child_positions = object->mUnselectedChildrenPositions ; std::vector<LLQuaternion> child_rotations; if (object->isRootEdit() && selectNode->mIndividualSelection) { - for (U32 i = 0; i < object->mChildList.size(); i++) - { - LLViewerObject* childp = object->mChildList[i]; - child_positions.push_back(childp->getPositionEdit()); - child_rotations.push_back(childp->getRotationEdit()); - } + object->saveUnselectedChildrenRotation(child_rotations) ; + object->saveUnselectedChildrenPosition(child_positions) ; } if (object->getParent() && object->mDrawable.notNull()) @@ -575,17 +584,7 @@ void LLManipRotate::drag( S32 x, S32 y ) { //RN: must do non-damped updates on these objects so relative rotation appears constant // instead of having two competing slerps making the child objects appear to "wobble" - for (U32 i = 0; i < object->mChildList.size(); i++) - { - LLViewerObject* childp = object->mChildList[i]; - LLVector3 child_offset = ((child_positions[i] - object->getPositionEdit()) * ~object->getRotationEdit()) - childp->getPosition(); - if (!childp->isSelected() && childp->mDrawable.notNull()) - { - childp->setRotation(child_rotations[i] * ~object->getRotationEdit()); - childp->setPosition((child_positions[i] - object->getPositionEdit()) * ~object->getRotationEdit()); - rebuild(childp); - } - } + object->resetChildrenRotationAndPosition(child_rotations, child_positions) ; } } } @@ -667,28 +666,8 @@ void LLManipRotate::drag( S32 x, S32 y ) if (object->isRootEdit() && selectNode->mIndividualSelection) { // only offset by parent's translation as we've already countered parent's rotation - LLVector3 child_offset; - if (object->isAttachment() && object->mDrawable.notNull()) - { - LLXform* attachment_point_xform = object->mDrawable->getXform()->getParent(); - LLQuaternion parent_rotation = object->getRotation() * attachment_point_xform->getWorldRotation(); - child_offset = LLVector3(old_position - new_position) * ~parent_rotation; - } - else - { - child_offset = LLVector3(old_position - new_position) * ~object->getRenderRotation(); - } - rebuild(object); - for (U32 i = 0; i < object->mChildList.size(); i++) - { - LLViewerObject* childp = object->mChildList[i]; - if (!childp->isSelected() && childp->mDrawable.notNull()) - { - childp->setPosition(childp->getPosition() + child_offset); - rebuild(childp); - } - } + object->resetChildrenPosition(old_position - new_position) ; } } } diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp index 5859d4c75f..68e59ce9e0 100644 --- a/indra/newview/llmanipscale.cpp +++ b/indra/newview/llmanipscale.cpp @@ -1003,9 +1003,11 @@ void LLManipScale::dragCorner( S32 x, S32 y ) if (selectNode->mIndividualSelection) { // counter-translate child objects if we are moving the root as an individual - for (U32 child_num = 0; child_num < cur->mChildList.size(); child_num++) + LLViewerObject::const_child_list_t& child_list = cur->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLViewerObject* childp = cur->mChildList[child_num]; + LLViewerObject* childp = *iter; if (cur->isAttachment()) { @@ -1301,9 +1303,11 @@ void LLManipScale::stretchFace( const LLVector3& drag_start_agent, const LLVecto if (cur->isRootEdit() && selectNode->mIndividualSelection) { // counter-translate child objects if we are moving the root as an individual - for (U32 child_num = 0; child_num < cur->mChildList.size(); child_num++) + LLViewerObject::const_child_list_t& child_list = cur->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLViewerObject* childp = cur->mChildList[child_num]; + LLViewerObject* childp = *iter; if (!getUniform()) { LLVector3 child_pos = childp->getPosition() - (delta_pos * ~cur->getRotationEdit()); diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 7785b5a078..ac82295008 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -677,19 +677,9 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) if (selectNode->mIndividualSelection) { send_update = FALSE; - LLVector3 child_offset = (old_position_local - new_position_local) * ~object->getRotation(); - + // counter-translate child objects if we are moving the root as an individual - for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++) - { - LLViewerObject* childp = object->mChildList[child_num]; - - if (!childp->isSelected()) - { - childp->setPosition(childp->getPosition() + child_offset); - rebuild(childp); - } - } + object->resetChildrenPosition(old_position_local - new_position_local, TRUE) ; } } else @@ -743,18 +733,8 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) if (selectNode->mIndividualSelection) { - LLVector3 parent_offset = (new_position_agent - old_position_agent) * ~object->getRotation(); - // counter-translate child objects if we are moving the root as an individual - for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++) - { - LLViewerObject* childp = object->mChildList[child_num]; - if (!childp->isSelected()) - { - childp->setPosition(childp->getPosition() - parent_offset); - rebuild(childp); - } - } + object->resetChildrenPosition(old_position_agent - new_position_agent, TRUE) ; send_update = FALSE; } else if (old_position_global != new_position_global) diff --git a/indra/newview/llmemoryview.cpp b/indra/newview/llmemoryview.cpp index 75f05f6d0c..a5a4db8dc4 100644 --- a/indra/newview/llmemoryview.cpp +++ b/indra/newview/llmemoryview.cpp @@ -121,6 +121,7 @@ static const struct mtv_display_info mtv_display_table[] = { LLMemType::MTYPE_SPACE_PARTITION, "Space Partition", &LLColor4::blue2 }, { LLMemType::MTYPE_VERTEX_DATA, "Vertex Buffer", &LLColor4::blue3 }, { LLMemType::MTYPE_AVATAR, "Avatar", &LLColor4::purple1 }, + { LLMemType::MTYPE_AVATAR_MESH, "Avatar Mesh", &LLColor4::purple2 }, { LLMemType::MTYPE_ANIMATION, "Animation", &LLColor4::purple3 }, { LLMemType::MTYPE_REGIONS, "Regions", &LLColor4::blue1 }, { LLMemType::MTYPE_VOLUME, "Volume", &LLColor4::pink1 }, diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 3a33f62c38..47948281ab 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -279,7 +279,7 @@ void LLNetMap::draw() gGL.color4f(0.8f, 0.8f, 0.8f, 1.f); } - if (!regionp->mAlive) + if (!regionp->isAlive()) { gGL.color4f(1.f, 0.5f, 0.5f, 1.f); } diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index a70ca9444f..c4c7749b8a 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -441,7 +441,8 @@ bool LLPanelGroupGeneral::apply(std::string& mesg) llinfos << "LLPanelGroupGeneral::apply" << llendl; // Check to make sure mature has been set - if(mComboMature->getCurrentIndex() == DECLINE_TO_STATE) + if(mComboMature && + mComboMature->getCurrentIndex() == DECLINE_TO_STATE) { LLStringUtil::format_map_t args; gViewerWindow->alertXml("SetGroupMature", &callbackConfirmMatureApply, diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index b181aff62d..d3fb041bad 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -1546,7 +1546,7 @@ void LLPanelObject::getVolumeParams(LLVolumeParams& volume_params) } // BUG: Make work with multiple objects -void LLPanelObject::sendRotation() +void LLPanelObject::sendRotation(BOOL btn_down) { if (mObject.isNull()) return; @@ -1570,16 +1570,34 @@ void LLPanelObject::sendRotation() { rotation = rotation * ~mRootObject->getRotationRegion(); } + std::vector<LLVector3>& child_positions = mObject->mUnselectedChildrenPositions ; + std::vector<LLQuaternion> child_rotations; + if (mObject->isRootEdit()) + { + mObject->saveUnselectedChildrenRotation(child_rotations) ; + mObject->saveUnselectedChildrenPosition(child_positions) ; + } - mObject->setRotation(rotation, TRUE ); + mObject->setRotation(rotation); + LLManip::rebuild(mObject) ; + + // for individually selected roots, we need to counterrotate all the children + if (mObject->isRootEdit()) + { + mObject->resetChildrenRotationAndPosition(child_rotations, child_positions) ; + } - LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_ROTATION); + if(!btn_down) + { + child_positions.clear() ; + LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_ROTATION | UPD_POSITION); + } } } // BUG: Make work with multiple objects -void LLPanelObject::sendScale() +void LLPanelObject::sendScale(BOOL btn_down) { if (mObject.isNull()) return; @@ -1599,7 +1617,11 @@ void LLPanelObject::sendScale() } mObject->setScale(newscale, TRUE); - LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE | UPD_POSITION); + + if(!btn_down) + { + LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_SCALE | UPD_POSITION); + } LLSelectMgr::getInstance()->adjustTexturesByScale(TRUE, !dont_stretch_textures); // llinfos << "scale sent" << llendl; @@ -1611,7 +1633,7 @@ void LLPanelObject::sendScale() } -void LLPanelObject::sendPosition() +void LLPanelObject::sendPosition(BOOL btn_down) { if (mObject.isNull()) return; @@ -1654,7 +1676,7 @@ void LLPanelObject::sendPosition() LLVector3d delta = new_pos_global - old_pos_global; // moved more than 1/2 millimeter if (delta.magVec() >= 0.0005f) - { + { if (mRootObject != mObject) { newpos = newpos - mRootObject->getPositionRegion(); @@ -1664,8 +1686,21 @@ void LLPanelObject::sendPosition() else { mObject->setPositionEdit(newpos); + } + + LLManip::rebuild(mObject) ; + + // for individually selected roots, we need to counter-translate all unselected children + if (mObject->isRootEdit()) + { + // only offset by parent's translation + mObject->resetChildrenPosition(LLVector3(-delta), TRUE) ; + } + + if(!btn_down) + { + LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION); } - LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION); LLSelectMgr::getInstance()->updateSelectionCenter(); } @@ -1846,21 +1881,24 @@ void LLPanelObject::onCommitLock(LLUICtrl *ctrl, void *data) void LLPanelObject::onCommitPosition( LLUICtrl* ctrl, void* userdata ) { LLPanelObject* self = (LLPanelObject*) userdata; - self->sendPosition(); + BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ; + self->sendPosition(btn_down); } // static void LLPanelObject::onCommitScale( LLUICtrl* ctrl, void* userdata ) { LLPanelObject* self = (LLPanelObject*) userdata; - self->sendScale(); + BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ; + self->sendScale(btn_down); } // static void LLPanelObject::onCommitRotation( LLUICtrl* ctrl, void* userdata ) { LLPanelObject* self = (LLPanelObject*) userdata; - self->sendRotation(); + BOOL btn_down = ((LLSpinCtrl*)ctrl)->isMouseHeldDown() ; + self->sendRotation(btn_down); } // static diff --git a/indra/newview/llpanelobject.h b/indra/newview/llpanelobject.h index 87c9ce04a0..dd94922e10 100644 --- a/indra/newview/llpanelobject.h +++ b/indra/newview/llpanelobject.h @@ -87,9 +87,9 @@ public: protected: void getState(); - void sendRotation(); - void sendScale(); - void sendPosition(); + void sendRotation(BOOL btn_down); + void sendScale(BOOL btn_down); + void sendPosition(BOOL btn_down); void sendIsPhysical(); void sendIsTemporary(); void sendIsPhantom(); @@ -180,7 +180,7 @@ protected: LLUUID mSculptTextureRevert; // so we can revert the sculpt texture on cancel U8 mSculptTypeRevert; // so we can revert the sculpt type on cancel - + LLPointer<LLViewerObject> mObject; LLPointer<LLViewerObject> mRootObject; }; diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp index fef4726b12..5ee54156b7 100644 --- a/indra/newview/llpolymesh.cpp +++ b/indra/newview/llpolymesh.cpp @@ -679,7 +679,9 @@ const LLVector2 &LLPolyMeshSharedData::getUVs(U32 index) // LLPolyMesh() //----------------------------------------------------------------------------- LLPolyMesh::LLPolyMesh(LLPolyMeshSharedData *shared_data, LLPolyMesh *reference_mesh) -{ +{ + LLMemType mt(LLMemType::MTYPE_AVATAR_MESH); + llassert(shared_data); mSharedData = shared_data; diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 6f2c57c055..55bad7fc7d 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -311,9 +311,7 @@ void LLPreviewTexture::saveAs() mLoadingFullImage = TRUE; getWindow()->incBusyCount(); mImage->setLoadedCallback( LLPreviewTexture::onFileLoadedForSave, - 0, - TRUE, - new LLUUID( mItemUUID ) ); + 0, TRUE, FALSE, new LLUUID( mItemUUID ) ); } } diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 2f11dad010..cf11336377 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -845,9 +845,12 @@ void LLSelectMgr::highlightObjectAndFamily(LLViewerObject* objectp) highlightObjectOnly(root_obj); - for(U32 i = 0; i < root_obj->mChildList.size(); i++) + LLViewerObject::const_child_list_t& child_list = root_obj->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - highlightObjectOnly(root_obj->mChildList[i]); + LLViewerObject* child = *iter; + highlightObjectOnly(child); } } @@ -872,8 +875,9 @@ void LLSelectMgr::highlightObjectAndFamily(const std::vector<LLViewerObject*>& o LLViewerObject* root = (LLViewerObject*)object->getRoot(); mRectSelectedObjects.insert(root); - for (LLViewerObject::child_list_t::const_iterator iter2 = root->mChildList.begin(); - iter2 != root->mChildList.end(); ++iter2) + LLViewerObject::const_child_list_t& child_list = root->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter2 = child_list.begin(); + iter2 != child_list.end(); iter2++) { LLViewerObject* child = *iter2; mRectSelectedObjects.insert(child); @@ -902,10 +906,11 @@ void LLSelectMgr::unhighlightObjectAndFamily(LLViewerObject* objectp) unhighlightObjectOnly(root_obj); - for (LLViewerObject::child_list_t::iterator iter2 = root_obj->mChildList.begin(); - iter2 != root_obj->mChildList.end(); ++iter2) + LLViewerObject::const_child_list_t& child_list = root_obj->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLViewerObject* child = *iter2; + LLViewerObject* child = *iter; unhighlightObjectOnly(child); } } @@ -1005,10 +1010,11 @@ void LLSelectMgr::addGridObject(LLViewerObject* objectp) LLSelectNode* nodep = new LLSelectNode(objectp, FALSE); mGridObjects.addNodeAtEnd(nodep); - for (LLViewerObject::child_list_t::iterator iter2 = objectp->mChildList.begin(); - iter2 != objectp->mChildList.end(); ++iter2) + LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLViewerObject* child = *iter2; + LLViewerObject* child = *iter; nodep = new LLSelectNode(child, FALSE); mGridObjects.addNodeAtEnd(nodep); } @@ -4719,8 +4725,9 @@ void LLSelectMgr::updateSilhouettes() } else { - for (LLViewerObject::child_list_t::iterator iter = objectp->mChildList.begin(); - iter != objectp->mChildList.end(); ++iter) + LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { LLViewerObject* child_objectp = *iter; @@ -5412,8 +5419,9 @@ S32 get_family_count(LLViewerObject *parent) llwarns << "Trying to get_family_count on null parent!" << llendl; } S32 count = 1; // for this object - for (LLViewerObject::child_list_t::iterator iter = parent->mChildList.begin(); - iter != parent->mChildList.end(); ++iter) + LLViewerObject::const_child_list_t& child_list = parent->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { LLViewerObject* child = *iter; diff --git a/indra/newview/llsky.h b/indra/newview/llsky.h index e9e9999ff9..35d669152e 100644 --- a/indra/newview/llsky.h +++ b/indra/newview/llsky.h @@ -117,9 +117,6 @@ protected: F32 mSunPhase; LLColor4 mFogColor; // Color to use for fog and haze - F32 mHaze; // a multiplier to scale the lighting - F32 mDomeRadius; // sky dome size - LLVector3 mLastSunDirection; }; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index d24c738f2c..59b25acca4 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -188,7 +188,7 @@ // // exported globals // -BOOL gAgentMovementCompleted = FALSE; +bool gAgentMovementCompleted = false; std::string SCREEN_HOME_FILENAME = "screen_home.bmp"; std::string SCREEN_LAST_FILENAME = "screen_last.bmp"; @@ -214,7 +214,7 @@ static std::string sInitialOutfitGender; // "male" or "female" static bool gUseCircuitCallbackCalled = false; -S32 LLStartUp::gStartupState = STATE_FIRST; +EStartupState LLStartUp::gStartupState = STATE_FIRST; // @@ -225,7 +225,7 @@ void login_show(); void login_callback(S32 option, void* userdata); std::string load_password_from_disk(); void save_password_to_disk(const char* hashed_password); -BOOL is_hex_string(U8* str, S32 len); +bool is_hex_string(U8* str, S32 len); void show_first_run_dialog(); void first_run_dialog_callback(S32 option, void* userdata); void set_startup_status(const F32 frac, const std::string& string, const std::string& msg); @@ -301,9 +301,9 @@ void update_texture_fetch() static std::vector<std::string> sAuthUris; static S32 sAuthUriNum = -1; -// Returns FALSE to skip other idle processing. Should only return -// TRUE when all initialization done. -BOOL idle_startup() +// Returns false to skip other idle processing. Should only return +// true when all initialization done. +bool idle_startup() { LLMemType mt1(LLMemType::MTYPE_STARTUP); @@ -341,12 +341,12 @@ BOOL idle_startup() static S32 agent_location_id = START_LOCATION_ID_LAST; static S32 location_which = START_LOCATION_ID_LAST; - static BOOL show_connect_box = TRUE; + static bool show_connect_box = true; static BOOL remember_password = TRUE; - static BOOL stipend_since_login = FALSE; + static bool stipend_since_login = false; - static BOOL samename = FALSE; + static bool samename = false; // HACK: These are things from the main loop that usually aren't done // until initialization is complete, but need to be done here for things @@ -443,6 +443,18 @@ BOOL idle_startup() LLFILE* found_template = NULL; found_template = LLFile::fopen(message_template_path, "r"); /* Flawfinder: ignore */ + + #if LL_WINDOWS + // On the windows dev builds, unpackaged, the message_template.msg + // file will be located in + // indra/build-vc**/newview/<config>/app_settings. + if (!found_template) + { + message_template_path = gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "app_settings", "message_template.msg"); + found_template = LLFile::fopen(message_template_path.c_str(), "r"); /* Flawfinder: ignore */ + } + #endif + if (found_template) { fclose(found_template); @@ -468,7 +480,24 @@ BOOL idle_startup() std::string msg = llformat("Unable to start networking, error %d", gMessageSystem->getErrorCode()); LLAppViewer::instance()->earlyExit(msg); } - LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); + + #if LL_WINDOWS + // On the windows dev builds, unpackaged, the message.xml file will + // be located in indra/build-vc**/newview/<config>/app_settings. + std::string message_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"message.xml"); + + if (!LLFile::isfile(message_path.c_str())) + { + LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, "app_settings", "")); + } + else + { + LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); + } + #else + LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); + #endif + } else { @@ -558,7 +587,7 @@ BOOL idle_startup() #else void* window_handle = NULL; #endif - BOOL init = gAudiop->init(kAUDIO_NUM_SOURCES, window_handle); + bool init = gAudiop->init(kAUDIO_NUM_SOURCES, window_handle); if(!init) { LL_WARNS("AppInit") << "Unable to initialize audio engine" << LL_ENDL; @@ -584,7 +613,7 @@ BOOL idle_startup() lastname = gLoginHandler.mLastName; web_login_key = gLoginHandler.mWebLoginKey; - show_connect_box = FALSE; + show_connect_box = false; } else if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3) { @@ -599,9 +628,9 @@ BOOL idle_startup() remember_password = gSavedSettings.getBOOL("RememberPassword"); #ifdef USE_VIEWER_AUTH - show_connect_box = TRUE; + show_connect_box = true; #else - show_connect_box = FALSE; + show_connect_box = false; #endif gSavedSettings.setBOOL("AutoLogin", TRUE); } @@ -614,9 +643,9 @@ BOOL idle_startup() remember_password = TRUE; #ifdef USE_VIEWER_AUTH - show_connect_box = TRUE; + show_connect_box = true; #else - show_connect_box = FALSE; + show_connect_box = false; #endif } else @@ -627,7 +656,7 @@ BOOL idle_startup() lastname = gSavedSettings.getString("LastName"); password = load_password_from_disk(); remember_password = gSavedSettings.getBOOL("RememberPassword"); - show_connect_box = TRUE; + show_connect_box = true; } @@ -1058,11 +1087,11 @@ BOOL idle_startup() { LL_DEBUGS("AppInit") << "STATE_LOGIN_PROCESS_RESPONSE" << LL_ENDL; std::ostringstream emsg; - BOOL quit = FALSE; + bool quit = false; std::string login_response; std::string reason_response; std::string message_response; - BOOL successful_login = FALSE; + bool successful_login = false; LLUserAuth::UserAuthcode error = LLUserAuth::getInstance()->authResponse(); // reset globals gAcceptTOS = FALSE; @@ -1074,7 +1103,7 @@ BOOL idle_startup() if(login_response == "true") { // Yay, login! - successful_login = TRUE; + successful_login = true; } else if(login_response == "indeterminate") { @@ -1131,11 +1160,11 @@ BOOL idle_startup() message_response); tos_dialog->startModal(); // LLFloaterTOS deletes itself. - return FALSE; + return false; } else { - quit = TRUE; + quit = true; } } if(reason_response == "critical") @@ -1148,11 +1177,11 @@ BOOL idle_startup() message_response); tos_dialog->startModal(); // LLFloaterTOS deletes itself. - return FALSE; + return false; } else { - quit = TRUE; + quit = true; } } if(reason_response == "key") @@ -1168,11 +1197,11 @@ BOOL idle_startup() { update_app(TRUE, auth_message); LLStartUp::setStartupState( STATE_UPDATE_CHECK ); - return FALSE; + return false; } else { - quit = TRUE; + quit = true; } } if(reason_response == "optional") @@ -1184,7 +1213,7 @@ BOOL idle_startup() update_app(FALSE, auth_message); LLStartUp::setStartupState( STATE_UPDATE_CHECK ); gSkipOptionalUpdate = TRUE; - return FALSE; + return false; } } } @@ -1216,7 +1245,7 @@ BOOL idle_startup() { LLUserAuth::getInstance()->reset(); LLAppViewer::instance()->forceQuit(); - return FALSE; + return false; } if(successful_login) @@ -1358,7 +1387,7 @@ BOOL idle_startup() it = options[0].find("stipend_since_login"); if(it != no_flag) { - if((*it).second == "Y") stipend_since_login = TRUE; + if((*it).second == "Y") stipend_since_login = true; } it = options[0].find("gendered"); if(it != no_flag) @@ -1443,7 +1472,7 @@ BOOL idle_startup() gViewerWindow->alertXml("ErrorMessage", args, login_alert_done); reset_login(); gSavedSettings.setBOOL("AutoLogin", FALSE); - show_connect_box = TRUE; + show_connect_box = true; } // Pass the user information to the voice chat server interface. @@ -1463,7 +1492,7 @@ BOOL idle_startup() gViewerWindow->alertXml("ErrorMessage", args, login_alert_done); reset_login(); gSavedSettings.setBOOL("AutoLogin", FALSE); - show_connect_box = TRUE; + show_connect_box = true; // Don't save an incorrect password to disk. save_password_to_disk(NULL); } @@ -2002,7 +2031,7 @@ BOOL idle_startup() llinfos << "Requesting Agent Data" << llendl; gAgent.sendAgentDataUpdateRequest(); - BOOL shown_at_exit = gSavedSettings.getBOOL("ShowInventory"); + bool shown_at_exit = gSavedSettings.getBOOL("ShowInventory"); // Create the inventory views llinfos << "Creating Inventory Views" << llendl; @@ -2113,8 +2142,8 @@ BOOL idle_startup() const BOOL no_inform_server = FALSE; const BOOL no_deactivate_similar = FALSE; gGestureManager.activateGestureWithAsset(item_id, asset_id, - no_inform_server, - no_deactivate_similar); + no_inform_server, + no_deactivate_similar); // We need to fetch the inventory items for these gestures // so we have the names to populate the UI. item_ids.push_back(item_id); @@ -2536,9 +2565,9 @@ void save_password_to_disk(const char* hashed_password) } } -BOOL is_hex_string(U8* str, S32 len) +bool is_hex_string(U8* str, S32 len) { - BOOL rv = TRUE; + bool rv = true; U8* c = str; while(rv && len--) { @@ -2563,7 +2592,7 @@ BOOL is_hex_string(U8* str, S32 len) ++c; break; default: - rv = FALSE; + rv = false; break; } } @@ -2683,7 +2712,7 @@ void update_app(BOOL mandatory, const std::string& auth_msg) void update_dialog_callback(S32 option, void *userdata) { std::string update_exe_path; - BOOL mandatory = userdata != NULL; + bool mandatory = userdata != NULL; #if !LL_RELEASE_FOR_DOWNLOAD if (option == 2) @@ -2805,7 +2834,7 @@ void update_dialog_callback(S32 option, void *userdata) update_exe_path = "'"; update_exe_path += gDirUtilp->getAppRODataDir(); - update_exe_path += "/AutoUpdater.app/Contents/MacOS/AutoUpdater' -url \""; + update_exe_path += "/mac-updater.app/Contents/MacOS/mac-updater' -url \""; update_exe_path += update_url.asString(); update_exe_path += "\" -name \""; update_exe_path += LLAppViewer::instance()->getSecondLifeTitle(); @@ -3709,9 +3738,45 @@ void release_start_screen() // static -void LLStartUp::setStartupState( S32 state ) +std::string LLStartUp::startupStateToString(EStartupState state) +{ +#define RTNENUM(E) case E: return #E + switch(state){ + RTNENUM( STATE_FIRST ); + RTNENUM( STATE_LOGIN_SHOW ); + RTNENUM( STATE_LOGIN_WAIT ); + RTNENUM( STATE_LOGIN_CLEANUP ); + RTNENUM( STATE_UPDATE_CHECK ); + RTNENUM( STATE_LOGIN_AUTH_INIT ); + RTNENUM( STATE_LOGIN_AUTHENTICATE ); + RTNENUM( STATE_LOGIN_NO_DATA_YET ); + RTNENUM( STATE_LOGIN_DOWNLOADING ); + RTNENUM( STATE_LOGIN_PROCESS_RESPONSE ); + RTNENUM( STATE_WORLD_INIT ); + RTNENUM( STATE_SEED_GRANTED_WAIT ); + RTNENUM( STATE_SEED_CAP_GRANTED ); + RTNENUM( STATE_WORLD_WAIT ); + RTNENUM( STATE_AGENT_SEND ); + RTNENUM( STATE_AGENT_WAIT ); + RTNENUM( STATE_INVENTORY_SEND ); + RTNENUM( STATE_MISC ); + RTNENUM( STATE_PRECACHE ); + RTNENUM( STATE_WEARABLES_WAIT ); + RTNENUM( STATE_CLEANUP ); + RTNENUM( STATE_STARTED ); + default: + return llformat("(state #%d)", state); + } +#undef RTNENUM +} + + +// static +void LLStartUp::setStartupState( EStartupState state ) { - LL_INFOS("AppInit") << "Startup state changing from " << gStartupState << " to " << state << LL_ENDL; + LL_INFOS("AppInit") << "Startup state changing from " << + startupStateToString(gStartupState) << " to " << + startupStateToString(state) << LL_ENDL; gStartupState = state; } diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index ea568395d4..3cfe1ca97f 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -35,7 +35,7 @@ #include "llimagegl.h" // functions -BOOL idle_startup(); +bool idle_startup(); std::string load_password_from_disk(); void release_start_screen(); void login_alert_done(S32 option, void* user_data); @@ -44,7 +44,7 @@ void login_alert_done(S32 option, void* user_data); extern std::string SCREEN_HOME_FILENAME; extern std::string SCREEN_LAST_FILENAME; -enum EStartupState{ +typedef enum { STATE_FIRST, // Initial startup STATE_BROWSER_INIT, // Initialize web browser for login screen STATE_LOGIN_SHOW, // Show login screen @@ -69,10 +69,10 @@ enum EStartupState{ STATE_WEARABLES_WAIT, // Wait for clothing to download STATE_CLEANUP, // Final cleanup STATE_STARTED // Up and running in-world -}; +} EStartupState; // exported symbols -extern BOOL gAgentMovementCompleted; +extern bool gAgentMovementCompleted; extern LLPointer<LLImageGL> gStartImageGL; extern std::string gInitialOutfit; extern std::string gInitialOutfitGender; // "male" or "female" @@ -85,8 +85,8 @@ public: // going full screen // Always use this to set gStartupState so changes are logged - static void setStartupState( S32 state ); - static S32 getStartupState() { return gStartupState; }; + static void setStartupState( EStartupState state ); + static EStartupState getStartupState() { return gStartupState; }; static void multimediaInit(); // Initialize LLViewerMedia multimedia engine. @@ -105,8 +105,9 @@ public: // *HACK: On startup, if we were passed a secondlife://app/do/foo // command URL, store it for later processing. -protected: - static S32 gStartupState; // Do not set directly, use LLStartup::setStartupState +private: + static std::string startupStateToString(EStartupState state); + static EStartupState gStartupState; // Do not set directly, use LLStartup::setStartupState }; diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp index 0f092b31c4..bff23590d3 100644 --- a/indra/newview/llstylemap.cpp +++ b/indra/newview/llstylemap.cpp @@ -73,3 +73,13 @@ const LLStyleSP &LLStyleMap::lookup(const LLUUID &source) } return (*this)[source]; } + +void LLStyleMap::update() +{ + for (style_map_t::iterator iter = begin(); iter != end(); ++iter) + { + LLStyleSP &style = iter->second; + // Update the link color in case it has been changed. + style->setColor(gSavedSettings.getColor4("HTMLLinkColor")); + } +} diff --git a/indra/newview/llstylemap.h b/indra/newview/llstylemap.h index 4cff69fc73..fbf12a04a3 100644 --- a/indra/newview/llstylemap.h +++ b/indra/newview/llstylemap.h @@ -49,6 +49,9 @@ public: // Just like the [] accessor but it will add the entry in if it doesn't exist. const LLStyleSP &lookup(const LLUUID &source); static LLStyleMap &instance(); + + // Forces refresh of the entries, call when something changes (e.g. link color). + void update(); }; #endif // LL_LLSTYLE_MAP_H diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 43f8391b55..d83a2ec944 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -459,14 +459,15 @@ void LLGLTexMemBar::draw() //---------------------------------------------------------------------------- - text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d", + text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d mRaw:%d mAux:%d CB:%d", gImageList.getNumImages(), LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(), LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount, LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(), LLLFSThread::sLocal->getPending(), LLImageWorker::sCount, LLImageWorker::getWorkerThread()->getNumDeletes(), - LLImageRaw::sRawImageCount); + LLImageRaw::sRawImageCount, LLViewerImage::sRawCount, LLViewerImage::sAuxCount, + gImageList.mCallbackList.size()); LLFontGL::sMonospace->renderUTF8(text, 0, 0, line_height*2, text_color, LLFontGL::LEFT, LLFontGL::TOP); diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp index 22690b550a..11e90e9c84 100644 --- a/indra/newview/lltool.cpp +++ b/indra/newview/lltool.cpp @@ -135,12 +135,12 @@ void LLTool::setMouseCapture( BOOL b ) { if( b ) { - gViewerWindow->setMouseCapture(mComposite ? mComposite : this ); + gFocusMgr.setMouseCapture(mComposite ? mComposite : this ); } else if( hasMouseCapture() ) { - gViewerWindow->setMouseCapture( NULL ); + gFocusMgr.setMouseCapture( NULL ); } } diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h index 3cc7f24712..0113fe808c 100644 --- a/indra/newview/lltool.h +++ b/indra/newview/lltool.h @@ -62,6 +62,9 @@ public: virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask); virtual BOOL handleToolTip(S32 x, S32 y, std::string& msg, LLRect* sticky_rect_screen); + + virtual EShowToolTip getShowToolTip() { return SHOW_ALWAYS; }; // tools should permit tips even when the mouse is down, as that's pretty normal for tools + // Return FALSE to allow context menu to be shown. virtual void screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* local_y) const { *local_x = screen_x; *local_y = screen_y; } diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 109a11755b..fd6d3e77a4 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -42,6 +42,7 @@ #include "llfirstuse.h" #include "llfloater.h" #include "llfloatertools.h" +#include "llfocusmgr.h" #include "llgesturemgr.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" @@ -52,6 +53,7 @@ #include "llpreviewnotecard.h" #include "llselectmgr.h" #include "lltoolmgr.h" +#include "lltrans.h" #include "llui.h" #include "llviewerimagelist.h" #include "llviewerinventory.h" @@ -70,10 +72,6 @@ // or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a // bit from there to give some pad. const S32 MAX_ITEMS = 42; -const char* FOLDER_INCLUDES_ATTACHMENTS_BEING_WORN = - "Cannot give folders that contain objects that are attached to you.\n" - "Detach the object(s) and then try again."; - // syntactic sugar #define callMemberFunction(object,ptrToMember) ((object).*(ptrToMember)) @@ -127,41 +125,17 @@ protected: }; bool LLDroppableItem::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) + LLInventoryItem* item) { bool allowed = false; if(item) { - LLVOAvatar* my_avatar = NULL; - switch(item->getType()) - { - case LLAssetType::AT_CALLINGCARD: - // not allowed - break; - - case LLAssetType::AT_OBJECT: - my_avatar = gAgent.getAvatarObject(); - if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID())) - { - allowed = true; - } - break; - - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_CLOTHING: - if(!gAgent.isWearingItem(item->getUUID())) - { - allowed = true; - } - break; + allowed = itemTransferCommonlyAllowed(item); - default: - allowed = true; - break; - } - if(mIsTransfer + if(allowed + && mIsTransfer && !item->getPermissions().allowOperationBy(PERM_TRANSFER, - gAgent.getID())) + gAgent.getID())) { allowed = false; } @@ -182,45 +156,18 @@ public: }; bool LLUncopyableItems::operator()(LLInventoryCategory* cat, - LLInventoryItem* item) + LLInventoryItem* item) { - BOOL uncopyable = FALSE; + bool uncopyable = false; if(item) { - BOOL allowed = FALSE; - LLVOAvatar* my_avatar = NULL; - switch(item->getType()) - { - case LLAssetType::AT_CALLINGCARD: - // not allowed - break; - - case LLAssetType::AT_OBJECT: - my_avatar = gAgent.getAvatarObject(); - if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID())) - { - allowed = TRUE; - } - break; - - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_CLOTHING: - if(!gAgent.isWearingItem(item->getUUID())) - { - allowed = TRUE; - } - break; - - default: - allowed = TRUE; - break; - } - if(allowed && !item->getPermissions().allowCopyBy(gAgent.getID())) + if (itemTransferCommonlyAllowed(item) && + !item->getPermissions().allowCopyBy(gAgent.getID())) { - uncopyable = TRUE; + uncopyable = true; } } - return (uncopyable ? true : false); + return uncopyable; } class LLDropCopyableItems : public LLInventoryCollectFunctor @@ -233,45 +180,21 @@ public: bool LLDropCopyableItems::operator()( - LLInventoryCategory* cat, LLInventoryItem* item) + LLInventoryCategory* cat, + LLInventoryItem* item) { - BOOL allowed = FALSE; + bool allowed = false; if(item) { - LLVOAvatar* my_avatar = NULL; - switch(item->getType()) - { - case LLAssetType::AT_CALLINGCARD: - // not allowed - break; - - case LLAssetType::AT_OBJECT: - my_avatar = gAgent.getAvatarObject(); - if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID())) - { - allowed = TRUE; - } - break; - - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_CLOTHING: - if(!gAgent.isWearingItem(item->getUUID())) - { - allowed = TRUE; - } - break; - - default: - allowed = TRUE; - break; - } - if(allowed && !item->getPermissions().allowCopyBy(gAgent.getID())) + allowed = itemTransferCommonlyAllowed(item); + if(allowed && + !item->getPermissions().allowCopyBy(gAgent.getID())) { // whoops, can't copy it - don't allow it. - allowed = FALSE; + allowed = false; } } - return (allowed ? true : false); + return allowed; } class LLGiveable : public LLInventoryCollectFunctor @@ -289,48 +212,26 @@ protected: bool LLGiveable::operator()(LLInventoryCategory* cat, LLInventoryItem* item) { // All categories can be given. - if(cat) return TRUE; - BOOL allowed = FALSE; + if (cat) + return true; + + bool allowed = false; if(item) { - LLVOAvatar* my_avatar = NULL; - switch(item->getType()) - { - case LLAssetType::AT_CALLINGCARD: - // not allowed - break; - - case LLAssetType::AT_OBJECT: - my_avatar = gAgent.getAvatarObject(); - if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID())) - { - allowed = TRUE; - } - break; - - case LLAssetType::AT_BODYPART: - case LLAssetType::AT_CLOTHING: - if(!gAgent.isWearingItem(item->getUUID())) - { - allowed = TRUE; - } - break; - - default: - allowed = TRUE; - break; - } - if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, - gAgent.getID())) + allowed = itemTransferCommonlyAllowed(item); + if(allowed && + !item->getPermissions().allowOperationBy(PERM_TRANSFER, + gAgent.getID())) { allowed = FALSE; } - if(allowed && !item->getPermissions().allowCopyBy(gAgent.getID())) + if(allowed && + !item->getPermissions().allowCopyBy(gAgent.getID())) { ++mCountLosing; } } - return (allowed ? true : false); + return allowed; } class LLCategoryFireAndForget : public LLInventoryFetchComboObserver @@ -687,7 +588,7 @@ void LLToolDragAndDrop::beginMultiDrag( mCursor = UI_CURSOR_NO; if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY)) { - // find cats in the cargo. + // find categories (i.e. inventory folders) in the cargo. LLInventoryCategory* cat = NULL; S32 count = llmin(cargo_ids.size(), types.size()); std::set<LLUUID> cat_ids; @@ -736,7 +637,7 @@ void LLToolDragAndDrop::endDrag() void LLToolDragAndDrop::onMouseCaptureLost() { - // Called whenever the drag ends or if mouse captue is simply lost + // Called whenever the drag ends or if mouse capture is simply lost LLToolMgr::getInstance()->clearTransientTool(); mCargoTypes.clear(); mCargoIDs.clear(); @@ -756,11 +657,8 @@ BOOL LLToolDragAndDrop::handleMouseUp( S32 x, S32 y, MASK mask ) return TRUE; } -BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask ) +ECursorType LLToolDragAndDrop::acceptanceToCursor( EAcceptance acceptance ) { - EAcceptance acceptance = ACCEPT_NO; - dragOrDrop( x, y, mask, FALSE, &acceptance ); - switch( acceptance ) { case ACCEPT_YES_MULTI: @@ -773,8 +671,16 @@ BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask ) mCursor = UI_CURSOR_ARROWDRAG; } break; - case ACCEPT_YES_SINGLE: - mCursor = UI_CURSOR_ARROWDRAG; + case ACCEPT_YES_SINGLE: + if (mCargoIDs.size() > 1) + { + mToolTipMsg = LLTrans::getString("TooltipMustSingleDrop"); + mCursor = UI_CURSOR_NO; + } + else + { + mCursor = UI_CURSOR_ARROWDRAG; + } break; case ACCEPT_NO_LOCKED: @@ -796,7 +702,15 @@ BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask ) } break; case ACCEPT_YES_COPY_SINGLE: - mCursor = UI_CURSOR_ARROWCOPY; + if (mCargoIDs.size() > 1) + { + mToolTipMsg = LLTrans::getString("TooltipMustSingleDrop"); + mCursor = UI_CURSOR_NO; + } + else + { + mCursor = UI_CURSOR_ARROWCOPY; + } break; case ACCEPT_POSTPONED: break; @@ -804,7 +718,17 @@ BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask ) llassert( FALSE ); } - gViewerWindow->getWindow()->setCursor( mCursor ); + return mCursor; +} + +BOOL LLToolDragAndDrop::handleHover( S32 x, S32 y, MASK mask ) +{ + EAcceptance acceptance = ACCEPT_NO; + dragOrDrop( x, y, mask, FALSE, &acceptance ); + + ECursorType cursor = acceptanceToCursor(acceptance); + gViewerWindow->getWindow()->setCursor( cursor ); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolDragAndDrop" << llendl; return TRUE; } @@ -826,7 +750,7 @@ BOOL LLToolDragAndDrop::handleToolTip(S32 x, S32 y, std::string& msg, LLRect *st if (!mToolTipMsg.empty()) { msg = mToolTipMsg; - //*stick_rect_screen = gViewerWindow->getWindowRect(); + //*sticky_rect_screen = gViewerWindow->getWindowRect(); return TRUE; } return FALSE; @@ -845,11 +769,11 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop, BOOL handled = FALSE; - LLView* top_view = gViewerWindow->getTopCtrl(); + LLView* top_view = gFocusMgr.getTopCtrl(); LLViewerInventoryItem* item; LLViewerInventoryCategory* cat; - mToolTipMsg.assign(""); + mToolTipMsg.clear(); if(top_view) { @@ -884,17 +808,15 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop, // all objects passed, go ahead and perform drop if necessary if (handled && drop && (U32)*acceptance >= ACCEPT_YES_COPY_SINGLE) { - // drop all items - if ((U32)*acceptance >= ACCEPT_YES_COPY_MULTI) - { - mCurItemIndex = 0; - } - // drop just last item - else + if ((U32)*acceptance < ACCEPT_YES_COPY_MULTI && + mCargoIDs.size() > 1) { - mCurItemIndex = mCargoIDs.size() - 1; + // tried to give multi-cargo to a single-acceptor - refuse and return. + *acceptance = ACCEPT_NO; + return; } - for (; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++) + + for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++) { LLInventoryObject* cargo = locateInventory(item, cat); @@ -943,30 +865,26 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop, // all objects passed, go ahead and perform drop if necessary if (handled && drop && (U32)*acceptance > ACCEPT_NO_LOCKED) { - // drop all items - if ((U32)*acceptance >= ACCEPT_YES_COPY_MULTI) + if ((U32)*acceptance < ACCEPT_YES_COPY_MULTI && + mCargoIDs.size() > 1) { - mCurItemIndex = 0; - } - // drop just last item - else - { - mCurItemIndex = mCargoIDs.size() - 1; + // tried to give multi-cargo to a single-acceptor - refuse and return. + *acceptance = ACCEPT_NO; + return; } - for (; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++) + + for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++) { LLInventoryObject* cargo = locateInventory(item, cat); if (cargo) { - //S32 local_x, local_y; - EAcceptance item_acceptance; handled = handled && root_view->handleDragAndDrop(x, y, mask, TRUE, - mCargoTypes[mCurItemIndex], - (void*)cargo, - &item_acceptance, - mToolTipMsg); + mCargoTypes[mCurItemIndex], + (void*)cargo, + &item_acceptance, + mToolTipMsg); } } } @@ -1081,76 +999,36 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info) (hit_obj, hit_face, pick_info.mKeyMask, FALSE)); } - if (LLToolDragAndDrop::getInstance()->mDrop && (U32)LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_SINGLE) + if (LLToolDragAndDrop::getInstance()->mDrop && + (U32)LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_SINGLE) { - // if target allows multi-drop, go ahead and start iteration at beginning of cargo list - if (LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_MULTI) + // if target allows multi-drop or there is only one item being dropped, go ahead + if (LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_MULTI || + LLToolDragAndDrop::getInstance()->mCargoIDs.size() == 1) { - LLToolDragAndDrop::getInstance()->mCurItemIndex = 0; + // Target accepts multi, or cargo is a single-drop + for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0; + LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size(); + LLToolDragAndDrop::getInstance()->mCurItemIndex++) + { + // Call the right implementation function + (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()), + LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target]) + (hit_obj, hit_face, pick_info.mKeyMask, TRUE); + } } - // otherwise start at end, to follow selection rules (last selected item is most current) else { - LLToolDragAndDrop::getInstance()->mCurItemIndex = LLToolDragAndDrop::getInstance()->mCargoIDs.size() - 1; - } - - for (; LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size(); - LLToolDragAndDrop::getInstance()->mCurItemIndex++) - { - // Call the right implementation function - (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()), - LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target]) - (hit_obj, hit_face, pick_info.mKeyMask, TRUE); + // Target does not accept multi, but cargo is multi + LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO; } } - switch( LLToolDragAndDrop::getInstance()->mLastAccept ) - { - case ACCEPT_YES_MULTI: - if (LLToolDragAndDrop::getInstance()->mCargoIDs.size() > 1) - { - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWDRAGMULTI; - } - else - { - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWDRAG; - } - break; - case ACCEPT_YES_SINGLE: - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWDRAG; - break; - - case ACCEPT_NO_LOCKED: - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NOLOCKED; - break; - - case ACCEPT_NO: - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO; - break; - - case ACCEPT_YES_COPY_MULTI: - if (LLToolDragAndDrop::getInstance()->mCargoIDs.size() > 1) - { - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWCOPYMULTI; - } - else - { - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWCOPY; - } - break; - case ACCEPT_YES_COPY_SINGLE: - LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_ARROWCOPY; - break; - case ACCEPT_POSTPONED: - break; - default: - llassert( FALSE ); - } + ECursorType cursor = LLToolDragAndDrop::getInstance()->acceptanceToCursor( LLToolDragAndDrop::getInstance()->mLastAccept ); + gViewerWindow->getWindow()->setCursor( cursor ); LLToolDragAndDrop::getInstance()->mLastHitPos = pick_info.mPosGlobal; LLToolDragAndDrop::getInstance()->mLastCameraPos = gAgent.getCameraPositionGlobal(); - - gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor ); } // static @@ -1229,7 +1107,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj, else if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID())) { - // Check that we can add the testure as inventory to the object + // Check that we can add the texture as inventory to the object if (willObjectAcceptInventory(hit_obj,item) < ACCEPT_YES_COPY_SINGLE ) { return FALSE; @@ -1605,7 +1483,7 @@ struct LLGiveInventoryInfo }; void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent, - LLInventoryItem* item) + LLInventoryItem* item) { llinfos << "LLToolDragAndDrop::giveInventory()" << llendl; if(!isInventoryGiveAcceptable(item)) @@ -1621,11 +1499,11 @@ void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent, { // ask if the agent is sure. LLGiveInventoryInfo* info = new LLGiveInventoryInfo(to_agent, - item->getUUID()); + item->getUUID()); gViewerWindow->alertXml("CannotCopyWarning", - &LLToolDragAndDrop::handleCopyProtectedItem, - (void*)info); + &LLToolDragAndDrop::handleCopyProtectedItem, + (void*)info); } } @@ -1920,11 +1798,13 @@ BOOL LLToolDragAndDrop::isInventoryGiveAcceptable(LLInventoryItem* item) } BOOL copyable = FALSE; if(item->getPermissions().allowCopyBy(gAgent.getID())) copyable = TRUE; + LLVOAvatar* my_avatar = gAgent.getAvatarObject(); if(!my_avatar) { return FALSE; } + BOOL acceptable = TRUE; switch(item->getType()) { diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index 8e2788a173..f9e1d75754 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -178,6 +178,9 @@ protected: EAcceptance dad3dActivateGesture(LLViewerObject *obj, S32 face, MASK mask, BOOL drop); + // set the LLToolDragAndDrop's cursor based on the given acceptance + ECursorType acceptanceToCursor( EAcceptance acceptance ); + // This method converts mCargoID to an inventory item or // folder. If no item or category is found, both pointers will be // returned NULL. @@ -189,9 +192,9 @@ protected: // LLViewerInventoryItem::item_array_t& items); void dropObject(LLViewerObject* raycast_target, - BOOL bypass_sim_raycast, - BOOL from_task_inventory, - BOOL remove_from_inventory); + BOOL bypass_sim_raycast, + BOOL from_task_inventory, + BOOL remove_from_inventory); // accessor that looks at permissions, copyability, and names of // inventory items to determine if a drop would be ok. @@ -200,9 +203,9 @@ protected: // deal with permissions of object, etc. returns TRUE if drop can // proceed, otherwise FALSE. static BOOL handleDropTextureProtections(LLViewerObject* hit_obj, - LLInventoryItem* item, - LLToolDragAndDrop::ESource source, - const LLUUID& src_id); + LLInventoryItem* item, + LLToolDragAndDrop::ESource source, + const LLUUID& src_id); // give inventory item functionality @@ -213,7 +216,7 @@ protected: // give inventory category functionality static void handleCopyProtectedCategory(S32 option, void* data); static void commitGiveInventoryCategory(const LLUUID& to_agent, - LLInventoryCategory* cat); + LLInventoryCategory* cat); public: // helper functions static BOOL isInventoryDropAcceptable(LLViewerObject* obj, LLInventoryItem* item) { return (ACCEPT_YES_COPY_SINGLE <= willObjectAcceptInventory(obj, item)); } diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp index e74cd58924..50c6de704a 100644 --- a/indra/newview/lltoolselect.cpp +++ b/indra/newview/lltoolselect.cpp @@ -199,9 +199,12 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi select_node->setTransient(TRUE); } - for (S32 i = 0; i < (S32)root_object->mChildList.size(); i++) + LLViewerObject::const_child_list_t& child_list = root_object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - select_node = selection->findNode(root_object->mChildList[i]); + LLViewerObject* child = *iter; + select_node = selection->findNode(child); if (select_node) { select_node->setTransient(TRUE); diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp index e347affa52..79225f82b0 100644 --- a/indra/newview/lluploaddialog.cpp +++ b/indra/newview/lluploaddialog.cpp @@ -85,7 +85,7 @@ LLUploadDialog::LLUploadDialog( const std::string& msg) setMessage(msg); // The dialog view is a root view - gViewerWindow->setTopCtrl( this ); + gFocusMgr.setTopCtrl( this ); } void LLUploadDialog::setMessage( const std::string& msg) diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 6b324cae9d..a62bf9b9cf 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -141,6 +141,12 @@ static bool handleAvatarLODChanged(const LLSD& newvalue) return true; } +static bool handleAvatarMaxVisibleChanged(const LLSD& newvalue) +{ + LLVOAvatar::sMaxVisible = (U32) newvalue.asInteger(); + return true; +} + static bool handleTerrainLODChanged(const LLSD& newvalue) { LLVOSurfacePatch::sLODFactor = (F32)newvalue.asReal(); @@ -454,6 +460,7 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderAvatarCloth")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _1)); + gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _1)); gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _1)); gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _1)); gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _1)); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 0e83ba1123..99abfb02ee 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -106,7 +106,7 @@ LLFrameTimer gRecentMemoryTime; // Rendering stuff void pre_show_depth_buffer(); void post_show_depth_buffer(); -void render_ui_and_swap(); +void render_ui(); void render_hud_attachments(); void render_ui_3d(); void render_ui_2d(); @@ -456,7 +456,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) if (gDisconnected) { LLAppViewer::instance()->pingMainloopTimeout("Display:Disconnected"); - render_ui_and_swap(); + render_ui(); render_disconnected_background(); } @@ -760,7 +760,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) if (!for_snapshot) { - render_ui_and_swap(); + render_ui(); } LLSpatialGroup::sNoDelete = FALSE; @@ -931,7 +931,7 @@ BOOL setup_hud_matrices(const LLRect& screen_region) } -void render_ui_and_swap() +void render_ui() { LLGLState::checkStates(); diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp index 0a2e328015..d66d0da5b1 100644 --- a/indra/newview/llviewerjointattachment.cpp +++ b/indra/newview/llviewerjointattachment.cpp @@ -129,8 +129,9 @@ void LLViewerJointAttachment::setupDrawable(LLDrawable* drawablep) } } - for (LLViewerObject::child_list_t::iterator iter = mAttachedObject->mChildList.begin(); - iter != mAttachedObject->mChildList.end(); ++iter) + LLViewerObject::const_child_list_t& child_list = mAttachedObject->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { LLViewerObject* childp = *iter; if (childp && childp->mDrawable.notNull()) @@ -208,8 +209,9 @@ BOOL LLViewerJointAttachment::addObject(LLViewerObject* object) { object->mText->setOnHUDAttachment(TRUE); } - for (LLViewerObject::child_list_t::iterator iter = object->mChildList.begin(); - iter != object->mChildList.end(); ++iter) + LLViewerObject::const_child_list_t& child_list = object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { LLViewerObject* childp = *iter; if (childp && childp->mText.notNull()) @@ -258,8 +260,9 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object) } } - for (LLViewerObject::child_list_t::iterator iter = object->mChildList.begin(); - iter != object->mChildList.end(); ++iter) + LLViewerObject::const_child_list_t& child_list = object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { LLViewerObject* childp = *iter; if (childp && childp->mDrawable.notNull()) @@ -282,8 +285,9 @@ void LLViewerJointAttachment::removeObject(LLViewerObject *object) { object->mText->setOnHUDAttachment(FALSE); } - for (LLViewerObject::child_list_t::iterator iter = object->mChildList.begin(); - iter != object->mChildList.end(); ++iter) + LLViewerObject::const_child_list_t& child_list = object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { LLViewerObject* childp = *iter; if (childp->mText.notNull()) @@ -351,8 +355,9 @@ void LLViewerJointAttachment::clampObjectPosition() void LLViewerJointAttachment::calcLOD() { F32 maxarea = mAttachedObject->getMaxScale() * mAttachedObject->getMidScale(); - for (LLViewerObject::child_list_t::iterator iter = mAttachedObject->mChildList.begin(); - iter != mAttachedObject->mChildList.end(); ++iter) + LLViewerObject::const_child_list_t& child_list = mAttachedObject->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { LLViewerObject* childp = *iter; F32 area = childp->getMaxScale() * childp->getMidScale(); diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp index 1717153810..96e6da76b6 100644 --- a/indra/newview/llviewerjoystick.cpp +++ b/indra/newview/llviewerjoystick.cpp @@ -99,6 +99,11 @@ void LLViewerJoystick::setOverrideCamera(bool val) { mOverrideCamera = val; } + + if (mOverrideCamera) + { + gAgent.changeCameraToDefault(); + } } // ----------------------------------------------------------------------------- @@ -793,14 +798,6 @@ void LLViewerJoystick::moveFlycam(bool reset) { cur_delta[i] = -getJoystickAxis(axis[i]); - // we need smaller camera movements in build mode - if (in_build_mode) - { - if (i == X_I || i == Y_I || i == Z_I) - { - cur_delta[i] /= BUILDMODE_FLYCAM_T_SCALE; - } - } F32 tmp = cur_delta[i]; if (absolute) @@ -817,6 +814,18 @@ void LLViewerJoystick::moveFlycam(bool reset) { cur_delta[i] = llmin(cur_delta[i]+dead_zone[i], 0.f); } + + // we need smaller camera movements in build mode + // NOTE: this needs to remain after the deadzone calculation, otherwise + // we have issues with flycam "jumping" when the build dialog is opened/closed -Nyx + if (in_build_mode) + { + if (i == X_I || i == Y_I || i == Z_I) + { + cur_delta[i] /= BUILDMODE_FLYCAM_T_SCALE; + } + } + cur_delta[i] *= axis_scale[i]; if (!absolute) @@ -875,10 +884,16 @@ bool LLViewerJoystick::toggleFlycam() { return false; } + if (!mOverrideCamera) + { + gAgent.changeCameraToDefault(); + } + mOverrideCamera = !mOverrideCamera; if (mOverrideCamera) { moveFlycam(true); + } else if (!LLToolMgr::getInstance()->inBuildMode()) { diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 3f57b26fec..f5d822f2e3 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -536,7 +536,7 @@ void LLViewerMedia::buildMediaManagerData( LLMediaManagerData* init_data ) init_data->setBrowserComponentDir( component_dir ); std::string profile_name("Second Life"); init_data->setBrowserProfileName( profile_name ); - init_data->setBrowserParentWindow( gViewerWindow->getPlatformWindow() ); + init_data->setBrowserParentWindow( gViewerWindow->getMediaWindow() ); // We use a custom user agent with viewer version and skin name. LLViewerMediaImpl::updateBrowserUserAgent(); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 771a71c5c5..5d2b8e43ba 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -128,6 +128,7 @@ #include "llfloaterwater.h" #include "llfloaterwindlight.h" #include "llfloaterworldmap.h" +#include "llfloatermemleak.h" #include "llframestats.h" #include "llframestatview.h" #include "llfasttimerview.h" @@ -493,6 +494,8 @@ BOOL enable_not_thirdperson(void*); BOOL enable_have_card(void*); BOOL enable_detach(void*); BOOL enable_region_owner(void*); +void menu_toggle_attached_lights(void* user_data); +void menu_toggle_attached_particles(void* user_data); class LLLandmarkObserver : public LLInventoryObserver { @@ -1434,6 +1437,23 @@ void init_debug_rendering_menu(LLMenuGL* menu) item = new LLMenuItemCheckGL("Cheesy Beacon", menu_toggle_control, NULL, menu_check_control, (void*)"CheesyBeacon"); menu->append(item); + + item = new LLMenuItemCheckGL("Attached Lights", menu_toggle_attached_lights, NULL, menu_check_control, (void*)"RenderAttachedLights"); + menu->append(item); + + item = new LLMenuItemCheckGL("Attached Particles", menu_toggle_attached_particles, NULL, menu_check_control, (void*)"RenderAttachedParticles"); + menu->append(item); + +#ifndef LL_RELEASE_FOR_DOWNLOAD + menu->appendSeparator(); + menu->append(new LLMenuItemCallGL("Memory Leaking Simulation", LLFloaterMemLeak::show, NULL, NULL)); +#else + if(gSavedSettings.getBOOL("QAMode")) + { + menu->appendSeparator(); + menu->append(new LLMenuItemCallGL("Memory Leaking Simulation", LLFloaterMemLeak::show, NULL, NULL)); + } +#endif menu->createJumpKeys(); } @@ -1771,35 +1791,62 @@ class LLViewCheckBuildMode : public view_listener_t bool toggle_build_mode() { - if (LLToolMgr::getInstance()->inEdit()) + if (LLToolMgr::getInstance()->inBuildMode()) { - // just reset the view, will pull us out of edit mode - handle_reset_view(); - + if (gSavedSettings.getBOOL("EditCameraMovement")) + { + // just reset the view, will pull us out of edit mode + handle_reset_view(); + } + else + { + // manually disable edit mode, but do not affect the camera + gAgent.resetView(false); + gFloaterTools->close(); + gViewerWindow->showCursor(); + } // avoid spurious avatar movements pulling out of edit mode LLViewerJoystick::getInstance()->moveAvatar(true); } else { - if (LLViewerJoystick::getInstance()->getOverrideCamera()) + ECameraMode camMode = gAgent.getCameraMode(); + if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode) { - handle_toggle_flycam(); + // pull the user out of mouselook or appearance mode when entering build mode + handle_reset_view(); } - - if (gAgent.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") ) + + if (gSavedSettings.getBOOL("EditCameraMovement")) { - // zoom in if we're looking at the avatar - gAgent.setFocusOnAvatar(FALSE, ANIMATE); - gAgent.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis())); - gAgent.cameraZoomIn(0.666f); - gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD ); + // camera should be set + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + handle_toggle_flycam(); + } + + if (gAgent.getFocusOnAvatar()) + { + // zoom in if we're looking at the avatar + gAgent.setFocusOnAvatar(FALSE, ANIMATE); + gAgent.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis())); + gAgent.cameraZoomIn(0.666f); + gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD ); + } } + LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompCreate::getInstance() ); // Could be first use LLFirstUse::useBuild(); + + gAgent.resetView(false); + + // avoid spurious avatar movements + LLViewerJoystick::getInstance()->moveAvatar(true); + } return true; } @@ -2880,8 +2927,12 @@ class LLEditEnableCustomizeAvatar : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { - bool new_value = gAgent.getWearablesLoaded(); - gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value); + LLVOAvatar* avatar = gAgent.getAvatarObject(); + + bool enabled = ((avatar && avatar->isFullyLoaded()) && + (gAgent.getWearablesLoaded())); + + gMenuHolder->findControl(userdata["control"].asString())->setValue(enabled); return true; } }; @@ -6000,9 +6051,12 @@ BOOL object_selected_and_point_valid(void *user_data) { LLSelectNode* node = *iter; LLViewerObject* object = node->getObject(); - for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++ ) + LLViewerObject::const_child_list_t& child_list = object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - if (object->mChildList[child_num]->isAvatar()) + LLViewerObject* child = *iter; + if (child->isAvatar()) { return FALSE; } @@ -6383,6 +6437,18 @@ BOOL enable_land_selected( void* ) return !(LLViewerParcelMgr::getInstance()->selectionEmpty()); } +void menu_toggle_attached_lights(void* user_data) +{ + menu_toggle_control(user_data); + LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights"); +} + +void menu_toggle_attached_particles(void* user_data) +{ + menu_toggle_control(user_data); + LLPipeline::sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles"); +} + class LLSomethingSelected : public view_listener_t { bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index d440491661..9146acb750 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2666,7 +2666,7 @@ static void display_release_message(S32, void* data) void process_agent_movement_complete(LLMessageSystem* msg, void**) { - gAgentMovementCompleted = TRUE; + gAgentMovementCompleted = true; LLUUID agent_id; msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 8745a73e79..461a21d51a 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -96,6 +96,7 @@ #include "pipeline.h" #include "llviewernetwork.h" #include "llvowlsky.h" +#include "llmanip.h" //#define DEBUG_UPDATE_TYPE @@ -402,13 +403,10 @@ void LLViewerObject::dump() const mNameValuePairs[key]->printNameValue(buffer); llinfos << buffer << llendl; } - - S32 i; - - LLViewerObject *child; - for (i = 0; i < mChildList.size(); i++) + for (child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - child = mChildList[i]; + LLViewerObject* child = *iter; llinfos << " child " << child->getID() << llendl; } */ @@ -555,20 +553,16 @@ void LLViewerObject::removeChild(LLViewerObject *childp) } } -LLViewerObject::child_list_t& LLViewerObject::getChildren() -{ - return mChildList; -} - void LLViewerObject::addThisAndAllChildren(LLDynamicArray<LLViewerObject*>& objects) { objects.put(this); - S32 count = mChildList.size(); - for(S32 i = 0; i < count; i++) + for (child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - if (!mChildList[i]->isAvatar()) + LLViewerObject* child = *iter; + if (!child->isAvatar()) { - (mChildList[i])->addThisAndAllChildren(objects); + child->addThisAndAllChildren(objects); } } } @@ -581,24 +575,25 @@ void LLViewerObject::addThisAndNonJointChildren(LLDynamicArray<LLViewerObject*>& { return; } - S32 count = mChildList.size(); - for(S32 i = 0; i < count; i++) + for (child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - if ( (!mChildList[i]->isAvatar()) - && (!mChildList[i]->isJointChild())) + LLViewerObject* child = *iter; + if ( (!child->isAvatar()) && (!child->isJointChild())) { - (mChildList[i])->addThisAndNonJointChildren(objects); + child->addThisAndNonJointChildren(objects); } } } BOOL LLViewerObject::isChild(LLViewerObject *childp) const { - S32 count = mChildList.size(); - for(S32 i = 0; i < count; i++) + for (child_list_t::const_iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - const LLViewerObject *testChildp = &(*mChildList[i]); - if (testChildp == childp) return TRUE; + LLViewerObject* testchild = *iter; + if (testchild == childp) + return TRUE; } return FALSE; } @@ -607,11 +602,11 @@ BOOL LLViewerObject::isChild(LLViewerObject *childp) const // returns TRUE if at least one avatar is sitting on this object BOOL LLViewerObject::isSeat() const { - S32 count = mChildList.size(); - for(S32 i = 0; i < count; i++) + for (child_list_t::const_iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - const LLViewerObject *childp = &(*mChildList[i]); - if (childp->isAvatar()) + LLViewerObject* child = *iter; + if (child->isAvatar()) { return TRUE; } @@ -1844,7 +1839,19 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, ||(this_update_precision > mBestUpdatePrecision)))) { mBestUpdatePrecision = this_update_precision; - setPositionParent(new_pos_parent); + + LLVector3 diff = new_pos_parent - test_pos_parent ; + F32 mag_sqr = diff.magVecSquared() ; + if(llfinite(mag_sqr)) + { + setPositionParent(new_pos_parent); + } + else + { + llwarns << "Can not move the object/avatar to an infinite location!" << llendl ; + + retval |= INVALID_UPDATE ; + } if (mParent && ((LLViewerObject*)mParent)->isAvatar()) { @@ -1915,11 +1922,11 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, // Additionally, if any child is selected, need to update the dialogs and selection // center. BOOL needs_refresh = mUserSelected; - LLViewerObject *childp; - for (U32 i = 0; i < mChildList.size(); i++) + for (child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - childp = mChildList[i]; - needs_refresh = needs_refresh || childp->mUserSelected; + LLViewerObject* child = *iter; + needs_refresh = needs_refresh || child->mUserSelected; } if (needs_refresh) @@ -2892,13 +2899,20 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */) getTEImage(i)->setBoostLevel(LLViewerImage::BOOST_SELECTED); } + if (isSculpted()) + { + LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT); + LLUUID sculpt_id = sculpt_params->getSculptTexture(); + gImageList.getImage(sculpt_id)->setBoostLevel(LLViewerImage::BOOST_SELECTED); + } + if (boost_children) { - S32 num_children = mChildList.size(); - for (i = 0; i < num_children; i++) + for (child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - LLViewerObject *childp = mChildList[i]; - childp->boostTexturePriority(); + LLViewerObject* child = *iter; + child->boostTexturePriority(); } } } @@ -3996,9 +4010,11 @@ S32 LLViewerObject::countInventoryContents(LLAssetType::EType type) void LLViewerObject::setCanSelect(BOOL canSelect) { mbCanSelect = canSelect; - for (U32 i = 0; i < mChildList.size(); i++) + for (child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - mChildList[i]->mbCanSelect = canSelect; + LLViewerObject* child = *iter; + child->mbCanSelect = canSelect; } } @@ -4551,9 +4567,11 @@ void LLViewerObject::setDrawableState(U32 state, BOOL recursive) } if (recursive) { - for (U32 i = 0; i < mChildList.size(); i++) + for (child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - mChildList[i]->setDrawableState(state, recursive); + LLViewerObject* child = *iter; + child->setDrawableState(state, recursive); } } } @@ -4566,9 +4584,11 @@ void LLViewerObject::clearDrawableState(U32 state, BOOL recursive) } if (recursive) { - for (U32 i = 0; i < mChildList.size(); i++) + for (child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) { - mChildList[i]->clearDrawableState(state, recursive); + LLViewerObject* child = *iter; + child->clearDrawableState(state, recursive); } } } @@ -4803,7 +4823,7 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp) mLatestRecvPacketID = 0; mRegionp = regionp; - for (child_list_t::iterator i = getChildren().begin(); i != getChildren().end(); ++i) + for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i) { LLViewerObject* child = *i; child->setRegion(regionp); @@ -4937,3 +4957,141 @@ void LLStaticViewerObject::updateDrawable(BOOL force_damped) } clearChanged(SHIFTED); } + +void LLViewerObject::saveUnselectedChildrenPosition(std::vector<LLVector3>& positions) +{ + if(mChildList.empty() || !positions.empty()) + { + return ; + } + + for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) + { + LLViewerObject* childp = *iter; + if (!childp->isSelected() && childp->mDrawable.notNull()) + { + positions.push_back(childp->getPositionEdit()); + } + } + + return ; +} + +void LLViewerObject::saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations) +{ + if(mChildList.empty()) + { + return ; + } + + for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) + { + LLViewerObject* childp = *iter; + if (!childp->isSelected() && childp->mDrawable.notNull()) + { + rotations.push_back(childp->getRotationEdit()); + } + } + + return ; +} + +//counter-rotation +void LLViewerObject::resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, + const std::vector<LLVector3>& positions) +{ + if(mChildList.empty()) + { + return ; + } + + S32 index = 0 ; + LLQuaternion inv_rotation = ~getRotationEdit() ; + LLVector3 offset = getPositionEdit() ; + for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) + { + LLViewerObject* childp = *iter; + if (!childp->isSelected() && childp->mDrawable.notNull()) + { + if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR) + { + childp->setRotation(rotations[index] * inv_rotation); + childp->setPosition((positions[index] - offset) * inv_rotation); + LLManip::rebuild(childp); + } + else //avatar + { + LLVector3 reset_pos = (positions[index] - offset) * inv_rotation ; + LLQuaternion reset_rot = rotations[index] * inv_rotation ; + + ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos); + ((LLVOAvatar*)childp)->mDrawable->mXform.setRotation(reset_rot) ; + + ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos, TRUE); + ((LLVOAvatar*)childp)->mDrawable->getVObj()->setRotation(reset_rot, TRUE) ; + + LLManip::rebuild(childp); + } + index++; + } + } + + return ; +} + +//counter-translation +void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplified) +{ + if(mChildList.empty()) + { + return ; + } + + LLVector3 child_offset; + if(simplified) //translation only, rotation matrix does not change + { + child_offset = offset * ~getRotation(); + } + else //rotation matrix might change too. + { + if (isAttachment() && mDrawable.notNull()) + { + LLXform* attachment_point_xform = mDrawable->getXform()->getParent(); + LLQuaternion parent_rotation = getRotation() * attachment_point_xform->getWorldRotation(); + child_offset = offset * ~parent_rotation; + } + else + { + child_offset = offset * ~getRenderRotation(); + } + } + + for (LLViewerObject::child_list_t::const_iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) + { + LLViewerObject* childp = *iter; + if (!childp->isSelected() && childp->mDrawable.notNull()) + { + if (childp->getPCode() != LL_PCODE_LEGACY_AVATAR) + { + childp->setPosition(childp->getPosition() + child_offset); + LLManip::rebuild(childp); + } + else //avatar + { + LLVector3 reset_pos = ((LLVOAvatar*)childp)->mDrawable->mXform.getPosition() + child_offset ; + + ((LLVOAvatar*)childp)->mDrawable->mXform.setPosition(reset_pos); + ((LLVOAvatar*)childp)->mDrawable->getVObj()->setPosition(reset_pos); + + LLManip::rebuild(childp); + } + } + } + + return ; +} + diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index 1fd4a29238..b6ff60ef9d 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -129,7 +129,8 @@ protected: std::map<U16, ExtraParameter*> mExtraParameterList; public: - typedef std::vector<LLPointer<LLViewerObject> > child_list_t; + typedef std::list<LLPointer<LLViewerObject> > child_list_t; + typedef const child_list_t const_child_list_t; LLViewerObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp); MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT); @@ -153,7 +154,7 @@ public: enum { MEDIA_TYPE_NONE = 0, MEDIA_TYPE_WEB_PAGE = 1 }; // Return codes for processUpdateMessage - enum { MEDIA_URL_REMOVED = 0x1, MEDIA_URL_ADDED = 0x2, MEDIA_URL_UPDATED = 0x4 }; + enum { MEDIA_URL_REMOVED = 0x1, MEDIA_URL_ADDED = 0x2, MEDIA_URL_UPDATED = 0x4, INVALID_UPDATE = 0x80000000 }; virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, void **user_data, @@ -212,7 +213,8 @@ public: U32 getLocalID() const { return mLocalID; } U32 getCRC() const { return mTotalCRC; } - virtual BOOL isFlexible() const { return false; } + virtual BOOL isFlexible() const { return FALSE; } + virtual BOOL isSculpted() const { return FALSE; } // This method returns true if the object is over land owned by // the agent. @@ -234,7 +236,8 @@ public: virtual void setParent(LLViewerObject* parent); virtual void addChild(LLViewerObject *childp); virtual void removeChild(LLViewerObject *childp); - child_list_t& getChildren(); + const_child_list_t& getChildren() const { return mChildList; } + S32 numChildren() const { return mChildList.size(); } void addThisAndAllChildren(LLDynamicArray<LLViewerObject*>& objects); void addThisAndNonJointChildren(LLDynamicArray<LLViewerObject*>& objects); BOOL isChild(LLViewerObject *childp) const; @@ -472,6 +475,16 @@ public: friend class LLViewerObjectList; friend class LLViewerMediaList; +public: + //counter-translation + void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ; + //counter-rotation + void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, + const std::vector<LLVector3>& positions) ; + void saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations) ; + void saveUnselectedChildrenPosition(std::vector<LLVector3>& positions) ; + std::vector<LLVector3> mUnselectedChildrenPositions ; + private: ExtraParameter* createNewParameterEntry(U16 param_type); ExtraParameter* getExtraParameterEntry(U16 param_type) const; @@ -496,7 +509,6 @@ public: LL_VO_WL_SKY = LL_PCODE_APP | 0xb0, // should this be moved to 0x40? } EVOType; - child_list_t mChildList; LLUUID mID; // unique within region, not unique across regions @@ -575,6 +587,8 @@ protected: typedef std::map<char *, LLNameValue *> name_value_map_t; name_value_map_t mNameValuePairs; // Any name-value pairs stored by script + child_list_t mChildList; + F64 mLastInterpUpdateSecs; // Last update for purposes of interpolation F64 mLastMessageUpdateSecs; // Last update from a message from the simulator TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index a37120451e..6d0137663c 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1163,9 +1163,11 @@ void LLViewerObjectList::generatePickList(LLCamera &camera) if (objectp) { mSelectPickList.insert(objectp); - for (U32 i = 0; i < objectp->mChildList.size(); i++) + LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLViewerObject* childp = objectp->mChildList[i]; + LLViewerObject* childp = *iter; if (childp) { mSelectPickList.insert(childp); diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp index ccf7a5d1d7..779ef0a3c6 100644 --- a/indra/newview/llviewerpartsim.cpp +++ b/indra/newview/llviewerpartsim.cpp @@ -44,6 +44,7 @@ #include "llworld.h" #include "pipeline.h" #include "llspatialpartition.h" +#include "llvovolume.h" const F32 PART_SIM_BOX_SIDE = 16.f; const F32 PART_SIM_BOX_OFFSET = 0.5f*PART_SIM_BOX_SIDE; @@ -169,6 +170,10 @@ LLViewerPartGroup::~LLViewerPartGroup() cleanup(); S32 count = (S32) mParticles.size(); + for(S32 i = 0 ; i < count ; i++) + { + delete mParticles[i] ; + } mParticles.clear(); LLViewerPartSim::decPartCount(count); @@ -240,151 +245,150 @@ BOOL LLViewerPartGroup::addPart(LLViewerPart* part, F32 desired_size) void LLViewerPartGroup::updateParticles(const F32 lastdt) { LLMemType mt(LLMemType::MTYPE_PARTICLES); - S32 i; F32 dt; LLVector3 gravity(0.f, 0.f, GRAVITY); LLViewerRegion *regionp = getRegion(); S32 end = (S32) mParticles.size(); - for (i = 0; i < end; i++) + for (S32 i = 0 ; i < (S32)mParticles.size();) { LLVector3 a(0.f, 0.f, 0.f); - LLViewerPart& part = *((LLViewerPart*) mParticles[i]); + LLViewerPart* part = mParticles[i] ; - dt=lastdt+mSkippedTime-part.mSkipOffset; - part.mSkipOffset=0.f; + dt = lastdt + mSkippedTime - part->mSkipOffset; + part->mSkipOffset = 0.f; // Update current time - const F32 cur_time = part.mLastUpdateTime + dt; - const F32 frac = cur_time/part.mMaxAge; + const F32 cur_time = part->mLastUpdateTime + dt; + const F32 frac = cur_time / part->mMaxAge; // "Drift" the object based on the source object - if (part.mFlags & LLPartData::LL_PART_FOLLOW_SRC_MASK) + if (part->mFlags & LLPartData::LL_PART_FOLLOW_SRC_MASK) { - part.mPosAgent = part.mPartSourcep->mPosAgent; - part.mPosAgent += part.mPosOffset; + part->mPosAgent = part->mPartSourcep->mPosAgent; + part->mPosAgent += part->mPosOffset; } // Do a custom callback if we have one... - if (part.mVPCallback) + if (part->mVPCallback) { - (*part.mVPCallback)(part, dt); + (*part->mVPCallback)(*part, dt); } - if (part.mFlags & LLPartData::LL_PART_WIND_MASK) + if (part->mFlags & LLPartData::LL_PART_WIND_MASK) { - LLVector3 tempVel(part.mVelocity); - part.mVelocity *= 1.f - 0.1f*dt; - part.mVelocity += 0.1f*dt*regionp->mWind.getVelocity(regionp->getPosRegionFromAgent(part.mPosAgent)); + LLVector3 tempVel(part->mVelocity); + part->mVelocity *= 1.f - 0.1f*dt; + part->mVelocity += 0.1f*dt*regionp->mWind.getVelocity(regionp->getPosRegionFromAgent(part->mPosAgent)); } // Now do interpolation towards a target - if (part.mFlags & LLPartData::LL_PART_TARGET_POS_MASK) + if (part->mFlags & LLPartData::LL_PART_TARGET_POS_MASK) { - F32 remaining = part.mMaxAge - part.mLastUpdateTime; + F32 remaining = part->mMaxAge - part->mLastUpdateTime; F32 step = dt / remaining; step = llclamp(step, 0.f, 0.1f); step *= 5.f; // we want a velocity that will result in reaching the target in the // Interpolate towards the target. - LLVector3 delta_pos = part.mPartSourcep->mTargetPosAgent - part.mPosAgent; + LLVector3 delta_pos = part->mPartSourcep->mTargetPosAgent - part->mPosAgent; delta_pos /= remaining; - part.mVelocity *= (1.f - step); - part.mVelocity += step*delta_pos; + part->mVelocity *= (1.f - step); + part->mVelocity += step*delta_pos; } - if (part.mFlags & LLPartData::LL_PART_TARGET_LINEAR_MASK) + if (part->mFlags & LLPartData::LL_PART_TARGET_LINEAR_MASK) { - LLVector3 delta_pos = part.mPartSourcep->mTargetPosAgent - part.mPartSourcep->mPosAgent; - part.mPosAgent = part.mPartSourcep->mPosAgent; - part.mPosAgent += frac*delta_pos; - part.mVelocity = delta_pos; + LLVector3 delta_pos = part->mPartSourcep->mTargetPosAgent - part->mPartSourcep->mPosAgent; + part->mPosAgent = part->mPartSourcep->mPosAgent; + part->mPosAgent += frac*delta_pos; + part->mVelocity = delta_pos; } else { // Do velocity interpolation - part.mPosAgent += dt*part.mVelocity; - part.mPosAgent += 0.5f*dt*dt*part.mAccel; - part.mVelocity += part.mAccel*dt; + part->mPosAgent += dt*part->mVelocity; + part->mPosAgent += 0.5f*dt*dt*part->mAccel; + part->mVelocity += part->mAccel*dt; } // Do a bounce test - if (part.mFlags & LLPartData::LL_PART_BOUNCE_MASK) + if (part->mFlags & LLPartData::LL_PART_BOUNCE_MASK) { // Need to do point vs. plane check... // For now, just check relative to object height... - F32 dz = part.mPosAgent.mV[VZ] - part.mPartSourcep->mPosAgent.mV[VZ]; + F32 dz = part->mPosAgent.mV[VZ] - part->mPartSourcep->mPosAgent.mV[VZ]; if (dz < 0) { - part.mPosAgent.mV[VZ] += -2.f*dz; - part.mVelocity.mV[VZ] *= -0.75f; + part->mPosAgent.mV[VZ] += -2.f*dz; + part->mVelocity.mV[VZ] *= -0.75f; } } // Reset the offset from the source position - if (part.mFlags & LLPartData::LL_PART_FOLLOW_SRC_MASK) + if (part->mFlags & LLPartData::LL_PART_FOLLOW_SRC_MASK) { - part.mPosOffset = part.mPosAgent; - part.mPosOffset -= part.mPartSourcep->mPosAgent; + part->mPosOffset = part->mPosAgent; + part->mPosOffset -= part->mPartSourcep->mPosAgent; } // Do color interpolation - if (part.mFlags & LLPartData::LL_PART_INTERP_COLOR_MASK) + if (part->mFlags & LLPartData::LL_PART_INTERP_COLOR_MASK) { - part.mColor.setVec(part.mStartColor); + part->mColor.setVec(part->mStartColor); // note: LLColor4's v%k means multiply-alpha-only, // LLColor4's v*k means multiply-rgb-only - part.mColor *= 1.f - frac; // rgb*k - part.mColor %= 1.f - frac; // alpha*k - part.mColor += frac%(frac*part.mEndColor); // rgb,alpha + part->mColor *= 1.f - frac; // rgb*k + part->mColor %= 1.f - frac; // alpha*k + part->mColor += frac%(frac*part->mEndColor); // rgb,alpha } // Do scale interpolation - if (part.mFlags & LLPartData::LL_PART_INTERP_SCALE_MASK) + if (part->mFlags & LLPartData::LL_PART_INTERP_SCALE_MASK) { - part.mScale.setVec(part.mStartScale); - part.mScale *= 1.f - frac; - part.mScale += frac*part.mEndScale; + part->mScale.setVec(part->mStartScale); + part->mScale *= 1.f - frac; + part->mScale += frac*part->mEndScale; } // Set the last update time to now. - part.mLastUpdateTime = cur_time; + part->mLastUpdateTime = cur_time; // Kill dead particles (either flagged dead, or too old) - if ((part.mLastUpdateTime > part.mMaxAge) || (LLViewerPart::LL_PART_DEAD_MASK == part.mFlags)) + if ((part->mLastUpdateTime > part->mMaxAge) || (LLViewerPart::LL_PART_DEAD_MASK == part->mFlags)) { - end--; - LLPointer<LLViewerPart>::swap(mParticles[i], mParticles[end]); - // be sure to process the particle we just swapped-in - i--; + mParticles[i] = mParticles.back() ; + mParticles.pop_back() ; + delete part ; } else { - F32 desired_size = calc_desired_size(part.mPosAgent, part.mScale); - if (!posInGroup(part.mPosAgent, desired_size)) + F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale); + if (!posInGroup(part->mPosAgent, desired_size)) { // Transfer particles between groups - LLViewerPartSim::getInstance()->put(&part); - end--; - LLPointer<LLViewerPart>::swap(mParticles[i], mParticles[end]); - // be sure to process the particle we just swapped-in - i--; + LLViewerPartSim::getInstance()->put(part) ; + mParticles[i] = mParticles.back() ; + mParticles.pop_back() ; + } + else + { + i++ ; } } } - S32 removed = (S32)mParticles.size() - end; + S32 removed = end - (S32)mParticles.size(); if (removed > 0) { // we removed one or more particles, so flag this group for update - mParticles.erase(mParticles.begin() + end, mParticles.end()); if (mVOPartGroupp.notNull()) { gPipeline.markRebuild(mVOPartGroupp->mDrawable, LLDrawable::REBUILD_ALL, TRUE); @@ -408,9 +412,7 @@ void LLViewerPartGroup::shift(const LLVector3 &offset) mMinObjPos += offset; mMaxObjPos += offset; - S32 count = (S32) mParticles.size(); - S32 i; - for (i = 0; i < count; i++) + for (S32 i = 0 ; i < (S32)mParticles.size(); i++) { mParticles[i]->mPosAgent += offset; } @@ -419,8 +421,8 @@ void LLViewerPartGroup::shift(const LLVector3 &offset) void LLViewerPartGroup::removeParticlesByID(const U32 source_id) { LLMemType mt(LLMemType::MTYPE_PARTICLES); - S32 end = (S32) mParticles.size(); - for (int i = 0; i < end; i++) + + for (S32 i = 0; i < (S32)mParticles.size(); i++) { if(mParticles[i]->mPartSourcep->getID() == source_id) { @@ -500,42 +502,57 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part) { LLMemType mt(LLMemType::MTYPE_PARTICLES); const F32 MAX_MAG = 1000000.f*1000000.f; // 1 million + LLViewerPartGroup *return_group = NULL ; if (part->mPosAgent.magVecSquared() > MAX_MAG || !part->mPosAgent.isFinite()) { #if 0 && !LL_RELEASE_FOR_DOWNLOAD llwarns << "LLViewerPartSim::put Part out of range!" << llendl; llwarns << part->mPosAgent << llendl; #endif - return NULL; } - - F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale); + else + { + F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale); - S32 count = (S32) mViewerPartGroups.size(); - for (S32 i = 0; i < count; i++) - { - if (mViewerPartGroups[i]->addPart(part, desired_size)) + S32 count = (S32) mViewerPartGroups.size(); + for (S32 i = 0; i < count; i++) { - // We found a spatial group that we fit into, add us and exit - return mViewerPartGroups[i]; + if (mViewerPartGroups[i]->addPart(part, desired_size)) + { + // We found a spatial group that we fit into, add us and exit + return_group = mViewerPartGroups[i]; + break ; + } + } + + // Hmm, we didn't fit in any of the existing spatial groups + // Create a new one... + if(!return_group) + { + llassert_always(part->mPosAgent.isFinite()); + LLViewerPartGroup *groupp = createViewerPartGroup(part->mPosAgent, desired_size); + groupp->mUniformParticles = (part->mScale.mV[0] == part->mScale.mV[1] && + !(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK)); + if (!groupp->addPart(part)) + { + llwarns << "LLViewerPartSim::put - Particle didn't go into its box!" << llendl; + llinfos << groupp->getCenterAgent() << llendl; + llinfos << part->mPosAgent << llendl; + mViewerPartGroups.pop_back() ; + delete groupp; + groupp = NULL ; + } + return_group = groupp; } } - // Hmm, we didn't fit in any of the existing spatial groups - // Create a new one... - llassert_always(part->mPosAgent.isFinite()); - LLViewerPartGroup *groupp = createViewerPartGroup(part->mPosAgent, desired_size); - groupp->mUniformParticles = (part->mScale.mV[0] == part->mScale.mV[1] && - !(part->mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK)); - if (!groupp->addPart(part)) + if(!return_group) //failed to insert the particle { - llwarns << "LLViewerPartSim::put - Particle didn't go into its box!" << llendl; - llinfos << groupp->getCenterAgent() << llendl; - llinfos << part->mPosAgent << llendl; - delete groupp; - return NULL; + delete part ; + part = NULL ; } - return groupp; + + return return_group ; } LLViewerPartGroup *LLViewerPartSim::createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size) @@ -614,7 +631,24 @@ void LLViewerPartSim::updateSimulation() if (!mViewerPartSources[i]->isDead()) { - mViewerPartSources[i]->update(dt); + BOOL upd = TRUE; + if (!LLPipeline::sRenderAttachedParticles) + { + LLViewerObject* vobj = mViewerPartSources[i]->mSourceObjectp; + if (vobj && (vobj->getPCode() == LL_PCODE_VOLUME)) + { + LLVOVolume* vvo = (LLVOVolume *)vobj; + if (vvo && vvo->isAttachment()) + { + upd = FALSE; + } + } + } + + if (upd) + { + mViewerPartSources[i]->update(dt); + } } if (mViewerPartSources[i]->isDead()) @@ -630,7 +664,6 @@ void LLViewerPartSim::updateSimulation() num_updates++; } - count = (S32) mViewerPartGroups.size(); for (i = 0; i < count; i++) { diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h index daccac4e8f..de763d3e53 100644 --- a/indra/newview/llviewerpartsim.h +++ b/indra/newview/llviewerpartsim.h @@ -52,9 +52,9 @@ typedef void (*LLVPCallback)(LLViewerPart &part, const F32 dt); // -class LLViewerPart : public LLPartData, public LLRefCount +class LLViewerPart : public LLPartData { -protected: +public: ~LLViewerPart(); public: LLViewerPart(); @@ -100,7 +100,7 @@ public: void shift(const LLVector3 &offset); - typedef std::vector<LLPointer<LLViewerPart> > part_list_t; + typedef std::vector<LLViewerPart*> part_list_t; part_list_t mParticles; const LLVector3 &getCenterAgent() const { return mCenterAgent; } diff --git a/indra/newview/llviewerpartsource.cpp b/indra/newview/llviewerpartsource.cpp index b6f16d1002..9bdebbbd38 100644 --- a/indra/newview/llviewerpartsource.cpp +++ b/indra/newview/llviewerpartsource.cpp @@ -278,7 +278,7 @@ void LLViewerPartSourceScript::update(const F32 dt) continue; } - LLPointer<LLViewerPart> part = new LLViewerPart(); + LLViewerPart* part = new LLViewerPart(); part->init(this, mImagep, NULL); part->mFlags = mPartSysData.mPartData.mFlags; @@ -569,7 +569,7 @@ void LLViewerPartSourceSpiral::update(const F32 dt) { mPosAgent = mSourceObjectp->getRenderPosition(); } - LLPointer<LLViewerPart> part = new LLViewerPart(); + LLViewerPart* part = new LLViewerPart(); part->init(this, mImagep, updatePart); part->mStartColor = mColor; part->mEndColor = mColor; @@ -717,7 +717,7 @@ void LLViewerPartSourceBeam::update(const F32 dt) mImagep = gImageList.getImageFromFile("pixiesmall.j2c"); } - LLPointer<LLViewerPart> part = new LLViewerPart(); + LLViewerPart* part = new LLViewerPart(); part->init(this, mImagep, NULL); part->mFlags = LLPartData::LL_PART_INTERP_COLOR_MASK | @@ -834,7 +834,7 @@ void LLViewerPartSourceChat::update(const F32 dt) { mPosAgent = mSourceObjectp->getRenderPosition(); } - LLPointer<LLViewerPart> part = new LLViewerPart(); + LLViewerPart* part = new LLViewerPart(); part->init(this, mImagep, updatePart); part->mStartColor = mColor; part->mEndColor = mColor; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index d060d2593c..42ea36baec 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -233,7 +233,7 @@ void LLViewerRegion::initStats() mPacketsLost = 0; mLastPacketsLost = 0; mPingDelay = 0; - mAlive = FALSE; // can become false if circuit disconnects + mAlive = false; // can become false if circuit disconnects } LLViewerRegion::~LLViewerRegion() @@ -808,11 +808,11 @@ void LLViewerRegion::updateNetStats() LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost); if (!cdp) { - mAlive = FALSE; + mAlive = false; return; } - mAlive = TRUE; + mAlive = true; mDeltaTime = dt; mLastPacketsIn = mPacketsIn; @@ -900,6 +900,11 @@ F32 LLViewerRegion::getLandHeightRegion(const LLVector3& region_pos) return mLandp->resolveHeightRegion( region_pos ); } +bool LLViewerRegion::isAlive() +{ + return mAlive; +} + BOOL LLViewerRegion::isOwnedSelf(const LLVector3& pos) { if (mParcelOverlay) diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 8c3115f78d..e2ba5b1636 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -123,6 +123,8 @@ public: inline BOOL getAllowTerraform() const; inline BOOL getRestrictPushObject() const; + bool isAlive(); // can become false if circuit disconnects + void setWaterHeight(F32 water_level); F32 getWaterHeight() const; @@ -286,8 +288,6 @@ public: LLCloudLayer mCloudLayer; LLViewerParcelOverlay *mParcelOverlay; - BOOL mAlive; // can become false if circuit disconnects - LLStat mBitStat; LLStat mPacketsStat; LLStat mPacketsLostStat; @@ -302,7 +302,7 @@ public: LLDynamicArray<U32> mMapAvatars; LLDynamicArray<LLUUID> mMapAvatarIDs; -protected: +private: // The surfaces and other layers LLSurface* mLandp; @@ -375,6 +375,8 @@ protected: LLEventPoll* mEventPoll; private: + bool mAlive; // can become false if circuit disconnects + //spatial partitions for objects in this region std::vector<LLSpatialPartition*> mObjectPartition; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index fe0f3f12a6..f69f4fbb62 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -418,6 +418,7 @@ void LLViewerShaderMgr::setShaders() mVertexShaderLevel[SHADER_OBJECT] = 0; mVertexShaderLevel[SHADER_EFFECT] = 0; mVertexShaderLevel[SHADER_WINDLIGHT] = 0; + mVertexShaderLevel[SHADER_AVATAR] = 0; } } else @@ -431,6 +432,7 @@ void LLViewerShaderMgr::setShaders() mVertexShaderLevel[SHADER_OBJECT] = 0; mVertexShaderLevel[SHADER_EFFECT] = 0; mVertexShaderLevel[SHADER_WINDLIGHT] = 0; + mVertexShaderLevel[SHADER_AVATAR] = 0; } if (gViewerWindow) @@ -476,6 +478,8 @@ void LLViewerShaderMgr::unloadShaders() mVertexShaderLevel[SHADER_ENVIRONMENT] = 0; mVertexShaderLevel[SHADER_WATER] = 0; mVertexShaderLevel[SHADER_INTERFACE] = 0; + mVertexShaderLevel[SHADER_EFFECT] = 0; + mVertexShaderLevel[SHADER_WINDLIGHT] = 0; gPipeline.mVertexShadersLoaded = 0; } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 4c575ff139..299785d590 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -29,17 +29,17 @@ * $/LicenseInfo$ */ +// system library includes +#include <stdio.h> +#include <iostream> +#include <fstream> + #include "llviewerprecompiledheaders.h" #include "llpanellogin.h" #include "llviewerkeyboard.h" #include "llviewerwindow.h" -// system library includes -#include <stdio.h> -#include <iostream> -#include <fstream> - #include "llviewquery.h" #include "llxmltree.h" //#include "llviewercamera.h" @@ -47,9 +47,6 @@ #include "llvoiceclient.h" // for push-to-talk button handling -#ifdef SABINRIG -#include "cbw.h" -#endif //SABINRIG // // TODO: Many of these includes are unnecessary. Remove them. @@ -60,6 +57,7 @@ #include "indra_constants.h" #include "llassetstorage.h" #include "llfontgl.h" +#include "llmousehandler.h" #include "llrect.h" #include "llsky.h" #include "llstring.h" @@ -191,7 +189,7 @@ // // Globals // -void render_ui_and_swap(); +void render_ui(); LLBottomPanel* gBottomPanel = NULL; extern BOOL gDebugClicks; @@ -237,34 +235,9 @@ const F32 MIN_AFK_TIME = 2.f; // minimum time after setting away state before co const F32 MAX_FAST_FRAME_TIME = 0.5f; const F32 FAST_FRAME_INCREMENT = 0.1f; -const F32 MIN_DISPLAY_SCALE = 0.85f; +const F32 MIN_DISPLAY_SCALE = 0.75f; const S32 CONSOLE_BOTTOM_PAD = 40; -#ifdef SABINRIG -/// ALL RIG STUFF -bool rigControl = false; -bool voltDisplay = true; -bool nominalX = false; -bool nominalY = false; -static F32 nomerX = 0.0f; -static F32 nomerY = 0.0f; -const BOARD_NUM = 0; // rig stuff! -const ADRANGE = BIP10VOLTS; // rig stuff! -static unsigned short DataVal; // rig stuff! -static F32 oldValueX = 0; -static F32 newValueX = 50; -static F32 oldValueY = 0; -static F32 newValueY = 50; -static S32 mouseX = 50; -static S32 mouseY = 50; -static float VoltageX = 50; // rig stuff! -static float VoltageY = 50; // rig stuff! -static float nVoltX = 0; -static float nVoltY = 0; -static F32 temp1 = 50.f; -static F32 temp2 = 20.f; -LLCoordGL new_gl; -#endif //SABINRIG std::string LLViewerWindow::sSnapshotBaseName; std::string LLViewerWindow::sSnapshotDir; @@ -273,81 +246,6 @@ std::string LLViewerWindow::sMovieBaseName; extern void toggle_debug_menus(void*); -#ifdef SABINRIG -// static -void LLViewerWindow::printFeedback() -{ - if(rigControl == true) - { - cbAIn (BOARD_NUM, 0, ADRANGE, &DataVal); - cbToEngUnits (BOARD_NUM,ADRANGE,DataVal,&VoltageX); //Convert raw to voltage for X-axis - cbAIn (BOARD_NUM, 1, ADRANGE, &DataVal); - cbToEngUnits (BOARD_NUM,ADRANGE,DataVal,&VoltageY); //Convert raw to voltage for Y-axis - if(voltDisplay == true) - { - llinfos << "Current Voltages - X:" << VoltageX << " Y:" << VoltageY << llendl; //Display voltage - } - - if(nVoltX == 0) - { - nVoltX = VoltageX; - nVoltY = VoltageY; //First time setup of nominal values. - } - - newValueX = VoltageX; - newValueY = VoltageY; //Take in current voltage and set to a separate value for adjustment. - - mouseX = mCurrentMousePoint.mX; - mouseY = mCurrentMousePoint.mY; //Take in current cursor position and set to separate value for adjustment. - - if( abs(newValueX - nVoltX) > nomerX ) - { - if( (newValueX - oldValueX) < 0) - { - mouseX += (S32)( ((newValueX - oldValueX)*.5)) * -temp; - } - else - { - mouseX += (S32)( ((newValueX - oldValueX)*.5) * temp1); - } - } - else - { - mouseX = getWindowWidth() / 2; - } - if( abs(newValueY - nVoltY) > nomerY ) - { - if( (newValueY - oldValueY) < 0) - { - mouseY += (S32)( ((newValueY - oldValueY)*(newValueY - oldValueY)) * -temp2); - } - else - { - mouseY += (S32)( ((newValueY - oldValueY)*(newValueY - oldValueY)) * temp2); - } - } - else - { - mouseY = getWindowHeight() / 2; - } - //mouseX += (S32)( (newValueX - nVoltX) * temp1 + 0.5 ); - // (newValueX - oldValueX) = difference between current position and nominal position - // * temp1 = the amplification of the number that sets sensitivity - // + 0.5 = fixes rounding errors - - - //mouseY += (S32)( (newValueY - nVoltY) * temp2 + 0.5 ); //Algorithm to adjust voltage for mouse adjustment. - - oldValueX = newValueX; - oldValueY = newValueY; - - new_gl.mX = mouseX; - new_gl.mY = mouseY; //Setup final coordinate to move mouse to. - - setCursorPosition(new_gl); //Set final cursor position - } -} -#endif //SABINRIG //////////////////////////////////////////////////////////////////////////// // @@ -635,6 +533,21 @@ void LLViewerWindow::updateDebugText() // LLViewerWindow // +bool LLViewerWindow::shouldShowToolTipFor(LLMouseHandler *mh) +{ + if (mToolTip && mh) + { + LLMouseHandler::EShowToolTip showlevel = mh->getShowToolTip(); + + return ( + showlevel == LLMouseHandler::SHOW_ALWAYS || + (showlevel == LLMouseHandler::SHOW_IF_NOT_BLOCKED && + !mToolTipBlocked) + ); + } + return false; +} + BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask) { S32 x = pos.mX; @@ -664,11 +577,7 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask gMouseIdleTimer.reset(); // Hide tooltips on mousedown - if( mToolTip ) - { - mToolTipBlocked = TRUE; - mToolTip->setVisible( FALSE ); - } + mToolTipBlocked = TRUE; // Also hide hover info on mousedown if (gHoverView) @@ -708,7 +617,7 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask } else { - setTopCtrl(NULL); + gFocusMgr.setTopCtrl(NULL); } } @@ -791,7 +700,7 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window, LLCoordGL pos, MASK ma } else { - setTopCtrl(NULL); + gFocusMgr.setTopCtrl(NULL); } } @@ -981,7 +890,7 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK } else { - setTopCtrl(NULL); + gFocusMgr.setTopCtrl(NULL); } } @@ -1154,13 +1063,9 @@ void LLViewerWindow::handleMouseMove(LLWindow *window, LLCoordGL pos, MASK mask gAgent.clearAFK(); } - if(mToolTip && mouse_actually_moved) + if(mouse_actually_moved) { - mToolTipBlocked = FALSE; // Blocking starts on keyboard events and (only) ends here. - if( mToolTip->getVisible() && !mToolTipStickyRect.pointInRect( x, y ) ) - { - mToolTip->setVisible( FALSE ); - } + mToolTipBlocked = FALSE; } // Activate the hover picker on mouse move. @@ -2395,11 +2300,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) } // Hide tooltips on keypress - if(mToolTip ) - { - mToolTipBlocked = TRUE; // block until next time mouse is moved - mToolTip->setVisible( FALSE ); - } + mToolTipBlocked = TRUE; // block until next time mouse is moved // Also hide hover info on keypress if (gHoverView) @@ -2432,22 +2333,8 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) } // handle escape key - if (key == KEY_ESCAPE && mask == MASK_NONE) - { - if (gMenuHolder && gMenuHolder->hideMenus()) - { - return TRUE; - } - - //if quit from menu, turn off the Keyboardmode for the menu. - if(LLMenuGL::getKeyboardMode()) - LLMenuGL::setKeyboardMode(FALSE); - - if (gFocusMgr.getTopCtrl()) - { - gFocusMgr.setTopCtrl(NULL); - return TRUE; - } + //if (key == KEY_ESCAPE && mask == MASK_NONE) + //{ // *TODO: get this to play well with mouselook and hidden // cursor modes, etc, and re-enable. @@ -2456,7 +2343,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // gFocusMgr.setMouseCapture(NULL); // return TRUE; //} - } + //} // let menus handle navigation keys if (gMenuBarView && gMenuBarView->handleKey(key, mask, TRUE)) @@ -2890,7 +2777,6 @@ BOOL LLViewerWindow::handlePerFrameHover() } - //llinfos << (mToolTipBlocked ? "BLOCKED" : "NOT BLOCKED") << llendl; // Show a new tool tip (or update one that is alrady shown) BOOL tool_tip_handled = FALSE; std::string tool_tip_msg; @@ -2902,38 +2788,48 @@ BOOL LLViewerWindow::handlePerFrameHover() tooltip_delay = gSavedSettings.getF32( "DragAndDropToolTipDelay" ); } if( handled && - !mToolTipBlocked && - (gMouseIdleTimer.getElapsedTimeF32() > tooltip_delay) && - !mWindow->isCursorHidden() ) + gMouseIdleTimer.getElapsedTimeF32() > tooltip_delay && + !mWindow->isCursorHidden() ) { LLRect screen_sticky_rect; - + LLMouseHandler *mh; + S32 local_x, local_y; if (mouse_captor) { - S32 local_x, local_y; - mouse_captor->screenPointToLocal( x, y, &local_x, &local_y ); - tool_tip_handled = mouse_captor->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect ); + mouse_captor->screenPointToLocal(x, y, &local_x, &local_y); + mh = mouse_captor; } else if (handled_by_top_ctrl) { - S32 local_x, local_y; - top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); - tool_tip_handled = top_ctrl->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect ); + top_ctrl->screenPointToLocal(x, y, &local_x, &local_y); + mh = top_ctrl; } else { - tool_tip_handled = mRootView->handleToolTip(x, y, tool_tip_msg, &screen_sticky_rect ); + local_x = x; local_y = y; + mh = mRootView; } - if( tool_tip_handled && !tool_tip_msg.empty() ) + BOOL tooltip_vis = FALSE; + if (shouldShowToolTipFor(mh)) { - mToolTipStickyRect = screen_sticky_rect; - mToolTip->setWrappedText( tool_tip_msg, 200 ); - mToolTip->reshapeToFitText(); - mToolTip->setOrigin( x, y ); - LLRect virtual_window_rect(0, getWindowHeight(), getWindowWidth(), 0); - mToolTip->translateIntoRect( virtual_window_rect, FALSE ); - mToolTip->setVisible( TRUE ); + tool_tip_handled = mh->handleToolTip(local_x, local_y, tool_tip_msg, &screen_sticky_rect ); + + if( tool_tip_handled && !tool_tip_msg.empty() ) + { + mToolTipStickyRect = screen_sticky_rect; + mToolTip->setWrappedText( tool_tip_msg, 200 ); + mToolTip->reshapeToFitText(); + mToolTip->setOrigin( x, y ); + LLRect virtual_window_rect(0, getWindowHeight(), getWindowWidth(), 0); + mToolTip->translateIntoRect( virtual_window_rect, FALSE ); + tooltip_vis = TRUE; + } + } + + if (mToolTip) + { + mToolTip->setVisible( tooltip_vis ); } } @@ -4014,7 +3910,7 @@ BOOL LLViewerWindow::thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 p else { display(do_rebuild, 1.0f, 0, TRUE); - render_ui_and_swap(); + render_ui(); } S32 glformat, gltype, glpixel_length ; @@ -4239,7 +4135,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { display(do_rebuild, scale_factor, subimage_x+(subimage_y*llceil(scale_factor)), TRUE); // Required for showing the GUI in snapshots? See DEV-16350 for details. JC - render_ui_and_swap(); + render_ui(); } S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width); @@ -4395,39 +4291,6 @@ void LLViewerWindow::drawMouselookInstructions() } -// These functions are here only because LLViewerWindow used to do the work that gFocusMgr does now. -// They let other objects continue to work without change. - -void LLViewerWindow::setKeyboardFocus(LLUICtrl* new_focus) -{ - gFocusMgr.setKeyboardFocus( new_focus ); -} - -LLUICtrl* LLViewerWindow::getKeyboardFocus() -{ - return gFocusMgr.getKeyboardFocus(); -} - -BOOL LLViewerWindow::hasKeyboardFocus(const LLUICtrl* possible_focus) const -{ - return possible_focus == gFocusMgr.getKeyboardFocus(); -} - -BOOL LLViewerWindow::childHasKeyboardFocus(const LLView* parent) const -{ - return gFocusMgr.childHasKeyboardFocus( parent ); -} - -void LLViewerWindow::setMouseCapture(LLMouseHandler* new_captor) -{ - gFocusMgr.setMouseCapture( new_captor ); -} - -LLMouseHandler* LLViewerWindow::getMouseCaptor() const -{ - return gFocusMgr.getMouseCapture(); -} - S32 LLViewerWindow::getWindowHeight() const { return mVirtualWindowRect.getHeight(); @@ -4448,21 +4311,6 @@ S32 LLViewerWindow::getWindowDisplayWidth() const return mWindowRect.getWidth(); } -LLUICtrl* LLViewerWindow::getTopCtrl() const -{ - return gFocusMgr.getTopCtrl(); -} - -BOOL LLViewerWindow::hasTopCtrl(LLView* view) const -{ - return view == gFocusMgr.getTopCtrl(); -} - -void LLViewerWindow::setTopCtrl(LLUICtrl* new_top) -{ - gFocusMgr.setTopCtrl( new_top ); -} - void LLViewerWindow::setupViewport(S32 x_offset, S32 y_offset) { gGLViewport[0] = x_offset; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index c7d02cb720..30a9d91de9 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -51,14 +51,13 @@ class LLView; class LLViewerObject; class LLUUID; -class LLMouseHandler; class LLProgressView; class LLTool; class LLVelocityBar; -class LLViewerWindow; class LLTextBox; class LLImageRaw; class LLHUDIcon; +class LLMouseHandler; #define PICK_HALF_WIDTH 5 #define PICK_DIAMETER (2 * PICK_HALF_WIDTH + 1) @@ -192,6 +191,7 @@ public: LLWindow* getWindow() const { return mWindow; } void* getPlatformWindow() const { return mWindow->getPlatformWindow(); } + void* getMediaWindow() const { return mWindow->getMediaWindow(); } void focusClient() const { return mWindow->focusClient(); }; LLCoordGL getLastMouse() const { return mLastMousePoint; } @@ -210,9 +210,6 @@ public: const LLPickInfo& getLastPick() const { return mLastPick; } const LLPickInfo& getHoverPick() const { return mHoverPick; } - LLUICtrl* getTopCtrl() const; - BOOL hasTopCtrl(LLView* view) const; - void setupViewport(S32 x_offset = 0, S32 y_offset = 0); void setup3DRender(); void setup2DRender(); @@ -261,24 +258,10 @@ public: void setNormalControlsVisible( BOOL visible ); void setMenuBackgroundColor(bool god_mode = false, bool dev_grid = false); - // Handle the application becoming active (frontmost) or inactive - //BOOL handleActivate(BOOL activate); - - void setKeyboardFocus(LLUICtrl* new_focus); // new_focus = NULL to release the focus. - LLUICtrl* getKeyboardFocus(); - BOOL hasKeyboardFocus( const LLUICtrl* possible_focus ) const; - BOOL childHasKeyboardFocus( const LLView* parent ) const; - - void setMouseCapture(LLMouseHandler* new_captor); // new_captor = NULL to release the mouse. - LLMouseHandler* getMouseCaptor() const; - - void setTopCtrl(LLUICtrl* new_top); // set new_top = NULL to release top_view. - void reshape(S32 width, S32 height); void sendShapeToSim(); void draw(); -// void drawSelectedObjects(); void updateDebugText(); void drawDebugText(); @@ -368,12 +351,8 @@ public: static bool alertCallback(S32 modal); -#ifdef SABINRIG - //Silly rig stuff - void printFeedback(); //RIG STUFF! -#endif //SABINRIG - private: + bool shouldShowToolTipFor(LLMouseHandler *mh); void switchToolByMask(MASK mask); void destroyWindow(); void drawMouselookInstructions(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 47090d5c65..9bdf842ad6 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -138,7 +138,7 @@ S32 LLVOAvatar::sFreezeCounter = 0 ; //----------------------------------------------------------------------------- // Constants //----------------------------------------------------------------------------- -const F32 MIN_PIXEL_AREA_FOR_COMPOSITE = 200.f; +const F32 MIN_PIXEL_AREA_FOR_COMPOSITE = 1024; F32 SHADOW_OFFSET_AMT = 0.03f; @@ -673,6 +673,10 @@ LLVOAvatar::LLVOAvatar( mUpperMaskTexName(0), mLowerMaskTexName(0), mCulled( FALSE ), + mVisibilityRank(0), + mFadeTime(0.f), + mLastFadeTime(0.f), + mLastFadeDistance(1.f), mTexSkinColor( NULL ), mTexHairColor( NULL ), mTexEyeColor( NULL ), @@ -731,6 +735,7 @@ LLVOAvatar::LLVOAvatar( mNeedsAnimUpdate = TRUE; mImpostorDistance = 0; + mImpostorPixelArea = 0; setNumTEs(TEX_NUM_ENTRIES); @@ -1528,6 +1533,8 @@ void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax) } } + mPixelArea = LLPipeline::calcPixelArea((newMin+newMax)*0.5f, (newMax-newMin)*0.5f, *LLViewerCamera::getInstance()); + //stretch bounding box by attachments for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); @@ -2338,6 +2345,15 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys, // Do base class updates... U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp); + if(retval & LLViewerObject::INVALID_UPDATE) + { + if(this == gAgent.getAvatarObject()) + { + //tell sim to cancel this update + gAgent.teleportViaLocation(gAgent.getPositionGlobal()); + } + } + //llinfos << getRotation() << llendl; //llinfos << getPosition() << llendl; if (update_type == OUT_FULL ) @@ -2642,7 +2658,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) F32 old_angle = mImpostorAngle.mV[i]; F32 angle_diff = fabsf(cur_angle-old_angle); - if (angle_diff > 3.14159f/512.f*distance) + if (angle_diff > 3.14159f/512.f*distance*mUpdatePeriod) { mNeedsImpostorUpdate = TRUE; } @@ -3362,30 +3378,41 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) // the rest should only be done occasionally for far away avatars //-------------------------------------------------------------------- - if (!mIsSelf && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter) + if (visible && !mIsSelf && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter) { F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f); if (LLMuteList::getInstance()->isMuted(getID())) - { + { // muted avatars update at 16 hz mUpdatePeriod = 16; - visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE; } - else if (visible && mPixelArea <= impostor_area) - { - mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mPixelArea), 2, 8); - - visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE; + else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible * 0.25f) + { //first 25% of max visible avatars are not impostored + mUpdatePeriod = 1; + } + else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.75f) + { //back 25% of max visible avatars are slow updating impostors + mUpdatePeriod = 8; + } + else if (visible && mImpostorPixelArea <= impostor_area) + { // stuff in between gets an update period based on pixel area + mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8); + } + else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.25f) + { // force nearby impostors in ultra crowded areas + mUpdatePeriod = 2; } else - { + { // not impostored mUpdatePeriod = 1; } - if (!visible) - { - updateMotions(LLCharacter::HIDDEN_UPDATE); - return FALSE; - } + visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE; + } + + if (!visible) + { + updateMotions(LLCharacter::HIDDEN_UPDATE); + return FALSE; } // change animation time quanta based on avatar render load @@ -3758,32 +3785,6 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) mRoot.updateWorldMatrixChildren(); - // Send the speaker position to the spatialized voice system. - if(mIsSelf) - { - LLMatrix3 rot; - LLVector3d pos; -#if 1 - // character rotation (stable, shouldn't move with animations) - rot = mRoot.getWorldRotation().getMatrix3(); -#else - // actual head rotation (moves with animations, probably a bit too much) - rot.setRows( - LLVector3::x_axis * mSkullp->getWorldRotation(), - LLVector3::y_axis * mSkullp->getWorldRotation(), - LLVector3::z_axis * mSkullp->getWorldRotation()); -#endif - - pos = getPositionGlobal(); - pos += LLVector3d(mHeadOffset); - - // MBW -- XXX -- Setting velocity to 0 for now. May figure it out later... - gVoiceClient->setAvatarPosition( - pos, // position - LLVector3::zero, // velocity - rot); // rotation matrix - } - if (!mDebugText.size() && mText.notNull()) { mText->markDead(); @@ -4254,7 +4255,23 @@ U32 LLVOAvatar::renderImpostor(LLColor4U color) LLGLEnable test(GL_ALPHA_TEST); gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f); - gGL.color4f(1,1,1,1); + F32 blend = gFrameTimeSeconds - mFadeTime; + + LLGLState gl_blend(GL_BLEND, blend < 1.f ? TRUE : FALSE); + gGL.setSceneBlendType(LLRender::BT_ALPHA); + + F32 alpha; + if (mVisibilityRank >= (U32) LLVOAvatar::sMaxVisible) + { //fade out + alpha = 1.f - llmin(blend, 1.f); + } + else + { //fade in + alpha = llmin(blend, 1.f); + } + + color.mV[3] = (U8) (alpha*255); + gGL.color4ubv(color.mV); mImpostor.bindTexture(); gGL.begin(LLVertexBuffer::QUADS); @@ -4380,7 +4397,6 @@ void LLVOAvatar::updateTextures(LLAgent &agent) const LLTextureEntry *te = getTE(i); F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT); -// BOOL boost_aux = (imagep->needsAux() && (!imagep->mFullWidth || !imagep->mFullHeight)); S32 boost_level = mIsSelf ? LLViewerImage::BOOST_AVATAR_BAKED_SELF : LLViewerImage::BOOST_AVATAR_BAKED; // Spam if this is a baked texture, not set to default image, without valid host info @@ -5750,7 +5766,7 @@ void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent) LLVector3 center = (ext[1] + ext[0]) * 0.5f; LLVector3 size = (ext[1]-ext[0])*0.5f; - mPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance()); + mImpostorPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance()); F32 range = mDrawable->mDistanceWRTCamera; @@ -6199,9 +6215,11 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) stopMotionFromSource(viewer_object->getID()); LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE); - for (S32 i = 0; i < (S32)viewer_object->mChildList.size(); i++) + LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLViewerObject* child_objectp = viewer_object->mChildList[i]; + LLViewerObject* child_objectp = *iter; // the simulator should automatically handle // permissions revocation @@ -6243,6 +6261,10 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object) mDrawable->mXform.setPosition(rel_pos); mDrawable->mXform.setRotation(mDrawable->getWorldRotation() * inv_obj_rot); + //in case the viewerobject is not updated in time + mDrawable->getVObj()->setPosition(sit_object->getWorldPosition()) ; + mDrawable->getVObj()->setRotation(sit_object->getWorldRotation()) ; + gPipeline.markMoved(mDrawable, TRUE); mIsSitting = TRUE; mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject @@ -6284,9 +6306,11 @@ void LLVOAvatar::getOffObject() stopMotionFromSource(sit_object->getID()); LLFollowCamMgr::setCameraActive(sit_object->getID(), FALSE); - for (S32 i = 0; i < (S32)sit_object->mChildList.size(); i++) + LLViewerObject::const_child_list_t& child_list = sit_object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLViewerObject* child_objectp = sit_object->mChildList[i]; + LLViewerObject* child_objectp = *iter; stopMotionFromSource(child_objectp->getID()); LLFollowCamMgr::setCameraActive(child_objectp->getID(), FALSE); @@ -6299,7 +6323,11 @@ void LLVOAvatar::getOffObject() // set *local* position based on last *world* position, since we're unparenting the avatar mDrawable->mXform.setPosition(cur_position_world); - mDrawable->mXform.setRotation(cur_rotation_world); + mDrawable->mXform.setRotation(cur_rotation_world); + + //in case the viewerobject is not updated from sim in time + mDrawable->getVObj()->setPosition(cur_position_world); + mDrawable->getVObj()->setRotation(cur_rotation_world); gPipeline.markMoved(mDrawable, TRUE); @@ -6750,7 +6778,9 @@ void LLVOAvatar::dumpTotalLocalTextureByteCount() BOOL LLVOAvatar::isVisible() { - return mDrawable.notNull() && (mDrawable->isVisible() || mIsDummy); + return mDrawable.notNull() + && (mDrawable->isVisible() || mIsDummy) + && (mVisibilityRank < (U32) sMaxVisible || gFrameTimeSeconds - mFadeTime < 1.f); } @@ -7184,9 +7214,8 @@ void LLVOAvatar::updateMeshTextures() { mHeadBakedLoaded = FALSE; mHeadMaskDiscard = -1; - baked->setNeedsAux(TRUE); - baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID )); - baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) ); + baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } else @@ -7235,9 +7264,8 @@ void LLVOAvatar::updateMeshTextures() { mUpperBakedLoaded = FALSE; mUpperMaskDiscard = -1; - baked->setNeedsAux(TRUE); - baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID )); - baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) ); + baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } else @@ -7283,9 +7311,8 @@ void LLVOAvatar::updateMeshTextures() { mLowerBakedLoaded = FALSE; mLowerMaskDiscard = -1; - baked->setNeedsAux(TRUE); - baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID )); - baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) ); + baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } else @@ -7329,7 +7356,7 @@ void LLVOAvatar::updateMeshTextures() else { mEyesBakedLoaded = FALSE; - baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) ); + baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } else @@ -7372,7 +7399,7 @@ void LLVOAvatar::updateMeshTextures() else { mSkirtBakedLoaded = FALSE; - baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) ); + baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) ); } } else @@ -7473,7 +7500,7 @@ void LLVOAvatar::setLocalTexture( ELocTexIndex idx, LLViewerImage* tex, BOOL bak } else { - tex->setLoadedCallback( onLocalTextureLoaded, desired_discard, TRUE, new LLAvatarTexData(getID(), idx) ); + tex->setLoadedCallback( onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), idx) ); } } tex->setMinDiscardLevel(desired_discard); @@ -8274,9 +8301,12 @@ LLBBox LLVOAvatar::getHUDBBox() bbox.addPointLocal(hud_object->getPosition()); // add rotated bounding box for attached object bbox.addBBoxAgent(hud_object->getBoundingBoxAgent()); - for (U32 i = 0; i < hud_object->mChildList.size(); i++) + LLViewerObject::const_child_list_t& child_list = hud_object->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - bbox.addBBoxAgent(hud_object->mChildList[i]->getBoundingBoxAgent()); + LLViewerObject* child_objectp = *iter; + bbox.addBBoxAgent(child_objectp->getBoundingBoxAgent()); } } } @@ -8309,41 +8339,38 @@ void LLVOAvatar::onFirstTEMessageReceived() { mLastHeadBakedID = getTEImage( TEX_HEAD_BAKED )->getID(); LLViewerImage* image = getTEImage( TEX_HEAD_BAKED ); - image->setNeedsAux(TRUE); - image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID )); - image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) ); + image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); } if( upper_baked ) { mLastUpperBodyBakedID = getTEImage( TEX_UPPER_BAKED )->getID(); LLViewerImage* image = getTEImage( TEX_UPPER_BAKED ); - image->setNeedsAux(TRUE); - image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID )); - image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) ); + image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); } if( lower_baked ) { mLastLowerBodyBakedID = getTEImage( TEX_LOWER_BAKED )->getID(); LLViewerImage* image = getTEImage( TEX_LOWER_BAKED ); - image->setNeedsAux(TRUE); - image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID )); - image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) ); + image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID )); + image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); } if( eyes_baked ) { mLastEyesBakedID = getTEImage( TEX_EYES_BAKED )->getID(); LLViewerImage* image = getTEImage( TEX_EYES_BAKED ); - image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) ); + image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); } if( skirt_baked ) { mLastSkirtBakedID = getTEImage( TEX_SKIRT_BAKED )->getID(); LLViewerImage* image = getTEImage( TEX_SKIRT_BAKED ); - image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) ); + image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) ); } updateMeshTextures(); @@ -8355,6 +8382,12 @@ void LLVOAvatar::onFirstTEMessageReceived() //----------------------------------------------------------------------------- void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) { + if (gSavedSettings.getBOOL("BlockAvatarAppearanceMessages")) + { + llwarns << "Blocking AvatarAppearance message" << llendl; + return; + } + LLMemType mt(LLMemType::MTYPE_AVATAR); // llinfos << "processAvatarAppearance start " << mID << llendl; @@ -8846,6 +8879,42 @@ void LLVOAvatar::dumpArchetypeXML( void* ) } +U32 LLVOAvatar::getVisibilityRank() +{ + return mVisibilityRank; +} + +void LLVOAvatar::setVisibilityRank(U32 rank) +{ + BOOL stale = gFrameTimeSeconds - mLastFadeTime > 10.f; + + //only raise visibility rank or trigger a fade out every 10 seconds + if (mVisibilityRank >= (U32) LLVOAvatar::sMaxVisible && rank < (U32) LLVOAvatar::sMaxVisible || + (stale && mVisibilityRank < (U32) LLVOAvatar::sMaxVisible && rank >= (U32) LLVOAvatar::sMaxVisible)) + { //remember the time we became visible/invisible based on visibility rank + mVisibilityRank = rank; + mLastFadeTime = gFrameTimeSeconds; + mLastFadeDistance = mDrawable->mDistanceWRTCamera; + + F32 blend = gFrameTimeSeconds - mFadeTime; + mFadeTime = gFrameTimeSeconds; + if (blend < 1.f) + { //move the blend time back if a blend is already in progress (prevent flashes) + mFadeTime -= 1.f-blend; + } + } + else if (stale) + { + mLastFadeTime = gFrameTimeSeconds; + mLastFadeDistance = mDrawable->mDistanceWRTCamera; + mVisibilityRank = rank; + } + else + { + mVisibilityRank = llmin(mVisibilityRank, rank); + } +} + // Assumes LLVOAvatar::sInstances has already been sorted. S32 LLVOAvatar::getUnbakedPixelAreaRank() { @@ -8875,8 +8944,8 @@ void LLVOAvatar::cullAvatarsByPixelArea() std::sort(LLCharacter::sInstances.begin(), LLCharacter::sInstances.end(), CompareScreenAreaGreater()); // Update the avatars that have changed status - S32 rank = 1; - + S32 comp_rank = 1; + U32 rank = 0; for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); iter != LLCharacter::sInstances.end(); ++iter) { @@ -8892,8 +8961,8 @@ void LLVOAvatar::cullAvatarsByPixelArea() } else { - culled = (rank > LLVOAvatar::sMaxOtherAvatarsToComposite) || (inst->mPixelArea < MIN_PIXEL_AREA_FOR_COMPOSITE); - rank++; + culled = (comp_rank > LLVOAvatar::sMaxOtherAvatarsToComposite) || (inst->mPixelArea < MIN_PIXEL_AREA_FOR_COMPOSITE); + comp_rank++; } if( inst->mCulled != culled ) @@ -8904,6 +8973,15 @@ void LLVOAvatar::cullAvatarsByPixelArea() inst->updateMeshTextures(); } + + if (inst->isSelf()) + { + inst->setVisibilityRank(0); + } + else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible()) + { + inst->setVisibilityRank(rank++); + } } if( LLVOAvatar::areAllNearbyInstancesBaked() ) @@ -9867,9 +9945,20 @@ U32 calc_shame(LLVOVolume* volume, std::set<LLUUID> &textures) shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar; - for (U32 i = 0; i < drawablep->getChildCount(); ++i) + LLViewerObject::const_child_list_t& child_list = volume->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - shame += calc_shame(drawablep->getChild(i)->getVOVolume(), textures); + LLViewerObject* child_objectp = *iter; + LLDrawable* child_drawablep = child_objectp->mDrawable; + if (child_drawablep) + { + LLVOVolume* child_volumep = child_drawablep->getVOVolume(); + if (child_volumep) + { + shame += calc_shame(child_volumep, textures); + } + } } return shame; @@ -9916,3 +10005,4 @@ void LLVOAvatar::idleUpdateRenderCost() mText->setColor(LLColor4(red,green,0,1)); } + diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index ff846c8d83..2ed0f1ec9b 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -439,6 +439,8 @@ public: BOOL isCulled() { return mCulled; } S32 getUnbakedPixelAreaRank(); + void setVisibilityRank(U32 rank); + U32 getVisibilityRank(); static void cullAvatarsByPixelArea(); void dumpLocalTextures(); @@ -717,8 +719,9 @@ public: LLVector3 mImpostorExtents[2]; LLVector3 mImpostorAngle; F32 mImpostorDistance; + F32 mImpostorPixelArea; LLVector3 mLastAnimExtents[2]; - + //-------------------------------------------------------------------- // Misc Render State //-------------------------------------------------------------------- @@ -956,6 +959,10 @@ protected: U32 mLowerMaskTexName; BOOL mCulled; + U32 mVisibilityRank; + F32 mFadeTime; + F32 mLastFadeTime; + F32 mLastFadeDistance; F32 mMinPixelArea; // debug F32 mMaxPixelArea; // debug diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 445e553c23..3cf0eb839d 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -60,6 +60,7 @@ #include "llviewerparcelmgr.h" #include "llfirstuse.h" #include "llviewerwindow.h" +#include "llviewercamera.h" // for base64 decoding #include "apr_base64.h" @@ -1191,7 +1192,11 @@ void LLVoiceClient::stateMachine() setVoiceEnabled(false); } - if(!mVoiceEnabled) + if(mVoiceEnabled) + { + updatePosition(); + } + else { if(getState() != stateDisabled) { @@ -3516,6 +3521,45 @@ void LLVoiceClient::enforceTether(void) } } +void LLVoiceClient::updatePosition(void) +{ + + if(gVoiceClient) + { + LLVOAvatar *agent = gAgent.getAvatarObject(); + LLViewerRegion *region = gAgent.getRegion(); + if(region && agent) + { + LLMatrix3 rot; + LLVector3d pos; + + // MBW -- XXX -- Setting both camera and avatar velocity to 0 for now. May figure it out later... + + // Send the current camera position to the voice code + rot.setRows(LLViewerCamera::getInstance()->getAtAxis(), LLViewerCamera::getInstance()->getLeftAxis (), LLViewerCamera::getInstance()->getUpAxis()); + pos = gAgent.getRegion()->getPosGlobalFromRegion(LLViewerCamera::getInstance()->getOrigin()); + + gVoiceClient->setCameraPosition( + pos, // position + LLVector3::zero, // velocity + rot); // rotation matrix + + // Send the current avatar position to the voice code + rot = agent->getRootJoint()->getWorldRotation().getMatrix3(); + + pos = agent->getPositionGlobal(); + // MBW -- XXX -- Can we get the head offset from outside the LLVOAvatar? +// pos += LLVector3d(mHeadOffset); + pos += LLVector3d(0.f, 0.f, 1.f); + + gVoiceClient->setAvatarPosition( + pos, // position + LLVector3::zero, // velocity + rot); // rotation matrix + } + } +} + void LLVoiceClient::setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot) { mCameraRequestedPosition = position; diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index f864b75bec..2e1efce6fb 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -188,6 +188,7 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient> ///////////////////////////// // Sending updates of current state +static void updatePosition(void); void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot); void setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot); bool channelFromRegion(LLViewerRegion *region, std::string &name); diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp index 40e405a313..6eb3851d16 100644 --- a/indra/newview/llvoicevisualizer.cpp +++ b/indra/newview/llvoicevisualizer.cpp @@ -293,10 +293,6 @@ void LLVoiceVisualizer::lipSyncOohAah( F32& ooh, F32& aah ) if( ( sLipSyncEnabled == TRUE ) && mCurrentlySpeaking ) { U32 transfer_index = (U32) (sOohPowerTransfersf * mSpeakingAmplitude); - if (transfer_index < 0) - { - transfer_index = 0; - } if (transfer_index >= sOohPowerTransfers) { transfer_index = sOohPowerTransfers - 1; @@ -304,10 +300,6 @@ void LLVoiceVisualizer::lipSyncOohAah( F32& ooh, F32& aah ) F32 transfer_ooh = sOohPowerTransfer[transfer_index]; transfer_index = (U32) (sAahPowerTransfersf * mSpeakingAmplitude); - if (transfer_index < 0) - { - transfer_index = 0; - } if (transfer_index >= sAahPowerTransfers) { transfer_index = sAahPowerTransfers - 1; diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 412e4660c8..6cc61e36e0 100644 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -180,14 +180,13 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) pixel_meter_ratio *= pixel_meter_ratio; S32 count=0; - S32 i; mDepth = 0.f; - - for (i = 0; i < num_parts; i++) + S32 i = 0 ; + for (i = 0 ; i < (S32)mViewerPartGroupp->mParticles.size(); i++) { - const LLViewerPart &part = *((LLViewerPart*) mViewerPartGroupp->mParticles[i]); + const LLViewerPart *part = mViewerPartGroupp->mParticles[i]; - LLVector3 part_pos_agent(part.mPosAgent); + LLVector3 part_pos_agent(part->mPosAgent); at = part_pos_agent - camera_agent; F32 camera_dist_squared = at.magVecSquared(); @@ -196,7 +195,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) inv_camera_dist_squared = 1.f / camera_dist_squared; else inv_camera_dist_squared = 1.f; - F32 area = part.mScale.mV[0] * part.mScale.mV[1] * inv_camera_dist_squared; + F32 area = part->mScale.mV[0] * part->mScale.mV[1] * inv_camera_dist_squared; tot_area = llmax(tot_area, area); if (tot_area > max_area) @@ -227,7 +226,7 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) facep->setViewerObject(this); - if (part.mFlags & LLPartData::LL_PART_EMISSIVE_MASK) + if (part->mFlags & LLPartData::LL_PART_EMISSIVE_MASK) { facep->setState(LLFace::FULLBRIGHT); } @@ -236,9 +235,9 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) facep->clearState(LLFace::FULLBRIGHT); } - facep->mCenterLocal = part.mPosAgent; - facep->setFaceColor(part.mColor); - facep->setTexture(part.mImagep); + facep->mCenterLocal = part->mPosAgent; + facep->setFaceColor(part->mColor); + facep->setTexture(part->mImagep); mPixelArea = tot_area * pixel_meter_ratio; const F32 area_scale = 10.f; // scale area to increase priority a bit diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 1e1f8be859..225d9a18b2 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -68,7 +68,7 @@ const S32 MIN_QUIET_FRAMES_COALESCE = 30; const F32 FORCE_SIMPLE_RENDER_AREA = 512.f; const F32 FORCE_CULL_AREA = 8.f; -const S32 SCULPT_REZ = 128; +const S32 SCULPT_REZ = 64; BOOL gAnimateTextures = TRUE; extern BOOL gHideSelectedObjects; @@ -87,6 +87,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re mRelativeXformInvTrans.setIdentity(); mLOD = MIN_LOD; + mSculptLevel = -2; mTextureAnimp = NULL; mVObjRadius = LLVector3(1,1,0.5f).magVec(); mNumFaces = 0; @@ -515,12 +516,13 @@ void LLVOVolume::updateTextures() if (mSculptTexture.notNull()) { mSculptTexture->addTextureStats(SCULPT_REZ * SCULPT_REZ); - mSculptTexture->setBoostLevel(LLViewerImage::BOOST_SCULPTED); + mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(), + (S32)LLViewerImage::BOOST_SCULPTED)); } S32 texture_discard = mSculptTexture->getDiscardLevel(); //try to match the texture - S32 current_discard = getVolume()->getSculptLevel(); - + S32 current_discard = mSculptLevel; + if (texture_discard >= 0 && //texture has some data available (texture_discard < current_discard || //texture has more data than last rebuild current_discard < 0)) //no previous rebuild @@ -701,6 +703,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail if (mSculptTexture.notNull()) { sculpt(); + mSculptLevel = getVolume()->getSculptLevel(); } } else diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 262d4ecc8d..58a1b308a4 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -224,6 +224,7 @@ private: LLFrameTimer mTextureUpdateTimer; S32 mLOD; BOOL mLODChanged; + S32 mSculptLevel; BOOL mSculptChanged; LLMatrix4 mRelativeXform; LLMatrix3 mRelativeXformInvTrans; diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h index ab9a00c785..ffb360934a 100644 --- a/indra/newview/llwearable.h +++ b/indra/newview/llwearable.h @@ -61,9 +61,8 @@ enum EWearableType // If you change this, update LLWearable::getTypeName(), get class LLWearable { + friend class LLWearableList; public: - LLWearable(const LLTransactionID& transactionID); - LLWearable(const LLAssetID& assetID); ~LLWearable(); const LLAssetID& getID() { return mAssetID; } @@ -120,6 +119,10 @@ public: friend std::ostream& operator<<(std::ostream &s, const LLWearable &w); private: + // Private constructor used by LLWearableList + LLWearable(const LLTransactionID& transactionID); + LLWearable(const LLAssetID& assetID); + static S32 sCurrentDefinitionVersion; // Depends on the current state of the avatar_lad.xml. S32 mDefinitionVersion; // Depends on the state of the avatar_lad.xml when this asset was created. std::string mName; diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index 7678727e58..a32c43302d 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -43,7 +43,7 @@ #include "llnotify.h" // Globals -LLWearableList gWearableList; +LLWearableList gWearableList; // Globally constructed; be careful that there's no dependency with gAgent. struct LLWearableArrivedData diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 08c593755b..8cebf1c12a 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -135,7 +135,7 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host) { LLHost old_host = regionp->getHost(); // region already exists! - if (host == old_host && regionp->mAlive) + if (host == old_host && regionp->isAlive()) { // This is a duplicate for the same host and it's alive, don't bother. return regionp; @@ -146,7 +146,7 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host) llwarns << "LLWorld::addRegion exists, but old host " << old_host << " does not match new host " << host << llendl; } - if (!regionp->mAlive) + if (!regionp->isAlive()) { llwarns << "LLWorld::addRegion exists, but isn't alive" << llendl; } diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index c24d1b882a..7269e32d71 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -197,6 +197,7 @@ glh::matrix4f gl_ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, return ret; } +void display_update_camera(); //---------------------------------------- S32 LLPipeline::sCompiles = 0; @@ -224,6 +225,8 @@ BOOL LLPipeline::sImpostorRender = FALSE; BOOL LLPipeline::sUnderWaterRender = FALSE; BOOL LLPipeline::sTextureBindTest = FALSE; BOOL LLPipeline::sRenderFrameTest = FALSE; +BOOL LLPipeline::sRenderAttachedLights = TRUE; +BOOL LLPipeline::sRenderAttachedParticles = TRUE; static LLCullResult* sCull = NULL; @@ -240,10 +243,30 @@ static const U32 gl_cube_face[] = void validate_framebuffer_object(); LLPipeline::LLPipeline() : + mBackfaceCull(FALSE), + mBatchCount(0), + mMatrixOpCount(0), + mTextureMatrixOps(0), + mMaxBatchSize(0), + mMinBatchSize(0), + mMeanBatchSize(0), + mTrianglesDrawn(0), + mNumVisibleNodes(0), + mVerticesRelit(0), + mLightingChanges(0), + mGeometryChanges(0), + mNumVisibleFaces(0), + mCubeBuffer(NULL), + mCubeFrameBuffer(0), + mCubeDepth(0), mInitialized(FALSE), mVertexShadersEnabled(FALSE), mVertexShadersLoaded(0), + mRenderTypeMask(0), + mRenderDebugFeatureMask(0), + mRenderDebugMask(0), + mOldRenderDebugMask(0), mLastRebuildPool(NULL), mAlphaPool(NULL), mSkyPool(NULL), @@ -256,15 +279,11 @@ LLPipeline::LLPipeline() : mBumpPool(NULL), mWLSkyPool(NULL), mLightMask(0), - mLightMovingMask(0) + mLightMovingMask(0), + mLightingDetail(0) { - //mFramebuffer[0] = mFramebuffer[1] = mFramebuffer[2] = mFramebuffer[3] = 0; mBlurCubeBuffer[0] = mBlurCubeBuffer[1] = mBlurCubeBuffer[2] = 0; mBlurCubeTexture[0] = mBlurCubeTexture[1] = mBlurCubeTexture[2] = 0; - - //mDepthbuffer[0] = mDepthbuffer[1] = 0; - mCubeFrameBuffer = 0; - mCubeDepth = 0; } void LLPipeline::init() @@ -273,6 +292,8 @@ void LLPipeline::init() sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD"); sRenderBump = gSavedSettings.getBOOL("RenderObjectBump"); + sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights"); + sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles"); mInitialized = TRUE; @@ -439,12 +460,6 @@ void LLPipeline::releaseGLBuffers() mCubeDepth = mCubeFrameBuffer = 0; } - /*if (mFramebuffer[0]) - { - glDeleteFramebuffersEXT(4, mFramebuffer); - mFramebuffer[0] = mFramebuffer[1] = mFramebuffer[2] = mFramebuffer[3] = 0; - }*/ - if (mBlurCubeBuffer[0]) { glDeleteFramebuffersEXT(3, mBlurCubeBuffer); @@ -1582,6 +1597,9 @@ void LLPipeline::shiftObjects(const LLVector3 &offset) } } } + + LLHUDText::shiftAll(offset); + display_update_camera(); } void LLPipeline::markTextured(LLDrawable *drawablep) @@ -1766,6 +1784,12 @@ void LLPipeline::stateSort(LLDrawable* drawablep, LLCamera& camera) { return; } + + LLVOAvatar* avatarp = (LLVOAvatar*) drawablep->getVObj().get(); + if (!avatarp->isVisible()) + { + return; + } } assertInitialized(); @@ -2153,6 +2177,7 @@ void render_hud_elements() gGL.color4f(1,1,1,1); if (!LLPipeline::sReflectionRender && gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) { + LLGLEnable multisample(GL_MULTISAMPLE_ARB); gViewerWindow->renderSelections(FALSE, FALSE, FALSE); // For HUD version in render_ui_3d() // Draw the tracking overlays @@ -2717,12 +2742,15 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render } //render child faces - for (U32 k = 0; k < drawable->getChildCount(); ++k) + LLViewerObject::const_child_list_t& child_list = objectp->getChildren(); + for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); iter++) { - LLDrawable* child = drawable->getChild(k); - for (S32 l = 0; l < child->getNumFaces(); ++l) + LLViewerObject* child = *iter; + LLDrawable* child_drawable = child->mDrawable; + for (S32 l = 0; l < child_drawable->getNumFaces(); ++l) { - LLFace* facep = child->getFace(l); + LLFace* facep = child_drawable->getFace(l); if (!facep->getPool()) { facep->renderForSelect(prim_mask); @@ -3174,12 +3202,16 @@ void LLPipeline::calcNearbyLights(LLCamera& camera) if (light->fade <= -LIGHT_FADE_TIME) { drawable->clearState(LLDrawable::NEARBY_LIGHT); + continue; } - else + if (!sRenderAttachedLights && volight && volight->isAttachment()) { - F32 dist = calc_light_dist(volight, cam_pos, max_dist); - cur_nearby_lights.insert(Light(drawable, dist, light->fade)); + drawable->clearState(LLDrawable::NEARBY_LIGHT); + continue; } + + F32 dist = calc_light_dist(volight, cam_pos, max_dist); + cur_nearby_lights.insert(Light(drawable, dist, light->fade)); } mNearbyLights = cur_nearby_lights; } @@ -4026,11 +4058,6 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable) return; } - if (!drawable) - { - return; - } - for (S32 i = 0; i < drawable->getNumFaces(); i++) { LLFace* facep = drawable->getFace(i); @@ -5224,7 +5251,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) LLGLDepthTest depth(GL_FALSE, GL_FALSE); gGL.color4f(1,1,1,1); - gGL.color4ub(64,64,64,1); + gGL.color4ub(64,64,64,255); gGL.begin(LLVertexBuffer::QUADS); gGL.vertex3fv((pos+left-up).mV); gGL.vertex3fv((pos-left-up).mV); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index ac2c32fedd..389b80813d 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -389,6 +389,8 @@ public: static BOOL sRenderGlow; static BOOL sTextureBindTest; static BOOL sRenderFrameTest; + static BOOL sRenderAttachedLights; + static BOOL sRenderAttachedParticles; //screen texture LLRenderTarget mScreen; @@ -403,10 +405,6 @@ public: //texture for making the glow LLRenderTarget mGlow[3]; - - //framebuffer objects for off-screen scratch space - //GLuint mFramebuffer[4]; - //GLuint mDepthbuffer[2]; //dynamic cube map scratch space LLPointer<LLCubeMap> mCubeBuffer; diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml index b71cffac63..0f1541a385 100644 --- a/indra/newview/skins/default/xui/ja/floater_joystick.xml +++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="Joystick" title="ジョイスティックの設定">
<check_box name="enable_joystick" width="120" >
ジョイスティックを使う:
@@ -112,9 +112,15 @@ <text left="0" name="ZoomDeadZone" width="140">
ズーム・デッド・ゾーン
</text>
- <spinner left="275" name="FlycamAxisDeadZone6" width="50" />
- <button label="SpaceNavigatorのデフォルト設定" left="330"
- name="SpaceNavigatorDefaults" width="210" />
+ <spinner left="275" width="50" name="FlycamAxisDeadZone6" />
+ <button label="SpaceNavigatorのデフォルト設定" name="SpaceNavigatorDefaults" width="210" left="330"/>
+
+ <string name="JoystickMonitor">
+ ジョイスティック・モニター
+ </string>
+ <string name="Axis">
+ 軸 [NUM]
+ </string>
<string name="NoDevice">
デバイスは検出されませんでした
</string>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 58acbaf3d1..caa691a0b4 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -388,6 +388,7 @@ class DarwinManifest(ViewerManifest): self.path("licenses-mac.txt", dst="licenses.txt") self.path("featuretable_mac.txt") self.path("secondlife.icns") + self.path("SecondLife.nib") # Translations self.path("English.lproj") @@ -408,6 +409,10 @@ class DarwinManifest(ViewerManifest): #libfmodwrapper.dylib self.path(self.args['configuration'] + "/libfmodwrapper.dylib", "libfmodwrapper.dylib") + + # our apps + self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app") + self.path("../mac_updater/" + self.args['configuration'] + "/mac-updater.app", "mac-updater.app") # command line arguments for connecting to the proper grid self.put_in_file(self.flags_list(), 'arguments.txt') |