Ansariel 2020-06-17 12:10:19 +02:00
commit d4f53f90e7
175 changed files with 3681 additions and 2244 deletions

View File

@ -193,6 +193,7 @@ if (LINUX)
# linking can be very memory-hungry, especially the final viewer link
#set(CMAKE_CXX_LINK_FLAGS "-Wl,--no-keep-memory")
set(CMAKE_CXX_LINK_FLAGS "-Wl,--no-keep-memory -Wl,--build-id -Wl,-rpath,'$ORIGIN:$ORIGIN/../lib' -Wl,--exclude-libs,ALL")
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--no-keep-memory -Wl,--build-id -Wl,-rpath,'$ORIGIN:$ORIGIN/../lib' -Wl,--exclude-libs,ALL")
endif (NOT USESYSTEMLIBS)
set(CMAKE_CXX_FLAGS_DEBUG "-fno-inline ${CMAKE_CXX_FLAGS_DEBUG}")

View File

@ -55,7 +55,7 @@ LLAudioEngine_OpenAL::~LLAudioEngine_OpenAL()
bool LLAudioEngine_OpenAL::init(const S32 num_channels, void* userdata, const std::string &app_title)
{
mWindGen = NULL;
LLAudioEngine::init(num_channels, userdata);
LLAudioEngine::init(num_channels, userdata, app_title);
if(!alutInit(NULL, NULL))
{

View File

@ -36,6 +36,12 @@
#include "llpreprocessor.h"
#include <boost/static_assert.hpp>
// <FS:ND> Supress some false positives of PVS Studio.
// They are misleading as there is opossibly a pointr taken behid the array and that pointer is passed down. But it's never dereferenced.
//-V:llassert_always:557
//-V:lllog_site_args_:557
// </FS:ND>
const int LL_ERR_NOERR = 0;
// Define one of these for different error levels in release...

View File

@ -40,7 +40,7 @@ namespace
const LLUUID IMG_HALO("12149143-f599-91a7-77ac-b52a3c0f59cd");
}
namespace {
//namespace {
LLQuaternion convert_azimuth_and_altitude_to_quat(F32 azimuth, F32 altitude)
{
F32 sinTheta = sin(azimuth);
@ -64,7 +64,7 @@ namespace {
return quat;
}
}
//}
static LLTrace::BlockTimerStatHandle FTM_BLEND_SKYVALUES("Blending Sky Environment");
static LLTrace::BlockTimerStatHandle FTM_RECALCULATE_SKYVALUES("Recalculate Sky");

View File

@ -115,6 +115,9 @@ class LLVector3d
friend LLVector3d operator*(const F64 k, const LLVector3d& a); // Return a times scaler k
friend bool operator==(const LLVector3d& a, const LLVector3d& b); // Return a == b
friend bool operator!=(const LLVector3d& a, const LLVector3d& b); // Return a != b
// [RLVa:KB] - RlvBehaviourModifierCompMin/Max
friend bool operator<(const LLVector3 &a, const LLVector3 &b); // Return a < b
// [/RLVa:KB]
friend const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b); // Return vector a + b
friend const LLVector3d& operator-=(LLVector3d& a, const LLVector3d& b); // Return vector a minus b
@ -395,6 +398,17 @@ inline bool operator!=(const LLVector3d& a, const LLVector3d& b)
||(a.mdV[2] != b.mdV[2]));
}
// [RLVa:KB] - RlvBehaviourModifierCompMin/Max
inline bool operator<(const LLVector3d& lhs, const LLVector3d& rhs)
{
return (lhs.mdV[0] < rhs.mdV[0]
|| (lhs.mdV[0] == rhs.mdV[0]
&& (lhs.mdV[1] < rhs.mdV[1]
|| ((lhs.mdV[1] == rhs.mdV[1])
&& lhs.mdV[2] < rhs.mdV[2]))));
}
// [/RLVa:KB]
inline const LLVector3d& operator+=(LLVector3d& a, const LLVector3d& b)
{
a.mdV[0] += b.mdV[0];

View File

@ -119,10 +119,6 @@ LLAvatarNameCache::LLAvatarNameCache()
mUsePeopleAPI = true;
// [RLVa:KB] - Checked: 2010-12-08 (RLVa-1.4.0a) | Added: RLVa-1.2.2c
mForceDisplayNames = false;
// [/RLVa:KB]
sHttpRequest = LLCore::HttpRequest::ptr_t(new LLCore::HttpRequest());
sHttpHeaders = LLCore::HttpHeaders::ptr_t(new LLCore::HttpHeaders());
sHttpOptions = LLCore::HttpOptions::ptr_t(new LLCore::HttpOptions());
@ -742,12 +738,12 @@ LLAvatarNameCache::callback_connection_t LLAvatarNameCache::getNameCallback(cons
// [RLVa:KB] - Checked: 2010-12-08 (RLVa-1.4.0a) | Added: RLVa-1.2.2c
bool LLAvatarNameCache::getForceDisplayNames()
{
return mForceDisplayNames;
return mRlvForceDisplayNames;
}
void LLAvatarNameCache::setForceDisplayNames(bool force)
{
mForceDisplayNames = force;
mRlvForceDisplayNames = force;
if ( (!LLAvatarName::useDisplayNames()) && (force) )
{
LLAvatarName::setUseDisplayNames(true);

View File

@ -163,6 +163,11 @@ private:
// For testing, there's a UsePeopleAPI setting that can be flipped (must restart viewer).
bool mUsePeopleAPI;
// [RLVa:KB] - Checked: 2010-12-08 (RLVa-1.4.0a) | Added: RLVa-1.2.2c
// RLVa override for display names
bool mRlvForceDisplayNames = false;
// [/RLVa:KB]
// Base lookup URL for name service.
// On simulator, loaded from indra.xml
// On viewer, usually a simulator capability (at People API team's request)
@ -191,10 +196,6 @@ private:
// Time when unrefreshed cached names were checked last.
F64 mLastExpireCheck;
// [RLVa:KB] - Checked: 2010-12-08 (RLVa-1.4.0a) | Added: RLVa-1.2.2c
bool mForceDisplayNames;
// [/RLVa:KB]
};
// Parse a cache-control header to get the max-age delta-seconds.

View File

@ -698,6 +698,14 @@ void LLVertexBuffer::drawElements(U32 mode, const S32 num_vertices, const LLVect
// </FS:Ansariel>
{
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
// <FS:Beq> FIRE-29679 trap empty calls that cause crashes when rezzing in OpenSim.
if(pos == nullptr || indicesp == nullptr )
{
LL_WARNS() << "Called drawElements with null pos or null indices" << LL_ENDL;
return;
}
// </FS:Beq>
// <FS:Ansariel> Crash fix due to invalid calls to drawElements by Drake Arconis
if (num_vertices <= 0)

View File

@ -850,6 +850,7 @@ set(viewer_SOURCE_FILES
qtoolalign.cpp
quickprefs.cpp
rlvactions.cpp
rlvenvironment.cpp
rlvhandler.cpp
rlvhelper.cpp
rlvcommon.cpp
@ -1607,6 +1608,7 @@ set(viewer_HEADER_FILES
pieslice.h
pipeline.h
rlvactions.h
rlvenvironment.h
rlvdefines.h
rlvhandler.h
rlvhelper.h

View File

@ -1910,11 +1910,6 @@ BOOL AOEngine::importNotecard(const LLInventoryItem* item)
if (item->getAssetUUID().notNull())
{
mImportSet = new AOSet(item->getParentUUID());
if (!mImportSet)
{
LLNotificationsUtil::add("AOImportCreateSetFailed", LLSD());
return FALSE;
}
mImportSet->setName(item->getName());
LLUUID* newUUID = new LLUUID(item->getAssetUUID());

View File

@ -631,6 +631,8 @@
tooltip_ref="Command_Environments_Tooltip"
execute_function="Floater.ToggleOrBringToFront"
execute_parameters="my_environments"
is_enabled_function="RLV.EnableIfNot"
is_enabled_parameters="setenv"
is_running_function="Floater.IsOpen"
is_running_parameters="my_environments"
/>

File diff suppressed because it is too large Load Diff

View File

@ -85,6 +85,17 @@ bool is_irc_me_prefix(const std::string& text)
return (prefix == "/me " || prefix == "/me'");
}
std::string unescape_name(const std::string& name)
{
// bugfix for SL-46920: preventing filenames that break stuff.
char * curl_str = curl_unescape(name.c_str(), name.size());
std::string unescaped_name(curl_str);
curl_free(curl_str);
curl_str = NULL;
return unescaped_name;
}
std::string FSCommon::applyAutoCloseOoc(std::string message)
{
if (!gSavedSettings.getBOOL("AutoCloseOOC"))

View File

@ -40,6 +40,7 @@ const F32 AVATAR_UNKNOWN_RANGE = -1.f;
void report_to_nearby_chat(const std::string& message);
std::string format_string(std::string text, const LLStringUtil::format_map_t& args);
bool is_irc_me_prefix(const std::string& text);
std::string unescape_name(const std::string& name);
namespace FSCommon
{

View File

@ -333,7 +333,7 @@ S32 FSFloaterVRAMUsage::calcVBOEntrySize( LLVertexBuffer *aVBO )
void FSFloaterVRAMUsage::onProperties( LLSelectNode const *aProps )
{
if( !aProps && !aProps->getObject() )
if( !aProps || !aProps->getObject() )
return;
LLUUID id = aProps->getObject()->getID();

View File

@ -13,6 +13,7 @@
#include "llviewerprecompiledheaders.h"
#include "fscommon.h"
#include "lggbeammaps.h"
#include "lggbeamscolors.h"
#include "llagent.h"
@ -27,17 +28,6 @@
lggBeamMaps gLggBeamMaps;
std::string unescape_name(const std::string& name)
{
// bugfix for SL-46920: preventing filenames that break stuff.
char * curl_str = curl_unescape(name.c_str(), name.size());
std::string unescaped_name(curl_str);
curl_free(curl_str);
curl_str = NULL;
return unescaped_name;
}
F32 hueToRgb(F32 val1In, F32 val2In, F32 valHUeIn)
{
while (valHUeIn < 0.0f)
@ -70,7 +60,7 @@ F32 hueToRgb(F32 val1In, F32 val2In, F32 valHUeIn)
void hslToRgb(F32 hValIn, F32 sValIn, F32 lValIn, F32& rValOut, F32& gValOut, F32& bValOut)
{
if (sValIn < 0.00001f)
if (sValIn < F_ALMOST_ZERO)
{
rValOut = lValIn;
gValOut = lValIn;
@ -400,4 +390,3 @@ void lggBeamMaps::updateBeamChat(const LLVector3d& currentPos)
}
}
}

View File

@ -18,9 +18,6 @@
#include "llviewerprecompiledheaders.h"
#include "lggbeamscolors.h"
#include "llfile.h"
#include "llsdserialize.h"
lggBeamsColors lggBeamsColors::fromLLSD(const LLSD& inputData)
{
lggBeamsColors toReturn;

View File

@ -219,16 +219,21 @@ void LLAgentCamera::init()
mCameraPreset = (ECameraPreset) gSavedSettings.getU32("CameraPresetType");
mCameraOffsetInitial = gSavedSettings.getControl("CameraOffsetRearView");
mFocusOffsetInitial = gSavedSettings.getControl("FocusOffsetRearView");
//// [RLVa:KB] - Checked: RLVa-2.0.0
// mCameraOffsetInitial[CAMERA_RLV_SETCAM_VIEW] = gSavedSettings.declareVec3("CameraOffsetRLVaView", LLVector3(mCameraOffsetInitial[CAMERA_PRESET_REAR_VIEW]->getDefault()), "Declared in code", LLControlVariable::PERSIST_NO);
// mCameraOffsetInitial[CAMERA_RLV_SETCAM_VIEW]->setHiddenFromSettingsEditor(true);
//// [/RLVa:KB]
//// [RLVa:KB] - Checked: RLVa-2.0.0
// mFocusOffsetInitial[CAMERA_RLV_SETCAM_VIEW] = gSavedSettings.declareVec3("FocusOffsetRLVaView", LLVector3(mFocusOffsetInitial[CAMERA_PRESET_REAR_VIEW]->getDefault()), "Declared in code", LLControlVariable::PERSIST_NO);
// mFocusOffsetInitial[CAMERA_RLV_SETCAM_VIEW]->setHiddenFromSettingsEditor(true);
//// [/RLVa:KB]
// mCameraOffsetInitial = gSavedSettings.getControl("CameraOffsetRearView");
// mFocusOffsetInitial = gSavedSettings.getControl("FocusOffsetRearView");
// [RLVa:KB] - @setcam_eyeoffset, @setcam_focusoffset and @setcam_eyeoffsetscale
mCameraOffsetInitialControl = gSavedSettings.getControl("CameraOffsetRearView");
mFocusOffsetInitialControl = gSavedSettings.getControl("FocusOffsetRearView");
if (RlvActions::isRlvEnabled())
{
mRlvCameraOffsetInitialControl = gSavedSettings.declareVec3("CameraOffsetRLVaView", LLVector3::zero, "Declared in code", LLControlVariable::PERSIST_NO);
mRlvCameraOffsetInitialControl->setHiddenFromSettingsEditor(true);
mRlvCameraOffsetScaleControl = gSavedSettings.declareF32("CameraOffsetScaleRLVa", 0.0f, "Declared in code", LLControlVariable::PERSIST_NO);
mRlvCameraOffsetScaleControl->setHiddenFromSettingsEditor(true);
mRlvFocusOffsetInitialControl = gSavedSettings.declareVec3d("FocusOffsetRLVaView", LLVector3d::zero, "Declared in code", LLControlVariable::PERSIST_NO);
mRlvFocusOffsetInitialControl->setHiddenFromSettingsEditor(true);
}
// [/RLVa:KB]
mCameraCollidePlane.clearVec();
mCurrentCameraDistance = getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale");
@ -1014,7 +1019,10 @@ void LLAgentCamera::cameraOrbitIn(const F32 meters)
{
if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON)
{
F32 camera_offset_dist = llmax(0.001f, getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale"));
// [RLVa:KB] - @setcam_eyeoffsetscale
F32 camera_offset_dist = llmax(0.001f, getCameraOffsetInitial().magVec() * getCameraOffsetScale());
// [/RLVa:KB]
// F32 camera_offset_dist = llmax(0.001f, getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale"));
mCameraZoomFraction = (mTargetCameraDistance - meters) / camera_offset_dist;
@ -1727,7 +1735,10 @@ LLVector3d LLAgentCamera::calcThirdPersonFocusOffset()
agent_rot *= ((LLViewerObject*)(gAgentAvatarp->getParent()))->getRenderRotation();
}
focus_offset = convert_from_llsd<LLVector3d>(mFocusOffsetInitial->get(), TYPE_VEC3D, "");
// focus_offset = convert_from_llsd<LLVector3d>(mFocusOffsetInitial->get(), TYPE_VEC3D, "");
// [RLVa:KB] - @setcam_focusoffset
focus_offset = getFocusOffsetInitial();
// [/RLVa:KB]
return focus_offset * agent_rot;
}
@ -1868,7 +1879,10 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)
}
else
{
local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale");
// [RLVa:KB] - @setcam_eyeoffsetscale
local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * getCameraOffsetScale();
// [/RLVa:KB]
// local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale");
// are we sitting down?
if (isAgentAvatarValid() && gAgentAvatarp->getParent())
@ -2064,7 +2078,10 @@ LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)
// Check focus distance limits
if ( (fCamOriginDistClamped) && (!fCamAvDistLocked) )
{
const LLVector3 offsetCameraLocal = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale");
// const LLVector3 offsetCameraLocal = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale");
// [RLVa:KB] - @setcam_eyeoffsetscale
const LLVector3 offsetCameraLocal = mCameraZoomFraction * getCameraOffsetInitial() * getCameraOffsetScale();
// [/RLVa:KB]
const LLVector3d offsetCamera(gAgent.getFrameAgent().rotateToAbsolute(offsetCameraLocal));
const LLVector3d posFocusCam = frame_center_global + head_offset + offsetCamera;
if (clampCameraPosition(camera_position_global, posFocusCam, nCamOriginDistLimitMin, nCamOriginDistLimitMax))
@ -2171,14 +2188,27 @@ bool LLAgentCamera::isJoystickCameraUsed()
LLVector3 LLAgentCamera::getCameraOffsetInitial()
{
return convert_from_llsd<LLVector3>(mCameraOffsetInitial->get(), TYPE_VEC3, "");
// [RLVa:KB] - @setcam_eyeoffset
return convert_from_llsd<LLVector3>( (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? mCameraOffsetInitialControl->get() : mRlvCameraOffsetInitialControl->get(), TYPE_VEC3, "");
// [/RLVa:KB]
// return convert_from_llsd<LLVector3>(mCameraOffsetInitial->get(), TYPE_VEC3, "");
}
LLVector3d LLAgentCamera::getFocusOffsetInitial()
{
return convert_from_llsd<LLVector3d>(mFocusOffsetInitial->get(), TYPE_VEC3D, "");
// [RLVa:KB] - @setcam_focusoffset
return convert_from_llsd<LLVector3d>( (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? mFocusOffsetInitialControl->get() : mRlvFocusOffsetInitialControl->get(), TYPE_VEC3D, "");
// [/RLVa:KB]
// return convert_from_llsd<LLVector3d>(mFocusOffsetInitial->get(), TYPE_VEC3D, "");
}
// [RLVa:KB] - @setcam_eyeoffsetscale
F32 LLAgentCamera::getCameraOffsetScale() const
{
return gSavedSettings.getF32( (ECameraPreset::CAMERA_RLV_SETCAM_VIEW != mCameraPreset) ? "CameraOffsetScale" : "CameraOffsetScaleRLVa");
}
// [/RLVa:KB]
// <FS:Ansariel> FIRE-23470: Fix camera controls zoom glitch
//F32 LLAgentCamera::getCameraMaxZoomDistance()
F32 LLAgentCamera::getCameraMaxZoomDistance(bool allow_disabled_constraints /* = false*/)
@ -2268,10 +2298,16 @@ void LLAgentCamera::handleScrollWheel(S32 clicks)
F32 camera_offset_initial_mag = getCameraOffsetInitial().magVec();
F32 current_zoom_fraction = mTargetCameraDistance / (camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
// F32 current_zoom_fraction = mTargetCameraDistance / (camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
// [RLVa:KB] - @setcam_eyeoffsetscale
F32 current_zoom_fraction = mTargetCameraDistance / (camera_offset_initial_mag * getCameraOffsetScale());
// [/RLVa:KB]
current_zoom_fraction *= 1.f - pow(ROOT_ROOT_TWO, clicks);
cameraOrbitIn(current_zoom_fraction * camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
// [RLVa:KB] - @setcam_eyeoffsetscale
cameraOrbitIn(current_zoom_fraction * camera_offset_initial_mag * getCameraOffsetScale());
// [/RLVa:KB]
// cameraOrbitIn(current_zoom_fraction * camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
}
else
{
@ -2623,22 +2659,27 @@ void LLAgentCamera::changeCameraToCustomizeAvatar()
void LLAgentCamera::switchCameraPreset(ECameraPreset preset)
{
// [RLVa:KB] - Checked: RLVa-2.0.0
// [RLVa:KB] - @setcam family
if (RlvActions::isRlvEnabled())
{
// Don't allow changing away from the our view if an object is restricting it
// Don't allow changing away from our view if an object is restricting it
if (RlvActions::isCameraPresetLocked())
preset = CAMERA_RLV_SETCAM_VIEW;
// Don't reset anything if our view is already current
if ( (CAMERA_RLV_SETCAM_VIEW == preset) && (CAMERA_RLV_SETCAM_VIEW == mCameraPreset) )
return;
// Reset our view when switching away
if (CAMERA_RLV_SETCAM_VIEW != preset)
if (CAMERA_RLV_SETCAM_VIEW == preset)
{
//mCameraOffsetInitial[CAMERA_RLV_SETCAM_VIEW]->resetToDefault();
//mFocusOffsetInitial[CAMERA_RLV_SETCAM_VIEW]->resetToDefault();
if (CAMERA_RLV_SETCAM_VIEW == mCameraPreset)
{
// Don't reset anything if our view is already current
return;
}
else
{
// When switching to our view, copy the current values
mRlvCameraOffsetInitialControl->setDefaultValue(convert_to_llsd(getCameraOffsetInitial()));
mRlvFocusOffsetInitialControl->setDefaultValue(convert_to_llsd(getFocusOffsetInitial()));
mRlvCameraOffsetScaleControl->setDefaultValue(getCameraOffsetScale());
}
}
}
// [/RLVa:KB]

View File

@ -61,9 +61,9 @@ enum ECameraPreset
/** Current view when a preset is saved */
CAMERA_PRESET_CUSTOM,
// [RLVa:KB] - Checked: RLVa-2.0.0
// [RLVa:KB] - @setcam_eyeoffset and @setcam_focusoffset
/* Used by RLVa */
CAMERA_RLV_SETCAM_VIEW
CAMERA_RLV_SETCAM_VIEW,
// [/RLVa:KB]
};
@ -116,9 +116,17 @@ private:
// Preset
//--------------------------------------------------------------------
public:
// [RLVa:KB] - @setcam family
/** Determines default camera offset scale depending on the current camera preset */
ECameraPreset getCameraPreset() const { return mCameraPreset; }
// [/RLVa:KB]
void switchCameraPreset(ECameraPreset preset);
/** Determines default camera offset depending on the current camera preset */
LLVector3 getCameraOffsetInitial();
// [RLVa:KB] - @setcam_eyeoffsetscale
/** Determines default camera offset scale depending on the current camera preset */
F32 getCameraOffsetScale() const;
// [/RLVa:KB]
/** Determines default focus offset depending on the current camera preset */
LLVector3d getFocusOffsetInitial();
@ -140,10 +148,24 @@ private:
ECameraPreset mCameraPreset;
/** Initial camera offset */
LLPointer<LLControlVariable> mCameraOffsetInitial;
// LLPointer<LLControlVariable> mCameraOffsetInitial;
// [RLVa:KB] - @setcam_eyeoffset
// Renamed to catch their uses
LLPointer<LLControlVariable> mCameraOffsetInitialControl;
LLPointer<LLControlVariable> mRlvCameraOffsetInitialControl;
// [/RLVa:KB]
// [RLVa:KB] - @setcam_eyeoffsetscale
LLPointer<LLControlVariable> mRlvCameraOffsetScaleControl;
// [/RLVa:KB]
/** Initial focus offset */
LLPointer<LLControlVariable> mFocusOffsetInitial;
// LLPointer<LLControlVariable> mFocusOffsetInitial;
// [RLVa:KB] - @setcam_focusoffset
// Renamed to catch their uses
LLPointer<LLControlVariable> mFocusOffsetInitialControl;
LLPointer<LLControlVariable> mRlvFocusOffsetInitialControl;
// [/RLVa:KB]
LLQuaternion mInitSitRot;

View File

@ -457,6 +457,11 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht
AISUpdate::parseUUIDArray(result, "_created_categories", ids);
}
break;
case UPDATECATEGORY:
{
AISUpdate::parseUUIDArray(result, "_updated_categories", ids);
}
break;
default:
break;
}

View File

@ -6277,6 +6277,10 @@ void LLAppViewer::disconnectViewer()
LLAppearanceMgr::instance().setAttachmentInvLinkEnable(false);
// [/SL:KB]
// [RLVa:KB] - Checked: RLVa-2.3 (Housekeeping)
SUBSYSTEM_CLEANUP(RlvHandler);
// [/RLVa:KB]
gAgentWearables.cleanup();
gAgentCamera.cleanup();
// Also writes cached agent settings to gSavedSettings

View File

@ -33,6 +33,7 @@
#include "llagent.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewerregion.h"
#include "llviewernetwork.h" // <FS:Beq/> for LLGridManager
#include "llwlhandlers.h"
#include "lltrans.h"
#include "lltrace.h"
@ -65,6 +66,12 @@
#include "llviewergenericmessage.h"
#include "llexperiencelog.h"
// [RLVa:KB] - Checked: RLVa-2.4 (@setenv)
#include "rlvactions.h"
// [/RLVa:KB]
#include "fscommon.h"
#include "llviewernetwork.h"
//=========================================================================
namespace
{
@ -821,6 +828,70 @@ LLEnvironment::LLEnvironment():
mShowMoonBeacon(false)
{
}
// <FS:Beq> OpenSim legacy Windlight setting support
#ifdef OPENSIM
void LLEnvironment::loadLegacyPresets()
{
std::string path_name;
std::vector<decltype(LL_PATH_APP_SETTINGS)> folders = { LL_PATH_APP_SETTINGS, LL_PATH_USER_SETTINGS };
for (auto & settings_path : folders)
{
path_name = gDirUtilp->getExpandedFilename(settings_path , "windlight", "skies", "");
bool found = true;
while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
if (found)
{
name = name.erase(name.length() - 4);
mLegacySkies.push_back(unescape_name(name));
LL_DEBUGS("WindlightCaps") << "Added Legacy Sky: " << unescape_name(name) << LL_ENDL;
}
}
path_name = gDirUtilp->getExpandedFilename(settings_path, "windlight", "water", "");
found = true;
while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
if (found)
{
name = name.erase(name.length() - 4);
mLegacyWater.push_back(unescape_name(name));
LL_DEBUGS("WindlightCaps") << "Added Legacy Water: " << unescape_name(name) << LL_ENDL;
}
}
path_name = gDirUtilp->getExpandedFilename(settings_path, "windlight", "days", "");
found = true;
while (found)
{
std::string name;
found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name);
if (found)
{
name = name.erase(name.length() - 4);
mLegacyDayCycles.push_back(unescape_name(name));
LL_DEBUGS("WindlightCaps") << "Added Legacy Day Cycle: " << unescape_name(name) << LL_ENDL;
}
}
}
}
void LLEnvironment::loadUserPrefs()
{
// operate on members directly to avoid side effects
mWaterPresetName = gSavedSettings.getString("WaterPresetName");
mSkyPresetName = gSavedSettings.getString("SkyPresetName");
mDayCycleName = gSavedSettings.getString("DayCycleName");
}
#endif //opensim
//</FS:Beq>
void LLEnvironment::initSingleton()
{
@ -833,6 +904,16 @@ void LLEnvironment::initSingleton()
mEnvironments[ENV_DEFAULT] = mCurrentEnvironment;
// <FS:Beq> OpenSim legacy Windlight setting support
#ifdef OPENSIM
if (LLGridManager::instance().isInOpenSim())
{
loadLegacyPresets();
loadUserPrefs();
}
#endif
// </FS:Beq>
requestRegion();
gAgent.addParcelChangedCallback([this]() { onParcelChange(); });
@ -1057,6 +1138,13 @@ bool LLEnvironment::getIsMoonUp() const
//-------------------------------------------------------------------------
void LLEnvironment::setSelectedEnvironment(LLEnvironment::EnvSelection_t env, LLSettingsBase::Seconds transition, bool forced)
{
// [RLVa:KB] - Checked: RLVa-2.4 (@setenv)
if ( (!RlvActions::canChangeEnvironment()) && (LLEnvironment::ENV_EDIT != env) )
{
return;
}
// [/RLVa:KB]
mSelectedEnvironment = env;
updateEnvironment(transition, forced);
}
@ -1221,7 +1309,7 @@ void LLEnvironment::onSetEnvAssetLoaded(EnvSelection_t env,
if (!settings || status)
{
LLSD args;
args["DESC"] = asset_id.asString();
args["NAME"] = asset_id.asString();// <FS:Beq/> fix the args to match the template.
LLNotificationsUtil::add("FailedToFindSettings", args);
return;
}
@ -1367,12 +1455,12 @@ void LLEnvironment::updateEnvironment(LLSettingsBase::Seconds transition, bool f
{
if (transition != TRANSITION_INSTANT)
{
DayInstance::ptr_t trans = std::make_shared<DayTransition>(
mCurrentEnvironment->getSky(), mCurrentEnvironment->getWater(), pinstance, transition);
trans->animate();
mCurrentEnvironment = trans;
DayInstance::ptr_t trans = std::make_shared<DayTransition>(
mCurrentEnvironment->getSky(), mCurrentEnvironment->getWater(), pinstance, transition);
trans->animate();
mCurrentEnvironment = trans;
}
else
{
@ -1618,8 +1706,14 @@ void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentI
if (!envinfo->mDayCycle)
{
clearEnvironment(ENV_PARCEL);
setEnvironment(ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET, envinfo->mEnvVersion);
updateEnvironment();
// <FS:Beq> opensim legacy windlight. Nothing we can do here as the default assets do not exist in OpenSim
LL_WARNS("ENVIRONMENT") << "No DayCycle specified - setting default" << LL_ENDL;
if(LLGridManager::getInstance()->isInSecondLife())
{
setEnvironment(ENV_REGION, LLSettingsDay::GetDefaultAssetId(), LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET, envinfo->mEnvVersion);
updateEnvironment();
}
// </FS:Beq>
}
else if (envinfo->mDayCycle->isTrackEmpty(LLSettingsDay::TRACK_WATER)
|| envinfo->mDayCycle->isTrackEmpty(LLSettingsDay::TRACK_GROUND_LEVEL))
@ -2152,10 +2246,14 @@ LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extractLeg
pinfo->mDayHash = pinfo->mDayCycle->getHash();
pinfo->mAltitudes[0] = 0;
pinfo->mAltitudes[2] = 10001;
pinfo->mAltitudes[3] = 10002;
pinfo->mAltitudes[4] = 10003;
// <FS:Beq> Fix typos that offset this by 1. Shoudl get fixed in a merge from the lab soon.
// pinfo->mAltitudes[2] = 10001;
// pinfo->mAltitudes[3] = 10002;
// pinfo->mAltitudes[4] = 10003;
pinfo->mAltitudes[1] = 10001;
pinfo->mAltitudes[2] = 10002;
pinfo->mAltitudes[3] = 10003;
// </FS:Beq>
return pinfo;
}
@ -2361,7 +2459,7 @@ void LLEnvironment::onSetExperienceEnvAssetLoaded(LLUUID experience_id, LLSettin
if (!settings || status)
{
LLSD args;
args["DESC"] = experience_id.asString();
args["NAME"] = experience_id.asString();// <FS:Beq/> fix the args to match the template.
LLNotificationsUtil::add("FailedToFindSettings", args);
return;
}

View File

@ -374,6 +374,20 @@ private:
experience_overrides_t mExperienceOverrides;
DayInstance::ptr_t getEnvironmentInstance(EnvSelection_t env, bool create = false);
// <FS:Beq> opensim windlight setting
#ifdef OPENSIM
public:
std::vector<std::string> mLegacySkies;
std::vector<std::string> mLegacyWater;
std::vector<std::string> mLegacyDayCycles;
std::string mWaterPresetName;
std::string mSkyPresetName;
std::string mDayCycleName;
private:
void loadLegacyPresets();
void loadUserPrefs();
#endif
// </FS:Beq>
void updateCloudScroll();

View File

@ -45,6 +45,9 @@
#include "llhints.h"
#include "lltabcontainer.h"
#include "llvoavatarself.h"
// [RLVa:KB] - @setcam
#include "rlvactions.h"
// [/RLVa:KB]
static LLDefaultChildRegistry::Register<LLPanelCameraItem> r("panel_camera_item");
@ -626,6 +629,13 @@ void LLFloaterCamera::onClickCameraItem(const LLSD& param)
/*static*/
void LLFloaterCamera::switchToPreset(const std::string& name)
{
// [RLVa:KB] - @setcam family
if (RlvActions::isCameraPresetLocked())
{
return;
}
// [/RLVa:KB]
sFreeCamera = false;
clear_camera_tool();
if (PRESETS_REAR_VIEW == name)

View File

@ -120,7 +120,6 @@
#include "llweb.h"
// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a)
#include "rlvactions.h"
#include "rlvhandler.h"
// [/RLVa:KB]
#include "lllogininstance.h" // to check if logged in yet
@ -2198,7 +2197,7 @@ void LLFloaterPreference::refreshEnabledState()
LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections");
// [RLVa:KB] - Checked: 2013-05-11 (RLVa-1.4.9)
if (rlv_handler_t::isEnabled())
if (RlvActions::isRlvEnabled())
{
getChild<LLUICtrl>("do_not_disturb_response")->setEnabled(!RlvActions::hasBehaviour(RLV_BHVR_SENDIM));
}
@ -2252,11 +2251,11 @@ void LLFloaterPreference::refreshEnabledState()
LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail");
// ctrl_wind_light->setEnabled(TRUE);
// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a) | Modified: RLVa-0.2.0a
// "Atmospheric Shaders" can't be disabled - but can be enabled - under @setenv=n
ctrl_wind_light->setEnabled((!gRlvHandler.hasBehaviour(RLV_BHVR_SETENV)) || (!gSavedSettings.getBOOL("WindLightUseAtmosShaders")) );
ctrl_wind_light->setEnabled( (RlvActions::canChangeEnvironment()) || (!gSavedSettings.getBOOL("WindLightUseAtmosShaders")));
// [/RLVa:KB]
// ctrl_wind_light->setEnabled(TRUE);
sky->setEnabled(TRUE);
@ -2347,11 +2346,11 @@ void LLFloaterPreferenceGraphicsAdvanced::refreshEnabledState()
LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders");
LLSliderCtrl* sky = getChild<LLSliderCtrl>("SkyMeshDetail");
LLTextBox* sky_text = getChild<LLTextBox>("SkyMeshDetailText");
// ctrl_wind_light->setEnabled(TRUE);
// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a) | Modified: RLVa-0.2.0a
// "Atmospheric Shaders" can't be disabled - but can be enabled - under @setenv=n
ctrl_wind_light->setEnabled(((!gRlvHandler.hasBehaviour(RLV_BHVR_SETENV)) || (!gSavedSettings.getBOOL("WindLightUseAtmosShaders"))) );
// "Atmospheric Shaders" can't be disabled - but can be enabled - under @setenv=n
ctrl_wind_light->setEnabled( (RlvActions::canChangeEnvironment()) || (!gSavedSettings.getBOOL("WindLightUseAtmosShaders")));
// [/RLVa:KB]
// ctrl_wind_light->setEnabled(TRUE);
sky->setEnabled(TRUE);
sky_text->setEnabled(TRUE);

View File

@ -751,7 +751,6 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
(message.length() > 3) && (RLV_CMD_PREFIX == message[0]) && (RlvHandler::instance().processIMQuery(from_id, message)) )
{
// Eat the message and do nothing
return;
}
// [/RLVa:KB]
// else if (offline == IM_ONLINE
@ -1737,7 +1736,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
// If we auto-accept the offer/request then this will override DnD status (but we'll still let the other party know later)
bool fRlvAutoAccept = (rlv_handler_t::isEnabled()) &&
( ((IM_LURE_USER == dialog) && (RlvActions::autoAcceptTeleportOffer(from_id))) ||
((IM_TELEPORT_REQUEST == dialog) && (RlvActions::autoAcceptTeleportRequest(from_id))) );
((IM_TELEPORT_REQUEST == dialog) && (RlvActions::autoAcceptTeleportRequest(from_id))) );
// [/RLVa:KB]
if (is_muted)
@ -1822,7 +1821,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
if (rlv_handler_t::isEnabled())
{
if ( ((IM_LURE_USER == dialog) && (!RlvActions::canAcceptTpOffer(from_id))) ||
((IM_TELEPORT_REQUEST == dialog) && (!RlvActions::canAcceptTpRequest(from_id))) )
((IM_TELEPORT_REQUEST == dialog) && (!RlvActions::canAcceptTpRequest(from_id))) )
{
RlvUtil::sendBusyMessage(from_id, RlvStrings::getString(RLV_STRING_BLOCKED_TPLUREREQ_REMOTE));
if (is_do_not_disturb)
@ -1832,7 +1831,7 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
// Censor message if: 1) restricted from receiving IMs from the sender, or 2) teleport offer/request and @showloc=n restricted
if ( (!RlvActions::canReceiveIM(from_id)) ||
((gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) && (IM_LURE_USER == dialog || IM_TELEPORT_REQUEST == dialog)) )
((gRlvHandler.hasBehaviour(RLV_BHVR_SHOWLOC)) && (IM_LURE_USER == dialog || IM_TELEPORT_REQUEST == dialog)) )
{
message = RlvStrings::getString(RLV_STRING_HIDDEN);
}

View File

@ -386,7 +386,10 @@ void update_all_marketplace_count()
return;
}
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name)
//void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name)
// [RLVa:KB] - Checked: RLVa-2.3 (Give-to-#RLV)
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name, LLPointer<LLInventoryCallback> cb)
// [/RLVa:KB]
{
LLViewerInventoryCategory* cat;
@ -400,7 +403,10 @@ void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::s
LLSD updates;
updates["name"] = new_name;
update_inventory_category(cat_id, updates, NULL);
// [RLVa:KB] - Checked: RLVa-2.3 (Give-to-#RLV)
update_inventory_category(cat_id, updates, cb);
// [/RLVa:KB]
// update_inventory_category(cat_id, updates, NULL);
}
void copy_inventory_category(LLInventoryModel* model,

View File

@ -72,7 +72,10 @@ void update_marketplace_category(const LLUUID& cat_id, bool perform_consistency_
// Nudge all listing categories to signal that their marketplace status changed
void update_all_marketplace_count();
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name);
// [RLVa:KB] - Checked: RLVa-2.3 (Give-to-#RLV)
void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name, LLPointer<LLInventoryCallback> cb = nullptr);
// [/RLVa:KB]
//void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name);
void copy_inventory_category(LLInventoryModel* model, LLViewerInventoryCategory* cat, const LLUUID& parent_id, const LLUUID& root_copy_id = LLUUID::null, bool move_no_copy_items = false);

View File

@ -340,12 +340,12 @@ void LLPreviewNotecard::loadAsset()
{
editor->setEnabled(FALSE);
getChildView("lock")->setVisible( TRUE);
getChildView("Edit")->setEnabled(FALSE); // <FS:LO> Don't enable external editor button on no mod notecards.
}
if((allow_modify || is_owner) && !source_library)
{
getChildView("Delete")->setEnabled(TRUE);
getChildView("Edit")->setEnabled(FALSE); // <FS:LO> Don't enable external editor button on no mod notecards.
}
}
else

View File

@ -463,7 +463,10 @@ void LLProgressView::initLogos()
const S32 default_height = 28;
const S32 default_pad = 15;
S32 icon_width, icon_height;
S32 icon_width;
#if defined(LL_FMODSTUDIO) || defined(HAVOK_TPV)
S32 icon_height;
#endif // defined(LL_FMODSTUDIO) || defined(HAVOK_TPV)
// We don't know final screen rect yet, so we can't precalculate position fully
LLTextBox *logos_label = getChild<LLTextBox>("logos_lbl");
@ -478,12 +481,16 @@ void LLProgressView::initLogos()
temp_str += gDirUtilp->getDirDelimiter();
#if defined(LL_FMODSTUDIO) || defined(HAVOK_TPV)
S32 pad_y = 0; // <FS:Ansariel> Build fix
#endif // defined(LL_FMODSTUDIO) || defined(HAVOK_TPV)
#ifdef LL_FMODSTUDIO
// original image size is 264x96, it is on longer side but
// with no internal paddings so it gets additional padding
icon_width = 77;
icon_height = 21;
S32 pad_y = 4;
/*S32*/ pad_y = 4; // <FS:Ansariel> Build fix
texture_start_x++;
loadLogo(temp_str + "fmod_logo.png",
image_codec,

View File

@ -79,6 +79,7 @@
#include "llslurl.h"
#include "llstartup.h"
// [RLVa:KB] - Checked: 2015-12-27 (RLVa-1.5.0)
#include "rlvactions.h"
#include "rlvcommon.h"
// [/RLVa:KB]
@ -211,6 +212,15 @@ static bool handleAvatarHoverOffsetChanged(const LLSD& newvalue)
bool handleSetShaderChanged(const LLSD& newvalue)
// </FS:Ansariel>
{
// [RLVa:KB] - @setenv
if ( (!RlvActions::canChangeEnvironment()) && (LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders")) && (!gSavedSettings.getBOOL("WindLightUseAtmosShaders")) )
{
gSavedSettings.setBOOL("WindLightUseAtmosShaders", TRUE);
return true;
}
// [/RLVa:KB]
// changing shader level may invalidate existing cached bump maps, as the shader type determines the format of the bump map it expects - clear and repopulate the bump cache
gBumpImageList.destroyGL();
gBumpImageList.restoreGL();

View File

@ -253,7 +253,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
//----------------------------------------------------------------
llassert( !(mTexture.notNull() && mLayerSet) ); // mutually exclusive
LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP;
// LLTexUnit::eTextureAddressMode old_mode = LLTexUnit::TAM_WRAP; // <FS> Rye Mutt's broken local texture rendering fix
LLViewerTexLayerSet *layerset = dynamic_cast<LLViewerTexLayerSet*>(mLayerSet);
if (mTestImageName)
{
@ -283,12 +283,14 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
else
if ( !is_dummy && mTexture.notNull() )
{
if(mTexture->hasGLTexture())
{
old_mode = mTexture->getAddressMode();
}
// <FS> Rye Mutt's broken local texture rendering fix
//if(mTexture->hasGLTexture())
//{
// old_mode = mTexture->getAddressMode();
//}
// </FS>
gGL.getTexUnit(diffuse_channel)->bind(mTexture);
gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
//gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(LLTexUnit::TAM_CLAMP); // <FS> Rye Mutt's broken local texture rendering fix
}
else
{
@ -341,11 +343,13 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
gGL.getTexUnit(diffuse_channel)->setTextureBlendType(LLTexUnit::TB_MULT);
}
if (mTexture.notNull() && !is_dummy)
{
gGL.getTexUnit(diffuse_channel)->bind(mTexture);
gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(old_mode);
}
// <FS> Rye Mutt's broken local texture rendering fix
//if (mTexture.notNull() && !is_dummy)
//{
// gGL.getTexUnit(diffuse_channel)->bind(mTexture);
// gGL.getTexUnit(diffuse_channel)->setTextureAddressMode(old_mode);
//}
// </FS>
return triangle_count;
}

View File

@ -8792,15 +8792,16 @@ BOOL object_selected_and_point_valid(const LLSD& sdParam)
}
// [RLVa:KB] - Checked: 2010-03-16 (RLVa-1.2.0a) | Added: RLVa-1.2.0a
/*
BOOL object_is_wearable()
{
if (!isAgentAvatarValid())
{
return FALSE;
}
if (!object_selected_and_point_valid())
// if (!object_selected_and_point_valid())
// [RLVa:KB] - Checked: 2010-03-16 (RLVa-1.2.0a) | Added: RLVa-1.2.0a
if (!object_selected_and_point_valid(LLSD(0)))
// [/RLVa:KB]
{
return FALSE;
}
@ -8810,8 +8811,6 @@ BOOL object_is_wearable()
}
return gAgentAvatarp->canAttachMoreObjects();
}
*/
// [/RLVa:KB]
class LLAttachmentPointFilled : public view_listener_t
{
@ -10786,8 +10785,8 @@ class LLWorldEnvSettings : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
// [RLVa:KB] - Checked: 2010-03-18 (RLVa-1.2.0a) | Modified: RLVa-1.0.0g
if (gRlvHandler.hasBehaviour(RLV_BHVR_SETENV))
// [RLVa:KB] - @setenv
if (!RlvActions::canChangeEnvironment())
return true;
// [/RLVa:KB]
@ -11786,10 +11785,7 @@ void initialize_menus()
enable.add("Object.EnableOpen", boost::bind(&enable_object_open));
enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1));
enable.add("Object.EnableDelete", boost::bind(&enable_object_delete));
// enable.add("Object.EnableWear", boost::bind(&object_is_wearable));
// [RLVa:KB] - Checked: 2010-03-16 (RLVa-1.2.0a) | Added: RLVa-1.2.0a
enable.add("Object.EnableWear", boost::bind(&object_selected_and_point_valid, _2));
// [/RLVa:KB]
enable.add("Object.EnableWear", boost::bind(&object_is_wearable));
enable.add("Object.EnableStandUp", boost::bind(&enable_object_stand_up));
enable.add("Object.EnableSit", boost::bind(&enable_object_sit, _1));
@ -11873,11 +11869,8 @@ void initialize_menus()
// [RLVa:KB] - Checked: RLVa-2.0.0
enable.add("RLV.MainToggleVisible", boost::bind(&rlvMenuMainToggleVisible, _1));
//if (RlvActions::isRlvEnabled()) // <FS:Ansariel> FIRE-20539: Toolbar buttons don't show disabled state anymore
{
enable.add("RLV.CanShowName", boost::bind(&rlvMenuCanShowName));
enable.add("RLV.EnableIfNot", boost::bind(&rlvMenuEnableIfNot, _2));
}
enable.add("RLV.CanShowName", boost::bind(&rlvMenuCanShowName));
enable.add("RLV.EnableIfNot", boost::bind(&rlvMenuEnableIfNot, _2));
// [/RLVa:KB]
// <FS:Ansariel> Toggle internal web browser

View File

@ -2325,15 +2325,10 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
LLUUID destination;
bool accept = true;
// [RLVa:KB] - Checked: 2010-09-23 (RLVa-1.2.1)
bool fRlvNotifyAccepted = false;
// [/RLVa:KB]
// If user accepted, accept to proper folder, if user discarded, accept to trash.
switch(button)
{
case IOR_ACCEPT:
destination = mFolderID;
// [RLVa:KB] - Checked: 2010-09-23 (RLVa-1.2.1)
// Only treat the offer as 'Give to #RLV' if:
// - the user has enabled the feature
@ -2341,28 +2336,28 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
// - the name starts with the prefix - mDesc format: '[OBJECTNAME]' ( http://slurl.com/... )
if ( (rlv_handler_t::isEnabled()) && (IM_TASK_INVENTORY_OFFERED == mIM) && (LLAssetType::AT_CATEGORY == mType) && (mDesc.find(RLV_PUTINV_PREFIX) == 1) )
{
fRlvNotifyAccepted = true;
if (!RlvSettings::getForbidGiveToRLV())
{
const LLUUID& idRlvRoot = RlvInventory::instance().getSharedRootID();
if (idRlvRoot.notNull())
mFolderID = idRlvRoot;
fRlvNotifyAccepted = false; // "accepted_in_rlv" is sent from RlvGiveToRLVTaskOffer *after* we have the folder
// "accepted_in_rlv" is sent from RlvGiveToRLVTaskOffer *after* we have the folder
RlvGiveToRLVTaskOffer* pOfferObserver = new RlvGiveToRLVTaskOffer(mTransactionID);
gInventory.addObserver(pOfferObserver);
}
}
if (fRlvNotifyAccepted)
{
std::string::size_type idxToken = mDesc.find("' ( http://");
if (std::string::npos != idxToken)
RlvBehaviourNotifyHandler::sendNotification("accepted_in_inv inv_offer " + mDesc.substr(1, idxToken - 1));
else
{
std::string::size_type idxToken = mDesc.find("' ( http://");
if (std::string::npos != idxToken)
{
RlvBehaviourNotifyHandler::sendNotification("accepted_in_inv inv_offer " + mDesc.substr(1, idxToken - 1));
}
}
}
// [/RLVa:KB]
destination = mFolderID;
//don't spam user if flooded
if (check_offer_throttle(mFromName, true))
{

View File

@ -397,10 +397,10 @@ public:
void sendShapeUpdate();
// U8 getAttachmentState() { return mAttachmentState; }
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0a) | Added: RLVa-1.2.0a
U8 getAttachmentState() const { return mAttachmentState; }
U8 getAttachmentState() const { return mAttachmentState; }
// [/RLVa:KB]
// U8 getAttachmentState() { return mAttachmentState; }
F32 getAppAngle() const { return mAppAngle; }
F32 getPixelArea() const { return mPixelArea; }

View File

@ -60,7 +60,10 @@ LLViewerTexLayerSetBuffer::LLViewerTexLayerSetBuffer(LLTexLayerSet* const owner,
S32 width, S32 height) :
// ORDER_LAST => must render these after the hints are created.
LLTexLayerSetBuffer(owner),
LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ),
// <FS> Rye Mutt's broken local texture rendering fix
//LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ),
LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, FALSE ),
// </FS>
// <FS:Ansariel> [Legacy Bake]
mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates
mNeedsUpload(FALSE),

View File

@ -5302,11 +5302,12 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
LL_WARNS_ONCE("RenderMaterials") << "Oh no! No binormals for this alpha blended face!" << LL_ENDL;
}
bool selected = facep->getViewerObject()->isSelected();
// bool selected = facep->getViewerObject()->isSelected();
//
// if (selected && LLSelectMgr::getInstance()->mHideSelectedObjects)
// [RLVa:KB] - Checked: 2010-11-29 (RLVa-1.3.0c) | Modified: RLVa-1.3.0c
const LLViewerObject* pObj = facep->getViewerObject();
bool selected = pObj->isSelected();
if ( (pObj->isSelected() && LLSelectMgr::getInstance()->mHideSelectedObjects) &&
( (!RlvActions::isRlvEnabled()) ||
( ((!pObj->isHUDAttachment()) || (!gRlvAttachmentLocks.isLockedAttachment(pObj->getRootEdit()))) &&

View File

@ -52,12 +52,12 @@
#include "llspinctrl.h"
#include "lltoolbarview.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h" // <FS:Beq/> for LLGridManager
#include "llviewerregion.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
#include "rlvhandler.h"
std::string unescape_name(const std::string& name);
class FSSettingsCollector : public LLInventoryCollectFunctor
{
public:
@ -288,6 +288,27 @@ void FloaterQuickPrefs::loadDayCyclePresets(const std::multimap<std::string, LLU
mDayCyclePresetsCombo->add(preset_name, LLSD(asset_id));
}
}
// <FS:Beq> Opensim legacy windlight support
// Opensim may support both environment and extenvironment caps on the same region
// we also need these disabled in SL on the OpenSim build.
#ifdef OPENSIM
if(LLGridManager::getInstance()->isInOpenSim())
{
LL_DEBUGS("WindlightCaps") << "Adding legacy day cycle presets to QP" << LL_ENDL;
// WL still supported
if (!daycycle_map.empty() && !LLEnvironment::getInstance()->mLegacyDayCycles.empty())
{
mDayCyclePresetsCombo->addSeparator();
}
for(const auto& preset_name : LLEnvironment::getInstance()->mLegacyDayCycles)
{
// we add by name and only build the envp on demand
LL_DEBUGS("WindlightCaps") << "Adding legacy day cycle " << preset_name << LL_ENDL;
mDayCyclePresetsCombo->add(preset_name, LLSD(preset_name));
}
LL_DEBUGS("WindlightCaps") << "Done: Adding legacy day cycle presets to QP" << LL_ENDL;
}
#endif
}
void FloaterQuickPrefs::loadSkyPresets(const std::multimap<std::string, LLUUID>& sky_map)
@ -308,6 +329,27 @@ void FloaterQuickPrefs::loadSkyPresets(const std::multimap<std::string, LLUUID>&
mWLPresetsCombo->add(preset_name, LLSD(asset_id));
}
}
// <FS:Beq> Opensim legacy windlight support
// Opensim may support both environment and extenvironment caps on the same region
// we also need these disabled in SL on the OpenSim build.
#ifdef OPENSIM
if(LLGridManager::getInstance()->isInOpenSim())
{
LL_DEBUGS("WindlightCaps") << "Adding legacy sky presets to QP" << LL_ENDL;
// WL still supported
if (!sky_map.empty() && !LLEnvironment::getInstance()->mLegacySkies.empty())
{
mWLPresetsCombo->addSeparator();
}
for(const auto& preset_name : LLEnvironment::getInstance()->mLegacySkies)
{
// we add by name and only build the envp on demand
LL_DEBUGS("WindlightCaps") << "Adding legacy sky " << preset_name << LL_ENDL;
mWLPresetsCombo->add(preset_name, LLSD(preset_name));
}
LL_DEBUGS("WindlightCaps") << "Done: Adding legacy sky presets to QP" << LL_ENDL;
}
#endif
}
void FloaterQuickPrefs::loadWaterPresets(const std::multimap<std::string, LLUUID>& water_map)
@ -328,6 +370,27 @@ void FloaterQuickPrefs::loadWaterPresets(const std::multimap<std::string, LLUUID
mWaterPresetsCombo->add(preset_name, LLSD(asset_id));
}
}
// <FS:Beq> Opensim legacy windlight support
// Opensim may support both environment and extenvironment caps on the same region
// we also need these disabled in SL on the OpenSim build.
#ifdef OPENSIM
if(LLGridManager::getInstance()->isInOpenSim())
{
LL_DEBUGS("WindlightCaps") << "Adding legacy presets to QP" << LL_ENDL;
// WL still supported
if (!water_map.empty() && !LLEnvironment::getInstance()->mLegacyWater.empty())
{
mWaterPresetsCombo->addSeparator();
}
for(const auto& preset_name : LLEnvironment::getInstance()->mLegacyWater)
{
// we add by name and only build the envp on demand
LL_DEBUGS("WindlightCaps") << "Adding legacy water " << preset_name << LL_ENDL;
mWaterPresetsCombo->add(preset_name, LLSD(preset_name));
}
LL_DEBUGS("WindlightCaps") << "Done: Adding legacy water presets to QP" << LL_ENDL;
}
#endif
}
void FloaterQuickPrefs::loadPresets()
@ -388,33 +451,109 @@ void FloaterQuickPrefs::setSelectedEnvironment()
// day cycle. If no fixed sky or fixed water is set, they are either
// defined in the day cycle or inherited from a higher environment level.
LLSettingsDay::ptr_t day = LLEnvironment::instance().getEnvironmentDay(LLEnvironment::ENV_LOCAL);
if (day && day->getAssetId().notNull())
if (day)
{
//LL_INFOS() << "EEP: day name = " << day->getName() << " - asset id = " << day->getAssetId() << LL_ENDL;
mDayCyclePresetsCombo->selectByValue(LLSD(day->getAssetId()));
// Water is part of a day cycle
mWLPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
mWaterPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
if( day->getAssetId().notNull())
{ // EEP processing
mDayCyclePresetsCombo->selectByValue(LLSD(day->getAssetId()));
// Sky and Water are part of a day cycle in EEP
mWLPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
mWaterPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
}
#ifdef OPENSIM
else if (LLGridManager::getInstance()->isInOpenSim())
{
auto preset_name = day->getName();
LL_DEBUGS("WindlightCaps") << "Current Day cycle is " << preset_name << LL_ENDL;
if (preset_name == "_default_")
{
preset_name = "Default";
}
mDayCyclePresetsCombo->selectByValue(preset_name);
// Sky is part of day so treat that as day cycle
mWLPresetsCombo->selectByValue(LLSD(PRESET_NAME_DAY_CYCLE));
// Water is not part of legacy day so we need to hunt around
LLSettingsWater::ptr_t water = LLEnvironment::instance().getEnvironmentFixedWater(LLEnvironment::ENV_LOCAL);
if (water)
{
// This is going to be possible. OS will support both Legacy and EEP
// so having a water EEP asset with a Legacy day cycle could happen.
LLUUID asset_id = water->getAssetId();
if (asset_id.notNull())
{
mWaterPresetsCombo->selectByValue(LLSD(asset_id));
}
else
{
//mWaterPresetsCombo->selectByValue(LLSD(water->getName()));
std::string preset_name = water->getName();
if (preset_name == "_default_")
{
preset_name = "Default";
}
mWaterPresetsCombo->selectByValue(preset_name);
}
}
}
#endif //OPENSIM
}
else
{
mDayCyclePresetsCombo->selectByValue(LLSD(PRESET_NAME_NONE));
}
LLSettingsSky::ptr_t sky = LLEnvironment::instance().getEnvironmentFixedSky(LLEnvironment::ENV_LOCAL);
if (sky && sky->getAssetId().notNull())
if (sky)
{
//LL_INFOS() << "EEP: sky name = " << sky->getName() << " - asset id = " << sky->getAssetId() << LL_ENDL;
mWLPresetsCombo->selectByValue(LLSD(sky->getAssetId()));
if(sky->getAssetId().notNull())
{
mWLPresetsCombo->selectByValue(LLSD(sky->getAssetId()));
}
#ifdef OPENSIM
else if (LLGridManager::getInstance()->isInOpenSim())
{
auto preset_name = sky->getName();
LL_DEBUGS("WindlightCaps") << "Current Sky is " << preset_name << LL_ENDL;
if (preset_name == "_default_")
{
preset_name = "Default";
}
mWLPresetsCombo->selectByValue(preset_name);
}
#endif
}
// Water is not part of legacy day so we need to hunt around
LLSettingsWater::ptr_t water = LLEnvironment::instance().getEnvironmentFixedWater(LLEnvironment::ENV_LOCAL);
if (water && water->getAssetId().notNull())
if (water)
{
//LL_INFOS() << "EEP: water name = " << water->getName() << " - asset id = " << water->getAssetId() << LL_ENDL;
mWaterPresetsCombo->selectByValue(LLSD(water->getAssetId()));
LLUUID asset_id = water->getAssetId();
if (asset_id.notNull())
{
mWaterPresetsCombo->selectByValue(LLSD(asset_id));
}
#ifdef OPENSIM
else if (LLGridManager::getInstance()->isInOpenSim())
{
auto preset_name = water->getName();
if (preset_name == "_default_")
{
preset_name = "Default";
}
mWaterPresetsCombo->selectByValue(preset_name);
}
#endif //OPENSIM
}
}
else
{
// LLEnvironment::ENV_REGION:
// LLEnvironment::ENV_PARCEL:
mWLPresetsCombo->selectByValue(LLSD(PRESET_NAME_REGION_DEFAULT));
mWaterPresetsCombo->selectByValue(LLSD(PRESET_NAME_REGION_DEFAULT));
mDayCyclePresetsCombo->selectByValue(LLSD(PRESET_NAME_REGION_DEFAULT));
}
}
BOOL FloaterQuickPrefs::postBuild()
@ -631,11 +770,21 @@ void FloaterQuickPrefs::loadSavedSettingsFromFile(const std::string& settings_pa
bool FloaterQuickPrefs::isValidPreset(const LLSD& preset)
{
return (!preset.asString().empty() &&
!preset.asUUID().isNull() &&
preset.asString() != PRESET_NAME_REGION_DEFAULT &&
preset.asString() != PRESET_NAME_DAY_CYCLE &&
preset.asString() != PRESET_NAME_NONE);
if (preset.isUUID())
{
if(!preset.asUUID().isNull()){ return true;}
}
else if (preset.isString())
{
if(!preset.asString().empty() &&
preset.asString() != PRESET_NAME_REGION_DEFAULT &&
preset.asString() != PRESET_NAME_DAY_CYCLE &&
preset.asString() != PRESET_NAME_NONE)
{
return true;
}
}
return false;
}
void FloaterQuickPrefs::stepComboBox(LLComboBox* ctrl, bool forward)
@ -663,21 +812,88 @@ void FloaterQuickPrefs::stepComboBox(LLComboBox* ctrl, bool forward)
void FloaterQuickPrefs::selectSkyPreset(const LLSD& preset)
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
// Opensim continued W/L support
#ifdef OPENSIM
if(!preset.isUUID() && LLGridManager::getInstance()->isInOpenSim())
{
LLSettingsSky::ptr_t legacy_sky = nullptr;
LLSD messages;
legacy_sky = LLEnvironment::createSkyFromLegacyPreset(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", "skies", preset.asString() + ".xml"), messages);
if (legacy_sky)
{
// Need to preserve current sky manually in this case in contrast to asset-based settings
LLSettingsWater::ptr_t current_water = LLEnvironment::instance().getCurrentWater();
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, legacy_sky, current_water);
}
else
{
LL_WARNS() << "Legacy windlight conversion failed for " << preset << " existing env unchanged." << LL_ENDL;
return;
}
}
else // note the else here bridges the endif
#endif
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
}
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true);
}
void FloaterQuickPrefs::selectWaterPreset(const LLSD& preset)
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
#ifdef OPENSIM
if(!preset.isUUID() && LLGridManager::getInstance()->isInOpenSim())
{
LLSettingsWater::ptr_t legacy_water = nullptr;
LLSD messages;
legacy_water = LLEnvironment::createWaterFromLegacyPreset(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", "water", preset.asString() + ".xml"), messages);
if (legacy_water)
{
// Need to preserve current sky manually in this case in contrast to asset-based settings
LLSettingsSky::ptr_t current_sky = LLEnvironment::instance().getCurrentSky();
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, current_sky, legacy_water);
}
else
{
LL_WARNS() << "Legacy windlight conversion failed for " << preset << " existing env unchanged." << LL_ENDL;
return;
}
}
else // beware the trailing else here.
#endif
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
}
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true);
}
void FloaterQuickPrefs::selectDayCyclePreset(const LLSD& preset)
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
#ifdef OPENSIM
if(!preset.isUUID() && LLGridManager::getInstance()->isInOpenSim())
{
LLSettingsDay::ptr_t legacyday = nullptr;
LLSD messages;
legacyday = LLEnvironment::createDayCycleFromLegacyPreset(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight", "days", preset.asString() + ".xml"), messages);
if (legacyday)
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, legacyday);
}
else
{
LL_WARNS() << "Legacy windlight conversion failed for " << preset << " existing env unchanged." << LL_ENDL;
return;
}
}
else // beware trailing else that bridges the endif
#endif
{
LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, preset.asUUID());
}
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true);
}
@ -943,18 +1159,11 @@ void FloaterQuickPrefs::updateRlvRestrictions(ERlvBehaviour behavior, ERlvParamT
{
if (behavior == RLV_BHVR_SETENV)
{
if (type == RLV_TYPE_ADD)
{
enableWindlightButtons(FALSE);
}
else
{
enableWindlightButtons(TRUE);
}
enableWindlightButtons(type != RLV_TYPE_ADD);
}
}
void FloaterQuickPrefs::enableWindlightButtons(BOOL enable)
void FloaterQuickPrefs::enableWindlightButtons(bool enable)
{
childSetEnabled("WLPresetsCombo", enable);
childSetEnabled("WLPrevPreset", enable);

View File

@ -91,7 +91,7 @@ private:
boost::signals2::connection mRlvBehaviorCallbackConnection;
void updateRlvRestrictions(ERlvBehaviour behavior, ERlvParamType type);
void enableWindlightButtons(BOOL enable);
void enableWindlightButtons(bool enable);
public:
/*virtual*/ BOOL postBuild();

View File

@ -42,7 +42,7 @@ bool RlvActions::canChangeCameraPreset(const LLUUID& idRlvObject)
// NOTE: if an object has exclusive camera control then all other objects are locked out
return
( (!gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM)) || (gRlvHandler.hasBehaviour(idRlvObject, RLV_BHVR_SETCAM)) ) &&
(!gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_EYEOFFSET)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_FOCUSOFFSET));
(!gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_EYEOFFSET)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_EYEOFFSETSCALE)) && (!gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_FOCUSOFFSET));
}
bool RlvActions::canChangeToMouselook()
@ -70,7 +70,9 @@ bool RlvActions::isCameraFOVClamped()
bool RlvActions::isCameraPresetLocked()
{
return (gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_EYEOFFSET)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_FOCUSOFFSET));
return
(gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM)) ||
(gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_EYEOFFSET)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_EYEOFFSETSCALE)) || (gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_FOCUSOFFSET));
}
bool RlvActions::getCameraAvatarDistanceLimits(float& nDistMin, float& nDistMax)
@ -353,6 +355,15 @@ bool RlvActions::isLocalTp(const LLVector3d& posGlobal)
return nDistSq < RLV_MODIFIER_TPLOCAL_DEFAULT * RLV_MODIFIER_TPLOCAL_DEFAULT;
}
// ============================================================================
// WindLight
//
bool RlvActions::canChangeEnvironment()
{
return !gRlvHandler.hasBehaviour(RLV_BHVR_SETENV);
}
// ============================================================================
// World interaction
//

