QAR-1476 Combo-merge to trunk: Viewer 1.23 RC0 and Simulator 1.26.3

svn merge -r118927:118939
svn+ssh://svn.lindenlab.com/svn/linden/branches/viewer/viewer-1.23.0-merge-2-combo-QAR-1476

this is a composite of...

svn merge -r115088:118182
svn+ssh://svn.lindenlab.com/svn/linden/branches/viewer/viewer_1-23
conflicts resolved:
C      doc/contributions.txt
C      indra/llaudio/audioengine.cpp
C      indra/newview/CMakeLists.txt
C      indra/newview/llfloaterlandholdings.cpp
C      indra/newview/llpaneldirbrowser.cpp
C      indra/newview/llpanelgrouplandmoney.cpp
C      indra/newview/llpreviewscript.cpp
C      indra/newview/llviewermenu.cpp
C      indra/newview/skins/default/xui/en-us/notifications.xml

and...

svn merge -r116937:118673
svn+ssh://svn.lindenlab.com/svn/linden/branches/server/server-1.26
minor-to-trivial conflicts resolved:
C      indra/llcommon/llversionserver.h
C      indra/newsim/llrezdata.cpp
C      indra/newsim/llstate.cpp
C      indra/upgrade/schema_version/sequence/3/index_log_paypal.sql
master
Adam Moss 2009-05-04 17:43:26 +00:00
parent 4bcbf33422
commit cc92525b0d
618 changed files with 71380 additions and 6190 deletions

View File

@ -12,6 +12,8 @@ Able Whitman
VWR-1813
Adam Marker
VWR-2755
Agathos Frascati
CT-246
Aimee Trescothick
VWR-1813
VWR-3321
@ -86,6 +88,8 @@ Alissa Sabre
VWR-10728
Angus Boyd
VWR-592
Ann Congrejo
CT-193
Argent Stonecutter
VWR-68
Armin Weatherwax
@ -97,6 +101,14 @@ Balp Allen
VWR-4157
Benja Kepler
VWR-746
Biancaluce Robbiani
CT-225
CT-226
CT-227
CT-228
CT-229
CT-230
CT-231
Blakar Ogre
VWR-418
VWR-881
@ -109,6 +121,14 @@ blino Nakamura
Boroondas Gupte
VWR-233
WEB-262
Bulli Schumann
CT-218
CT-219
CT-220
CT-221
CT-222
CT-223
CT-224
bushing Spatula
VWR-119
VWR-424
@ -165,6 +185,8 @@ Feep Larsson
VWR-447
VWR-1314
VWR-4444
Flemming Congrejo
CT-193
Fluf Fredriksson
VWR-3450
Fremont Cunningham
@ -204,6 +226,8 @@ Gudmund Shepherd
VWR-1873
Hamncheese Omlet
VWR-333
HappySmurf Papp
CT-193
Henri Beauchamp
VWR-1320
VWR-1406
@ -243,6 +267,8 @@ Joghert LeSabre
VWR-64
Kage Pixel
VWR-11
Ken March
CT-245
Kerutsen Sellery
VWR-1350
Khyota Wulluf
@ -254,6 +280,14 @@ Kunnis Basiat
VWR-102
Latif Khalifa
VWR-5370
Lisa Lowe
CT-218
CT-219
CT-220
CT-221
CT-222
CT-223
CT-224
Lockhart Cordoso
VWR-108
maciek marksman
@ -392,11 +426,27 @@ Peekay Semyorka
VWR-79
Peter Lameth
VWR-7331
Pf Shan
CT-225
CT-226
CT-227
CT-228
CT-229
CT-230
CT-231
princess niven
VWR-5733
CT-85
Renault Clio
VWR-1976
Ringo Tuxing
CT-225
CT-226
CT-227
CT-228
CT-229
CT-230
CT-231
Robin Cornelius
VWR-2488
VWR-9557
@ -404,6 +454,14 @@ Robin Cornelius
Ryozu Kojima
VWR-53
VWR-287
Salahzar Stenvaag
CT-225
CT-226
CT-227
CT-228
CT-229
CT-230
CT-231
Sammy Frederix
VWR-6186
Scrippy Scofield
@ -416,6 +474,14 @@ Seg Baphomet
VWR-2662
VWR-3206
VWR-2488
Sergen Davies
CT-225
CT-226
CT-227
CT-228
CT-229
CT-230
CT-231
SignpostMarv Martin
VWR-153
VWR-154
@ -472,6 +538,8 @@ Thickbrick Sleaford
Thraxis Epsilon
SVC-371
VWR-383
tiamat bingyi
CT-246
Tue Torok
CT-68
CT-69
@ -481,6 +549,8 @@ Tue Torok
CT-74
Vadim Bigbear
VWR-2681
Vixen Heron
VWR-2710
Whoops Babii
VWR-631
VWR-1640

View File

@ -402,7 +402,23 @@
<boolean>true</boolean>
</map>
<key>avatarnotesrequest</key>
<key>PlacesReply</key>
<map>
<key>flavor</key>
<string>llsd</string>
<key>trusted-sender</key>
<boolean>true</boolean>
</map>
<key>DirLandReply</key>
<map>
<key>flavor</key>
<string>llsd</string>
<key>trusted-sender</key>
<boolean>true</boolean>
</map>
<key>avatarnotesrequest</key>
<map>
<key>service_name</key>
<string>avatar-notes</string>

View File

@ -8,12 +8,6 @@ if (STANDALONE)
include(FindPNG)
else (STANDALONE)
use_prebuilt_binary(libpng)
if (WINDOWS)
set(PNG_LIBRARIES
debug libpngd
optimized libpng)
else (WINDOWS)
set(PNG_LIBRARIES png12)
endif (WINDOWS)
set(PNG_LIBRARIES png12)
set(PNG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include)
endif (STANDALONE)

View File

@ -17,6 +17,6 @@ else (STANDALONE)
set(ZLIB_LIBRARIES z)
endif (WINDOWS)
if (WINDOWS OR LINUX)
set(ZLIB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/zlib)
set(ZLIB_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/zlib)
endif (WINDOWS OR LINUX)
endif (STANDALONE)

View File

@ -46,6 +46,7 @@ set(llcharacter_HEADER_FILES
llanimationstates.h
llbvhloader.h
llbvhconsts.h
llcharacter.h
lleditingmotion.h
llgesture.h

View File

@ -0,0 +1,52 @@
/**
* @file llbvhconsts.h
* @brief Consts and types useful to BVH files and LindenLabAnimation format.
*
* $LicenseInfo:firstyear=2004&license=viewergpl$
*
* Copyright (c) 2004-2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_LLBVHCONSTS_H
#define LL_LLBVHCONSTS_H
const F32 MAX_ANIM_DURATION = 30.f;
typedef enum e_constraint_type
{
CONSTRAINT_TYPE_POINT,
CONSTRAINT_TYPE_PLANE,
NUM_CONSTRAINT_TYPES
} EConstraintType;
typedef enum e_constraint_target_type
{
CONSTRAINT_TARGET_TYPE_BODY,
CONSTRAINT_TARGET_TYPE_GROUND,
NUM_CONSTRAINT_TARGET_TYPES
} EConstraintTargetType;
#endif // LL_LLBVHCONSTS_H

View File

@ -37,9 +37,9 @@
#include "m3math.h"
#include "llmath.h"
#include "llapr.h"
#include "llbvhconsts.h"
const S32 BVH_PARSER_LINE_SIZE = 2048;
const F32 MAX_ANIM_DURATION = 30.f;
class LLDataPacker;
//------------------------------------------------------------------------
@ -132,12 +132,6 @@ struct Joint
};
typedef enum e_constraint_type
{
CONSTRAINT_TYPE_POINT,
CONSTRAINT_TYPE_PLANE
} EConstraintType;
struct Constraint
{
char mSourceJointName[16]; /* Flawfinder: ignore */

View File

@ -862,7 +862,7 @@ void LLKeyframeMotion::activateConstraint(JointConstraint* constraint)
S32 joint_num;
// grab ground position if we need to
if (shared_data->mConstraintTargetType == TYPE_GROUND)
if (shared_data->mConstraintTargetType == CONSTRAINT_TARGET_TYPE_GROUND)
{
LLVector3 source_pos = mCharacter->getVolumePos(shared_data->mSourceConstraintVolume, shared_data->mSourceConstraintOffset);
LLVector3 ground_pos_agent;
@ -889,7 +889,7 @@ void LLKeyframeMotion::deactivateConstraint(JointConstraint *constraintp)
constraintp->mSourceVolume->mUpdateXform = FALSE;
}
if (!constraintp->mSharedData->mConstraintTargetType == TYPE_GROUND)
if (!constraintp->mSharedData->mConstraintTargetType == CONSTRAINT_TARGET_TYPE_GROUND)
{
if (constraintp->mTargetVolume)
{
@ -959,11 +959,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
switch(shared_data->mConstraintTargetType)
{
case TYPE_GROUND:
case CONSTRAINT_TARGET_TYPE_GROUND:
target_pos = mCharacter->getPosAgentFromGlobal(constraint->mGroundPos);
// llinfos << "Target Pos " << constraint->mGroundPos << " on " << mCharacter->findCollisionVolume(shared_data->mSourceConstraintVolume)->getName() << llendl;
break;
case TYPE_BODY:
case CONSTRAINT_TARGET_TYPE_BODY:
target_pos = mCharacter->getVolumePos(shared_data->mTargetConstraintVolume, shared_data->mTargetConstraintOffset);
break;
default:
@ -974,14 +974,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8
LLJoint *source_jointp = NULL;
LLJoint *target_jointp = NULL;
if (shared_data->mConstraintType == TYPE_PLANE)
if (shared_data->mConstraintType == CONSTRAINT_TYPE_PLANE)
{
switch(shared_data->mConstraintTargetType)
{
case TYPE_GROUND:
case CONSTRAINT_TARGET_TYPE_GROUND:
norm = constraint->mGroundNorm;
break;
case TYPE_BODY:
case CONSTRAINT_TARGET_TYPE_BODY:
target_jointp = mCharacter->findCollisionVolume(shared_data->mTargetConstraintVolume);
if (target_jointp)
{
@ -1227,6 +1227,12 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
llwarns << "can't read duration" << llendl;
return FALSE;
}
if (mJointMotionList->mDuration > MAX_ANIM_DURATION )
{
llwarns << "invalid animation duration" << llendl;
return FALSE;
}
//-------------------------------------------------------------------------
// get emote (optional)
@ -1282,6 +1288,13 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
llwarns << "can't read hand pose" << llendl;
return FALSE;
}
if(word > LLHandMotion::NUM_HAND_POSES)
{
llwarns << "invalid LLHandMotion::eHandPose index: " << word << llendl;
return FALSE;
}
mJointMotionList->mHandPose = (LLHandMotion::eHandPose)word;
//-------------------------------------------------------------------------
@ -1325,7 +1338,13 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
llwarns << "can't read joint name" << llendl;
return FALSE;
}
if (joint_name == "mScreen" || joint_name == "mRoot")
{
llwarns << "attempted to animate special " << joint_name << " joint" << llendl;
return FALSE;
}
//---------------------------------------------------------------------
// find the corresponding joint
//---------------------------------------------------------------------
@ -1409,6 +1428,12 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
}
time = U16_to_F32(time_short, 0.f, mJointMotionList->mDuration);
if (time < 0 || time > mJointMotionList->mDuration)
{
llwarns << "invalid frame time" << llendl;
return FALSE;
}
}
RotationKey rot_key;
@ -1438,6 +1463,12 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
rot_key.mRotation.unpackFromVector3(rot_vec);
}
if( !(rot_key.mRotation.isFinite()) )
{
llwarns << "non-finite angle in rotation key" << llendl;
success = FALSE;
}
if (!success)
{
llwarns << "can't read rotation key (" << k << ")" << llendl;
@ -1509,7 +1540,13 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
pos_key.mPosition.mV[VY] = U16_to_F32(y, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
pos_key.mPosition.mV[VZ] = U16_to_F32(z, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
}
if( !(pos_key.mPosition.isFinite()) )
{
llwarns << "non-finite position in key" << llendl;
success = FALSE;
}
if (!success)
{
llwarns << "can't read position key (" << k << ")" << llendl;
@ -1539,7 +1576,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
if (num_constraints > MAX_CONSTRAINTS)
{
llwarns << "Too many constraints...ignoring" << llendl;
llwarns << "Too many constraints... ignoring" << llendl;
}
else
{
@ -1561,12 +1598,26 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
}
constraintp->mChainLength = (S32) byte;
if((U32)constraintp->mChainLength > mJointMotionList->getNumJointMotions())
{
llwarns << "invalid constraint chain length" << llendl;
delete constraintp;
return FALSE;
}
if (!dp.unpackU8(byte, "constraint_type"))
{
llwarns << "can't read constraint type" << llendl;
delete constraintp;
return FALSE;
}
if( byte >= NUM_CONSTRAINT_TYPES )
{
llwarns << "invalid constraint type" << llendl;
delete constraintp;
return FALSE;
}
constraintp->mConstraintType = (EConstraintType)byte;
const S32 BIN_DATA_LENGTH = 16;
@ -1588,7 +1639,14 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
delete constraintp;
return FALSE;
}
if( !(constraintp->mSourceConstraintOffset.isFinite()) )
{
llwarns << "non-finite constraint source offset" << llendl;
delete constraintp;
return FALSE;
}
if (!dp.unpackBinaryDataFixed(bin_data, BIN_DATA_LENGTH, "target_volume"))
{
llwarns << "can't read target volume name" << llendl;
@ -1601,11 +1659,11 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
if (str == "GROUND")
{
// constrain to ground
constraintp->mConstraintTargetType = TYPE_GROUND;
constraintp->mConstraintTargetType = CONSTRAINT_TARGET_TYPE_GROUND;
}
else
{
constraintp->mConstraintTargetType = TYPE_BODY;
constraintp->mConstraintTargetType = CONSTRAINT_TARGET_TYPE_BODY;
constraintp->mTargetConstraintVolume = mCharacter->getCollisionVolumeID(str);
}
@ -1616,6 +1674,13 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
return FALSE;
}
if( !(constraintp->mTargetConstraintOffset.isFinite()) )
{
llwarns << "non-finite constraint target offset" << llendl;
delete constraintp;
return FALSE;
}
if (!dp.unpackVector3(constraintp->mTargetConstraintDir, "target_dir"))
{
llwarns << "can't read constraint target direction" << llendl;
@ -1623,6 +1688,13 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
return FALSE;
}
if( !(constraintp->mTargetConstraintDir.isFinite()) )
{
llwarns << "non-finite constraint target direction" << llendl;
delete constraintp;
return FALSE;
}
if (!constraintp->mTargetConstraintDir.isExactlyZero())
{
constraintp->mUseTargetOffset = TRUE;
@ -1686,8 +1758,13 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
break;
}
}
if (constraintp->mJointStateIndices[i] < 0 )
{
llwarns << "No joint index for constraint " << i << llendl;
delete constraintp;
return FALSE;
}
}
}
}
@ -1777,7 +1854,7 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const
mCharacter->findCollisionVolume(shared_constraintp->mSourceConstraintVolume)->getName().c_str());
success &= dp.packBinaryDataFixed((U8*)volume_name, 16, "source_volume");
success &= dp.packVector3(shared_constraintp->mSourceConstraintOffset, "source_offset");
if (shared_constraintp->mConstraintTargetType == TYPE_GROUND)
if (shared_constraintp->mConstraintTargetType == CONSTRAINT_TARGET_TYPE_GROUND)
{
snprintf(volume_name,sizeof(volume_name), "%s", "GROUND"); /* Flawfinder: ignore */
}

View File

@ -48,6 +48,7 @@
#include "v3dmath.h"
#include "v3math.h"
#include "llapr.h"
#include "llbvhconsts.h"
class LLKeyframeDataCache;
class LLVFS;
@ -198,18 +199,6 @@ public:
static void flushKeyframeCache();
typedef enum e_constraint_type
{
TYPE_POINT,
TYPE_PLANE
} EConstraintType;
typedef enum e_constraint_target_type
{
TYPE_BODY,
TYPE_GROUND
} EConstraintTargetType;
protected:
//-------------------------------------------------------------------------
// JointConstraintSharedData
@ -224,8 +213,8 @@ protected:
mEaseOutStartTime(0.f),
mEaseOutStopTime(0.f),
mUseTargetOffset(FALSE),
mConstraintType(TYPE_POINT),
mConstraintTargetType(TYPE_BODY),
mConstraintType(CONSTRAINT_TYPE_POINT),
mConstraintTargetType(CONSTRAINT_TARGET_TYPE_BODY),
mSourceConstraintVolume(0),
mTargetConstraintVolume(0),
mJointStateIndices(NULL)

View File

@ -56,7 +56,7 @@ const LLUUID IMG_SPARK ("d2e75ac1-d0fb-4532-820e-a20034ac814d"); // dataserver
const LLUUID IMG_FIRE ("aca40aa8-44cf-44ca-a0fa-93e1a2986f82"); // dataserver
const LLUUID IMG_FACE_SELECT ("a85ac674-cb75-4af6-9499-df7c5aaf7a28"); // face selector
const LLUUID IMG_DEFAULT_AVATAR ("c228d1cf-4b5d-4ba8-84f4-899a0796aa97"); // dataserver
const LLUUID IMG_INVISIBLE ("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"); // dataserver
const LLUUID IMG_INVISIBLE ("3a367d1c-bef1-6d43-7595-e88c1e3aadb3"); // dataserver
const LLUUID IMG_EXPLOSION ("68edcf47-ccd7-45b8-9f90-1649d7f12806"); // On dataserver
const LLUUID IMG_EXPLOSION_2 ("21ce046c-83fe-430a-b629-c7660ac78d7c"); // On dataserver

View File

@ -36,7 +36,7 @@
const S32 LL_VERSION_MAJOR = 1;
const S32 LL_VERSION_MINOR = 27;
const S32 LL_VERSION_PATCH = 0;
const S32 LL_VERSION_BUILD = 116936;
const S32 LL_VERSION_BUILD = 118914;
const char * const LL_CHANNEL = "Second Life Server";

View File

@ -14,6 +14,7 @@ include_directories(
${LLMATH_INCLUDE_DIRS}
${LLVFS_INCLUDE_DIRS}
${PNG_INCLUDE_DIRS}
${ZLIB_INCLUDE_DIRS}
)
set(llimage_SOURCE_FILES

View File

@ -200,6 +200,16 @@ public:
// EWearableType enumeration found in newview/llwearable.h
//
II_FLAGS_WEARABLES_MASK = 0xff,
// these bits need to be cleared whenever the asset_id is updated
// on a pre-existing inventory item (DEV-28098 and DEV-30997)
II_FLAGS_PERM_OVERWRITE_MASK = II_FLAGS_OBJECT_SLAM_PERM
| II_FLAGS_OBJECT_SLAM_SALE
| II_FLAGS_OBJECT_PERM_OVERWRITE_BASE
| II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER
| II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP
| II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE
| II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER,
};
protected:

View File

