Ansariel 2020-10-14 23:48:24 +02:00
commit 32b5aa20c3
79 changed files with 6144 additions and 5001 deletions

11
.gitignore vendored
View File

@ -21,8 +21,8 @@ indra/.distcc
build-vc80/
build-vc100/
build-vc120/
build-vc[0-9]*-32/
build-vc[0-9]*-64/
build-vc[0-9]*-32*/
build-vc[0-9]*-64*/
indra/CMakeFiles
indra/build-vc[0-9]*
indra/lib/mono/1.0/*.dll
@ -98,4 +98,9 @@ indra/newview/pilot.xml
indra/newview/exoflickrkeys.h
indra/newview/fsdiscordkey.h
my_autobuild.xml
.vscode
.vscode
*.srctrlbm
*.srctrldb
*.srctrlprj
compile_commands.json

View File

@ -992,11 +992,11 @@
<key>archive</key>
<map>
<key>hash</key>
<string>fd75a1941350a5a0b510b18192f28ef3</string>
<string>b88e70667efc230a00d6a2d982af8fc5</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.04-windows-202592205.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.05-windows-202860859.tar.bz2</string>
</map>
<key>name</key>
<string>windows</string>
@ -1006,18 +1006,18 @@
<key>archive</key>
<map>
<key>hash</key>
<string>534c065e8d284b794d1aabeda20f3600</string>
<string>401829b65cac61a2f96179fadf7eb015</string>
<key>hash_algorithm</key>
<string>md5</string>
<key>url</key>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.04-windows64-202592207.tar.bz2</string>
<string>file:///c:/cygwin/opt/firestorm/fmodstudio-2.01.05-windows64-202860900.tar.bz2</string>
</map>
<key>name</key>
<string>windows64</string>
</map>
</map>
<key>version</key>
<string>2.01.04</string>
<string>2.01.05</string>
</map>
<key>fontconfig</key>
<map>

71
build_target.sh Normal file
View File

@ -0,0 +1,71 @@
#!/usr/bin/env bash
if [ $# -eq 0 ]
then
echo "USAGE: $0 <OS|SL>"
exit 1
fi
if [ $1 == "SL" ] || [ $1 == "OS" ]
then
[ $1 == "SL" ] && l="OS" || l="SL"
else
if [ $1 == "test" ] || [ $1 == "?" ]
then
if [ -d "./build-vc150-64" ]
then
c="Unknown"
if [ ! -d "./build-vc150-64-SL" ] && [ -d "./build-vc150-64-OS" ]
then
c="SL"
fi
if [ -d "./build-vc150-64-SL" ] && [ ! -d "./build-vc150-64-OS" ]
then
c="OS"
fi
echo "Current build is for $c"
else
echo "No build configured"
fi
exit 0
else
echo "Invalid target $1"
echo "USAGE: $0 <OS|SL>"
exit 2
fi
fi
t=$1
if [ -d "./build-vc150-64" ]
then
if [ ! -d "./build-vc150-64-$t" ]
then
# live folder exists
# target does not so we are probably good to go
echo "$t already setup"
exit 0
else
# target folder exists so probably means that the setup is for the alternate
if [ ! -d "./build-vc150-64-$l" ]
then
# alternate folder not found so we rename the live target back to this
echo "Currently setup for $l. Renaming default back to $l"
`mv ./build-vc150-64 ./build-vc150-64-$l`
else
# no LAST and no TARGET exists so this is not in the right state
echo "Not setup for multi-target"
exit 3
fi
fi
fi
if [ -d "./build-vc150-64-$t" ]
then
# live folder exists
# target does not so we are probably good to go
echo "renaming $t to default"
`mv ./build-vc150-64-$t ./build-vc150-64`
else
echo "Not setup for target $t"
exit 4
fi

View File

@ -268,6 +268,7 @@ Beq Janus
Beth Walcher
Beq Janus
SL-10288
SL-13583
Bezilon Kasei
Biancaluce Robbiani
CT-225

View File

@ -190,8 +190,12 @@ BOOL LLTexLayerSetBuffer::renderTexLayerSet(LLRenderTarget* bound_target)
LLTexLayerSetInfo::LLTexLayerSetInfo() :
mBodyRegion( "" ),
mWidth( 512 ),
mHeight( 512 ),
// <FS:Beq> FIRE-30020 allow 1024 local bakes (not strictly needed as avatar_lad is required)
// mWidth( 512 ),
// mHeight( 512 ),
mWidth( 1024 ),
mHeight( 1024 ),
// </FS:Beq>
mClearAlpha( TRUE )
{
}

View File

@ -430,7 +430,7 @@ void showJointScaleOverrides( const LLJoint& joint, const std::string& note, con
bool LLJoint::aboveJointPosThreshold(const LLVector3& pos) const
{
LLVector3 diff = pos - getDefaultPosition();
const F32 max_joint_pos_offset = 0.0001f; // 0.1 mm
const F32 max_joint_pos_offset = LL_JOINT_TRESHOLD_POS_OFFSET; // 0.1 mm
return diff.lengthSquared() > max_joint_pos_offset * max_joint_pos_offset;
}
@ -533,7 +533,7 @@ void LLJoint::clearAttachmentPosOverrides()
// getAllAttachmentPosOverrides()
//--------------------------------------------------------------------
void LLJoint::getAllAttachmentPosOverrides(S32& num_pos_overrides,
std::set<LLVector3>& distinct_pos_overrides)
std::set<LLVector3>& distinct_pos_overrides) const
{
num_pos_overrides = m_attachmentPosOverrides.count();
LLVector3OverrideMap::map_type::const_iterator it = m_attachmentPosOverrides.getMap().begin();
@ -547,7 +547,7 @@ void LLJoint::getAllAttachmentPosOverrides(S32& num_pos_overrides,
// getAllAttachmentScaleOverrides()
//--------------------------------------------------------------------
void LLJoint::getAllAttachmentScaleOverrides(S32& num_scale_overrides,
std::set<LLVector3>& distinct_scale_overrides)
std::set<LLVector3>& distinct_scale_overrides) const
{
num_scale_overrides = m_attachmentScaleOverrides.count();
LLVector3OverrideMap::map_type::const_iterator it = m_attachmentScaleOverrides.getMap().begin();

View File

@ -79,6 +79,8 @@ const U32 LL_FACE_JOINT_NUM = (LL_CHARACTER_MAX_ANIMATED_JOINTS-2);
const S32 LL_CHARACTER_MAX_PRIORITY = 7;
const F32 LL_MAX_PELVIS_OFFSET = 5.f;
const F32 LL_JOINT_TRESHOLD_POS_OFFSET = 0.0001f; //0.1 mm
class LLVector3OverrideMap
{
public:
@ -313,9 +315,9 @@ public:
void showAttachmentScaleOverrides(const std::string& av_info) const;
void getAllAttachmentPosOverrides(S32& num_pos_overrides,
std::set<LLVector3>& distinct_pos_overrides);
std::set<LLVector3>& distinct_pos_overrides) const;
void getAllAttachmentScaleOverrides(S32& num_scale_overrides,
std::set<LLVector3>& distinct_scale_overrides);
std::set<LLVector3>& distinct_scale_overrides) const;
// These are used in checks of whether a pos/scale override is considered significant.
bool aboveJointPosThreshold(const LLVector3& pos) const;

View File

@ -244,7 +244,7 @@ public:
LLInventoryCategory(const LLInventoryCategory* other);
void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy
protected:
~LLInventoryCategory();
virtual ~LLInventoryCategory();
//--------------------------------------------------------------------
// Accessors And Mutators

View File

@ -5294,9 +5294,9 @@ public:
LLVCacheTriangleData* tri = *iter;
if (tri->mActive)
{
tri->mScore = tri->mVertex[0]->mScore;
tri->mScore += tri->mVertex[1]->mScore;
tri->mScore += tri->mVertex[2]->mScore;
tri->mScore = tri->mVertex[0] ? tri->mVertex[0]->mScore : 0;
tri->mScore += tri->mVertex[1] ? tri->mVertex[1]->mScore : 0;
tri->mScore += tri->mVertex[2] ? tri->mVertex[2]->mScore : 0;
if (!mBestTriangle || mBestTriangle->mScore < tri->mScore)
{

View File

@ -387,7 +387,7 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa
return LLModel::NO_ERRORS ;
}
LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly)
LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& face_list, std::vector<std::string>& materials, domPolylistRef& poly, LLSD& log_msg)
{
domPRef p = poly->getP();
domListOfUInts& idx = p->getValue();
@ -447,6 +447,7 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac
LLVolumeFace::VertexMapData::PointMap point_map;
U32 cur_idx = 0;
bool log_tc_msg = true;
for (U32 i = 0; i < vcount.getCount(); ++i)
{ //for each polygon
U32 first_index = 0;
@ -470,8 +471,21 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac
if (tc_source)
{
cv.mTexCoord.setVec(tc[idx[cur_idx+tc_offset]*2+0],
tc[idx[cur_idx+tc_offset]*2+1]);
U64 idx_x = idx[cur_idx + tc_offset] * 2 + 0;
U64 idx_y = idx[cur_idx + tc_offset] * 2 + 1;
if (idx_y < tc.getCount())
{
cv.mTexCoord.setVec(tc[idx_x], tc[idx_y]);
}
else if (log_tc_msg)
{
log_tc_msg = false;
LL_WARNS() << "Texture coordinates data is not complete." << LL_ENDL;
LLSD args;
args["Message"] = "IncompleteTC";
log_msg.append(args);
}
}
if (norm_source)
@ -1262,7 +1276,7 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
for (S32 i = 0; i < childCount; ++i)
{
domNode* pNode = daeSafeCast<domNode>(children[i]);
if ( isNodeAJoint( pNode ) )
if (pNode)
{
processJointNode( pNode, mJointList );
}
@ -1533,6 +1547,12 @@ void LLDAELoader::processDomModel(LLModel* model, DAE* dae, daeElement* root, do
}
}
U32 bind_count = model->mSkinInfo.mAlternateBindMatrix.size();
if (bind_count > 0 && bind_count != jointCnt)
{
LL_WARNS("Mesh") << "Model " << model->mLabel << " has invalid joint bind matrix list." << LL_ENDL;
}
//grab raw position array
domVertices* verts = mesh->getVertices();
@ -1897,59 +1917,61 @@ void LLDAELoader::processJointNode( domNode* pNode, JointTransformMap& jointTran
//LL_WARNS()<<"ProcessJointNode# Node:" <<pNode->getName()<<LL_ENDL;
//1. handle the incoming node - extract out translation via SID or element
if (isNodeAJoint(pNode))
{
LLMatrix4 workingTransform;
LLMatrix4 workingTransform;
//Pull out the translate id and store it in the jointTranslations map
daeSIDResolver jointResolverA(pNode, "./translate");
domTranslate* pTranslateA = daeSafeCast<domTranslate>(jointResolverA.getElement());
daeSIDResolver jointResolverB(pNode, "./location");
domTranslate* pTranslateB = daeSafeCast<domTranslate>(jointResolverB.getElement());
//Pull out the translate id and store it in the jointTranslations map
daeSIDResolver jointResolverA( pNode, "./translate" );
domTranslate* pTranslateA = daeSafeCast<domTranslate>( jointResolverA.getElement() );
daeSIDResolver jointResolverB( pNode, "./location" );
domTranslate* pTranslateB = daeSafeCast<domTranslate>( jointResolverB.getElement() );
//Translation via SID was successful
if (pTranslateA)
{
extractTranslation(pTranslateA, workingTransform);
}
else
if (pTranslateB)
{
extractTranslation(pTranslateB, workingTransform);
}
else
{
//Translation via child from element
daeElement* pTranslateElement = getChildFromElement(pNode, "translate");
if (!pTranslateElement || pTranslateElement->typeID() != domTranslate::ID())
{
//LL_WARNS()<< "The found element is not a translate node" <<LL_ENDL;
daeSIDResolver jointResolver(pNode, "./matrix");
domMatrix* pMatrix = daeSafeCast<domMatrix>(jointResolver.getElement());
if (pMatrix)
{
//LL_INFOS()<<"A matrix SID was however found!"<<LL_ENDL;
domFloat4x4 domArray = pMatrix->getValue();
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
workingTransform.mMatrix[i][j] = domArray[i + j * 4];
}
}
}
else
{
LL_WARNS() << "The found element is not translate or matrix node - most likely a corrupt export!" << LL_ENDL;
}
}
else
{
extractTranslationViaElement(pTranslateElement, workingTransform);
}
}
//Translation via SID was successful
if ( pTranslateA )
{
extractTranslation( pTranslateA, workingTransform );
}
else
if ( pTranslateB )
{
extractTranslation( pTranslateB, workingTransform );
}
else
{
//Translation via child from element
daeElement* pTranslateElement = getChildFromElement( pNode, "translate" );
if ( !pTranslateElement || pTranslateElement->typeID() != domTranslate::ID() )
{
//LL_WARNS()<< "The found element is not a translate node" <<LL_ENDL;
daeSIDResolver jointResolver( pNode, "./matrix" );
domMatrix* pMatrix = daeSafeCast<domMatrix>( jointResolver.getElement() );
if ( pMatrix )
{
//LL_INFOS()<<"A matrix SID was however found!"<<LL_ENDL;
domFloat4x4 domArray = pMatrix->getValue();
for ( int i = 0; i < 4; i++ )
{
for( int j = 0; j < 4; j++ )
{
workingTransform.mMatrix[i][j] = domArray[i + j*4];
}
}
}
else
{
LL_WARNS()<< "The found element is not translate or matrix node - most likely a corrupt export!" <<LL_ENDL;
}
}
else
{
extractTranslationViaElement( pTranslateElement, workingTransform );
}
}
//Store the working transform relative to the nodes name.
jointTransforms[ pNode->getName() ] = workingTransform;
//Store the working transform relative to the nodes name.
jointTransforms[pNode->getName()] = workingTransform;
}
//2. handle the nodes children
@ -2422,7 +2444,7 @@ LLColor4 LLDAELoader::getDaeColor(daeElement* element)
return value;
}
bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh)
bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh, LLSD& log_msg)
{
LLModel::EModelStatus status = LLModel::NO_ERRORS;
domTriangles_Array& tris = mesh->getTriangles_array();
@ -2444,7 +2466,7 @@ bool LLDAELoader::addVolumeFacesFromDomMesh(LLModel* pModel,domMesh* mesh)
for (U32 i = 0; i < polys.getCount(); ++i)
{
domPolylistRef& poly = polys.get(i);
status = load_face_from_dom_polylist(pModel->getVolumeFaces(), pModel->getMaterialList(), poly);
status = load_face_from_dom_polylist(pModel->getVolumeFaces(), pModel->getMaterialList(), poly, log_msg);
if(status != LLModel::NO_ERRORS)
{
@ -2546,7 +2568,7 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo
// Get the whole set of volume faces
//
addVolumeFacesFromDomMesh(ret, mesh);
addVolumeFacesFromDomMesh(ret, mesh, mWarningsArray);
U32 volume_faces = ret->getNumVolumeFaces();
@ -2619,7 +2641,8 @@ bool LLDAELoader::createVolumeFacesFromDomMesh(LLModel* pModel, domMesh* mesh)
{
pModel->ClearFacesAndMaterials();
addVolumeFacesFromDomMesh(pModel, mesh);
LLSD placeholder;
addVolumeFacesFromDomMesh(pModel, mesh, placeholder);
if (pModel->getNumVolumeFaces() > 0)
{

View File

@ -89,7 +89,7 @@ protected:
//Verify that a controller matches vertex counts
bool verifyController( domController* pController );
static bool addVolumeFacesFromDomMesh(LLModel* model, domMesh* mesh);
static bool addVolumeFacesFromDomMesh(LLModel* model, domMesh* mesh, LLSD& log_msg);
static bool createVolumeFacesFromDomMesh(LLModel* model, domMesh *mesh);
static LLModel* loadModelFromDomMesh(domMesh* mesh);

View File

@ -139,7 +139,7 @@ LLModelLoader::LLModelLoader(
, mStateCallback(state_cb)
, mOpaqueData(opaque_userdata)
, mRigValidJointUpload(true)
, mLegacyRigValid(true)
, mLegacyRigFlags(0)
, mNoNormalize(false)
, mNoOptimize(false)
, mCacheOnlyHitIfRigged(false)
@ -148,6 +148,7 @@ LLModelLoader::LLModelLoader(
{
assert_main_thread();
sActiveLoaderList.push_back(this) ;
mWarningsArray = LLSD::emptyArray();
}
LLModelLoader::~LLModelLoader()
@ -158,6 +159,7 @@ LLModelLoader::~LLModelLoader()
void LLModelLoader::run()
{
mWarningsArray.clear();
doLoadModel();
doOnIdleOneTime(boost::bind(&LLModelLoader::loadModelCallback,this));
}
@ -402,7 +404,7 @@ void LLModelLoader::critiqueRigForUploadApplicability( const std::vector<std::st
//2. It is suitable for upload as standard av with just skin weights
bool isJointPositionUploadOK = isRigSuitableForJointPositionUpload( jointListFromAsset );
bool isRigLegacyOK = isRigLegacy( jointListFromAsset );
U32 legacy_rig_flags = determineRigLegacyFlags( jointListFromAsset );
// It's OK that both could end up being true.
@ -416,19 +418,16 @@ void LLModelLoader::critiqueRigForUploadApplicability( const std::vector<std::st
setRigValidForJointPositionUpload( false );
}
if ( !isRigLegacyOK)
{
// This starts out true, becomes false if false for any loaded
// mesh.
setLegacyRigValid( false );
}
legacy_rig_flags |= getLegacyRigFlags();
// This starts as 0, changes if any loaded mesh has issues
setLegacyRigFlags(legacy_rig_flags);
}
//-----------------------------------------------------------------------------
// isRigLegacy()
// determineRigLegacyFlags()
//-----------------------------------------------------------------------------
bool LLModelLoader::isRigLegacy( const std::vector<std::string> &jointListFromAsset )
U32 LLModelLoader::determineRigLegacyFlags( const std::vector<std::string> &jointListFromAsset )
{
//No joints in asset
if ( jointListFromAsset.size() == 0 )
@ -441,7 +440,12 @@ bool LLModelLoader::isRigLegacy( const std::vector<std::string> &jointListFromAs
{
LL_WARNS() << "Rigged to " << jointListFromAsset.size() << " joints, max is " << mMaxJointsPerMesh << LL_ENDL;
LL_WARNS() << "Skinning disabled due to too many joints" << LL_ENDL;
return false;
LLSD args;
args["Message"] = "TooManyJoint";
args["[JOINTS]"] = LLSD::Integer(jointListFromAsset.size());
args["[MAX]"] = LLSD::Integer(mMaxJointsPerMesh);
mWarningsArray.append(args);
return LEGACY_RIG_FLAG_TOO_MANY_JOINTS;
}
// Unknown joints in asset
@ -452,16 +456,24 @@ bool LLModelLoader::isRigLegacy( const std::vector<std::string> &jointListFromAs
if (mJointMap.find(*it)==mJointMap.end())
{
LL_WARNS() << "Rigged to unrecognized joint name " << *it << LL_ENDL;
LLSD args;
args["Message"] = "UnrecognizedJoint";
args["[NAME]"] = *it;
mWarningsArray.append(args);
unknown_joint_count++;
}
}
if (unknown_joint_count>0)
{
LL_WARNS() << "Skinning disabled due to unknown joints" << LL_ENDL;
return false;
LLSD args;
args["Message"] = "UnknownJoints";
args["[COUNT]"] = LLSD::Integer(unknown_joint_count);
mWarningsArray.append(args);
return LEGACY_RIG_FLAG_UNKNOWN_JOINT;
}
return true;
return LEGACY_RIG_OK;
}
//-----------------------------------------------------------------------------
// isRigSuitableForJointPositionUpload()

View File

@ -42,6 +42,10 @@ typedef std::deque<std::string> JointNameSet;
const S32 SLM_SUPPORTED_VERSION = 3;
const S32 NUM_LOD = 4;
const U32 LEGACY_RIG_OK = 0;
const U32 LEGACY_RIG_FLAG_TOO_MANY_JOINTS = 1;
const U32 LEGACY_RIG_FLAG_UNKNOWN_JOINT = 2;
class LLModelLoader : public LLThread
{
public:
@ -166,7 +170,7 @@ public:
void critiqueRigForUploadApplicability( const std::vector<std::string> &jointListFromAsset );
//Determines if a rig is a legacy from the joint list
bool isRigLegacy( const std::vector<std::string> &jointListFromAsset );
U32 determineRigLegacyFlags( const std::vector<std::string> &jointListFromAsset );
//Determines if a rig is suitable for upload
bool isRigSuitableForJointPositionUpload( const std::vector<std::string> &jointListFromAsset );
@ -174,8 +178,9 @@ public:
const bool isRigValidForJointPositionUpload( void ) const { return mRigValidJointUpload; }
void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; }
const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
const bool isLegacyRigValid(void) const { return mLegacyRigFlags == 0; }
U32 getLegacyRigFlags() const { return mLegacyRigFlags; }
void setLegacyRigFlags( U32 rigFlags ) { mLegacyRigFlags = rigFlags; }
//-----------------------------------------------------------------------------
// isNodeAJoint()
@ -185,6 +190,9 @@ public:
return name != NULL && mJointMap.find(name) != mJointMap.end();
}
const LLSD logOut() const { return mWarningsArray; }
void clearLog() { mWarningsArray.clear(); }
protected:
//<FS:ND> Query by JointKey rather than just a string, the key can be a U32 index for faster lookup
std::vector< std::string > toStringVector( std::vector< JointKey > const &aIn ) const
@ -205,13 +213,15 @@ protected:
void* mOpaqueData;
bool mRigValidJointUpload;
bool mLegacyRigValid;
U32 mLegacyRigFlags;
bool mNoNormalize;
bool mNoOptimize;
JointTransformMap mJointTransformMap;
LLSD mWarningsArray; // preview floater will pull logs from here
static std::list<LLModelLoader*> sActiveLoaderList;
static bool isAlive(LLModelLoader* loader) ;
};

View File

@ -55,6 +55,7 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
, mTabComparator( NULL )
, mNoVisibleTabsHelpText(NULL)
, mNoVisibleTabsOrigString(params.no_visible_tabs_text.initial_value().asString())
, mSkipScrollToChild(false)
{
initNoTabsWidget(params.no_matched_tabs_text);
@ -670,7 +671,7 @@ void LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
// virtual
void LLAccordionCtrl::onUpdateScrollToChild(const LLUICtrl *cntrl)
{
if (mScrollbar && mScrollbar->getVisible())
if (mScrollbar && mScrollbar->getVisible() && !mSkipScrollToChild)
{
// same as scrollToShowRect
LLRect rect;

View File

@ -143,6 +143,8 @@ public:
bool getFitParent() const {return mFitParent;}
void setSkipScrollToChild(bool skip) { mSkipScrollToChild = skip; }
private:
void initNoTabsWidget(const LLTextBox::Params& tb_params);
void updateNoTabsHelpTextVisibility();
@ -188,6 +190,8 @@ private:
F32 mAutoScrollRate;
LLTextBox* mNoVisibleTabsHelpText;
bool mSkipScrollToChild;
std::string mNoMatchedTabsOrigString;
std::string mNoVisibleTabsOrigString;

View File

@ -700,7 +700,8 @@ void LLButton::draw()
LLColor4 highlighting_color = LLColor4::white;
LLColor4 glow_color = LLColor4::white;
LLRender::eBlendType glow_type = LLRender::BT_ADD_WITH_ALPHA;
LLUIImage* imagep = NULL;
LLUIImage* imagep = NULL;
LLUIImage* image_glow = NULL;
// Cancel sticking of color, if the button is pressed,
// or when a flashing of the previously selected button is ended
@ -767,17 +768,18 @@ void LLButton::draw()
imagep = mImageDisabled;
}
image_glow = imagep;
if (mFlashing)
{
// if button should flash and we have icon for flashing, use it as image for button
if(flash && mImageFlash)
if (flash && mImageFlash)
{
// setting flash to false to avoid its further influence on glow
flash = false;
imagep = mImageFlash;
// if button should flash and we have icon for flashing, use it as image for button
image_glow = mImageFlash;
}
// else use usual flashing via flash_color
else if (mFlashingTimer)
// provide fade-in and fade-out via flash_color
if (mFlashingTimer)
{
LLColor4 flash_color = mFlashBgColor.get();
use_glow_effect = TRUE;
@ -791,6 +793,11 @@ void LLButton::draw()
{
glow_color = highlighting_color;
}
else
{
// will fade from highlight color
glow_color = flash_color;
}
}
}
@ -872,7 +879,7 @@ void LLButton::draw()
if (mCurGlowStrength > 0.01f)
{
gGL.setSceneBlendType(glow_type);
imagep->drawSolid(0, 0, getRect().getWidth(), getRect().getHeight(), glow_color % (mCurGlowStrength * alpha));
image_glow->drawSolid(0, 0, getRect().getWidth(), getRect().getHeight(), glow_color % (mCurGlowStrength * alpha));
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
}
@ -883,7 +890,7 @@ void LLButton::draw()
if (mCurGlowStrength > 0.01f)
{
gGL.setSceneBlendType(glow_type);
imagep->drawSolid(0, y, glow_color % (mCurGlowStrength * alpha));
image_glow->drawSolid(0, y, glow_color % (mCurGlowStrength * alpha));
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
}

View File

@ -213,6 +213,7 @@ public:
void setFlashing( bool b, bool force_flashing = false );
BOOL getFlashing() const { return mFlashing; }
LLFlashTimer* getFlashTimer() {return mFlashingTimer;}
void setFlashColor(const LLUIColor &color) { mFlashBgColor = color; };
void setHAlign( LLFontGL::HAlign align ) { mHAlign = align; }
LLFontGL::HAlign getHAlign() const { return mHAlign; }

View File

@ -136,6 +136,7 @@ LLScrollListCtrl::Params::Params()
primary_sort_only("primary_sort_only", false), // <FS:Ansariel> Option to only sort by one column
mouse_wheel_opaque("mouse_wheel_opaque", false),
commit_on_keyboard_movement("commit_on_keyboard_movement", true),
commit_on_selection_change("commit_on_selection_change", false),
heading_height("heading_height"),
page_lines("page_lines", 0),
background_visible("background_visible"),
@ -166,7 +167,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mMaxSelectable(0),
mAllowKeyboardMovement(true),
mCommitOnKeyboardMovement(p.commit_on_keyboard_movement),
mCommitOnSelectionChange(false),
mCommitOnSelectionChange(p.commit_on_selection_change),
mSelectionChanged(false),
mNeedsScroll(false),
mCanSelect(true),

View File

@ -97,6 +97,7 @@ public:
// behavioral flags
Optional<bool> multi_select,
commit_on_keyboard_movement,
commit_on_selection_change,
mouse_wheel_opaque;
// display flags

View File

@ -39,7 +39,6 @@
#include "llfloater.h"
#include "lltrans.h"
//----------------------------------------------------------------------------
// Implementation Notes:
@ -224,6 +223,8 @@ LLTabContainer::Params::Params()
last_tab("last_tab"),
use_custom_icon_ctrl("use_custom_icon_ctrl", false),
open_tabs_on_drag_and_drop("open_tabs_on_drag_and_drop", false),
enable_tabs_flashing("enable_tabs_flashing", false),
tabs_flashing_color("tabs_flashing_color"),
tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0),
use_ellipses("use_ellipses"),
label_shadow("label_shadow",false), // no drop shadowed labels by default -Zi
@ -268,8 +269,10 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
mCustomIconCtrlUsed(p.use_custom_icon_ctrl),
mOpenTabsOnDragAndDrop(p.open_tabs_on_drag_and_drop),
mTabIconCtrlPad(p.tab_icon_ctrl_pad),
mEnableTabsFlashing(p.enable_tabs_flashing),
mTabsFlashingColor(p.tabs_flashing_color),
mUseTabEllipses(p.use_ellipses),
mDropShadowedText(p.label_shadow) // support for drop shadowed tab labels -Zi
mDropShadowedText(p.label_shadow) // <FS:Zi> support for drop shadowed tab labels
{
// AO: Treat the IM tab container specially
if (getName() == "im_box_tab_container")
@ -306,6 +309,11 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
mMinTabWidth = tabcntr_vert_tab_min_width;
}
if (p.tabs_flashing_color.isProvided())
{
mEnableTabsFlashing = true;
}
initButtons( );
}
@ -1248,6 +1256,10 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
p.pad_right(2);
}
// inits flash timer
p.button_flash_enable = mEnableTabsFlashing;
p.flash_color = mTabsFlashingColor;
// <FS:Ansariel> Enable tab flashing
p.button_flash_enable(LLUI::getInstance()->mSettingGroups["config"]->getBOOL("EnableButtonFlashing"));
p.button_flash_count(LLUI::getInstance()->mSettingGroups["config"]->getS32("FlashCount"));

View File

@ -123,6 +123,12 @@ public:
* Open tabs on hover in drag and drop situations
*/
Optional<bool> open_tabs_on_drag_and_drop;
/**
* Enable tab flashing
*/
Optional<bool> enable_tabs_flashing;
Optional<LLUIColor> tabs_flashing_color;
/**
* Paddings for LLIconCtrl in case of LLCustomButtonIconCtrl usage(use_custom_icon_ctrl = true)
@ -343,6 +349,8 @@ private:
bool mCustomIconCtrlUsed;
bool mOpenTabsOnDragAndDrop;
bool mEnableTabsFlashing;
LLUIColor mTabsFlashingColor;
S32 mTabIconCtrlPad;
bool mUseTabEllipses;
};

View File

@ -2431,6 +2431,18 @@ void LLTextBase::needsReflow(S32 index)
// [/SL:KB]
}
S32 LLTextBase::removeFirstLine()
{
if (!mLineInfoList.empty())
{
S32 length = getLineEnd(0);
deselect();
removeStringNoUndo(0, length);
return length;
}
return 0;
}
void LLTextBase::appendLineBreakSegment(const LLStyle::Params& style_params)
{
segment_vec_t segments;

View File

@ -435,8 +435,7 @@ public:
virtual void setText(const LLStringExplicit &utf8str , const LLStyle::Params& input_params = LLStyle::Params()); // uses default style
virtual std::string getText() const;
void setMaxTextLength(S32 length) { mMaxTextByteLength = length; }
// <FS:Ansariel> Getter for mMaxTextByteLength
S32 getMaxTextLength() const { return mMaxTextByteLength; }
S32 getMaxTextLength() { return mMaxTextByteLength; }
// wide-char versions
void setWText(const LLWString& text);
@ -465,6 +464,7 @@ public:
S32 getLength() const { return getWText().length(); }
S32 getLineCount() const { return mLineInfoList.size(); }
S32 removeFirstLine(); // returns removed length
void addDocumentChild(LLView* view);
void removeDocumentChild(LLView* view);

View File

@ -56,6 +56,11 @@
#include "lltexteditor.h"
#include "lltextbox.h"
#if defined BOOST_FOREACH
#undef BOOST_FOREACH
#define BOOST_FOREACH(iter, coll) for (iter : coll)
#endif
static const S32 LINE_HEIGHT = 15;
S32 LLView::sDepth = 0;

View File

@ -513,6 +513,7 @@ set(viewer_SOURCE_FILES
llmenuoptionpathfindingrebakenavmesh.cpp
llmeshrepository.cpp
llmimetypes.cpp
llmodelpreview.cpp
llmorphview.cpp
llmoveview.cpp
llmutelist.cpp
@ -1280,6 +1281,7 @@ set(viewer_HEADER_FILES
llmenuoptionpathfindingrebakenavmesh.h
llmeshrepository.h
llmimetypes.h
llmodelpreview.h
llmorphview.h
llmoveview.h
llmutelist.h

View File

@ -1 +1 @@
6.4.10
6.4.11

View File

@ -761,6 +761,17 @@
<integer>1</integer>
</map>
<key>FSAllowEEPWaterDerender</key>
<map>
<key>Comment</key>
<string>Allow EEP assets to disable water rendering to increase FPS</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
<key>FSAlwaysFly</key>
<map>
@ -773,7 +784,6 @@
<key>Value</key>
<integer>0</integer>
</map>
<key>RadarReportChatRangeEnter</key>
<map>
<key>Comment</key>
@ -9119,188 +9129,6 @@
<key>Backup</key>
<integer>0</integer>
</map>
<key>MeshPreviewCanvasColor</key>
<map>
<key>Comment</key>
<string>Canvas colour for the Mesh uploader</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>0.169</real>
<real>0.169</real>
<real>0.169</real>
<real>1.0</real>
</array>
</map>
<key>MeshPreviewEdgeColor</key>
<map>
<key>Comment</key>
<string>Edge colour for the Mesh uploader preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>0.4</real>
<real>0.4</real>
<real>0.4</real>
<real>1.0</real>
</array>
</map>
<key>MeshPreviewBaseColor</key>
<map>
<key>Comment</key>
<string>Diffuse colour for the Mesh uploader when textures not shown</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
<real>1.0</real>
</array>
</map>
<key>MeshPreviewBrightnessColor</key>
<map>
<key>Comment</key>
<string>Brightness modifier</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color3</string>
<key>Value</key>
<array>
<real>0.9</real>
<real>0.9</real>
<real>0.9</real>
</array>
</map>
<key>MeshPreviewEdgeWidth</key>
<map>
<key>Comment</key>
<string>line thickness used when display edges is selected in mesh preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.0</real>
</map>
<key>MeshPreviewPhysicsEdgeColor</key>
<map>
<key>Comment</key>
<string>Edge colour for the Mesh uploader physics preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>0.0</real>
<real>0.25</real>
<real>0.5</real>
<real>0.25</real>
</array>
</map>
<key>MeshPreviewPhysicsFillColor</key>
<map>
<key>Comment</key>
<string>Fill colour for the Mesh uploader physics preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>0.0</real>
<real>0.5</real>
<real>1.0</real>
<real>0.5</real>
</array>
</map>
<key>MeshPreviewPhysicsEdgeWidth</key>
<map>
<key>Comment</key>
<string>line thickness used when display physics is selected in mesh preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.0</real>
</map>
<key>MeshPreviewDegenerateEdgeColor</key>
<map>
<key>Comment</key>
<string>Edge colour for the Mesh uploader Degenerate preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>1.0</real>
</array>
</map>
<key>MeshPreviewDegenerateFillColor</key>
<map>
<key>Comment</key>
<string>Fill colour for the Mesh uploader Degenerate preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Color4</string>
<key>Value</key>
<array>
<real>1.0</real>
<real>0.0</real>
<real>0.0</real>
<real>0.5</real>
</array>
</map>
<key>MeshPreviewDegenerateEdgeWidth</key>
<map>
<key>Comment</key>
<string>line thickness used when display Degenerate is selected in mesh preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>3.0</real>
</map>
<key>MeshPreviewDegeneratePointSize</key>
<map>
<key>Comment</key>
<string>Large point size used to highlight degenerate triangle vertices in Mesh preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>8.0</real>
</map>
<key>MeshPreviewZoomLimit</key>
<map>
<key>Comment</key>
<string>Maximum Zoom level in preview</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>10.0</real>
</map>
<key>FSMeshPreviewUVGuideFile</key>
<map>
<key>Comment</key>
@ -10657,17 +10485,6 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>13</integer>
</map>
<key>PreviewRenderSize</key>
<map>
<key>Comment</key>
<string>Resolution of the image rendered for the mesh upload preview (must be a power of 2)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
<integer>1024</integer>
</map>
<key>PreviewAmbientColor</key>
<map>
<key>Comment</key>

View File

@ -93,6 +93,5 @@ void main()
col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
col.rgb += light_diffuse[2].rgb * calcDirectionalLight(norm, light_position[2].xyz);
col.rgb += light_diffuse[3].rgb * calcDirectionalLight(norm, light_position[3].xyz);
col /= 2.0;
vertex_color = col*color;
}

View File

@ -8925,8 +8925,8 @@
<!-- =========================================================== -->
<layer_set
body_region="hair"
width="512"
height="512"
width="1024"
height="1024"
clear_alpha="false">
<layer
name="base"
@ -9015,8 +9015,8 @@
<layer_set
body_region="head"
width="512"
height="512">
width="1024"
height="1024">
<layer
name="head bump base"
fixed_color = "128,128,128,255"
@ -10151,8 +10151,8 @@ render_pass="bump">
<!-- =========================================================== -->
<layer_set
body_region="upper_body"
width="512"
height="512">
width="1024"
height="1024">
<layer
name="base_upperbody bump"
render_pass="bump"
@ -11460,8 +11460,8 @@ render_pass="bump">
<!-- =========================================================== -->
<layer_set
body_region="lower_body"
width="512"
height="512">
width="1024"
height="1024">
<layer
name="lower body bump base"
fixed_color = "128,128,128,255"
@ -12537,8 +12537,8 @@ render_pass="bump">
<!-- =========================================================== -->
<layer_set
body_region="skirt"
width="512"
height="512"
width="1024"
height="1024"
clear_alpha="false">
<layer
name="skirt_fabric"
@ -12776,8 +12776,8 @@ render_pass="bump">
<!-- =========================================================== -->
<layer_set
body_region="leftarm"
width="512"
height="512"
width="1024"
height="1024"
clear_alpha="false">
<layer
name="base"
@ -12852,8 +12852,8 @@ render_pass="bump">
<!-- =========================================================== -->
<layer_set
body_region="leftleg"
width="512"
height="512"
width="1024"
height="1024"
clear_alpha="false">
<layer
@ -12921,8 +12921,8 @@ render_pass="bump">
<!-- =========================================================== -->
<layer_set
body_region="aux1"
width="512"
height="512"
width="1024"
height="1024"
clear_alpha="false">
<layer
@ -12990,8 +12990,8 @@ render_pass="bump">
<!-- =========================================================== -->
<layer_set
body_region="aux2"
width="512"
height="512"
width="1024"
height="1024"
clear_alpha="false">
<layer
@ -13059,8 +13059,8 @@ render_pass="bump">
<!-- =========================================================== -->
<layer_set
body_region="aux3"
width="512"
height="512"
width="1024"
height="1024"
clear_alpha="false">
<layer
@ -17473,4 +17473,3 @@ render_pass="bump">
layer="lower_pants" />
</morph_masks>
</linden_avatar>

View File

@ -533,7 +533,7 @@ void FSFloaterSearch::displayClassifiedDetails(LLAvatarClassifiedInfo*& c_info)
map["LISTING_PRICE"] = llformat("L$%d", c_info->price_for_listing);
map["SLURL"] = LLSLURL("parcel", c_info->parcel_id, "about").getSLURLString();
mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_groupspanel_ls_classifieds");
mDetailsPanel->setVisible(mTabContainer->getCurrentPanel()->getName() == "panel_ls_classifieds");
mHasSelection = true;
mDetailMaturity->setVisible(true);
mParcelGlobal = c_info->pos_global;

View File

@ -148,13 +148,11 @@ void FSFloaterWearableFavorites::onOpen(const LLSD& /*info*/)
{
if (!mInitialized)
{
if (!gInventory.isInventoryUsable())
if (sFolderID.isNull())
{
return;
initCategory();
}
initCategory();
LLViewerInventoryCategory* category = gInventory.getCategory(sFolderID);
if (!category)
{
@ -201,8 +199,15 @@ BOOL FSFloaterWearableFavorites::handleKeyHere(KEY key, MASK mask)
return LLFloater::handleKeyHere(key, mask);
}
// static
void FSFloaterWearableFavorites::initCategory()
{
if (!gInventory.isInventoryUsable())
{
LL_WARNS() << "Cannot initialize Favorite Wearables inventory folder - inventory is not usable!" << LL_ENDL;
return;
}
LLUUID fs_favs_id;
LLUUID fs_root_cat_id = gInventory.findCategoryByName(ROOT_FIRESTORM_FOLDER);

View File

@ -78,10 +78,10 @@ public:
/*virtual*/ BOOL handleKeyHere(KEY key, MASK mask);
/*virtual*/ bool hasAccelerators() const { return true; }
static void initCategory();
static LLUUID getFavoritesFolder();
private:
void initCategory();
void updateList(const LLUUID& folder_id);
void onItemDAD(const LLUUID& item_id);

View File

@ -95,10 +95,13 @@ void LLDrawPoolSky::render(S32 pass)
LLGLSPipelineDepthTestSkyBox gls_skybox(true, false);
LLGLEnable fog_enable( (mShaderLevel < 1 && LLViewerCamera::getInstance()->cameraUnderWater()) ? GL_FOG : 0);
// <FS:Ansariel> Factor out instance() calls
LLViewerCamera& camera = LLViewerCamera::instance();
LLGLEnable fog_enable( (mShaderLevel < 1 && camera.cameraUnderWater()) ? GL_FOG : 0); // <FS:Ansariel> Factor out instance() calls
gGL.pushMatrix();
LLVector3 origin = LLViewerCamera::getInstance()->getOrigin();
LLVector3 origin = camera.getOrigin(); // <FS:Ansariel> Factor out instance() calls
gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]);
S32 face_count = (S32)mDrawFace.size();

View File

@ -209,11 +209,14 @@ void LLDrawPoolWater::render(S32 pass)
gGL.getTexUnit(2)->enable(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(2)->bind(mWaterImagep[1]) ;
LLVector3 camera_up = LLViewerCamera::getInstance()->getUpAxis();
// <FS:Ansariel> Factor out instance() calls
LLViewerCamera& camera = LLViewerCamera::instance();
LLVector3 camera_up = camera.getUpAxis(); // <FS:Ansariel> Factor out instance() calls
F32 up_dot = camera_up * LLVector3::z_axis;
LLColor4 water_color;
if (LLViewerCamera::getInstance()->cameraUnderWater())
if (camera.cameraUnderWater()) // <FS:Ansariel> Factor out instance() calls
{
water_color.setVec(1.f, 1.f, 1.f, 0.4f);
}
@ -288,7 +291,7 @@ void LLDrawPoolWater::render(S32 pass)
gGL.matrixMode(LLRender::MM_TEXTURE);
gGL.loadIdentity();
LLMatrix4 camera_mat = LLViewerCamera::getInstance()->getModelview();
LLMatrix4 camera_mat = camera.getModelview(); // <FS:Ansariel> Factor out instance() calls
LLMatrix4 camera_rot(camera_mat.getMat3());
camera_rot.invert();
@ -476,12 +479,16 @@ void LLDrawPoolWater::renderReflection(LLFace* face)
void LLDrawPoolWater::shade2(bool edge, LLGLSLShader* shader, const LLColor3& light_diffuse, const LLVector3& light_dir, F32 light_exp)
{
F32 water_height = LLEnvironment::instance().getWaterHeight();
// <FS:Ansariel> Factor out instance() calls
LLEnvironment& environment = LLEnvironment::instance();
LLViewerCamera& camera = LLViewerCamera::instance();
F32 water_height = environment.getWaterHeight(); // <FS:Ansariel> Factor out instance() calls
F32 camera_height = LLViewerCamera::getInstance()->getOrigin().mV[2];
F32 eyedepth = camera_height - water_height;
bool underwater = eyedepth <= 0.0f;
LLEnvironment& environment = LLEnvironment::instance();
//LLEnvironment& environment = LLEnvironment::instance(); // <FS:Ansariel> Factor out instance() calls
LLSettingsWater::ptr_t pwater = environment.getCurrentWater();
LLSettingsSky::ptr_t psky = environment.getCurrentSky();
@ -518,7 +525,9 @@ void LLDrawPoolWater::shade2(bool edge, LLGLSLShader* shader, const LLColor3& li
LLViewerTexture* tex_a = mWaterNormp[0];
LLViewerTexture* tex_b = mWaterNormp[1];
F32 blend_factor = LLEnvironment::instance().getCurrentWater()->getBlendFactor();
// <FS:Ansariel> Factor out instance() calls
//F32 blend_factor = LLEnvironment::instance().getCurrentWater()->getBlendFactor();
F32 blend_factor = pwater->getBlendFactor();
gGL.getTexUnit(bumpTex)->unbind(LLTexUnit::TT_TEXTURE);
gGL.getTexUnit(bumpTex2)->unbind(LLTexUnit::TT_TEXTURE);
@ -575,10 +584,10 @@ void LLDrawPoolWater::shade2(bool edge, LLGLSLShader* shader, const LLColor3& li
//shader->uniformMatrix4fv("inverse_ref", 1, GL_FALSE, (GLfloat*) gGLObliqueProjectionInverse.mMatrix);
shader->uniform1f(LLShaderMgr::WATER_WATERHEIGHT, eyedepth);
shader->uniform1f(LLShaderMgr::WATER_TIME, sTime);
shader->uniform3fv(LLShaderMgr::WATER_EYEVEC, 1, LLViewerCamera::getInstance()->getOrigin().mV);
shader->uniform3fv(LLShaderMgr::WATER_EYEVEC, 1, camera.getOrigin().mV); // <FS:Ansariel> Factor out instance() calls
shader->uniform3fv(LLShaderMgr::WATER_SPECULAR, 1, light_diffuse.mV);
shader->uniform1f(LLShaderMgr::WATER_SPECULAR_EXP, light_exp);
if (LLEnvironment::instance().isCloudScrollPaused())
if (environment.isCloudScrollPaused()) // <FS:Ansariel> Factor out instance() calls
{
static const std::array<F32, 2> zerowave{ {0.0f, 0.0f} };
@ -606,11 +615,11 @@ void LLDrawPoolWater::shade2(bool edge, LLGLSLShader* shader, const LLColor3& li
shader->uniform1f(LLShaderMgr::WATER_SUN_ANGLE2, 0.1f + 0.2f*sunAngle);
shader->uniform1i(LLShaderMgr::WATER_EDGE_FACTOR, edge ? 1 : 0);
LLVector4 rotated_light_direction = LLEnvironment::instance().getRotatedLightNorm();
LLVector4 rotated_light_direction = environment.getRotatedLightNorm(); // <FS:Ansariel> Factor out instance() calls
shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, rotated_light_direction.mV);
shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, 1, LLViewerCamera::getInstance()->getOrigin().mV);
shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, 1, camera.getOrigin().mV); // <FS:Ansariel> Factor out instance() calls
if (LLViewerCamera::getInstance()->cameraUnderWater())
if (camera.cameraUnderWater()) // <FS:Ansariel> Factor out instance() calls
{
shader->uniform1f(LLShaderMgr::WATER_REFSCALE, pwater->getScaleBelow());
}
@ -740,7 +749,7 @@ void LLDrawPoolWater::shade()
LLGLSLShader* shader = nullptr;
LLGLSLShader* edge_shader = nullptr;
F32 eyedepth = LLViewerCamera::getInstance()->getOrigin().mV[2] - LLEnvironment::instance().getWaterHeight();
F32 eyedepth = LLViewerCamera::getInstance()->getOrigin().mV[2] - environment.getWaterHeight(); // <FS:Ansariel> Factor out instance() calls
if (eyedepth < 0.f && LLPipeline::sWaterReflections)
{

View File

@ -302,7 +302,10 @@ void LLDrawPoolWLSky::renderStarsDeferred(void) const
gGL.setSceneBlendType(LLRender::BT_ADD_WITH_ALPHA);
F32 star_alpha = LLEnvironment::instance().getCurrentSky()->getStarBrightness() / 500.0f;
// <FS:Ansariel> Factor out instance() calls
LLSettingsSky::ptr_t current_sky = LLEnvironment::instance().getCurrentSky();
F32 star_alpha = current_sky->getStarBrightness() / 500.0f; // <FS:Ansariel> Factor out instance() calls
// If start_brightness is not set, exit
if(star_alpha < 0.001f)
@ -316,7 +319,7 @@ void LLDrawPoolWLSky::renderStarsDeferred(void) const
LLViewerTexture* tex_a = gSky.mVOSkyp->getBloomTex();
LLViewerTexture* tex_b = gSky.mVOSkyp->getBloomTexNext();
F32 blend_factor = LLEnvironment::instance().getCurrentSky()->getBlendFactor();
F32 blend_factor = current_sky->getBlendFactor(); // <FS:Ansariel> Factor out instance() calls
if (tex_a && (!tex_b || (tex_a == tex_b)))
{
@ -479,7 +482,10 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
LLFace * face = gSky.mVOSkyp->mFace[LLVOSky::FACE_SUN];
F32 blend_factor = LLEnvironment::instance().getCurrentSky()->getBlendFactor();
// <FS:Ansariel> Factor out instance() calls
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
F32 blend_factor = psky->getBlendFactor(); // <FS:Ansariel> Factor out instance() calls
bool can_use_vertex_shaders = gPipeline.canUseVertexShaders();
bool can_use_windlight_shaders = gPipeline.canUseWindLightShaders();
@ -562,7 +568,8 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
//moon_shader->bindTexture(LLShaderMgr::ALTERNATE_DIFFUSE_MAP, tex_b, LLTexUnit::TT_TEXTURE);
}
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
// <FS:Ansariel> Factor out instance() calls
//LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
F32 moon_brightness = (float)psky->getMoonBrightness();

View File

@ -1527,6 +1527,34 @@ LLEnvironment::DayInstance::ptr_t LLEnvironment::getSharedEnvironmentInstance()
void LLEnvironment::updateEnvironment(LLSettingsBase::Seconds transition, bool forced)
{
DayInstance::ptr_t pinstance = getSelectedEnvironmentInstance();
// <FS:Beq> Auto-disable water rendering via hasEEPWaterDerender
// Allow parcel and region owners to disable water rendering for their visitors through an EEP setting
// We test for the IMG_TRANSPARENT in the NormalMap channel, this is not a valid normal map so cannot clash with
// any valid EEP asset use.It also allows non-FS users to create these assets.
if(gSavedSettings.getBOOL("FSAllowEEPWaterDerender"))
{
auto targetWater = pinstance->getWater();
static bool hasEEPWaterDerender{false};
if(targetWater && targetWater->getNormalMapID()==IMG_TRANSPARENT)
{
// This EEP has explicit transparent water so let's disable rendering of water
if(LLPipeline::hasRenderTypeControl(LLPipeline::RENDER_TYPE_WATER))
{
hasEEPWaterDerender = true;// remember that it was us who disabled it.
LLPipeline::toggleRenderTypeControl(LLPipeline::RENDER_TYPE_WATER);
}
}
else
{
// Otherwise re-enable it, only if it was us that disabled it
if(hasEEPWaterDerender && !LLPipeline::hasRenderTypeControl(LLPipeline::RENDER_TYPE_WATER))
{
LLPipeline::toggleRenderTypeControl(LLPipeline::RENDER_TYPE_WATER);
}
hasEEPWaterDerender = false; // regardless of whether it was disabled it is no longer our problem
}
}
// </FS:Beq>
if ((mCurrentEnvironment != pinstance) || forced)
{
@ -1777,6 +1805,17 @@ void LLEnvironment::updateShaderUniforms(LLGLSLShader *shader)
void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envinfo, LLSettingsBase::Seconds transition)
{
if (!gAgent.getRegion())
{
return;
}
// mRegionId id can be null, no specification as to why and if it's valid so check valid ids only
if (gAgent.getRegion()->getRegionID() != envinfo->mRegionId && envinfo->mRegionId.notNull())
{
LL_INFOS("ENVIRONMENT") << "Requested environmend region id: " << envinfo->mRegionId << " agent is on: " << gAgent.getRegion()->getRegionID() << LL_ENDL;
return;
}
if (envinfo->mParcelId == INVALID_PARCEL_ID)
{
// the returned info applies to an entire region.

View File

@ -496,7 +496,8 @@ void LLFloaterFixedEnvironment::onSaveAsCommit(const LLSD& notification, const L
{
const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false);
LLUUID parent_id = mInventoryItem->getParentUUID();
if (marketplacelistings_id == parent_id)
if ((marketplacelistings_id == parent_id) || gInventory.isObjectDescendentOf(mInventoryItem->getUUID(), gInventory.getLibraryRootFolderID()))
{
parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SETTINGS);
}

File diff suppressed because it is too large Load Diff

View File

@ -28,36 +28,26 @@
#define LL_LLFLOATERMODELPREVIEW_H
#include "llfloaternamedesc.h"
#include "lldynamictexture.h"
#include "llquaternion.h"
#include "llmeshrepository.h"
#include "llmodel.h"
#include "llthread.h"
#include "llviewermenufile.h"
#include "llfloatermodeluploadbase.h"
#include "lldaeloader.h"
#include "llmeshrepository.h"
class LLComboBox;
class LLJoint;
class LLViewerJointMesh;
class LLVOAvatar;
class LLTextBox;
class LLVertexBuffer;
class LLMeshFilePicker;
class LLModelPreview;
class LLFloaterModelPreview;
class DAE;
class daeElement;
class domProfile_COMMON;
class domInstance_geometry;
class domNode;
class domTranslate;
class domController;
class domSkin;
class domMesh;
class LLMenuButton;
class LLToggleableMenu;
class LLTabContainer;
class LLViewerTextEditor;
class LLJointOverrideData
{
public:
LLJointOverrideData() : mHasConflicts(false) {};
std::map<std::string, LLVector3> mPosOverrides; // models with overrides
std::set<std::string> mModelsNoOverrides; // models without defined overrides
bool mHasConflicts;
};
typedef std::map<std::string, LLJointOverrideData> joint_override_data_map_t;
class LLFloaterModelPreview : public LLFloaterModelUploadBase
{
@ -80,6 +70,7 @@ public:
virtual ~LLFloaterModelPreview();
virtual BOOL postBuild();
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
void initModelPreview();
@ -93,6 +84,11 @@ public:
static void onMouseCaptureLostModelPreview(LLMouseHandler*);
static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
static void addStringToLog(const std::string& message, const LLSD& args, bool flash, S32 lod = -1);
static void addStringToLog(const std::string& str, bool flash);
static void addStringToLog(const std::ostringstream& strm, bool flash);
void clearAvatarTab(); // clears table
void updateAvatarTab(bool highlight_overrides); // populates table and data as nessesary
void setDetails(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost);
void setPreviewLOD(S32 lod);
@ -107,6 +103,8 @@ public:
void loadModel(S32 lod);
void loadModel(S32 lod, const std::string& file_name, bool force_disable_slm = false);
void loadHighLodModel();
void onViewOptionChecked(LLUICtrl* ctrl);
void onUploadOptionChecked(LLUICtrl* ctrl);
@ -115,6 +113,7 @@ public:
void setViewOptionEnabled(const std::string& option, bool enabled);
void enableViewOption(const std::string& option);
void disableViewOption(const std::string& option);
void onShowSkinWeightChecked(LLUICtrl* ctrl);
bool isModelLoading();
@ -143,8 +142,6 @@ protected:
static void onImportScaleCommit(LLUICtrl*, void*);
static void onPelvisOffsetCommit(LLUICtrl*, void*);
static void onUploadJointsCommit(LLUICtrl*,void*);
static void onUploadSkinCommit(LLUICtrl*,void*);
static void onPreviewLODCommit(LLUICtrl*,void*);
@ -177,7 +174,10 @@ protected:
// FIXME - this function and mStatusMessage have no visible effect, and the
// actual status messages are managed by directly manipulation of
// the UI element.
void setStatusMessage(const std::string& msg);
void setStatusMessage(const std::string& msg);
void addStringToLogTab(const std::string& str, bool flash);
void setCtrlLoadFromFile(S32 lod);
LLModelPreview* mModelPreview;
@ -206,226 +206,34 @@ protected:
LLSD mModelPhysicsFee;
private:
void onClickCalculateBtn();
void onClickCalculateBtn();
void onJointListSelection();
void onLoDSourceCommit(S32 lod);
void modelUpdated(bool calculate_visible);
// Toggles between "Calculate weights & fee" and "Upload" buttons.
void toggleCalculateButton();
void toggleCalculateButton(bool visible);
// resets display options of model preview to their defaults.
void resetDisplayOptions();
void resetUploadOptions();
void clearLogTab();
void createSmoothComboBox(LLComboBox* combo_box, float min, float max);
LLButton* mUploadBtn;
LLButton* mCalculateBtn;
};
LLViewerTextEditor* mUploadLogText;
LLTabContainer* mTabContainer;
class LLMeshFilePicker : public LLFilePickerThread
{
public:
LLMeshFilePicker(LLModelPreview* mp, S32 lod);
virtual void notify(const std::vector<std::string>& filenames);
S32 mAvatarTabIndex; // just to avoid any issues in case of xml changes
std::string mSelectedJointName;
private:
LLModelPreview* mMP;
S32 mLOD;
};
class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
{
typedef boost::signals2::signal<void (F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)> details_signal_t;
typedef boost::signals2::signal<void (void)> model_loaded_signal_t;
typedef boost::signals2::signal<void (bool)> model_updated_signal_t;
public:
typedef enum
{
LOD_FROM_FILE = 0,
GENERATE,
USE_LOD_ABOVE,
} eLoDMode;
public:
LLModelPreview(S32 width, S32 height, LLFloater* fmp);
virtual ~LLModelPreview();
void resetPreviewTarget();
void setPreviewTarget(F32 distance);
void setTexture(U32 name) { mTextureName = name; }
void setPhysicsFromLOD(S32 lod);
BOOL render();
void update();
void genBuffers(S32 lod, bool skinned);
void clearBuffers();
void refresh();
void rotate(F32 yaw_radians, F32 pitch_radians);
void zoom(F32 zoom_amt);
void pan(F32 right, F32 up);
virtual BOOL needsRender() { return mNeedsUpdate; }
void setPreviewLOD(S32 lod);
void clearModel(S32 lod);
void getJointAliases(JointMap& joint_map);
void loadModel(std::string filename, S32 lod, bool force_disable_slm = false);
void loadModelCallback(S32 lod);
bool lodsReady() { return !mGenLOD && mLodsQuery.empty(); }
void queryLODs() { mGenLOD = true; };
void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);
void generateNormals();
void restoreNormals();
U32 calcResourceCost();
void rebuildUploadData();
void saveUploadData(bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position);
void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position);
void clearIncompatible(S32 lod);
void updateStatusMessages();
void updateLodControls(S32 lod);
void clearGLODGroup();
void onLODParamCommit(S32 lod, bool enforce_tri_limit);
void addEmptyFace( LLModel* pTarget );
const bool getModelPivot( void ) const { return mHasPivot; }
void setHasPivot( bool val ) { mHasPivot = val; }
void setModelPivot( const LLVector3& pivot ) { mModelPivot = pivot; }
//Is a rig valid so that it can be used as a criteria for allowing for uploading of joint positions
//Accessors for joint position upload friendly rigs
const bool isRigValidForJointPositionUpload( void ) const { return mRigValidJointUpload; }
void setRigValidForJointPositionUpload( bool rigValid ) { mRigValidJointUpload = rigValid; }
//Accessors for the legacy rigs
const bool isLegacyRigValid( void ) const { return mLegacyRigValid; }
void setLegacyRigValid( bool rigValid ) { mLegacyRigValid = rigValid; }
static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
static bool lodQueryCallback();
boost::signals2::connection setDetailsCallback( const details_signal_t::slot_type& cb ){ return mDetailsSignal.connect(cb); }
boost::signals2::connection setModelLoadedCallback( const model_loaded_signal_t::slot_type& cb ){ return mModelLoadedSignal.connect(cb); }
boost::signals2::connection setModelUpdatedCallback( const model_updated_signal_t::slot_type& cb ){ return mModelUpdatedSignal.connect(cb); }
void setLoadState( U32 state ) { mLoadState = state; }
U32 getLoadState() { return mLoadState; }
static bool sIgnoreLoadedCallback;
std::vector<S32> mLodsQuery;
std::vector<S32> mLodsWithParsingError;
bool mHasDegenerate;
protected:
static void loadedCallback(LLModelLoader::scene& scene,LLModelLoader::model_list& model_list, S32 lod, void* opaque);
static void stateChangedCallback(U32 state, void* opaque);
static LLJoint* lookupJointByName(const std::string&, void* opaque);
static U32 loadTextures(LLImportMaterial& material, void* opaque);
private:
//Utility function for controller vertex compare
bool verifyCount( int expected, int result );
//Creates the dummy avatar for the preview window
void createPreviewAvatar( void );
//Accessor for the dummy avatar
LLVOAvatar* getPreviewAvatar( void ) { return mPreviewAvatar; }
// Count amount of original models, excluding sub-models
static U32 countRootModels(LLModelLoader::model_list models);
protected:
friend class LLModelLoader;
friend class LLFloaterModelPreview;
friend class LLFloaterModelPreview::DecompRequest;
friend class LLPhysicsDecomp;
LLFloater* mFMP;
LLPointer<LLViewerFetchedTexture> mUVGuideTexture; // <FS:Beq> Add UV Guide texture overlay
BOOL mNeedsUpdate;
bool mDirty;
bool mGenLOD;
U32 mTextureName;
F32 mCameraDistance;
F32 mCameraYaw;
F32 mCameraPitch;
F32 mCameraZoom;
LLVector3 mCameraOffset;
LLVector3 mPreviewTarget;
LLVector3 mPreviewScale;
S32 mPreviewLOD;
S32 mPhysicsSearchLOD;
U32 mResourceCost;
std::string mLODFile[LLModel::NUM_LODS];
bool mLoading;
U32 mLoadState;
bool mResetJoints;
bool mModelNoErrors;
std::map<std::string, bool> mViewOption;
//GLOD object parameters (must rebuild object if these change)
bool mLODFrozen;
F32 mBuildShareTolerance;
U32 mBuildQueueMode;
U32 mBuildOperator;
U32 mBuildBorderMode;
U32 mRequestedLoDMode[LLModel::NUM_LODS];
S32 mRequestedTriangleCount[LLModel::NUM_LODS];
F32 mRequestedErrorThreshold[LLModel::NUM_LODS];
U32 mRequestedBuildOperator[LLModel::NUM_LODS];
U32 mRequestedQueueMode[LLModel::NUM_LODS];
U32 mRequestedBorderMode[LLModel::NUM_LODS];
F32 mRequestedShareTolerance[LLModel::NUM_LODS];
F32 mRequestedCreaseAngle[LLModel::NUM_LODS];
LLModelLoader* mModelLoader;
LLModelLoader::scene mScene[LLModel::NUM_LODS];
LLModelLoader::scene mBaseScene;
LLModelLoader::model_list mModel[LLModel::NUM_LODS];
LLModelLoader::model_list mBaseModel;
typedef std::vector<LLVolumeFace> v_LLVolumeFace_t;
typedef std::vector<v_LLVolumeFace_t> vv_LLVolumeFace_t;
vv_LLVolumeFace_t mModelFacesCopy[LLModel::NUM_LODS];
vv_LLVolumeFace_t mBaseModelFacesCopy;
U32 mGroup;
std::map<LLPointer<LLModel>, U32> mObject;
U32 mMaxTriangleLimit;
LLMeshUploadThread::instance_list mUploadData;
std::set<LLViewerFetchedTexture * > mTextureSet;
//map of vertex buffers to models (one vertex buffer in vector per face in model
std::map<LLModel*, std::vector<LLPointer<LLVertexBuffer> > > mVertexBuffer[LLModel::NUM_LODS+1];
details_signal_t mDetailsSignal;
model_loaded_signal_t mModelLoadedSignal;
model_updated_signal_t mModelUpdatedSignal;
LLVector3 mModelPivot;
bool mHasPivot;
float mPelvisZOffset;
bool mRigValidJointUpload;
bool mLegacyRigValid;
bool mLastJointUpdate;
JointNameSet mJointsFromNode;
JointTransformMap mJointTransformMap;
LLPointer<LLVOAvatar> mPreviewAvatar;
joint_override_data_map_t mJointOverrides[LLModel::NUM_LODS];
};
#endif // LL_LLFLOATERMODELPREVIEW_H

View File

@ -33,7 +33,6 @@
#define LL_LLFLOATERWORLDMAP_H
#include "llfloater.h"
#include "llhudtext.h"
#include "llmapimagetype.h"
#include "lltracker.h"
#include "llslurl.h"

View File

@ -102,7 +102,7 @@ protected:
static void sortObjects();
LLHUDObject(const U8 type);
~LLHUDObject();
virtual ~LLHUDObject();
virtual void render() = 0;
virtual void renderForTimer() {};

View File

@ -607,7 +607,10 @@ S32 LLHUDText::getMaxLines()
void LLHUDText::markDead()
{
sTextObjects.erase(LLPointer<LLHUDText>(this));
// make sure we have at least one pointer
// till the end of the function
LLPointer<LLHUDText> ptr(this);
sTextObjects.erase(ptr);
LLHUDObject::markDead();
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,314 @@
/**
* @file llmodelpreview.h
* @brief LLModelPreview class definition, class
* responsible for model preview inside LLFloaterModelPreview
*
* $LicenseInfo:firstyear=2020&license=viewerlgpl$
* Second Life Viewer Source Code
* Copyright (C) 2020, Linden Research, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License only.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
#ifndef LL_LLMODELPREVIEW_H
#define LL_LLMODELPREVIEW_H
#include "lldynamictexture.h"
#include "llfloatermodelpreview.h"
#include "llmeshrepository.h"
#include "llmodelloader.h" //NUM_LOD
#include "llmodel.h"
class LLJoint;
class LLVOAvatar;
class LLTextBox;
class LLVertexBuffer;
class DAE;
class daeElement;
class domProfile_COMMON;
class domInstance_geometry;
class domNode;
class domTranslate;
class domController;
class domSkin;
class domMesh;
// const strings needed by classes that use model preivew
static const std::string lod_name[NUM_LOD + 1] =
{
"lowest",
"low",
"medium",
"high",
"I went off the end of the lod_name array. Me so smart."
};
static const std::string lod_triangles_name[NUM_LOD + 1] =
{
"lowest_triangles",
"low_triangles",
"medium_triangles",
"high_triangles",
"I went off the end of the lod_triangles_name array. Me so smart."
};
static const std::string lod_vertices_name[NUM_LOD + 1] =
{
"lowest_vertices",
"low_vertices",
"medium_vertices",
"high_vertices",
"I went off the end of the lod_vertices_name array. Me so smart."
};
static const std::string lod_status_name[NUM_LOD + 1] =
{
"lowest_status",
"low_status",
"medium_status",
"high_status",
"I went off the end of the lod_status_name array. Me so smart."
};
static const std::string lod_icon_name[NUM_LOD + 1] =
{
"status_icon_lowest",
"status_icon_low",
"status_icon_medium",
"status_icon_high",
"I went off the end of the lod_status_name array. Me so smart."
};
static const std::string lod_status_image[NUM_LOD + 1] =
{
"ModelImport_Status_Good",
"ModelImport_Status_Warning",
"ModelImport_Status_Error",
"I went off the end of the lod_status_image array. Me so smart."
};
static const std::string lod_label_name[NUM_LOD + 1] =
{
"lowest_label",
"low_label",
"medium_label",
"high_label",
"I went off the end of the lod_label_name array. Me so smart."
};
class LLModelPreview : public LLViewerDynamicTexture, public LLMutex
{
LOG_CLASS(LLModelPreview);
typedef boost::signals2::signal<void(F32 x, F32 y, F32 z, F32 streaming_cost, F32 physics_cost)> details_signal_t;
typedef boost::signals2::signal<void(void)> model_loaded_signal_t;
typedef boost::signals2::signal<void(bool)> model_updated_signal_t;
public:
typedef enum
{
LOD_FROM_FILE = 0,
GENERATE,
USE_LOD_ABOVE,
} eLoDMode;
public:
// Todo: model preview shouldn't need floater dependency, it
// should just expose data to floater, not control flaoter like it does
LLModelPreview(S32 width, S32 height, LLFloater* fmp);
virtual ~LLModelPreview();
void resetPreviewTarget();
void setPreviewTarget(F32 distance);
void setTexture(U32 name) { mTextureName = name; }
void setPhysicsFromLOD(S32 lod);
BOOL render();
void update();
void genBuffers(S32 lod, bool skinned);
void clearBuffers();
void refresh();
void rotate(F32 yaw_radians, F32 pitch_radians);
void zoom(F32 zoom_amt);
void pan(F32 right, F32 up);
virtual BOOL needsRender() { return mNeedsUpdate; }
void setPreviewLOD(S32 lod);
void clearModel(S32 lod);
void getJointAliases(JointMap& joint_map);
void loadModel(std::string filename, S32 lod, bool force_disable_slm = false);
void loadModelCallback(S32 lod);
bool lodsReady() { return !mGenLOD && mLodsQuery.empty(); }
void queryLODs() { mGenLOD = true; };
void genLODs(S32 which_lod = -1, U32 decimation = 3, bool enforce_tri_limit = false);
void generateNormals();
void restoreNormals();
U32 calcResourceCost();
void rebuildUploadData();
void saveUploadData(bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position);
void saveUploadData(const std::string& filename, bool save_skinweights, bool save_joint_positions, bool lock_scale_if_joint_position);
void clearIncompatible(S32 lod);
void updateStatusMessages();
void updateLodControls(S32 lod);
void clearGLODGroup();
void onLODParamCommit(S32 lod, bool enforce_tri_limit);
void addEmptyFace(LLModel* pTarget);
const bool getModelPivot(void) const { return mHasPivot; }
void setHasPivot(bool val) { mHasPivot = val; }
void setModelPivot(const LLVector3& pivot) { mModelPivot = pivot; }
//Is a rig valid so that it can be used as a criteria for allowing for uploading of joint positions
//Accessors for joint position upload friendly rigs
const bool isRigValidForJointPositionUpload(void) const { return mRigValidJointUpload; }
void setRigValidForJointPositionUpload(bool rigValid) { mRigValidJointUpload = rigValid; }
//Accessors for the legacy rigs
const bool isLegacyRigValid(void) const { return mLegacyRigFlags == 0; }
U32 getLegacyRigFlags() const { return mLegacyRigFlags; }
void setLegacyRigFlags(U32 rigFlags) { mLegacyRigFlags = rigFlags; }
static void textureLoadedCallback(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata);
static bool lodQueryCallback();
boost::signals2::connection setDetailsCallback(const details_signal_t::slot_type& cb){ return mDetailsSignal.connect(cb); }
boost::signals2::connection setModelLoadedCallback(const model_loaded_signal_t::slot_type& cb){ return mModelLoadedSignal.connect(cb); }
boost::signals2::connection setModelUpdatedCallback(const model_updated_signal_t::slot_type& cb){ return mModelUpdatedSignal.connect(cb); }
void setLoadState(U32 state) { mLoadState = state; }
U32 getLoadState() { return mLoadState; }
static bool sIgnoreLoadedCallback;
std::vector<S32> mLodsQuery;
std::vector<S32> mLodsWithParsingError;
bool mHasDegenerate;
protected:
static void loadedCallback(LLModelLoader::scene& scene, LLModelLoader::model_list& model_list, S32 lod, void* opaque);
static void stateChangedCallback(U32 state, void* opaque);
static LLJoint* lookupJointByName(const std::string&, void* opaque);
static U32 loadTextures(LLImportMaterial& material, void* opaque);
void lookupLODModelFiles(S32 lod);
private:
//Utility function for controller vertex compare
bool verifyCount(int expected, int result);
//Creates the dummy avatar for the preview window
void createPreviewAvatar(void);
//Accessor for the dummy avatar
LLVOAvatar* getPreviewAvatar(void) { return mPreviewAvatar; }
// Count amount of original models, excluding sub-models
static U32 countRootModels(LLModelLoader::model_list models);
protected:
friend class LLModelLoader;
friend class LLFloaterModelPreview;
friend class LLFloaterModelPreview::DecompRequest;
friend class LLPhysicsDecomp;
LLFloater* mFMP;
LLPointer<LLViewerFetchedTexture> mUVGuideTexture; // <FS:Beq> Add UV Guide texture overlay
BOOL mNeedsUpdate;
bool mDirty;
bool mGenLOD;
U32 mTextureName;
F32 mCameraDistance;
F32 mCameraYaw;
F32 mCameraPitch;
F32 mCameraZoom;
LLVector3 mCameraOffset;
LLVector3 mPreviewTarget;
LLVector3 mPreviewScale;
S32 mPreviewLOD;
S32 mPhysicsSearchLOD;
U32 mResourceCost;
std::string mLODFile[LLModel::NUM_LODS];
bool mLoading;
U32 mLoadState;
bool mResetJoints;
bool mModelNoErrors;
bool mLookUpLodFiles;
std::map<std::string, bool> mViewOption;
//GLOD object parameters (must rebuild object if these change)
bool mLODFrozen;
F32 mBuildShareTolerance;
U32 mBuildQueueMode;
U32 mBuildOperator;
U32 mBuildBorderMode;
U32 mRequestedLoDMode[LLModel::NUM_LODS];
S32 mRequestedTriangleCount[LLModel::NUM_LODS];
F32 mRequestedErrorThreshold[LLModel::NUM_LODS];
U32 mRequestedBuildOperator[LLModel::NUM_LODS];
U32 mRequestedQueueMode[LLModel::NUM_LODS];
U32 mRequestedBorderMode[LLModel::NUM_LODS];
F32 mRequestedShareTolerance[LLModel::NUM_LODS];
F32 mRequestedCreaseAngle[LLModel::NUM_LODS];
LLModelLoader* mModelLoader;
LLModelLoader::scene mScene[LLModel::NUM_LODS];
LLModelLoader::scene mBaseScene;
LLModelLoader::model_list mModel[LLModel::NUM_LODS];
LLModelLoader::model_list mBaseModel;
typedef std::vector<LLVolumeFace> v_LLVolumeFace_t;
typedef std::vector<v_LLVolumeFace_t> vv_LLVolumeFace_t;
vv_LLVolumeFace_t mModelFacesCopy[LLModel::NUM_LODS];
vv_LLVolumeFace_t mBaseModelFacesCopy;
U32 mGroup;
std::map<LLPointer<LLModel>, U32> mObject;
U32 mMaxTriangleLimit;
LLMeshUploadThread::instance_list mUploadData;
std::set<LLViewerFetchedTexture * > mTextureSet;
//map of vertex buffers to models (one vertex buffer in vector per face in model
std::map<LLModel*, std::vector<LLPointer<LLVertexBuffer> > > mVertexBuffer[LLModel::NUM_LODS + 1];
details_signal_t mDetailsSignal;
model_loaded_signal_t mModelLoadedSignal;
model_updated_signal_t mModelUpdatedSignal;
LLVector3 mModelPivot;
bool mHasPivot;
float mPelvisZOffset;
bool mRigValidJointUpload;
U32 mLegacyRigFlags;
bool mLastJointUpdate;
bool mFirstSkinUpdate;
JointNameSet mJointsFromNode;
JointTransformMap mJointTransformMap;
LLPointer<LLVOAvatar> mPreviewAvatar;
LLCachedControl<bool> mImporterDebug;
};
#endif // LL_LLMODELPREVIEW_H

View File

@ -232,6 +232,12 @@ BOOL LLLandmarksPanel::postBuild()
initMyInventoryPanel();
initLibraryInventoryPanel();
LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
if (accordion)
{
accordion->setSkipScrollToChild(true);
}
return TRUE;
}

View File

@ -5636,8 +5636,8 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
if (!node)
{
// <FS:Techwolf Lupindo> area search
FSAreaSearch* area_search_floater = LLFloaterReg::getTypedInstance<FSAreaSearch>("area_search");
if(!(area_search_floater && area_search_floater->isActive())) // Don't spam the log when areasearch is active.
FSAreaSearch* area_search_floater = LLFloaterReg::findTypedInstance<FSAreaSearch>("area_search");
if (!area_search_floater || !area_search_floater->isActive()) // Don't spam the log when areasearch is active.
{
// </FS:Techwolf Lupindo>
LL_WARNS() << "Couldn't find object " << id << " selected." << LL_ENDL;
@ -6146,11 +6146,15 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
F32 cur_zoom = gAgentCamera.mHUDCurZoom;
// set up transform to encompass bounding box of HUD
F32 aspect = LLViewerCamera::getInstance()->getAspect(); // <FS:Ansariel> Performance improvement
gGL.matrixMode(LLRender::MM_PROJECTION);
gGL.pushMatrix();
gGL.loadIdentity();
F32 depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
gGL.ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
// <FS:Ansariel> Performance improvement
//gGL.ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
gGL.ortho(-0.5f * aspect, 0.5f * aspect, -0.5f, 0.5f, 0.f, depth);
gGL.matrixMode(LLRender::MM_MODELVIEW);
gGL.pushMatrix();
@ -6163,7 +6167,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
}
bool wireframe_selection = (gFloaterTools && gFloaterTools->getVisible()) || LLSelectMgr::sRenderHiddenSelections;
F32 fogCfx = (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal() - gAgentCamera.getCameraPositionGlobal()).magVec() / (LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec() * 4), 0.0, 1.0);
F32 fogCfx = (F32)llclamp((getSelectionCenterGlobal() - gAgentCamera.getCameraPositionGlobal()).magVec() / (getBBoxOfSelection().getExtentLocal().magVec() * 4), 0.0, 1.0); // <FS:Ansariel> Performance improvement
static LLColor4 sParentColor = LLColor4(sSilhouetteParentColor[VRED], sSilhouetteParentColor[VGREEN], sSilhouetteParentColor[VBLUE], LLSelectMgr::sHighlightAlpha);
static LLColor4 sChildColor = LLColor4(sSilhouetteChildColor[VRED], sSilhouetteChildColor[VGREEN], sSilhouetteChildColor[VBLUE], LLSelectMgr::sHighlightAlpha);
@ -6243,7 +6247,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
if (mSelectedObjects->getNumNodes())
{
LLUUID inspect_item_id= LLUUID::null;
LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
LLFloaterInspect* inspect_instance = LLFloaterReg::findTypedInstance<LLFloaterInspect>("inspect");
if(inspect_instance && inspect_instance->getVisible())
{
inspect_item_id = inspect_instance->getSelectedUUID();
@ -6780,6 +6784,10 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &aColor)
LLVolume *volume = objectp->getVolume();
if (volume)
{
// <FS:Ansariel> Performance improvement
LLViewerCamera& camera = LLViewerCamera::instance();
LLSelectMgr& selectmgr = LLSelectMgr::instance();
F32 silhouette_thickness;
if (isAgentAvatarValid() && is_hud_object)
{
@ -6787,8 +6795,8 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &aColor)
}
else
{
LLVector3 view_vector = LLViewerCamera::getInstance()->getOrigin() - objectp->getRenderPosition();
silhouette_thickness = view_vector.magVec() * LLSelectMgr::sHighlightThickness * (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV());
LLVector3 view_vector = camera.getOrigin() - objectp->getRenderPosition();
silhouette_thickness = view_vector.magVec() * LLSelectMgr::sHighlightThickness * (camera.getView() / camera.getDefaultFOV());
}
F32 animationTime = (F32)LLFrameTimer::getElapsedSeconds();
@ -6806,10 +6814,10 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &aColor)
// </FS:Ansariel>
LLGLEnable fog(GL_FOG);
glFogi(GL_FOG_MODE, GL_LINEAR);
float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec();
LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgentCamera.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
float d = (camera.getPointOfInterest()-camera.getOrigin()).magVec();
LLColor4 fogCol = color * (F32)llclamp((selectmgr.getSelectionCenterGlobal()-gAgentCamera.getCameraPositionGlobal()).magVec()/(selectmgr.getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
glFogf(GL_FOG_START, d);
glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV())));
glFogf(GL_FOG_END, d*(1 + (camera.getView() / camera.getDefaultFOV())));
glFogfv(GL_FOG_COLOR, fogCol.mV);
// <FS:Ansariel> Don't use fixed functions when using shader renderer; found by Drake Arconis
}
@ -6928,7 +6936,7 @@ void dialog_refresh_all()
LLFloaterProperties::dirtyAll();
LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
LLFloaterInspect* inspect_instance = LLFloaterReg::findTypedInstance<LLFloaterInspect>("inspect");
if(inspect_instance)
{
inspect_instance->dirty();

View File

@ -231,6 +231,7 @@
#include "fsfloaterimcontainer.h"
#include "fsfloaternearbychat.h"
#include "fsfloatersearch.h"
#include "fsfloaterwearablefavorites.h"
#include "fslslbridge.h"
#include "fsradar.h"
#include "fsregistrarutils.h"
@ -3027,6 +3028,9 @@ bool idle_startup()
}
// </FS:TT>
// <FS:Ansariel> Favorite Wearables
FSFloaterWearableFavorites::initCategory();
// <FS:Ansariel> Bypass the calling card sync-crap to create the agent's calling card
LLFriendCardsManager::createAgentCallingCard();
@ -3802,7 +3806,7 @@ void LLStartUp::initNameCache()
cache_inst->setUseUsernames(gSavedSettings.getBOOL("NameTagShowUsernames"));
// <FS:CR> Legacy name/Username format
LLAvatarNameCache::getInstance()->setUseUsernames(gSavedSettings.getBOOL("NameTagShowUsernames"));
LLAvatarName::setUseLegacyFormat(gSavedSettings.getBOOL("FSNameTagShowLegacyUsernames"));
// <FS:CR> FIRE-6659: Legacy "Resident" name toggle
LLAvatarName::setTrimResidentSurname(gSavedSettings.getBOOL("FSTrimLegacyNames"));
}

View File

@ -281,6 +281,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LL_RECORD_BLOCK_TIME(FTM_RENDER);
LLViewerCamera& camera = LLViewerCamera::instance(); // <FS:Ansariel> Factor out calls to getInstance
if (gWindowResized)
{ //skip render on frames where window has been resized
LL_DEBUGS("Window") << "Resizing window" << LL_ENDL;
@ -493,10 +495,10 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
// If someone knows how to call "View.ZoomDefault" by hand, we should do that instead of
// replicating the behavior here. -Zi
LLViewerCamera::getInstance()->setDefaultFOV(DEFAULT_FIELD_OF_VIEW);
camera.setDefaultFOV(DEFAULT_FIELD_OF_VIEW);
if(gSavedSettings.getBOOL("FSResetCameraOnTP"))
{
gSavedSettings.setF32("CameraAngle", LLViewerCamera::getInstance()->getView()); // FS:LO Dont reset rightclick zoom when we teleport however. Fixes FIRE-6246.
gSavedSettings.setF32("CameraAngle", camera.getView()); // FS:LO Dont reset rightclick zoom when we teleport however. Fixes FIRE-6246.
}
// also, reset the marker for "currently zooming" in the mouselook zoom settings. -Zi
LLVector3 vTemp=gSavedSettings.getVector3("_NACL_MLFovValues");
@ -674,8 +676,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
//
LLAppViewer::instance()->pingMainloopTimeout("Display:Camera");
LLViewerCamera::getInstance()->setZoomParameters(zoom_factor, subfield);
LLViewerCamera::getInstance()->setNear(MIN_NEAR_PLANE);
camera.setZoomParameters(zoom_factor, subfield); // <FS:Ansariel> Factor out calls to getInstance
camera.setNear(MIN_NEAR_PLANE); // <FS:Ansariel> Factor out calls to getInstance
//////////////////////////
//
@ -753,7 +755,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LL_RECORD_BLOCK_TIME(FTM_EEP_UPDATE);
// update all the sky/atmospheric/water settings
LLEnvironment::instance().update(LLViewerCamera::getInstance());
LLEnvironment::instance().update(&camera); // <FS:Ansariel> Factor out calls to getInstance
}
// *TODO: merge these two methods
@ -782,7 +784,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER) ||
gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_VOIDWATER)))
{
if (LLViewerCamera::getInstance()->cameraUnderWater())
if (camera.cameraUnderWater()) // <FS:Ansariel> Factor out calls to getInstance
{
water_clip = -1;
}
@ -813,8 +815,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
static LLCullResult result;
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater();
gPipeline.updateCull(*LLViewerCamera::getInstance(), result, water_clip);
LLPipeline::sUnderWaterRender = camera.cameraUnderWater(); // <FS:Ansariel> Factor out calls to getInstance
gPipeline.updateCull(camera, result, water_clip); // <FS:Ansariel> Factor out calls to getInstance
stop_glerror();
LLGLState::checkStates();
@ -842,7 +844,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
if (gFrameCount > 1)
{ //for some reason, ATI 4800 series will error out if you
//try to generate a shadow before the first frame is through
gPipeline.generateSunShadow(*LLViewerCamera::getInstance());
gPipeline.generateSunShadow(camera); // <FS:Ansariel> Factor out calls to getInstance
}
LLVertexBuffer::unbind();
@ -883,8 +885,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
//if (!for_snapshot)
{
LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");
gPipeline.generateWaterReflection(*LLViewerCamera::getInstance());
gPipeline.generateHighlight(*LLViewerCamera::getInstance());
gPipeline.generateWaterReflection(camera); // <FS:Ansariel> Factor out calls to getInstance
gPipeline.generateHighlight(camera); // <FS:Ansariel> Factor out calls to getInstance
gPipeline.renderPhysicsDisplay();
}
@ -946,7 +948,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLAppViewer::instance()->pingMainloopTimeout("Display:StateSort");
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
gPipeline.stateSort(*LLViewerCamera::getInstance(), result);
gPipeline.stateSort(camera, result); // <FS:Ansariel> Factor out calls to getInstance
stop_glerror();
if (rebuild)
@ -1020,7 +1022,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// gGL.popMatrix();
//}
LLPipeline::sUnderWaterRender = LLViewerCamera::getInstance()->cameraUnderWater() ? TRUE : FALSE;
LLPipeline::sUnderWaterRender = camera.cameraUnderWater() ? TRUE : FALSE; // <FS:Ansariel> Factor out calls to getInstance
// <FS:CR> Aurora Sim
if (!LLWorld::getInstance()->getAllowRenderWater())
@ -1089,11 +1091,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
gGL.setColorMask(true, false);
if (LLPipeline::sRenderDeferred)
{
gPipeline.renderGeomDeferred(*LLViewerCamera::getInstance());
gPipeline.renderGeomDeferred(camera); // <FS:Ansariel> Factor out calls to getInstance
}
else
{
gPipeline.renderGeom(*LLViewerCamera::getInstance(), TRUE);
gPipeline.renderGeom(camera, TRUE); // <FS:Ansariel> Factor out calls to getInstance
}
gGL.setColorMask(true, true);
@ -1296,11 +1298,14 @@ void render_hud_attachments()
LLRect get_whole_screen_region()
{
// <FS:Ansariel> Factor out calls to getInstance
LLViewerCamera& camera = LLViewerCamera::instance();
LLRect whole_screen = gViewerWindow->getWorldViewRectScaled();
// apply camera zoom transform (for high res screenshots)
F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor();
S16 sub_region = LLViewerCamera::getInstance()->getZoomSubRegion();
F32 zoom_factor = camera.getZoomFactor(); // <FS:Ansariel> Factor out calls to getInstance
S16 sub_region = camera.getZoomSubRegion(); // <FS:Ansariel> Factor out calls to getInstance
if (zoom_factor > 1.f)
{
S32 num_horizontal_tiles = llceil(zoom_factor);
@ -1322,10 +1327,15 @@ bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::mat
LLBBox hud_bbox = gAgentAvatarp->getHUDBBox();
F32 hud_depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
proj = gl_ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth);
proj.element(2,2) = -0.01f;
// <FS:Ansariel> Factor out calls to getInstance
//proj = gl_ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth);
//proj.element(2,2) = -0.01f;
F32 aspect_ratio = LLViewerCamera::getInstance()->getAspect();
proj = gl_ortho(-0.5f * aspect_ratio, 0.5f * aspect_ratio, -0.5f, 0.5f, 0.f, hud_depth);
proj.element(2,2) = -0.01f;
// <//FS:Ansariel> Factor out calls to getInstance
glh::matrix4f mat;
F32 scale_x = (F32)gViewerWindow->getWorldViewWidthScaled() / (F32)screen_region.getWidth();
@ -1598,8 +1608,13 @@ void render_ui_2d()
// Menu overlays, HUD, etc
gViewerWindow->setup2DRender();
F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor();
S16 sub_region = LLViewerCamera::getInstance()->getZoomSubRegion();
// <FS:Ansariel> Factor out instance() call
//F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor();
//S16 sub_region = LLViewerCamera::getInstance()->getZoomSubRegion();
LLViewerCamera& camera = LLViewerCamera::instance();
F32 zoom_factor = camera.getZoomFactor();
S16 sub_region = camera.getZoomSubRegion();
LLVector2& ui_scale_factor = LLUI::getScaleFactor();
if (zoom_factor > 1.f)
{
@ -1620,7 +1635,9 @@ void render_ui_2d()
gGL.pushMatrix();
S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2);
S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2);
gGL.scalef(LLUI::getScaleFactor().mV[0], LLUI::getScaleFactor().mV[1], 1.f);
// <FS:Ansariel> Factor out instance() call
//gGL.scalef(LLUI::getScaleFactor().mV[0], LLUI::getScaleFactor().mV[1], 1.f);
gGL.scalef(ui_scale_factor.mV[0], ui_scale_factor.mV[1], 1.f);
gGL.translatef((F32)half_width, (F32)half_height, 0.f);
F32 zoom = gAgentCamera.mHUDCurZoom;
gGL.scalef(zoom,zoom,1.f);
@ -1663,10 +1680,15 @@ void render_ui_2d()
ui_inst->mDirtyRect = last_rect;
last_rect = t_rect;
last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / ui_inst->getScaleFactor().mV[0]);
last_rect.mRight = LLRect::tCoordType(last_rect.mRight / ui_inst->getScaleFactor().mV[0]);
last_rect.mTop = LLRect::tCoordType(last_rect.mTop / ui_inst->getScaleFactor().mV[1]);
last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / ui_inst->getScaleFactor().mV[1]);
// <FS:Ansariel> Factor out instance() call
//last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / ui_inst->getScaleFactor().mV[0]);
//last_rect.mRight = LLRect::tCoordType(last_rect.mRight / ui_inst->getScaleFactor().mV[0]);
//last_rect.mTop = LLRect::tCoordType(last_rect.mTop / ui_inst->getScaleFactor().mV[1]);
//last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / ui_inst->getScaleFactor().mV[1]);
last_rect.mLeft = LLRect::tCoordType(last_rect.mLeft / ui_scale_factor.mV[0]);
last_rect.mRight = LLRect::tCoordType(last_rect.mRight / ui_scale_factor.mV[0]);
last_rect.mTop = LLRect::tCoordType(last_rect.mTop / ui_scale_factor.mV[1]);
last_rect.mBottom = LLRect::tCoordType(last_rect.mBottom / ui_scale_factor.mV[1]);
LLRect clip_rect(last_rect);

View File

@ -572,7 +572,7 @@ class LLFileUploadModel : public view_listener_t
LLFloaterModelPreview* fmp = (LLFloaterModelPreview*) LLFloaterReg::getInstance("upload_model");
if (fmp && !fmp->isModelLoading())
{
fmp->loadModel(3);
fmp->loadHighLodModel();
}
return TRUE;

View File

@ -116,7 +116,7 @@ class LLViewerObject
public LLTrace::MemTrackable<LLViewerObject>
{
protected:
~LLViewerObject(); // use unref()
virtual ~LLViewerObject(); // use unref()
// TomY: Provide for a list of extra parameter structures, mapped by structure name
struct ExtraParameter

View File

@ -1913,23 +1913,26 @@ void LLViewerObjectList::clearAllMapObjectsInRegion(LLViewerRegion* regionp)
void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
{
LLColor4 above_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnAboveWater" );
LLColor4 below_water_color = LLUIColorTable::instance().getColor( "NetMapOtherOwnBelowWater" );
// <FS:Ansariel> Factor out calls to getInstance
LLUIColorTable& colortable = LLUIColorTable::instance();
LLColor4 above_water_color = colortable.getColor( "NetMapOtherOwnAboveWater" );
LLColor4 below_water_color = colortable.getColor( "NetMapOtherOwnBelowWater" );
LLColor4 you_own_above_water_color =
LLUIColorTable::instance().getColor( "NetMapYouOwnAboveWater" );
colortable.getColor( "NetMapYouOwnAboveWater" );
LLColor4 you_own_below_water_color =
LLUIColorTable::instance().getColor( "NetMapYouOwnBelowWater" );
colortable.getColor( "NetMapYouOwnBelowWater" );
LLColor4 group_own_above_water_color =
LLUIColorTable::instance().getColor( "NetMapGroupOwnAboveWater" );
colortable.getColor( "NetMapGroupOwnAboveWater" );
LLColor4 group_own_below_water_color =
LLUIColorTable::instance().getColor( "NetMapGroupOwnBelowWater" );
colortable.getColor( "NetMapGroupOwnBelowWater" );
// <FS:CR> FIRE-1846: Firestorm netmap enhancements
LLColor4 you_own_physical_color = LLUIColorTable::instance().getColor ( "NetMapYouPhysical", LLColor4::red );
LLColor4 group_own_physical_color = LLUIColorTable::instance().getColor ( "NetMapGroupPhysical", LLColor4::green );
LLColor4 other_own_physical_color = LLUIColorTable::instance().getColor ( "NetMapOtherPhysical", LLColor4::green );
LLColor4 scripted_object_color = LLUIColorTable::instance().getColor ( "NetMapScripted", LLColor4::orange );
LLColor4 temp_on_rez_object_color = LLUIColorTable::instance().getColor ( "NetMapTempOnRez", LLColor4::orange );
LLColor4 you_own_physical_color = colortable.getColor ( "NetMapYouPhysical", LLColor4::red );
LLColor4 group_own_physical_color = colortable.getColor ( "NetMapGroupPhysical", LLColor4::green );
LLColor4 other_own_physical_color = colortable.getColor ( "NetMapOtherPhysical", LLColor4::green );
LLColor4 scripted_object_color = colortable.getColor ( "NetMapScripted", LLColor4::orange );
LLColor4 temp_on_rez_object_color = colortable.getColor ( "NetMapTempOnRez", LLColor4::orange );
static LLCachedControl<bool> fs_netmap_physical(gSavedSettings, "FSNetMapPhysical", false);
static LLCachedControl<bool> fs_netmap_scripted(gSavedSettings, "FSNetMapScripted", false);
static LLCachedControl<bool> fs_netmap_temp_on_rez(gSavedSettings, "FSNetMapTempOnRez", false);

View File

@ -2869,7 +2869,6 @@ void LLViewerWindow::draw()
LLUI::setLineWidth(1.f);
LLUI::setLineWidth(1.f);
// Reset any left-over transforms
gGL.matrixMode(LLRender::MM_MODELVIEW);
@ -2914,14 +2913,16 @@ void LLViewerWindow::draw()
gGL.pushMatrix();
LLUI::pushMatrix();
{
// <FS:Ansariel> Factor out instance() call
LLViewerCamera& camera = LLViewerCamera::instance();
// scale view by UI global scale factor and aspect ratio correction factor
gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);
LLVector2 old_scale_factor = LLUI::getScaleFactor();
// apply camera zoom transform (for high res screenshots)
F32 zoom_factor = LLViewerCamera::getInstance()->getZoomFactor();
S16 sub_region = LLViewerCamera::getInstance()->getZoomSubRegion();
F32 zoom_factor = camera.getZoomFactor(); // <FS:Ansariel> Factor out instance() call
S16 sub_region = camera.getZoomSubRegion(); // <FS:Ansariel> Factor out instance() call
if (zoom_factor > 1.f)
{
//decompose subregion number to x and y values
@ -2955,7 +2956,7 @@ void LLViewerWindow::draw()
static LLUICachedControl<U32> userPresetHAlign("ExodusMouselookTextHAlign", 2);
LLVector3d myPosition = gAgentCamera.getCameraPositionGlobal();
LLQuaternion myRotation = LLViewerCamera::getInstance()->getQuaternion();
LLQuaternion myRotation = camera.getQuaternion();
myRotation.set(-myRotation.mQ[VX], -myRotation.mQ[VY], -myRotation.mQ[VZ], myRotation.mQ[VW]);
@ -2968,6 +2969,8 @@ void LLViewerWindow::draw()
S32 length = avatars.size();
if (length)
{
LGGContactSets& contact_sets = LGGContactSets::instance();
for (S32 i = 0; i < length; i++)
{
LLUUID& targetKey = avatars[i];
@ -2983,10 +2986,10 @@ void LLViewerWindow::draw()
}
LLColor4 targetColor = map_avatar_color.get();
targetColor = LGGContactSets::getInstance()->colorize(targetKey, targetColor, LGG_CS_MINIMAP);
targetColor = contact_sets.colorize(targetKey, targetColor, LGG_CS_MINIMAP);
//color based on contact sets prefs
LGGContactSets::getInstance()->hasFriendColorThatShouldShow(targetKey, LGG_CS_MINIMAP, targetColor);
contact_sets.hasFriendColorThatShouldShow(targetKey, LGG_CS_MINIMAP, targetColor);
LLColor4 mark_color;
if (LLNetMap::getAvatarMarkColor(targetKey, mark_color))
@ -3091,13 +3094,12 @@ void LLViewerWindow::draw()
//#endif
}
//-TT Window Title Access
// <FS:TT> Window Title Access
void LLViewerWindow::setTitle(const std::string& win_title)
{
mWindow->setTitle(win_title);
}
//-TT
// </FS:TT>
// Takes a single keyup event, usually when UI is visible
BOOL LLViewerWindow::handleKeyUp(KEY key, MASK mask)

View File

@ -1704,13 +1704,16 @@ void LLVOAvatar::renderCollisionVolumes()
}
}
void LLVOAvatar::renderBones()
void LLVOAvatar::renderBones(const std::string &selected_joint)
{
LLGLEnable blend(GL_BLEND);
avatar_joint_list_t::iterator iter = mSkeleton.begin();
avatar_joint_list_t::iterator end = mSkeleton.end();
avatar_joint_list_t::iterator end = mSkeleton.end();
// For selected joints
static LLVector3 SELECTED_COLOR_OCCLUDED(1.0f, 1.0f, 0.0f);
static LLVector3 SELECTED_COLOR_VISIBLE(0.5f, 0.5f, 0.5f);
// For bones with position overrides defined
static LLVector3 OVERRIDE_COLOR_OCCLUDED(1.0f, 0.0f, 0.0f);
static LLVector3 OVERRIDE_COLOR_VISIBLE(0.5f, 0.5f, 0.5f);
@ -1737,7 +1740,18 @@ void LLVOAvatar::renderBones()
LLVector3 pos;
LLUUID mesh_id;
if (jointp->hasAttachmentPosOverride(pos,mesh_id))
F32 sphere_scale = SPHERE_SCALEF;
// We are in render, so it is preferable to implement selection
// in a different way, but since this is for debug/preview, this
// is low priority
if (jointp->getName() == selected_joint)
{
sphere_scale *= 16.f;
occ_color = SELECTED_COLOR_OCCLUDED;
visible_color = SELECTED_COLOR_VISIBLE;
}
else if (jointp->hasAttachmentPosOverride(pos,mesh_id))
{
occ_color = OVERRIDE_COLOR_OCCLUDED;
visible_color = OVERRIDE_COLOR_VISIBLE;
@ -1758,7 +1772,6 @@ void LLVOAvatar::renderBones()
LLVector3 begin_pos(0,0,0);
LLVector3 end_pos(jointp->getEnd());
F32 sphere_scale = SPHERE_SCALEF;
gGL.pushMatrix();
gGL.multMatrix( &jointp->getXform()->getWorldMatrix().mMatrix[0][0] );

View File

@ -468,7 +468,7 @@ public:
F32 getLastSkinTime() { return mLastSkinTime; }
U32 renderTransparent(BOOL first_pass);
void renderCollisionVolumes();
void renderBones();
void renderBones(const std::string &selected_joint = std::string());
void renderJoints();
static void deleteCachedImages(bool clearAll=true);
static void destroyGL();

View File

@ -1845,6 +1845,12 @@ bool LLVivoxVoiceClient::waitForChannel()
return false;
}
if (sShuttingDown)
{
logoutOfVivox(true);
return false;
}
if (LLVoiceClient::instance().getVoiceEffectEnabled())
{
retrieveVoiceFonts();

View File

@ -518,7 +518,10 @@ void LLVOSky::init()
void LLVOSky::calc()
{
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
// <FS:Ansariel> Factor out instance() calls
LLEnvironment& environment = LLEnvironment::instance();
LLSettingsSky::ptr_t psky = environment.getCurrentSky(); // <FS:Ansariel> Factor out instance() calls
// invariants across whole sky tex process...
m_atmosphericsVars.blue_density = psky->getBlueDensity();
@ -528,7 +531,7 @@ void LLVOSky::calc()
m_atmosphericsVars.density_multiplier = psky->getDensityMultiplier();
m_atmosphericsVars.distance_multiplier = psky->getDistanceMultiplier();
m_atmosphericsVars.max_y = psky->getMaxY();
m_atmosphericsVars.sun_norm = LLEnvironment::instance().getClampedSunNorm();
m_atmosphericsVars.sun_norm = environment.getClampedSunNorm(); // <FS:Ansariel> Factor out instance() calls
m_atmosphericsVars.sunlight = psky->getIsSunUp() ? psky->getSunlightColor() : psky->getMoonlightColor();
m_atmosphericsVars.ambient = psky->getAmbientColor();
m_atmosphericsVars.glow = psky->getGlow();
@ -1096,8 +1099,11 @@ BOOL LLVOSky::updateGeometry(LLDrawable *drawable)
bool draw_sun = updateHeavenlyBodyGeometry(drawable, mSunScale, FACE_SUN, mSun, up, right);
bool draw_moon = updateHeavenlyBodyGeometry(drawable, mMoonScale, FACE_MOON, mMoon, up, right);
draw_sun &= LLEnvironment::getInstance()->getIsSunUp();
draw_moon &= LLEnvironment::getInstance()->getIsMoonUp();
// <FS:Ansariel> Factor out instance() calls
LLEnvironment& environment = LLEnvironment::instance();
draw_sun &= environment.getIsSunUp(); // <FS:Ansariel> Factor out instance() calls
draw_moon &= environment.getIsMoonUp(); // <FS:Ansariel> Factor out instance() calls
mSun.setDraw(draw_sun);
mMoon.setDraw(draw_moon);

View File

@ -815,6 +815,11 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
LL_RECORD_BLOCK_TIME(FTM_VOLUME_TEXTURES);
// Update the pixel area of all faces
if (mDrawable.isNull())
{
return;
}
if(!forced)
{
if(!isVisible())
@ -2521,10 +2526,13 @@ bool LLVOVolume::notifyAboutCreatingTexture(LLViewerTexture *texture)
} //if
} //for
// <FS:Ansariel> Factor out instance() calls
LLMaterialMgr& mmgr = LLMaterialMgr::instance();
//setup new materials
for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it)
{
LLMaterialMgr::getInstance()->put(getID(), it->first, *it->second);
mmgr.put(getID(), it->first, *it->second); // <FS:Ansariel> Factor out instance() calls
LLViewerObject::setTEMaterialParams(it->first, it->second);
}
@ -2600,10 +2608,13 @@ bool LLVOVolume::notifyAboutMissingAsset(LLViewerTexture *texture)
} //switch
} //for
// <FS:Ansariel> Factor out instance() calls
LLMaterialMgr& mmgr = LLMaterialMgr::instance();
//setup new materials
for(map_te_material::const_iterator it = new_material.begin(), end = new_material.end(); it != end; ++it)
{
LLMaterialMgr::getInstance()->setLocalMaterial(getRegion()->getRegionID(), it->second);
mmgr.setLocalMaterial(getRegion()->getRegionID(), it->second); // <FS:Ansariel> Factor out instance() calls
LLViewerObject::setTEMaterialParams(it->first, it->second);
}

View File

@ -139,27 +139,35 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
// search_label += LLTrans::getString("worn");
// item_state = IS_WORN;
//}
if (mWornIndicationEnabled && get_is_item_worn(mInventoryItemUUID))
if (mWornIndicationEnabled)
{
std::string attachment_point_name;
if (getType() != LLAssetType::AT_OBJECT || !isAgentAvatarValid()) // System layer or error condition, can't figure out attach point
if (getType() == LLAssetType::AT_OBJECT && get_is_item_worn(mInventoryItemUUID))
{
std::string attachment_point_name;
if (!isAgentAvatarValid())
{
search_label += LLTrans::getString("worn");
}
else if (gAgentAvatarp->getAttachedPointName(mInventoryItemUUID, attachment_point_name))
{
LLStringUtil::format_map_t args;
args["[ATTACHMENT_POINT]"] = LLTrans::getString(attachment_point_name);
search_label += LLTrans::getString("WornOnAttachmentPoint", args);
}
else
{
LLStringUtil::format_map_t args;
args["[ATTACHMENT_ERROR]"] = LLTrans::getString(attachment_point_name);
search_label += LLTrans::getString("AttachmentErrorMessage", args);
}
item_state = LLAppearanceMgr::instance().isLinkedInCOF(mInventoryItemUUID) ? IS_WORN : IS_MISMATCH;
}
else if (getType() != LLAssetType::AT_OBJECT && LLAppearanceMgr::instance().isLinkedInCOF(mInventoryItemUUID))
{
search_label += LLTrans::getString("worn");
item_state = IS_WORN;
}
else if (gAgentAvatarp->getAttachedPointName(mInventoryItemUUID, attachment_point_name))
{
LLStringUtil::format_map_t args;
args["[ATTACHMENT_POINT]"] = LLTrans::getString(attachment_point_name);
search_label += LLTrans::getString("WornOnAttachmentPoint", args);
}
else
{
LLStringUtil::format_map_t args;
args["[ATTACHMENT_ERROR]"] = LLTrans::getString(attachment_point_name);
search_label += LLTrans::getString("AttachmentErrorMessage", args);
}
item_state = LLAppearanceMgr::instance().isLinkedInCOF(mInventoryItemUUID) ? IS_WORN : IS_MISMATCH;
}
// </FS:Ansariel>

View File

@ -2505,6 +2505,9 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
LL_RECORD_BLOCK_TIME(FTM_CULL);
// <FS:Ansariel> Factor out instance() call
LLWorld& world = LLWorld::instance();
grabReferences(result);
sCull->clear();
@ -2564,8 +2567,8 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
camera.disableUserClipPlane();
}
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
for (LLWorld::region_list_t::const_iterator iter = world.getRegionList().begin(); // <FS:Ansariel> Factor out instance() call
iter != world.getRegionList().end(); ++iter)
{
LLViewerRegion* region = *iter;
@ -2630,7 +2633,7 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl
if (render_water)
{
LLWorld::getInstance()->precullWaterObjects(camera, sCull, render_water);
world.precullWaterObjects(camera, sCull, render_water); // <FS:Ansariel> Factor out instance() call
}
gGL.matrixMode(LLRender::MM_PROJECTION);
@ -3061,8 +3064,9 @@ void LLPipeline::rebuildGroups()
if (!group->isDead())
{
group->rebuildGeom();
if (group->getSpatialPartition()->mRenderByGroup)
// <FS:Beq> defend against occasional crash due to null SP
// if(group->getSpatialPartition()->mRenderByGroup)
if(group->getSpatialPartition() && (group->getSpatialPartition()->mRenderByGroup))
{
count++;
}
@ -6160,7 +6164,7 @@ void LLPipeline::setupAvatarLights(bool for_edit)
}
}
F32 backlight_mag;
if (LLEnvironment::instance().getIsSunUp())
if (environment.getIsSunUp()) // <FS:Ansariel> Factor out instance() calls
{
backlight_mag = BACKLIGHT_DAY_MAGNITUDE_OBJECT;
}
@ -6704,7 +6708,7 @@ void LLPipeline::enableLightsDynamic()
{
gPipeline.enableLightsAvatar();
}
else if (gAgentAvatarp->mSpecialRenderMode >= 1) // anim preview
else if (gAgentAvatarp->mSpecialRenderMode == 2) // anim preview
{
gPipeline.enableLightsAvatarEdit(LLColor4(0.7f, 0.6f, 0.3f, 1.f));
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 534 B

After

Width:  |  Height:  |  Size: 307 B

View File

@ -723,6 +723,7 @@ with the same filename but different name
<texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Right_Flashing" file_name="containers/TabTop_Right_Flashing.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Middle_Off" file_name="containers/TabTop_Middle_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
<texture name="TabTop_Middle_Selected" file_name="containers/TabTop_Middle_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
<texture name="TabTop_Left_Off" file_name="containers/TabTop_Left_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />

View File

@ -15,13 +15,18 @@
<string name="inactive_combo_text">
Voreinstellung...
</string>
<panel name="controls">
<panel name="zoom">
<joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/>
<slider_bar name="zoom_slider" tool_tip="Kamera auf Fokus zoomen"/>
<joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
</panel>
<panel name="zoom">
<layout_stack name="camera_view_layout_stack">
<layout_panel name="camera_rotate_layout_panel">
<joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/>
</layout_panel>
<layout_panel name="camera_zoom_layout_panel">
<slider_bar name="zoom_slider" tool_tip="Kamera auf Fokus zoomen"/>
</layout_panel>
<layout_panel name="panel_track">
<joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
</layout_panel>
</layout_stack>
</panel>
<panel name="buttons_panel">
<panel_camera_item name="front_view" tool_tip="Frontalansicht">
@ -50,9 +55,11 @@
</panel_camera_item>
<button label="Position..." name="camera_position_btn"/>
</panel>
<combo_box name="preset_combo">
<combo_box.item label="Voreinstellung verw." name="Use preset"/>
</combo_box>
<button name="gear_btn" tool_tip="Kamera-Voreinstellungen"/>
<button name="save_preset_btn" tool_tip="Als Voreinstellung speichern"/>
<panel name="preset_buttons_panel">
<combo_box name="preset_combo">
<combo_box.item label="Voreinstellung verw." name="Use preset"/>
</combo_box>
<button name="gear_btn" tool_tip="Kamera-Voreinstellungen"/>
<button name="save_preset_btn" tool_tip="Als Voreinstellung speichern"/>
</panel>
</floater>

View File

@ -88,6 +88,22 @@
<string name="tbd">
folgt
</string>
<string name="TooManyJoint">
Skinning wurde wegen zu vieler Gelenke deaktiviert: [JOINTS], Maximum: [MAX]
</string>
<string name="UnrecognizedJoint">
Geriggt an einem unbekannten Gelenk: [NAME]
</string>
<string name="UnknownJoints">
Skinning wurde wegen [COUNT] unbekannter Gelenke deaktiviert.
</string>
<string name="ModelLoaded">
Modell [MODEL_NAME] wurde geladen.
</string>
<string name="IncompleteTC">
Daten für Textur-Koordinaten sind unvollständig.
</string>
<panel name="left_panel">
<panel name="model_name_representation_panel">
<text name="name_label">
@ -282,6 +298,19 @@
</panel>
</panel>
<panel label="Hochladeoptionen" name="modifiers_panel">
<text name="scale_label">
Skalierung (1=keine):
</text>
<spinner name="import_scale" value="1.0"/>
<text name="dimensions_label">
Dimensionen:
</text>
<text name="import_dimensions">
[X] X [Y] X [Z]
</text>
<check_box label="Texturen einschließen" name="upload_textures"/>
</panel>
<panel label="Übersteuerung" title="Avatar" name="rigging_panel">
<text name="scale_label">
Skalierung (1=keine):
</text>
@ -296,9 +325,9 @@
<text name="include_label">
Nur für Avatarmodelle:
</text>
<check_box label="Skingewicht einschließen" name="upload_skin"/>
<check_box label="Gelenkpositionen einschließen" name="upload_joints"/>
<check_box label="Skala sperren, wenn Gelenkposition definiert ist" name="lock_scale_if_joint_position"/>
<check_box label="Skingewicht einschließen" name="upload_skin" top_pad="0"/>
<check_box label="Gelenkpositionen einschließen" name="upload_joints" top_pad="2"/>
<check_box label="Skala sperren, wenn Gelenkposition definiert ist" name="lock_scale_if_joint_position" top_pad="15"/>
<check_box label="An Avatarform anpassen" name="deform"/>
<radio_group name="deform_base">
<radio_item label="Mann" name="0"/>
@ -309,8 +338,29 @@
Z-Offset (Av. anheben / senken):
</text>
<spinner name="pelvis_offset" value="0.0"/>
<panel name="avatar_model_hint_panel">
<text name="avatar_model_hint_text">
<text name="skin_too_many_joints" text_color="Orange">
Zu viele skingewichtete Gelenke
</text>
<text name="skin_unknown_joint">
Modell hat unbekannte Gelenke
</text>
<text name="joints_descr">
Gelenke:
</text>
<text name="conflicts_description">
[CONFLICTS] Konflikte in [JOINTS_COUNT] Gelenk(e)
</text>
<text name="pos_overrides_descr">
Position übersteuert für Gelenk '[JOINT]':
</text>
<scroll_list name="pos_overrides_list">
<scroll_list.columns label="Modell" name="model_name"/>
<scroll_list.columns label="X" name="axis_x"/>
<scroll_list.columns label="Y" name="axis_y"/>
<scroll_list.columns label="Z" name="axis_z"/>
</scroll_list>
<panel name="avatar_model_hint_panel" left="380" width="230">
<text name="avatar_model_hint_text" width="220">
Hinweis:
Zu viele Objekte nutzen unnötigerweise den Standard-Anhängepunkt (Rechte Hand).
@ -318,6 +368,9 @@ Bitte ziehen Sie einen anderen Anhängepunkt nahe der Objektposition in Betracht
</text>
</panel>
</panel>
<panel label="Protokoll" name="logs_panel">
<check_box label="Detailliertes Log anzeigen" name="verbose_logging"/>
</panel>
</tab_container>
<panel name="weights_and_warning_panel">
<button label="Gewichte und Gebühr berechnen" name="calculate_btn" tool_tip="Gewichte und Gebühr berechnen" width="200"/>
@ -339,7 +392,7 @@ Bitte ziehen Sie einen anderen Anhängepunkt nahe der Objektposition in Betracht
<text name="server_weight">
Server: [SIM]
</text>
<panel name="physics_costs_panel">
<panel name="price_breakdown_panel">
<text name="price_breakdown_title">
Kosten-Aufstellung
</text>
@ -360,7 +413,7 @@ Niedrig:
Niedrigste:
</text>
-->
<panel name="physics_breakdown_panel">
<panel name="physics_costs_panel">
<text name="physics_breakdown_title">
Physik-Kosten
</text>
@ -373,53 +426,39 @@ Analysiert:
<panel name="preview_controls_panel">
<panel name="preview_controls_inner_panel">
<text name="preview_controls_title">
Vorschau-Einstellungen:
Vorschau-Kontrollen
</text>
<combo_box name="preview_lod_combo" tool_tip="Detailstufe zur Anzeige in Vorschaudarstellung">
<combo_item name="high">
Hoch
</combo_item>
<combo_item name="medium">
Mittel
</combo_item>
<combo_item name="low">
Niedrig
</combo_item>
<combo_item name="lowest">
Niedrigste
</combo_item>
<combo_box name="preview_lod_combo" tool_tip="Dargestelltes LOD in der Vorschau">
<combo_item name="high">Hoch</combo_item>
<combo_item name="medium">Mittel</combo_item>
<combo_item name="low">Niedrig</combo_item>
<combo_item name="lowest">Niedrigstes </combo_item>
</combo_box>
</panel>
<text name="label_display">
Anzeige...
</text>
<check_box label="Kanten" name="show_edges"/>
<check_box label="Texturen" name="show_textures"/>
<check_box label="UV-Hilfe" name="show_uv_guide"/>
<check_box label="Physik" name="show_physics"/>
<check_box label="Skingew." name="show_skin_weight"/>
<check_box label="Gelenke" name="show_joint_positions"/>
<text name="exploder_label" width="105">
Vorschaudehnung:
</text>
<slider name="physics_explode" width="80"/>
<slider name="physics_explode" width="75" />
<check_box label="Gelenk Position." name="show_joint_positions"/>
<check_box label="Gelenkposition-Übersteuerung" name="show_joint_overrides"/>
<check_box label="Skingew." name="show_skin_weight"/>
</panel>
<text name="warning_title" width="60">
HINWEIS:
</text>
<text name="warning_message">
Sie haben keine Berechtigung zum Hochladen von Netzmodellen. [[VURL] Weitere Infos], wie Sie sich zertifizieren lassen können.
Sie haben keine Berechtigung zum Hochladen von Netzmodellen. [[VURL] Infos] zur Zertifizierung.
</text>
<text name="status">
[STATUS]
</text>
</panel>
</panel>
<panel name="right_panel">
<text name="lod_label">
Vorschau:
</text>
</panel>
<panel name="lower_right_panel">
</panel>
<text name="lod_label">
Vorschau:
</text>
</floater>

View File

@ -38,6 +38,7 @@
<combo_box.item label="Flug-Assistent: Extremer Boost" name="flight_extreme"/>
</combo_box>
<slider label="Überblendzeit für Umgebungseinstellungen:" tool_tip="Intervall in Sekunden in dem Änderungen an den Umgebungseinstellungen ineinander überblenden. 0 = direkt ohne Verzögerung" name="manual_environment_change_transition_period"/>
<check_box name="EnvironmentPersistAcrossLogin" label="Sitzungsübergreifende Umgebungseinstellungen aktivieren" tool_tip="Stellt die aktuellen Umgebungseinstellungen nach einem erneuten Login wieder her."/>
</panel>
<!--Protection-->

View File

@ -1,273 +1,297 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
legacy_header_height="0"
header_height="0"
bg_opaque_image="Window_NoTitle_Foreground"
bg_alpha_image="Window_NoTitle_Foreground"
positioning="specified"
right="-460"
bottom="-50"
follows="left|bottom"
can_minimize="false"
can_close="true"
height="165"
layout="topleft"
name="camera_floater"
help_topic="camera_floater"
save_visibility="true"
show_title="false"
single_instance="true"
title="Camera Controls"
chrome="true"
save_rect="true"
width="195">
<floater.string
name="rotate_tooltip">
legacy_header_height="0"
header_height="0"
bg_opaque_image="Window_NoTitle_Foreground"
bg_alpha_image="Window_NoTitle_Foreground"
right="-460"
bottom="-50"
can_dock="false"
can_minimize="false"
can_resize="true"
can_close="false"
chrome="true"
follows="bottom"
height="135"
min_height="135"
layout="topleft"
name="camera_floater"
title="Camera Controls"
help_topic="camera_floater"
save_rect="true"
save_visibility="true"
show_title="false"
single_instance="true"
width="150"
min_width="130">
<floater.string name="rotate_tooltip">
Rotate Camera Around Focus
</floater.string>
<floater.string
name="zoom_tooltip">
</floater.string>
<floater.string name="zoom_tooltip">
Zoom Camera Towards Focus
</floater.string>
<floater.string
name="move_tooltip">
</floater.string>
<floater.string name="move_tooltip">
Move Camera Up and Down, Left and Right
</floater.string>
<floater.string
name="free_mode_title">
</floater.string>
<floater.string name="free_mode_title">
View Object
</floater.string>
<string name="inactive_combo_text">Use preset</string>
<panel
border="false"
follows="top|left"
height="110"
layout="topleft"
left="2"
top_pad="0"
mouse_opaque="false"
name="controls"
width="190">
<!--TODO: replace + - images -->
<panel
border="false"
class="camera_zoom_panel"
bottom="-1"
layout="topleft"
left="0"
mouse_opaque="false"
name="zoom"
top="0"
width="190">
<joystick_rotate
follows="top|left"
height="78"
layout="topleft"
left="2"
name="cam_rotate_stick"
quadrant="left"
sound_flags="3"
visible="true"
tool_tip="Orbit camera around focus"
top="25"
width="78" />
<button
follows="top|left"
height="18"
image_disabled="AddItem_Disabled"
image_selected="AddItem_Press"
image_unselected="AddItem_Off"
layout="topleft"
left_pad="4"
name="zoom_plus_btn"
width="18"
top="23">
<commit_callback
function="Zoom.plus" />
<mouse_held_callback
function="Zoom.plus" />
</button>
<slider_bar
height="50"
layout="topleft"
name="zoom_slider"
orientation="vertical"
tool_tip="Zoom camera toward focus"
top_pad="0"
min_val="0"
max_val="1"
width="18">
<commit_callback function="Slider.value_changed"/>
</slider_bar>
<button
follows="top|left"
height="18"
image_disabled="MinusItem_Disabled"
image_selected="MinusItem_Press"
image_unselected="MinusItem_Off"
layout="topleft"
name="zoom_minus_btn"
top_pad="0"
width="18">
<commit_callback
function="Zoom.minus" />
<mouse_held_callback
function="Zoom.minus" />
</button>
<joystick_track
follows="top|left"
height="78"
image_selected="Cam_Tracking_In"
image_unselected="Cam_Tracking_Out"
layout="topleft"
left_pad="4"
name="cam_track_stick"
quadrant="left"
scale_image="false"
sound_flags="3"
tool_tip="Move camera up and down, left and right"
top="25"
width="78"/>
</panel>
</panel>
<panel
follows="all"
height="27"
layout="topleft"
left="2"
name="buttons_panel"
top_pad="0"
width="190">
</floater.string>
<string name="inactive_combo_text">Use preset</string>
<panel
follows="top|left"
height="25"
layout="topleft"
left="2"
name="buttons_panel"
width="120"
top_pad="-5">
<panel_camera_item
name="front_view"
tool_tip="Front View"
width="18"
left="2">
name="front_view"
tool_tip="Front View"
width="18"
left="2">
<panel_camera_item.mousedown_callback
function="CameraPresets.ChangeView"
parameter="Front View" />
<panel_camera_item.picture
image_name="Cam_Preset_Front_Off" />
<panel_camera_item.selected_picture
image_name="Cam_Preset_Front_On" />
function="CameraPresets.ChangeView"
parameter="Front View" />
<panel_camera_item.picture image_name="Cam_Preset_Front_Off" />
<panel_camera_item.selected_picture image_name="Cam_Preset_Front_On" />
</panel_camera_item>
<panel_camera_item
name="group_view"
tool_tip="Side View"
width="18"
left_pad="2">
name="group_view"
tool_tip="Side View"
width="18"
left_pad="2">
<panel_camera_item.mousedown_callback
function="CameraPresets.ChangeView"
parameter="Side View" />
<panel_camera_item.picture
image_name="Cam_Preset_Side_Off" />
<panel_camera_item.selected_picture
image_name="Cam_Preset_Side_On" />
function="CameraPresets.ChangeView"
parameter="Side View" />
<panel_camera_item.picture image_name="Cam_Preset_Side_Off" />
<panel_camera_item.selected_picture image_name="Cam_Preset_Side_On" />
</panel_camera_item>
<panel_camera_item
name="rear_view"
tool_tip="Rear View"
width="18"
left_pad="2">
<panel_camera_item.mousedown_callback
function="CameraPresets.ChangeView"
name="rear_view"
tool_tip="Rear View"
parameter="Rear View" />
<panel_camera_item.picture
image_name="Cam_Preset_Back_Off" />
<panel_camera_item.selected_picture
image_name="Cam_Preset_Back_On" />
width="18"
left_pad="2">
<panel_camera_item.mousedown_callback
function="CameraPresets.ChangeView"
tool_tip="Rear View"
parameter="Rear View" />
<panel_camera_item.picture image_name="Cam_Preset_Back_Off" />
<panel_camera_item.selected_picture image_name="Cam_Preset_Back_On" />
</panel_camera_item>
<panel_camera_item
name="object_view"
tool_tip="Object View"
width="18"
left_pad="2">
<panel_camera_item.mousedown_callback
<panel_camera_item.mousedown_callback
function="CameraPresets.ChangeView"
parameter="object_view" />
<panel_camera_item.picture
image_name="Object_View_Off" />
<panel_camera_item.selected_picture
image_name="Object_View_On" />
</panel_camera_item>
<panel_camera_item
<panel_camera_item.picture image_name="Object_View_Off" />
<panel_camera_item.selected_picture image_name="Object_View_On" />
</panel_camera_item>
<panel_camera_item
name="mouselook_view"
tool_tip="Mouselook View"
width="18"
left_pad="2">
<panel_camera_item.mousedown_callback
<panel_camera_item.mousedown_callback
function="CameraPresets.ChangeView"
parameter="mouselook_view" />
<panel_camera_item.picture
image_name="MouseLook_View_Off" />
<panel_camera_item.selected_picture
image_name="MouseLook_View_On" />
</panel_camera_item>
<panel_camera_item
<panel_camera_item.picture image_name="MouseLook_View_Off" />
<panel_camera_item.selected_picture image_name="MouseLook_View_On" />
</panel_camera_item>
<panel_camera_item
name="reset_view"
tool_tip="Reset view"
width="18"
left_pad="2">
<panel_camera_item.mousedown_callback
<panel_camera_item.mousedown_callback
function="CameraPresets.ChangeView"
parameter="reset_view" />
<panel_camera_item.picture
image_name="StopReload_Off" />
<panel_camera_item.selected_picture
image_name="StopReload_Over" />
</panel_camera_item>
<button
follows="top|left"
height="23"
top_delta="2"
label="Position..."
layout="topleft"
left_pad="5"
name="camera_position_btn"
width="63">
<button.commit_callback
function="Floater.Show"
parameter="prefs_view_advanced"/>
</button>
<panel_camera_item.picture image_name="StopReload_Off" />
<panel_camera_item.selected_picture image_name="StopReload_Over" />
</panel_camera_item>
</panel>
<combo_box
height="23"
mouse_opaque="true"
name="preset_combo"
width="135">
<combo_list
mouse_wheel_opaque="true"/>
<combo_box.item
label="Use preset"
name="Use preset"
value="default" />
</combo_box>
<button
height="23"
width="24"
layout="topleft"
<panel
border="false"
width="140"
class="camera_zoom_panel"
height="60"
layout="topleft"
left="5"
mouse_opaque="false"
name="zoom"
follows="all">
<layout_stack
top="0"
enabled="true"
height="60"
left="0"
mouse_opaque="true"
name="gear_btn"
tool_tip="Camera Presets"
top_delta="0"
left_pad="3"
image_overlay="Icon_Gear"
is_toggle="true">
<button.commit_callback
function="CameraPresets.ShowPresetsList"/>
</button>
<button
follows="top|left"
height="23"
name="camera_view_layout_stack"
orientation="horizontal"
follows="all">
<layout_panel
name="camera_rotate_layout_panel"
user_resize="false"
height="80"
width="80">
<joystick_rotate
follows="all"
height="80"
width="80"
image_selected="Cam_Rotate_In"
image_unselected="Cam_Rotate_Out"
layout="topleft"
left="0"
mouse_opaque="false"
name="cam_rotate_stick"
quadrant="left"
scale_image="true"
sound_flags="3"
visible="true"
tool_tip="Orbit camera around focus"
held_down_delay.seconds="0.0"
top="0" />
</layout_panel>
<layout_panel
name="camera_zoom_layout_panel"
auto_resize="false"
user_resize="false"
height="70"
width="16">
<button
follows="top|left"
height="16"
image_disabled="AddItem_Disabled"
image_selected="AddItem_Press"
image_unselected="AddItem_Off"
layout="topleft"
left_delta="-2"
name="zoom_plus_btn"
scale_image="false"
width="16"
top="0">
<commit_callback function="Zoom.plus" />
<mouse_held_callback function="Zoom.plus" />
</button>
<slider_bar
height="48"
layout="topleft"
name="zoom_slider"
orientation="vertical"
follows="top|left|bottom"
tool_tip="Zoom camera toward focus"
top_delta="13"
left_delta="1"
min_val="0"
max_val="1"
width="16">
<commit_callback function="Slider.value_changed" />
</slider_bar>
<button
follows="bottom|left"
height="16"
image_disabled="MinusItem_Disabled"
image_selected="MinusItem_Press"
image_unselected="MinusItem_Off"
layout="topleft"
name="zoom_minus_btn"
scale_image="true"
top_delta="44"
left_delta="0"
width="16">
<commit_callback function="Zoom.minus" />
<mouse_held_callback function="Zoom.minus" />
</button>
</layout_panel>
<layout_panel
name="panel_track"
user_resize="false"
height="80"
width="80">
<joystick_track
follows="all"
height="80"
width="80"
image_selected="Cam_Tracking_In"
image_unselected="Cam_Tracking_Out"
layout="topleft"
left_delta="-2"
name="cam_track_stick"
quadrant="left"
scale_image="true"
sound_flags="3"
tool_tip="Move camera up and down, left and right"
top="0" />
</layout_panel>
</layout_stack>
</panel>
<panel
border="false"
height="50"
layout="topleft"
follows="bottom|left|right"
left="0"
name="preset_buttons_panel"
mouse_opaque="false">
<button
follows="bottom|left|right"
height="22"
bottom_delta="23"
label="Position..."
layout="topleft"
left_pad="3"
left_delta="5"
name="camera_position_btn"
width="113">
<button.commit_callback
function="Floater.Show"
parameter="prefs_view_advanced" />
</button>
<button
follows="bottom|right"
height="22"
layout="topleft"
left_pad="3"
name="save_preset_btn"
tool_tip="Save as Preset"
image_overlay="Activate_Checkmark"
image_overlay="Command_Destinations_Icon"
top_delta="0"
width="24">
<button.commit_callback
function="CameraPresets.Save"/>
</button>
width="22">
<button.commit_callback function="CameraPresets.Save" />
</button>
<combo_box
follows="bottom|left|right"
height="22"
left="5"
mouse_opaque="true"
name="preset_combo"
top_pad="0"
width="113">
<combo_list mouse_wheel_opaque="true" />
<combo_box.item
label="Use preset"
name="Use preset"
value="default" />
</combo_box>
<button
follows="bottom|right"
height="22"
width="22"
layout="topleft"
mouse_opaque="true"
name="gear_btn"
tool_tip="Camera Presets"
left_pad="3"
image_overlay="Icon_Gear"
is_toggle="true">
<button.commit_callback function="CameraPresets.ShowPresetsList" />
</button>
</panel>
</floater>

View File

@ -4,11 +4,10 @@
can_drag_on_left="false"
can_minimize="true"
can_resize="true"
height="575"
min_height="600"
width="1024"
top="0"
min_width="1024"
height="590"
min_height="625"
width="960"
min_width="960"
name="Model Preview"
title="Upload Model"
help_topic="upload_model">
@ -43,15 +42,22 @@
<string name="decomposing">Analyzing...</string>
<string name="simplifying">Simplifying...</string>
<string name="tbd">TBD</string>
<!-- Warnings and info from model loader-->
<string name="TooManyJoint">Skinning disabled due to too many joints: [JOINTS], maximum: [MAX]</string>
<string name="UnrecognizedJoint">Rigged to unrecognized joint name [NAME]</string>
<string name="UnknownJoints">Skinning disabled due to [COUNT] unknown joints</string>
<string name="ModelLoaded">Model [MODEL_NAME] loaded</string>
<string name="IncompleteTC">Texture coordinates data is not complete.</string>
<panel
follows="top|left"
height="570"
height="595"
layout="topleft"
left="3"
name="left_panel"
top_pad="0"
width="630">
width="635">
<panel
follows="all"
height="50"
@ -63,7 +69,7 @@
follows="top|left"
layout="topleft"
height="15"
left="15"
left="2"
name="name_label"
text_color="White"
top="0"
@ -82,12 +88,16 @@
</panel>
<tab_container
follows="top|left"
top_pad="15"
top_pad="0"
left="0"
height="300"
height="330"
width="635"
name="import_tab"
tab_position="top">
tab_position="top"
enable_tabs_flashing="true"
tabs_flashing_color="MenuItemFlashBgColor">
<last_tab
tab_top_image_flash="TabTop_Right_Flashing"/> <!-- for log tab -->
<!-- LOD PANEL -->
<panel
help_topic="upload_model_lod"
@ -98,12 +108,12 @@
<view_border
bevel_style="none"
follows="top|left"
height="275"
height="306"
layout="topleft"
left="3"
name="lod_tab_border"
top_pad="0"
width="629" />
width="619" />
<text
follows="left|top"
height="18"
@ -736,7 +746,7 @@
<view_border
bevel_style="none"
follows="top|left"
height="275"
height="306"
layout="topleft"
left="3"
name="physics_tab_border"
@ -1095,11 +1105,12 @@
width="16" />
<text
follows="left|top"
height="15"
height="35"
layout="topleft"
left_pad="2"
name="physics_status_message_text"
width="573"
word_wrap="true"
top_delta="3"/>
</panel>
</panel>
@ -1111,7 +1122,7 @@
<view_border
bevel_style="none"
follows="top|left"
height="275"
height="306"
layout="topleft"
left="3"
name="border"
@ -1162,76 +1173,174 @@
label="Include textures"
left="20"
top_pad="20"/>
<view_border
bevel_style="none"
follows="top|left"
height="0"
layout="topleft"
name="border"
top_pad="20"
width="579"/>
<text
follows="top|left"
height="15"
left="20"
name="include_label"
text_color="White"
top_pad="20"
width="150">
For avatar models only:
</text>
<check_box
follows="top|left"
height="15"
label="Include skin weight"
name="upload_skin"
top_pad="15"/>
<check_box
follows="top|left"
height="15"
label="Include joint positions"
name="upload_joints"
top_pad="15"/>
<check_box
follows="top|left"
height="15"
label="Lock scale if joint position defined"
name="lock_scale_if_joint_position"
top_pad="15"/>
<text
follows="top|left"
height="15"
layout="topleft"
left="220"
name="pelvis_offset_label"
text_color="White"
top="134"
width="250">
Z offset (raise or lower avatar):
</text>
<spinner
follows="top|left"
height="20"
min_val="-3.00"
max_val="3.0"
name="pelvis_offset"
top_pad="10"
value="0.0"
width="80"/>
</panel>
<panel
label="Overrides"
layout="topleft"
name="rigging_panel"
title="Rigging">
<view_border
bevel_style="none"
follows="top|left"
height="306"
layout="topleft"
left="3"
name="avatar_tab_border"
top_pad="0"
width="619" />
<check_box
follows="top|left"
height="15"
label="Include skin weight"
label_text.text_color="White"
name="upload_skin"
top="8"
left="10"/>
<check_box
follows="top|left"
height="15"
label="Include joint positions"
label_text.text_color="White"
name="upload_joints"
left_delta="0"
top_pad="7"/>
<check_box
follows="top|left"
height="15"
label="Lock scale if joint position defined"
label_text.text_color="White"
label_text.wrap="true"
label_text.width="180"
name="lock_scale_if_joint_position"
top_pad="17"/>
<text
follows="top|left"
height="15"
layout="topleft"
left="225"
name="pelvis_offset_label"
text_color="White"
top="8"
width="200">
Z offset (raise or lower avatar):
</text>
<spinner
follows="top|left"
height="20"
min_val="-3.00"
max_val="3.0"
name="pelvis_offset"
top_pad="10"
value="0.0"
width="80"/>
<text
follows="top|left"
height="17"
left="425"
name="skin_too_many_joints"
text_color="Orange"
top="7"
width="195"
word_wrap="true">
Too many skinned joints
</text>
<text
follows="top|left"
height="32"
left="425"
name="skin_unknown_joint"
text_color="Orange"
top="8"
width="195"
word_wrap="true">
Model has an unknown joint(s)
</text>
<text
layout="topleft"
follows="top|left"
height="15"
left="10"
name="joints_descr"
top="73"
width="150">
Joints:
</text>
<scroll_list
layout="topleft"
follows="top|left"
name="joints_list"
column_padding="0"
draw_heading="false"
draw_stripes="false"
commit_on_selection_change="true"
heading_height="23"
height="199"
left_delta="0"
top_pad="0"
width="205"/>
<text
layout="topleft"
follows="top|left"
height="15"
left_delta="0"
name="conflicts_description"
top_pad="2"
width="205">
[CONFLICTS] conflicts in [JOINTS_COUNT] joints
</text>
<text
layout="topleft"
follows="top|left"
height="15"
left_pad="10"
name="pos_overrides_descr"
top="73"
width="300">
Position overrides for joint '[JOINT]':
</text>
<scroll_list
layout="topleft"
follows="top|left"
name="pos_overrides_list"
column_padding="0"
draw_heading="true"
draw_stripes="false"
heading_height="23"
height="100"
left_delta="0"
top_pad="0"
width="385">
<scroll_list.columns
label="Model"
name="model_name"
relative_width="0.49" />
<scroll_list.columns
label="X"
name="axis_x"
relative_width="0.17" />
<scroll_list.columns
label="Y"
name="axis_y"
relative_width="0.17" />
<scroll_list.columns
label="Z"
name="axis_z"
relative_width="0.17" />
</scroll_list>
<panel
follows="top|left"
layout="topleft"
border="true"
left="400"
height="165"
top="100"
border="true"
left="410"
height="110"
top_pad="5"
width="200"
name="avatar_model_hint_panel"
>
<text
left="5"
width="190"
height="165"
height="110"
name="avatar_model_hint_text"
wrap="true"
word_wrap="true"
@ -1242,17 +1351,62 @@ Too many items use the default (right hand) unnecessarily.
Please consider using an attachment point close to the item's position on the body.
</text>
</panel>
</panel>
</panel>
<panel
label="Log"
layout="topleft"
name="logs_panel">
<view_border
bevel_style="none"
follows="top|left"
height="306"
layout="topleft"
left="3"
ignore_tab="false"
right="-21"
name="log_tab_border"
top_pad="0"
width="619" />
<!-- FS:Beq Add control for vberbose logging -->
<check_box
control_name="ImporterDebug"
follows="top|left"
top_delta="12"
left="4"
width="70"
label="Show detailed logging"
name="verbose_logging"/>
<!-- FS:Beq/ -->
<text_editor
type="string"
length="1"
embedded_items="false"
follows="top|left"
font="SansSerif"
ignore_tab="false"
layout="topleft"
height="267"
left="4"
top="24"
right="-22"
max_length="65536"
name="log_text"
parse_urls="true"
spellcheck="false"
read_only="true"
word_wrap="true">
</text_editor>
</panel>
</tab_container>
<panel
follows="top|left|bottom"
layout="topleft"
height="197"
height="195"
left="4"
border="true"
name="weights_and_warning_panel"
top_pad="3"
width="629">
width="619">
<button
follows="top|left"
label="Calculate weights &amp; fee"
@ -1354,7 +1508,7 @@ Please consider using an attachment point close to the item's position on the bo
top_pad="5"
layout="topleft"
left="6"
name="physics_costs_panel"
name="price_breakdown_panel"
width="120"
height="100">
<text
@ -1437,7 +1591,7 @@ Lowest:
border="true"
layout="topleft"
left_pad="15"
name="physics_breakdown_panel"
name="physics_costs_panel"
width="120"
height="100">
<text
@ -1481,10 +1635,11 @@ Analysed:
[PHU]
</text>-->
</panel>
<!-- FS:Beq relocate the preview controls to be sensible -->
<panel
follows="top|left"
layout="topleft"
left_pad="100"
left_pad="92"
height="100"
border="true"
name="preview_controls_panel"
@ -1516,138 +1671,144 @@ Analysed:
<combo_item name="lowest"> Lowest </combo_item>
</combo_box>
</panel>
<view_border
bevel_style="none"
follows="top|left"
height="0"
layout="topleft"
left="3"
name="preview_controls_border"
top_pad="5"
halign="center"
width="250"/>
<check_box
follows="top|left"
label="Edges"
layout="topleft"
name="show_edges"
width="70"
left="0"
top_pad="10"/>
<check_box
follows="top|left"
label="Textures"
layout="topleft"
name="show_textures"
left_pad="0"/>
<check_box
follows="top|left"
label="UV guide"
layout="topleft"
name="show_uv_guide"
left_pad="0"/>
<check_box
follows="top|left"
top_pad="10"
left="0"
width="70"
label="Physics"
name="show_physics"/>
<text
layout="topleft"
follows="top|left"
left_pad="2"
height="16"
width="80"
name="exploder_label">
Explode hulls
</text>
<slider
name="physics_explode"
show_text="false"
top_delta="1"
follows="top|left"
valign="center"
left_pad="2"
min_val="0.0"
max_val="3.0"
width="100"/>
<check_box
follows="top|left"
top_pad="15"
label="Weights"
layout="topleft"
width="70"
name="show_skin_weight"
left="0"/>
<check_box
follows="top|left"
label="Joints"
height="0"
layout="topleft"
name="show_joint_positions"
left_pad="0"/>
</panel>
<!-- ========== NOTE MESSAGE ========== -->
<text
font="SansSerif"
layout="topleft"
left="6"
name="warning_title"
top_pad="5"
text_color="DrYellow"
visible="false"
width="40">
NOTE:
</text>
<text
text_color="White"
height="20"
layout="topleft"
left_pad="1"
name="warning_message"
parse_urls="true"
top_delta="0"
wrap="true"
width="462"
visible="false">
You dont have rights to upload mesh models. [[VURL] Find out how] to get certified.
</text>
<text text_color="Yellow" layout="topleft" top_pad="-1" left="6" name="status">
[STATUS]
</text>
</panel>
</panel>
<panel
follows="top|left|bottom|right"
can_resize="true"
name="right_panel"
top="0"
left="640"
background_visible="true"
width="375"
height="570">
<!--<text
follows="left|top"
<view_border
bevel_style="none"
follows="top|left"
height="0"
layout="topleft"
left="0"
name="lod_label"
left="3"
name="preview_controls_border"
top_pad="5"
halign="center"
width="250"/>
<check_box
follows="top|left"
label="Edges"
layout="topleft"
name="show_edges"
width="70"
left="0"
top_pad="10"/>
<check_box
follows="top|left"
label="Textures"
layout="topleft"
name="show_textures"
left_pad="0"/>
<check_box
follows="top|left"
label="UV guide"
layout="topleft"
name="show_uv_guide"
left_pad="0"/>
<check_box
follows="top|left"
top_pad="10"
left="0"
width="70"
label="Physics"
name="show_physics"/>
<text
layout="topleft"
follows="top|left"
left_pad="2"
height="16"
width="80"
name="exploder_label">
Explode hulls
</text>
<slider
name="physics_explode"
show_text="false"
top_delta="1"
follows="top|left"
valign="center"
left_pad="2"
min_val="0.0"
max_val="3.0"
width="100"/>
<check_box
follows="top|left"
top_pad="15"
label="Weights"
layout="topleft"
width="70"
name="show_skin_weight"
left="0"/>
<check_box
follows="top|left"
label="Joint Positions"
height="0"
layout="topleft"
name="show_joint_positions"
word_wrap="down"
left_pad="0"
width="65"/>
<check_box
follows="top|left"
label="Joint Pos. Overrides"
word_wrap="down"
layout="topleft"
name="show_joint_overrides"
left_pad="5"
width="100">
</check_box>
</panel>
<!-- ========== NOTE MESSAGE ========== -->
<text
font="SansSerif"
layout="topleft"
left="6"
name="warning_title"
top_pad="5"
text_color="DrYellow"
visible="true"
width="40">
NOTE:
</text>
<text
text_color="White"
top="13"
height="15"
width="290">
Preview:
</text>-->
height="20"
layout="topleft"
left_pad="1"
name="warning_message"
parse_urls="true"
top_delta="0"
wrap="true"
width="530"
visible="true">
You dont have rights to upload mesh models. [[VURL] Find out how] to get certified.
</text>
<text
text_color="Yellow"
layout="topleft"
top_pad="-2"
left="6"
name="status">
[STATUS]
</text>
</panel>
<panel
border="true"
bevel_style="none"
follows="top|left|right|bottom"
layout="topleft"
name="preview_panel"
top="5"
height="560"
width="375"
<!-- /FS:Beq -->
</panel>
<text
follows="left|top"
layout="topleft"
left="630"
name="lod_label"
text_color="White"
top="4"
height="15"
width="290">
Preview:
</text>
<panel
border="true"
bevel_style="none"
follows="top|left|right|bottom"
layout="topleft"
name="preview_panel"
top="20"
height="560"
width="320"
/>
</floater>

View File

@ -19,5 +19,6 @@
name="Preview Tabs"
tab_position="bottom"
top="0"
width="448" />
width="448"
enable_tabs_flashing="true"/>
</multi_floater>

View File

@ -183,21 +183,32 @@
value="15.0" />
</combo_box>
<slider
name="manual_environment_change_transition_period"
control_name="FSEnvironmentManualTransitionTime"
label="Environment Transition Time:"
decimal_digits="1"
left="12"
top_pad="10"
follows="left|top"
layout="topleft"
height="18"
increment="0.5"
initial_value="0"
max_val="60"
min_val="0"
width="520"
tool_tip="Interval in seconds over which manual environment changes will blend. Zero is instant."/>
name="manual_environment_change_transition_period"
control_name="FSEnvironmentManualTransitionTime"
label="Environment Transition Time:"
decimal_digits="1"
left="12"
top_pad="15"
follows="left|top"
layout="topleft"
height="18"
increment="0.5"
initial_value="0"
max_val="60"
min_val="0"
width="520"
tool_tip="Interval in seconds over which manual environment changes will blend. Zero is instant."/>
<check_box
top_pad="5"
control_name="EnvironmentPersistAcrossLogin"
follows="left|top"
height="16"
initial_value="true"
name="EnvironmentPersistAcrossLogin"
label="Persist Environment settings throughout sessions"
left="10"
width="500"
tool_tip="Restores the current environment settings after next login."/>
</panel>

View File

@ -204,7 +204,7 @@ Rozważ użycie innego punktu doczepienia, bliżej do pozycji obiektu na ciele.
<text name="server_weight">
Serwer: [SIM]
</text>
<panel name="physics_costs_panel">
<panel name="price_breakdown_panel">
<text name="price_breakdown_title">
Podział kosztów
</text>
@ -223,7 +223,7 @@ Wysokie:
Niskie:
Najniższe:
</text>
<panel name="physics_breakdown_panel">
<panel name="physics_costs_panel">
<text name="physics_breakdown_title">
Koszty fizyki
</text>

View File

@ -3,6 +3,9 @@
<floater.string name="buy_currency">
Купить L$ [LINDENS] примерно за [LOCALAMOUNT]
</floater.string>
<floater.string name="info_cannot_buy">
Нельзя купить
</floater.string>
<text name="info_need_more">
Вам нужно больше L$
</text>
@ -59,8 +62,4 @@
</text>
<button label="Купить" name="buy_btn"/>
<button label="Отмена" name="cancel_btn"/>
<text name="info_cannot_buy">
Нельзя купить
</text>
<button label="Открыть в Интернете" name="error_web"/>
</floater>

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="ScriptChiclet Menu">
<menu_item_call label="Закрыть" name="Close"/>
<menu_item_call label="Закрыть все" name="Close All"/>
</menu>

View File

@ -352,6 +352,7 @@
<menu_item_check label="Альфа" name="Rendering Type Alpha"/>
<menu_item_check label="Дерево" name="Rendering Type Tree"/>
<menu_item_check label="Аватары" name="Rendering Type Character"/>
<menu_item_check label="Анимированный меш" name="Rendering Type Control Avatar"/>
<menu_item_check label="Исправление поверхности" name="Rendering Type Surface Patch"/>
<menu_item_check label="Небо" name="Rendering Type Sky"/>
<menu_item_check label="Вода" name="Rendering Type Water"/>

View File

@ -1471,6 +1471,10 @@
<notification name="CantTeleportToGrid">
Не удалось телепортироваться в [SLURL]: это место находится на другой сетке ([GRID]), а не на текущей ([CURRENT_GRID]). Закройте программу и попробуйте еще раз.
</notification>
<notification name="GeneralCertificateErrorShort">
Не удалось установить соединение с сервером.
[REASON]
</notification>
<notification name="GeneralCertificateError">
Не удалось подключиться к серверу.
[REASON]

View File

@ -2,7 +2,7 @@
<panel label="Сообщения об ошибках" name="crash_reports">
<check_box label="Отправить отчет об ошибке на firestormviewer.org" name="checkSendCrashReports" />
<check_box label="Всегда спрашивать перед отправкой" name="checkSendCrashReportsAlwaysAsk" />
<check_box label="Включая settings.xml" name="checkSendSettings" />
<check_box label="Включая файлы настроек" name="checkSendSettings" />
<text name="textSendSettings">
(содержит имя пользователя)
</text>

View File

@ -201,9 +201,15 @@ SLURL: &lt;nolink&gt;[SLURL]&lt;/nolink&gt;
<string name="CertBasicConstraints">
В цепочке сертификатов серверов слишком много сертификатов. Обратитесь к администратору сети.
</string>
<string name="CertInvalid">
Не удалось загрузить сертификат. Обратитесь к администратору сети.
</string>
<string name="CertInvalidSignature">
Не удалось проверить подпись сертификата, возвращенного сервером сетки. Обратитесь к администратору сетки.
</string>
<string name="CertAllocationFailure">
Не удалось выделить память openssl для сертификата.
</string>
<string name="LoginFailedNoNetwork">
Ошибка сети: не удалось установить соединение. Проверьте подключение к сети.
</string>

View File

@ -13,6 +13,10 @@
name="buy_currency">
Buy L$ [LINDENS] for approx. [LOCALAMOUNT]
</floater.string>
<floater.string
name="info_cannot_buy">
Unable to Buy
</floater.string>
<icon
height="215"
image_name="Linden_Dollar_Background"
@ -286,46 +290,4 @@ Re-enter amount to see the latest exchange rate.
left_pad="10"
name="cancel_btn"
width="90"/>
<icon
height="215"
image_name="Linden_Dollar_Alert"
layout="topleft"
left="0"
name="error_background"
color="SL-White"
top="15"
use_draw_context_alpha="false"
width="350"/>
<text
type="string"
font="SansSerifHuge"
left="165"
width="360"
height="25"
top="25"
text_color="Red"
name="info_cannot_buy">
Unable to Buy
</text>
<text
type="string"
width="176"
height="125"
top="60"
left="165"
word_wrap="true"
text_color="SL-White"
follows="bottom|right"
name="cannot_buy_message">
</text>
<button
follows="bottom|left"
height="20"
label="Continue to the Web"
image_unselected="PushButton_On"
layout="topleft"
left="170"
name="error_web"
top="200"
width="160"/>
</floater>

View File

@ -13,6 +13,10 @@
name="buy_currency">
Buy L$ [LINDENS] for approx. [LOCALAMOUNT]
</floater.string>
<floater.string
name="info_cannot_buy">
Unable to Buy
</floater.string>
<icon
height="215"
image_name="Linden_Dollar_Background"
@ -286,46 +290,4 @@ Re-enter amount to see the latest exchange rate.
left_pad="10"
name="cancel_btn"
width="90"/>
<icon
height="215"
image_name="Linden_Dollar_Alert"
layout="topleft"
left="0"
name="error_background"
color="SL-White"
top="15"
use_draw_context_alpha="false"
width="350"/>
<text
type="string"
font="SansSerifHuge"
left="165"
width="360"
height="25"
top="25"
text_color="Red"
name="info_cannot_buy">
Unable to Buy
</text>
<text
type="string"
width="176"
height="125"
top="60"
left="165"
word_wrap="true"
text_color="SL-White"
follows="bottom|right"
name="cannot_buy_message">
</text>
<button
follows="bottom|left"
height="20"
label="Continue to the Web"
image_unselected="PushButton_On"
layout="topleft"
left="170"
name="error_web"
top="200"
width="160"/>
</floater>