View File

@ -26,6 +26,7 @@
class LLInventoryCategory;
class LLInventoryItem;
class LLViewerObject;
// ============================================================================
// RlvActions class declaration - developer-friendly non-RLVa code facing class, use in lieu of RlvHandler whenever possible
@ -207,6 +208,16 @@ public:
*/
static bool isLocalTp(const LLVector3d& posGlobal);
// =========
// WindLight
// =========
public:
/*
* Returns true if the user can make changes to their WindLight environment
*/
static bool canChangeEnvironment();
// =================
// World interaction
// =================

View File

@ -346,8 +346,11 @@ void RlvStrings::saveToFile(const std::string& strFilePath)
// Checked: 2009-11-11 (RLVa-1.1.0a) | Modified: RLVa-1.1.0a
std::string RlvStrings::getAnonym(const std::string& strName)
{
if (!rlv_handler_t::isEnabled())
return strName;
static const std::string strUnknown = LLTrans::getString("Unknown");
if ( (!RlvActions::isRlvEnabled()) || (m_Anonyms.empty()) )
{
return strUnknown;
}
const char* pszName = strName.c_str(); U32 nHash = 0;
@ -733,8 +736,13 @@ void rlvMenuToggleVisible()
bool rlvMenuCanShowName()
{
const LLVOAvatar* pAvatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
return (pAvatar) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, pAvatar->getID()));
bool fEnable = true;
if (rlv_handler_t::isEnabled())
{
const LLVOAvatar* pAvatar = find_avatar_from_object(LLSelectMgr::getInstance()->getSelection()->getPrimaryObject());
fEnable = (pAvatar) && (RlvActions::canShowName(RlvActions::SNC_DEFAULT, pAvatar->getID()));
}
return fEnable;
}
// Checked: 2010-04-23 (RLVa-1.2.0g) | Modified: RLVa-1.2.0g