@ -58,8 +58,11 @@ static const std::string PARCEL_OWNERSHIP_STATUS_STRING[LLParcel::OS_COUNT+1] =
};
// NOTE: Adding parcel categories also requires updating:
// * newview/app_settings/floater_directory.xml category combobox
// * floater_directory.xml category combobox
// * floater_about_land.xml category combobox
// * Web site "create event" tools
// DO NOT DELETE ITEMS FROM THIS LIST WITHOUT DEEPLY UNDERSTANDING WHAT YOU'RE DOING.
//
static const std::string PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] =
{
"none",

View File

@ -331,6 +331,16 @@ public:
//push center in direction of data
LLOctreeNode<T>::pushCenter(center, size, data);
// handle case where floating point number gets too small
if( llabs(center.mdV[0] - getCenter().mdV[0]) < F_APPROXIMATELY_ZERO &&
llabs(center.mdV[1] - getCenter().mdV[1]) < F_APPROXIMATELY_ZERO &&
llabs(center.mdV[2] - getCenter().mdV[2]) < F_APPROXIMATELY_ZERO)
{
mData.insert(data);
BaseType::insert(data);
return true;
}
#if LL_OCTREE_PARANOIA_CHECK
if (getChildCount() == 8)
{

View File

@ -121,29 +121,32 @@ bool LLDispatcher::unpackMessage(
// we treat the SParam as binary data (since it might be an
// LLUUID in compressed form which may have embedded \0's,)
size = msg->getSizeFast(_PREHASH_ParamList, i, _PREHASH_Parameter);
msg->getBinaryDataFast(
_PREHASH_ParamList, _PREHASH_Parameter,
buf, size, i, MAX_STRING-1);
if (size >= 0)
{
msg->getBinaryDataFast(
_PREHASH_ParamList, _PREHASH_Parameter,
buf, size, i, MAX_STRING-1);
// If the last byte of the data is 0x0, this is either a normally
// packed string, or a binary packed UUID (which for these messages
// are packed with a 17th byte 0x0). Unpack into a std::string
// without the trailing \0, so "abc\0" becomes std::string("abc", 3)
// which matches const char* "abc".
if (size > 0
&& buf[size-1] == 0x0)
{
// special char*/size constructor because UUIDs may have embedded
// 0x0 bytes.
std::string binary_data(buf, size-1);
parameters.push_back(binary_data);
}
else
{
// This is either a NULL string, or a string that was packed
// incorrectly as binary data, without the usual trailing '\0'.
std::string string_data(buf, size);
parameters.push_back(string_data);
// If the last byte of the data is 0x0, this is either a normally
// packed string, or a binary packed UUID (which for these messages
// are packed with a 17th byte 0x0). Unpack into a std::string
// without the trailing \0, so "abc\0" becomes std::string("abc", 3)
// which matches const char* "abc".
if (size > 0
&& buf[size-1] == 0x0)
{
// special char*/size constructor because UUIDs may have embedded
// 0x0 bytes.
std::string binary_data(buf, size-1);
parameters.push_back(binary_data);
}
else
{
// This is either a NULL string, or a string that was packed
// incorrectly as binary data, without the usual trailing '\0'.
std::string string_data(buf, size);
parameters.push_back(string_data);
}
}
}
return true;

View File

@ -44,6 +44,12 @@ class LLVector3;
class LLVector3d;
class LLVector4;
// Error return values for getSize() functions
const S32 LL_BLOCK_NOT_IN_MESSAGE = -1;
const S32 LL_VARIABLE_NOT_IN_BLOCK = -2;
const S32 LL_MESSAGE_ERROR = -3;
class LLMessageReader
{
public:

View File

@ -41,7 +41,7 @@ void LLRegionPresenceVerifier::RegionResponder::result(const LLSD& content)
llinfos << "Verifying " << destination.getString() << " is region " << id << llendl;
std::stringstream uri;
uri << "http://" << destination.getString() << "/state/basic";
uri << "http://" << destination.getString() << "/state/basic/";
mSharedData->getHttpClient().get(uri.str(), new VerifiedDestinationResponder(mSharedData, content));
}
@ -68,20 +68,35 @@ void LLRegionPresenceVerifier::VerifiedDestinationResponder::result(const LLSD&
LLUUID actual_region_id = content["region_id"];
LLUUID expected_region_id = mContent["region_id"];
if (mSharedData->checkValidity(content))
lldebugs << "Actual region: " << content << llendl;
lldebugs << "Expected region: " << mContent << llendl;
if (mSharedData->checkValidity(content) &&
(actual_region_id == expected_region_id))
{
mSharedData->onRegionVerified(mContent);
}
else if ((mSharedData->shouldRetry()) && (actual_region_id != expected_region_id)) // If the region is correct, then it means we've deliberately changed the data
else if (mSharedData->shouldRetry())
{
LLSD headers;
headers["Cache-Control"] = "no-cache, max-age=0";
llinfos << "Requesting region information, get uncached for region " << mSharedData->getRegionUri() << llendl;
mSharedData->decrementRetries();
mSharedData->getHttpClient().get(mSharedData->getRegionUri(), new RegionResponder(mSharedData), headers);
retry();
}
else
{
llwarns << "Could not correctly look up region from region presence service. Region: " << mSharedData->getRegionUri() << llendl;
}
}
void LLRegionPresenceVerifier::VerifiedDestinationResponder::retry()
{
LLSD headers;
headers["Cache-Control"] = "no-cache, max-age=0";
llinfos << "Requesting region information, get uncached for region " << mSharedData->getRegionUri() << llendl;
mSharedData->decrementRetries();
mSharedData->getHttpClient().get(mSharedData->getRegionUri(), new RegionResponder(mSharedData), headers);
}
void LLRegionPresenceVerifier::VerifiedDestinationResponder::error(U32 status, const std::string& reason)
{
retry();
}

View File

@ -71,7 +71,9 @@ public:
public:
VerifiedDestinationResponder(ResponsePtr data, const LLSD& content);
virtual void result(const LLSD& content);
virtual void error(U32 status, const std::string& reason);
private:
void retry();
ResponsePtr mSharedData;
LLSD mContent;
};

View File

@ -182,15 +182,15 @@ S32 LLTemplateMessageReader::getSize(const char *blockname, const char *varname)
{
// is there a message ready to go?
if (mReceiveSize == -1)
{
{ // This is a serious error - crash
llerrs << "No message waiting for decode 4!" << llendl;
return -1;
return LL_MESSAGE_ERROR;
}
if (!mCurrentRMessageData)
{
{ // This is a serious error - crash
llerrs << "Invalid mCurrentRMessageData in getData!" << llendl;
return -1;
return LL_MESSAGE_ERROR;
}
char *bnamep = (char *)blockname;
@ -198,10 +198,10 @@ S32 LLTemplateMessageReader::getSize(const char *blockname, const char *varname)
LLMsgData::msg_blk_data_map_t::const_iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep);
if (iter == mCurrentRMessageData->mMemberBlocks.end())
{
llerrs << "Block " << bnamep << " not in message "
{ // don't crash
llinfos << "Block " << bnamep << " not in message "
<< mCurrentRMessageData->mName << llendl;
return -1;
return LL_BLOCK_NOT_IN_MESSAGE;
}
char *vnamep = (char *)varname;
@ -210,17 +210,17 @@ S32 LLTemplateMessageReader::getSize(const char *blockname, const char *varname)
LLMsgVarData& vardata = msg_data->mMemberVarData[vnamep];
if (!vardata.getName())
{
llerrs << "Variable " << varname << " not in message "
{ // don't crash
llinfos << "Variable " << varname << " not in message "
<< mCurrentRMessageData->mName << " block " << bnamep << llendl;
return -1;
return LL_VARIABLE_NOT_IN_BLOCK;
}
if (mCurrentRMessageTemplate->mMemberBlocks[bnamep]->mType != MBT_SINGLE)
{
{ // This is a serious error - crash
llerrs << "Block " << bnamep << " isn't type MBT_SINGLE,"
" use getSize with blocknum argument!" << llendl;
return -1;
return LL_MESSAGE_ERROR;
}
return vardata.getSize();
@ -230,15 +230,15 @@ S32 LLTemplateMessageReader::getSize(const char *blockname, S32 blocknum, const
{
// is there a message ready to go?
if (mReceiveSize == -1)
{
{ // This is a serious error - crash
llerrs << "No message waiting for decode 5!" << llendl;
return -1;
return LL_MESSAGE_ERROR;
}
if (!mCurrentRMessageData)
{
{ // This is a serious error - crash
llerrs << "Invalid mCurrentRMessageData in getData!" << llendl;
return -1;
return LL_MESSAGE_ERROR;
}
char *bnamep = (char *)blockname + blocknum;
@ -247,20 +247,20 @@ S32 LLTemplateMessageReader::getSize(const char *blockname, S32 blocknum, const
LLMsgData::msg_blk_data_map_t::const_iterator iter = mCurrentRMessageData->mMemberBlocks.find(bnamep);
if (iter == mCurrentRMessageData->mMemberBlocks.end())
{
llerrs << "Block " << bnamep << " not in message "
{ // don't crash
llinfos << "Block " << bnamep << " not in message "
<< mCurrentRMessageData->mName << llendl;
return -1;
return LL_BLOCK_NOT_IN_MESSAGE;
}
LLMsgBlkData* msg_data = iter->second;
LLMsgVarData& vardata = msg_data->mMemberVarData[vnamep];
if (!vardata.getName())
{
llerrs << "Variable " << vnamep << " not in message "
{ // don't crash
llinfos << "Variable " << vnamep << " not in message "
<< mCurrentRMessageData->mName << " block " << bnamep << llendl;
return -1;
return LL_VARIABLE_NOT_IN_BLOCK;
}
return vardata.getSize();

View File

@ -631,6 +631,8 @@ char* _PREHASH_OfferCallingCard = LLMessageStringTable::getInstance()->getString
char* _PREHASH_AcceptCallingCard = LLMessageStringTable::getInstance()->getString("AcceptCallingCard");
char* _PREHASH_DeclineCallingCard = LLMessageStringTable::getInstance()->getString("DeclineCallingCard");
char* _PREHASH_AgentAccess = LLMessageStringTable::getInstance()->getString("AgentAccess");
char* _PREHASH_AgentLegacyAccess = LLMessageStringTable::getInstance()->getString("AgentLegacyAccess");
char* _PREHASH_AgentMaxAccess = LLMessageStringTable::getInstance()->getString("AgentMaxAccess");
char* _PREHASH_DataHomeLocationReply = LLMessageStringTable::getInstance()->getString("DataHomeLocationReply");
char* _PREHASH_EventLocationReply = LLMessageStringTable::getInstance()->getString("EventLocationReply");
char* _PREHASH_TerseDateID = LLMessageStringTable::getInstance()->getString("TerseDateID");
@ -1377,5 +1379,4 @@ char* _PREHASH_UCoord = LLMessageStringTable::getInstance()->getString("UCoord")
char* _PREHASH_VCoord = LLMessageStringTable::getInstance()->getString("VCoord");
char* _PREHASH_FaceIndex = LLMessageStringTable::getInstance()->getString("FaceIndex");
char* _PREHASH_StatusData = LLMessageStringTable::getInstance()->getString("StatusData");
char* _PREHASH_ProductSKU = LLMessageStringTable::getInstance()->getString("ProductSKU");

View File

@ -631,6 +631,8 @@ extern char * _PREHASH_OfferCallingCard;
extern char * _PREHASH_AcceptCallingCard;
extern char * _PREHASH_DeclineCallingCard;
extern char * _PREHASH_AgentAccess;
extern char * _PREHASH_AgentLegacyAccess;
extern char * _PREHASH_AgentMaxAccess;
extern char * _PREHASH_DataHomeLocationReply;
extern char * _PREHASH_EventLocationReply;
extern char * _PREHASH_TerseDateID;
@ -1377,5 +1379,5 @@ extern char * _PREHASH_UCoord;
extern char * _PREHASH_VCoord;
extern char * _PREHASH_FaceIndex;
extern char * _PREHASH_StatusData;
extern char * _PREHASH_ProductSKU;
#endif

View File

@ -131,7 +131,6 @@ LLFontGL::~LLFontGL()
void LLFontGL::reset()
{
resetBitmapCache();
if (!mIsFallback)
{
// This is the head of the list - need to rebuild ourself and all fallbacks.
@ -150,6 +149,7 @@ void LLFontGL::reset()
}
}
}
resetBitmapCache();
}
// static
@ -679,8 +679,6 @@ S32 LLFontGL::render(const LLWString &wstr,
gGL.popMatrix();
gGL.getTexUnit(0)->disable();
return chars_drawn;
}

View File

@ -49,7 +49,7 @@ class LLNotificationHistoryChannel : public LLNotificationChannel
LOG_CLASS(LLNotificationHistoryChannel);
public:
LLNotificationHistoryChannel(const std::string& filename) :
LLNotificationChannel("History", "Visible", &historyFilter),
LLNotificationChannel("History", "Visible", &historyFilter, LLNotificationComparators::orderByUUID()),
mFileName(filename)
{
connectChanged(boost::bind(&LLNotificationHistoryChannel::historyHandler, this, _1));
@ -858,6 +858,20 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt
return abortProcessing;
}
/* static */
LLNotificationChannelPtr LLNotificationChannel::buildChannel(const std::string& name,
const std::string& parent,
LLNotificationFilter filter,
LLNotificationComparator comparator)
{
// note: this is not a leak; notifications are self-registering.
// This factory helps to prevent excess deletions by making sure all smart
// pointers to notification channels come from the same source
new LLNotificationChannel(name, parent, filter, comparator);
return LLNotifications::instance().getChannel(name);
}
LLNotificationChannel::LLNotificationChannel(const std::string& name,
const std::string& parent,
LLNotificationFilter filter,
@ -1054,21 +1068,22 @@ void LLNotifications::createDefaultChannels()
{
// now construct the various channels AFTER loading the notifications,
// because the history channel is going to rewrite the stored notifications file
new LLNotificationChannel("Expiration", "",
LLNotificationChannel::buildChannel("Expiration", "",
boost::bind(&LLNotifications::expirationFilter, this, _1));
new LLNotificationChannel("Unexpired", "",
LLNotificationChannel::buildChannel("Unexpired", "",
!boost::bind(&LLNotifications::expirationFilter, this, _1)); // use negated bind
new LLNotificationChannel("Unique", "Unexpired",
LLNotificationChannel::buildChannel("Unique", "Unexpired",
boost::bind(&LLNotifications::uniqueFilter, this, _1));
new LLNotificationChannel("Ignore", "Unique",
LLNotificationChannel::buildChannel("Ignore", "Unique",
filterIgnoredNotifications);
new LLNotificationChannel("Visible", "Ignore",
LLNotificationChannel::buildChannel("Visible", "Ignore",
&LLNotificationFilters::includeEverything);
// create special history channel
//std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" );
// use ^^^ when done debugging notifications serialization
std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_USER_SETTINGS, "open_notifications.xml" );
// this isn't a leak, don't worry about the empty "new"
new LLNotificationHistoryChannel(notifications_log_file);
// connect action methods to these channels

View File

@ -735,6 +735,13 @@ protected:
LLNotificationFilter mFilter;
};
// The type of the pointers that we're going to manage in the NotificationQueue system
// Because LLNotifications is a singleton, we don't actually expect to ever
// destroy it, but if it becomes necessary to do so, the shared_ptr model
// will ensure that we don't leak resources.
class LLNotificationChannel;
typedef boost::shared_ptr<LLNotificationChannel> LLNotificationChannelPtr;
// manages a list of notifications
// Note that if this is ever copied around, we might find ourselves with multiple copies
// of a queue with notifications being added to different nonequivalent copies. So we
@ -742,8 +749,9 @@ protected:
//
// NOTE: LLNotificationChannel is self-registering. The *correct* way to create one is to
// do something like:
// new LLNotificationChannel("name", "parent"...);
// You can then retrieve the channel by using the registry:
// LLNotificationChannel::buildChannel("name", "parent"...);
// This returns an LLNotificationChannelPtr, which you can store, or
// you can then retrieve the channel by using the registry:
// LLNotifications::instance().getChannel("name")...
//
class LLNotificationChannel :
@ -754,13 +762,6 @@ class LLNotificationChannel :
public:
virtual ~LLNotificationChannel() {}
// Notification Channels have a filter, which determines which notifications
// will be added to this channel.
// Channel filters cannot change.
LLNotificationChannel(const std::string& name, const std::string& parent,
LLNotificationFilter filter=LLNotificationFilters::includeEverything,
LLNotificationComparator comparator=LLNotificationComparators::orderByUUID());
typedef LLNotificationSet::iterator Iterator;
std::string getName() const { return mName; }
@ -777,6 +778,21 @@ public:
std::string summarize();
// factory method for constructing these channels; since they're self-registering,
// we want to make sure that you can't use new to make them
static LLNotificationChannelPtr buildChannel(const std::string& name, const std::string& parent,
LLNotificationFilter filter=LLNotificationFilters::includeEverything,
LLNotificationComparator comparator=LLNotificationComparators::orderByUUID());
protected:
// Notification Channels have a filter, which determines which notifications
// will be added to this channel.
// Channel filters cannot change.
// Channels have a protected constructor so you can't make smart pointers that don't
// come from our internal reference; call NotificationChannel::build(args)
LLNotificationChannel(const std::string& name, const std::string& parent,
LLNotificationFilter filter, LLNotificationComparator comparator);
private:
std::string mName;
std::string mParent;
@ -785,12 +801,6 @@ private:
// The type of the pointers that we're going to manage in the NotificationQueue system
// Because LLNotifications is a singleton, we don't actually expect to ever
// destroy it, but if it becomes necessary to do so, the shared_ptr model
// will ensure that we don't leak resources.
typedef boost::shared_ptr<LLNotificationChannel> LLNotificationChannelPtr;
class LLNotifications :
public LLSingleton<LLNotifications>,
public LLNotificationChannelBase

View File

@ -431,7 +431,7 @@ LLView* LLTextBox::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *f
std::string font_style;
if (node->getAttributeString("font-style", font_style))
{
text_box->mFontStyle |= LLFontGL::getStyleFromString(font_style);
text_box->mFontStyle = LLFontGL::getStyleFromString(font_style);
}
BOOL mouse_opaque = text_box->getMouseOpaque();

View File

@ -121,7 +121,7 @@ S32 LLTextParser::findPattern(const std::string &text, LLSD highlight)
pattern= utf8str_tolower(pattern);
}
S32 found=std::string::npos;
size_t found=std::string::npos;
switch ((S32)highlight["condition"])
{

View File

@ -1370,8 +1370,6 @@ void LLView::draw()
{
drawDebugRect();
}
gGL.getTexUnit(0)->disable();
}
//Draw a box for debugging.

View File

@ -234,7 +234,9 @@ const S32 LLVFSFileBlock::SERIAL_SIZE = 34;
LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename, const BOOL read_only, const U32 presize, const BOOL remove_after_crash)
: mRemoveAfterCrash(remove_after_crash)
: mRemoveAfterCrash(remove_after_crash),
mDataFP(NULL),
mIndexFP(NULL)
{
mDataMutex = new LLMutex(0);
@ -250,17 +252,21 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename
const char *file_mode = mReadOnly ? "rb" : "r+b";
if (! (mDataFP = openAndLock(mDataFilename, file_mode, mReadOnly)))
LL_INFOS("VFS") << "Attempting to open VFS index file " << mIndexFilename << LL_ENDL;
LL_INFOS("VFS") << "Attempting to open VFS data file " << mDataFilename << LL_ENDL;
mDataFP = openAndLock(mDataFilename, file_mode, mReadOnly);
if (!mDataFP)
{
if (mReadOnly)
{
LL_WARNS("VFS") << "Can't find " << mDataFilename << " to open read-only VFS" << LL_ENDL;
mValid = VFSVALID_BAD_CANNOT_OPEN_READONLY;
return;
}
if((mDataFP = openAndLock(mDataFilename, "w+b", FALSE)))
mDataFP = openAndLock(mDataFilename, "w+b", FALSE);
if (mDataFP)
{
// Since we're creating this data file, assume any index file is bogus
// remove the index, since this vfs is now blank
@ -268,41 +274,12 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename
}
else
{
LL_WARNS("VFS") << "Can't open VFS data file " << mDataFilename << " attempting to use alternate" << LL_ENDL;
std::string temp_index;
std::string temp_data;
for (U32 count = 0; count < 256; count++)
{
temp_index = mIndexFilename + llformat(".%u",count);
temp_data = mDataFilename + llformat(".%u", count);
// try just opening, then creating, each alternate
if ((mDataFP = openAndLock(temp_data, "r+b", FALSE)))
{
break;
}
if ((mDataFP = openAndLock(temp_data, "w+b", FALSE)))
{
// we're creating the datafile, so nuke the indexfile
LLFile::remove(temp_index);
break;
}
}
if (! mDataFP)
{
LL_WARNS("VFS") << "Couldn't open vfs data file after trying many alternates" << LL_ENDL;
mValid = VFSVALID_BAD_CANNOT_CREATE;
return;
}
mIndexFilename = temp_index;
mDataFilename = temp_data;
LL_WARNS("VFS") << "Couldn't open vfs data file "
<< mDataFilename << LL_ENDL;
mValid = VFSVALID_BAD_CANNOT_CREATE;
return;
}
if (presize)
{
presizeDataFile(presize);
@ -351,7 +328,7 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename
llstat fbuf;
if (! LLFile::stat(mIndexFilename, &fbuf) &&
fbuf.st_size >= LLVFSFileBlock::SERIAL_SIZE &&
(mIndexFP = openAndLock(mIndexFilename, file_mode, mReadOnly))
(mIndexFP = openAndLock(mIndexFilename, file_mode, mReadOnly)) // Yes, this is an assignment and not '=='
)
{
std::vector<U8> buffer(fbuf.st_size);
@ -539,7 +516,7 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename
addFreeBlock(new LLVFSBlock(0, data_size));
}
}
else
else // Pre-existing index file wasn't opened
{
if (mReadOnly)
{
@ -579,8 +556,8 @@ LLVFS::LLVFS(const std::string& index_filename, const std::string& data_filename
}
}
LL_WARNS("VFS") << "Using index file " << mIndexFilename << LL_ENDL;
LL_WARNS("VFS") << "Using data file " << mDataFilename << LL_ENDL;
LL_INFOS("VFS") << "Using VFS index file " << mIndexFilename << LL_ENDL;
LL_INFOS("VFS") << "Using VFS data file " << mDataFilename << LL_ENDL;
mValid = VFSVALID_OK;
}
@ -619,6 +596,47 @@ LLVFS::~LLVFS()
delete mDataMutex;
}
// Use this function normally to create LLVFS files.
// Will append digits to the end of the filename with multiple re-trys
// static
LLVFS * LLVFS::createLLVFS(const std::string& index_filename,
const std::string& data_filename,
const BOOL read_only,
const U32 presize,
const BOOL remove_after_crash)
{
LLVFS * new_vfs = new LLVFS(index_filename, data_filename, read_only, presize, remove_after_crash);
if( !new_vfs->isValid() )
{ // First name failed, retry with new names
std::string retry_vfs_index_name;
std::string retry_vfs_data_name;
S32 count = 0;
while (!new_vfs->isValid() &&
count < 256)
{ // Append '.<number>' to end of filenames
retry_vfs_index_name = index_filename + llformat(".%u",count);
retry_vfs_data_name = data_filename + llformat(".%u", count);
delete new_vfs; // Delete bad VFS and try again
new_vfs = new LLVFS(retry_vfs_index_name, retry_vfs_data_name, read_only, presize, remove_after_crash);
count++;
}
}
if( !new_vfs->isValid() )
{
delete new_vfs; // Delete bad VFS
new_vfs = NULL; // Total failure
}
return new_vfs;
}
void LLVFS::presizeDataFile(const U32 size)
{
if (!mDataFP)

View File

@ -77,11 +77,25 @@ public:
class LLVFS
{
public:
private:
// Use createLLVFS() to open a VFS file
// Pass 0 to not presize
LLVFS(const std::string& index_filename, const std::string& data_filename, const BOOL read_only, const U32 presize, const BOOL remove_after_crash);
LLVFS(const std::string& index_filename,
const std::string& data_filename,
const BOOL read_only,
const U32 presize,
const BOOL remove_after_crash);
public:
~LLVFS();
// Use this function normally to create LLVFS files
// Pass 0 to not presize
static LLVFS * createLLVFS(const std::string& index_filename,
const std::string& data_filename,
const BOOL read_only,
const U32 presize,
const BOOL remove_after_crash);
BOOL isValid() const { return (VFSVALID_OK == mValid); }
EVFSValid getValidState() const { return mValid; }

View File

@ -141,7 +141,6 @@ set(viewer_SOURCE_FILES
llfloaterchat.cpp
llfloaterchatterbox.cpp
llfloaterclassified.cpp
llfloaterclothing.cpp
llfloatercolorpicker.cpp
llfloatercustomize.cpp
llfloaterdaycycle.cpp
@ -311,6 +310,7 @@ set(viewer_SOURCE_FILES
llpreviewscript.cpp
llpreviewsound.cpp
llpreviewtexture.cpp
llproductinforequest.cpp
llprogressview.cpp
llregionposition.cpp
llremoteparcelrequest.cpp
@ -545,7 +545,6 @@ set(viewer_HEADER_FILES
llfloaterchat.h
llfloaterchatterbox.h
llfloaterclassified.h
llfloaterclothing.h
llfloatercolorpicker.h
llfloatercustomize.h
llfloaterdaycycle.h
@ -715,6 +714,7 @@ set(viewer_HEADER_FILES
llpreviewscript.h
llpreviewsound.h
llpreviewtexture.h
llproductinforequest.h
llprogressview.h
llregionposition.h
llremoteparcelrequest.h

View File

@ -1451,17 +1451,6 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>ClothingBtnState</key>
<map>
<key>Comment</key>
<string />
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>CmdLineDisableVoice</key>
<map>
<key>Comment</key>
@ -11640,7 +11629,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
<integer>1</integer>
</map>
<key>WaterEditPresets</key>
<map>

View File

@ -90,14 +90,15 @@ ATI Radeon HD 2300 .*ATI.*Radeon HD 23.* 0 1
ATI Radeon HD 2400 .*ATI.*Radeon HD.*24.* 1 1
ATI Radeon HD 2600 .*ATI.*Radeon HD 26.* 2 1
ATI Radeon HD 2900 .*ATI.*Radeon HD 29.* 3 1
ATI Radeon HD 3200 .*ATI.*Radeon HD.*32.* 1 1
ATI Radeon HD 3200 .*ATI.*Radeon.*HD.*32.* 1 1
ATI Radeon HD 3300 .*ATI.*Radeon HD.*33.* 1 1
ATI Radeon HD 3400 .*ATI.*Radeon HD.*34.* 1 1
ATI Radeon HD 3600 .*ATI.*Radeon HD.*36.* 3 1
ATI Radeon HD 3800 .*ATI.*Radeon HD.*38.* 3 1
ATI Radeon HD 4300 .*ATI.*Radeon HD 43.* 1 1
ATI Radeon HD 4500 .*ATI.*Radeon HD 45.* 2 1
ATI Radeon HD 4600 .*ATI.*Radeon HD 46.* 3 1
ATI Radeon HD 4800 .*ATI.*Radeon HD.*48.* 3 1
ATI Radeon HD 4800 .*ATI.*Radeon.*HD.*48.* 3 1
ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
ATI Radeon 2100 .*ATI.*Radeon 21.* 0 1
ATI Radeon 3100 .*ATI.*Radeon 31.* 1 1
@ -135,6 +136,7 @@ ATI Radeon X900 .*ATI.*Radeon X9.* 2 1
ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 0
ATI Rage 128 .*ATI.*Rage 128.* 0 1
ATI RV250 .*ATI.*RV250.* 0 1
ATI RV380 .*ATI.*RV380.* 0 1
ATI RV530 .*ATI.*RV530.* 1 1
ATI RX700 .*ATI.*RX700.* 1 1
Intel X3100 .*Intel.*X3100.* 0 1
@ -160,8 +162,9 @@ Intel Montara .*Intel.*Montara.* 0 0
Intel Springdale .*Intel.*Springdale.* 0 0
Matrox .*Matrox.* 0 0
Mesa .*Mesa.* 0 0
NVIDIA GTX 260 .*NVIDIA.*GeForce.*GTX.*260.* 3 1
NVIDIA GTX 280 .*NVIDIA.*GeForce.*GTX.*280.* 3 1
NVIDIA GTX 260 .*NVIDIA.*GeForce.*GTX.*26.* 3 1
NVIDIA GTX 280 .*NVIDIA.*GeForce.*GTX.*28.* 3 1
NVIDIA GTX 290 .*NVIDIA.*GeForce.*GTX.*29.* 3 1
NVIDIA C51 .*NVIDIA.*C51.* 0 1
NVIDIA G72 .*NVIDIA.*G72.* 1 1
NVIDIA G73 .*NVIDIA.*G73.* 1 1
@ -187,7 +190,7 @@ NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1
NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1
NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 2 1
NVIDIA GeForce 7800 .*NVIDIA.*GeForce.*78.* 2 1
NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 2 1
NVIDIA GeForce 7900 .*NVIDIA.*GeForce.*79.* 2 1
NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1
NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1
NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1
@ -205,8 +208,8 @@ NVIDIA GeForce 9700M .*NVIDIA.*GeForce 9700M.* 2 1
NVIDIA GeForce 9300 .*NVIDIA.*GeForce 93.* 1 1
NVIDIA GeForce 9400 .*GeForce 94.* 1 1
NVIDIA GeForce 9500 .*NVIDIA.*GeForce 95.* 2 1
NVIDIA GeForce 9600 .*NVIDIA.*GeForce 96.* 3 1
NVIDIA GeForce 9800 .*NVIDIA.*GeForce 98.* 3 1
NVIDIA GeForce 9600 .*NVIDIA.*GeForce.*96.* 3 1
NVIDIA GeForce 9800 .*NVIDIA.*GeForce.*98.* 3 1
NVIDIA GeForce FX 5100 .*NVIDIA.*GeForce FX 51.* 0 1
NVIDIA GeForce FX 5200 .*NVIDIA.*GeForce FX 52.* 0 1
NVIDIA GeForce FX 5500 .*NVIDIA.*GeForce FX 55.* 0 1
@ -236,8 +239,6 @@ NVIDIA GeForce Go 7600 .*NVIDIA.*GeForce Go 76.* 2 1
NVIDIA GeForce Go 7700 .*NVIDIA.*GeForce Go 77.* 2 1
NVIDIA GeForce Go 7800 .*NVIDIA.*GeForce Go 78.* 2 1
NVIDIA GeForce Go 7900 .*NVIDIA.*GeForce Go 79.* 2 1
NVIDIA GeForce GTX 260 .*NVIDIA.*GeForce GTX 26.* 3 1
NVIDIA GeForce GTX 280 .*NVIDIA.*GeForce GTX 28.* 3 1
NVIDIA D9M .*D9M.* 1 1
NVIDIA G84 .*G84.* 1 1
NVIDIA G92 .*G92.* 3 1
@ -249,6 +250,7 @@ NVIDIA GeForce PCX .*GeForce PCX.* 0 1
NVIDIA Generic .*NVIDIA.*Unknown.* 0 0
NVIDIA NV17 .*GeForce NV17.* 0 1
NVIDIA NV34 .*NVIDIA.*NV34.* 0 1
NVIDIA NV35 .*NVIDIA.*NV35.* 0 1
NVIDIA NV36 .*GeForce NV36.* 1 1
NVIDIA NV43 .*NVIDIA.*NV43.* 1 1
NVIDIA NV44 .*NVIDIA.*NV44.* 1 1

View File

@ -228,13 +228,18 @@ FunctionEnd
Function CheckNetworkConnection
Push $0
Push $1
Push $2 # Option value for GetOptions
DetailPrint $(CheckNetworkConnectionDP)
; Look for a tag value from the stub installer, used for statistics
; to correlate installs. Default to "" if not found on command line.
StrCpy $2 ""
${GetOptions} $COMMANDLINE "/STUBTAG=" $2
GetTempFileName $0
!define HTTP_TIMEOUT 5000 ; milliseconds
; Don't show secondary progress bar, this will be quick.
NSISdl::download_quiet \
/TIMEOUT=${HTTP_TIMEOUT} \
"http://install.secondlife.com/check/?v=${VERSION_LONG}" \
"http://install.secondlife.com/check/?stubtag=$2&version=${VERSION_LONG}" \
$0
Pop $1 ; Return value, either "success", "cancel" or an error message
; MessageBox MB_OK "Download result: $1"
@ -242,6 +247,7 @@ Function CheckNetworkConnection
; StrCmp $1 "success" +2
; DetailPrint "Connection failed: $1"
Delete $0 ; temporary file
Pop $2
Pop $1
Pop $0
Return

View File

@ -217,7 +217,6 @@ LLAgent gAgent;
//
// Statics
//
BOOL LLAgent::sDebugDisplayTarget = FALSE;
const F32 LLAgent::TYPING_TIMEOUT_SECS = 5.f;
@ -4428,7 +4427,8 @@ void LLAgent::setFocusGlobal(const LLVector3d& focus, const LLUUID &object_id)
// for attachments, make offset relative to avatar, not the attachment
if (mFocusObject->isAttachment())
{
while (!mFocusObject->isAvatar())
while (mFocusObject.notNull() // DEV-29123 - can crash with a messed-up attachment
&& !mFocusObject->isAvatar())
{
mFocusObject = (LLViewerObject*) mFocusObject->getParent();
}
@ -4842,6 +4842,36 @@ bool LLAgent::canAccessAdult() const
return mAgentAccess.canAccessAdult();
}
bool LLAgent::canAccessMaturityInRegion( U64 region_handle ) const
{
LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromHandle( region_handle );
if( regionp )
{
switch( regionp->getSimAccess() )
{
case SIM_ACCESS_MATURE:
if( !canAccessMature() )
return false;
break;
case SIM_ACCESS_ADULT:
if( !canAccessAdult() )
return false;
break;
default:
// Oh, go on and hear the silly noises.
break;
}
}
return true;
}
bool LLAgent::canAccessMaturityAtGlobal( LLVector3d pos_global ) const
{
U64 region_handle = to_region_handle_global( pos_global.mdV[0], pos_global.mdV[1] );
return canAccessMaturityInRegion( region_handle );
}
bool LLAgent::prefersPG() const
{
return mAgentAccess.prefersPG();
@ -6431,6 +6461,8 @@ void LLAgent::saveWearable( EWearableType type, BOOL send_update )
addWearableToAgentInventory(cb, new_wearable);
return;
}
getAvatarObject()->wearableUpdated( type );
if( send_update )
{

View File

@ -208,7 +208,7 @@ public:
void heardChat(const LLUUID& id);
void lookAtLastChat();
F32 getTypingTime() { return mTypingTimer.getElapsedTimeF32(); }
F32 getTypingTime() { return mTypingTimer.getElapsedTimeF32(); }
void setAFK();
void clearAFK();
@ -258,6 +258,8 @@ public:
bool wantsPGOnly() const;
bool canAccessMature() const;
bool canAccessAdult() const;
bool canAccessMaturityInRegion( U64 region_handle ) const;
bool canAccessMaturityAtGlobal( LLVector3d pos_global ) const;
bool prefersPG() const;
bool prefersMature() const;
bool prefersAdult() const;
@ -743,7 +745,6 @@ public:
BOOL mInitialized;
static BOOL sDebugDisplayTarget;
S32 mNumPendingQueries;
S32* mActiveCacheQueries;

View File

@ -848,7 +848,6 @@ bool LLAppViewer::mainLoop()
try
{
LLFastTimer t(LLFastTimer::FTM_FRAME);
pingMainloopTimeout("Main:MiscNativeWindowEvents");
{
@ -1999,38 +1998,9 @@ bool LLAppViewer::initConfiguration()
}
initMarkerFile();
#if LL_SEND_CRASH_REPORTS
if (gLastExecEvent == LAST_EXEC_FROZE)
{
llinfos << "Last execution froze, requesting to send crash report." << llendl;
//
// Pop up a freeze or crash warning dialog
//
std::ostringstream msg;
msg << gSecondLife
<< " appears to have frozen or crashed on the previous run.\n"
<< "Would you like to send a crash report?";
std::string alert;
alert = gSecondLife;
alert += " Alert";
S32 choice = OSMessageBox(msg.str(),
alert,
OSMB_YESNO);
if (OSBTN_YES == choice)
{
llinfos << "Sending crash report." << llendl;
bool report_freeze = true;
handleCrashReporting(report_freeze);
}
else
{
llinfos << "Not sending crash report." << llendl;
}
}
#endif // #if LL_SEND_CRASH_REPORTS
}
checkForCrash();
}
else
{
mSecondInstance = anotherInstanceRunning();
@ -2048,6 +2018,11 @@ bool LLAppViewer::initConfiguration()
}
initMarkerFile();
if(!mSecondInstance)
{
checkForCrash();
}
}
// need to do this here - need to have initialized global settings first
@ -2062,6 +2037,43 @@ bool LLAppViewer::initConfiguration()
return true; // Config was successful.
}
void LLAppViewer::checkForCrash(void)
{
#if LL_SEND_CRASH_REPORTS
if (gLastExecEvent == LAST_EXEC_FROZE || gLastExecEvent == LAST_EXEC_OTHER_CRASH)
{
llinfos << "Last execution froze, requesting to send crash report." << llendl;
//
// Pop up a freeze or crash warning dialog
//
std::ostringstream msg;
msg << gSecondLife
<< " appears to have frozen or crashed on the previous run.\n"
<< "Would you like to send a crash report?";
std::string alert;
alert = gSecondLife;
alert += " Alert";
S32 choice = OSMessageBox(msg.str(),
alert,
OSMB_YESNO);
if (OSBTN_YES == choice)
{
llinfos << "Sending crash report." << llendl;
bool report_freeze = true;
handleCrashReporting(report_freeze);
}
else
{
llinfos << "Not sending crash report." << llendl;
}
}
#endif // LL_SEND_CRASH_REPORTS
}
bool LLAppViewer::initWindow()
{
LL_INFOS("AppInit") << "Initializing window..." << LL_ENDL;
@ -2397,6 +2409,10 @@ void LLAppViewer::handleViewerCrash()
LLError::logToFile("");
// On Mac, we send the report on the next run, since we need macs crash report
// for a stack trace, so we have to let it the app fail.
#if !LL_DARWIN
// Remove the marker file, since otherwise we'll spawn a process that'll keep it locked
if(gDebugInfo["LastExecEvent"].asInteger() == LAST_EXEC_LOGOUT_CRASH)
{
@ -2410,6 +2426,8 @@ void LLAppViewer::handleViewerCrash()
// Call to pure virtual, handled by platform specific llappviewer instance.
pApp->handleCrashReporting();
#endif //!LL_DARWIN
return;
}
@ -2465,6 +2483,13 @@ void LLAppViewer::initMarkerFile()
std::string llerror_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, LLERROR_MARKER_FILE_NAME);
std::string error_marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ERROR_MARKER_FILE_NAME);
if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB) && !anotherInstanceRunning())
{
gLastExecEvent = LAST_EXEC_FROZE;
LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL;
}
if(LLAPRFile::isExist(logout_marker_file, NULL, LL_APR_RB))
{
LL_INFOS("MarkerFile") << "Last exec LLError crashed, setting LastExecEvent to " << LAST_EXEC_LLERROR_CRASH << LL_ENDL;
@ -2487,18 +2512,12 @@ void LLAppViewer::initMarkerFile()
LLAPRFile::remove(llerror_marker_file);
LLAPRFile::remove(error_marker_file);
//Freeze case checks
// No new markers if another instance is running.
if(anotherInstanceRunning())
{
return;
}
if (LLAPRFile::isExist(mMarkerFileName, NULL, LL_APR_RB))
{
gLastExecEvent = LAST_EXEC_FROZE;
LL_INFOS("MarkerFile") << "Exec marker found: program froze on previous execution" << LL_ENDL;
}
// Create the marker file for this execution & lock it
apr_status_t s;
s = mMarkerFile.open(mMarkerFileName, LL_APR_W, gAPRPoolp);
@ -2873,17 +2892,17 @@ bool LLAppViewer::initCache()
gSavedSettings.setU32("VFSSalt", new_salt);
// Don't remove VFS after viewer crashes. If user has corrupt data, they can reinstall. JC
gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false);
if( VFSVALID_BAD_CORRUPT == gVFS->getValidState() )
gVFS = LLVFS::createLLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false);
if( !gVFS )
{
// Try again with fresh files
// (The constructor deletes corrupt files when it finds them.)
LL_WARNS("AppCache") << "VFS corrupt, deleted. Making new VFS." << LL_ENDL;
delete gVFS;
gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false);
return false;
}
gStaticVFS = new LLVFS(static_vfs_index_file, static_vfs_data_file, true, 0, false);
gStaticVFS = LLVFS::createLLVFS(static_vfs_index_file, static_vfs_data_file, true, 0, false);
if( !gStaticVFS )
{
return false;
}
BOOL success = gVFS->isValid() && gStaticVFS->isValid();
if( !success )

View File

@ -85,7 +85,8 @@ public:
virtual void handleSyncCrashTrace() = 0; // any low-level crash-prep that has to happen in the context of the crashing thread before the crash report is delivered.
static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon.
static void handleSyncViewerCrash(); // Hey! The viewer crashed. Do this right NOW in the context of the crashing thread.
void checkForCrash();
// Thread accessors
static LLTextureCache* getTextureCache() { return sTextureCache; }
static LLWorkerThread* getImageDecodeThread() { return sImageDecodeThread; }

View File

@ -58,12 +58,12 @@ public:
POOL_SKY,
POOL_WL_SKY,
POOL_GROUND,
POOL_INVISIBLE,
POOL_AVATAR,
POOL_WATER,
POOL_GRASS,
POOL_FULLBRIGHT,
POOL_BUMP,
POOL_INVISIBLE,
POOL_AVATAR,
POOL_WATER,
POOL_GLOW,
POOL_ALPHA,
NUM_POOL_TYPES,

View File

@ -752,67 +752,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
if( !single_avatar || (avatarp == single_avatar) )
{
if (LLVOAvatar::sShowCollisionVolumes)
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
avatarp->renderCollisionVolumes();
}
if (avatarp->isSelf() && LLAgent::sDebugDisplayTarget)
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLVector3 pos = avatarp->getPositionAgent();
gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
gGL.begin(LLRender::LINES);
{
gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
gGL.vertex3fv((pos - LLVector3(0.f, 0.2f, 0.f)).mV);
gGL.vertex3fv((pos + LLVector3(0.f, 0.2f, 0.f)).mV);
gGL.vertex3fv((pos - LLVector3(0.f, 0.f, 0.2f)).mV);
gGL.vertex3fv((pos + LLVector3(0.f, 0.f, 0.2f)).mV);
}gGL.end();
pos = avatarp->mDrawable->getPositionAgent();
gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
gGL.begin(LLRender::LINES);
{
gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
gGL.vertex3fv((pos - LLVector3(0.f, 0.2f, 0.f)).mV);
gGL.vertex3fv((pos + LLVector3(0.f, 0.2f, 0.f)).mV);
gGL.vertex3fv((pos - LLVector3(0.f, 0.f, 0.2f)).mV);
gGL.vertex3fv((pos + LLVector3(0.f, 0.f, 0.2f)).mV);
}gGL.end();
pos = avatarp->mRoot.getWorldPosition();
gGL.color4f(1.0f, 1.0f, 1.0f, 0.8f);
gGL.begin(LLRender::LINES);
{
gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
gGL.vertex3fv((pos - LLVector3(0.f, 0.2f, 0.f)).mV);
gGL.vertex3fv((pos + LLVector3(0.f, 0.2f, 0.f)).mV);
gGL.vertex3fv((pos - LLVector3(0.f, 0.f, 0.2f)).mV);
gGL.vertex3fv((pos + LLVector3(0.f, 0.f, 0.2f)).mV);
}gGL.end();
pos = avatarp->mPelvisp->getWorldPosition();
gGL.color4f(0.0f, 0.0f, 1.0f, 0.8f);
gGL.begin(LLRender::LINES);
{
gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
gGL.vertex3fv((pos - LLVector3(0.f, 0.2f, 0.f)).mV);
gGL.vertex3fv((pos + LLVector3(0.f, 0.2f, 0.f)).mV);
gGL.vertex3fv((pos - LLVector3(0.f, 0.f, 0.2f)).mV);
gGL.vertex3fv((pos + LLVector3(0.f, 0.f, 0.2f)).mV);
}gGL.end();
color.setColor(1.0f, 1.0f, 1.0f, 1.0f);
}
avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
}
}

View File

@ -932,12 +932,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
{
clearState(TEXTURE_ANIM);
}
//else if (getVirtualSize() <= 512.f)
//{
// //vobj->mTextureAnimp->animateTextures(os, ot, ms, mt, r);
// //cos_ang = cos(r);
// //sin_ang = sin(r);
//}
else
{
os = ot = 0.f;

View File

@ -1174,7 +1174,7 @@ void LLFloaterBuyLandUI::refreshUI()
else if (mParcelBillableArea == mParcelActualArea)
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d", mParcelActualArea);
string_args["[AMOUNT]"] = llformat("%d ", mParcelActualArea);
message += getString("parcel_meters", string_args);
}
else
@ -1183,13 +1183,13 @@ void LLFloaterBuyLandUI::refreshUI()
if (mParcelBillableArea > mParcelActualArea)
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d", mParcelBillableArea);
string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea);
message += getString("premium_land", string_args);
}
else
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d", mParcelBillableArea);
string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea);
message += getString("discounted_land", string_args);
}
}

View File

@ -138,6 +138,8 @@ BOOL LLFloaterImagePreview::postBuild()
//-----------------------------------------------------------------------------
LLFloaterImagePreview::~LLFloaterImagePreview()
{
clearAllPreviewTextures();
mRawImagep = NULL;
delete mAvatarPreview;
delete mSculptedPreview;
@ -205,6 +207,21 @@ void LLFloaterImagePreview::onPreviewTypeCommit(LLUICtrl* ctrl, void* userdata)
fp->mSculptedPreview->refresh();
}
//-----------------------------------------------------------------------------
// clearAllPreviewTextures()
//-----------------------------------------------------------------------------
void LLFloaterImagePreview::clearAllPreviewTextures()
{
mAvatarPreview->clearPreviewTexture("mHairMesh0");
mAvatarPreview->clearPreviewTexture("mUpperBodyMesh0");
mAvatarPreview->clearPreviewTexture("mLowerBodyMesh0");
mAvatarPreview->clearPreviewTexture("mHeadMesh0");
mAvatarPreview->clearPreviewTexture("mUpperBodyMesh0");
mAvatarPreview->clearPreviewTexture("mLowerBodyMesh0");
mAvatarPreview->clearPreviewTexture("mSkirtMesh0");
}
//-----------------------------------------------------------------------------
// draw()
//-----------------------------------------------------------------------------
@ -648,6 +665,19 @@ void LLImagePreviewAvatar::setPreviewTarget(const std::string& joint_name, const
mCameraOffset.clearVec();
}
//-----------------------------------------------------------------------------
// clearPreviewTexture()
//-----------------------------------------------------------------------------
void LLImagePreviewAvatar::clearPreviewTexture(const std::string& mesh_name)
{
LLViewerJointMesh *mesh = (LLViewerJointMesh*)mDummyAvatar->mRoot.findJoint(mesh_name);
// clear out existing test mesh
if (mesh)
{
mesh->setTestTexture(0);
}
}
//-----------------------------------------------------------------------------
// update()
//-----------------------------------------------------------------------------

View File

@ -81,6 +81,7 @@ public:
void setPreviewTarget(const std::string& joint_name, const std::string& mesh_name, LLImageRaw* imagep, F32 distance, BOOL male);
void setTexture(U32 name) { mTextureName = name; }
void clearPreviewTexture(const std::string& mesh_name);
BOOL render();
void refresh();
@ -118,6 +119,8 @@ public:
static void onMouseCaptureLostImagePreview(LLMouseHandler*);
static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
void clearAllPreviewTextures();
protected:
static void onPreviewTypeCommit(LLUICtrl*,void*);
void draw();

View File

@ -896,7 +896,7 @@ void LLPanelLandGeneral::onClickStartAuction(void* data)
{
if(parcelp->getForSale())
{
LLNotifications::instance().add("CannotStartAuctionAlreadForSale");
LLNotifications::instance().add("CannotStartAuctionAlreadyForSale");
}
else
{
@ -1770,8 +1770,24 @@ BOOL LLPanelLandOptions::postBuild()
childSetCommitCallback("ShowDirectoryCheck", onCommitAny, this);
mCategoryCombo = getChild<LLComboBox>( "land category");
childSetCommitCallback("land category", onCommitAny, this);
if (gAgent.getAgentAccess().isInTransition())
{
// during the AO transition, this combo has an Adult item.
// Post-transition, it goes away. We can remove this conditional
// after the transition and just use the "else" clause.
mCategoryCombo = getChild<LLComboBox>( "land category with adult");
childSetCommitCallback("land category with adult", onCommitAny, this);
}
else
{
// this is the code that should be preserved post-transition
// you could also change the XML to set visibility and enabled true.
mCategoryCombo = getChild<LLComboBox>( "land category");
childSetCommitCallback("land category", onCommitAny, this);
}
mCategoryCombo->setVisible(true);
mCategoryCombo->setEnabled(true);
mMatureCtrl = getChild<LLCheckBoxCtrl>( "MatureCheck");
childSetCommitCallback("MatureCheck", onCommitAny, this);
@ -1788,14 +1804,6 @@ BOOL LLPanelLandOptions::postBuild()
mMatureCtrl->setEnabled(FALSE);
}
if (!gAgent.getAgentAccess().isInTransition())
{
// remove category for adult if we're post-transition
// (this code can go away, and the category can be removed from the xml,
// once we've completed the transition period for adult)
mCategoryCombo->remove(getString("adult_land_category_label"));
}
mSnapshotCtrl = getChild<LLTextureCtrl>("snapshot_ctrl");
if (mSnapshotCtrl)
@ -1982,6 +1990,7 @@ void LLPanelLandOptions::refresh()
// not teen so fill in the data for the maturity control
mMatureCtrl->setVisible(TRUE);
mMatureCtrl->setLabel(getString("mature_check_mature"));
mMatureCtrl->setToolTip(getString("mature_check_mature_tooltip"));
// they can see the checkbox, but its disposition depends on the
// state of the region
LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();
@ -2002,6 +2011,7 @@ void LLPanelLandOptions::refresh()
mMatureCtrl->setEnabled(FALSE);
mMatureCtrl->set(TRUE);
mMatureCtrl->setLabel(getString("mature_check_adult"));
mMatureCtrl->setToolTip(getString("mature_check_adult_tooltip"));
}
}
}
@ -2140,7 +2150,8 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
BOOL mature_publish = self->mMatureCtrl->get();
BOOL push_restriction = self->mPushRestrictionCtrl->get();
BOOL show_directory = self->mCheckShowDirectory->get();
S32 category_index = self->mCategoryCombo->getCurrentIndex();
// we have to get the index from a lookup, not from the position in the dropdown!
S32 category_index = LLParcel::getCategoryFromString(self->mCategoryCombo->getSelectedValue());
S32 landing_type_index = self->mLandingTypeCombo->getCurrentIndex();
LLUUID snapshot_id = self->mSnapshotCtrl->getImageAssetID();
LLViewerRegion* region;

View File

@ -41,13 +41,14 @@
#include "message.h"
#include "llagent.h"
#include "llbutton.h"
#include "llfloatergroupinfo.h"
#include "llfloaterworldmap.h"
//#include "llinventoryview.h" // for mOpenNextNewItem
#include "llproductinforequest.h"
#include "llscrolllistctrl.h"
#include "llstatusbar.h"
#include "lltextbox.h"
#include "llscrolllistctrl.h"
#include "llbutton.h"
#include "lltrans.h"
#include "lluiconstants.h"
#include "llviewermessage.h"
#include "lluictrlfactory.h"
@ -192,7 +193,9 @@ void LLFloaterLandHoldings::processPlacesReply(LLMessageSystem* msg, void**)
F32 global_x;
F32 global_y;
std::string sim_name;
std::string land_sku;
std::string land_type;
S32 i;
S32 count = msg->getNumberOfBlocks("QueryData");
for (i = 0; i < count; i++)
@ -206,6 +209,18 @@ void LLFloaterLandHoldings::processPlacesReply(LLMessageSystem* msg, void**)
msg->getF32("QueryData", "GlobalX", global_x, i);
msg->getF32("QueryData", "GlobalY", global_y, i);
msg->getString("QueryData", "SimName", sim_name, i);
if ( msg->getSizeFast(_PREHASH_QueryData, i, _PREHASH_ProductSKU) > 0 )
{
msg->getStringFast( _PREHASH_QueryData, _PREHASH_ProductSKU, land_sku, i);
llinfos << "Land sku: " << land_sku << llendl;
land_type = LLProductInfoRequestManager::instance().getDescriptionForSku(land_sku);
}
else
{
land_sku.clear();
land_type = LLTrans::getString("land_type_unknown");
}
self->mActualArea += actual_area;
self->mBillableArea += billable_area;
@ -225,7 +240,7 @@ void LLFloaterLandHoldings::processPlacesReply(LLMessageSystem* msg, void**)
{
area = llformat("%d / %d", billable_area, actual_area);
}
std::string hidden;
hidden = llformat("%f %f", global_x, global_y);
@ -233,19 +248,26 @@ void LLFloaterLandHoldings::processPlacesReply(LLMessageSystem* msg, void**)
element["columns"][0]["column"] = "name";
element["columns"][0]["value"] = name;
element["columns"][0]["font"] = "SANSSERIF";
element["columns"][1]["column"] = "location";
element["columns"][1]["value"] = location;
element["columns"][1]["font"] = "SANSSERIF";
element["columns"][2]["column"] = "area";
element["columns"][2]["value"] = area;
element["columns"][2]["font"] = "SANSSERIF";
element["columns"][3]["column"] = "hidden";
element["columns"][3]["value"] = hidden;
element["columns"][3]["column"] = "type";
element["columns"][3]["value"] = land_type;
element["columns"][3]["font"] = "SANSSERIF";
// hidden is always last column
element["columns"][4]["column"] = "hidden";
element["columns"][4]["value"] = hidden;
list->addElement(element);
}
self->refreshAggregates();
}
@ -257,7 +279,8 @@ void LLFloaterLandHoldings::buttonCore(S32 which)
S32 index = list->getFirstSelectedIndex();
if (index < 0) return;
std::string location = list->getSelectedItemLabel(3);
// hidden is always last column
std::string location = list->getSelectedItemLabel(list->getNumColumns()-1);
F32 global_x = 0.f;
F32 global_y = 0.f;

View File

@ -63,7 +63,7 @@ LLNotificationChannelPanel::LLNotificationChannelPanel(const std::string& channe
{
mChannelPtr = LLNotifications::instance().getChannel(channel_name);
mChannelRejectsPtr = LLNotificationChannelPtr(
new LLNotificationChannel(channel_name + "rejects", mChannelPtr->getParentChannelName(), !boost::bind(mChannelPtr->getFilter(), _1)));
LLNotificationChannel::buildChannel(channel_name + "rejects", mChannelPtr->getParentChannelName(), !boost::bind(mChannelPtr->getFilter(), _1)));
LLUICtrlFactory::instance().buildPanel(this, "panel_notifications_channel.xml");
}

View File

@ -70,6 +70,7 @@
#include "lltextbox.h"
#include "llinventory.h"
#include "lltexturectrl.h"
#include "lltrans.h"
#include "llviewercontrol.h"
#include "lluictrlfactory.h"
#include "llviewerimage.h"
@ -129,9 +130,12 @@ void unpack_request_params(
// LLUUID in compressed form which may have embedded \0's,)
str_buf[0] = '\0';
S32 data_size = msg->getSizeFast(_PREHASH_StringData, i, _PREHASH_SParam);
msg->getBinaryDataFast(_PREHASH_StringData, _PREHASH_SParam,
str_buf, data_size, i, MAX_STRING - 1);
strings.push_back(std::string(str_buf, data_size));
if (data_size >= 0)
{
msg->getBinaryDataFast(_PREHASH_StringData, _PREHASH_SParam,
str_buf, data_size, i, MAX_STRING - 1);
strings.push_back(std::string(str_buf, data_size));
}
}
U32 int_buf;
@ -295,7 +299,7 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
// extract message
std::string sim_name;
std::string sim_type = "(unknown)";
std::string sim_type = LLTrans::getString("land_type_unknown");
U32 region_flags;
U8 agent_limit;
F32 object_bonus_factor;
@ -318,8 +322,8 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
msg->getF32("RegionInfo", "SunHour", sun_hour);
// the only reasonable way to decide if we actually have any data is to
// check to see if any of these fields have nonzero sizes
if (msg->getSize("RegionInfo2", "ProductSKU") ||
msg->getSize("RegionInfo2", "ProductName"))
if (msg->getSize("RegionInfo2", "ProductSKU") > 0 ||
msg->getSize("RegionInfo2", "ProductName") > 0)
{
msg->getString("RegionInfo2", "ProductName", sim_type);
}
@ -746,8 +750,6 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
body["allow_land_resell"] = childGetValue("allow_land_resell_check");
body["agent_limit"] = childGetValue("agent_limit_spin");
body["prim_bonus"] = childGetValue("object_bonus_spin");
// the combo box stores strings "Mature" and "PG", but we have to convert back to a number,
// because the sim doesn't know from strings for this stuff
body["sim_access"] = childGetValue("access_combo");
body["restrict_pushobject"] = childGetValue("restrict_pushobject");
body["allow_parcel_changes"] = childGetValue("allow_parcel_changes_check");
@ -780,8 +782,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
buffer = llformat("%f", value);
strings.push_back(strings_t::value_type(buffer));
U8 access = childGetValue("access_combo").asInteger();
buffer = llformat("%d", (S32)access);
buffer = llformat("%d", childGetValue("access_combo").asInteger());
strings.push_back(strings_t::value_type(buffer));
buffer = llformat("%s", (childGetValue("restrict_pushobject").asBoolean() ? "Y" : "N"));
@ -792,17 +793,14 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
sendEstateOwnerMessage(gMessageSystem, "setregioninfo", invoice, strings);
LLViewerRegion* region = gAgent.getRegion();
if (region && access != region->getSimAccess() )
{
LLNotifications::instance().add("RegionMaturityChange");
}
}
//integers_t integers;
// if we changed access levels, tell user about it
LLViewerRegion* region = gAgent.getRegion();
if (region && (childGetValue("access_combo").asInteger() != region->getSimAccess()) )
{
LLNotifications::instance().add("RegionMaturityChange");
}
return TRUE;
}
@ -2702,6 +2700,19 @@ bool LLPanelEstateCovenant::refreshFromRegion(LLViewerRegion* region)
}
}
LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text");
if (region_maturity)
{
region_maturity->setText(region->getSimAccessString());
}
LLTextBox* region_landtype = getChild<LLTextBox>("region_landtype_text");
if (region_landtype)
{
region_landtype->setText(region->getSimProductName());
}
// let the parent class handle the general data collection.
bool rv = LLPanelRegionInfo::refreshFromRegion(region);
LLMessageSystem *msg = gMessageSystem;