View File

@ -57,7 +57,7 @@ class RlvObject;
struct RlvException;
typedef boost::variant<std::string, LLUUID, S32, ERlvBehaviour> RlvExceptionOption;
typedef boost::variant<int, float, bool, LLVector3, LLUUID> RlvBehaviourModifierValue;
typedef boost::variant<int, float, bool, LLVector3, LLVector3d, LLUUID> RlvBehaviourModifierValue;
class RlvGCTimer;

View File

@ -23,8 +23,8 @@
// Version of the specifcation we report
const S32 RLV_VERSION_MAJOR = 3;
const S32 RLV_VERSION_MINOR = 2;
const S32 RLV_VERSION_PATCH = 1;
const S32 RLV_VERSION_MINOR = 3;
const S32 RLV_VERSION_PATCH = 3;
const S32 RLV_VERSION_BUILD = 0;
// Version of the specifcation we report (in compatibility mode)
@ -35,7 +35,7 @@ const S32 RLV_VERSION_BUILD_COMPAT = 0;
// Implementation version
const S32 RLVa_VERSION_MAJOR = 2;
const S32 RLVa_VERSION_MINOR = 2;
const S32 RLVa_VERSION_MINOR = 3;
const S32 RLVa_VERSION_PATCH = 0;
// Uncomment before a final release
@ -180,6 +180,7 @@ enum ERlvBehaviour {
RLV_BHVR_DETACHTHIS, // "detachthis"
RLV_BHVR_DETACHTHISEXCEPT, // "detachthis_except"
RLV_BHVR_ADJUSTHEIGHT, // "adjustheight"
RLV_BHVR_GETHEIGHTOFFSET, // "getheightoffset"
RLV_BHVR_TPTO, // "tpto"
RLV_BHVR_VERSION, // "version"
RLV_BHVR_VERSIONNEW, // "versionnew"
@ -213,6 +214,7 @@ enum ERlvBehaviour {
RLV_BHVR_SETCAM_ORIGINDISTMIN, // Enforces a minimum distance from the camera origin (in m)
RLV_BHVR_SETCAM_ORIGINDISTMAX, // Enforces a maximum distance from the camera origin (in m)
RLV_BHVR_SETCAM_EYEOFFSET, // Changes the default camera offset
RLV_BHVR_SETCAM_EYEOFFSETSCALE, // Changes the default camera offset scale
RLV_BHVR_SETCAM_FOCUSOFFSET, // Changes the default camera focus offset
RLV_BHVR_SETCAM_FOCUS, // Forces the camera focus and/or position to a specific object, avatar or position
RLV_BHVR_SETCAM_FOV, // Changes the current - vertical - field of view
@ -266,6 +268,7 @@ enum ERlvBehaviourModifier
RLV_MODIFIER_SETCAM_ORIGINDISTMIN, // Minimum distance between the camera position and the origin point (normal value)
RLV_MODIFIER_SETCAM_ORIGINDISTMAX, // Maximum distance between the camera position and the origin point (normal value)
RLV_MODIFIER_SETCAM_EYEOFFSET, // Specifies the default camera's offset from the camera (vector)
RLV_MODIFIER_SETCAM_EYEOFFSETSCALE, // Specifies the default camera's offset scale (multiplier)
RLV_MODIFIER_SETCAM_FOCUSOFFSET, // Specifies the default camera's focus (vector)
RLV_MODIFIER_SETCAM_FOVMIN, // Minimum value for the camera's field of view (angle in radians)
RLV_MODIFIER_SETCAM_FOVMAX, // Maximum value for the camera's field of view (angle in radians)

View File

@ -0,0 +1,698 @@
/**
*
* Copyright (c) 2009-2020, Kitty Barnett
*
* The source code in this file is provided to you under the terms of the
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt
* in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt
*
* 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.
*
*/
#include "llviewerprecompiledheaders.h"
#include "llinventoryfunctions.h"
#include "llsettingsvo.h"
#include <boost/algorithm/string.hpp>
#include "rlvactions.h"
#include "rlvenvironment.h"
#include "rlvhelper.h"
// ================================================================================================
// Constants and helper functions
//
namespace
{
const F32 SLIDER_SCALE_BLUE_HORIZON_DENSITY(2.0f);
const F32 SLIDER_SCALE_DENSITY_MULTIPLIER(0.001f);
const F32 SLIDER_SCALE_GLOW_R(20.0f);
const F32 SLIDER_SCALE_GLOW_B(-5.0f);
const F32 SLIDER_SCALE_SUN_AMBIENT(3.0f);
const std::string RLV_GETENV_PREFIX = "getenv_";
const std::string RLV_SETENV_PREFIX = "setenv_";
U32 rlvGetColorComponentFromCharacter(char ch)
{
if ( ('r' == ch) || ('x' == ch) ) return VRED;
else if ( ('g' == ch) || ('y' == ch )) return VGREEN;
else if ( ('b' == ch) || ('d' == ch) ) return VBLUE;
else if ('i' == ch) return VALPHA;
return U32_MAX;
}
const LLUUID& rlvGetLibraryEnvironmentsFolder()
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
LLNameCategoryCollector f("Environments");
gInventory.collectDescendentsIf(gInventory.getLibraryRootFolderID(), cats, items, LLInventoryModel::EXCLUDE_TRASH, f);
return (!cats.empty()) ? cats.front()->getUUID() : LLUUID::null;
}
// Legacy WindLight values we need tend to be expressed as a fraction of the [0, 2PI[ domain
F32 normalize_angle_domain(F32 angle)
{
while (angle < 0)
angle += F_TWO_PI;
while (angle > F_TWO_PI)
angle -= F_TWO_PI;
return angle;
}
}
/*
* Reasoning (Reference - https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Azimuth-Altitude_schematic.svg/1024px-Azimuth-Altitude_schematic.svg.png)
*
* Given a(zimuth angle) and e(levation angle) - in the SL axis - we know that it calculates the quaternion as follows:
*
* | cos a sin a 0 | | cos e | | cos a x cos e | = | x |
* | sin a cos a 0 | x | 0 | = | sin a x cos e | = | y | (normalized direction vector identifying the sun position on a unit sphere)
* | 0 0 1 | | sin e | | sin e | = | z |
*
* As a result we can reverse the above by: quaternion -> rotate it around X-axis
* x = cos a x cos e <=> cos a = x / cos e \
* | (if we divide them we can get rid of cos e)
* | <=> sin a / cos a = y / x <=> tan a = y / x <=> a = atan2(y, x)
* y = sin a x cos e <=> sin a = y / cos e /
* z = sin e <=> e = asin z
*
* If we look at the resulting domain azimuth lies in ]-PI, PI] and elevation lies in [-PI/2, PI/2] which I actually prefer most. Going forward people should get the sun in a wind
* direction by manipulating the azimuth and then deal with the elevation (which ends up mimicking how a camera or an observer behave in real life).
*
* Special cases:
* x = 0 => (1) cos e = 0 -> sin e = 1 so y = 0 and z = 1 => in (0, 0, 1) we loose all information about the azimuth since cos e = 0
* OR (2) cos a = 0 -> sin a = 1 so y = cos e and z = sin e => tan e = z/y (with y != 0) => in (0, Y, Z) azimuth is PI/2 (or 3PI/2) and elevation can have an extended domain of ]-PI, PI]
* => When x = 0 (and y != 0) return PI/2 for azimuth and atan2(z, y) for elevation
* y = 0 => (1) sin a = 0 -> cos a = 1 so x = cos e and z = sin e => tan e = z/x (with x != 0) => in (X, 0, Z) azimuth is 0 (or PI) and elevation can have an extended domain of ]-PI, PI]
* OR (2) cos e = 0 -> see above
=> When y = 0 (and x != 0) return 0 for azimuth and atan2(z, x) for elevation
* z = 0 => sin e = 0 -> cos e = 1 so x = cos a and y = sin a => tan a = y / x => in (X, Y, 0) elevation is 0 (or PI) and azimuth has its normal domain of ]-PI, PI]
* => When z = 0 return 0 for elevation and a = atan2(y, x) for azimuth
*
* We still need to convert all that back/forth between legacy WindLight's odd choices:
* east angle = SL's azimuth rotates from E (1, 0, 0) to N (0, 1, 0) to W (-1, 0, 0) to S (0, -1, O) but the legacy east angle rotates the opposite way from E to S to W to N so invert the angle
* (the resulting number then needs to be positive and reported as a fraction of 2PI)
* sunposition = sun elevation reported as a fraction of 2PI
* moonposition = the moon always has sun's azimuth but its negative elevation
*
* Pre-EEP both azimuth and elevation have a 2PI range which means that two different a and e value combinations could yield the same sun direction which causes us problems now since we
* can't differentiate between the two. Pre-EEP likely favoured elevation over azimuth since people might naturally get the time of day they're thinking of and then try to adjust the
* azimuth to get the sun in the correct wind direction; however I've already decided that we'll favour azimuth going forward (see above).
*
* Comparison of pre-EEP and post-EEP legacy values:
* east angle = 0 (aka azimuth = 0) -> y = 0 so e = atan2(z, x) -> elevation has a range of 2PI so we correctly report pre-EEP values
* sunmoonpos = 0 (aka elevation = 0) -> z = 0 so a = atan2(y, x) -> azimuth has a range of 2PI so we correctly report pre-EEP values
* -PI/2 < sunmoonpos < PI/2 -> general case -> post-EEP ranges match pre-EEP ranges so we correctly report pre-EEP values
* sunmoonpos > PI/2 -> elevation went beyond our new maxium so the post-EEP sunmoonpos will actually be off by PI/2 (or 0.25)
* (and the resulting east angle is off by PI or 0.5 - for example smp 0.375 and ea 0.875 are equivalent with smp 0.125 and ea 0.375)
*
* In reverse this means that when setting values through RLVa:
* sunmoonpos without eastangle (=0) => always correct
* eastangle without sunmoonpos (=0) => always correct
* eastangle before sunmoonpos => always correct
* sunmoonpos before eastangle => correct for -0.25 <= sunmoonpos <= 0.25
* incorrect for 0.75 > sunmoonpos > 0.25
*/
F32 rlvGetAzimuthFromDirectionVector(const LLVector3& vecDir)
{
if (is_zero(vecDir.mV[VY]))
return 0.f;
else if (is_zero(vecDir.mV[VX]))
return F_PI_BY_TWO;
F32 radAzimuth = atan2f(vecDir.mV[VY], vecDir.mV[VX]);
return (radAzimuth >= 0.f) ? radAzimuth : radAzimuth + F_TWO_PI;
}
F32 rlvGetElevationFromDirectionVector(const LLVector3& vecDir)
{
if (is_zero(vecDir.mV[VZ]))
return 0.f;
F32 radElevation;
if ( (is_zero(vecDir.mV[VX])) && (!is_zero(vecDir.mV[VY])) )
radElevation = atan2f(vecDir.mV[VZ], vecDir.mV[VY]);
else if ( (!is_zero(vecDir.mV[VX])) && (is_zero(vecDir.mV[VY])) )
radElevation = atan2f(vecDir.mV[VZ], vecDir.mV[VX]);
else
radElevation = asinf(vecDir.mV[VZ]);
return (radElevation >= 0.f) ? radElevation : radElevation + F_TWO_PI;
}
// Defined in llsettingssky.cpp
LLQuaternion convert_azimuth_and_altitude_to_quat(F32 azimuth, F32 altitude);
// ================================================================================================
// RlvIsOfSettingsType - Inventory collector for settings of a specific subtype
//
class RlvIsOfSettingsType : public LLInventoryCollectFunctor
{
public:
RlvIsOfSettingsType(LLSettingsType::type_e eSettingsType, const std::string& strNameMatch = LLStringUtil::null)
: m_eSettingsType(eSettingsType)
, m_strNameMatch(strNameMatch)
{
}
~RlvIsOfSettingsType() override
{
}
bool operator()(LLInventoryCategory*, LLInventoryItem* pItem) override
{
if ( (pItem) && (LLAssetType::AT_SETTINGS == pItem->getActualType()) )
{
return
(m_eSettingsType == LLSettingsType::fromInventoryFlags(pItem->getFlags())) &&
( (m_strNameMatch.empty()) || (boost::iequals(pItem->getName(), m_strNameMatch)) );
}
return false;
}
protected:
LLSettingsType::type_e m_eSettingsType;
std::string m_strNameMatch;
};
// ================================================================================================
// RlvEnvironment
//
RlvEnvironment::RlvEnvironment()
{
//
// Presets
//
registerSetEnvFn<LLUUID>("asset", [](LLEnvironment::EnvSelection_t env, const LLUUID& idAsset)
{
if (idAsset.isNull())
return RLV_RET_FAILED_OPTION;
LLEnvironment::instance().setEnvironment(env, idAsset);
return RLV_RET_SUCCESS;
});
// Deprecated
auto fnApplyLibraryPreset = [](LLEnvironment::EnvSelection_t env, const std::string& strPreset, LLSettingsType::type_e eSettingsType)
{
LLUUID idAsset(strPreset);
if (idAsset.isNull())
{
const LLUUID& idLibraryEnv = rlvGetLibraryEnvironmentsFolder();
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
RlvIsOfSettingsType f(eSettingsType, strPreset);
gInventory.collectDescendentsIf(idLibraryEnv, cats, items, LLInventoryModel::EXCLUDE_TRASH, f);
if (!items.empty())
idAsset = items.front()->getAssetUUID();
}
if (idAsset.isNull())
return RLV_RET_FAILED_OPTION;
LLEnvironment::instance().setEnvironment(env, idAsset);
return RLV_RET_SUCCESS;
};
registerSetEnvFn<std::string>("preset", [&fnApplyLibraryPreset](LLEnvironment::EnvSelection_t env, const std::string& strPreset) { return fnApplyLibraryPreset(env, strPreset, LLSettingsType::ST_SKY); });
registerSetEnvFn<std::string>("daycycle", [&fnApplyLibraryPreset](LLEnvironment::EnvSelection_t env, const std::string& strPreset) { return fnApplyLibraryPreset(env, strPreset, LLSettingsType::ST_DAYCYCLE); });
//
// Atmosphere & Lighting tab
//
// SETTING_AMBIENT
registerSkyFn<LLColor3>("ambient", [](LLSettingsSky::ptr_t pSky) { return pSky->getAmbientColor() * (1.f / SLIDER_SCALE_SUN_AMBIENT); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setAmbientColor(clrValue * SLIDER_SCALE_SUN_AMBIENT); });
registerLegacySkyFn<LLColor3>("ambient",[](LLSettingsSky::ptr_t pSky) { return pSky->getAmbientColor() * (1.f / SLIDER_SCALE_SUN_AMBIENT); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setAmbientColor(clrValue * SLIDER_SCALE_SUN_AMBIENT); });
// SETTING_BLUE_DENSITY
registerSkyFn<LLColor3>("bluedensity", [](LLSettingsSky::ptr_t pSky) { return pSky->getBlueDensity() * (1.f / SLIDER_SCALE_BLUE_HORIZON_DENSITY); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setBlueDensity(clrValue * SLIDER_SCALE_BLUE_HORIZON_DENSITY); });
registerLegacySkyFn<LLColor3>("bluedensity",[](LLSettingsSky::ptr_t pSky) { return pSky->getBlueDensity() * (1.f / SLIDER_SCALE_BLUE_HORIZON_DENSITY); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setBlueDensity(clrValue * SLIDER_SCALE_BLUE_HORIZON_DENSITY); });
// SETTING_BLUE_HORIZON
registerSkyFn<LLColor3>("bluehorizon", [](LLSettingsSky::ptr_t pSky) { return pSky->getBlueHorizon() * (1.f / SLIDER_SCALE_BLUE_HORIZON_DENSITY); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setBlueHorizon(clrValue * SLIDER_SCALE_BLUE_HORIZON_DENSITY); });
registerLegacySkyFn<LLColor3>("bluehorizon",[](LLSettingsSky::ptr_t pSky) { return pSky->getBlueHorizon() * (1.f / SLIDER_SCALE_BLUE_HORIZON_DENSITY); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setBlueHorizon(clrValue * SLIDER_SCALE_BLUE_HORIZON_DENSITY); });
// SETTING_DENSITY_MULTIPLIER
registerSkyFn<F32>("densitymultiplier", [](LLSettingsSky::ptr_t pSky) { return pSky->getDensityMultiplier() / SLIDER_SCALE_DENSITY_MULTIPLIER; },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setDensityMultiplier(nValue * SLIDER_SCALE_DENSITY_MULTIPLIER); });
// SETTING_DISTANCE_MULTIPLIER
registerSkyFn<F32>("distancemultiplier",[](LLSettingsSky::ptr_t pSky) { return pSky->getDistanceMultiplier(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setDistanceMultiplier(nValue); });
// SETTING_SKY_DROPLET_RADIUS
registerSkyFn<F32>("dropletradius", [](LLSettingsSky::ptr_t pSky) { return pSky->getSkyDropletRadius(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setSkyDropletRadius(nValue); });
// SETTING_HAZE_DENSITY
registerSkyFn<F32>("hazedensity", [](LLSettingsSky::ptr_t pSky) { return pSky->getHazeDensity(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setHazeDensity(nValue); });
// SETTING_HAZE_HORIZON
registerSkyFn<F32>("hazehorizon", [](LLSettingsSky::ptr_t pSky) { return pSky->getHazeHorizon(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setHazeHorizon(nValue); });
// SETTING_SKY_ICE_LEVEL
registerSkyFn<F32>("icelevel", [](LLSettingsSky::ptr_t pSky) { return pSky->getSkyIceLevel(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setSkyIceLevel(nValue); });
// SETTING_MAX_Y
registerSkyFn<F32>("maxaltitude", [](LLSettingsSky::ptr_t pSky) { return pSky->getMaxY(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setMaxY(nValue); });
// SETTING_SKY_MOISTURE_LEVEL
registerSkyFn<F32>("moisturelevel", [](LLSettingsSky::ptr_t pSky) { return pSky->getSkyMoistureLevel(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setSkyMoistureLevel(nValue); });
// SETTING_GAMMA
registerSkyFn<F32>("scenegamma", [](LLSettingsSky::ptr_t pSky) { return pSky->getGamma(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setGamma(nValue); });
//
// Clouds tab
//
// SETTING_CLOUD_COLOR
registerSkyFn<LLColor3>("cloudcolor", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudColor(); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setCloudColor(clrValue); });
registerLegacySkyFn<LLColor3>("cloudcolor", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudColor(); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setCloudColor(clrValue); });
// SETTING_CLOUD_SHADOW
registerSkyFn<F32>("cloudcoverage", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudShadow(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setCloudShadow(nValue); });
// SETTING_CLOUD_POS_DENSITY1
registerSkyFn<LLColor3>("clouddensity", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudPosDensity1(); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setCloudPosDensity1(clrValue); });
registerLegacySkyFn<LLColor3>("cloud", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudPosDensity1(); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setCloudPosDensity1(clrValue); });
// SETTING_CLOUD_POS_DENSITY2
registerSkyFn<LLColor3>("clouddetail", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudPosDensity2(); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setCloudPosDensity2(clrValue); });
registerLegacySkyFn<LLColor3>("clouddetail",[](LLSettingsSky::ptr_t pSky) { return pSky->getCloudPosDensity2(); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setCloudPosDensity2(clrValue); });
// SETTING_CLOUD_SCALE
registerSkyFn<F32>("cloudscale", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudScale(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setCloudScale(nValue); });
// SETTING_CLOUD_SCROLL_RATE
registerSkyFn<LLVector2>("cloudscroll", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudScrollRate(); },
[](LLSettingsSky::ptr_t pSky, const LLVector2& vecValue) { pSky->setCloudScrollRate(vecValue); });
registerLegacySkyFn<LLVector2>("cloudscroll", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudScrollRate(); },
[](LLSettingsSky::ptr_t pSky, const LLVector2& vecValue) { pSky->setCloudScrollRate(vecValue); });
// SETTING_CLOUD_TEXTUREID
registerSkyFn<LLUUID>("cloudtexture", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudNoiseTextureId(); },
[](LLSettingsSky::ptr_t pSky, const LLUUID& idTexture) { pSky->setCloudNoiseTextureId(idTexture); });
// SETTING_CLOUD_VARIANCE
registerSkyFn<F32>("cloudvariance", [](LLSettingsSky::ptr_t pSky) { return pSky->getCloudVariance(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setCloudVariance(nValue); });
//
// Sun & Moon
//
// SETTING_MOON_BRIGHTNESS
registerSkyFn<F32>("moonbrightness", [](LLSettingsSky::ptr_t pSky) { return pSky->getMoonBrightness(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setMoonBrightness(nValue); });
// SETTING_MOON_SCALE
registerSkyFn<F32>("moonscale", [](LLSettingsSky::ptr_t pSky) { return pSky->getMoonScale(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setMoonScale(nValue); });
// SETTING_MOON_TEXTUREID
registerSkyFn<LLUUID>("moontexture", [](LLSettingsSky::ptr_t pSky) { return pSky->getMoonTextureId(); },
[](LLSettingsSky::ptr_t pSky, const LLUUID& idTexture) { pSky->setMoonTextureId(idTexture); });
// SETTING_GLOW
registerSkyFn<float>("sunglowsize", [](LLSettingsSky::ptr_t pSky) { return 2.0 - (pSky->getGlow().mV[VRED] / SLIDER_SCALE_GLOW_R); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setGlow(LLColor3((2.0f - nValue) * SLIDER_SCALE_GLOW_R, .0f, pSky->getGlow().mV[VBLUE])); });
registerSkyFn<float>("sunglowfocus", [](LLSettingsSky::ptr_t pSky) { return pSky->getGlow().mV[VBLUE] / SLIDER_SCALE_GLOW_B; },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setGlow(LLColor3(pSky->getGlow().mV[VRED], .0f, nValue * SLIDER_SCALE_GLOW_B)); });
// SETTING_SUNLIGHT_COLOR
registerSkyFn<LLColor3>("sunlightcolor",[](LLSettingsSky::ptr_t pSky) { return pSky->getSunlightColor() * (1.f / SLIDER_SCALE_SUN_AMBIENT); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setSunlightColor(clrValue * SLIDER_SCALE_SUN_AMBIENT); });
registerLegacySkyFn<LLColor3>("sunmooncolor", [](LLSettingsSky::ptr_t pSky) { return pSky->getSunlightColor() * (1.f / SLIDER_SCALE_SUN_AMBIENT); },
[](LLSettingsSky::ptr_t pSky, const LLColor3& clrValue) { pSky->setSunlightColor(clrValue * SLIDER_SCALE_SUN_AMBIENT); });
// SETTING_SUN_SCALE
registerSkyFn<float>("sunscale", [](LLSettingsSky::ptr_t pSky) { return pSky->getSunScale(); },
[](LLSettingsSky::ptr_t pSky, F32 nValue) { pSky->setSunScale(nValue); });
// SETTING_SUN_TEXTUREID
registerSkyFn<LLUUID>("suntexture", [](LLSettingsSky::ptr_t pSky) { return pSky->getSunTextureId(); },
[](LLSettingsSky::ptr_t pSky, const LLUUID& idTexture) { pSky->setSunTextureId(idTexture); });
// SETTING_STAR_BRIGHTNESS
registerSkyFn<F32>("starbrightness", [](LLSettingsSky::ptr_t pSky) { return pSky->getStarBrightness(); },
[](LLSettingsSky::ptr_t pSky, const F32& nValue) { pSky->setStarBrightness(nValue); });
// SETTING_SUN_ROTATION
registerSkyFn<F32>("sunazimuth", [](LLSettingsSky::ptr_t pSky) { return rlvGetAzimuthFromDirectionVector(LLVector3::x_axis * pSky->getSunRotation()); },
[](LLSettingsSky::ptr_t pSky, const F32& radAzimuth) {
pSky->setSunRotation(convert_azimuth_and_altitude_to_quat(radAzimuth, rlvGetElevationFromDirectionVector(LLVector3::x_axis* pSky->getSunRotation())));
});
registerSkyFn<F32>("sunelevation", [](LLSettingsSky::ptr_t pSky) { return rlvGetElevationFromDirectionVector(LLVector3::x_axis * pSky->getSunRotation()); },
[](LLSettingsSky::ptr_t pSky, F32 radElevation) {
radElevation = llclamp(radElevation, -F_PI_BY_TWO, F_PI_BY_TWO);
pSky->setSunRotation(convert_azimuth_and_altitude_to_quat(rlvGetAzimuthFromDirectionVector(LLVector3::x_axis* pSky->getSunRotation()), radElevation));
});
// SETTING_MOON_ROTATION
registerSkyFn<F32>("moonazimuth", [](LLSettingsSky::ptr_t pSky) { return rlvGetAzimuthFromDirectionVector(LLVector3::x_axis * pSky->getMoonRotation()); },
[](LLSettingsSky::ptr_t pSky, const F32& radAzimuth) {
pSky->setMoonRotation(convert_azimuth_and_altitude_to_quat(radAzimuth, rlvGetElevationFromDirectionVector(LLVector3::x_axis* pSky->getMoonRotation())));
});
registerSkyFn<F32>("moonelevation", [](LLSettingsSky::ptr_t pSky) { return rlvGetElevationFromDirectionVector(LLVector3::x_axis * pSky->getMoonRotation()); },
[](LLSettingsSky::ptr_t pSky, F32 radElevation) {
radElevation = llclamp(radElevation, -F_PI_BY_TWO, F_PI_BY_TWO);
pSky->setMoonRotation(convert_azimuth_and_altitude_to_quat(rlvGetAzimuthFromDirectionVector(LLVector3::x_axis* pSky->getMoonRotation()), radElevation));
});
// Legacy WindLight support (see remarks at the top of this file)
registerSkyFn<F32>("eastangle", [](LLSettingsSky::ptr_t pSky) { return normalize_angle_domain(-rlvGetAzimuthFromDirectionVector(LLVector3::x_axis * pSky->getSunRotation())) / F_TWO_PI; },
[](LLSettingsSky::ptr_t pSky, const F32& radEastAngle)
{
const F32 radAzimuth = -radEastAngle * F_TWO_PI;
const F32 radElevation = rlvGetElevationFromDirectionVector(LLVector3::x_axis * pSky->getSunRotation());
pSky->setSunRotation(convert_azimuth_and_altitude_to_quat(radAzimuth, radElevation));
pSky->setMoonRotation(convert_azimuth_and_altitude_to_quat(radAzimuth + F_PI, -radElevation));
});
registerSkyFn<F32>("sunmoonposition", [](LLSettingsSky::ptr_t pSky) { return rlvGetElevationFromDirectionVector(LLVector3::x_axis * pSky->getSunRotation()) / F_TWO_PI; },
[](LLSettingsSky::ptr_t pSky, const F32& nValue)
{
const F32 radAzimuth = rlvGetAzimuthFromDirectionVector(LLVector3::x_axis * pSky->getSunRotation());
const F32 radElevation = nValue * F_TWO_PI;
pSky->setSunRotation(convert_azimuth_and_altitude_to_quat(radAzimuth, radElevation));
pSky->setMoonRotation(convert_azimuth_and_altitude_to_quat(radAzimuth + F_PI, -radElevation));
});
// Create a fixed sky from the nearest daycycle (local > experience > parcel > region)
registerSetEnvFn<F32>("daytime", [](LLEnvironment::EnvSelection_t env, const F32& nValue)
{
if ((nValue >= 0.f) && (nValue <= 1.0f))
{
LLSettingsDay::ptr_t pDay;
if (LLEnvironment::ENV_EDIT != env)
{
LLEnvironment::EnvSelection_t envs[] = { LLEnvironment::ENV_LOCAL, LLEnvironment::ENV_PUSH, LLEnvironment::ENV_PARCEL, LLEnvironment::ENV_REGION };
for (size_t idxEnv = 0, cntEnv = sizeof(envs) / sizeof(LLEnvironment::EnvSelection_t); idxEnv < cntEnv && !pDay; idxEnv++)
pDay = LLEnvironment::instance().getEnvironmentDay(envs[idxEnv]);
}
else
{
pDay = LLEnvironment::instance().getEnvironmentDay(LLEnvironment::ENV_EDIT);
}
if (pDay)
{
auto pNewSky = LLSettingsVOSky::buildDefaultSky();
auto pSkyBlender = std::make_shared<LLTrackBlenderLoopingManual>(pNewSky, pDay, 1);
pSkyBlender->setPosition(nValue);
LLEnvironment::instance().setEnvironment(env, pNewSky);
LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_INSTANT);
}
}
else if (nValue == -1)
{
LLEnvironment::instance().clearEnvironment(env);
LLEnvironment::instance().setSelectedEnvironment(env);
LLEnvironment::instance().updateEnvironment();
// defocusEnvFloaters();
}
else
{
return RLV_RET_FAILED_OPTION;
}
return RLV_RET_SUCCESS;
});
registerGetEnvFn("daytime", [](LLEnvironment::EnvSelection_t env)
{
// I forgot how much I hate this command... it literally makes no sense since time of day only has any meaning in an
// actively animating day cycle (but in that case we have to return -1).
if (!LLEnvironment::instance().getEnvironmentFixedSky(env)) {
return std::to_string(-1.f);
}
// It's invalid input for @setenv_daytime (see above) so it can be fed in without changing the current environment
return std::to_string(2.f);
});
}
RlvEnvironment::~RlvEnvironment()
{
}
// static
LLEnvironment::EnvSelection_t RlvEnvironment::getTargetEnvironment()
{
return RlvActions::canChangeEnvironment() ? LLEnvironment::ENV_LOCAL : LLEnvironment::ENV_EDIT;
}
// static
bool RlvEnvironment::onHandleCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet, const std::string& strCmdPrefix, const handler_map_t& fnLookup, const legacy_handler_map_t& legacyFnLookup)
{
if ( (rlvCmd.getBehaviour().length() > strCmdPrefix.length() + 2) && (boost::starts_with(rlvCmd.getBehaviour(), strCmdPrefix)) )
{
std::string strEnvCommand = rlvCmd.getBehaviour().substr(strCmdPrefix.length());
handler_map_t::const_iterator itFnEntry = fnLookup.find(strEnvCommand);
if (fnLookup.end() != itFnEntry)
{
cmdRet = itFnEntry->second((RLV_TYPE_FORCE == rlvCmd.getParamType()) ? rlvCmd.getOption() : rlvCmd.getParam());
return true;
}
// Legacy handling (blargh)
U32 idxComponent = rlvGetColorComponentFromCharacter(strEnvCommand.back());
if (idxComponent <= VALPHA)
{
strEnvCommand.pop_back();
legacy_handler_map_t::const_iterator itLegacyFnEntry = legacyFnLookup.find(strEnvCommand);
if (legacyFnLookup.end() != itLegacyFnEntry)
{
cmdRet = itLegacyFnEntry->second((RLV_TYPE_FORCE == rlvCmd.getParamType()) ? rlvCmd.getOption() : rlvCmd.getParam(), idxComponent);
return true;
}
}
}
return false;
}
bool RlvEnvironment::onReplyCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet)
{
return onHandleCommand(rlvCmd, cmdRet, RLV_GETENV_PREFIX, m_GetFnLookup, m_LegacyGetFnLookup);
}
bool RlvEnvironment::onForceCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet)
{
return onHandleCommand(rlvCmd, cmdRet, RLV_SETENV_PREFIX, m_SetFnLookup, m_LegacySetFnLookup);
}
template<>
std::string RlvEnvironment::handleGetFn<float>(const std::function<float(LLSettingsSky::ptr_t)>& fn)
{
LLSettingsSky::ptr_t pSky = LLEnvironment::instance().getCurrentSky();
return std::to_string(fn(pSky));
}
template<>
std::string RlvEnvironment::handleGetFn<LLUUID>(const std::function<LLUUID(LLSettingsSky::ptr_t)>& fn)
{
LLSettingsSky::ptr_t pSky = LLEnvironment::instance().getCurrentSky();
return fn(pSky).asString();
}
template<>
std::string RlvEnvironment::handleGetFn<LLVector2>(const std::function<LLVector2(LLSettingsSky::ptr_t)>& fn)
{
LLSettingsSky::ptr_t pSky = LLEnvironment::instance().getCurrentSky();
LLVector2 replyVec = fn(pSky);
return llformat("%f/%f", replyVec.mV[VX], replyVec.mV[VY]);
}
template<>
std::string RlvEnvironment::handleGetFn<LLColor3>(const std::function<LLColor3(LLSettingsSky::ptr_t)>& fn)
{
LLSettingsSky::ptr_t pSky = LLEnvironment::instance().getCurrentSky();
LLColor3 replyColor = fn(pSky);
return llformat("%f/%f/%f", replyColor.mV[VX], replyColor.mV[VY], replyColor.mV[VZ]);
}
template<typename T>
ERlvCmdRet RlvEnvironment::handleSetFn(const std::string& strRlvOption, const std::function<void(LLSettingsSky::ptr_t, const T&)>& fn)
{
T optionValue;
if (!RlvCommandOptionHelper::parseOption<T>(strRlvOption, optionValue))
return RLV_RET_FAILED_PARAM;
LLSettingsSky::ptr_t pSky = LLEnvironment::instance().getCurrentSky();
fn(pSky, optionValue);
pSky->update();
return RLV_RET_SUCCESS;
}
template<>
std::string RlvEnvironment::handleLegacyGetFn<LLVector2>(const std::function<const LLVector2& (LLSettingsSkyPtr_t)>& getFn, U32 idxComponent)
{
if (idxComponent > 2)
return LLStringUtil::null;
return std::to_string(getFn(LLEnvironment::instance().getCurrentSky()).mV[idxComponent]);
}
template<>
std::string RlvEnvironment::handleLegacyGetFn<LLColor3>(const std::function<const LLColor3& (LLSettingsSkyPtr_t)>& getFn, U32 idxComponent)
{
if ( (idxComponent >= VRED) && (idxComponent <= VBLUE) )
{
return std::to_string(getFn(LLEnvironment::instance().getCurrentSky()).mV[idxComponent]);
}
else if (idxComponent == VALPHA)
{
const LLColor3& clr = getFn(LLEnvironment::instance().getCurrentSky());
return std::to_string(llmax(clr.mV[VRED], clr.mV[VGREEN], clr.mV[VBLUE]));
}
return LLStringUtil::null;
}
template<>
ERlvCmdRet RlvEnvironment::handleLegacySetFn<LLVector2>(float optionValue, LLVector2 curValue, const std::function<void(LLSettingsSkyPtr_t, const LLVector2&)>& setFn, U32 idxComponent)
{
if (idxComponent > 2)
return RLV_RET_FAILED_UNKNOWN;
LLSettingsSky::ptr_t pSky = LLEnvironment::instance().getCurrentSky();
curValue.mV[idxComponent] = optionValue;
setFn(pSky, curValue);
pSky->update();
return RLV_RET_SUCCESS;
}
template<>
ERlvCmdRet RlvEnvironment::handleLegacySetFn<LLColor3>(float optionValue, LLColor3 curValue, const std::function<void(LLSettingsSkyPtr_t, const LLColor3&)>& setFn, U32 idxComponent)
{
LLSettingsSky::ptr_t pSky = LLEnvironment::instance().getCurrentSky();
if ( (idxComponent >= VRED) && (idxComponent <= VBLUE) )
{
curValue.mV[idxComponent] = optionValue;
}
else if (idxComponent == VALPHA)
{
const F32 curMax = llmax(curValue.mV[VRED], curValue.mV[VGREEN], curValue.mV[VBLUE]);
if ( (0.0f == optionValue) || (0.0f == curMax) )
{
curValue.mV[VRED] = curValue.mV[VGREEN] = curValue.mV[VBLUE] = optionValue;
}
else
{
const F32 nDelta = (optionValue - curMax) / curMax;
curValue.mV[VRED] *= (1.0f + nDelta);
curValue.mV[VGREEN] *= (1.0f + nDelta);
curValue.mV[VBLUE] *= (1.0f + nDelta);
}
}
else
{
return RLV_RET_FAILED_UNKNOWN;
}
setFn(pSky, curValue);
pSky->update();
return RLV_RET_SUCCESS;
}
template<typename T>
void RlvEnvironment::registerSkyFn(const std::string& strFnName, const std::function<T(LLSettingsSkyPtr_t)>& getFn, const std::function<void(LLSettingsSkyPtr_t, const T&)>& setFn)
{
RLV_ASSERT(m_GetFnLookup.end() == m_GetFnLookup.find(strFnName));
m_GetFnLookup.insert(std::make_pair(strFnName, [this, getFn](const std::string& strRlvParam)
{
if (RlvUtil::sendChatReply(strRlvParam, handleGetFn<T>(getFn)))
return RLV_RET_SUCCESS;
return RLV_RET_FAILED_PARAM;
}));
RLV_ASSERT(m_SetFnLookup.end() == m_SetFnLookup.find(strFnName));
m_SetFnLookup.insert(std::make_pair(strFnName, [this, setFn](const std::string& strRlvOption)
{
return handleSetFn<T>(strRlvOption, setFn);
}));
}
void RlvEnvironment::registerGetEnvFn(const std::string& strFnName, const std::function<std::string(LLEnvironment::EnvSelection_t env)>& getFn)
{
RLV_ASSERT(m_GetFnLookup.end() == m_GetFnLookup.find(strFnName));
m_GetFnLookup.insert(std::make_pair(strFnName, [getFn](const std::string& strRlvParam)
{
if (RlvUtil::sendChatReply(strRlvParam, getFn(getTargetEnvironment())))
return RLV_RET_SUCCESS;
return RLV_RET_FAILED_PARAM;
}));
}
template<typename T>
void RlvEnvironment::registerSetEnvFn(const std::string& strFnName, const std::function<ERlvCmdRet(LLEnvironment::EnvSelection_t env, const T& strRlvOption)>& setFn)
{
RLV_ASSERT(m_SetFnLookup.end() == m_SetFnLookup.find(strFnName));
m_SetFnLookup.insert(std::make_pair(strFnName, [setFn](const std::string& strRlvOption)
{
T optionValue;
if (!RlvCommandOptionHelper::parseOption<T>(strRlvOption, optionValue))
return RLV_RET_FAILED_PARAM;
return setFn(getTargetEnvironment(), optionValue);
}));
}
template<typename T>
void RlvEnvironment::registerLegacySkyFn(const std::string& strFnName, const std::function<const T& (LLSettingsSkyPtr_t)>& getFn, const std::function<void(LLSettingsSkyPtr_t, const T&)>& setFn)
{
RLV_ASSERT(m_LegacyGetFnLookup.end() == m_LegacyGetFnLookup.find(strFnName));
m_LegacyGetFnLookup.insert(std::make_pair(strFnName, [this, getFn](const std::string& strRlvParam, U32 idxComponent)
{
const std::string strReply = handleLegacyGetFn<T>(getFn, idxComponent);
if (strReply.empty())
return RLV_RET_FAILED_UNKNOWN;
else if (RlvUtil::sendChatReply(strRlvParam, strReply))
return RLV_RET_SUCCESS;
return RLV_RET_FAILED_PARAM;
}));
RLV_ASSERT(m_LegacySetFnLookup.end() == m_LegacySetFnLookup.find(strFnName));
m_LegacySetFnLookup.insert(std::make_pair(strFnName, [this, getFn, setFn](const std::string& strRlvOption, U32 idxComponent)
{
float optionValue;
if (!RlvCommandOptionHelper::parseOption(strRlvOption, optionValue))
return RLV_RET_FAILED_PARAM;
return handleLegacySetFn<T>(optionValue, getFn(LLEnvironment::instance().getCurrentSky()), setFn, idxComponent);;
}));
}
// ================================================================================================

View File

@ -0,0 +1,66 @@
/**
*
* Copyright (c) 2009-2020, Kitty Barnett
*
* The source code in this file is provided to you under the terms of the
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt
* in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt
*
* 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.
*
*/
#pragma once
#include "llenvironment.h"
#include "rlvcommon.h"
// ============================================================================
// RlvEnvironment - viewer-side scripted environment changes
//
class RlvEnvironment : public RlvExtCommandHandler
{
public:
RlvEnvironment();
~RlvEnvironment() override;
bool onReplyCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet) override;
bool onForceCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet) override;
protected:
static LLEnvironment::EnvSelection_t getTargetEnvironment();
typedef std::map<std::string, std::function<ERlvCmdRet(const std::string&)>> handler_map_t;
typedef std::map<std::string, std::function<ERlvCmdRet(const std::string&, U32)>> legacy_handler_map_t;
static bool onHandleCommand(const RlvCommand& rlvCmd, ERlvCmdRet& cmdRet, const std::string& strCmdPrefix, const handler_map_t& fnLookup, const legacy_handler_map_t& legacyFnLookup);
/*
* Command registration
*/
protected:
void registerGetEnvFn(const std::string& strFnName, const std::function<std::string(LLEnvironment::EnvSelection_t env)>& getFn);
template<typename T> void registerSetEnvFn(const std::string& strFnName, const std::function<ERlvCmdRet(LLEnvironment::EnvSelection_t env, const T& strRlvOption)>& setFn);
template<typename T> void registerSkyFn(const std::string& strFnName, const std::function<T(LLSettingsSky::ptr_t)>& getFn, const std::function<void(LLSettingsSky::ptr_t, const T&)>& setFn);
template<typename T> void registerLegacySkyFn(const std::string& strFnName, const std::function<const T& (LLSettingsSky::ptr_t)>& getFn, const std::function<void(LLSettingsSky::ptr_t, const T&)>& setFn);
// Command handling helpers
template<typename T> std::string handleGetFn(const std::function<T(LLSettingsSky::ptr_t)>& fn);
template<typename T> ERlvCmdRet handleSetFn(const std::string& strRlvOption, const std::function<void(LLSettingsSky::ptr_t, const T&)>& fn);
template<typename T> std::string handleLegacyGetFn(const std::function<const T& (LLSettingsSky::ptr_t)>& getFn, U32 idxComponent);
template<typename T> ERlvCmdRet handleLegacySetFn(float optionValue, T value, const std::function<void(LLSettingsSky::ptr_t, const T&)>& setFn, U32 idxComponent);
/*
* Member variables
*/
protected:
handler_map_t m_GetFnLookup;
handler_map_t m_SetFnLookup;
legacy_handler_map_t m_LegacyGetFnLookup;
legacy_handler_map_t m_LegacySetFnLookup;
};
// ============================================================================

View File