View File

@ -508,7 +508,8 @@ void LLSnapshotLivePreview::draw()
gGL.end();
}
if (mShineAnimTimer.getElapsedTimeF32() > SHINE_TIME)
// if we're at the end of the animation, stop
if (shine_interp >= 1.f)
{
mShineAnimTimer.stop();
}

View File

@ -88,8 +88,8 @@ void LLFloaterURLDisplay::setSnapshotDisplay(const LLUUID& snapshot_id)
}
void LLFloaterURLDisplay::setName(const std::string& name)
{
mPlacePanel->setName(name);
{ // Set the name and also clear description
mPlacePanel->resetName(name);
}
void LLFloaterURLDisplay::setLocationString(const std::string& name)

View File

@ -1092,6 +1092,10 @@ LLFloaterIMPanel::LLFloaterIMPanel(
mNumUnreadMessages(0),
mShowSpeakersOnConnect(TRUE),
mAutoConnect(FALSE),
mTextIMPossible(TRUE),
mProfileButtonEnabled(TRUE),
mCallBackEnabled(TRUE),
mSpeakers(NULL),
mSpeakerPanel(NULL),
mFirstKeystrokeTimer(),
mLastKeystrokeTimer()

View File

@ -47,7 +47,6 @@
#include "llviewercontrol.h"
#include "llfirstuse.h"
#include "llfloaterchat.h"
#include "llfloaterclothing.h"
#include "llfloaterdirectory.h"
#include "llfloatermap.h"
#include "llfloaterworldmap.h"
@ -122,12 +121,6 @@ void handle_inventory(void*)
}
void handle_clothing(void*)
{
LLFloaterClothing::toggleVisibility();
}
void handle_chat(void*)
{
// give focus to chatbar if it's open but not focused

View File

@ -43,7 +43,6 @@ void handle_mini_map(void*);
void handle_find(void*);
void handle_events(void*);
void handle_inventory(void*);
void handle_clothing(void*);
void handle_chat(void*);
void handle_return_key(void*);
void handle_slash_key(void*);

View File

@ -72,8 +72,9 @@
#include "llappviewer.h" // abortQuit()
const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$
const S32 MATURE_UNDEFINED = -1;
const S32 MATURE_CONTENT = 1;
const S32 NON_MATURE_CONTENT = 2;
const S32 PG_CONTENT = 2;
const S32 DECLINE_TO_STATE = 0;
//static
@ -290,7 +291,7 @@ BOOL LLPanelClassified::postBuild()
{
// Teens don't get to set mature flag. JC
mMatureCombo->setVisible(FALSE);
mMatureCombo->setCurrentByIndex(NON_MATURE_CONTENT);
mMatureCombo->setCurrentByIndex(PG_CONTENT);
}
if (!mInFinder)
@ -408,6 +409,9 @@ void LLPanelClassified::initNewClassified()
}
mUpdateBtn->setLabel(getString("publish_txt"));
// simulate clicking the "location" button
LLPanelClassified::onClickSet(this);
}
@ -663,7 +667,7 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void **
}
else
{
self->mMatureCombo->setCurrentByIndex(NON_MATURE_CONTENT);
self->mMatureCombo->setCurrentByIndex(PG_CONTENT);
}
if (self->mAutoRenewCheck)
{
@ -751,8 +755,22 @@ void LLPanelClassified::refresh()
//mPriceEditor->setEnabled(is_self);
mCategoryCombo->setEnabled(is_self);
mMatureCombo->setEnabled(is_self);
if( is_self )
{
if( mMatureCombo->getCurrentIndex() == 0 )
{
// It's a new panel.
// PG regions must have PG classifieds. AO must have mature.
// Only Mature can be PG or Mature.
constrainAccessCombo();
}
}
else
{
mMatureCombo->setEnabled( FALSE );
}
if (mAutoRenewCheck)
{
mAutoRenewCheck->setEnabled(is_self);
@ -813,7 +831,7 @@ bool LLPanelClassified::confirmMature(const LLSD& notification, const LLSD& resp
mMatureCombo->setCurrentByIndex(MATURE_CONTENT);
break;
case 1:
mMatureCombo->setCurrentByIndex(NON_MATURE_CONTENT);
mMatureCombo->setCurrentByIndex(PG_CONTENT);
break;
default:
return false;
@ -970,7 +988,13 @@ void LLPanelClassified::onClickSet(void* data)
self->mPosGlobal = gAgent.getPositionGlobal();
std::string location_text;
location_text.assign("(will update after publish)");
std::string regionName = "(will update after publish)";
LLViewerRegion* pRegion = gAgent.getRegion();
if (pRegion)
{
regionName = pRegion->getName();
}
location_text.assign(regionName);
location_text.append(", ");
S32 region_x = llround((F32)self->mPosGlobal.mdV[VX]) % REGION_WIDTH_UNITS;
@ -982,6 +1006,8 @@ void LLPanelClassified::onClickSet(void* data)
self->mLocationEditor->setText(location_text);
self->mLocationChanged = true;
self->constrainAccessCombo();
// Set this to null so it updates on the next save.
self->mParcelID.setNull();
@ -1110,3 +1136,36 @@ void LLFloaterPriceForListing::buttonCore(S32 button, void* data)
self->close();
}
}
void LLPanelClassified::constrainAccessCombo()
{
// Location changed.
// PG regions must have PG classifieds. AO must have mature.
// Only Mature can be PG or Mature.
bool pref_visible = TRUE;
S32 force_access = MATURE_UNDEFINED;
LLViewerRegion *regionp = gAgent.getRegion();
switch( regionp->getSimAccess() )
{
case SIM_ACCESS_PG:
force_access = PG_CONTENT;
break;
case SIM_ACCESS_ADULT:
force_access = MATURE_CONTENT;
break;
default:
// You are free to move about the cabin.
break;
}
if ( force_access != MATURE_UNDEFINED )
{
pref_visible = FALSE;
mMatureCombo->setCurrentByIndex(force_access);
}
mMatureCombo->setEnabled(pref_visible);
}

View File

@ -120,6 +120,8 @@ protected:
static void focusReceived(LLFocusableElement* ctrl, void* data);
static void onCommitAny(LLUICtrl* ctrl, void* data);
void constrainAccessCombo(); // Force AO and PG regions to proper classified access
BOOL checkDirty(); // Update and return mDirty
protected:

View File

@ -43,9 +43,11 @@
#include "llagent.h"
#include "lliconctrl.h"
#include "lllineeditor.h"
#include "llproductinforequest.h"
#include "llscrolllistctrl.h"
#include "lltextbox.h"
#include "lltabcontainer.h"
#include "lltrans.h"
#include "lltransactiontypes.h"
#include "lluictrlfactory.h"
@ -232,10 +234,7 @@ void LLPanelGroupLandMoney::impl::onMapButton()
if (!itemp) return;
const LLScrollListCell* cellp;
// name
// location
// area
cellp = itemp->getColumn(3); // hidden
cellp = itemp->getColumn(itemp->getNumColumns() - 1); // hidden column is last
F32 global_x = 0.f;
F32 global_y = 0.f;
@ -414,6 +413,9 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
F32 global_x;
F32 global_y;
std::string sim_name;
std::string land_sku;
std::string land_type;
for(S32 i = first_block; i < count; ++i)
{
msg->getUUID("QueryData", "OwnerID", owner_id, i);
@ -426,6 +428,18 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
msg->getF32("QueryData", "GlobalY", global_y, i);
msg->getString("QueryData", "SimName", sim_name, i);
if ( msg->getSizeFast(_PREHASH_QueryData, i, _PREHASH_ProductSKU) > 0 )
{
msg->getStringFast( _PREHASH_QueryData, _PREHASH_ProductSKU, land_sku, i);
llinfos << "Land sku: " << land_sku << llendl;
land_type = LLProductInfoRequestManager::instance().getDescriptionForSku(land_sku);
}
else
{
land_sku.clear();
land_type = LLTrans::getString("land_type_unknown");
}
S32 region_x = llround(global_x) % REGION_WIDTH_UNITS;
S32 region_y = llround(global_y) % REGION_WIDTH_UNITS;
std::string location = sim_name + llformat(" (%d, %d)", region_x, region_y);
@ -438,6 +452,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
{
area = llformat("%d / %d", billable_area, actual_area);
}
std::string hidden;
hidden = llformat("%f %f", global_x, global_y);
@ -455,8 +470,13 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
row["columns"][2]["value"] = area;
row["columns"][2]["font"] = "SANSSERIFSMALL";
row["columns"][3]["column"] = "hidden";
row["columns"][3]["value"] = hidden;
row["columns"][3]["column"] = "type";
row["columns"][3]["value"] = land_type;
row["columns"][3]["font"] = "SANSSERIFSMALL";
// hidden is always last column
row["columns"][4]["column"] = "hidden";
row["columns"][4]["value"] = hidden;
mGroupParcelsp->addElement(row, ADD_SORTED);
}
@ -706,7 +726,7 @@ BOOL LLPanelGroupLandMoney::postBuild()
textp = getChild<LLTextEditor>("group_money_planning_text", true);
panelp = getChild<LLPanel>("group_money_planning_tab", true);
if ( 1 ) //!can_view
if ( !can_view )
{
textp->setText(mImplementationp->mCantViewAccountsText);
}
@ -1412,11 +1432,18 @@ void LLGroupMoneyPlanningTabEventHandler::processReply(LLMessageSystem* msg,
text.append(1, '\n');
}
text.append( " Group Individual Share\n");
text.append(llformat( "%-24s %6d %6d \n", "Credits", total_credits, (S32)floor((F32)total_credits/(F32)non_exempt_members)));
text.append(llformat( "%-24s %6d %6d \n", "Debits", total_debits, (S32)floor((F32)total_debits/(F32)non_exempt_members)));
text.append(llformat( "%-24s %6d %6d \n", "Total", total_credits + total_debits, (S32)floor((F32)(total_credits + total_debits)/(F32)non_exempt_members)));
// [DEV-29503] Hide the individual info since
// non_exempt_member here is a wrong choice to calculate individual shares.
// text.append( " Group Individual Share\n");
// text.append(llformat( "%-24s %6d %6d \n", "Credits", total_credits, (S32)floor((F32)total_credits/(F32)non_exempt_members)));
// text.append(llformat( "%-24s %6d %6d \n", "Debits", total_debits, (S32)floor((F32)total_debits/(F32)non_exempt_members)));
// text.append(llformat( "%-24s %6d %6d \n", "Total", total_credits + total_debits, (S32)floor((F32)(total_credits + total_debits)/(F32)non_exempt_members)));
text.append( " Group\n");
text.append(llformat( "%-24s %6d\n", "Credits", total_credits));
text.append(llformat( "%-24s %6d\n", "Debits", total_debits));
text.append(llformat( "%-24s %6d\n", "Total", total_credits + total_debits));
if ( mImplementationp->mTextEditorp )
{
mImplementationp->mTextEditorp->setText(text);

View File

@ -2397,7 +2397,7 @@ void LLPanelGroupRolesSubTab::handleDeleteRole()
{
LLSD args;
args["MESSAGE"] = mRemoveEveryoneTxt;
LLNotifications::instance().add("GenericNotify", args);
LLNotifications::instance().add("GenericAlert", args);
return;
}

View File

@ -38,6 +38,7 @@
// viewer includes
#include "llmimetypes.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "lluictrlfactory.h"
// library includes
@ -54,20 +55,32 @@
#include "lltexturectrl.h"
#include "roles_constants.h"
// Values for the parcel voice settings radio group
enum
{
kRadioVoiceChatEstate = 0,
kRadioVoiceChatPrivate = 1,
kRadioVoiceChatDisable = 2
};
//---------------------------------------------------------------------------
// LLPanelLandMedia
//---------------------------------------------------------------------------
LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
: LLPanel(std::string("land_media_panel")), mParcel(parcel)
: LLPanel(std::string("land_media_panel")),
mParcel(parcel),
mCheckSoundLocal(NULL),
mSoundHelpButton(NULL),
mCheckEnableVoiceChat(NULL),
mCheckEnableVoiceChatIsEstateDisabled(NULL),
mCheckEnableVoiceChatParcel(NULL),
mMusicURLEdit(NULL),
mMediaURLEdit(NULL),
mMediaDescEdit(NULL),
mMediaTypeCombo(NULL),
mSetURLButton(NULL),
mMediaHeightCtrl(NULL),
mMediaWidthCtrl(NULL),
mMediaSizeCtrlLabel(NULL),
mMediaTextureCtrl(NULL),
mMediaAutoScaleCheck(NULL),
mMediaLoopCheck(NULL),
mMediaUrlCheck(NULL),
mMusicUrlCheck(NULL)
{
}
@ -79,13 +92,27 @@ LLPanelLandMedia::~LLPanelLandMedia()
}
// static
void LLPanelLandMedia::onClickSoundHelp(void*)
{
LLNotifications::instance().add("ClickSoundHelpLand");
}
BOOL LLPanelLandMedia::postBuild()
{
mCheckSoundLocal = getChild<LLCheckBoxCtrl>("check sound local");
childSetCommitCallback("check sound local", onCommitAny, this);
mRadioVoiceChat = getChild<LLRadioGroup>("parcel_voice_channel");
childSetCommitCallback("parcel_voice_channel", onCommitAny, this);
mSoundHelpButton = getChild<LLButton>("?");
mSoundHelpButton->setClickedCallback(onClickSoundHelp, this);
mCheckEnableVoiceChat = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel");
childSetCommitCallback("parcel_enable_voice_channel", onCommitAny, this);
mCheckEnableVoiceChatIsEstateDisabled = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel_is_estate_disabled");
childSetCommitCallback("parcel_enable_voice_channel_is_estate_disabled", onCommitAny, this);
mCheckEnableVoiceChatParcel = getChild<LLCheckBoxCtrl>("parcel_enable_voice_channel_parcel");
childSetCommitCallback("parcel_enable_voice_channel_parcel", onCommitAny, this);
mMusicURLEdit = getChild<LLLineEditor>("music_url");
childSetCommitCallback("music_url", onCommitAny, this);
@ -151,19 +178,36 @@ void LLPanelLandMedia::refresh()
mCheckSoundLocal->set( parcel->getSoundLocal() );
mCheckSoundLocal->setEnabled( can_change_media );
if(parcel->getParcelFlagAllowVoice())
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
if (!region)
{
if(parcel->getParcelFlagUseEstateVoiceChannel())
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatEstate);
else
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatPrivate);
}
else
{
mRadioVoiceChat->setSelectedIndex(kRadioVoiceChatDisable);
// never seen this happen, but log it
llwarns << "Couldn't get selected region." << llendl;
}
mRadioVoiceChat->setEnabled( can_change_media );
if (region && region->isVoiceEnabled()) // estate-wide voice-disable overrides all
{
bool allow_voice = parcel->getParcelFlagAllowVoice();
mCheckEnableVoiceChatIsEstateDisabled->setVisible(false);
mCheckEnableVoiceChat->setVisible(true);
mCheckEnableVoiceChat->setEnabled( can_change_media );
mCheckEnableVoiceChat->set(allow_voice);
mCheckEnableVoiceChatParcel->setEnabled( can_change_media && allow_voice );
}
else // disabled at region level
{
mCheckEnableVoiceChatIsEstateDisabled->setVisible(true); // always disabled
mCheckEnableVoiceChat->setVisible(false);
mCheckEnableVoiceChat->setEnabled(false);
mCheckEnableVoiceChat->set(false);
mCheckEnableVoiceChatParcel->setEnabled(false);
}
mCheckEnableVoiceChatParcel->set(!parcel->getParcelFlagUseEstateVoiceChannel());
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
@ -339,7 +383,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
// Extract data from UI
BOOL sound_local = self->mCheckSoundLocal->get();
int voice_setting = self->mRadioVoiceChat->getSelectedIndex();
std::string music_url = self->mMusicURLEdit->getText();
std::string media_url = self->mMediaURLEdit->getText();
std::string media_desc = self->mMediaDescEdit->getText();
@ -352,28 +395,11 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
S32 media_height = (S32)self->mMediaHeightCtrl->get();
LLUUID media_id = self->mMediaTextureCtrl->getImageAssetID();
BOOL voice_enabled = self->mCheckEnableVoiceChat->get();
BOOL voice_estate_chan = ! self->mCheckEnableVoiceChatParcel->get();
self->childSetText("mime_type", mime_type);
BOOL voice_enabled;
BOOL voice_estate_chan;
switch(voice_setting)
{
default:
case kRadioVoiceChatEstate:
voice_enabled = TRUE;
voice_estate_chan = TRUE;
break;
case kRadioVoiceChatPrivate:
voice_enabled = TRUE;
voice_estate_chan = FALSE;
break;
case kRadioVoiceChatDisable:
voice_enabled = FALSE;
voice_estate_chan = FALSE;
break;
}
// Remove leading/trailing whitespace (common when copying/pasting)
LLStringUtil::trim(music_url);
LLStringUtil::trim(media_url);

View File

@ -56,10 +56,14 @@ private:
static void onCommitAny(LLUICtrl* ctrl, void *userdata);
static void onCommitType(LLUICtrl* ctrl, void *userdata);
static void onSetBtn(void* userdata);
static void onClickSoundHelp(void*);
private:
LLCheckBoxCtrl* mCheckSoundLocal;
LLRadioGroup* mRadioVoiceChat;
LLButton* mSoundHelpButton;
LLCheckBoxCtrl* mCheckEnableVoiceChat;
LLCheckBoxCtrl* mCheckEnableVoiceChatIsEstateDisabled;
LLCheckBoxCtrl* mCheckEnableVoiceChatParcel;
LLLineEditor* mMusicURLEdit;
LLLineEditor* mMediaURLEdit;
LLLineEditor* mMediaDescEdit;

View File

@ -97,8 +97,9 @@ BOOL LLPanelPlace::postBuild()
mDescEditor = getChild<LLTextEditor>("desc_editor");
mInfoEditor = getChild<LLTextBox>("info_editor");
mLandTypeEditor = getChild<LLTextBox>("land_type_display");
mLocationEditor = getChild<LLTextBox>("location_editor");
mLocationDisplay = getChild<LLTextBox>("location_editor");
mTeleportBtn = getChild<LLButton>( "teleport_btn");
mTeleportBtn->setClickedCallback(onClickTeleport);
@ -148,7 +149,32 @@ void LLPanelPlace::resetLocation()
mNameEditor->setText( LLStringUtil::null );
mDescEditor->setText( LLStringUtil::null );
mInfoEditor->setText( LLStringUtil::null );
mLocationEditor->setText( LLStringUtil::null );
mLandTypeEditor->setText( LLStringUtil::null );
mLocationDisplay->setText( LLStringUtil::null );
}
// Set the name and clear other bits of info. Used for SLURL clicks
void LLPanelPlace::resetName(const std::string& name)
{
setName(name);
if(mDescEditor)
{
mDescEditor->setText( LLStringUtil::null );
}
if(mNameEditor)
{
llinfos << "Clearing place name" << llendl;
mNameEditor->setText( LLStringUtil::null );
}
if(mInfoEditor)
{
mInfoEditor->setText( LLStringUtil::null );
}
if(mLandTypeEditor)
{
mLandTypeEditor->setText( LLStringUtil::null );
}
}
void LLPanelPlace::setParcelID(const LLUUID& parcel_id)
@ -165,7 +191,12 @@ void LLPanelPlace::setSnapshot(const LLUUID& snapshot_id)
void LLPanelPlace::setLocationString(const std::string& location)
{
mLocationEditor->setText(location);
mLocationDisplay->setText(location);
}
void LLPanelPlace::setLandTypeString(const std::string& land_type)
{
mLandTypeEditor->setText(land_type);
}
void LLPanelPlace::sendParcelInfoRequest()
@ -326,9 +357,9 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)
std::string location = llformat("%s %d, %d, %d (%s)",
sim_name.c_str(), region_x, region_y, region_z, rating.c_str());
if (self->mLocationEditor)
if (self->mLocationDisplay)
{
self->mLocationEditor->setText(location);
self->mLocationDisplay->setText(location);
}
BOOL show_auction = (auction_id > 0);