@ -1,25 +1,23 @@
/**
/**
*
* Copyright (c) 2009-2011, Kitty Barnett
*
* The source code in this file is provided to you under the terms of the
*
* The source code in this file is provided to you under the terms of the
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. Terms of the LGPL can be found in doc/LGPL-licence.txt
* in this distribution, or online at http://www.gnu.org/licenses/lgpl-2.1.txt
*
*
* By copying, modifying or distributing this software, you acknowledge that
* you have read and understood your obligations described above, and agree to
* you have read and understood your obligations described above, and agree to
* abide by those obligations.
*
*
*/
#include "llviewerprecompiledheaders.h"
#include "llagent.h"
#include "llagentcamera.h"
// #include "lldaycyclemanager.h" // [EEPMERGE]
#include "llvoavatarself.h"
//#include "llwlparammanager.h" // [EEPMERGE]
#include "rlvextensions.h"
#include "rlvhandler.h"
@ -27,354 +25,6 @@
// ============================================================================
#if 0// [EEPMERGE]
class RlvWindLightControl
{
public:
enum EType { TYPE_COLOR, TYPE_COLOR_R, TYPE_FLOAT, TYPE_UNKNOWN };
enum EColorComponent { COMPONENT_R, COMPONENT_G, COMPONENT_B, COMPONENT_I, COMPONENT_NONE };
public:
RlvWindLightControl(WLColorControl* pCtrl, bool fColorR) : m_eType((!fColorR) ? TYPE_COLOR: TYPE_COLOR_R), m_pColourCtrl(pCtrl), m_pFloatCtrl(NULL) {}
RlvWindLightControl(WLFloatControl* pCtrl) : m_eType(TYPE_FLOAT), m_pColourCtrl(NULL), m_pFloatCtrl(pCtrl) {}
EType getControlType() const { return m_eType; }
bool isColorType() const { return (TYPE_COLOR == m_eType) || (TYPE_COLOR_R == m_eType); }
bool isFloatType() const { return (TYPE_FLOAT == m_eType); }
// TYPE_COLOR and TYPE_COLOR_R
F32 getColorComponent(EColorComponent eComponent, bool& fError) const;
LLVector4 getColorVector(bool& fError) const;
bool setColorComponent(EColorComponent eComponent, F32 nValue);
// TYPE_FLOAT
F32 getFloat(bool& fError) const;
bool setFloat(F32 nValue);
static EColorComponent getComponentFromCharacter(char ch);
protected:
EType m_eType; // Type of the WindLight control
WLColorControl* m_pColourCtrl;
WLFloatControl* m_pFloatCtrl;
};
// Checked: 2011-08-29 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
static F32 get_intensity_from_color(const LLVector4& v)
{
return llmax(v.mV[0], v.mV[1], v.mV[2]);
}
// Checked: 2011-08-29 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
F32 RlvWindLightControl::getColorComponent(EColorComponent eComponent, bool& fError) const
{
switch (eComponent)
{
case COMPONENT_R: return getColorVector(fError).mV[0];
case COMPONENT_G: return getColorVector(fError).mV[1];
case COMPONENT_B: return getColorVector(fError).mV[2];
case COMPONENT_I: return get_intensity_from_color(getColorVector(fError)); // SL-2.8: Always seems to be 1.0 so get it manually
default : RLV_ASSERT(false); fError = true; return 0.0;
}
}
// Checked: 2011-08-29 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
RlvWindLightControl::EColorComponent RlvWindLightControl::getComponentFromCharacter(char ch)
{
if (('r' == ch) || ('x' == ch))
return COMPONENT_R;
else if (('g' == ch) || ('y' == ch))
return COMPONENT_G;
else if (('b' == ch) || ('d' == ch))
return COMPONENT_B;
else if ('i' == ch)
return COMPONENT_I;
return COMPONENT_NONE;
}
// Checked: 2011-08-29 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
LLVector4 RlvWindLightControl::getColorVector(bool& fError) const
{
if ((fError = !isColorType()))
return LLVector4(0, 0, 0, 0);
F32 nMult = (m_pColourCtrl->isSunOrAmbientColor) ? 3.0f : ((m_pColourCtrl->isBlueHorizonOrDensity) ? 2.0f : 1.0f);
return LLWLParamManager::getInstance()->mCurParams.getVector(m_pColourCtrl->mName, fError) / nMult;
}
// Checked: 2011-08-28 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
bool RlvWindLightControl::setColorComponent(EColorComponent eComponent, F32 nValue)
{
if (isColorType())
{
nValue *= (m_pColourCtrl->isSunOrAmbientColor) ? 3.0f : ((m_pColourCtrl->isBlueHorizonOrDensity) ? 2.0f : 1.0f);
if (COMPONENT_I == eComponent) // (See: LLFloaterWindLight::onColorControlIMoved)
{
if (m_pColourCtrl->hasSliderName)
{
F32 curMax = llmax(m_pColourCtrl->r, m_pColourCtrl->g, m_pColourCtrl->b);
if ( (0.0f == nValue) || (0.0f == curMax) )
{
m_pColourCtrl->r = m_pColourCtrl->g = m_pColourCtrl->b = m_pColourCtrl->i = nValue;
}
else
{
F32 nDelta = (nValue - curMax) / curMax;
m_pColourCtrl->r *= (1.0f + nDelta);
m_pColourCtrl->g *= (1.0f + nDelta);
m_pColourCtrl->b *= (1.0f + nDelta);
m_pColourCtrl->i = nValue;
}
}
}
else // (See: LLFloaterWindLight::onColorControlRMoved)
{
F32* pnValue = (COMPONENT_R == eComponent) ? &m_pColourCtrl->r : (COMPONENT_G == eComponent) ? &m_pColourCtrl->g : (COMPONENT_B == eComponent) ? &m_pColourCtrl->b : NULL;
if (pnValue)
*pnValue = nValue;
if (m_pColourCtrl->hasSliderName)
m_pColourCtrl->i = llmax(m_pColourCtrl->r, m_pColourCtrl->g, m_pColourCtrl->b);
}
m_pColourCtrl->update(LLWLParamManager::getInstance()->mCurParams);
LLWLParamManager::getInstance()->propagateParameters();
}
return isColorType();
}
// Checked: 2011-08-29 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
F32 RlvWindLightControl::getFloat(bool& fError) const
{
return (!(fError = (TYPE_FLOAT != m_eType))) ? LLWLParamManager::getInstance()->mCurParams.getVector(m_pFloatCtrl->mName, fError).mV[0] * m_pFloatCtrl->mult : 0.0;
}
// Checked: 2011-08-28 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
bool RlvWindLightControl::setFloat(F32 nValue)
{
if (TYPE_FLOAT == m_eType)
{
m_pFloatCtrl->x = nValue / m_pFloatCtrl->mult;
m_pFloatCtrl->update(LLWLParamManager::getInstance()->mCurParams);
LLWLParamManager::getInstance()->propagateParameters();
}
return (TYPE_FLOAT == m_eType);
}
// ============================================================================
class RlvWindLight : public LLSingleton<RlvWindLight>
{
LLSINGLETON(RlvWindLight);
public:
std::string getValue(const std::string& strSetting, bool& fError);
bool setValue(const std::string& strRlvName, const std::string& strValue);
protected:
std::map<std::string, RlvWindLightControl> m_ControlLookupMap;
};
// Checked: 2011-08-29 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
RlvWindLight::RlvWindLight()
{
LLWLParamManager* pWLParamMgr = LLWLParamManager::getInstance();
// TYPE_FLOAT
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("cloudcoverage", RlvWindLightControl(&pWLParamMgr->mCloudCoverage)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("cloudscale", RlvWindLightControl(&pWLParamMgr->mCloudScale)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("densitymultiplier", RlvWindLightControl(&pWLParamMgr->mDensityMult)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("distancemultiplier", RlvWindLightControl(&pWLParamMgr->mDistanceMult)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("maxaltitude", RlvWindLightControl(&pWLParamMgr->mMaxAlt)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("scenegamma", RlvWindLightControl(&pWLParamMgr->mWLGamma)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("hazedensity", RlvWindLightControl(&pWLParamMgr->mHazeDensity)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("hazehorizon", RlvWindLightControl(&pWLParamMgr->mHazeHorizon)));
// TYPE_COLOR
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("ambient", RlvWindLightControl(&pWLParamMgr->mAmbient, false)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("bluedensity", RlvWindLightControl(&pWLParamMgr->mBlueDensity, false)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("bluehorizon", RlvWindLightControl(&pWLParamMgr->mBlueHorizon, false)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("cloud", RlvWindLightControl(&pWLParamMgr->mCloudMain, false)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("cloudcolor", RlvWindLightControl(&pWLParamMgr->mCloudColor, false)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("clouddetail", RlvWindLightControl(&pWLParamMgr->mCloudDetail, false)));
m_ControlLookupMap.insert(std::pair<std::string, RlvWindLightControl>("sunmooncolor", RlvWindLightControl(&pWLParamMgr->mSunlight, false)));
}
// Checked: 2011-08-29 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
std::string RlvWindLight::getValue(const std::string& strSetting, bool& fError)
{
LLWLParamManager* pWLParams = LLWLParamManager::getInstance();
LLEnvManagerNew* pEnvMgr = LLEnvManagerNew::getInstance();
fError = false; // Assume we won't fail
if ("preset" == strSetting)
return (pEnvMgr->getUseFixedSky()) ? pEnvMgr->getSkyPresetName() : std::string();
else if ("daycycle" == strSetting)
return (pEnvMgr->getUseDayCycle()) ? pEnvMgr->getDayCycleName() : std::string();
F32 nValue = 0.0f;
if ("daytime" == strSetting)
{
nValue = (pEnvMgr->getUseFixedSky()) ? pWLParams->mCurParams.getFloat("sun_angle", fError) / F_TWO_PI : -1.0f;
}
else if (("sunglowfocus" == strSetting) || ("sunglowsize" == strSetting))
{
pWLParams->mGlow = pWLParams->mCurParams.getVector(pWLParams->mGlow.mName, fError);
RLV_ASSERT_DBG(!fError);
if ("sunglowfocus" == strSetting)
nValue = -pWLParams->mGlow.b / 5.0f;
else
nValue = 2 - pWLParams->mGlow.r / 20.0f;
}
else if ("starbrightness" == strSetting) nValue = pWLParams->mCurParams.getStarBrightness();
else if ("eastangle" == strSetting) nValue = pWLParams->mCurParams.getEastAngle() / F_TWO_PI;
else if ("sunmoonposition" == strSetting) nValue = pWLParams->mCurParams.getSunAngle() / F_TWO_PI;
else if ("cloudscrollx" == strSetting) nValue = pWLParams->mCurParams.getCloudScrollX() - 10.0f;
else if ("cloudscrolly" == strSetting) nValue = pWLParams->mCurParams.getCloudScrollY() - 10.0f;
else
{
std::map<std::string, RlvWindLightControl>::const_iterator itControl = m_ControlLookupMap.find(strSetting);
if (m_ControlLookupMap.end() != itControl)
{
switch (itControl->second.getControlType())
{
case RlvWindLightControl::TYPE_FLOAT:
nValue = itControl->second.getFloat(fError);
break;
case RlvWindLightControl::TYPE_COLOR_R:
nValue = itControl->second.getColorComponent(RlvWindLightControl::COMPONENT_R, fError);
break;
default:
fError = true;
break;
}
}
else
{
// Couldn't find the exact name, check for a color control name
RlvWindLightControl::EColorComponent eComponent = RlvWindLightControl::getComponentFromCharacter(strSetting[strSetting.length() - 1]);
if (RlvWindLightControl::COMPONENT_NONE != eComponent)
itControl = m_ControlLookupMap.find(strSetting.substr(0, strSetting.length() - 1));
if ( (m_ControlLookupMap.end() != itControl) && (itControl->second.isColorType()) )
nValue = itControl->second.getColorComponent(eComponent, fError);
else
fError = true;
}
}
return llformat("%f", nValue);
}
// Checked: 2011-08-29 (RLVa-1.4.1a) | Added: RLVa-1.4.1a
bool RlvWindLight::setValue(const std::string& strRlvName, const std::string& strValue)
{
F32 nValue = 0.0f;
// Sanity check - make sure strValue specifies a number for all settings except "preset" and "daycycle"
if ( (RlvSettings::getNoSetEnv()) ||
( (!LLStringUtil::convertToF32(strValue, nValue)) && (("preset" != strRlvName) && ("daycycle" != strRlvName)) ) )
{
return false;
}
LLWLParamManager* pWLParams = LLWLParamManager::getInstance();
LLEnvManagerNew* pEnvMgr = LLEnvManagerNew::getInstance();
if ("daytime" == strRlvName)
{
if (0.0f <= nValue)
{
pWLParams->mAnimator.deactivate();
pWLParams->mAnimator.setDayTime(nValue);
pWLParams->mAnimator.update(pWLParams->mCurParams);
}
else
{
pEnvMgr->setUserPrefs(pEnvMgr->getWaterPresetName(), pEnvMgr->getSkyPresetName(), pEnvMgr->getDayCycleName(), false, true);
}
return true;
}
else if ("preset" == strRlvName)
{
std::string strPresetName = pWLParams->findPreset(strValue, LLEnvKey::SCOPE_LOCAL);
if (!strPresetName.empty())
pEnvMgr->useSkyPreset(strPresetName);
return !strPresetName.empty();
}
else if ("daycycle" == strRlvName)
{
std::string strPresetName = LLDayCycleManager::instance().findPreset(strValue);
if (!strPresetName.empty())
pEnvMgr->useDayCycle(strValue, LLEnvKey::SCOPE_LOCAL);
return !strPresetName.empty();
}
bool fError = false;
pWLParams->mAnimator.deactivate();
if (("sunglowfocus" == strRlvName) || ("sunglowsize" == strRlvName))
{
pWLParams->mGlow = pWLParams->mCurParams.getVector(pWLParams->mGlow.mName, fError);
RLV_ASSERT_DBG(!fError);
if ("sunglowfocus" == strRlvName)
pWLParams->mGlow.b = -nValue * 5;
else
pWLParams->mGlow.r = (2 - nValue) * 20;
pWLParams->mGlow.update(pWLParams->mCurParams);
pWLParams->propagateParameters();
return true;
}
else if ("starbrightness" == strRlvName)
{
pWLParams->mCurParams.setStarBrightness(nValue);
return true;
}
else if (("eastangle" == strRlvName) || ("sunmoonposition" == strRlvName))
{
if ("eastangle" == strRlvName)
pWLParams->mCurParams.setEastAngle(F_TWO_PI * nValue);
else
pWLParams->mCurParams.setSunAngle(F_TWO_PI * nValue);
// Set the sun vector
pWLParams->mLightnorm.r = -sin(pWLParams->mCurParams.getEastAngle()) * cos(pWLParams->mCurParams.getSunAngle());
pWLParams->mLightnorm.g = sin(pWLParams->mCurParams.getSunAngle());
pWLParams->mLightnorm.b = cos(pWLParams->mCurParams.getEastAngle()) * cos(pWLParams->mCurParams.getSunAngle());
pWLParams->mLightnorm.i = 1.f;
pWLParams->propagateParameters();
return true;
}
else if ("cloudscrollx" == strRlvName)
{
pWLParams->mCurParams.setCloudScrollX(nValue + 10.0f);
return true;
}
else if ("cloudscrolly" == strRlvName)
{
pWLParams->mCurParams.setCloudScrollY(nValue + 10.0f);
return true;
}
std::map<std::string, RlvWindLightControl>::iterator itControl = m_ControlLookupMap.find(strRlvName);
if (m_ControlLookupMap.end() != itControl)
{
switch (itControl->second.getControlType())
{
case RlvWindLightControl::TYPE_FLOAT:
return itControl->second.setFloat(nValue);
case RlvWindLightControl::TYPE_COLOR_R:
return itControl->second.setColorComponent(RlvWindLightControl::COMPONENT_R, nValue);
default:
RLV_ASSERT(false);
}
}
else
{
// Couldn't find the exact name, check for a color control name
RlvWindLightControl::EColorComponent eComponent = RlvWindLightControl::getComponentFromCharacter(strRlvName[strRlvName.length() - 1]);
if (RlvWindLightControl::COMPONENT_NONE != eComponent)
itControl = m_ControlLookupMap.find(strRlvName.substr(0, strRlvName.length() - 1));
if ( (m_ControlLookupMap.end() != itControl) && (itControl->second.isColorType()) )
return itControl->second.setColorComponent(eComponent, nValue);
}
return false;
}
#endif // [EEPMERGE]
// ============================================================================
std::map<std::string, S16> RlvExtGetSet::m_DbgAllowed;
std::map<std::string, std::string> RlvExtGetSet::m_PseudoDebug;
@ -441,27 +91,6 @@ bool RlvExtGetSet::processCommand(const RlvCommand& rlvCmd, ERlvCmdRet& eRet)
return true;
}
}
else if ("env" == strBehaviour)
{
bool fError = false;
if ( ("get" == strGetSet) && (RLV_TYPE_REPLY == rlvCmd.getParamType()) )
{
// [EEPMERGE]
//RlvUtil::sendChatReply(rlvCmd.getParam(), RlvWindLight::instance().getValue(strSetting, fError));
eRet = (!fError) ? RLV_RET_SUCCESS : RLV_RET_FAILED_UNKNOWN;
return true;
}
else if ( ("set" == strGetSet) && (RLV_TYPE_FORCE == rlvCmd.getParamType()) )
{
// [EEPMERGE]
//if (!gRlvHandler.hasBehaviourExcept(RLV_BHVR_SETENV, rlvCmd.getObjectID()))
// eRet = (RlvWindLight::instance().setValue(strSetting, rlvCmd.getOption())) ? RLV_RET_SUCCESS : RLV_RET_FAILED_UNKNOWN;
//else
// eRet = RLV_RET_FAILED_LOCK;
// [/EEPMERGE]
return true;
}
}
}
else if ("setrot" == rlvCmd.getBehaviour())
{

View File

@ -37,8 +37,7 @@
#include "llavataractions.h" // @stopim IM query
#include "llavatarnamecache.h" // @shownames
#include "llavatarlist.h" // @shownames
// [EEPMERGE]
//#include "llenvmanager.h" // @setenv
#include "llfloatercamera.h" // @setcam family
#include "llfloatersidepanelcontainer.h"// @shownames
#include "llnotifications.h" // @list IM query
#include "llnotificationsutil.h"
@ -57,6 +56,7 @@
// RLVa includes
#include "rlvactions.h"
#include "rlvenvironment.h"
#include "rlvfloaters.h"
#include "rlvactions.h"
#include "rlvhandler.h"
@ -152,14 +152,58 @@ RlvHandler::RlvHandler() : m_fCanCancelTp(true), m_posSitSource(), m_pGCTimer(NU
RlvHandler::~RlvHandler()
{
cleanup();
}
void RlvHandler::cleanup()
{
// Nothing to clean if we're not enabled (or already cleaned up)
if (!m_fEnabled)
return;
//
// Clean up any restrictions that are still active
//
RLV_ASSERT(LLApp::isQuitting()); // Several commands toggle debug settings but won't if they know the viewer is quitting
// Assume we have no way to predict how m_Objects will change so make a copy ahead of time
uuid_vec_t idRlvObjects;
idRlvObjects.reserve(m_Objects.size());
std::transform(m_Objects.begin(), m_Objects.end(), std::back_inserter(idRlvObjects), [](const rlv_object_map_t::value_type& kvPair) {return kvPair.first; });
for (const LLUUID & idRlvObj : idRlvObjects)
{
processCommand(idRlvObj, "clear", true);
}
// Sanity check
RLV_ASSERT(m_Objects.empty());
RLV_ASSERT(m_Exceptions.empty());
RLV_ASSERT(std::all_of(m_Behaviours, m_Behaviours + RLV_BHVR_COUNT, [](S16 cnt) { return !cnt; }));
RLV_ASSERT(m_CurCommandStack.empty());
RLV_ASSERT(m_CurObjectStack.empty());
RLV_ASSERT(m_pOverlayImage.isNull());
//
// Clean up what's left
//
gAgent.removeListener(this);
m_Retained.clear();
//delete m_pGCTimer; // <- deletes itself
if (m_PendingGroupChange.first.notNull())
{
LLGroupMgr::instance().removeObserver(m_PendingGroupChange.first, this);
if (LLGroupMgr::instanceExists())
LLGroupMgr::instance().removeObserver(m_PendingGroupChange.first, this);
m_PendingGroupChange = std::make_pair(LLUUID::null, LLStringUtil::null);
}
//delete m_pGCTimer; // <- deletes itself
for (RlvExtCommandHandler* pCmdHandler : m_CommandHandlers)
{
delete pCmdHandler;
}
m_CommandHandlers.clear();
m_fEnabled = false;
}
// ============================================================================
@ -823,6 +867,23 @@ void RlvHandler::setActiveGroupRole(const LLUUID& idGroup, const std::string& st
m_PendingGroupChange = std::make_pair(LLUUID::null, LLStringUtil::null);
}
// @setcam family
void RlvHandler::setCameraOverride(bool fOverride)
{
if ( (fOverride) && (CAMERA_RLV_SETCAM_VIEW != gAgentCamera.getCameraPreset()) )
{
m_strCameraPresetRestore = gSavedSettings.getString("PresetCameraActive");
gAgentCamera.switchCameraPreset(CAMERA_RLV_SETCAM_VIEW);
}
else if ( (!fOverride) && (CAMERA_RLV_SETCAM_VIEW == gAgentCamera.getCameraPreset() && (!RlvActions::isCameraPresetLocked())) )
{
// We need to clear it or it won't reset properly
gSavedSettings.setString("PresetCameraActive", LLStringUtil::null);
LLFloaterCamera::switchToPreset(m_strCameraPresetRestore);
m_strCameraPresetRestore.clear();
}
}
// ============================================================================
// Externally invoked event handlers
//
@ -1047,6 +1108,12 @@ bool RlvHandler::onGC()
return (0 != m_Objects.size()); // GC will kill itself if it has nothing to do
}
// static
void RlvHandler::cleanupClass()
{
gRlvHandler.cleanup();
}
// Checked: 2009-11-26 (RLVa-1.1.0f) | Added: RLVa-1.1.0f
void RlvHandler::onIdleStartup(void* pParam)
{
@ -1448,6 +1515,7 @@ bool RlvHandler::setEnabled(bool fEnable)
RlvSettings::initClass();
RlvStrings::initClass();
RlvHandler::instance().addCommandHandler(new RlvEnvironment());
RlvHandler::instance().addCommandHandler(new RlvExtGetSet());
// Make sure we get notified when login is successful
@ -2071,20 +2139,23 @@ void RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_AVDISTMIN>::onValueChange()
gAgentCamera.changeCameraToThirdPerson();
}
// Handles: @setcam_eyeoffset:<vector3>=n|y and @setcam_focusoffset:<vector3>=n|y toggles
// Handles: @setcam_eyeoffset:<vector3>=n|y, @setcam_eyeoffsetscale:<float>=n|y and @setcam_focusoffset:<vector3>=n|y toggles
template<> template<>
void RlvBehaviourCamEyeFocusOffsetHandler::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
{
if (fHasBhvr)
{
gAgentCamera.switchCameraPreset(CAMERA_RLV_SETCAM_VIEW);
gRlvHandler.setCameraOverride(true);
}
else
{
const RlvBehaviourModifier* pBhvrEyeModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_EYEOFFSET);
const RlvBehaviourModifier* pBhvrOffsetModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_FOCUSOFFSET);
if ( (!pBhvrEyeModifier->hasValue()) && (!pBhvrOffsetModifier->hasValue()) )
gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
const RlvBehaviourModifier* pBhvrEyeOffsetModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_EYEOFFSET);
const RlvBehaviourModifier* pBhvrEyeOffsetScaleModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_EYEOFFSETSCALE);
const RlvBehaviourModifier* pBhvrFocusOffsetModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_FOCUSOFFSET);
if ( (!pBhvrEyeOffsetModifier->hasValue()) && (!pBhvrEyeOffsetScaleModifier->hasValue()) && (!pBhvrFocusOffsetModifier->hasValue()) )
{
gRlvHandler.setCameraOverride(false);
}
}
}
@ -2102,7 +2173,21 @@ void RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_EYEOFFSET>::onValueChange()
}
}
// Handles: @setcam_focusoffset:<vector3>=n|y changes
// Handles: @setcam_eyeoffsetscale:<float>=n|y changes
template<>
void RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_EYEOFFSETSCALE>::onValueChange() const
{
if (RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_EYEOFFSETSCALE))
{
LLControlVariable* pControl = gSavedSettings.getControl("CameraOffsetScaleRLVa");
if (pBhvrModifier->hasValue())
pControl->setValue(pBhvrModifier->getValue<float>());
else
pControl->resetToDefault();
}
}
// Handles: @setcam_focusoffset:<vector3d>=n|y changes
template<>
void RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOCUSOFFSET>::onValueChange() const
{
@ -2110,7 +2195,7 @@ void RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOCUSOFFSET>::onValueChange
{
LLControlVariable* pControl = gSavedSettings.getControl("FocusOffsetRLVaView");
if (pBhvrModifier->hasValue())
pControl->setValue(pBhvrModifier->getValue<LLVector3>().getValue());
pControl->setValue(pBhvrModifier->getValue<LLVector3d>().getValue());
else
pControl->resetToDefault();
}
@ -2229,12 +2314,13 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SETCAM>::onCommandToggle(ERlvBehaviour e
if (fHasCamUnlock != gRlvHandler.hasBehaviour(RLV_BHVR_SETCAM_UNLOCK))
RlvBehaviourToggleHandler<RLV_BHVR_SETCAM_UNLOCK>::onCommandToggle(RLV_BHVR_SETCAM_UNLOCK, !fHasCamUnlock);
gAgentCamera.switchCameraPreset( (fHasBhvr) ? CAMERA_RLV_SETCAM_VIEW : CAMERA_PRESET_REAR_VIEW );
gRlvHandler.setCameraOverride(fHasBhvr);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_AVDISTMIN)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_AVDISTMAX)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_ORIGINDISTMIN)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_ORIGINDISTMAX)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_EYEOFFSET)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_EYEOFFSETSCALE)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_FOCUSOFFSET)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_FOVMIN)->setPrimaryObject(idRlvObject);
RlvBehaviourDictionary::instance().getModifier(RLV_MODIFIER_SETCAM_FOVMAX)->setPrimaryObject(idRlvObject);
@ -2256,7 +2342,7 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SETDEBUG>::onCommandToggle(ERlvBehaviour
template<> template<>
void RlvBehaviourToggleHandler<RLV_BHVR_SETENV>::onCommandToggle(ERlvBehaviour eBhvr, bool fHasBhvr)
{
const std::string strEnvFloaters[] = { "env_post_process", "env_settings", "env_delete_preset", "env_edit_sky", "env_edit_water", "env_edit_day_cycle" };
const std::string strEnvFloaters[] = { "env_adjust_snapshot", "env_edit_extdaycycle", "env_fixed_environmentent_sky", "env_fixed_environmentent_water", "my_environments" };
for (int idxFloater = 0, cntFloater = sizeof(strEnvFloaters) / sizeof(std::string); idxFloater < cntFloater; idxFloater++)
{
if (fHasBhvr)
@ -2273,13 +2359,26 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SETENV>::onCommandToggle(ERlvBehaviour e
}
}
// Don't allow toggling "Basic Shaders" and/or "Atmopsheric Shaders" through the debug settings under @setenv=n
// Don't allow toggling "Atmopsheric Shaders" through the debug settings under @setenv=n
gSavedSettings.getControl("WindLightUseAtmosShaders")->setHiddenFromSettingsEditor(fHasBhvr);
// Restore the user's WindLight preferences when releasing
// [EEPMERGE] Use LLEnvironment::loadPreferences()???
//if (!fHasBhvr)
// LLEnvManagerNew::instance().usePrefs();
if (fHasBhvr)
{
// Usurp the 'edit' environment for RLVa locking so TPV tools like quick prefs and phototools are automatically locked out as well
// (these needed per-feature awareness of RLV in the previous implementation which often wasn't implemented)
LLEnvironment* pEnv = LLEnvironment::getInstance();
LLSettingsSky::ptr_t pRlvSky = pEnv->getEnvironmentFixedSky(LLEnvironment::ENV_LOCAL, true)->buildClone();
pEnv->setEnvironment(LLEnvironment::ENV_EDIT, pRlvSky);
pEnv->setSelectedEnvironment(LLEnvironment::ENV_EDIT, LLEnvironment::TRANSITION_INSTANT);
pEnv->updateEnvironment(LLEnvironment::TRANSITION_INSTANT);
}
else
{
// Restore the user's WindLight preferences when releasing
LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT);
LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL);
LLEnvironment::instance().updateEnvironment();
}
}
// Handles: @showhovertext:<uuid>=n|y
@ -2403,13 +2502,12 @@ void RlvBehaviourToggleHandler<RLV_BHVR_SHOWNAMES>::onCommandToggle(ERlvBehaviou
// Force the use of the "display name" cache so we can filter both display and legacy names (or return back to the user's preference)
if (fHasBhvr)
{
LLAvatarNameCache::getInstance()->setForceDisplayNames(true);
LLAvatarNameCache::instance().setForceDisplayNames(true);
}
else
{
LLAvatarNameCache* inst = LLAvatarNameCache::getInstance();
inst->setForceDisplayNames(false);
inst->setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames"));
LLAvatarNameCache::instance().setForceDisplayNames(false);
LLAvatarNameCache::instance().setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames"));
}
// Refresh all name tags and HUD text
@ -2726,7 +2824,7 @@ ERlvCmdRet RlvForceHandler<RLV_BHVR_REMOUTFIT>::onCommand(const RlvCommand& rlvC
return RLV_RET_SUCCESS;
}
// Handles: @setcam_eyeoffset[:<vector3>]=force and @setcam_focusoffset[:<vector3>]=force
// Handles: @setcam_eyeoffset[:<vector3>]=force, @setcam_eyeoffsetscale[:<float>]=force and @setcam_focusoffset[:<vector3>]=force
template<> template<>
ERlvCmdRet RlvForceCamEyeFocusOffsetHandler::onCommand(const RlvCommand& rlvCmd)
{
@ -2734,22 +2832,54 @@ ERlvCmdRet RlvForceCamEyeFocusOffsetHandler::onCommand(const RlvCommand& rlvCmd)
if (!RlvActions::canChangeCameraPreset(rlvCmd.getObjectID()))
return RLV_RET_FAILED_LOCK;
LLControlVariable* pOffsetControl = gSavedSettings.getControl("CameraOffsetRLVaView");
LLControlVariable* pFocusControl = gSavedSettings.getControl("FocusOffsetRLVaView");
LLControlVariable* pControl = (rlvCmd.getBehaviourType() == RLV_BHVR_SETCAM_EYEOFFSET) ? pOffsetControl : pFocusControl;
if (rlvCmd.hasOption())
LLControlVariable* pEyeOffsetControl = gSavedSettings.getControl("CameraOffsetRLVaView");
LLControlVariable* pEyeOffsetScaleControl = gSavedSettings.getControl("CameraOffsetScaleRLVa");
LLControlVariable* pFocusOffsetControl = gSavedSettings.getControl("FocusOffsetRLVaView");
LLControlVariable* pControl; LLSD sdControlValue;
switch (rlvCmd.getBehaviourType())
{
LLVector3 vecOffset;
if (!RlvCommandOptionHelper::parseOption(rlvCmd.getOption(), vecOffset))
return RLV_RET_FAILED_OPTION;
pControl->setValue(vecOffset.getValue());
}
else
{
pControl->resetToDefault();
case RLV_BHVR_SETCAM_EYEOFFSET:
if (rlvCmd.hasOption())
{
LLVector3 vecOffset;
if (!RlvCommandOptionHelper::parseOption(rlvCmd.getOption(), vecOffset))
return RLV_RET_FAILED_OPTION;
sdControlValue = vecOffset.getValue();
}
pControl = pEyeOffsetControl;
break;
case RLV_BHVR_SETCAM_EYEOFFSETSCALE:
if (rlvCmd.hasOption())
{
float nScale;
if (!RlvCommandOptionHelper::parseOption(rlvCmd.getOption(), nScale))
return RLV_RET_FAILED_OPTION;
sdControlValue = nScale;
}
pControl = pEyeOffsetScaleControl;
break;
case RLV_BHVR_SETCAM_FOCUSOFFSET:
if (rlvCmd.hasOption())
{
LLVector3d vecOffset;
if (!RlvCommandOptionHelper::parseOption(rlvCmd.getOption(), vecOffset))
return RLV_RET_FAILED_OPTION;
sdControlValue = vecOffset.getValue();
}
pControl = pFocusOffsetControl;
break;
default:
return RLV_RET_FAILED;
}
gAgentCamera.switchCameraPreset( ((pOffsetControl->isDefault()) && (pFocusControl->isDefault())) ? CAMERA_PRESET_REAR_VIEW : CAMERA_RLV_SETCAM_VIEW);
if (!sdControlValue.isUndefined())
pControl->setValue(sdControlValue);
else
pControl->resetToDefault();
// NOTE: this doesn't necessarily release the camera preset even if all 3 are at their default now (e.g. @setcam is currently set)
gRlvHandler.setCameraOverride( (!pEyeOffsetControl->isDefault()) || (!pEyeOffsetScaleControl->isDefault()) || (!pFocusOffsetControl->isDefault()) );
return RLV_RET_SUCCESS;
}
@ -3440,6 +3570,19 @@ ERlvCmdRet RlvReplyHandler<RLV_BHVR_GETCOMMAND>::onCommand(const RlvCommand& rlv
return RLV_RET_SUCCESS;
}
// Handles: @getheightoffset=<channel>
template<> template<>
ERlvCmdRet RlvReplyHandler<RLV_BHVR_GETHEIGHTOFFSET>::onCommand(const RlvCommand& rlvCmd, std::string& strReply)
{
if (!rlvCmd.getOption().empty())
return RLV_RET_FAILED_OPTION;
else if (!isAgentAvatarValid())
return RLV_RET_FAILED_UNKNOWN;
strReply = llformat("%.2f", gAgentAvatarp->getHoverOffset()[VZ] * 100);
return RLV_RET_SUCCESS;
}
// Checked: 2010-03-09 (RLVa-1.2.0a) | Modified: RLVa-1.1.0f
ERlvCmdRet RlvHandler::onGetInv(const RlvCommand& rlvCmd, std::string& strReply) const
{
@ -3568,7 +3711,8 @@ ERlvCmdRet RlvHandler::onGetOutfit(const RlvCommand& rlvCmd, std::string& strRep
LLWearableType::WT_GLOVES, LLWearableType::WT_JACKET, LLWearableType::WT_PANTS, LLWearableType::WT_SHIRT,
LLWearableType::WT_SHOES, LLWearableType::WT_SKIRT, LLWearableType::WT_SOCKS, LLWearableType::WT_UNDERPANTS,
LLWearableType::WT_UNDERSHIRT, LLWearableType::WT_SKIN, LLWearableType::WT_EYES, LLWearableType::WT_HAIR,
LLWearableType::WT_SHAPE, LLWearableType::WT_ALPHA, LLWearableType::WT_TATTOO, LLWearableType::WT_PHYSICS
LLWearableType::WT_SHAPE, LLWearableType::WT_ALPHA, LLWearableType::WT_TATTOO, LLWearableType::WT_PHYSICS,
LLWearableType::WT_UNIVERSAL,
};
for (int idxType = 0, cntType = sizeof(wtRlvTypes) / sizeof(LLWearableType::EType); idxType < cntType; idxType++)

View File

@ -147,6 +147,7 @@ protected:
void clearOverlayImage(); // @setoverlay=n
void setActiveGroup(const LLUUID& idGroup); // @setgroup=force
void setActiveGroupRole(const LLUUID& idGroup, const std::string& strRole); // @setgroup=force
void setCameraOverride(bool fOverride); // @setcam family
void setOverlayImage(const LLUUID& idTexture); // @setoverlay=n
void onIMQueryListResponse(const LLSD& sdNotification, const LLSD sdResponse);
@ -173,6 +174,7 @@ protected:
// Externally invoked event handlers
public:
void cleanup();
void onActiveGroupChanged();
void onAttach(const LLViewerObject* pAttachObj, const LLViewerJointAttachment* pAttachPt);
void onDetach(const LLViewerObject* pAttachObj, const LLViewerJointAttachment* pAttachPt);
@ -183,6 +185,7 @@ public:
void onSitOrStand(bool fSitting);
void onTeleportFailed();
void onTeleportFinished(const LLVector3d& posArrival);
static void cleanupClass();
static void onIdleStartup(void* pParam);
protected:
void getAttachmentResourcesCoro(const std::string& strUrl);
@ -263,6 +266,8 @@ protected:
LLPointer<LLViewerFetchedTexture> m_pOverlayImage = nullptr; // @setoverlay=n
int m_nOverlayOrigBoost = 0; // @setoverlay=n
std::string m_strCameraPresetRestore; // @setcam_eyeoffset, @setcam_eyeoffsetscale and @setcam_focusoffset
friend class RlvSharedRootFetcher; // Fetcher needs access to m_fFetchComplete
friend class RlvGCTimer; // Timer clear its own point at destruction
template<ERlvBehaviourOptionType> friend struct RlvBehaviourGenericHandler;

View File

@ -193,10 +193,12 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addModifier(RLV_BHVR_SETCAM_ORIGINDISTMIN, RLV_MODIFIER_SETCAM_ORIGINDISTMIN, new RlvBehaviourModifier("Camera - Focus Distance (Min)", 0.0f, true, new RlvBehaviourModifierCompMax));
addEntry(new RlvBehaviourGenericProcessor<RLV_OPTION_MODIFIER>("setcam_origindistmax", RLV_BHVR_SETCAM_ORIGINDISTMAX, RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(RLV_BHVR_SETCAM_ORIGINDISTMAX, RLV_MODIFIER_SETCAM_ORIGINDISTMAX, new RlvBehaviourModifier("Camera - Focus Distance (Max)", F32_MAX, true, new RlvBehaviourModifierCompMin));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_EYEOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_eyeoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_EYEOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_eyeoffset"));
addModifier(RLV_BHVR_SETCAM_EYEOFFSET, RLV_MODIFIER_SETCAM_EYEOFFSET, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_EYEOFFSET>("Camera - Eye Offset", LLVector3::zero, true, nullptr));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_focusoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addModifier(RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_MODIFIER_SETCAM_FOCUSOFFSET, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOCUSOFFSET>("Camera - Focus Offset", LLVector3::zero, true, nullptr));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_EYEOFFSETSCALE, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_eyeoffsetscale"));
addModifier(RLV_BHVR_SETCAM_EYEOFFSETSCALE, RLV_MODIFIER_SETCAM_EYEOFFSETSCALE, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_EYEOFFSETSCALE>("Camera - Eye Offset Scale", 0, true, nullptr));
addEntry(new RlvBehaviourGenericToggleProcessor<RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_OPTION_MODIFIER, RlvBehaviourCamEyeFocusOffsetHandler>("setcam_focusoffset"));
addModifier(RLV_BHVR_SETCAM_FOCUSOFFSET, RLV_MODIFIER_SETCAM_FOCUSOFFSET, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOCUSOFFSET>("Camera - Focus Offset", LLVector3d::zero, true, nullptr));
addEntry(new RlvBehaviourProcessor<RLV_BHVR_SETCAM_FOVMIN, RlvBehaviourSetCamFovHandler>("setcam_fovmin"));
addModifier(RLV_BHVR_SETCAM_FOVMIN, RLV_MODIFIER_SETCAM_FOVMIN, new RlvBehaviourModifierHandler<RLV_MODIFIER_SETCAM_FOVMIN>("Camera - FOV (Min)", DEFAULT_FIELD_OF_VIEW, true, new RlvBehaviourModifierCompMax));
addEntry(new RlvBehaviourProcessor<RLV_BHVR_SETCAM_FOVMAX, RlvBehaviourSetCamFovHandler>("setcam_fovmax"));
@ -265,8 +267,9 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvForceProcessor<RLV_BHVR_DETACHME>("detachme"));
addEntry(new RlvForceProcessor<RLV_BHVR_FLY>("fly"));
addEntry(new RlvForceProcessor<RLV_BHVR_SETCAM_FOCUS>("setcam_focus", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvForceProcessor<RLV_BHVR_SETCAM_EYEOFFSET, RlvForceCamEyeFocusOffsetHandler>("setcam_eyeoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvForceProcessor<RLV_BHVR_SETCAM_FOCUSOFFSET, RlvForceCamEyeFocusOffsetHandler>("setcam_focusoffset", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvForceProcessor<RLV_BHVR_SETCAM_EYEOFFSET, RlvForceCamEyeFocusOffsetHandler>("setcam_eyeoffset"));
addEntry(new RlvForceProcessor<RLV_BHVR_SETCAM_EYEOFFSETSCALE, RlvForceCamEyeFocusOffsetHandler>("setcam_eyeoffsetscale"));
addEntry(new RlvForceProcessor<RLV_BHVR_SETCAM_FOCUSOFFSET, RlvForceCamEyeFocusOffsetHandler>("setcam_focusoffset"));
addEntry(new RlvForceProcessor<RLV_BHVR_SETCAM_FOV>("setcam_fov", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvForceProcessor<RLV_BHVR_SETCAM_MODE>("setcam_mode", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvForceProcessor<RLV_BHVR_SETGROUP>("setgroup"));
@ -292,6 +295,7 @@ RlvBehaviourDictionary::RlvBehaviourDictionary()
addEntry(new RlvReplyProcessor<RLV_BHVR_GETCAM_TEXTURES>("getcam_textures", RlvBehaviourInfo::BHVR_EXPERIMENTAL));
addEntry(new RlvReplyProcessor<RLV_BHVR_GETCOMMAND>("getcommand", RlvBehaviourInfo::BHVR_EXTENDED));
addEntry(new RlvBehaviourInfo("getgroup", RLV_BHVR_GETGROUP, RLV_TYPE_REPLY));
addEntry(new RlvReplyProcessor<RLV_BHVR_GETHEIGHTOFFSET>("getheightoffset", RlvBehaviourInfo::BHVR_EXTENDED));
addEntry(new RlvBehaviourInfo("getinv", RLV_BHVR_GETINV, RLV_TYPE_REPLY));
addEntry(new RlvBehaviourInfo("getinvworn", RLV_BHVR_GETINVWORN, RLV_TYPE_REPLY));
addEntry(new RlvBehaviourInfo("getoutfit", RLV_BHVR_GETOUTFIT, RLV_TYPE_REPLY));
@ -688,6 +692,13 @@ bool RlvCommand::parseCommand(const std::string& strCommand, std::string& strBeh
// Command option parsing utility classes
//
template<>
bool RlvCommandOptionHelper::parseOption<std::string>(const std::string& strOption, std::string& valueOption)
{
valueOption = strOption;
return true;
}
template<>
bool RlvCommandOptionHelper::parseOption<LLUUID>(const std::string& strOption, LLUUID& idOption)
{
@ -769,6 +780,17 @@ bool RlvCommandOptionHelper::parseOption<LLViewerInventoryCategory*>(const std::
return pFolder != NULL;
}
template<>
bool RlvCommandOptionHelper::parseOption<LLVector2>(const std::string& strOption, LLVector2& vecOption)
{
if (!strOption.empty())
{
S32 cntToken = sscanf(strOption.c_str(), "%f/%f", vecOption.mV + 0, vecOption.mV + 1);
return (2 == cntToken);
}
return false;
}
template<>
bool RlvCommandOptionHelper::parseOption<LLVector3>(const std::string& strOption, LLVector3& vecOption)
{
@ -791,6 +813,17 @@ bool RlvCommandOptionHelper::parseOption<LLVector3d>(const std::string& strOptio
return false;
}
template<>
bool RlvCommandOptionHelper::parseOption<LLColor3>(const std::string& strOption, LLColor3& clrOption)
{
if (!strOption.empty())
{
S32 cntToken = sscanf(strOption.c_str(), "%f/%f/%f", clrOption.mV + 0, clrOption.mV + 1, clrOption.mV + 2);
return (3 == cntToken);
}
return false;
}
template<>
bool RlvCommandOptionHelper::parseOption<RlvCommandOptionGeneric>(const std::string& strOption, RlvCommandOptionGeneric& genericOption)
{

View File

@ -172,7 +172,7 @@ template<ERlvBehaviour templBhvr> using RlvForceHandler = RlvCommandHandler<RLV_
template<ERlvBehaviour templBhvr> using RlvReplyHandler = RlvCommandHandler<RLV_TYPE_REPLY, templBhvr>;
// List of shared handlers
typedef RlvBehaviourToggleHandler<RLV_BHVR_SETCAM_EYEOFFSET> RlvBehaviourCamEyeFocusOffsetHandler; // Shared between @setcam_eyeoffset and @setcam_focusoffset
typedef RlvBehaviourToggleHandler<RLV_BHVR_SETCAM_EYEOFFSET> RlvBehaviourCamEyeFocusOffsetHandler; // Shared between @setcam_eyeoffset, @setcam_eyeoffsetscale and @setcam_focusoffset
typedef RlvBehaviourHandler<RLV_BHVR_REMATTACH> RlvBehaviourAddRemAttachHandler; // Shared between @addattach and @remattach
typedef RlvBehaviourHandler<RLV_BHVR_SENDCHANNEL> RlvBehaviourSendChannelHandler; // Shared between @sendchannel and @sendchannel_except
typedef RlvBehaviourHandler<RLV_BHVR_SENDIM> RlvBehaviourRecvSendStartIMHandler; // Shared between @recvim, @sendim and @startim
@ -181,7 +181,7 @@ typedef RlvBehaviourToggleHandler<RLV_BHVR_SHOWSELF> RlvBehaviourShowSelfToggleH
typedef RlvBehaviourHandler<RLV_BHVR_CAMZOOMMIN> RlvBehaviourCamZoomMinMaxHandler; // Shared between @camzoommin and @camzoommax (deprecated)
typedef RlvReplyHandler<RLV_BHVR_GETCAM_AVDISTMIN> RlvReplyCamMinMaxModifierHandler; // Shared between @getcam_avdistmin and @getcam_avdistmax
typedef RlvForceHandler<RLV_BHVR_REMATTACH> RlvForceRemAttachHandler; // Shared between @remattach and @detach
typedef RlvForceHandler<RLV_BHVR_SETCAM_EYEOFFSET> RlvForceCamEyeFocusOffsetHandler; // Shared between @setcam_eyeoffset and @setcam_focusoffset
typedef RlvForceHandler<RLV_BHVR_SETCAM_EYEOFFSET> RlvForceCamEyeFocusOffsetHandler; // Shared between @setcam_eyeoffset, @setcam_eyeoffsetscale and @setcam_focusoffset
//
// RlvCommandProcessor - Templated glue class that brings RlvBehaviourInfo, RlvCommandHandlerBaseImpl and RlvCommandHandler together

View File

@ -578,36 +578,56 @@ void RlvGiveToRLVOffer::onCategoryCreateCallback(LLUUID idFolder, RlvGiveToRLVOf
pInstance->onDestinationCreated(idFolder, pInstance->m_DestPath.front());
}
// Checked: 2014-01-07 (RLVa-1.4.10)
void RlvGiveToRLVOffer::moveAndRename(const LLUUID& idFolder, const LLUUID& idDestination, const std::string& strName)
// static
void RlvGiveToRLVOffer::moveAndRename(const LLUUID& idFolder, const LLUUID& idDestination, const std::string& strName, const LLPointer<LLInventoryCallback> cbFinal)
{
const LLViewerInventoryCategory* pDest = gInventory.getCategory(idDestination);
const LLViewerInventoryCategory* pFolder = gInventory.getCategory(idFolder);
if ( (pDest) && (pFolder) )
if ( (idDestination.notNull()) && (pFolder) )
{
LLPointer<LLViewerInventoryCategory> pNewFolder = new LLViewerInventoryCategory(pFolder);
if (pDest->getUUID() != pFolder->getParentUUID())
{
LLInventoryModel::update_list_t update;
LLInventoryModel::LLCategoryUpdate updOldParent(pFolder->getParentUUID(), -1);
update.push_back(updOldParent);
LLInventoryModel::LLCategoryUpdate updNewParent(pDest->getUUID(), 1);
update.push_back(updNewParent);
gInventory.accountForUpdate(update);
bool needsRename = (pFolder->getName() != strName);
pNewFolder->setParent(pDest->getUUID());
pNewFolder->updateParentOnServer(FALSE);
LLPointer<LLInventoryCallback> cbMove;
if (idDestination != pFolder->getParentUUID())
{
// We have to move *after* the rename operation completes or AIS will drop it
if (!needsRename)
{
LLInventoryModel::update_list_t update;
LLInventoryModel::LLCategoryUpdate updOldParent(pFolder->getParentUUID(), -1);
update.push_back(updOldParent);
LLInventoryModel::LLCategoryUpdate updNewParent(idDestination, 1);
update.push_back(updNewParent);
gInventory.accountForUpdate(update);
LLPointer<LLViewerInventoryCategory> pNewFolder = new LLViewerInventoryCategory(pFolder);
pNewFolder->setParent(idDestination);
pNewFolder->updateParentOnServer(FALSE);
gInventory.updateCategory(pNewFolder);
gInventory.notifyObservers();
if (cbFinal)
{
cbFinal.get()->fire(idFolder);
}
}
else
{
cbMove = new LLBoostFuncInventoryCallback(boost::bind(RlvGiveToRLVOffer::moveAndRename, _1, idDestination, strName, cbFinal));
}
}
pNewFolder->rename(strName);
pNewFolder->updateServer(FALSE);
gInventory.updateCategory(pNewFolder);
gInventory.notifyObservers();
if (needsRename)
{
rename_category(&gInventory, idFolder, strName, (cbMove) ? cbMove : cbFinal);
}
}
else if (cbFinal)
{
cbFinal.get()->fire(LLUUID::null);
}
}
// Checked: 2010-04-18 (RLVa-1.2.0)
void RlvGiveToRLVTaskOffer::changed(U32 mask)
{
if (mask & LLInventoryObserver::ADD)
@ -633,7 +653,6 @@ void RlvGiveToRLVTaskOffer::changed(U32 mask)
}
}
// Checked: 2010-04-18 (RLVa-1.2.0)
void RlvGiveToRLVTaskOffer::done()
{
gInventory.removeObserver(this);
@ -642,22 +661,29 @@ void RlvGiveToRLVTaskOffer::done()
doOnIdleOneTime(boost::bind(&RlvGiveToRLVTaskOffer::doneIdle, this));
}
// Checked: 2014-01-07 (RLVa-1.4.10)
void RlvGiveToRLVTaskOffer::doneIdle()
{
const LLViewerInventoryCategory* pFolder = (m_Folders.size()) ? gInventory.getCategory(m_Folders.front()) : NULL;
const LLViewerInventoryCategory* pFolder = (m_Folders.size()) ? gInventory.getCategory(m_Folders.front()) : nullptr;
if ( (!pFolder) || (!createDestinationFolder(pFolder->getName())) )
delete this;
}
// Checked: 2010-04-18 (RLVa-1.2.0)
void RlvGiveToRLVTaskOffer::onDestinationCreated(const LLUUID& idFolder, const std::string& strName)
void RlvGiveToRLVTaskOffer::onDestinationCreated(const LLUUID& idDestFolder, const std::string& strName)
{
const LLViewerInventoryCategory* pTarget = (idFolder.notNull()) ? gInventory.getCategory(idFolder) : NULL;
if (pTarget)
if (const LLViewerInventoryCategory* pTarget = (idDestFolder.notNull()) ? gInventory.getCategory(idDestFolder) : nullptr)
{
moveAndRename(m_Folders.front(), idDestFolder, strName, new LLBoostFuncInventoryCallback(boost::bind(&RlvGiveToRLVTaskOffer::onOfferCompleted, this, _1)));
}
else
{
onOfferCompleted(LLUUID::null);
}
}
void RlvGiveToRLVTaskOffer::onOfferCompleted(const LLUUID& idOfferedFolder)
{
if (idOfferedFolder.notNull())
{
const LLUUID& idOfferedFolder = m_Folders.front();
moveAndRename(idOfferedFolder, idFolder, strName);
RlvBehaviourNotifyHandler::sendNotification("accepted_in_rlv inv_offer " + RlvInventory::instance().getSharedPath(idOfferedFolder));
}
delete this;
@ -684,7 +710,7 @@ void RlvGiveToRLVAgentOffer::doneIdle()
void RlvGiveToRLVAgentOffer::onDestinationCreated(const LLUUID& idFolder, const std::string& strName)
{
if ( (idFolder.notNull()) && (mComplete.size()) )
moveAndRename(mComplete[0], idFolder, strName);
moveAndRename(mComplete[0], idFolder, strName, nullptr);
delete this;
}

View File

@ -130,8 +130,8 @@ protected:
virtual ~RlvGiveToRLVOffer() {}
protected:
bool createDestinationFolder(const std::string& strPath);
virtual void onDestinationCreated(const LLUUID& idFolder, const std::string& strName) = 0;
void moveAndRename(const LLUUID& idFolder, const LLUUID& idDestination, const std::string& strName);
virtual void onDestinationCreated(const LLUUID& idDestFolder, const std::string& strName) = 0;
static void moveAndRename(const LLUUID& idFolder, const LLUUID& idDestination, const std::string& strName, LLPointer<LLInventoryCallback> cb);
private:
static void onCategoryCreateCallback(LLUUID idFolder, RlvGiveToRLVOffer* pInstance);
@ -146,11 +146,12 @@ class RlvGiveToRLVTaskOffer : public LLInventoryObserver, RlvGiveToRLVOffer
{
public:
RlvGiveToRLVTaskOffer(const LLUUID& idTransaction) : RlvGiveToRLVOffer(), m_idTransaction(idTransaction) {}
/*virtual*/ void changed(U32 mask);
void changed(U32 mask) override;
protected:
/*virtual*/ void done();
void doneIdle();
/*virtual*/ void onDestinationCreated(const LLUUID& idFolder, const std::string& strName);
void done();
void doneIdle();
void onDestinationCreated(const LLUUID& idDestFolder, const std::string& strName) override;
void onOfferCompleted(const LLUUID& idOfferedFolder);
protected:
typedef std::vector<LLUUID> folder_ref_t;

View File

@ -136,7 +136,6 @@ void RlvUIEnabler::onToggleShowLoc()
// If the last entry in the persistent teleport history matches the current teleport history entry then we should remove it
LLTeleportHistory* pTpHistory = LLTeleportHistory::getInstance();
LLTeleportHistoryStorage* pTpHistoryStg = LLTeleportHistoryStorage::getInstance();
RLV_ASSERT( (pTpHistory) && (pTpHistoryStg) && (pTpHistory->getItems().size() > 0) && (pTpHistory->getCurrentItemIndex() >= 0) );
if ( (pTpHistory) && (pTpHistory->getItems().size() > 0) && (pTpHistory->getCurrentItemIndex() >= 0) &&
(pTpHistoryStg) && (pTpHistoryStg->getItems().size() > 0) )
{

View File

@ -42,6 +42,7 @@
<menu_item_call name="inventory_new_undershirt" label="Nowy podkoszulek" />
<menu_item_call name="inventory_new_underpants" label="Nową bieliznę" />
<menu_item_call name="inventory_new_tattoo" label="Nowy tatuaż" />
<menu_item_call name="inventory_new_universal" label="Nową warstwę uniwersalną" />
<menu_item_call name="inventory_new_alpha" label="Nową warstwę alpha" />
<menu_item_call name="inventory_new_physics" label="Nową fizykę" />
</menu>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_eyes_panel">
<panel name="avatar_eye_color_panel">
<texture_picker label="Ирис" name="Iris" tool_tip="Нажмите, чтобы выбрать изображение"/>
<texture_picker label="Радужка" name="Iris" tool_tip="Нажмите, чтобы выбрать изображение"/>
</panel>
<panel name="eyes_main_tab_holder">
<accordion name="eyes_main_accordion">

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
<texture_picker label="Верхняя текстура" name="Upper Fabric" tool_tip="Нажмите, чтобы выбрать изображение"/>
<texture_picker label="Нижняя текстура" name="Lower Fabric" tool_tip="Нажмите, чтобы выбрать изображение"/>
<texture_picker label="Верх" name="Upper Fabric" tool_tip="Нажмите, чтобы выбрать изображение"/>
<texture_picker label="Низ" name="Lower Fabric" tool_tip="Нажмите, чтобы выбрать изображение"/>
<color_swatch label="Цвет" name="Color/Tint" tool_tip="Нажмите, чтобы выбрать цвет"/>
</panel>
<panel name="jacket_main_tab_holder">

View File

@ -4,7 +4,7 @@
Метры
</string>
<string name="feet">
Ноги
Футы
</string>
<string name="height">
Высота:

View File

@ -3,5 +3,5 @@
<text name="title" value="Отправитель / Группа"/>
<text name="group_notice" value="Объявление группы"/>
<text name="attachment" value="Вложение"/>
<button label="Другие объявления" name="btn_notices"/>
<button label="Объявления" name="btn_notices"/>
</panel>

View File

@ -15,6 +15,7 @@
<menu_item_call name="inventory_share" label="Поделиться" />
<menu_item_call name="replace_links" label="Заменить ссылки" />
<menu_item_call name="inventory_new_window" label="Новое окно" />
<menu_item_check label="Защищенные Папки" name="Protected Folders"/>
<menu_item_check name="add_inv_toggle" label="Добавление объектов по двойному нажатию" />
<menu_item_check name="add_invclothing_toggle" label="Добавление одежды по двойному нажатию" />
<menu_item_call name="inventory_show_filters" label="Показать фильтры" />
@ -38,6 +39,7 @@
<menu_item_call name="inventory_new_undershirt" label="Новая майка" />
<menu_item_call name="inventory_new_underpants" label="Новые трусы" />
<menu_item_call name="inventory_new_tattoo" label="Новая татуировка" />
<menu_item_call name="inventory_new_universal" label="Новый универсальный"/>
<menu_item_call name="inventory_new_alpha" label="Новая альфа" />
<menu_item_call name="inventory_new_physics" label="Новая физика" />
</menu>
@ -47,6 +49,11 @@
<menu_item_call name="inventory_new_hair" label="Новые волосы" />
<menu_item_call name="inventory_new_eyes" label="Новые глаза" />
</menu>
<menu label="Новые Настройки" name="New Settings">
<menu_item_call label="Новое Небо" name="New Sky"/>
<menu_item_call label="Новая Вода" name="New Water"/>
<menu_item_call label="Новый Цикл Дня" name="New Day Cycle"/>
</menu>
</menu>
<menu label="Сортировать" name="inventory_sort_menu">
<menu_item_check name="inventory_sort_by_name" label="По названию" />

View File

@ -8,6 +8,9 @@
</string>
<layout_stack name="floater_stack">
<layout_panel name="info_panel">
<text name="info_panel_label">
Name:
</text>
<button label="Laden" name="btn_load" tool_tip="Einstellungen aus dem Inventar laden"/>
<button label="Importieren" name="btn_import" tool_tip="Alte Einstellungen von Datenträger importieren."/>
</layout_panel>

View File

@ -8,7 +8,6 @@
Schwebe-Tipps:
</text>
<check_box label="Schwebe-Tipps anzeigen" name="ShowHoverTips" tool_tip="Aktivieren, um Schwebetipps für Avatare und andere Dinge anzuzeigen - diese Option zuerst aktivieren"/>
<check_box label="für alle Objekte" tool_tip="Aktivieren, um Schwebetipps für Inworld-Objekte anzuzeigen." name="ShowAllHoverTips"/>
<check_box label="für Land" tool_tip="Aktivieren, um Schwebetipps für Land anzuzeigen." name="ShowLandHoverTips"/>
<check_box name="FSAdvancedTooltips" label="Erweiterte Informationen in den Hovertips anzeigen (Phoenix-Stil)"/>
<check_box name="FSShowGroupTitleInTooltip" label="Gruppentitel von Avataren in Hovertips anzeigen"/>

View File

@ -1514,6 +1514,15 @@ http://www.firestormviewer.org/support für Hilfe zum Lösen des Problems.
<string name="none">
keine
</string>
<string name="sky">
Himmler
</string>
<string name="water">
Wasser
</string>
<string name="day">
Tageszyklus
</string>
<string name="shirt_not_worn">
Hemd nicht getragen
</string>
@ -5205,7 +5214,7 @@ Missbrauchsbericht
<string name="Female - Wow">
Weiblich - Wow
</string>
<string name="New Daycycle">
<string name="New Day">
Neuer Tageszyklus
</string>
<string name="New Water">
@ -5214,6 +5223,9 @@ Missbrauchsbericht
<string name="New Sky">
Neuer Himmel
</string>
<string name="New Settings">
Neue Einstellungen
</string>
<string name="/bow">
/verbeugen
</string>

View File

@ -34,6 +34,7 @@
left_delta="10"
width="35"
height="20"
name="info_panel_label"
font="SansSerif">
Name:
</text>

View File

@ -54,18 +54,6 @@
tool_tip="Set this to show hover tips on avatars and some other things - set this one first (CTRL+SHIFT+T)"
top_pad="7"
width="256" />
<check_box
enabled_control="ShowHoverTips"
control_name="ShowAllObjectHoverTip"
height="16"
initial_value="true"
label="on All Objects"
tool_tip="Set this to show hover tips on in-world objects"
layout="topleft"
left_delta="10"
name="ShowAllHoverTips"
top_pad="2"
width="256" />
<check_box
enabled_control="ShowHoverTips"
control_name="ShowLandHoverTip"
@ -76,6 +64,7 @@
layout="topleft"
name="ShowLandHoverTips"
top_pad="2"
left_delta="10"
width="256" />
<check_box
enabled_control="ShowHoverTips"
@ -83,7 +72,7 @@
name="FSAdvancedTooltips"
label="Show extended information in hovertips (Phoenix style)"
layout="topleft"
top_pad="5"
top_pad="25"
left_delta="-10"
height="16"
width="350" />

View File

@ -515,7 +515,7 @@
mouse_opaque="false"
name="autorespond_toggle_location_tip"
top_pad="5"
width="450"
width="475"
wrap="true">
Note: To activate the Autoresponse messages please set your online status via Comm Menu &gt; Online Status
</text>
@ -529,7 +529,7 @@
mouse_opaque="false"
name="text_box3"
top_pad="10"
width="450">
width="475">
Automatic response when in UNAVAILABLE (ie, BUSY) mode:
</text>
<text_editor
@ -557,7 +557,7 @@
mouse_opaque="false"
name="autorespond_response_label"
top_pad="5"
width="450">
width="475">
Automatic response to all avatars when in AUTORESPONSE to everyone mode:
</text>
<text_editor
@ -585,7 +585,7 @@
mouse_opaque="false"
name="autorespond_nf_response_label"
top_pad="5"
width="450">
width="475">
Automatic response to non-friends when in AUTORESPONSE TO NON-FRIENDS mode:
</text>
<text_editor

View File

@ -670,6 +670,9 @@ http://www.firestormviewer.org/support for help fixing this problem.
<string name="physics">Physics</string>
<string name="invalid">invalid</string>
<string name="none">none</string>
<string name="sky">Sky</string>
<string name="water">Water</string>
<string name="day">Daycycle</string>
<!-- Not Worn Wearable Types -->
<string name="shirt_not_worn">Shirt not worn</string>
@ -2368,9 +2371,10 @@ Abuse Report</string>
<string name="Female - Stick tougue out">Female - Stick tongue out</string>
<string name="Female - Wow">Female - Wow</string>
<!-- settings -->
<string name="New Daycycle">New Daycycle</string>
<string name="New Day">New Daycycle</string>
<string name="New Water">New Water</string>
<string name="New Sky">New Sky</string>
<string name="New Settings">New Settings</string>
<string name="/bow">/bow</string>

View File

@ -6,7 +6,6 @@
Bulas:
</text>
<check_box label="Básicas" name="ShowHoverTips" tool_tip="Activa para mostrar descripciones emergentes al situar el cursor sobre avatares o algunas otras cosas (es necesario activarlas para que funcionen las otras)"/>
<check_box label="En todos los objetos" tool_tip="Activa para mostrar descripciones emergentes al situar el cursor sobre cualquier objeto del mundo" name="ShowAllHoverTips"/>
<check_box label="En el terreno" tool_tip="Activa para mostrar descripciones emergentes al situar el cursor sobre el terreno" name="ShowLandHoverTips"/>
<text name="tooltip_textbox">
Demora en mostrar bulas:

View File

@ -4968,7 +4968,7 @@ Denuncia de infracción
<string name="Female - Wow">
Mujer - Admiración
</string>
<string name="New Daycycle">
<string name="New Day">
Nuevo Ciclo del día
</string>
<string name="New Water">

View File

@ -4,7 +4,6 @@
<panel label="Monde 3D" name="UI Prefs Panel">
<text name="HoverTipText">Astuces :</text>
<check_box label="Afficher les infobulles" name="ShowHoverTips" tool_tip="Activer cette option pour afficher une infobulle informative lorsque votre souris passe au-dessus des avatars et des objets"/>
<check_box label="Sur tous les objets" tool_tip="Activer cette option pour afficher les infobulles informatives sur tous les objets" name="ShowAllHoverTips"/>
<check_box label="Sur le terrain" tool_tip="Activer cette option pour afficher une infobulle informative sur le terrain" name="ShowLandHoverTips"/>
<check_box name="FSAdvancedTooltips" label="Afficher des informations plus détaillées dans les infobulles"/>
<check_box name="FSShowGroupTitleInTooltip" label="Afficher le titre de l'avatar dans son infobulle"/>

View File

@ -4804,7 +4804,7 @@ du rapport d&apos;infraction
<string name="Female - Wow">
Femme - Ouah !
</string>
<string name="New Daycycle">
<string name="New Day">
Nouveau cycle du jour
</string>
<string name="New Water">

View File

@ -6,7 +6,6 @@
Suggerimenti al passaggio del mouse (hovertip):
</text>
<check_box label="Suggerimenti di base" name="ShowHoverTips" tool_tip="Mostra suggerimenti passando col mouse su un&apos;avatar o altre cose. (CTRL+SHIFT+T)" />
<check_box label="Su tutti gli oggetti" name="ShowAllHoverTips" />
<check_box label="Sul terreno" name="ShowLandHoverTips" />
<check_box name="FSAdvancedTooltips" label="Mostra informazioni estese (stile Phoenix)"/>
<check_box name="FSShowGroupTitleInTooltip" label="Aggiungi titolo del gruppo"/>

View File

@ -15,7 +15,7 @@
<panel.string name="buycurrencylabel">
[AMT] L$
</panel.string>
<panel name="menu_search_panel">
<panel name="menu_search_panel" left="-483">
<search_editor label="Ricerca nei menu" name="search_menu_edit" tool_tip="Scrivi qui i termini da cercare. Verranno visualizzate anche corrispondenze parziali con le voci di menu." />
</panel>
<panel name="parcel_info_panel">
@ -24,14 +24,18 @@
<button name="status_lightshare_btn" tool_tip="Impostazioni Lightshare"/>
<text tool_tip="Nome del lotto su cui ti trovi. Clic per aprire le informazioni sul lotto." name="parcel_info_text" value="(caricamento...)"/>
</panel>
<panel name="balance_bg" left="-308">
<panel name="balance_bg" width="97" left="-351">
<text name="balance" tool_tip="Clicca per aggiornare il tuo saldo in L$" value="L$ ??"/>
<button label="Compra L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
<button label="Compra L$" name="buyL" tool_tip="Clicca per acquistare più L$" width="60"/>
</panel>
<panel name="time_and_media_bg" width="229">
<text name="TimeText" tool_tip="Orario attuale (Pacifico)"/>
<text name="TimeText" tool_tip="Orario attuale (Pacifico)" width="78">
24:00:00 PST
</text>
<button name="stream_toggle_btn" tool_tip="Attiva/ferma musica nel lotto"/>
<button name="media_toggle_btn" tool_tip="Attiva/ferma tutti i media (musica, video, pagine Web)"/>
<text name="FPSText" tool_tip="Fotogrammi al secondo (FPS)" />
<text name="FPSText" tool_tip="Fotogrammi al secondo (FPS)">
200.0
</text>
</panel>
</panel>

View File

@ -3,31 +3,23 @@
<tab_container label="Firestorm Prefs" name="tabs" >
<!-- 3D World -->
<panel label="3D 世界" name="UI Prefs Panel" >
<text name="HoverTipText">
ヒント:
</text>
<check_box label="マウスを重ねるとヒントを表示(最初に設定)" name="ShowHoverTips" tool_tip="アバターやその他インワールドのものにマウスを重ねるとヒントが表示されるようにします。ヒントを使うにはまず最初にここにチェックを入れて下さい。" />
<check_box label="全てのオブジェクトに表示" tool_tip="インワールドのオブジェクトについてのヒントを表示する場合にチェックして下さい。" name="ShowAllHoverTips" />
<check_box label="土地に表示" tool_tip="土地についてのヒントを表示する場合にチェックして下さい。" name="ShowLandHoverTips" />
<text name="tooltip_textbox">
ヒント表示までの時間:
</text>
<slider label="ツール:" name="ToolTipDelay_slider" tool_tip="ボタンのようなユーザーインターフェイスに関するヒントを表示するまでの時間。0.7秒がデフォルト)" />
<text name="ToolTipDelay_text">
</text>
<slider label="アバター:" name="AvatarInspectorTooltipDelay_slider" tool_tip="アバターに関するヒントを表示するまでの時間。0.35秒がデフォルト)" />
<text name="AvatarInspectorTooltipDelay_text">
</text>
<slider label="オブジェクト" name="ObjectInspectorTooltipDelay_slider" tool_tip="オブジェクトに関するヒントを表示するまでの時間。0.35秒がデフォルト)" />
<text name="ObjectInspectorTooltipDelay_text">
@ -36,13 +28,9 @@
<check_box name="FSShowGroupTitleInTooltip" label="ヒントにアバターのグループタイトルを表示" />
<slider label="フローティングテキストのフェード開始距離 (m):" tool_tip="フローティングテキストが薄く消え始める距離をメートル単位で設定します" name="FSHudTextFadeDistance" />
<slider label="フローティングテキストのフェード範囲 (m):" tool_tip="フローティングテキストがはっきりと見える状態から完全に見えなくなるまでの距離をメートル単位で設定します" name="FSHudTextFadeRange" />
</panel>
<!-- 2D Overlay -->
<panel label="2D オーバーレイ" name="ui-2d-overlay" >
<text name="UI Size:" width="95">
UI サイズ:
</text>
@ -70,7 +58,6 @@
</combo_box>
<check_box label="スクリプトダイアログのアニメーションを再生" name="FSAnimatedScriptDialogs" tool_tip="ここにチェックを入れると、スクリプトダイアログが開く時にアニメーションが再生されます。(旧式の1系スタイル)ダイアログが上から下に開く時のみ有効になります。" />
<slider label="スクリプトダイアログ当たりの表示行数:" name="FSRowsPerScriptDialog" tool_tip="同時に見ることのできるスクリプトダイアログの最大行数" />
<check_box label="パイメニューを使用" name="UsePieMenu" tool_tip="土地や中バー、オブジェクト、装着物を右クリックした時に、諜報兼のコンテキストメニューでなく、1系の丸いメニューを使用します。" />
<check_box label="テキストに動きを付ける" name="PieMenuPopupFontEffect" tool_tip="パイメニューが開く時のアニメーションに合わせて、パイメニューの中のテキストも動くようにします。" />
<check_box label="外側に丸い影を付ける" name="PieMenuOuterRingShade" tool_tip="パイメニューの縁に丸い影をつけてサブメニューを見やすくします。" />
@ -100,11 +87,8 @@
</text>
</panel>
<!-- Top Bars -->
<panel label="トップバー" name="UI-interface-top-bars" >
<text name="statusbar_textbox">
ステータスバー
</text>
@ -124,13 +108,9 @@
<check_box label="お気に入りバーを表示" name="ShowNavbarFavoritesPanel" />
<check_box label="ナビゲーションバーと検索バーを表示" name="ShowNavbarNavigationPanel" />
<check_box label="検索バーを表示" name="ShowSearchTopBar" />
</panel>
<!-- Interface Windows -->
<panel label="インターフェイス" name="UI-interface-windows-tab" >
<check_box label="名前をクリックするとアバターのプロフィールをすぐに表示" name="FSInspectAvatarSlurlOpensProfile" tool_tip="Iここにチェックを入れると、名前の表示されているリンクをクリックすると Firestorm はそのアバターのプロフィールを表示します。" />
<check_box label="Webのプロフィールをデフォルトで使用" name="FSUseWebProfiles" tool_tip="プロフィールを表示するのに、V1形式のパネルではなく、Webページのプロフィールを使用します。"/>
<check_box label="無視リストが自動的に開かないようにする" name="FSDisableBlockListAutoOpen" tool_tip="アバターやオブジェクトをブロックする時に、無視リストが自動的に開かないようにします。" />
@ -181,11 +161,8 @@
<check_box label="受け取りアイテムフォルダを通常のインベントリ内に表示" name="FSShowInboxFolder" tool_tip="ここにチェックを入れると、インベントリウィンドウに受け取りアイテムフォルダも表示されるようになります。" />
<check_box label="受け取りアイテムボタンをインベントリの下に常に表示" name="FSAlwaysShowInboxButton" tool_tip="ここにチェックを入れると、インベントリ内にそのフォルダが表示されている場合でも、受け取りアイテムのボタンを常に表示するようにします。"/>
<check_box label="インベントリのそれぞれのタブで異なる検索キーワードを設定可能にする" name="FSSplitInventorySearchOverTabs" tool_tip="こにチェックを入れると、インベントリのそれぞれのタブに異なる検索キーワードを入力することが可能になります。" />
</panel>
<!-- トースト -->
<panel label="トースト" name="UI-toasts-tab" >
<text name="ToastSettings">
通知の表示設定(ポップアップ、コンソール、トースト):
@ -237,21 +214,15 @@
<check_box label="トーストは必ず最前面に表示" name="FSShowToastsInFront" />
<check_box label="新しいSIM再起動の通知方法を使用" name="FSUseNewRegionRestartNotification" />
<check_box label="SIM再起動の警告メッセージが表示される時に画面を揺らさない" name="FSNoScreenShakeOnRegionRestart" />
</panel>
<!-- フォント -->
<panel label="フォント" name="UI-font-tab" >
<text name="tooltip_textbox1">
フォント種類:
</text>
<text name="tooltip_textbox2">
(再起動が必要)
</text>
<text name="tooltip_textbox5">
フォントサイズ:
</text>
@ -260,7 +231,6 @@
ポイント(再起動が必要)
0がデフォルト。あまり大きいサイズはお勧めしません。
</text>
<text name="tooltip_textbox3">
チャットの行間:
</text>
@ -269,7 +239,6 @@
ピクセル(再起動が必要)
0が系のデフォルト、2が系のデフォルトです。
</text>
<text name="Label_FolderItemViewHeight">
フォルダ表示の高さ:
</text>
@ -278,9 +247,7 @@
ピクセル(再起動が必要)
20が系のデフォルト、18が系のデフォルトです。
</text>
</panel>
</tab_container>
</panel>

View File

@ -8,7 +8,7 @@
</string>
<layout_stack name="floater_stack">
<layout_panel name="info_panel">
<text>
<text name="info_panel_label" width="40">
Nazwa:
</text>
<button label="Wczytaj" name="btn_load" tool_tip="Wczytaj ustawienia z szafy" />

View File

@ -156,16 +156,6 @@
</text>
<button name="Reset_AO_Soften" tool_tip="Kliknij tutaj, aby zresetować ustawienia do domyślnych."/>
</panel>
<panel name="P_Spec_Highlight_Settings">
<text name="T_Smoothness" tool_tip="Gładkość (wykładnik potęgowy dla podświetleń) jest wartością definiowalną przez użytkownika, która kontroluje widoczną gładkość powierzchni.">
Gładkość
</text>
<button name="Reset_Smoothness" tool_tip="Kliknij tutaj, aby zresetować ustawienia do domyślnych."/>
<text name="T_Smooth_Res" tool_tip="Rozdzielczość (SpecularResX) kontroluje jakość mapowania podświetleń uwydatniających.">
Rozdzielcz.
</text>
<button name="Reset_Smooth_Res" tool_tip="Kliknij tutaj, aby zresetować ustawienia do domyślnych."/>
</panel>
</panel>
<panel name="P_DoF_Glow" label="Głębia/blask">
<panel name="PT_DoF_Glow">

View File

@ -6,7 +6,6 @@
Chmurki pomocy:
</text>
<check_box label="Pokaż chmurki pomocy" name="ShowHoverTips" tool_tip="Zaznacz, aby pokazywać podstawowe chmurki informacyjne nad awatarami i kilkoma innymi rzeczami - zaznacz najpierw to (CTRL+SHIFT+T)" />
<check_box label="na wszystkich obiektach" tool_tip="Zaznacz, aby włączyć chmurki na obiektach w świecie" name="ShowAllHoverTips" />
<check_box label="na terenie" tool_tip="Zaznacz, aby włączyć chmurki na terenie" name="ShowLandHoverTips" />
<check_box name="FSAdvancedTooltips" label="Rozszerzone informacje w chmurkach (klasyczny styl Phoenixa)" />
<check_box name="FSShowGroupTitleInTooltip" label="Pokazuj tytuły grupowe awatarów w chmurkach" />

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="login_progress_panel">
<layout_stack name="horizontal_centering">
<layout_panel name="center">
<layout_stack name="vertical_centering">
<layout_panel name="panel4">
<layout_stack name="vertical_centering">
<layout_panel name="panel_icons">
<text name="logos_lbl">
[APP_NAME] używa
</text>
</layout_panel>
</layout_stack>
</layout_panel>
</layout_stack>
</layout_panel>
</layout_stack>
</panel>

View File

@ -4979,7 +4979,7 @@ Raport o Nadużyciu
<string name="Female - Wow">
Kobieta - Wow
</string>
<string name="New Daycycle">
<string name="New Day">
Nowy cykl dnia
</string>
<string name="New Water">

View File

@ -4710,7 +4710,7 @@ Denunciar abuso
<string name="Female - Wow">
Wow - feminino
</string>
<string name="New Daycycle">
<string name="New Day">
Novo ciclo de dias
</string>
<string name="New Water">

View File

@ -477,5 +477,6 @@
</panel>
</panel>
<panel label="Приключения" name="land_experiences_panel"/>
<panel label="Окружающая среда" name="land_environment_panel"/>
</tab_container>
</floater>

View File

@ -3,20 +3,34 @@
<layout_stack name="outer_stack">
<layout_panel name="env_controls">
<layout_stack name="settings_stack">
<layout_panel>
<button label="Сброс" name="btn_reset" tool_tip="Закрыть и сбросить в общую среду"/>
<text name="cloud_map_label">
Изображение облака:
</text>
<layout_panel name="lp_1">
<text name="ambient_lbl">Окружение:</text>
<text name="blue_horizon_lbl">Горизонт:</text>
<text name="blue_density_lbl">Небо:</text>
<button label="Сброс" name="btn_reset" tool_tip="Закрыть и сбросить на Совместную Окружающую среду"/>
<text name="sun_color_lbl">Солнце:</text>
<text name="cloud_color_lbl">Цвет облака:</text>
<text name="cloud_map_label">Облака:</text>
<text name="water_map_label">Вода:</text>
</layout_panel>
<layout_panel>
<text name="label">
Солнце:
</text>
<check_box label="Показать метку" name="sunbeacon"/>
<layout_panel name="lp_2">
<text name="haze_horizon_label">Дымка Горизонта:</text>
<text name="haze_density_label">Плотность Дымки:</text>
<text name="cloud_coverage_label">Облачное покрытие:</text>
<text name="cloud_scale_label">Масштаб Облаков:</text>
<text name="scene_gamma_label">Гамма Сцены:</text>
</layout_panel>
<layout_panel>
<check_box label="Показать метку" name="moonbeacon"/>
<layout_panel name="lp_3">
<text name="label">Солнце:</text>
<check_box label="Показать Маяк" name="sunbeacon"/>
<text name="scale_label">Масштаб:</text>
<text name="glow_focus_label">Фокус Сияния:</text>
<text name="glow_size_label">Размер Сияния:</text>
<text name="star_brightness_label">Яркость Звезд:</text>
</layout_panel>
<layout_panel name="lp_4">
<text name="label">Луна:</text>
<check_box label="Показать Маяк" name="moonbeacon"/>
</layout_panel>
</layout_stack>
</layout_panel>

View File

@ -43,7 +43,7 @@
<texture_picker label="Носки" name="lower_socks"/>
<texture_picker label="Обувь" name="lower_shoes"/>
<texture_picker label="Брюки" name="lower_pants"/>
<texture_picker label="Пиджак" name="lower_jacket"/>
<texture_picker label="Куртка" name="lower_jacket"/>
<texture_picker label="Альфа низа" name="lower_alpha"/>
<texture_picker label="Тату низа" name="lower_tattoo"/>
<texture_picker label="Универс.тату" name="lower_universal_tattoo"/>
@ -54,12 +54,12 @@
<texture_picker label="Левая рука тату" name="leftarm_tattoo"/>
<texture_picker label="Левая нога" name="leftleg-baked"/>
<texture_picker label="Левая нога тату" name="leftleg_tattoo"/>
<texture_picker label="AUX 1" name="aux1-baked"/>
<texture_picker label="AUX 1 тату" name="aux1_tattoo"/>
<texture_picker label="AUX 2" name="aux2-baked"/>
<texture_picker label="AUX 2 тату" name="aux2_tattoo"/>
<texture_picker label="AUX 3" name="aux3-baked"/>
<texture_picker label="AUX 3 тату" name="aux3_tattoo"/>
<texture_picker label="Доп 1" name="aux1-baked"/>
<texture_picker label="Доп 1 тату" name="aux1_tattoo"/>
<texture_picker label="Доп 2" name="aux2-baked"/>
<texture_picker label="Доп 2 тату" name="aux2_tattoo"/>
<texture_picker label="Доп 3" name="aux3-baked"/>
<texture_picker label="Доп 3 тату" name="aux3_tattoo"/>
</panel>
</panel>
</scroll_container>

View File

@ -20,6 +20,9 @@
<check_box label="Источники звука" name="sounds"/>
<check_box label="Источники частиц" name="particles"/>
<check_box label="Источники медиа" name="moapbeacon"/>
<text name="label_objects">
Показать направление на:
</text>
<check_box label="Солнце" name="sun"/>
<check_box label="Луна" name="moon"/>
</panel>

View File

@ -10,4 +10,5 @@
<button label="Сохранить" name="beamshape_save" />
<button label="Загрузить" name="beamshape_load" />
<button label="Очистить" name="beamshape_clear" />
<button label="Отмена" name="cancel" />
</floater>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="camera_floater">
<floater name="camera_floater" title="Управление Камерой">
<floater.string name="rotate_tooltip">
Повернуть камеру вокруг точки фокусировки
</floater.string>
@ -9,27 +9,29 @@
<floater.string name="move_tooltip">
Переместить камеру вверх, вниз, влево или вправо
</floater.string>
<panel name="zoom">
<layout_stack name="camera_view_layout_stack">
<layout_panel name="camera_rotate_layout_panel">
<joystick_rotate name="cam_rotate_stick" tool_tip="Вращение камеры вокруг точки фокусировки"/>
</layout_panel>
<layout_panel name="camera_zoom_layout_panel">
<slider_bar name="zoom_slider" tool_tip="Приблизить/отдалить камеру относительно точки фокусировки"/>
</layout_panel>
<layout_panel name="panel_track">
<joystick_track name="cam_track_stick" tool_tip="Переместить камеру вверх, вниз, влево или вправо"/>
</layout_panel>
</layout_stack>
<floater.string name="free_mode_title">
Обзор объекта
</floater.string>
<string name="inactive_combo_text">Предустановки</string>
<panel name="controls">
<panel name="zoom">
<joystick_rotate name="cam_rotate_stick" tool_tip="Вращение камеры вокруг точки фокусировки"/>
<slider_bar name="zoom_slider" tool_tip="Приблизить/отдалить камеру относительно точки фокусировки"/>
<joystick_track name="cam_track_stick" tool_tip="Переместить камеру вверх, вниз, влево или вправо"/>
</panel>
</panel>
<panel name="buttons_view">
<panel_camera_item name="front_view" tool_tip="Вид спереди"/>
<panel_camera_item name="group_view" tool_tip="Вид сбоку"/>
<panel_camera_item name="rear_view" tool_tip="Вид сзади"/>
</panel>
<panel name="buttons">
<panel_camera_item name="object_view" tool_tip="Осмотр объекта"/>
<panel_camera_item name="mouselook_view" tool_tip="Обзор с помощью мыши"/>
<panel_camera_item name="reset_view" tool_tip="Сбросить обзор"/>
<panel name="buttons_panel">
<panel_camera_item name="front_view" tool_tip="Вид спереди" />
<panel_camera_item name="group_view" tool_tip="Вид сбоку" />
<panel_camera_item name="rear_view" tool_tip="Вид сзади" />
<panel_camera_item name="object_view" tool_tip="Вид на объект"/>
<panel_camera_item name="mouselook_view" tool_tip="Вид от первого лица"/>
<panel_camera_item name="reset_view" tool_tip="Сбросить вид"/>
</panel>
<combo_box name="preset_combo">
<combo_box.item label="Предустановки" name="Use preset"/>
</combo_box>
<button name="gear_btn" tool_tip="Предустановки Камеры"/>
<!-- <button label="Сохранить как..." name="save_preset_btn"/> -->
<button label="Позиция Камеры..." name="camera_position_btn"/>
</floater>

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater title="Предустановки Камеры" name="floater_camera_presets">
</floater>

View File

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<floater name="Delete Pref Preset" title="УДАЛИТЬ ПРЕСЕТ">
<floater name="delete_pref_preset" title="Удалить Предустановку">
<string name="title_graphic">
Удалить пресет графики
Удалить Предустановку Графики
</string>
<string name="title_camera">
Удалить пресет камеры
Удалить Предустановку Камеры
</string>
<text name="Preset">
Выберите пресет
Выберите Предустановку
</text>
<button label="Удалить" name="delete"/>
<button label="Отмена" name="cancel"/>

View File

@ -7,7 +7,7 @@
Вы не можете менять отображаемое имя до: [TIME].
</text>
<text name="set_name_label">
Новое отображаемое имя:
Новое имя:
</text>
<text name="name_confirm_label">
Введите новое имя еще раз для подтверждения:

View File

@ -1,104 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Day cycle" title="Изменить суточный цикл">
<string name="title_new">
Создать суточный цикл
</string>
<string name="title_edit">
Изменить суточный цикл
</string>
<string name="hint_new">
Введите имя суточного цикла, задайте его параметры с помощью элементов управления и нажмите кнопку «Сохранить».
</string>
<string name="hint_edit">
Чтобы изменить суточный цикл, задайте его параметры с помощью элементов управления ниже и нажмите кнопку «Сохранить».
</string>
<string name="combo_label">
-Выбор настройки-
</string>
<text name="label">
Имя настройки:
</text>
<text name="note">
Примечание. Если изменить имя настройки, будет создана новая настройка, а изменения в существующей не будут сохранены.
</text>
<text name="hint_item1">
- Для изменения настроек неба и времени выберите соответствующую вкладку.
</text>
<text name="hint_item2">
- Чтобы задать время переходов, перетаскивайте вкладки.
</text>
<text name="hint_item3">
- Скребок служит для просмотра суточного цикла.
</text>
<panel name="day_cycle_slider_panel">
<multi_slider initial_value="0" name="WLTimeSlider"/>
<multi_slider initial_value="0" name="WLDayCycleKeys"/>
<button label="+ отметку" label_selected="+ отметку" name="WLAddKey"/>
<button label="- отметку" label_selected="- отметку" name="WLDeleteKey"/>
<text name="WL12am">
12 ночи
</text>
<text name="WL3am">
3 ночи
</text>
<text name="WL6am">
6 утра
</text>
<text name="WL9amHash">
9 утра
</text>
<text name="WL12pmHash">
12 дня
</text>
<text name="WL3pm">
3 дня
</text>
<text name="WL6pm">
6 вечера
</text>
<text name="WL9pm">
9 вечера
</text>
<text name="WL12am2">
12 ночи
</text>
<text name="WL12amHash">
|
</text>
<text name="WL3amHash">
I
</text>
<text name="WL6amHash">
|
</text>
<text name="WL9amHash2">
I
</text>
<text name="WL12pmHash2">
|
</text>
<text name="WL3pmHash">
I
</text>
<text name="WL6pmHash">
|
</text>
<text name="WL9pmHash">
I
</text>
<text name="WL12amHash2">
|
</text>
</panel>
<text name="WLCurKeyPresetText">
Небо:
</text>
<combo_box label="Стандарт" name="WLSkyPresets"/>
<text name="WLCurKeyTimeText">
Время:
</text>
<time name="time" value="6:00"/>
<check_box label="Установить как новый суточный цикл" name="make_default_cb"/>
<button label="Сохранить" name="save"/>
<button label="Отмена" name="cancel"/>
</floater>

View File

@ -33,9 +33,9 @@
<layout_stack name="outer_stack">
<layout_panel name="name_and_import">
<text name="label">
Название суточного цикла:
Суточный цикл:
</text>
<button label="Импортировать" name="btn_import" tool_tip="Импортировать устаревшие настройки с диска."/>
<button label="Импорт" name="btn_import" tool_tip="Импортировать устаревшие настройки с диска."/>
</layout_panel>
<layout_panel name="content">
<layout_stack name="content_stack">
@ -48,21 +48,13 @@
<button label="Вода" name="water_track"/>
</panel>
<panel name="timeline">
<text name="p0" value="0%[DSC]"/>
<text name="p1" value="25%[DSC]"/>
<text name="p2" value="50%[DSC]"/>
<text name="p3" value="75%[DSC]"/>
<text name="p4" value="100%[DSC]"/>
<multi_slider initial_value="0" name="WLTimeSlider"/>
<multi_slider initial_value="0" name="WLDayCycleFrames"/>
<text name="current_time" value="[PRCNT]%[DSC]"/>
<layout_stack>
<layout_panel>
<button label="Клонировать режим редактирования из" name="copy_track"/>
<button label="Загрузить режим редактирования из" name="load_track"/>
<button label="Очистить режим редактирования" name="clear_track"/>
<layout_stack name="track_options_ls">
<layout_panel name="track_options_lp">
<button label="Клон Трека" name="copy_track"/>
<button label="Загрузить Трек" name="load_track"/>
<button label="Очистить Трек" name="clear_track"/>
</layout_panel>
<layout_panel>
<layout_panel name="track_progress_lp">
<layout_stack name="progress_control">
<layout_panel name="skip_back">
<button name="skip_back_btn" tool_tip="Шаг назад"/>
@ -72,10 +64,10 @@
</layout_panel>
</layout_stack>
</layout_panel>
<layout_panel>
<button label="Добавить [FRAME]" name="add_frame"/>
<button label="Загрузить [FRAME]" name="btn_load_frame"/>
<button label="Удалить [FRAME]" name="delete_frame"/>
<layout_panel name="frames_lp">
<button label="Добавить [FRAME]" name="add_frame" width="120"/>
<button label="Загрузить [FRAME]" name="btn_load_frame" width="120"/>
<button label="Удалить [FRAME]" name="delete_frame" width="120"/>
</layout_panel>
</layout_stack>
</panel>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="HoverHeight" title="Установите высоту">
<slider label="Высота" name="HoverHeightSlider"/>
<check_box label="Влияет на вид камеры" name="BindCameraCheck" width="237"/>
</floater>

View File

@ -1,157 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Edit Sky Preset" title="Изменить настройку неба">
<string name="title_new">
Создать настройку неба
</string>
<string name="title_edit">
Изменить настройку неба
</string>
<string name="combo_label">
-Выбор настройки-
</string>
<panel name="P_Presetname">
<text name="hint" width="200">
Чтобы изменить настройку, подстройте управление и нажмите «Сохранить»
</text>
<text name="label">
Имя:
</text>
</panel>
<tab_container name="Main_Tab">
<panel label="Атмосфера и Солнце" name="ASUN" >
<panel name="P_Atmosphere_Header">
<text name="T_Atmosphere_Header">
Установки Атмосферы
</text>
</panel>
<panel name="P_Blue_Horizon">
<text name="BHText"
tool_tip="Горизонт Неба: цвет неба. В метеорологических условиях эта установка влияет на «атмосферное рассеяние»."
width="100">
Горизонт Неба
</text>
<color_swatch left_delta="110" name="WLBlueHorizon" width="130"/>
<text
name="BDensText2"
tool_tip="Плотность Неба: влияет на общую насыщенность цвета вашего неба. Если вы перемещаете ползунок Насыщенность (I) вправо, ваши цвета станут ярче и ярче. Если вы переместите его полностью влево, ваши цвета станут тусклыми, в конечном итоге исчезающими до черного и белого. Если вы хотите точно настроить цветовой баланс своего неба, вы можете управлять отдельными элементами насыщения, используя значения «Красный/Зеленый/Синий»."
width="100">
Плотность Неба
</text>
<color_swatch left_delta="110" name="WLBlueDensity" width="130"/>
</panel>
<panel name="P_Atmosphere_OtherSettings">
<slider label="Гориз.Дымки" label_width="80" name="WLHazeHorizon"
tool_tip="Горизонт Дымки: Влияет на высоту дымки на горизонте. При более высоких настройках дымка достигнет неба и затмит настоящий горизонт. Взгляд на горизонт может помочь подчеркнуть солнце и создать пыльный, моющий или влажный эффект. Этот параметр не будет работать, если значение Горизонт Дымки установлено равным нулю."/>
<slider label="Плотн.Дымки" label_width="80" name="WLHazeDensity"
tool_tip="Плотность Дымки: Влияет на количество туманности, которое вы можете видеть в атмосфере. При более низких настройках это может сделать некоторые великолепные виды на открытом воздухе в пыльной или тропической среде, а на более высоких уровнях он может создать толстый, туманный туман. Если вы установите значение Плотность Дымки равным нулю, настройка Горизонт Дымки не будет иметь никакого эффекта."/>
<slider label="Множ.Плотн." label_width="80" name="WLDensityMult"
tool_tip="Множитель Плотности: влияет на общую плотность атмосферы. При более низких настройках он создает ощущение 'тонкого воздуха', и при более высоких настройках он создает очень тяжелый эффект смога."/>
<slider label="Множ.Расст." label_width="80" name="WLDistanceMult"
tool_tip="Множитель Расстояния: влияет на вашу воспринимаемую ясность в атмосфере. Чтобы все выглядело туманно и отдаленно, переместите ползунок вправо. Если вы хотите полностью удалить эффекты 'Настройки неба' с ландшафта и объектов, установите ползунок в ноль."/>
<slider label="Макс.Высота" label_width="80" name="WLMaxAltitude"
tool_tip="Максимальная Высота: регулирует расчет высоты, производимый при вычислении атмосферного освещения. В более поздние времена это может быть полезно для расчета того, как «глубокий» появляется закат, а в полдень его можно использовать для достижения правильных значений яркости."/>
</panel>
<panel name="P_Sun_and_Moon_Header">
<text name="T_Sun_and_Moon_Header" value="Настройка Солнца и Луны"/>
</panel>
<panel name="P_SM_Color">
<text name="SLCText" width="130"
tool_tip="Цвет Солнца/Луны - влияет на цвет света, создаваемого солнцем и луной. Имейте в виду, что цвет вашего солнечного света / лунного света повлияет на цвет вашего неба!">
Цвет Солнца/Луны
</text>
<color_swatch left_delta="130" name="WLSunlight" width="110"/>
<text name="WLAmbientText" width="130"
tool_tip="Окружающий свет - регулирует цвет и интенсивность окружающего света в атмосфере. Это используется для моделирования того, как свет от солнца рассеивается атмосферой и другими объектами, когда он попадает на Землю. Вы можете создать очень яркое солнце и относительно темный мир (подумайте о закате!) С настройкой Окружающего нуля, но если вы хотите симулировать освещенность в середине дня, когда солнце было низко в небе, вам нужно увеличьте настройку окружающего воздуха.">
Окружающий свет
</text>
<color_swatch left_delta="130" name="WLAmbient" width="110"/>
</panel>
<panel name="P_SM_OtherSettings">
<slider label="Солнце Фокус" label_width="90" name="WLGlowB"
tool_tip="Солнечное сияние: Фокус - Регулирует, насколько сильно солнце заливает небо. При очень высоких настройках может заставить солнце полностью залить часть неба ярким светом, и в нуле это приведет к тому, что солнце (но не свет, который он бросает) исчезнет с неба."/>
<slider label="Солнце Размер" label_width="90" name="WLGlowR"
tool_tip="Солнечное сияние: Размер - определяет размер изображения солнца."/>
<slider label="Звезды Яркость" label_width="90" name="WLStarAlpha"
tool_tip="Звезды Яркость - Определяет, насколько видны звезды в небе. Если вы играете с этим слайдером, пока солнце поднимается, вы можете видеть звезды в середине дня."/>
<slider label="Гамма" label_width="90" name="WLGamma"
tool_tip="Гамма сцены - Регулирует распределение света и темноты вывода на экран. При более низких настройках все будет выглядеть тусклым, в то время как более высокие настройки могут сделать сцену серой и «размытой». Это влияет только на трехмерный вид, а не на меню и остальную часть экрана вашего компьютера. ПРИМЕЧАНИЕ: Значение 1.0 является нормальным."/>
</panel>
<panel name="P_WL_Daycycle">
<icon name="SkyDayCycle" tool_tip="Положение Солнца/Луны - влияет на вертикальное положение солнца и луны, от восхода солнца (0,0) до полудня (0,25), захода солнца (0,5), полуночи (0,75) и обратно на восход солнца (1.0)."/>
<time name="WLDayTime" tool_tip="Положение Солнца/Луны - влияет на вертикальное положение солнца и луны, от восхода солнца (0,0) до полудня (0,25), захода солнца (0,5), полуночи (0,75) и обратно на восход солнца (1.0)."/>
<slider label="Азимут" label_width="50" name="WLEastAngle"
tool_tip="Азимут Востока - Изменяет азимут восхода солнца по часовой стрелке относительно карты на востоке. При установке 0,5 солнце будет всходить на западе и будет заходить на востоке, при установке 0,25 солнце будет всходить на юге и будет заходить на Севере и т.д."/>
</panel>
</panel>
<panel name="P_Clouds" label="Облака" >
<panel name="P_Clouds_Header">
<text name="T_Clouds_Header" value="Настройка Облаков"/>
</panel>
<panel name="P_Cloud_Color">
<text name="WLCloudColorText"
tool_tip="Цвет Облаков - влияет на цвет ваших облаков, если он у вас есть. Используйте отдельные слайдеры Красный/Зеленый/Синий, чтобы изменить цвет, или ползунок Интесивность, чтобы двигать все три одновременно."
width="240">
Цвет Облаков
</text>
<color_swatch left_delta="100" name="WLCloudColor" width="130"/>
</panel>
<panel name="P_Cloud_Density">
<text name="WLCloudColorText2"
tool_tip="Облака XY/Плотность - используйте ползунки X и Y для изменения горизонтального положения всех облаков в небе. Ползунок П влияет на общую плотность отдельных облаков; при низких настройках вы увидите тонкие, редкие облака, а при более высоких настройках вы увидите более толстые, более сплошные облака."
width="240">
Облака XY/Плотность
</text>
<slider label="X" name="WLCloudX"/>
<slider label="Y" name="WLCloudY"/>
<slider label="П" name="WLCloudDensity"/>
</panel>
<panel name="P_Cloud_CovScale">
<slider label="Покрытие" label_width="65" name="WLCloudCoverage"
tool_tip="Облачное Покрытие - Устанавливает долю облачного покрытия."/>
<slider label="Размер" label_width="55" name="WLCloudScale"
tool_tip="Размер Облаков: влияет на воспринимаемый размер облаков."/>
</panel>
<panel name="P_Cloud_Detail">
<text name="WLCloudDetailText"
tool_tip="Детальность облаков (XY / Плотность) - влияет на положение и детализированные изображения ваших облаков. Слайдеры X и Y сдвигают свое горизонтальное положение, а слайдер П контролирует, насколько пышные и / или рвано ваши облака выглядят.">
Детальность (XY/Плотность)
</text>
<slider label="X" name="WLCloudDetailX"/>
<slider label="Y" name="WLCloudDetailY"/>
<slider label="П" name="WLCloudDetailDensity"/>
</panel>
<panel name="P_Cloud_Scroll">
<text name="WLCloudScrollXText"
tool_tip="Движение Облаков X - Влияет на направление и скорость, с которыми облака движутся в небе вдоль оси X.">
Движение Облаков X
</text>
<check_box label="Блокировать Движение" name="WLCloudLockX"
tool_tip="Блокировать Движение - предотвращение перемещения облаков по выбранной оси."/>
<text name="WLCloudScrollYText"
tool_tip="Движение Облаков Y - Влияет на направление и скорость, с которыми облака движутся в небе вдоль оси Y.">
Движение Облаков Y
</text>
<check_box label="Блокировать Движение" name="WLCloudLockY"
tool_tip="Блокировать Движение - предотвращение перемещения облаков по выбранной оси."/>
</panel>
</panel>
</tab_container>
<check_box label="Применить эту настройку неба" name="make_default_cb"/>
<button label="Сохранить" name="save"/>
<button label="Отмена" name="cancel"/>
</floater>

View File

@ -1,84 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="Edit Water Preset" title="Правка настройки воды">
<string name="title_new">
Создать новую настройку воды
</string>
<string name="title_edit">
Изменение настройки воды
</string>
<string name="hint_new">
</string>
<string name="hint_edit">
</string>
<string name="combo_label">
-Выбор настройки-
</string>
<panel name="P_Presetname">
<text name="label">
Настройка:
</text>
</panel>
<tab_container name="Main_Tab">
<panel name="P_Fog_and_Wave" label="Туман и Волны">
<panel name="P_Water_Fog">
<text name="water_color_label" tool_tip="Цвет водяного тумана - это изменяет цвет тонового объема воды, определяя, по сути, цвет самой воды. Если у вашей воды нет тумана, она станет кристально чистой и бесцветной.">
Цвет Тумана Воды
</text>
<text name="BHText3" tool_tip="Карта Нормали - изображение, используемое для определения отражений и преломлений. Для этой настройки можно использовать любую текстуру, но истинные карты нормалей работают лучше всего. Попробуйте змеиную кожу, плитки или любую другую карту нормалей для некоторых дурацких эффектов!">
Карта Нормали
</text>
</panel>
<panel name="P_Fog_Settings">
<text name="water_fog_density_label" tool_tip="Показатель плотности тумана - контролирует плотность вашего водяного тумана; этот параметр определяет, как далеко вы сможете видеть в воде сверху.">
Показатель плотности тумана
</text>
<text name="underwater_fog_modifier_label" tool_tip="Подводный модификатор тумана - контролирует, как изменяется плотность тумана, когда вы находитесь под водой. Полезно для создания дальних видов под водой, сохраняя поверхность довольно непрозрачной. Например, при установке 0,25 водный туман равен 1/4 как плотный, когда он находится под водой, когда он появляется сверху.">
Подводный модификатор тумана
</text>
</panel>
<panel name="P_Wave_Settings">
<text name="BHText" tool_tip="Направление большой волны - Управление направлением X и Y и скоростью изображения большой волны.">
Направление большой волны
</text>
<text name="BHText2" tool_tip="Направление малой волны - управляет направлением X и Y и скоростью изображения малой волны.">
Направление малой волны
</text>
</panel>
</panel>
<panel name="P_Reflection" label="Отражение">
<panel name="P_Wavelet">
<text name="BDensText" tool_tip="Шкала Отражения Ряби - Контролирует масштаб трех мелких волн, составляющих поверхность воды.">
Шкала Отражения Ряби
</text>
</panel>
<panel name="P_Other_Settings">
<text name="HDText" tool_tip="Шкала Френеля - определяет, сколько света отражается под разными углами; увеличение этого слайдера уменьшает эффекты визуального отражения на поверхности воды.">
Шкала Френеля
</text>
<text name="FresnelOffsetText" tool_tip="Смещение Френеля - Определяет, сколько отражается полный свет; увеличение этого ползунка увеличивает количество света, отраженного поверхностью воды.">
Смещение Френеля
</text>
<text name="DensMultText"
tool_tip="Масштаб Преломления Сверху - Управляет количеством зрительной рефракции, которую вы можете видеть сверху поверхности воды; это «шаткий» эффект, который вы можете видеть, когда смотрите на объект, находящийся под водой.">
Масштаб Преломления Сверху
</text>
<text name="WaterScaleBelowText"
tool_tip="Масштаб Преломления Снизу - Управляет количеством зрительной рефракции, которую вы можете видеть ниже поверхности воды. Это «шаткий» эффект, который вы можете видеть, когда смотрите на объект, который находится над водой.">
Масштаб Преломления Снизу
</text>
<text name="MaxAltText"
tool_tip="Множитель Размытия - Управляет перемещением волн и отражений. Увеличение этой настройки увеличивает количество искажений, которое вы видите в отражениях в результате активности волны.">
Множитель Размытия
</text>
</panel>
</panel>
</tab_container>
<check_box name="make_default_cb" label="Сделать новой настройкой воды."/>
<button name="save" label="Сохранить"/>
<button name="cancel" label="Отмена"/>
</floater>

View File

@ -1,37 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Environment Editor Floater" title="Настройки окружения">
<check_box label="Всегда использовать настройки региона" name="use_env_from_region_always" tool_tip="Включение этой опции позволит всегда использовать настройки среды указанные ниже."/>
<radio_group name="region_settings_radio_group">
<radio_item label="Использовать настройки региона" name="use_region_settings"/>
<radio_item label="Настроить свою среду" name="use_my_settings"/>
</radio_group>
<panel name="user_environment_settings">
<text name="note1">
ПРИМЕЧАНИЕ: Ваши настройки
</text>
<text name="note2" width="265">
НЕ видны другим пользователям.
</text>
<text name="water_settings_title">
Вода
</text>
<combo_box name="water_settings_preset_combo">
<combo_box.item label="-Выбор настройки" name="item0"/>
</combo_box>
<text name="sky_dayc_settings_title">
Настройки неба (Фиксированно или цикл):
</text>
<radio_group name="sky_dayc_settings_radio_group">
<radio_item label="Небо" name="my_sky_settings"/>
<radio_item label="Цикл дня" name="my_dayc_settings"/>
</radio_group>
<combo_box name="sky_settings_preset_combo">
<combo_box.item label="-Выбор настройки-" name="item0"/>
</combo_box>
<combo_box name="dayc_settings_preset_combo">
<combo_box.item label="-Выбор настройки-" name="item0"/>
</combo_box>
</panel>
<button label="OK" name="ok_btn"/>
<button label="Отмена" name="cancel_btn" />
</floater>

View File

@ -27,6 +27,7 @@
<check_box label="Консолидация текстуры" name="consolidate_check" />
<check_box label="Пропускать прозрачность" name="skip_transparent_check" />
<check_box label="Используйте параметры текстуры" name="texture_params_check" />
<check_box label="Одиночная карта развертки" name="single_uv_map_check"/>
<text name="TextureFormatText">
Формат текстуры:
</text>

View File

@ -8,8 +8,11 @@
</string>
<layout_stack name="floater_stack">
<layout_panel name="info_panel">
<text name="info_panel_label">
Имя:
</text>
<button label="Загрузить" name="btn_load" tool_tip="Загрузить настройки из инвентарного списка"/>
<button label="Импортировать" name="btn_import" tool_tip="Импортировать устаревшие настройки с диска."/>
<button label="Импорт" name="btn_import" tool_tip="Импортировать устаревшие настройки с диска."/>
</layout_panel>
<layout_panel name="button_panel">
<layout_stack name="button_bar_ls">

View File

@ -6,24 +6,24 @@
</panel>
<panel label="Регион" name="region">
<text name="Region Name:">
Название региона:
Название:
</text>
<check_box label="Буферная зона" name="check prelude" tool_tip="Сделать этот регион буферной зоной"/>
<check_box label="Солнце на месте" name="check fixed sun" tool_tip="Фиксация положения солнца (как в меню «Регион/Землевладение &gt; Ландшафт»)"/>
<check_box label="Сброс дома при телепортации" name="check reset home" tool_tip="Дом жителей, которые телепортируются отсюда, будет там, куда они телепортируются."/>
<check_box label="Сброс дома при телепорте" name="check reset home" tool_tip="Дом жителей, которые телепортируются отсюда, будет там, куда они телепортируются."/>
<check_box label="Видимый" name="check visible" tool_tip="Сделать регион видимым не только для творцов"/>
<check_box label="Повреждения" name="check damage" tool_tip="Сделать возможными повреждения в регионе"/>
<check_box label="Блокировать отслеживание трафика" name="block dwell" tool_tip="Выберите, чтобы для региона не отслеживался трафик"/>
<check_box label="Запретить терраформирование" name="block terraform" tool_tip="Выберите, чтобы жители не могли изменять ландшафт своей земли"/>
<check_box label="Песочница" name="is sandbox" tool_tip="Выберите, является ли этот регион «песочницей»"/>
<button label="Зафиксировать пределы" label_selected="Зафиксировать пределы" name="Bake Terrain" tool_tip="Сохранить текущий ландшафт как стандартный"/>
<button label="Вернуть ландшафт" label_selected="Вернуть ландшафт" name="Revert Terrain" tool_tip="Заменить текущий ландшафт ландшафтом по умолчанию"/>
<button label="Поменять ландшафты" label_selected="Поменять ландшафты" name="Swap Terrain" tool_tip="Поменять местами текущий ландшафт и ландшафт по умолчанию"/>
<button label="Зафикс. ландшафт" label_selected="Зафикс. ландшафт" name="Bake Terrain" tool_tip="Сохранить текущий ландшафт как стандартный" width="130"/>
<button label="Вернуть ландшафт" label_selected="Вернуть ландшафт" name="Revert Terrain" tool_tip="Заменить текущий ландшафт ландшафтом по умолчанию" width="130"/>
<button label="Поменять ландшафт" label_selected="Поменять ландшафт" name="Swap Terrain" tool_tip="Поменять местами текущий ландшафт и ландшафт по умолчанию" width="130"/>
<text name="estate id">
ИД землевладения:
ИД владения:
</text>
<text name="parent id">
ИД родового объекта:
ИД родителя:
</text>
<line_editor name="parentestate" tool_tip="Родовое землевладение для этого региона"/>
<text name="Grid Pos: ">
@ -32,17 +32,17 @@
<line_editor name="gridposx" tool_tip="Положение сетки по оси x для этого региона"/>
<line_editor name="gridposy" tool_tip="Положение сетки по оси y для этого региона"/>
<text name="Redirect to Grid: ">
Перенаправить на сетку:
Перенапр. на:
</text>
<text name="billable factor text">
Ценовой коэффициент:
Коэфф. оплаты:
</text>
<text name="land cost text">
L$ за м²:
</text>
<button label="Обновить" label_selected="Обновить" name="Refresh" tool_tip="Обновление приведенной выше информации"/>
<button label="Применить" label_selected="Применить" name="Apply" tool_tip="Применить все изменения выше"/>
<button label="Выбрать регион" label_selected="Выбрать регион" name="Select Region" tool_tip="Выбор всего региона с помощью инструмента изменения ландшафта"/>
<button label="Выбрать регион" label_selected="Выбрать регион" name="Select Region" tool_tip="Выбор всего региона с помощью инструмента изменения ландшафта" left="160" />
<button label="Автосохранение" label_selected="Автосохранение" name="Autosave now" tool_tip="Сохранить в каталоге автосохранения состояние в архиве Gzip"/>
</panel>
<panel label="Объекты" name="objects">
@ -50,29 +50,29 @@
(нет персонажа)
</panel.string>
<text name="Region Name:">
Название региона:
Название:
</text>
<text name="region name">
Уэльс
</text>
<check_box label="Отключить скрипты" name="disable scripts" tool_tip="Отключение всех скриптов в этом регионе"/>
<check_box label="Отключить столкновения" name="disable collisions" tool_tip="Отключение столкновений не-агентов в этом регионе"/>
<check_box label="Отключить физику" name="disable physics" tool_tip="Отключение всех физических параметров в этом регионе"/>
<check_box label="Выкл. скрипты" name="disable scripts" tool_tip="Отключение всех скриптов в этом регионе"/>
<check_box label="Выкл. столкновения" name="disable collisions" tool_tip="Отключение столкновений не-агентов в этом регионе"/>
<check_box label="Выкл. физику" name="disable physics" tool_tip="Отключение всех физических параметров в этом регионе" left_delta="140"/>
<button label="Применить" label_selected="Применить" name="Apply" tool_tip="Применить все изменения выше"/>
<button label="Задать персонаж" label_selected="Задать персонаж" name="Set Target" tool_tip="Выберите аватар-персонаж для удаления объекта"/>
<text name="target_avatar_name">
(нет персонажа)
</text>
<button label="Удалить принадлежащие персонажу объекты со скриптами на чужой земле" label_selected="Удалить принадлежащие персонажу объекты со скриптами на чужой земле" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Удаление всех объектов со скриптами, принадлежащих персонажу, на земле, не принадлежащей персонажу. «Не копируемые» объекты будут возвращены."/>
<button label="Удалить принадлежащие персонажу объекты со скриптами на *всех* землях" label_selected="Удалить принадлежащие персонажу объекты со скриптами на *всех* землях" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Удаление всех объектов со скриптами, принадлежащих персонажу, в этом регионе. «Не копируемые» объекты будут возвращены."/>
<button label="Удалить объекты персонажа со скриптами на чужой земле" label_selected="Удалить объекты персонажа со скриптами на чужой земле" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Удаление всех объектов со скриптами, принадлежащих персонажу, на земле, не принадлежащей персонажу. «Не копируемые» объекты будут возвращены."/>
<button label="Удалить объекты персонажа со скриптами на *всех* землях" label_selected="Удалить объекты персонажа со скриптами на *всех* землях" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Удаление всех объектов со скриптами, принадлежащих персонажу, в этом регионе. «Не копируемые» объекты будут возвращены."/>
<button label="Удалить *ВСЕ* объекты персонажа" label_selected="Удалить *ВСЕ* объекты персонажа" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Удаление всех объектов, принадлежащих персонажу, в этом регионе. «Не копируемые» объекты будут возвращены."/>
<button label="Самые активные участники столкновений" label_selected="Самые активные участники столкновений" name="Get Top Colliders" tool_tip="Список объектов, для которых наблюдается больше всего детализированных обратных вызовов"/>
<button label="Загрузить лучшие скрипты" label_selected="Загрузить лучшие скрипты" name="Get Top Scripts" tool_tip="Список объектов, в которых скрипты выполняются дольше всего"/>
<button label="Сводка по скриптам" label_selected="Сводка по скриптам" name="Scripts digest" tool_tip="Список всех скриптов с числом использований по каждому из них"/>
<button label="Самые активные участники столкновений" label_selected="Самые активные участники столкновений" name="Get Top Colliders" tool_tip="Список объектов, для которых наблюдается больше всего детализированных обратных вызовов" width="260"/>
<button label="Загрузить лучшие скрипты" label_selected="Загрузить лучшие скрипты" name="Get Top Scripts" tool_tip="Список объектов, в которых скрипты выполняются дольше всего" width="200"/>
<button label="Сводка по скриптам" label_selected="Сводка по скриптам" name="Scripts digest" tool_tip="Список всех скриптов с числом использований по каждому из них" width="160"/>
</panel>
<panel label="Запрос" name="request">
<text name="Destination:">
Пункт назначения:
Назначение:
</text>
<combo_box name="destination">
<combo_box.item label="назначенный" name="item1"/>

View File

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<floater name="Load Pref Preset" title="ЗАГРУЗИТЬ ПРЕСЕТ">
<floater name="load_pref_preset" title="Загрузить Предустановку">
<string name="title_graphic">
Загрузить пресет графики
Загрузить предустановку графики
</string>
<string name="title_camera">
Загрузить пресет камеры
Загрузить предустановку камеры
</string>
<text name="Preset">
Выберите пресет
Выберите предустановку
</text>
<button label="OK" name="ok"/>
<button label="Отмена" name="cancel"/>

View File

@ -21,7 +21,11 @@
<string name="mesh_status_too_many_vertices">Слишком много вершин на уровне детализации.</string>
<string name="mesh_status_missing_lod">Отсутствует необходимый уровень детализации.</string>
<string name="mesh_status_invalid_material_list">Материалы уровня детализации не входят в эталонную модель.</string>
<string name="phys_status_vertex_limit_exceeded">Для некоторых физических оболочек превышен лимит вершин.</string>
<string name="phys_status_vertex_limit_exceeded">Для некоторых физических оболочек превышен лимит вершин(256); попробуйте другой 'Метод Анализа'.</string>
<string name="phys_status_hull_limit_exceeded">Некоторые модели превышают предел оболочек (256); попробуйте 'Упрощение'.</string>
<string name="phys_status_degenerate_triangles">Физика меша слишком плотная; удалить маленькие, тонкие треугольники (смотри просмотр).</string>
<string name="phys_status_no_havok">Эта версия не поддерживает Havok и не рекомендуется для загрузки физики в Second Life. Результаты могут быть непредсказуемыми.</string>
<string name="phys_status_unknown_error">Обнаружена нераспознанная ошибка.</string>
<string name="layer_all">Все</string>
<string name="decomposing">Анализ...</string>
<string name="simplifying">Упрощение...</string>

Some files were not shown because too many files have changed in this diff Show More