View File

@ -66,7 +66,9 @@ public:
void setRegionID(const LLUUID& region_id) { mRegionID = region_id; }
void setSnapshot(const LLUUID& snapshot_id);
void setLocationString(const std::string& location);
void setLandTypeString(const std::string& land_type);
void setErrorStatus(U32 status, const std::string& reason);
void resetName(const std::string& name);
void sendParcelInfoRequest();
void displayParcelInfo(const LLVector3& pos_region,
@ -104,7 +106,8 @@ protected:
LLTextBox* mNameEditor;
LLTextEditor* mDescEditor;
LLTextBox* mInfoEditor;
LLTextBox* mLocationEditor;
LLTextBox* mLandTypeEditor;
LLTextBox* mLocationDisplay; //not calling it "editor" because it isn't
LLButton* mTeleportBtn;
LLButton* mMapBtn;

View File

@ -0,0 +1,92 @@
/**
* @file llproductinforequest.cpp
* @author Kent Quirk
* @brief Get region type descriptions (translation from SKU to description)
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#include "llviewerprecompiledheaders.h"
#include "llproductinforequest.h"
#include "llagent.h" // for gAgent
#include "lltrans.h"
#include "llviewerregion.h"
class LLProductInfoRequestResponder : public LLHTTPClient::Responder
{
public:
//If we get back a normal response, handle it here
virtual void result(const LLSD& content)
{
LLProductInfoRequestManager::instance().setSkuDescriptions(content);
}
//If we get back an error (not found, etc...), handle it here
virtual void error(U32 status, const std::string& reason)
{
llwarns << "LLProductInfoRequest::error("
<< status << ": " << reason << ")" << llendl;
}
};
LLProductInfoRequestManager::LLProductInfoRequestManager() : mSkuDescriptions()
{
}
void LLProductInfoRequestManager::initSingleton()
{
std::string url = gAgent.getRegion()->getCapability("ProductInfoRequest");
if (!url.empty())
{
LLHTTPClient::get(url, new LLProductInfoRequestResponder());
}
}
void LLProductInfoRequestManager::setSkuDescriptions(const LLSD& content)
{
mSkuDescriptions = content;
}
std::string LLProductInfoRequestManager::getDescriptionForSku(const std::string& sku)
{
// The description LLSD is an array of maps; each array entry
// has a map with 3 fields -- description, name, and sku
for (LLSD::array_const_iterator it = mSkuDescriptions.beginArray();
it != mSkuDescriptions.endArray();
++it)
{
// llwarns << (*it)["sku"].asString() << " = " << (*it)["description"].asString() << llendl;
if ((*it)["sku"].asString() == sku)
{
return (*it)["description"].asString();
}
}
return LLTrans::getString("land_type_unknown");
}

View File

@ -0,0 +1,60 @@
/**
* @file llproductinforequest.h
* @author Kent Quirk
* @brief Get region type descriptions (translation from SKU to description)
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
*
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
#ifndef LL_LLPRODUCTINFOREQUEST_H
#define LL_LLPRODUCTINFOREQUEST_H
#include "llhttpclient.h"
#include "llmemory.h"
/*
This is a singleton to manage a cache of information about land types.
The land system provides a capability to get information about the
set of possible land sku, name, and description information.
We use description in the UI, but the sku is provided in the various
messages; this tool provides translation between the systems.
*/
class LLProductInfoRequestManager : public LLSingleton<LLProductInfoRequestManager>
{
public:
LLProductInfoRequestManager();
void setSkuDescriptions(const LLSD& content);
std::string getDescriptionForSku(const std::string& sku);
private:
friend class LLSingleton<LLProductInfoRequestManager>;
/* virtual */ void initSingleton();
LLSD mSkuDescriptions;
};
#endif // LL_LLPRODUCTINFOREQUEST_H

View File

@ -207,7 +207,9 @@ void LLProgressView::setPercent(const F32 percent)
void LLProgressView::setMessage(const std::string& msg)
{
mMessage = msg;
mURLInMessage = mMessage.find( "http://" ) != std::string::npos;
mURLInMessage = (mMessage.find( "https://" ) != std::string::npos ||
mMessage.find( "http://" ) != std::string::npos ||
mMessage.find( "ftp://" ) != std::string::npos);
getChild<LLTextBox>("message_text")->setWrappedText(LLStringExplicit(mMessage));
getChild<LLTextBox>("message_text")->setHoverActive(mURLInMessage);
@ -244,7 +246,13 @@ void LLProgressView::onClickMessage(void* data)
{
std::string url_to_open( "" );
size_t start_pos = viewp->mMessage.find( "http://" );
size_t start_pos;
start_pos = viewp->mMessage.find( "https://" );
if (start_pos == std::string::npos)
start_pos = viewp->mMessage.find( "http://" );
if (start_pos == std::string::npos)
start_pos = viewp->mMessage.find( "ftp://" );
if ( start_pos != std::string::npos )
{
size_t end_pos = viewp->mMessage.find_first_of( " \n\r\t", start_pos );

View File

@ -2234,6 +2234,22 @@ void renderVisibility(LLSpatialGroup* group, LLCamera* camera)
}
}
void renderCrossHairs(LLVector3 position, F32 size, LLColor4 color)
{
gGL.color4fv(color.mV);
gGL.begin(LLRender::LINES);
{
gGL.vertex3fv((position - LLVector3(size, 0.f, 0.f)).mV);
gGL.vertex3fv((position + LLVector3(size, 0.f, 0.f)).mV);
gGL.vertex3fv((position - LLVector3(0.f, size, 0.f)).mV);
gGL.vertex3fv((position + LLVector3(0.f, size, 0.f)).mV);
gGL.vertex3fv((position - LLVector3(0.f, 0.f, size)).mV);
gGL.vertex3fv((position + LLVector3(0.f, 0.f, size)).mV);
}
gGL.end();
}
void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE)
{
if (set_color)
@ -2405,7 +2421,7 @@ void renderTextureAnim(LLDrawInfo* params)
}
LLGLEnable blend(GL_BLEND);
gGL.color4f(1,1,0,0.5f);
glColor4f(1,1,0,0.5f);
pushVerts(params, LLVertexBuffer::MAP_VERTEX);
}
@ -2507,6 +2523,25 @@ void renderRaycast(LLDrawable* drawablep)
}
}
void renderAvatarCollisionVolumes(LLVOAvatar* avatar)
{
avatar->renderCollisionVolumes();
}
void renderAgentTarget(LLVOAvatar* avatar)
{
// render these for self only (why, i don't know)
if (avatar->isSelf())
{
renderCrossHairs(avatar->getPositionAgent(), 0.2f, LLColor4(1, 0, 0, 0.8f));
renderCrossHairs(avatar->mDrawable->getPositionAgent(), 0.2f, LLColor4(1, 0, 0, 0.8f));
renderCrossHairs(avatar->mRoot.getWorldPosition(), 0.2f, LLColor4(1, 1, 1, 0.8f));
renderCrossHairs(avatar->mPelvisp->getWorldPosition(), 0.2f, LLColor4(0, 0, 1, 0.8f));
}
}
class LLOctreeRenderNonOccluded : public LLOctreeTraveler<LLDrawable>
{
public:
@ -2591,6 +2626,19 @@ public:
{
renderRaycast(drawable);
}
LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(drawable->getVObj().get());
if (avatar && gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AVATAR_VOLUME))
{
renderAvatarCollisionVolumes(avatar);
}
if (avatar && gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_AGENT_TARGET))
{
renderAgentTarget(avatar);
}
}
for (LLSpatialGroup::draw_map_t::iterator i = group->mDrawMap.begin(); i != group->mDrawMap.end(); ++i)
@ -2667,7 +2715,9 @@ void LLSpatialPartition::renderDebug()
LLPipeline::RENDER_DEBUG_POINTS |
LLPipeline::RENDER_DEBUG_TEXTURE_PRIORITY |
LLPipeline::RENDER_DEBUG_TEXTURE_ANIM |
LLPipeline::RENDER_DEBUG_RAYCAST))
LLPipeline::RENDER_DEBUG_RAYCAST |
LLPipeline::RENDER_DEBUG_AVATAR_VOLUME |
LLPipeline::RENDER_DEBUG_AGENT_TARGET))
{
return;
}

View File

@ -130,6 +130,7 @@
#include "llpanelgroupnotices.h"
#include "llpreview.h"
#include "llpreviewscript.h"
#include "llproductinforequest.h"
#include "llsecondlifeurls.h"
#include "llselectmgr.h"
#include "llsky.h"
@ -2511,6 +2512,11 @@ bool idle_startup()
// If we've got a startup URL, dispatch it
LLStartUp::dispatchURL();
// Retrieve information about the land data
// (just accessing this the first time will fetch it,
// then the data is cached for the viewer's lifetime)
LLProductInfoRequestManager::instance();
// Clean up the userauth stuff.
LLUserAuth::getInstance()->reset();

View File

@ -1336,6 +1336,12 @@ BOOL LLTexLayer::render( S32 x, S32 y, S32 width, S32 height )
LLColor4 net_color;
color_specified = findNetColor( &net_color );
if (mTexLayerSet->getAvatar()->mIsDummy)
{
color_specified = true;
net_color = LLVOAvatar::getDummyColor();
}
// If you can't see the layer, don't render it.
if( is_approx_zero( net_color.mV[VW] ) )
{

View File

@ -128,9 +128,6 @@ BOOL LLToolBar::postBuild()
childSetAction("appearance_btn", onClickAppearance, this);
childSetControlName("appearance_btn", "");
childSetAction("clothing_btn", onClickClothing, this);
childSetControlName("clothing_btn", "ClothingBtnState");
childSetAction("fly_btn", onClickFly, this);
childSetControlName("fly_btn", "FlyBtnState");
@ -287,8 +284,6 @@ void LLToolBar::refresh()
BOOL mouselook = gAgent.cameraMouselook();
setVisible(show && !mouselook);
// Clothing button updated inside LLFloaterClothing
BOOL sitting = FALSE;
if (gAgent.getAvatarObject())
{
@ -455,13 +450,6 @@ void LLToolBar::onClickAppearance(void*)
}
// static
void LLToolBar::onClickClothing(void*)
{
handle_clothing(NULL);
}
// static
void LLToolBar::onClickFly(void*)
{

View File

@ -74,7 +74,6 @@ public:
static void onClickCommunicate(LLUICtrl*, void*);
static void onClickChat(void* data);
static void onClickAppearance(void* data);
static void onClickClothing(void* data);
static void onClickFly(void*);
static void onClickSit(void*);
static void onClickSnapshot(void* data);

View File

@ -242,7 +242,7 @@ void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
//--------------------------------------------------------------------
// render()
//--------------------------------------------------------------------
U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )
U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy )
{
stop_glerror();
@ -259,13 +259,13 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )
// if object is transparent, defer it, otherwise
// give the joint subclass a chance to draw itself
//----------------------------------------------------------------
if ( gRenderForSelect )
if ( gRenderForSelect || is_dummy )
{
triangle_count += drawShape( pixelArea, first_pass );
triangle_count += drawShape( pixelArea, first_pass, is_dummy );
}
else if (LLPipeline::sShadowRender)
{
triangle_count += drawShape(pixelArea, first_pass);
triangle_count += drawShape(pixelArea, first_pass, is_dummy );
}
else if ( isTransparent() && !LLPipeline::sReflectionRender)
{
@ -277,18 +277,18 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )
// first pass renders without writing to the z buffer
{
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
triangle_count += drawShape( pixelArea, first_pass);
triangle_count += drawShape( pixelArea, first_pass, is_dummy );
}
// second pass writes to z buffer only
gGL.setColorMask(false, false);
{
triangle_count += drawShape( pixelArea, FALSE );
triangle_count += drawShape( pixelArea, FALSE, is_dummy );
}
// third past respects z buffer and writes color
gGL.setColorMask(true, false);
{
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
triangle_count += drawShape( pixelArea, FALSE );
triangle_count += drawShape( pixelArea, FALSE, is_dummy );
}
}
else
@ -297,12 +297,12 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )
glCullFace(GL_FRONT);
{
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
triangle_count += drawShape( pixelArea, first_pass );
triangle_count += drawShape( pixelArea, first_pass, is_dummy );
}
// Render Outside (write to the Z buffer)
glCullFace(GL_BACK);
{
triangle_count += drawShape( pixelArea, FALSE );
triangle_count += drawShape( pixelArea, FALSE, is_dummy );
}
}
}
@ -323,7 +323,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )
F32 jointLOD = joint->getLOD();
if (pixelArea >= jointLOD || sDisableLOD)
{
triangle_count += joint->render( pixelArea );
triangle_count += joint->render( pixelArea, TRUE, is_dummy );
if (jointLOD != DEFAULT_LOD)
{
@ -404,7 +404,7 @@ BOOL LLViewerJoint::isTransparent()
//--------------------------------------------------------------------
// drawShape()
//--------------------------------------------------------------------
U32 LLViewerJoint::drawShape( F32 pixelArea, BOOL first_pass )
U32 LLViewerJoint::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy )
{
return 0;
}

View File

@ -73,7 +73,7 @@ public:
// Traverses the entire joint hierarchy, setting up
// transforms and calling the drawShape().
// Derived classes may add text/graphic output.
virtual U32 render( F32 pixelArea, BOOL first_pass = TRUE ); // Returns triangle count
virtual U32 render( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE ); // Returns triangle count
// Returns true if this object is transparent.
// This is used to determine in which order to draw objects.
@ -84,7 +84,7 @@ public:
// Draws the shape attached to a joint.
// Called by render().
virtual U32 drawShape( F32 pixelArea, BOOL first_pass = TRUE );
virtual U32 drawShape( F32 pixelArea, BOOL first_pass = TRUE, BOOL is_dummy = FALSE );
virtual void drawNormals() {}
enum Components

View File

@ -85,7 +85,7 @@ BOOL LLViewerJointAttachment::isTransparent()
//-----------------------------------------------------------------------------
// drawShape()
//-----------------------------------------------------------------------------
U32 LLViewerJointAttachment::drawShape( F32 pixelArea, BOOL first_pass )
U32 LLViewerJointAttachment::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy )
{
if (LLVOAvatar::sShowAttachmentPoints)
{

View File

@ -61,7 +61,7 @@ public:
// Draws the shape attached to a joint.
// Called by render().
/*virtual*/ U32 drawShape( F32 pixelArea, BOOL first_pass );
/*virtual*/ U32 drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy );
/*virtual*/ BOOL updateLOD(F32 pixel_area, BOOL activate);

View File

@ -505,7 +505,7 @@ int compare_int(const void *a, const void *b)
//--------------------------------------------------------------------
// LLViewerJointMesh::drawShape()
//--------------------------------------------------------------------
U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
{
if (!mValid || !mMesh || !mFace || !mVisible ||
mFace->mVertexBuffer.isNull() ||
@ -523,7 +523,10 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
//----------------------------------------------------------------
if (!gRenderForSelect)
{
glColor4fv(mColor.mV);
if (is_dummy)
glColor4fv(LLVOAvatar::getDummyColor().mV);
else
glColor4fv(mColor.mV);
}
stop_glerror();
@ -550,7 +553,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_LERP_TEX_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
}
}
else if( mLayerSet )
else if( !is_dummy && mLayerSet )
{
if( mLayerSet->hasComposite() )
{
@ -568,7 +571,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
}
}
else
if ( mTexture.notNull() )
if ( !is_dummy && mTexture.notNull() )
{
old_mode = mTexture->getAddressMode();
gGL.getTexUnit(0)->bind(mTexture.get());
@ -628,7 +631,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
}
if (mTexture.notNull())
if (mTexture.notNull() && !is_dummy)
{
gGL.getTexUnit(0)->bind(mTexture.get());
gGL.getTexUnit(0)->setTextureAddressMode(old_mode);

View File

@ -138,7 +138,7 @@ public:
// overloaded from base class
/*virtual*/ void drawBone();
/*virtual*/ BOOL isTransparent();
/*virtual*/ U32 drawShape( F32 pixelArea, BOOL first_pass );
/*virtual*/ U32 drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy );
/*virtual*/ void updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area);
/*virtual*/ void updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind = FALSE);

View File

@ -953,13 +953,6 @@ void init_client_menu(LLMenuGL* menu)
&menu_check_control,
(void*)"SaveMinidump"));
// TomY Temporary menu item so we can test this floater
menu->append(new LLMenuItemCheckGL("Clothing...",
&handle_clothing,
NULL,
NULL,
NULL));
menu->append(new LLMenuItemCallGL("Debug Settings...", LLFloaterSettingsDebug::show, NULL, NULL));
menu->append(new LLMenuItemCheckGL("View Admin Options", &handle_admin_override_toggle, NULL, &check_admin_override, NULL, 'V', MASK_CONTROL | MASK_ALT));
@ -1369,8 +1362,14 @@ void init_debug_avatar_menu(LLMenuGL* menu)
//menu->append(new LLMenuItemToggleGL("Show Attachment Points", &LLVOAvatar::sShowAttachmentPoints));
//diabling collision plane due to DEV-14477 -brad
//menu->append(new LLMenuItemToggleGL("Show Collision Plane", &LLVOAvatar::sShowFootPlane));
menu->append(new LLMenuItemToggleGL("Show Collision Skeleton", &LLVOAvatar::sShowCollisionVolumes));
menu->append(new LLMenuItemToggleGL( "Display Agent Target", &LLAgent::sDebugDisplayTarget));
menu->append(new LLMenuItemCheckGL("Show Collision Skeleton",
&LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_AVATAR_VOLUME));
menu->append(new LLMenuItemCheckGL("Display Agent Target",
&LLPipeline::toggleRenderDebug, NULL,
&LLPipeline::toggleRenderDebugControl,
(void*)LLPipeline::RENDER_DEBUG_AGENT_TARGET));
menu->append(new LLMenuItemToggleGL( "Debug Rotation", &LLVOAvatar::sDebugAvatarRotation));
menu->append(new LLMenuItemCallGL("Dump Attachments", handle_dump_attachments));
menu->append(new LLMenuItemCallGL("Rebake Textures", handle_rebake_textures, NULL, NULL, 'R', MASK_ALT | MASK_CONTROL ));
@ -4032,18 +4031,6 @@ BOOL sitting_on_selection()
return (avatar->mIsSitting && avatar->getRoot() == root_object);
}
class LLToolsSaveToInventory : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
if(enable_save_into_inventory(NULL))
{
derez_objects(DRD_SAVE_INTO_AGENT_INVENTORY, LLUUID::null);
}
return true;
}
};
class LLToolsSaveToObjectInventory : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@ -6423,16 +6410,6 @@ BOOL enable_save_into_inventory(void*)
return FALSE;
}
class LLToolsEnableSaveToInventory : public view_listener_t
{
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{
bool new_value = enable_save_into_inventory(NULL);
gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
return true;
}
};
BOOL enable_save_into_task_inventory(void*)
{
LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
@ -7547,7 +7524,6 @@ void initialize_menus()
addMenu(new LLToolsLookAtSelection(), "Tools.LookAtSelection");
addMenu(new LLToolsBuyOrTake(), "Tools.BuyOrTake");
addMenu(new LLToolsTakeCopy(), "Tools.TakeCopy");
addMenu(new LLToolsSaveToInventory(), "Tools.SaveToInventory");
addMenu(new LLToolsSaveToObjectInventory(), "Tools.SaveToObjectInventory");
addMenu(new LLToolsSelectedScriptAction(), "Tools.SelectedScriptAction");
@ -7556,7 +7532,6 @@ void initialize_menus()
addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink");
addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake");
addMenu(new LLToolsEnableTakeCopy(), "Tools.EnableTakeCopy");
addMenu(new LLToolsEnableSaveToInventory(), "Tools.EnableSaveToInventory");
addMenu(new LLToolsEnableSaveToObjectInventory(), "Tools.EnableSaveToObjectInventory");
/*addMenu(new LLToolsVisibleBuyObject(), "Tools.VisibleBuyObject");

View File

@ -3359,6 +3359,12 @@ void process_sound_trigger(LLMessageSystem *msg, void **)
return;
}
// Don't play sounds from a region with maturity above current agent maturity
if( !gAgent.canAccessMaturityInRegion( region_handle ) )
{
return;
}
gAudiop->triggerSound(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX, pos_global);
}
@ -3392,6 +3398,13 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)
// audio data into a buffer at this point, as it won't actually
// help us out.
// Don't play sounds from a region with maturity above current agent maturity
LLVector3d pos_global = objectp->getPositionGlobal();
if( !gAgent.canAccessMaturityAtGlobal( pos_global ) )
{
return;
}
// Add audioData starts a transfer internally.
sourcep->addAudioData(datap, FALSE);
}
@ -3421,6 +3434,14 @@ void process_attached_sound(LLMessageSystem *msg, void **user_data)
if (LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagObjectSounds)) return;
// Don't play sounds from a region with maturity above current agent maturity
LLVector3d pos = objectp->getPositionGlobal();
if( !gAgent.canAccessMaturityAtGlobal(pos) )
{
return;
}
objectp->setAttachedSound(sound_id, owner_id, gain, flags);
}
@ -4839,7 +4860,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
LLSD args;
// if we have additional alert data
if (msg->getSizeFast(_PREHASH_AlertInfo, _PREHASH_Message) > 0)
if (msg->getNumberOfBlocksFast(_PREHASH_AlertInfo) > 0)
{
// Get the message ID
msg->getStringFast(_PREHASH_AlertInfo, _PREHASH_Message, reason);

View File

@ -4372,8 +4372,13 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow
{
mAudioSourcep->play(LLUUID::null);
}
//llinfos << "Playing attached sound " << audio_uuid << llendl;
mAudioSourcep->play(audio_uuid);
// Play this sound if region maturity permits
if( gAgent.canAccessMaturityAtGlobal(this->getPositionGlobal()) )
{
//llinfos << "Playing attached sound " << audio_uuid << llendl;
mAudioSourcep->play(audio_uuid);
}
}
}

View File

@ -1324,9 +1324,9 @@ void LLViewerParcelMgr::processParcelOverlay(LLMessageSystem *msg, void **user)
// Extract the packed overlay information
S32 packed_overlay_size = msg->getSizeFast(_PREHASH_ParcelData, _PREHASH_Data);
if (packed_overlay_size == 0)
if (packed_overlay_size <= 0)
{
llwarns << "Overlay size 0" << llendl;
llwarns << "Overlay size " << packed_overlay_size << llendl;
return;
}
@ -2027,6 +2027,25 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const
return true; // change this if want to make it gods only
}
LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();
if (regionp)
{
U8 sim_access = regionp->getSimAccess();
const LLAgentAccess& agent_access = gAgent.getAgentAccess();
// if the region is PG, we're happy already, so do nothing
// but if we're set to avoid either mature or adult, get us outta here
if ((sim_access == SIM_ACCESS_MATURE) &&
!agent_access.canAccessMature())
{
return false;
}
else if ((sim_access == SIM_ACCESS_ADULT) &&
!agent_access.canAccessAdult())
{
return false;
}
}
bool isForSale = parcel->getForSale()
&& ((parcel->getSalePrice() > 0) || (authorizeBuyer.notNull()));

View File

@ -1304,10 +1304,10 @@ void LLViewerRegion::unpackRegionHandshake()
std::string productName;
// the only reasonable way to decide if we actually have any data is to
// check to see if any of these fields have nonzero sizes
if (msg->getSize("RegionInfo3", "ColoName") ||
msg->getSize("RegionInfo3", "ProductSKU") ||
msg->getSize("RegionInfo3", "ProductName"))
// check to see if any of these fields have positive sizes
if (msg->getSize("RegionInfo3", "ColoName") > 0 ||
msg->getSize("RegionInfo3", "ProductSKU") > 0 ||
msg->getSize("RegionInfo3", "ProductName") > 0)
{
msg->getS32 ("RegionInfo3", "CPUClassID", classID);
msg->getS32 ("RegionInfo3", "CPURatio", cpuRatio);
@ -1416,6 +1416,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url)
capabilityNames.append("NewFileAgentInventory");
capabilityNames.append("ParcelPropertiesUpdate");
capabilityNames.append("ParcelVoiceInfoRequest");
capabilityNames.append("ProductInfoRequest");
capabilityNames.append("ProvisionVoiceAccountRequest");
capabilityNames.append("RemoteParcelRequest");
capabilityNames.append("RequestTextureDownload");

View File

@ -1219,9 +1219,8 @@ LLViewerWindow::LLViewerWindow(
mIsFullscreenChecked(false),
mCurrResolutionIndex(0)
{
// these are self registering so they don't need to be retained here
new LLNotificationChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
new LLNotificationChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal"));
LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
LLNotificationChannel::buildChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal"));
LLNotifications::instance().getChannel("VW_alerts")->connectChanged(&LLViewerWindow::onAlert);
LLNotifications::instance().getChannel("VW_alertmodal")->connectChanged(&LLViewerWindow::onAlert);

View File

@ -163,6 +163,8 @@ const S32 MAX_BUBBLE_CHAT_UTTERANCES = 12;
const F32 CHAT_FADE_TIME = 8.0;
const F32 BUBBLE_CHAT_TIME = CHAT_FADE_TIME * 3.f;
const LLColor4 DUMMY_COLOR = LLColor4(0.5,0.5,0.5,1.0);
enum ERenderName
{
RENDER_NAME_NEVER,
@ -681,7 +683,6 @@ BOOL LLVOAvatar::sDebugInvisible = FALSE;
BOOL LLVOAvatar::sShowAttachmentPoints = FALSE;
BOOL LLVOAvatar::sShowAnimationDebug = FALSE;
BOOL LLVOAvatar::sShowFootPlane = FALSE;
BOOL LLVOAvatar::sShowCollisionVolumes = FALSE;
BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE;
F32 LLVOAvatar::sLODFactor = 1.f;
BOOL LLVOAvatar::sUseImpostors = FALSE;
@ -4138,9 +4139,11 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
if (pass == AVATAR_RENDER_PASS_SINGLE)
{
bool should_alpha_mask = mHasBakedHair && isTextureDefined(TEX_HEAD_BAKED) && isTextureDefined(TEX_UPPER_BAKED)
&& isTextureDefined(TEX_LOWER_BAKED) && mBakedTextureData[BAKED_HEAD].mIsLoaded
&& mBakedTextureData[BAKED_UPPER].mIsLoaded && mBakedTextureData[BAKED_LOWER].mIsLoaded;
const bool should_alpha_mask = mHasBakedHair && isTextureDefined(TEX_HEAD_BAKED) && isTextureDefined(TEX_UPPER_BAKED)
&& isTextureDefined(TEX_LOWER_BAKED) && mBakedTextureData[BAKED_HEAD].mIsLoaded
&& mBakedTextureData[BAKED_UPPER].mIsLoaded && mBakedTextureData[BAKED_LOWER].mIsLoaded
&& !LLDrawPoolAlpha::sShowDebugAlpha; // Don't alpha mask if "Highlight Transparent" checked
LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
if (should_alpha_mask)
@ -4153,21 +4156,21 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
{
if (!mIsSelf || gAgent.needsRenderHead() || LLPipeline::sShadowRender)
{
if (isTextureVisible(TEX_HEAD_BAKED))
if (isTextureVisible(TEX_HEAD_BAKED) || mIsDummy)
{
num_indices += mMeshLOD[MESH_ID_HEAD]->render(mAdjustedPixelArea);
num_indices += mMeshLOD[MESH_ID_HEAD]->render(mAdjustedPixelArea, TRUE, mIsDummy);
first_pass = FALSE;
}
}
if (isTextureVisible(TEX_UPPER_BAKED))
if (isTextureVisible(TEX_UPPER_BAKED) || mIsDummy)
{
num_indices += mMeshLOD[MESH_ID_UPPER_BODY]->render(mAdjustedPixelArea, first_pass);
num_indices += mMeshLOD[MESH_ID_UPPER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy);
first_pass = FALSE;
}
if (isTextureVisible(TEX_LOWER_BAKED))
if (isTextureVisible(TEX_LOWER_BAKED) || mIsDummy)
{
num_indices += mMeshLOD[MESH_ID_LOWER_BODY]->render(mAdjustedPixelArea, first_pass);
num_indices += mMeshLOD[MESH_ID_LOWER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy);
first_pass = FALSE;
}
}
@ -4176,8 +4179,11 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
if (!LLDrawPoolAvatar::sSkipTransparent || LLPipeline::sImpostorRender)
{
LLGLEnable blend(GL_BLEND);
LLGLEnable test(GL_ALPHA_TEST);
if (!mIsDummy)
{
LLGLEnable blend(GL_BLEND);
LLGLEnable test(GL_ALPHA_TEST);
}
num_indices += renderTransparent(first_pass);
}
}
@ -4194,7 +4200,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
U32 LLVOAvatar::renderTransparent(BOOL first_pass)
{
U32 num_indices = 0;
if( isWearingWearableType( WT_SKIRT ) && isTextureVisible(TEX_SKIRT_BAKED) )
if( isWearingWearableType( WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) )
{
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f);
num_indices += mMeshLOD[MESH_ID_SKIRT]->render(mAdjustedPixelArea, FALSE);
@ -4211,12 +4217,14 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)
if (isTextureVisible(TEX_HEAD_BAKED))
{
num_indices += mMeshLOD[MESH_ID_EYELASH]->render(mAdjustedPixelArea, first_pass);
num_indices += mMeshLOD[MESH_ID_EYELASH]->render(mAdjustedPixelArea, first_pass, mIsDummy);
first_pass = FALSE;
}
if (isTextureVisible(TEX_HAIR_BAKED))
// Can't test for baked hair being defined, since that won't always be the case (not all viewers send baked hair)
// TODO: 1.25 will be able to switch this logic back to calling isTextureVisible();
if (getTEImage(TEX_HAIR_BAKED)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha)
{
num_indices += mMeshLOD[MESH_ID_HAIR]->render(mAdjustedPixelArea, first_pass);
num_indices += mMeshLOD[MESH_ID_HAIR]->render(mAdjustedPixelArea, first_pass, mIsDummy);
first_pass = FALSE;
}
if (LLPipeline::sImpostorRender)
@ -4250,7 +4258,7 @@ U32 LLVOAvatar::renderRigid()
return 0;
}
if (isTextureVisible(TEX_EYES_BAKED))
if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy)
{
// If the meshes need to be drawn, enable alpha masking but not blending
bool should_alpha_mask = mHasBakedHair && mBakedTextureData[BAKED_EYES].mIsLoaded;
@ -4261,8 +4269,8 @@ U32 LLVOAvatar::renderRigid()
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
}
num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea);
num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea);
num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
@ -6882,10 +6890,10 @@ void LLVOAvatar::updateMeshTextures()
{
llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl;
}
for (U32 i=0; i < mBakedTextureData.size(); i++)
{
if (use_lkg_baked_layer[i])
if (use_lkg_baked_layer[i] && !self_customizing )
{
LLViewerImage* baked_img = gImageList.getImageFromHost( mBakedTextureData[i].mLastTextureIndex, target_host );
for (U32 k=0; k < mBakedTextureData[i].mMeshes.size(); k++)
@ -7181,6 +7189,7 @@ void LLVOAvatar::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
updateMeshTextures();
dirtyMesh();
LLVOAvatar::cullAvatarsByPixelArea();
/* switch(te)
@ -7190,6 +7199,7 @@ void LLVOAvatar::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
if (text_dict->mIsBakedTexture)
{
llinfos << "New baked texture: " << text_dict->mName << " UUID: " << uuid <<llendl;
mBakedTextureData[text_dict->mBakedTextureIndex].mTexLayerSet->requestUpdate();
}
else
{
@ -7519,6 +7529,11 @@ void LLVOAvatar::setInvisible(BOOL newvalue)
}
}
LLColor4 LLVOAvatar::getDummyColor()
{
return DUMMY_COLOR;
}
// Given a texture entry, determine which wearable type owns it.
// static
EWearableType LLVOAvatar::getTEWearableType(ETextureIndex index )
@ -7598,6 +7613,40 @@ BOOL LLVOAvatar::isWearingWearableType( EWearableType type )
return FALSE;
}
//-----------------------------------------------------------------------------
// updatedWearable( EWearableType type )
// forces an update to any baked textures relevant to type.
// Should be called only on saving the wearable
//-----------------------------------------------------------------------------
void LLVOAvatar::wearableUpdated( EWearableType type )
{
for (LLVOAvatarDictionary::wearable_map_t::const_iterator wearable_iter = LLVOAvatarDictionary::getInstance()->getWearables().begin();
wearable_iter != LLVOAvatarDictionary::getInstance()->getWearables().end();
wearable_iter++)
{
const LLVOAvatarDictionary::WearableDictionaryEntry *wearable_dict = wearable_iter->second;
const LLVOAvatarDefines::EBakedTextureIndex index = wearable_iter->first;
if (wearable_dict)
{
for (LLVOAvatarDefines::wearables_vec_t::const_iterator type_iter = wearable_dict->mWearablesVec.begin();
type_iter != wearable_dict->mWearablesVec.end();
type_iter++)
{
const EWearableType comp_type = *type_iter;
if (comp_type == type)
{
if (mBakedTextureData[index].mTexLayerSet)
{
mBakedTextureData[index].mTexLayerSet->requestUpdate();
mBakedTextureData[index].mTexLayerSet->requestUpload();
}
break;
}
}
}
}
}
//-----------------------------------------------------------------------------
// clampAttachmentPositions()

View File

@ -40,6 +40,7 @@
#include <vector>
#include "llchat.h"
#include "lldrawpoolalpha.h"
#include "llviewerobject.h"
#include "llcharacter.h"
#include "llviewerjointmesh.h"
@ -325,6 +326,7 @@ public:
static LLUUID getDefaultTEImageID(LLVOAvatarDefines::ETextureIndex te );
static void onChangeSelfInvisible(BOOL newvalue);
void setInvisible(BOOL newvalue);
static LLColor4 getDummyColor();
@ -337,6 +339,7 @@ public:
BOOL teToColorParams( LLVOAvatarDefines::ETextureIndex te, const char* param_name[3] );
BOOL isWearingWearableType( EWearableType type );
void wearableUpdated( EWearableType type );
//--------------------------------------------------------------------
// texture compositing
@ -510,7 +513,6 @@ public:
static BOOL sShowAnimationDebug; // show animation debug info
static BOOL sUseImpostors; //use impostors for far away avatars
static BOOL sShowFootPlane; // show foot collision plane reported by server
static BOOL sShowCollisionVolumes; // show skeletal collision volumes
static BOOL sVisibleInFirstPerson;
static S32 sNumLODChangesThisFrame;
static S32 sNumVisibleChatBubbles;
@ -755,7 +757,9 @@ inline BOOL LLVOAvatar::isTextureDefined(U8 te) const
inline BOOL LLVOAvatar::isTextureVisible(U8 te) const
{
return (!isTextureDefined(te) || getTEImage(te)->getID() != IMG_INVISIBLE);
return ((isTextureDefined(te) || isSelf())
&& (getTEImage(te)->getID() != IMG_INVISIBLE
|| LLDrawPoolAlpha::sShowDebugAlpha));
}
#endif // LL_VO_AVATAR_H

View File

@ -2271,6 +2271,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
const LLTextureEntry* te = facep->getTextureEntry();
LLViewerImage* tex = facep->getTexture();
if (facep->isState(LLFace::TEXTURE_ANIM))
{
if (!vobj->mTexAnimMode)
{
facep->clearState(LLFace::TEXTURE_ANIM);
}
}
BOOL force_simple = (facep->mPixelArea < FORCE_SIMPLE_RENDER_AREA);
U32 type = gPipeline.getPoolTypeFromTE(te, tex);
if (type != LLDrawPool::POOL_ALPHA && force_simple)
@ -2333,6 +2341,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{ //doesn't need normal
facep->setState(LLFace::FULLBRIGHT);
fullbright_faces.push_back(facep);
}
}
@ -2349,6 +2358,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
}
else
{ //doesn't need normal
facep->setState(LLFace::FULLBRIGHT);
fullbright_faces.push_back(facep);
}
}
@ -2678,6 +2688,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
else
{
llassert(mask & LLVertexBuffer::MAP_NORMAL);
registerFace(group, facep, LLRenderPass::PASS_SIMPLE);
}
}
@ -2708,6 +2719,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
}
else
{
llassert(mask & LLVertexBuffer::MAP_NORMAL);
registerFace(group, facep, LLRenderPass::PASS_SIMPLE);
}
}
@ -2720,7 +2732,8 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
if (!is_alpha && !LLPipeline::sRenderDeferred)
{
facep->setPoolType(LLDrawPool::POOL_SIMPLE);
llassert((mask & LLVertexBuffer::MAP_NORMAL) || fullbright);
facep->setPoolType((fullbright) ? LLDrawPool::POOL_FULLBRIGHT : LLDrawPool::POOL_SIMPLE);
if (!force_simple && te->getBumpmap())
{

View File

@ -765,7 +765,9 @@ void LLWorldMapView::draw()
}
}
if (gSavedSettings.getBOOL("MapShowEvents"))
if (gSavedSettings.getBOOL("MapShowEvents") ||
gSavedSettings.getBOOL("ShowMatureEvents") ||
gSavedSettings.getBOOL("ShowAdultEvents") )
{
drawEvents();
}
@ -965,18 +967,22 @@ void LLWorldMapView::drawEvents()
bool mature_enabled = gAgent.canAccessMature();
bool adult_enabled = gAgent.canAccessAdult();
BOOL show_pg = gSavedSettings.getBOOL("MapShowEvents");
BOOL show_mature = mature_enabled && gSavedSettings.getBOOL("ShowMatureEvents");
BOOL show_adult = adult_enabled && gSavedSettings.getBOOL("ShowAdultEvents");
// First the non-selected events
LLWorldMap::item_info_list_t::const_iterator e;
for (e = LLWorldMap::getInstance()->mPGEvents.begin(); e != LLWorldMap::getInstance()->mPGEvents.end(); ++e)
{
if (!e->mSelected)
{
drawGenericItem(*e, sEventImage);
}
}
if (show_pg)
{
for (e = LLWorldMap::getInstance()->mPGEvents.begin(); e != LLWorldMap::getInstance()->mPGEvents.end(); ++e)
{
if (!e->mSelected)
{
drawGenericItem(*e, sEventImage);
}
}
}
if (show_mature)
{
for (e = LLWorldMap::getInstance()->mMatureEvents.begin(); e != LLWorldMap::getInstance()->mMatureEvents.end(); ++e)
@ -998,13 +1004,16 @@ void LLWorldMapView::drawEvents()
}
}
// Then the selected events
for (e = LLWorldMap::getInstance()->mPGEvents.begin(); e != LLWorldMap::getInstance()->mPGEvents.end(); ++e)
{
if (e->mSelected)
{
drawGenericItem(*e, sEventImage);
}
}
if (show_pg)
{
for (e = LLWorldMap::getInstance()->mPGEvents.begin(); e != LLWorldMap::getInstance()->mPGEvents.end(); ++e)
{
if (e->mSelected)
{
drawGenericItem(*e, sEventImage);
}
}
}
if (show_mature)
{
for (e = LLWorldMap::getInstance()->mMatureEvents.begin(); e != LLWorldMap::getInstance()->mMatureEvents.end(); ++e)
@ -1638,34 +1647,34 @@ void LLWorldMapView::handleClick(S32 x, S32 y, MASK mask,
return;
}
}
if (gSavedSettings.getBOOL("ShowMatureEvents"))
}
if (gSavedSettings.getBOOL("ShowMatureEvents"))
{
for (it = LLWorldMap::getInstance()->mMatureEvents.begin(); it != LLWorldMap::getInstance()->mMatureEvents.end(); ++it)
{
for (it = LLWorldMap::getInstance()->mMatureEvents.begin(); it != LLWorldMap::getInstance()->mMatureEvents.end(); ++it)
{
LLItemInfo& event = *it;
LLItemInfo& event = *it;
if (checkItemHit(x, y, event, id, false))
{
*hit_type = MAP_ITEM_MATURE_EVENT;
mItemPicked = TRUE;
gFloaterWorldMap->trackEvent(event);
return;
}
if (checkItemHit(x, y, event, id, false))
{
*hit_type = MAP_ITEM_MATURE_EVENT;
mItemPicked = TRUE;
gFloaterWorldMap->trackEvent(event);
return;
}
}
if (gSavedSettings.getBOOL("ShowAdultEvents"))
}
if (gSavedSettings.getBOOL("ShowAdultEvents"))
{
for (it = LLWorldMap::getInstance()->mAdultEvents.begin(); it != LLWorldMap::getInstance()->mAdultEvents.end(); ++it)
{
for (it = LLWorldMap::getInstance()->mAdultEvents.begin(); it != LLWorldMap::getInstance()->mAdultEvents.end(); ++it)
{
LLItemInfo& event = *it;
LLItemInfo& event = *it;
if (checkItemHit(x, y, event, id, false))
{
*hit_type = MAP_ITEM_ADULT_EVENT;
mItemPicked = TRUE;
gFloaterWorldMap->trackEvent(event);
return;
}
if (checkItemHit(x, y, event, id, false))
{
*hit_type = MAP_ITEM_ADULT_EVENT;
mItemPicked = TRUE;
gFloaterWorldMap->trackEvent(event);
return;
}
}
}

View File

@ -360,6 +360,8 @@ public:
RENDER_DEBUG_SHAME = 0x0020000,
RENDER_DEBUG_SHADOW_FRUSTA = 0x0040000,
RENDER_DEBUG_SCULPTED = 0x0080000,
RENDER_DEBUG_AVATAR_VOLUME = 0x0100000,
RENDER_DEBUG_AGENT_TARGET = 0x0200000,
};
public:

View File

@ -21,6 +21,7 @@ Tak til følgende beboerne for at bidrage til at sikre, at dette er den bedste v
SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
xmlrpc-epi Copyright (C) 2000 Epinions, Inc.
zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.
google-perftools Copyright (c) 2005, Google Inc.
Alle rettigheder forbeholdes. Se licenses.txt for detaljer.

View File

@ -1,71 +1,80 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="Om Land">
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="floaterland" title="Om land">
<tab_container name="landtab">
<panel label="Generelt" name="land_general_panel">
<text length="1" name="Name:" type="string">
<text type="string" length="1" name="Name:">
Navn:
</text>
<text length="1" name="Description:" type="string">
<text type="string" length="1" name="Description:">
Beskrivelse:
</text>
<text length="1" name="Owner:" type="string">
<text type="string" length="1" name="Owner:">
Ejer:
</text>
<text length="1" name="OwnerText" type="string">
<text type="string" length="1" name="OwnerText">
Leyla Linden
</text>
<button label="Profil..." label_selected="Profil..." name="Profile..."/>
<text length="1" name="Group:" type="string">
<button label="Profil..." label_selected="Profil..." name="Profile..." />
<text type="string" length="1" name="Group:">
Gruppe:
</text>
<button label="Vælg..." label_selected="Vælg..." name="Set..."/>
<check_box label="Tillad dedikering til gruppe" name="check deed" tool_tip="En gruppe officer kan dedikere denne jord til gruppen, så det vil blive støttet af gruppen&apos;s jord tildeling."/>
<button label="Dediker..." label_selected="Dediker..." name="Deed..." tool_tip="Du kan kun dedikere jord, hvis du er en officer i den valgte gruppe."/>
<check_box label="Ejer giver bidrag med dedikering" name="check contrib" tool_tip="When the land is deeded to the group, the former owner contributes enough land allocation to support it."/>
<text length="1" name="For Sale:" type="string">
<button label="Vælg..." label_selected="Vælg..." name="Set..." />
<check_box label="Tillad dedikering til gruppe" name="check deed"
tool_tip="En gruppe administrator kan dedikere denne jord til gruppen, så det vil blive støttet af gruppen&apos;s jord tildeling." />
<button label="Dedikér..." label_selected="Dedikér..." name="Deed..."
tool_tip="Du kan kun dedikere jord, hvis du er en administrator i den valgte gruppe." />
<check_box label="Ejer bidrager ved dedikering" name="check contrib"
tool_tip="Når land dedikeres til gruppe, kan den tidligere bidrage med nok land til at dække krav." />
<text type="string" length="1" name="For Sale:">
Til salg:
</text>
<text length="1" name="Not for sale." type="string">
<text type="string" length="1" name="Not for sale.">
Ikke til salg.
</text>
<text length="1" name="For Sale: Price L$[PRICE]." type="string">
<text type="string" length="1" name="For Sale: Price L$[PRICE].">
Pris: L$[PRICE].
</text>
<button label="Sælg Land..." label_selected="Sælg Land..." name="Sell Land..."/>
<text length="1" name="For sale to" type="string">
<button label="Sælg land..." label_selected="Sælg land..." name="Sell Land..." />
<text type="string" length="1" name="For sale to">
Til salg til: [BUYER]
</text>
<text length="1" name="Sell with landowners objects in parcel." type="string">
Objekter er inkluderet i salget.
<text type="string" length="1" name="Sell with landowners objects in parcel.">
Objekter er inkluderet i salg.
</text>
<text length="1" name="Selling with no objects in parcel." type="string">
Objekter er ikke inkluderet i salget.
<text type="string" length="1" name="Selling with no objects in parcel.">
Objekter er ikke inkluderet i salg.
</text>
<button label="Annuller Salg" label_selected="Annuller Salg" name="Cancel Land Sale"/>
<text length="1" name="Claimed:" type="string">
<button label="Annullér salg af land" label_selected="Annullér salg af land"
name="Cancel Land Sale" />
<text type="string" length="1" name="Claimed:">
Købt:
</text>
<text length="1" name="DateClaimText" type="string">
<text type="string" length="1" name="DateClaimText">
Tue Aug 15 13:47:25 2006
</text>
<text length="1" name="PriceLabel" type="string">
<text type="string" length="1" name="PriceLabel">
Område:
</text>
<text length="1" name="PriceText" type="string">
4048 m2
<text type="string" length="1" name="PriceText">
4048 m²
</text>
<text length="1" name="Traffic:" type="string">
Traffik:
<text type="string" length="1" name="Traffic:">
Trafik:
</text>
<text length="1" name="DwellText" type="string">
<text type="string" length="1" name="DwellText">
0
</text>
<button label="Køb Jord..." label_selected="Køb Jord..." name="Buy Land..."/>
<button label="Køb Jord til gruppe..." label_selected="Køb Jord til gruppe..." name="Buy For Group..."/>
<button label="Køb Adgang..." label_selected="Køb Adgang..." name="Buy Pass..." tool_tip="Dette giver dig midlertidigt adgang til dette område"/>
<button label="Forlad Jord..." label_selected="Forlad Jord..." name="Abandon Land..."/>
<button label="Genvind Jord..." label_selected="Genvind Jord..." name="Reclaim Land..."/>
<button label="Linden Salg..." label_selected="Linden Salg..." name="Linden Sale..." tool_tip="Jord skal være ejet, indstillet til indhold, og ikke være på auktion."/>
<button label="Køb land..." label_selected="Køb land..." name="Buy Land..." />
<button label="Køb til gruppe..." label_selected="Køb til gruppe..."
name="Buy For Group..." />
<button label="Køb adgang..." label_selected="Køb adgang..." name="Buy Pass..."
tool_tip="Giver adgang til midlertidig adgang til dette område." />
<button label="Efterlad land..." label_selected="Efterlad land..."
name="Abandon Land..." />
<button label="Kræv tilbage..." label_selected="Kræv tilbage..."
name="Reclaim Land..." />
<button label="Linden lalg..." label_selected="Linden lalg..." name="Linden salg..."
tool_tip="Land skal være ejet og ikke allerede på auktion" />
<string name="new users only">
Kun nye brugere
</string>
@ -73,19 +82,19 @@
Alle
</string>
<string name="area_text">
Område
Størrelse
</string>
<string name="area_size_text">
[AREA] m2
[AREA] m²
</string>
<string name="auction_id_text">
Auktions ID: [ID]
Auktion nr: [ID]
</string>
<string name="need_tier_to_modify">
Du skal godkende dit køb for at kunne ændre denne jord.
Du skal godkende dit køb for at kunne æmdre på dette land.
</string>
<string name="group_owned_text">
(Group Owned)
(Gruppe ejet)
</string>
<string name="profile_text">
Profil...
@ -100,65 +109,65 @@
(ingen)
</string>
<string name="sale_pending_text">
(Salg venter)
(Salg i gang)
</string>
<string name="no_selection_text">
Intet parcel valgt.
Gå til Verden&apos;s menuen&gt; Om Jord eller vælge et andet parcel for at vise detaljer.
Pacel ikke valgt.
Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel for at se detaljer.
</string>
</panel>
<panel label="Betingelser" name="land_covenant_panel">
<text length="1" name="covenant_timestamp_text" type="string">
Last Modified Wed Dec 31 16:00:00 1969
<panel label="Regler" name="land_covenant_panel">
<text type="string" length="1" name="covenant_timestamp_text">
Sidst rettet Wed Dec 31 16:00:00 1969
</text>
<text length="1" name="region_name_lbl" type="string">
<text type="string" length="1" name="region_name_lbl">
Region:
</text>
<text length="1" name="region_name_text" type="string">
<text type="string" length="1" name="region_name_text">
leyla
</text>
<text length="1" name="estate_name_lbl" type="string">
<text type="string" length="1" name="estate_name_lbl">
Estate:
</text>
<text length="1" name="estate_name_text" type="string">
hovedland
<text type="string" length="1" name="estate_name_text">
Hovedland
</text>
<text length="1" name="estate_owner_lbl" type="string">
Estate Ejer:
<text type="string" length="1" name="estate_owner_lbl">
Estate ejer:
</text>
<text length="1" name="estate_owner_text" type="string">
<text type="string" length="1" name="estate_owner_text">
(ingen)
</text>
<text length="1" name="resellable_clause" type="string">
<text type="string" length="1" name="resellable_clause">
Købt jord i denne region må ikke videresælges.
</text>
<text length="1" name="changeable_clause" type="string">
Købt jord i denne region må ikke samles/opdeles.
<text type="string" length="1" name="changeable_clause">
Købt jord i denne region må gerne samles eller opdeles.
</text>
<text_editor length="1" name="covenant_editor" type="string">
Der er ingen betingelser i henhold til dette Estate.
<text_editor type="string" length="1" name="covenant_editor">
Der er ikke angivet specielle regler for denne Estate
</text_editor>
<string name="can_resell">
Købt jord i denne region kan videresælges.
Købt land i denne region må sælges videre
</string>
<string name="can_not_resell">
Købt jord i denne region må ikke videresælges.
Købt land i denne region må ikke sælges videre
</string>
<string name="can_change">
Købt jord i denne region må gerne samles eller opdeles.
</string>
<string name="can_not_change">
Købt jord i denne region må ikke samles/opdeles.
Købt jord i denne region må íkke samles eller opdeles.
</string>
</panel>
<panel label="Objekter" name="land_objects_panel">
<text length="1" name="parcel_object_bonus" type="string">
Region Objekt Bonus Faktor: [BONUS]
<text type="string" length="1" name="parcel_object_bonus">
Region objekt bonus faktor: [BONUS]
</text>
<text length="1" name="Simulator primitive usage:" type="string">
<text type="string" length="1" name="Simulator primitive usage:">
Prims brugt i denne Sim:
</text>
<text length="1" name="objects_available" type="string">
<text type="string" length="1" name="objects_available">
[COUNT] ud af [MAX] ([AVAILABLE] ledige)
</text>
<string name="objects_available_text">
@ -167,107 +176,114 @@ Gå til Verden&apos;s menuen&gt; Om Jord eller vælge et andet parcel for at vis
<string name="objects_deleted_text">
[COUNT] ud af [MAX] ([DELETED] bliver slettet)
</string>
<text length="1" name="Primitives parcel supports:" type="string">
<text type="string" length="1" name="Primitives parcel supports:">
Prims til rådighed:
</text>
<text length="1" name="object_contrib_text" type="string">
<text type="string" length="1" name="object_contrib_text">
[COUNT]
</text>
<text length="1" name="Primitives on parcel:" type="string">
Prims brugt
<text type="string" length="1" name="Primitives on parcel:">
Prims brugt på parcel:
</text>
<text length="1" name="total_objects_text" type="string">
<text type="string" length="1" name="total_objects_text">
[COUNT]
</text>
<text length="1" name="Owned by parcel owner:" type="string">
<text type="string" length="1" name="Owned by parcel owner:">
Ejet af Parcel ejer:
</text>
<text length="1" name="owner_objects_text" type="string">
<text type="string" length="1" name="owner_objects_text">
[COUNT]
</text>
<button label="Vis" label_selected="Vis" name="ShowOwner"/>
<button label="Retunér..." label_selected="Retunér..." name="ReturnOwner..." tool_tip="Retunérer objekter til deres ejere."/>
<text length="1" name="Set to group:" type="string">
<button label="Vis" label_selected="Vis" name="ShowOwner" />
<button label="Returnér..." label_selected="Returnér..." name="ReturnOwner..."
tool_tip="Returnér objekter til deres ejere." />
<text type="string" length="1" name="Set to group:">
Sat til gruppe:
</text>
<text length="1" name="group_objects_text" type="string">
<text type="string" length="1" name="group_objects_text">
[COUNT]
</text>
<button label="Vis" label_selected="Vis" name="ShowGroup"/>
<button label="Retunér..." label_selected="Retunér..." name="ReturnGroup..." tool_tip="Retunér disse objekter til deres ejere."/>
<text length="1" name="Owned by others:" type="string">
<button label="Vis" label_selected="Vis" name="ShowGroup" />
<button label="Returnér..." label_selected="Returnér..." name="ReturnGroup..."
tool_tip="Returnér objekter til deres ejere." />
<text type="string" length="1" name="Owned by others:">
Ejet af andre:
</text>
<text length="1" name="other_objects_text" type="string">
<text type="string" length="1" name="other_objects_text">
[COUNT]
</text>
<button label="Show" label_selected="Show" name="ShowOther"/>
<button label="Return..." label_selected="Return..." name="ReturnOther..." tool_tip="Return objects to their owners."/>
<text length="1" name="Selected / sat upon:" type="string">
Valgt / I Brug:
<button label="Vis" label_selected="Vis" name="ShowOther" />
<button label="Returnér..." label_selected="Returnér..." name="ReturnOther..."
tool_tip="Returnér objekter til deres ejere." />
<text type="string" length="1" name="Selected / sat upon:">
Valgt/siddet på:
</text>
<text length="1" name="selected_objects_text" type="string">
<text type="string" length="1" name="selected_objects_text">
[COUNT]
</text>
<text length="1" name="Autoreturn" type="string">
Autoreturnér andre&apos;s objekter efter (minutter, 0 = aldrig):
<text type="string" length="1" name="Autoreturn">
Autoreturnér andres objekter efter (minutter, 0 = aldrig):
</text>
<line_editor name="clean other time"/>
<text length="1" name="Object Owners:" type="string">
Objekt Ejere:
<text type="string" length="1" name="Object Owners:">
Objekt ejere:
</text>
<button label="Forny Liste" label_selected="Forny Liste" name="Refresh List"/>
<button label="Retunér objekter..." label_selected="Retunér objekter..." name="Return objects..."/>
<button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh List" />
<button label="Returnér objekter..." label_selected="Returnér objekter..."
name="Return objects..." />
<name_list name="owner list">
<column label="Type" name="type"/>
<column name="online_status"/>
<column label="Navn" name="name"/>
<column label="Antal" name="count"/>
<column label="Type" name="type" />
<column label="Navn" name="name" />
<column label="Antal" name="count" />
<column label="Nyeste" name="mostrecent" />
</name_list>
</panel>
<panel label="Indstillinger" name="land_options_panel">
<text length="1" name="allow_label" type="string">
Tillad beboere at:
<text type="string" length="1" name="allow_label">
Tillad andre beboere at:
</text>
<check_box label="Redigere Terræn" name="edit land check" tool_tip="Hvis afkrydset kan alle forme jorden på dit land. Det anbefales ikke at give dem denne mulgihed, siden du altid selv kan redigere din jord."/>
<check_box label="Lave Landemærker" name="check landmark"/>
<check_box label="Flyve" name="check fly" tool_tip="Hvis afkrydset, kan beboere flyve på dit land. Hvis ikke afkrydset kan de kun flyve ind til eller over dit land."/>
<text length="1" name="allow_label2" type="string">
<check_box label="Redigere terræn" name="edit land check"
tool_tip="Hvis dette er valg, kan enhver redigere dit land. Det er bedst ikke at vælge her, da det altid er muligt for dig som ejer at ændre terræn på dit eget land." />
<check_box label="Lave landemærker" name="check landmark" />
<check_box label="Flyve" name="check fly"
tool_tip="Hvis valgt, kan beboere flyve på dit land. Hvis ikke valgt kan beboere kun flyve ind på dit land og over dit land." />
<text type="string" length="1" name="allow_label2">
Lave objekter:
</text>
<check_box label="Alle Beboere" name="edit objects check"/>
<check_box label="Gruppen" name="edit group objects check"/>
<text length="1" name="allow_label3" type="string">
Indføre objekter:
<check_box label="Alle beboere" name="edit objects check" />
<check_box label="Gruppe" name="edit group objects check" />
<text type="string" length="1" name="allow_label3">
Anbringe objekter:
</text>
<check_box label="Alle Beboere" name="all object entry check"/>
<check_box label="Gruppen" name="group object entry check"/>
<text length="1" name="allow_label4" type="string">
Køre Koder:
<check_box label="Alle beboere" name="all object entry check" />
<check_box label="Gruppe" name="group object entry check" />
<text type="string" length="1" name="allow_label4">
Køre scripts:
</text>
<check_box label="Alle Beboere" name="check other scripts"/>
<check_box label="Gruppen" name="check group scripts"/>
<text length="1" name="land_options_label" type="string">
Land Indstillinger:
<check_box label="Alle beboere" name="check other scripts" />
<check_box label="Gruppe" name="check group scripts" />
<text type="string" length="1" name="land_options_label">
Land instillinger:
</text>
<check_box label="Sikker (ingen skade)" name="check safe" tool_tip="Hvis dette er afkrydset, er landet sikkert, og man kan ikke skades. Hvis ryddet, kan man komme til skade."/>
<check_box label="Skub forbudt" name="PushRestrictCheck" tool_tip="Forhindrer koder fra skubbe. Afkrydsning af denne mulighed, kan være nyttigt for at forhindre forstyrrende adfærd på dit land."/>
<check_box label="Vis sted i søgning (L$30/uge) under" name="ShowDirectoryCheck" tool_tip="Lad dit parcel blive vist i søge resultaterne"/>
<check_box label="Sikker (ingen skade)" name="check safe"
tool_tip="Hvis valgt, er det ikke muligt at forårsage skade på andre beboere. Hvis fravalgt er det muligt at få skader (f.eks. ved kamp)." />
<check_box label="Skub forbudt" name="PushRestrictCheck"
tool_tip="Forhindrer scripts i at skubbe. Valg af denne mulighed, kan være nyttigt for at forhindre forstyrrende adfærd på dit land." />
<check_box label="Vis sted i søgning (L$30/uge) i kategorien:" name="ShowDirectoryCheck"
tool_tip="Lad dit parcel blive vist i søge resultaterne" />
<combo_box name="land category">
<combo_item name="AnyCategory">
Alle Kategorier
Alle kategorier
</combo_item>
<combo_item name="LindenLocation">
Linden Lokation
</combo_item>
<combo_item name="Adult">
Voksent
Linden Location
</combo_item>
<combo_item name="Arts&amp;Culture">
Kunst &amp; Kultur
Kunst &amp; kultur
</combo_item>
<combo_item name="Business">
Firma
Business
</combo_item>
<combo_item name="Educational">
Uddannelse
@ -282,7 +298,7 @@ Gå til Verden&apos;s menuen&gt; Om Jord eller vælge et andet parcel for at vis
Nybegynder venligt
</combo_item>
<combo_item name="Parks&amp;Nature">
Parker &amp; Natur
Parker &amp; natur
</combo_item>
<combo_item name="Residential">
Beboelse
@ -294,31 +310,34 @@ Gå til Verden&apos;s menuen&gt; Om Jord eller vælge et andet parcel for at vis
Andet
</combo_item>
</combo_box>
<button label="?" label_selected="?" name="?"/>
<check_box label="Voksent Indhold" name="MatureCheck" tool_tip="Dit Parcel&apos;s information eller indhold anses for voksent."/>
<text length="1" name="Snapshot:" type="string">
Billede:
<button label="?" label_selected="?" name="?" />
<check_box name="MatureCheck" />
<text type="string" length="1" name="Snapshot:">
Foto:
</text>
<texture_picker label="" name="snapshot_ctrl" tool_tip="Click to choose a picture"/>
<text length="1" name="landing_point" type="string">
Landings Zone: [LANDING]
<texture_picker label="" name="snapshot_ctrl" tool_tip="Klik for at vælge et billede" />
<text type="string" length="1" name="landing_point">
Landingspunkt: [LANDING]
</text>
<string name="landing_point_none">
(ingen)
</string>
<button label="Vælg" label_selected="Vælg" name="Set" tool_tip="Indstiller landings punkt, hvor de besøgende ankommer. Indstiller til din avatar placering inde i denne Parcel."/>
<button label="Slet" label_selected="Slet" name="Clear" tool_tip="Slet Landings Zonen."/>
<text length="1" name="Teleport Routing: " type="string">
Teleport Valg:
<button label="Vælg" label_selected="Vælg" name="Set"
tool_tip="Indstiller landingspunkt, hvor de besøgende ankommer. Sættes til din avatars aktuelle placering i denne parcel." />
<button label="Fjern" label_selected="Fjern" name="Clear"
tool_tip="Fjerner oplysning om landingspunkt." />
<text type="string" length="1" name="Teleport Routing: ">
Teleport valg:
</text>
<combo_box name="landing type" tool_tip="Vælg hvordan du vil håndtere teleporteringer til dit land.">
<combo_item length="1" name="Blocked" type="string">
<combo_box name="landing type"
tool_tip="Vælg hvordan du vil håndtere teleporteringer til dit land.">
<combo_item type="string" length="1" name="Blocked">
Blokeret
</combo_item>
<combo_item length="1" name="LandingPoint" type="string">
Landings Zonen
<combo_item type="string" length="1" name="LandingPoint">
Landingspunkt
</combo_item>
<combo_item length="1" name="Anywhere" type="string">
<combo_item type="string" length="1" name="Anywhere">
Hvor som helst
</combo_item>
</combo_box>
@ -326,84 +345,95 @@ Gå til Verden&apos;s menuen&gt; Om Jord eller vælge et andet parcel for at vis
Skub forbudt
</string>
<string name="push_restrict_region_text">
Skub forbudt (Region Overskrivning)
Skub forbudt (Uanset region indstilling)
</string>
</panel>
<panel label="Medier" name="land_media_panel">
<text length="1" name="with media:" type="string">
Medie Type:
<text type="string" length="1" name="with media:">
Medie type:
</text>
<combo_box name="media type" tool_tip="Specificer om adressen er en film, hjemmeside eller et andet medie."/>
<text length="1" name="at URL:" type="string">
<combo_box name="media type"
tool_tip="Specificer om URL-adressen er til en film, hjemmeside eller et andet medie." />
<text type="string" length="1" name="at URL:">
Medie URL:
</text>
<button label="Vælg..." label_selected="Vælg..." name="set_media_url"/>
<text length="1" name="Description:" type="string">
<button label="Vælg..." label_selected="Vælg..." name="set_media_url" />
<text type="string" length="1" name="Description:">
Beskrivelse:
</text>
<line_editor name="url_description" tool_tip="Text displayed next to play/load button"/>
<text length="1" name="Media texture:" type="string">
Erstat
Tekstur:
<line_editor name="url_description" tool_tip="Tekst vist ved siden af Afspil/Hent knappen" />
<text type="string" length="1" name="Media texture:">
Erstat tekstur:
</text>
<texture_picker label="" name="media texture" tool_tip="Klik for at vælge billede"/>
<text length="1" name="replace_texture_help" type="string">
(Genstande der har denne tekstur vil vise filmen eller
<texture_picker label="" name="media texture" tool_tip="Klik for at vælge billede" />
<text type="string" length="1" name="replace_texture_help">
(Objekter der har denne tekstur vil vise filmen eller
web-siden, efter du klikker på play knappen.)
</text>
<text length="1" name="Options:" type="string">
Medie
Indstillinger:
<text type="string" length="1" name="Options:">
Medie valg:
</text>
<check_box label="Auto Skalér" name="media_auto_scale" tool_tip="Vælg denne mulighed for at skalere indholdet for dette parcel automatisk. Det kan være lidt langsommere og have lavere kvalitet, men ingen anden tekstur skalering eller tilpasning vil være nødvendigt."/>
<check_box label="Gentag Medie" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/>
<check_box label="Skjul Medie URL." name="hide_media_url" tool_tip="Klik her for at skjule Medie adressen så det kun er dig og evt. parcel gruppens ejer/officere der kan se den."/>
<check_box label="Skjul Musik URL" name="hide_music_url" tool_tip="Klik her for at skjule Musik adressen så det kun er dig og evt. parcel gruppens ejer/officere der kan se den."/>
<text length="1" name="media_size" tool_tip="Size to render Web media, leave 0 for default." type="string" width="105">
<check_box label="Auto skalér" name="media_auto_scale"
tool_tip="Vælg denne mulighed for at skalere indholdet for dette parcel automatisk. Det kan være lidt langsommere og have lavere kvalitet, men ingen anden tekstur skalering eller tilpasning vil være nødvendigt." />
<check_box label="Gentag afspil" name="media_loop"
tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra." />
<check_box label="Skjul medie URL" name="hide_media_url"
tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den." />
<check_box label="Skjul musik URL" name="hide_music_url"
tool_tip="Klik her for at skjule musik adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den." />
<text type="string" length="1" name="media_size"
tool_tip="Størrelse for rendering af Web medie, benyt 0 for standard." width="105">
Medie Størrelse:
</text>
<spinner name="media_size_width" tool_tip="Størrelse på Web Medier, 0 for standard." left_delta="89"/>
<spinner name="media_size_height" tool_tip="Størrelse på Web Medier, 0 for standard."/>
<text length="1" name="pixels" type="string">
<spinner name="media_size_width" left_delta="89"
tool_tip="Størrelse for rendering af Web medie, benyt 0 for standard." />
<spinner name="media_size_height"
tool_tip="Størrelse for rendering af Web medie, benyt 0 for standard." />
<text type="string" length="1" name="pixels">
pixels
</text>
<text length="1" name="MusicURL:" type="string">
<text type="string" length="1" name="MusicURL:">
Musik URL:
</text>
<text length="1" name="Sound:" type="string">
<text type="string" length="1" name="Sound:">
Lyd:
</text>
<check_box label="Begræns alle lyde til dette parcel." name="check sound local"/>
<text length="1" name="Voice settings:" type="string">
<check_box label="Isolér lyde til denne parcel" name="check sound local" />
<text type="string" length="1" name="Voice settings:">
Stemme:
</text>
<radio_group name="parcel_voice_channel">
<radio_item length="1" name="Estate" type="string">
Bruger Estate kanalen
<radio_item type="string" length="1" name="Estate">
Brug Estate kanalen
</radio_item>
<radio_item length="1" name="Private" type="string">
Bruger sin egen kanal
<radio_item type="string" length="1" name="Private">
Brug en privat kanal
</radio_item>
<radio_item length="1" name="Disabled" type="string">
Deaktiver stemme chat
<radio_item type="string" length="1" name="Disabled">
Slå stemme chat fra på denne parcel
</radio_item>
</radio_group>
</panel>
<panel label="Adgang" name="land_access_panel">
<text length="1" name="Limit access to this parcel to:" type="string">
Adgang til dette parcel
<text type="string" length="1" name="Limit access to this parcel to:">
Adgang til denne parcel
</text>
<check_box label="Tillad offentlig adgang" name="public_access"/>
<text length="1" name="Only Allow" type="string">
Bloker adgang for:
<check_box label="Tillad offentlig adgang" name="public_access" />
<text type="string" length="1" name="Only Allow">
Blokér adgang for:
</text>
<check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab" name="limit_payment" tool_tip="Ban unidentified residents."/>
<check_box label="Beboere der ikke er godkendt som voksne" name="limit_age_verified" tool_tip="Bloker beboere der ikke har verificeret deres alder. Se support.secondlife.com for mere information."/>
<check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab"
name="limit_payment"
tool_tip="Blokér beboere der ikke har afgivet identifikationsoplysninger." />
<check_box label="Beboere der ikke er godkendt som voksne" name="limit_age_verified"
tool_tip="Blokér beboere der ikke har verificeret deres alder. Se support.secondlife.com for mere information." />
<string name="estate_override">
En eller flere af disse muligheder er indstillet på estate plan
En eller flere af disse valg er indstillet på estate niveau
</string>
<check_box label="Tillad denne gruppe adgang: [GROUP]" name="GroupCheck" tool_tip="Vælg Gruppe under generelt."/>
<check_box label="Sælg adgang til:" name="PassCheck" tool_tip="Giver midlertidigt adgang til parcellet"/>
<check_box label="Tillad adgang til gruppen: [GROUP]" name="GroupCheck"
tool_tip="Vælg gruppe under fanen &apos;generelt&apos;." />
<check_box label="Sælg adgang til:" name="PassCheck"
tool_tip="Tillader midlertidig adgang til denne parcel" />
<combo_box name="pass_combo">
<combo_item name="Anyone">
Alle
@ -412,20 +442,20 @@ Indstillinger:
Gruppe
</combo_item>
</combo_box>
<spinner label="Pris i L$:" name="PriceSpin"/>
<spinner label="Timers adgang:" name="HoursSpin"/>
<text label="Always Allow" name="AllowedText">
Altid Godkendte Beboere
<spinner label="Pris i L$:" name="PriceSpin" />
<spinner label="Timers adgang:" name="HoursSpin" />
<text label="Tillad altid" name="AllowedText">
Altid godkendte beboere
</text>
<name_list name="AccessList" tool_tip="([LISTED] listed, [MAX] max)"/>
<button label="Tilføj..." label_selected="Tilføj..." name="add_allowed"/>
<button label="Fjern" label_selected="Fjern" name="remove_allowed"/>
<text label="Ban" name="BanCheck">
Blokerede Beboere
<name_list name="AccessList" tool_tip="([LISTED] vist, [MAX] max)" />
<button label="Tilføj..." label_selected="Tilføj..." name="add_allowed" />
<button label="Fjern" label_selected="Fjern" name="remove_allowed" />
<text label="Blokér" name="BanCheck">
Blokerede beboere
</text>
<name_list name="BannedList" tool_tip="([LISTED] listed, [MAX] max)"/>
<button label="Tilføj..." label_selected="Tilføj..." name="add_banned"/>
<button label="Fjern" label_selected="Fjern" name="remove_banned"/>
<name_list name="BannedList" tool_tip="([LISTED] vist, [MAX] max)" />
<button label="Tilføj..." label_selected="Tilføj..." name="add_banned" />
<button label="Fjern" label_selected="Fjern" name="remove_banned" />
</panel>
</tab_container>
</floater>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="Animations Fremvisning" title="">
<floater name="Animation Preview" title="">
<text name="name_label">
Navn:
</text>
@ -8,61 +8,61 @@
</text>
<spinner label="Prioritet" name="priority"
tool_tip="Vælg hvilke andre animationer der har lavere prioritet end denne." />
<check_box label="Gentag" name="loop_check" tool_tip="Gentager animationen for evigt." />
<check_box label="Gentag" name="loop_check" tool_tip="Gentager animationen konstant." />
<spinner label="Ind(%)" name="loop_in_point"
tool_tip="Sætter punktet hvor gentagelsen hopper tilbage til." />
<spinner label="Ud(%)" name="loop_out_point"
tool_tip="Sætter punktet hvor gentagelsen genstarter fra." />
<spinner label="Ud (%)" name="loop_out_point"
tool_tip="Sætter punktet i animationen der afslutter gentagelsen." />
<text name="hand_label">
Hånd posering
</text>
<combo_box label="" name="hand_pose_combo"
tool_tip="Kontrollerer hvad hånden går i løbet af animationen.">
tool_tip="Kontrollerer hvad hænderne går i løbet af animationen.">
<combo_item name="Spread">
Spred
Spredt
</combo_item>
<combo_item name="Relaxed">
Afslappet
</combo_item>
<combo_item name="PointBoth">
Peg Begge
Peg begge
</combo_item>
<combo_item name="Fist">
Knytnæve
Knytnæver
</combo_item>
<combo_item name="RelaxedLeft">
Afslappet Venstre
Afslappet venstre
</combo_item>
<combo_item name="PointLeft">
Peger Venstre
Peg venstre
</combo_item>
<combo_item name="FistLeft">
Knyttet Venstre
Knytnæve venstre
</combo_item>
<combo_item name="RelaxedRight">
Afslappet Højre
Afslappet højre
</combo_item>
<combo_item name="PointRight">
Peger Højre
Peg højre
</combo_item>
<combo_item name="FistRight">
Knyttet Højre
Knytnæve højre
</combo_item>
<combo_item name="SaluteRight">
Hils Højre
Honnør højre
</combo_item>
<combo_item name="Typing">
Skriver
</combo_item>
<combo_item name="PeaceRight">
Fredstegn Højre
Fredstegn højre
</combo_item>
</combo_box>
<text name="emote_label">
Ansigts Udtryk
Ansigtsudtryk
</text>
<combo_box label="" name="emote_combo"
tool_tip="Controls what face does during animation.">
tool_tip="Angiver hvad ansigtet gør under animationen">
<combo_item name="[None]">
[Intet]
</combo_item>
@ -76,34 +76,34 @@
Vred
</combo_item>
<combo_item name="BigSmile">
Stort Smil
Stort smil
</combo_item>
<combo_item name="Bored">
Keder Sig
Keder sig
</combo_item>
<combo_item name="Cry">
Græder
</combo_item>
<combo_item name="Disdain">
Foragt
Forarget
</combo_item>
<combo_item name="Embarrassed">
Flov
</combo_item>
<combo_item name="Frown">
Skule
Skuler
</combo_item>
<combo_item name="Kiss">
Kysse
Kysser
</combo_item>
<combo_item name="Laugh">
Grine
Griner
</combo_item>
<combo_item name="Plllppt">
Plllppt
</combo_item>
<combo_item name="Repulsed">
Frastøde
Frastødt
</combo_item>
<combo_item name="Sad">
Ked af det
@ -112,41 +112,41 @@
Skuldertræk
</combo_item>
<combo_item name="Smile">
Smile
Smiler
</combo_item>
<combo_item name="Surprise">
Overrasket
</combo_item>
<combo_item name="Wink">
Blinke
Blinker
</combo_item>
<combo_item name="Worry">
Bekymret
</combo_item>
</combo_box>
<text name="preview_label">
Fremvis:
Vis mens
</text>
<combo_box label="" name="preview_base_anim"
tool_tip="Use this to test your animation behavior while your avatar performs common actions.">
tool_tip="Se hvordan animation ser ud i forskellige typiske avatar-situationer.">
<combo_item name="Standing">
Stående
Står
</combo_item>
<combo_item name="Walking">
ende
r
</combo_item>
<combo_item name="Sitting">
Siddende
Sidder
</combo_item>
<combo_item name="Flying">
Flyvende
Flyver
</combo_item>
</combo_box>
<spinner label="Flydende Start (sek)" name="ease_in_time"
tool_tip="Tid i sekunder animationen bruger på at fade ind." />
<spinner label="Flydende Stop (sek)" name="ease_out_time"
tool_tip="Tid i sekunder animationen bruger på at fade ind." />
<button label="" name="play_btn" tool_tip="Play/pause din animation." />
<spinner label="start (sec)" name="ease_in_time"
tool_tip="Tid i sekunder animationen bruger på at komme i gang." />
<spinner label="Afslut (sec)" name="ease_out_time"
tool_tip="Tid i sekunder animationen bruger på at afslutte." />
<button label="" name="play_btn" tool_tip="Start/pause din animation." />
<button label="" name="stop_btn" tool_tip="Stop afspilning af animation" />
<slider label="" name="playback_slider" />
<text name="bad_animation_text">
@ -154,8 +154,8 @@
Vi anbefaler BVH filer der er exporteret fra Poser 4.
</text>
<button label="Annuller" name="cancel_btn" />
<button label="Upload (L$[AMOUNT])" name="ok_btn" />
<button label="Annullér" name="cancel_btn" />
<button label="Hent (L$[AMOUNT])" name="ok_btn" />
<string name="failed_to_initialize">
Fejlede at starte bevægelse
</string>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="floater_auction" title="Start Linden Jord Salg">
<check_box label="Vis også gult jord hegn" name="fence_check" />
<button label="Billede" label_selected="Billede" name="snapshot_btn" />
<floater name="floater_auction" title="Start Linden land salg">
<check_box label="Vis også gul aftegning af område" name="fence_check" />
<button label="Foto" label_selected="Foto" name="snapshot_btn" />
<button label="OK" label_selected="OK" name="ok_btn" />
<string name="already for sale">
Du kan ikke sætte jord på auktion der allerede er sat til salg.

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="avatarpicker" title="Vælg Beboer">
<floater name="avatarpicker" title="Vælg beboer">
<text name="instruct_search_resident_name">
Skriv en del eller hele navnet på beboeren:
</text>
<button label="Find" label_selected="Find" name="Find" />
<text name="Or select their calling card:">
Eller vælg deres kontakt kort:
Eller vælg deres visitkort:
</text>
<button label="Luk" label_selected="Luk" name="Close" />
<button label="Vælg" label_selected="Vælg" name="Select" />

View File

@ -1,27 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="avatar_texture_debug" title="Figur Teksturer">
<floater name="avatar_texture_debug" title="Avatar teksturer">
<text name="baked_label">
Baked Textures
Faste teksturer
</text>
<text name="composite_label">
Composite Textures
Blandede teksturer
</text>
<texture_picker label="Hoved" name="baked_head" />
<texture_picker label="Makeup" name="head_bodypaint" />
<texture_picker label="Hår" name="hair" />
<button label="Drop" label_selected="Dump" name="Dump" />
<texture_picker label="Øjne" name="baked_eyes" />
<texture_picker label="Øje" name="eye_texture" />
<texture_picker label="Øvre Krop" name="baked_upper_body" />
<texture_picker label="Øvre Krops Tatovering" name="upper_bodypaint" />
<texture_picker label="øjne" name="baked_eyes" />
<texture_picker label="øje" name="eye_texture" />
<texture_picker label="Overkrop" name="baked_upper_body" />
<texture_picker label="Tatovering overkrop" name="upper_bodypaint" />
<texture_picker label="Undertrøje" name="undershirt" />
<texture_picker label="Handsker" name="gloves" />
<texture_picker label="Trøje" name="shirt" />
<texture_picker label="Øvre Jakke" name="upper_jacket" />
<texture_picker label="Nedre Krop" name="baked_lower_body" />
<texture_picker label="Nedre Krops Tatovering" name="lower_bodypaint" />
<texture_picker label="øvre jakke" name="upper_jacket" />
<texture_picker label="Underkrop" name="baked_lower_body" />
<texture_picker label="Tatovering underkrop" name="lower_bodypaint" />
<texture_picker label="Underbukser" name="underpants" />
<texture_picker label="Sokker" name="socks" />
<texture_picker label="Strømper" name="socks" />
<texture_picker label="Sko" name="shoes" />
<texture_picker label="Bukser" name="pants" />
<texture_picker label="Jakke" name="jacket" />

View File

@ -1,16 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="beacons" title="Lyssøjler">
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="beacons" title="Pejlelys">
<panel name="beacons_panel">
<check_box label="Kun kodede objekter med &quot;rør&quot;" name="touch_only"/>
<check_box label="Kodede objekter" name="scripted"/>
<check_box label="Fysiske objekter" name="physical"/>
<check_box label="Lyd kilder" name="sounds"/>
<check_box label="Partikel Kilder" name="particles"/>
<check_box label="Render Highlights" name="highlights"/>
<check_box label="Render Lyssøjle" name="beacons"/>
<text name="beacon_width_label">
Lyssøjle bredde:
<check_box label="Kun scriptede objekter med &quot;rør&quot;" name="touch_only" />
<check_box label="Scriptede objekter" name="scripted" />
<check_box label="Fysiske objekter" name="physical" />
<check_box label="Lyd kilder" name="sounds" />
<check_box label="Partikel kilder" name="particles" />
<check_box label="Rendér highlights" name="highlights" />
<check_box label="Rendér pejlelys" name="beacons" />
<text type="string" length="1" name="beacon_width_label">
Pejlelys bredde:
</text>
<slider name="beacon_width"/>
</panel>
</floater>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="build options floater" title="Gitter Indstillinger">
<spinner label="Gitter Enhed (meter)" name="GridResolution" />
<spinner label="Gitter Bredde (meter)" name="GridDrawSize" />
<check_box label="Aktiver Sub-Enheds magnet" name="GridSubUnit" />
<check_box label="Vis modsat akse" name="GridCrossSection" />
<floater name="build options floater" title="Gitter indstillinger">
<spinner label="Gitter enhed (meter)" name="GridResolution" />
<spinner label="Gitter rækkevidde (meter)" name="GridDrawSize" />
<check_box label="Aktiver låsning til under-enheder" name="GridSubUnit" />
<check_box label="Vis &apos;cross sections&apos;" name="GridCrossSection" />
<slider label="Gitter synlighed" name="GridOpacity" />
</floater>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="floater_bumps" title="Bump, Skub &amp; Slag">
<floater name="floater_bumps" title="Bump, skub &amp; slag">
<string name="none_detected">
Ingen registreret
</string>
@ -7,13 +7,13 @@
[TIME] [FIRST] [LAST] ramte dig
</string>
<string name="llpushobject">
[TIME] [FIRST] [LAST] skubbede dig med en kode
[TIME] [FIRST] [LAST] skubbede dig med et script
</string>
<string name="selected_object_collide">
[TIME] [FIRST] [LAST] ramte dig med et objekt
</string>
<string name="scripted_object_collide">
[TIME] [FIRST] [LAST] ramte dig med et kodet objekt
[TIME] [FIRST] [LAST] ramte dig med et scriptet objekt
</string>
<string name="physical_object_collide">
[TIME] [FIRST] [LAST] ramte dig med et fysisk objekt

View File

@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="floater_buy_contents" title="Køb Indhold">
<floater name="floater_buy_contents" title="Køb indhold">
<text name="contains_text">
[NAME] indeholder:
</text>
<text name="buy_text">
Køb for L$[AMOUNT] fra [NAME]?
</text>
<button label="Annuller" label_selected="Annuller" name="cancel_btn" />
<button label="Annullér" label_selected="Annullér" name="cancel_btn" />
<button label="Køb" label_selected="Køb" name="buy_btn" />
<check_box label="Påsæt med det samme" name="wear_check" />
<check_box label="Tag tøj på nu" name="wear_check" />
<string name="no_copy_text">
(kopi nej)
(kopiér ej)
</string>
<string name="no_modify_text">
(rediger nej)
(ændre ej)
</string>
<string name="no_transfer_text">
(videregiv nej)
(videregiv ej)
</string>
</floater>

View File

@ -1,47 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="buy currency" title="K&#248;b Valuta">
<floater name="buy currency" title="Køb valuta">
<text name="info_buying">
K&#248;ber Valuta:
Køber valuta:
</text>
<text name="info_cannot_buy">
Kan ikke k&#248;be nu:
Kan ikke købe nu:
</text>
<text name="info_need_more">
Du har ikke penge nok:
</text>
<text name="error_message">
Noget er g&#229;et galt.
Noget er gået galt.
</text>
<button label="Go to website" name="error_web" />
<button label="Gå til hjemmeside" name="error_web" />
<text name="contacting">
Kontakter LindeX...
</text>
<text name="buy_action_unknown">
K&#248;b L$ p&#229; LindeX Valuta marked
Køb L$ på LindeX valuta marked
</text>
<text name="buy_action">
[NAME] L$ [PRICE]
</text>
<text name="currency_action">
K&#248;b L$
Køb L$
</text>
<line_editor name="currency_amt">
1234
</line_editor>
<text name="currency_est">
for omkring US$ [USD]
for ca. US$ [USD]
</text>
<text name="getting_data">
Henter data...
</text>
<text name="balance_label">
Du har i &#248;jeblikket
Du har i øjeblikket
</text>
<text name="balance_amount">
L$ [AMT]
</text>
<text name="buying_label">
Du k&#248;ber
Du køber
</text>
<text name="buying_amount">
L$ [AMT]
@ -53,16 +53,16 @@
L$ [AMT]
</text>
<text name="purchase_warning_repurchase">
Der er sket en fejl, og k&#248;bet er afbrudt.
Fors&#248;g venligst igen.
Bekræfter at denne handel kun omfatter valuta.
Gentag operationen venligst igen.
</text>
<text name="purchase_warning_notenough">
Du k&#248;ber ikke nok valuta, tast et st&#248;rre bel&#248;b
og pr&#248;v igen.
Du køber ikke nok valuta, tast et større beløb
og prøv igen.
</text>
<button label="Annuller" name="cancel_btn" />
<button label="K&#248;b" name="buy_btn" />
<button label="Annullér" name="cancel_btn" />
<button label="Køb" name="buy_btn" />
<string name="buy_currency">
K&#248;b L$ [LINDENS] for omkring US$ [USD]
Buy L$ [LINDENS] for approx. US$ [USD]
</string>
</floater>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="buy land" title="K&#248;b Land">
<floater name="buy land" title="Køb land">
<text name="region_name_label">
Region:
</text>
@ -13,25 +13,25 @@
(ukendt)
</text>
<text name="estate_owner_label">
Estate Owner:
Estate ejer:
</text>
<text name="estate_owner_text">
(ukendt)
</text>
<text name="resellable_changeable_label">
K&#248;bt land i denne region:
Købt land i denne region:
</text>
<text name="resellable_clause">
K&#248;bt land i denne region kan eller kan ikke videres&#230;lges.
Købt land i denne region kan eller kan ikke videresælges.
</text>
<text name="changeable_clause">
kan eller kan ikke samles eller opdeles.
</text>
<text name="covenant_text">
Du skal acceptere Estate betingelserne:
Du skal acceptere Estate reglerne:
</text>
<text_editor name="covenant_editor">
Indl&#230;ser...
Indlæser...
</text_editor>
<check_box label="Jeg acceptere betingelserne der er beskrevet." name="agree_covenant" />
<text name="info_parcel_label">
@ -41,10 +41,10 @@
Scotopteryx 138,204
</text>
<text name="info_size_label" width="60">
St&#248;rrelse:
Størrelse:
</text>
<text name="info_size" left_delta="62">
1024 m2
1024 m²
</text>
<text name="info_price_label">
Pris:
@ -53,35 +53,35 @@
L$ 1500, objekter inkluderet
</text>
<text name="info_action">
K&#248;b af land vil:
Køb af dette land vil:
</text>
<text name="error_message">
Noget er ikke rigtigt.
</text>
<button label="G&#229; til hjemmesiden" name="error_web" />
<button label="Go to website" name="error_web" />
<text name="account_action">
Opgrader dig til premium medlemsskab.
</text>
<text name="account_reason">
Kun premium medlemmer kan k&#248;be land.
Kun premium medlemmer kan eje land.
</text>
<combo_box name="account_level">
<combo_item name="US$9.95/month,billedmonthly">
US$9.95/md, m&#229;nedlig afregning
US$9.95/md, månedlig afregning
</combo_item>
<combo_item name="US$7.50/month,billedquarterly">
US$7.50/md, kvartalsvis afregning
</combo_item>
<combo_item name="US$6.00/month,billedannually">
US$6.00/md, &#229;rlig afregning
US$6.00/md, årlig afregning
</combo_item>
</combo_box>
<text name="land_use_action" width="210" right="430">
For&#248;g dine m&#229;nedlige arealanvendelse gebyrer til US $ 40/month.
<text name="land_use_action">
Forøg dine månedlige arealanvendelse gebyrer til US $ 40/måned.
</text>
<text name="land_use_reason">
Du har 1.309 kvadratmeter jord.
Dette parcel er p&#229; 512 kvadratmeter jord.
Dette parcel er på 512 kvadratmeter jord.
</text>
<text name="purchase_action">
Betal Joe Resident L$ 4000 dette areal
@ -90,13 +90,13 @@ Dette parcel er p&#229; 512 kvadratmeter jord.
Du har L$2,100.
</text>
<text name="currency_action">
K&#248;b yderligere L$
Køb yderligere L$
</text>
<line_editor name="currency_amt">
1000
</line_editor>
<text name="currency_est">
for omkring US$ [AMOUNT2]
for ca. US$ [AMOUNT2]
</text>
<text name="currency_balance">
Du har L$2,100.
@ -104,12 +104,12 @@ Dette parcel er p&#229; 512 kvadratmeter jord.
<check_box label="Fjern [AMOUNT] kvadratmeter af bidrag fra gruppe."
name="remove_contribution" />
<button label="K&#248;b" name="buy_btn" />
<button label="Annuller" name="cancel_btn" />
<button label="Annullér" name="cancel_btn" />
<string name="can_resell">
Kan videres&#230;lges.
Kan videresælges.
</string>
<string name="can_not_resell">
Kan ikke videres&#230;lges.
Kan ikke videresælges.
</string>
<string name="can_change">
Kan samles eller opdeles.
@ -118,17 +118,17 @@ Dette parcel er p&#229; 512 kvadratmeter jord.
Kan ikke samles eller opdeles.
</string>
<string name="cant_buy_for_group">
Du har ikke tilladelse til at k&#248;be land for din aktive gruppe.
Du har ikke tilladelse til at købe land for din aktive gruppe.
</string>
<string name="no_land_selected">
Intet land er valgt.
</string>
<string name="multiple_parcels_selected">
Flere forskellige parceller er valgt.
Pr&#248;v at v&#230;lge et mindre omr&#229;de.
Prøv at vælge et mindre område.
</string>
<string name="no_permission">
Du har ikke tilladelse til at k&#248;be jord for din aktive gruppe.
Du har ikke tilladelse til at købe jord for din aktive gruppe.
</string>
<string name="parcel_not_for_sale">
Det udvalgte parcel er ikke til salg.
@ -143,37 +143,37 @@ Pr&#248;v at v&#230;lge et mindre omr&#229;de.
Det udvalgte parcel er sat til salg til en anden.
</string>
<string name="no_public_land">
Det valgte omr&#229;de har ingen offentlige arealer.
Det valgte område har ingen offentlige arealer.
</string>
<string name="not_owned_by_you">
Jord, der ejes af en anden bruger er valgt.
Pr&#248;v at v&#230;lge et mindre omr&#229;de.
Prøv at vælge et mindre område.
</string>
<string name="processing">
Forarbejder dit k&#248;b...
Forarbejder dit køb...
(Dette kan tage et minut eller to.)
</string>
<string name="fetching_error">
Der er sket en fejl under hentning af jord k&#248;bs oplysninger.
Der er sket en fejl under hentning af jord købs oplysninger.
</string>
<string name="buying_will">
K&#248;b af dette areal vil:
Køb af dette areal vil:
</string>
<string name="buying_for_group">
K&#248;b jord til gruppe:
Køb jord til gruppe:
</string>
<string name="cannot_buy_now">
Kan ikke k&#248;be nu:
Kan ikke købe nu:
</string>
<string name="not_for_sale">
Not for sale:
Ikke til salg:
</string>
<string name="none_needed">
ikke n&#248;dvendigt
ikke nødvendigt
</string>
<string name="must_upgrade">
Din konto skal v&#230;re opgraderet for at eje jord.
Din konto skal være opgraderet for at eje jord.
</string>
<string name="cant_own_land">
Din konto kan eje jord.
@ -185,19 +185,19 @@ Pr&#248;v at v&#230;lge et mindre omr&#229;de.
Betal L$ [AMOUNT] til [SELLER] for dette stykke jord
</string>
<string name="buy_for_US">
K&#248;b L$ [AMOUNT] for omkring US$ [AMOUNT2] ,
Køb L$ [AMOUNT] for omkring US$ [AMOUNT2] ,
</string>
<string name="parcel_meters">
Dette parcel er [AMOUNT] kvadratmeter.
Dette parcel er [AMOUNT] kvadratmeter.
</string>
<string name="premium_land">
Dette stykke jord er premium, og vil t&#230;lle som [AMOUNT] kvadratmeter.
Dette stykke jord er premium, og vil tælle som [AMOUNT] kvadratmeter.
</string>
<string name="discounted_land">
Dette stykke jord er p&#229; tilbud, og vil t&#230;lle som [AMOUNT] kvadratmeter.
Dette stykke jord er på tilbud, og vil tælle som [AMOUNT] kvadratmeter.
</string>
<string name="meters_supports_object">
[AMOUNT] m2
[AMOUNT] m²
indeholder [AMOUNT2] objekter
</string>
<string name="sold_with_objects">
@ -205,25 +205,25 @@ indeholder [AMOUNT2] objekter
</string>
<string name="insufficient_land_credits">
Gruppen [GROUP] skal bruge nok tildelt jord brugs
kredit for at d&#230;kke dette parcel f&#248;r k&#248;bet vil blive
gennemf&#248;rt.
kredit for at dække dette parcel før købet vil blive
gennemført.
</string>
<string name="have_enough_lindens">
Du har L$ [AMOUNT], hvilket er nok til at k&#248;be denne jord.
Du har L$ [AMOUNT], hvilket er nok til at købe denne jord.
</string>
<string name="not_enough_lindens">
Du har kun L$ [AMOUNT], og har brug for yderligere L$ [AMOUNT2].
</string>
<string name="balance_left">
Efter k&#248;bet, vil du have L$ [AMOUNT] tilbage.
Efter købet, vil du have L$ [AMOUNT] tilbage.
</string>
<string name="balance_needed">
Du skal k&#248;be mindst L$ [AMOUNT] for at have r&#229;d til denne jord.
Du skal købe mindst L$ [AMOUNT] for at have råd til denne jord.
</string>
<string name="no_parcel_selected">
(intet parcel er valgt)
</string>
<string name="buy_currency">
K&#248;b L$ [LINDENS] for omkring US$ [USD]
Køb L$ [LINDENS] for omkring US$ [USD]
</string>
</floater>

View File

@ -1,26 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="contents" title="K&#248;b kopi af objekt">
<floater name="contents" title="Køb kopi af objekt">
<text name="contents_text">
og dets indhold:
</text>
<text name="buy_text">
K&#248;b for L$[AMOUNT] fra [NAME]?
Køb for L$[AMOUNT] fra [NAME]?
</text>
<button label="Annuller" label_selected="Annuller" name="cancel_btn" />
<button label="K&#248;b" label_selected="K&#248;b" name="buy_btn" />
<button label="Annullér" label_selected="Annullér" name="cancel_btn" />
<button label="Køb" label_selected="Køb" name="buy_btn" />
<string name="title_buy_text">
K&#248;b
Køb
</string>
<string name="title_buy_copy_text">
K&#248;b en kopi af
Køb en kopi af
</string>
<string name="no_copy_text">
(kan ej kopieres)
(kopiér ej)
</string>
<string name="no_modify_text">
(kan ej redigeres)
(ændre ej)
</string>
<string name="no_transfer_text">
(kan ikke videregives)
(videregiv ej)
</string>
</floater>

View File

@ -7,6 +7,6 @@
Zoom kamera mod fokus
</string>
<string name="move_tooltip">
Flyt kamera op og ned, til venstre og h&#248;jre
Flyt kamera op og ned, til venstre og højre
</string>
</floater>

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