Merge branch 'master' of https://bitbucket.org/Ansariel/phoenix-firestorm
commit
3f31af4c1f
|
|
@ -45,6 +45,7 @@
|
|||
#define FSZoneNC( name, color ) ZoneNamedNC( ___tracy_scoped_zone, name, color, FSTelemetry::active)
|
||||
#define FSPlot( name, value ) TracyPlot( name, value)
|
||||
#define FSFrameMark FrameMark
|
||||
#define FSThreadName( name ) tracy::SetThreadName( name )
|
||||
#define FSTelemetryIsConnected TracyIsConnected
|
||||
|
||||
#else // (no telemetry)
|
||||
|
|
@ -58,6 +59,7 @@
|
|||
#define FSZoneNC( name, color )
|
||||
#define FSPlot( name, value )
|
||||
#define FSFrameMark
|
||||
#define FSThreadName( name )
|
||||
#define FSTelemetryIsConnected
|
||||
#endif // TRACY_ENABLE
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include "lltrace.h"
|
||||
#include "lltracethreadrecorder.h"
|
||||
#include "llexception.h"
|
||||
#include "fstelemetry.h" // <FS:Beq> allow thread naming
|
||||
|
||||
#if LL_LINUX || LL_SOLARIS
|
||||
#include <sched.h>
|
||||
|
|
@ -140,7 +141,10 @@ void LLThread::threadRun()
|
|||
|
||||
// for now, hard code all LLThreads to report to single master thread recorder, which is known to be running on main thread
|
||||
mRecorder = new LLTrace::ThreadRecorder(*LLTrace::get_master_thread_recorder());
|
||||
|
||||
// <FS:Beq> - Add threadnames to telemetry
|
||||
LL_INFOS("THREAD") << "Started thread " << mName << LL_ENDL;
|
||||
FSThreadName( mName.c_str() );
|
||||
// </FS:Beq>
|
||||
// Run the user supplied function
|
||||
do
|
||||
{
|
||||
|
|
|
|||
|
|
@ -195,7 +195,7 @@ class LLDiskCache :
|
|||
class FSPurgeDiskCacheThread : public LLThread
|
||||
{
|
||||
public:
|
||||
FSPurgeDiskCacheThread::FSPurgeDiskCacheThread();
|
||||
FSPurgeDiskCacheThread();
|
||||
|
||||
protected:
|
||||
void run() override;
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
*/
|
||||
|
||||
#include "linden_common.h"
|
||||
|
||||
#include "fstelemetry.h" // <FS:Beq> add telemetry support.
|
||||
#include "llimageworker.h"
|
||||
#include "llimagedxt.h"
|
||||
|
||||
|
|
@ -135,7 +135,12 @@ LLImageDecodeThread::~LLImageDecodeThread()
|
|||
// virtual
|
||||
S32 LLImageDecodeThread::update(F32 max_time_ms)
|
||||
{
|
||||
FSZoneC(tracy::Color::Blue); // <FS:Beq/> instrument image decodes
|
||||
LLMutexLock lock(mCreationMutex);
|
||||
// <FS:Beq> instrument image decodes
|
||||
{
|
||||
FSZoneC(tracy::Color::Blue1);
|
||||
// </FS:Beq>
|
||||
for (creation_list_t::iterator iter = mCreationList.begin();
|
||||
iter != mCreationList.end(); ++iter)
|
||||
{
|
||||
|
|
@ -155,16 +160,49 @@ S32 LLImageDecodeThread::update(F32 max_time_ms)
|
|||
}
|
||||
}
|
||||
mCreationList.clear();
|
||||
// <FS:Beq> instrument image decodes
|
||||
}
|
||||
{
|
||||
FSZoneC(tracy::Color::Blue2);
|
||||
// </FS:Beq>
|
||||
S32 res = LLQueuedThread::update(max_time_ms);
|
||||
// FSPlot("img_decode_pending", (int64_t)res); // <FS:Beq/> instrument image decodes
|
||||
return res;
|
||||
} // <FS:Beq/> instrument image decodes
|
||||
}
|
||||
|
||||
LLImageDecodeThread::handle_t LLImageDecodeThread::decodeImage(LLImageFormatted* image,
|
||||
U32 priority, S32 discard, BOOL needs_aux, Responder* responder)
|
||||
{
|
||||
LLMutexLock lock(mCreationMutex);
|
||||
FSZoneC(tracy::Color::Orange); // <FS:Beq> instrument the image decode pipeline
|
||||
// <FS:Beq> De-couple texture threading from mainloop
|
||||
// LLMutexLock lock(mCreationMutex);
|
||||
// handle_t handle = generateHandle();
|
||||
// mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder));
|
||||
handle_t handle = generateHandle();
|
||||
mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder));
|
||||
// If we have a thread pool dispatch this directly.
|
||||
// Note: addRequest could cause the handling to take place on the fetch thread, this is unlikely to be an issue.
|
||||
// if this is an actual problem we move the fallback to here and place the unfulfilled request into the legacy queue
|
||||
if (s_ChildThreads > 0)
|
||||
{
|
||||
FSZoneNC("DecodeDecoupled", tracy::Color::Orange); // <FS:Beq> instrument the image decode pipeline
|
||||
ImageRequest* req = new ImageRequest(handle, image,
|
||||
priority, discard, needs_aux,
|
||||
responder, this);
|
||||
bool res = addRequest(req);
|
||||
if (!res)
|
||||
{
|
||||
LL_WARNS() << "Decode request not added because we are exiting." << LL_ENDL;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FSZoneNC("DecodeQueued", tracy::Color::Orange); // <FS:Beq> instrument the image decode pipeline
|
||||
LLMutexLock lock(mCreationMutex);
|
||||
mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder));
|
||||
}
|
||||
// </FS:Beq>
|
||||
return handle;
|
||||
}
|
||||
|
||||
|
|
@ -230,10 +268,19 @@ bool LLImageDecodeThread::ImageRequest::processRequest()
|
|||
|
||||
bool LLImageDecodeThread::ImageRequest::processRequestIntern()
|
||||
{
|
||||
const F32 decode_time_slice = .1f;
|
||||
// <FS:Beq> allow longer timeout for async and add instrumentation
|
||||
// const F32 decode_time_slice = .1f;
|
||||
FSZoneC(tracy::Color::DarkOrange);
|
||||
F32 decode_time_slice = .1f;
|
||||
if(mFlags & FLAG_ASYNC)
|
||||
{
|
||||
decode_time_slice = 10.0f;// long time out as this is not an issue with async
|
||||
}
|
||||
// </FS:Beq>
|
||||
bool done = true;
|
||||
if (!mDecodedRaw && mFormattedImage.notNull())
|
||||
{
|
||||
FSZoneC(tracy::Color::DarkOrange1); // <FS:Beq> instrument the image decode pipeline
|
||||
// Decode primary channels
|
||||
if (mDecodedImageRaw.isNull())
|
||||
{
|
||||
|
|
@ -272,6 +319,7 @@ bool LLImageDecodeThread::ImageRequest::processRequestIntern()
|
|||
}
|
||||
if (done && mNeedsAux && !mDecodedAux && mFormattedImage.notNull())
|
||||
{
|
||||
FSZoneC(tracy::Color::DarkOrange2); // <FS:Beq> instrument the image decode pipeline
|
||||
// Decode aux channel
|
||||
if (!mDecodedImageAux)
|
||||
{
|
||||
|
|
@ -282,7 +330,12 @@ bool LLImageDecodeThread::ImageRequest::processRequestIntern()
|
|||
done = mFormattedImage->decodeChannels(mDecodedImageAux, decode_time_slice, 4, 4); // 1ms
|
||||
mDecodedAux = done && mDecodedImageAux->getData();
|
||||
}
|
||||
|
||||
// <FS:Beq> report timeout on async thread (which leads to worker abort errors)
|
||||
if(!done)
|
||||
{
|
||||
LL_WARNS("ImageDecode") << "Image decoding failed to complete with time slice=" << decode_time_slice << LL_ENDL;
|
||||
}
|
||||
// </FS:Beq>
|
||||
//<FS:ND> Image thread pool from CoolVL
|
||||
if (mFlags & FLAG_ASYNC)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
*/
|
||||
|
||||
#include "linden_common.h"
|
||||
#include "fstelemetry.h" // <FS:Beq> instrument image decodes
|
||||
#include "llimagej2coj.h"
|
||||
#define OPENJPEG2
|
||||
|
||||
|
|
@ -258,10 +259,11 @@ bool LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int block
|
|||
bool LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
|
||||
{
|
||||
// <FS:Techwolf Lupindo> texture comment metadata reader
|
||||
FSZone; // <FS:Beq> instrument image decodes
|
||||
U8* c_data = base.getData();
|
||||
S32 c_size = base.getDataSize();
|
||||
S32 position = 0;
|
||||
|
||||
|
||||
while (position < 1024 && position < (c_size - 7)) // the comment field should be in the first 1024 bytes.
|
||||
{
|
||||
if (c_data[position] == 0xff && c_data[position + 1] == 0x64)
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
#include "llpointer.h"
|
||||
#include "llmath.h"
|
||||
#include "llkdumem.h"
|
||||
|
||||
#include "fstelemetry.h" // <FS:Beq> instrument image decodes
|
||||
#define kdu_xxxx "kdu_block_coding.h"
|
||||
#include "include_kdu_xxxx.h"
|
||||
|
||||
|
|
@ -287,6 +287,7 @@ void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision);
|
|||
// as well, when that still existed, with keep_codestream true and MODE_FAST.
|
||||
void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECodeStreamMode mode)
|
||||
{
|
||||
FSZone; // <FS:Beq> instrument image decodes
|
||||
S32 data_size = base.getDataSize();
|
||||
S32 max_bytes = (base.getMaxBytes() ? base.getMaxBytes() : data_size);
|
||||
|
||||
|
|
@ -436,6 +437,7 @@ bool LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int bloc
|
|||
// decodeImpl() usage matters for production.
|
||||
bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region)
|
||||
{
|
||||
FSZone; // <FS:Beq> instrument image decodes
|
||||
base.resetLastError();
|
||||
|
||||
// *FIX: kdu calls our callback function if there's an error, and then bombs.
|
||||
|
|
@ -519,6 +521,7 @@ bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
|
|||
// Returns true to mean done, whether successful or not.
|
||||
bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
|
||||
{
|
||||
FSZone; // <FS:Beq> instrument image decodes
|
||||
ECodeStreamMode mode = MODE_FAST;
|
||||
|
||||
LLTimer decode_timer;
|
||||
|
|
|
|||
|
|
@ -1220,7 +1220,13 @@ bool LLModel::isMaterialListSubset( LLModel* ref )
|
|||
{
|
||||
int refCnt = ref->mMaterialList.size();
|
||||
int modelCnt = mMaterialList.size();
|
||||
|
||||
// <FS:Beq> FIRE-30965 Cleanup braindead mesh parsing error handlers
|
||||
if(modelCnt > refCnt)
|
||||
{
|
||||
// this model cannot be a strict subset if it has more materials than the reference
|
||||
return FALSE;
|
||||
}
|
||||
// </FS:Beq>
|
||||
for (U32 src = 0; src < modelCnt; ++src)
|
||||
{
|
||||
bool foundRef = false;
|
||||
|
|
@ -1264,77 +1270,80 @@ bool LLModel::needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
|
|||
return changed;
|
||||
}
|
||||
|
||||
bool LLModel::matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
|
||||
{
|
||||
//Is this a subset?
|
||||
//LODs cannot currently add new materials, e.g.
|
||||
//1. ref = a,b,c lod1 = d,e => This is not permitted
|
||||
//2. ref = a,b,c lod1 = c => This would be permitted
|
||||
// <FS:Beq> FIRE-30965 Improve mesh upload error handling
|
||||
// function moved to llmodelpreview
|
||||
// bool LLModel::matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
|
||||
// {
|
||||
// //Is this a subset?
|
||||
// //LODs cannot currently add new materials, e.g.
|
||||
// //1. ref = a,b,c lod1 = d,e => This is not permitted
|
||||
// //2. ref = a,b,c lod1 = c => This would be permitted
|
||||
|
||||
bool isASubset = isMaterialListSubset( ref );
|
||||
if ( !isASubset )
|
||||
{
|
||||
LL_INFOS("MESHSKININFO")<<"Material of model is not a subset of reference."<<LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
// bool isASubset = isMaterialListSubset( ref );
|
||||
// if ( !isASubset )
|
||||
// {
|
||||
// LL_INFOS("MESHSKININFO")<<"Material of model is not a subset of reference."<<LL_ENDL;
|
||||
// return false;
|
||||
// }
|
||||
|
||||
if (mMaterialList.size() > ref->mMaterialList.size())
|
||||
{
|
||||
LL_INFOS("MESHSKININFO") << "Material of model has more materials than a reference." << LL_ENDL;
|
||||
// We passed isMaterialListSubset, so materials are a subset, but subset isn't supposed to be
|
||||
// larger than original and if we keep going, reordering will cause a crash
|
||||
return false;
|
||||
}
|
||||
// if (mMaterialList.size() > ref->mMaterialList.size())
|
||||
// {
|
||||
// LL_INFOS("MESHSKININFO") << "Material of model has more materials than a reference." << LL_ENDL;
|
||||
// // We passed isMaterialListSubset, so materials are a subset, but subset isn't supposed to be
|
||||
// // larger than original and if we keep going, reordering will cause a crash
|
||||
// return false;
|
||||
// }
|
||||
|
||||
std::map<std::string, U32> index_map;
|
||||
// std::map<std::string, U32> index_map;
|
||||
|
||||
//build a map of material slot names to face indexes
|
||||
bool reorder = false;
|
||||
// //build a map of material slot names to face indexes
|
||||
// bool reorder = false;
|
||||
|
||||
std::set<std::string> base_mat;
|
||||
std::set<std::string> cur_mat;
|
||||
// std::set<std::string> base_mat;
|
||||
// std::set<std::string> cur_mat;
|
||||
|
||||
for (U32 i = 0; i < mMaterialList.size(); i++)
|
||||
{
|
||||
index_map[ref->mMaterialList[i]] = i;
|
||||
//if any material name does not match reference, we need to reorder
|
||||
reorder |= ref->mMaterialList[i] != mMaterialList[i];
|
||||
base_mat.insert(ref->mMaterialList[i]);
|
||||
cur_mat.insert(mMaterialList[i]);
|
||||
}
|
||||
// for (U32 i = 0; i < mMaterialList.size(); i++)
|
||||
// {
|
||||
// index_map[ref->mMaterialList[i]] = i;
|
||||
// //if any material name does not match reference, we need to reorder
|
||||
// reorder |= ref->mMaterialList[i] != mMaterialList[i];
|
||||
// base_mat.insert(ref->mMaterialList[i]);
|
||||
// cur_mat.insert(mMaterialList[i]);
|
||||
// }
|
||||
|
||||
|
||||
if (reorder && (base_mat == cur_mat)) //don't reorder if material name sets don't match
|
||||
{
|
||||
std::vector<LLVolumeFace> new_face_list;
|
||||
new_face_list.resize(mMaterialList.size());
|
||||
// if (reorder && (base_mat == cur_mat)) //don't reorder if material name sets don't match
|
||||
// {
|
||||
// std::vector<LLVolumeFace> new_face_list;
|
||||
// new_face_list.resize(mMaterialList.size());
|
||||
|
||||
std::vector<std::string> new_material_list;
|
||||
new_material_list.resize(mMaterialList.size());
|
||||
// std::vector<std::string> new_material_list;
|
||||
// new_material_list.resize(mMaterialList.size());
|
||||
|
||||
//rebuild face list so materials have the same order
|
||||
//as the reference model
|
||||
for (U32 i = 0; i < mMaterialList.size(); ++i)
|
||||
{
|
||||
U32 ref_idx = index_map[mMaterialList[i]];
|
||||
// //rebuild face list so materials have the same order
|
||||
// //as the reference model
|
||||
// for (U32 i = 0; i < mMaterialList.size(); ++i)
|
||||
// {
|
||||
// U32 ref_idx = index_map[mMaterialList[i]];
|
||||
|
||||
if (i < mVolumeFaces.size())
|
||||
{
|
||||
new_face_list[ref_idx] = mVolumeFaces[i];
|
||||
}
|
||||
new_material_list[ref_idx] = mMaterialList[i];
|
||||
}
|
||||
// if (i < mVolumeFaces.size())
|
||||
// {
|
||||
// new_face_list[ref_idx] = mVolumeFaces[i];
|
||||
// }
|
||||
// new_material_list[ref_idx] = mMaterialList[i];
|
||||
// }
|
||||
|
||||
llassert(new_material_list == ref->mMaterialList);
|
||||
// llassert(new_material_list == ref->mMaterialList);
|
||||
|
||||
mVolumeFaces = new_face_list;
|
||||
// mVolumeFaces = new_face_list;
|
||||
|
||||
//override material list with reference model ordering
|
||||
mMaterialList = ref->mMaterialList;
|
||||
}
|
||||
// //override material list with reference model ordering
|
||||
// mMaterialList = ref->mMaterialList;
|
||||
// }
|
||||
|
||||
return true;
|
||||
}
|
||||
// return true;
|
||||
// }
|
||||
// </FS:Beq>
|
||||
|
||||
bool LLModel::loadSkinInfo(LLSD& header, std::istream &is)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -187,7 +187,7 @@ public:
|
|||
|
||||
//reorder face list based on mMaterialList in this and reference so
|
||||
//order matches that of reference (material ordering touchup)
|
||||
bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
|
||||
// bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt ); // <FS:Beq/> FIRE-30965 error handling improvements (function relocated)
|
||||
bool isMaterialListSubset( LLModel* ref );
|
||||
bool needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt );
|
||||
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ public:
|
|||
DONE,
|
||||
WARNING_BIND_SHAPE_ORIENTATION,
|
||||
ERROR_PARSING, //basically loading failed
|
||||
ERROR_MATERIALS,
|
||||
ERROR_MATERIALS_NOT_A_SUBSET, // <FS:Beq/> FIRE-30965 - better error differentiation
|
||||
ERROR_PASSWORD_REQUIRED,
|
||||
ERROR_NEED_MORE_MEMORY,
|
||||
ERROR_INVALID_FILE,
|
||||
|
|
@ -95,6 +95,8 @@ public:
|
|||
ERROR_INVALID_PARAMETERS,
|
||||
ERROR_OUT_OF_RANGE,
|
||||
ERROR_FILE_VERSION_INVALID,
|
||||
ERROR_LOD_MODEL_MISMATCH, // <FS:Beq/> clean up and improve error reporting
|
||||
ERROR_HIGH_LOD_MODEL_MISSING, // <FS:Beq/> clean up and improve error reporting
|
||||
ERROR_MODEL // this error should always be last in this list, error code is passed as ERROR_MODEL+error_code
|
||||
} eLoadState;
|
||||
|
||||
|
|
|
|||
|
|
@ -9399,6 +9399,17 @@
|
|||
<key>Value</key>
|
||||
<string>salt_and_pepper.jpg</string>
|
||||
</map>
|
||||
<key>FSPhysicsPresetUser1</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>full system path to a user provided physics mesh (DAE).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>MigrateCacheDirectory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -25672,5 +25683,27 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>FSAutoUnmuteSounds</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If Sound Effects are muted, unmute on TP. Default (false)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSAutoUnmuteAmbient</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If Ambient sounds are muted, unmute on TP. Default (false)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
uniform mat3 normal_matrix;
|
||||
uniform mat4 texture_matrix0;
|
||||
uniform vec4 ambient_color; // <FS:Beq/> add ambient color to preview shader
|
||||
uniform mat4 modelview_matrix;
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
||||
|
|
@ -87,7 +88,7 @@ void main()
|
|||
|
||||
vec3 norm = normalize(normal_matrix * normal);
|
||||
|
||||
vec4 col = vec4(0,0,0,1);
|
||||
vec4 col = ambient_color; // <FS:Beq/> add ambient color to preview shader
|
||||
|
||||
// Collect normal lights (need to be divided by two, as we later multiply by 2)
|
||||
col.rgb += light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,74 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<COLLADA version="1.4.1" xmlns="http://www.collada.org/2005/11/COLLADASchema">
|
||||
<asset>
|
||||
<contributor>
|
||||
<author>Avastar User</author>
|
||||
<authoring_tool>Avastar 2-0-10 on Blender 2.78 (sub 0)</authoring_tool>
|
||||
</contributor>
|
||||
<created>2017-02-03T17:31:59</created>
|
||||
<modified>2017-02-03T17:31:59</modified>
|
||||
<unit meter="1" name="meter" />
|
||||
<up_axis>Z_UP</up_axis>
|
||||
</asset>
|
||||
<library_cameras />
|
||||
<library_lights />
|
||||
<library_effects />
|
||||
<library_materials />
|
||||
<library_geometries>
|
||||
<geometry id="Cube_023-mesh" name="Cube.023">
|
||||
<mesh>
|
||||
<source id="Cube_023-mesh-positions">
|
||||
<float_array count="24" id="Cube_023-mesh-positions-array">-0.4 -0.4 -0.4 -0.4 -0.4 0.4 -0.4 0.4 -0.4 -0.4 0.4 0.4 0.4 -0.4 -0.4 0.4 -0.4 0.4 0.4 0.4 -0.4 0.4 0.4 0.4 </float_array>
|
||||
<technique_common>
|
||||
<accessor count="8" source="#Cube_023-mesh-positions-array" stride="3">
|
||||
<param name="X" type="float" />
|
||||
<param name="Y" type="float" />
|
||||
<param name="Z" type="float" />
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="Cube_023-mesh-normals">
|
||||
<float_array count="18" id="Cube_023-mesh-normals-array">-1 -0 0 0 1 0 1 -0 0 0 -1 0 0 0 -1 0 -0 1 </float_array>
|
||||
<technique_common>
|
||||
<accessor count="6" source="#Cube_023-mesh-normals-array" stride="3">
|
||||
<param name="X" type="float" />
|
||||
<param name="Y" type="float" />
|
||||
<param name="Z" type="float" />
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<vertices id="Cube_023-mesh-vertices">
|
||||
<input semantic="POSITION" source="#Cube_023-mesh-positions" />
|
||||
</vertices>
|
||||
<polylist count="12">
|
||||
<input offset="0" semantic="VERTEX" source="#Cube_023-mesh-vertices" />
|
||||
<input offset="1" semantic="NORMAL" source="#Cube_023-mesh-normals" />
|
||||
<vcount>4 4 4 4 4 4</vcount>
|
||||
<p>0 0 1 0 3 0 2 0 2 1 3 1 7 1 6 1 6 2 7 2 5 2 4 2 4 3 5 3 1 3 0 3 2 4 6 4 4 4 0 4 7 5 3 5 1 5 5 5 </p>
|
||||
</polylist>
|
||||
</mesh>
|
||||
<extra>
|
||||
<technique profile="MAYA">
|
||||
<double_sided>1</double_sided>
|
||||
</technique>
|
||||
</extra>
|
||||
</geometry>
|
||||
</library_geometries>
|
||||
<library_controllers />
|
||||
<library_visual_scenes>
|
||||
<visual_scene id="Scene" name="Scene">
|
||||
<node id="Cube_023" name="Cube_023" type="NODE">
|
||||
<translate sid="location">5.93563 6.77334 -14.9673</translate>
|
||||
<rotate sid="rotationZ">0 0 1 0</rotate>
|
||||
<rotate sid="rotationY">0 1 0 0</rotate>
|
||||
<rotate sid="rotationX">1 0 0 0</rotate>
|
||||
<scale sid="scale">1 1 1</scale>
|
||||
<instance_geometry url="#Cube_023-mesh" />
|
||||
</node>
|
||||
</visual_scene>
|
||||
</library_visual_scenes>
|
||||
<scene>
|
||||
<instance_visual_scene url="#Scene" />
|
||||
</scene>
|
||||
</COLLADA>
|
||||
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<asset>
|
||||
<contributor>
|
||||
<author>Blender User</author>
|
||||
<authoring_tool>Blender 2.80.43 commit date:2019-01-29, commit time:22:41, hash:a1ae04d15a9f</authoring_tool>
|
||||
</contributor>
|
||||
<created>2019-02-05T14:28:24</created>
|
||||
<modified>2019-02-05T14:28:24</modified>
|
||||
<unit name="meter" meter="1"/>
|
||||
<up_axis>Z_UP</up_axis>
|
||||
</asset>
|
||||
<library_images/>
|
||||
<library_geometries>
|
||||
<geometry id="Cylinder-mesh" name="Cylinder">
|
||||
<mesh>
|
||||
<source id="Cylinder-mesh-positions">
|
||||
<float_array id="Cylinder-mesh-positions-array" count="36">0 1 -1 0 1 1 0.8660255 0.5 -1 0.8660255 0.5 1 0.8660254 -0.5000001 -1 0.8660254 -0.5000001 1 0 -1 -1 0 -1 1 -0.8660255 -0.4999999 -1 -0.8660255 -0.4999999 1 -0.8660255 0.4999999 -1 -0.8660255 0.4999999 1</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#Cylinder-mesh-positions-array" count="12" stride="3">
|
||||
<param name="X" type="float"/>
|
||||
<param name="Y" type="float"/>
|
||||
<param name="Z" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="Cylinder-mesh-normals">
|
||||
<float_array id="Cylinder-mesh-normals-array" count="48">0.5 0.8660255 0 1 0 0 0.5 -0.8660255 0 -0.5000001 -0.8660253 0 0 0 1 -1 0 0 -0.5000001 0.8660255 0 0 0 -1 1 -1.19209e-7 0 0.5 -0.8660255 0 -0.5000001 -0.8660254 0 0 0 1 1.37651e-7 0 1 0 0 1 1.37651e-7 0 -1 1.37651e-7 0 -1</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#Cylinder-mesh-normals-array" count="16" stride="3">
|
||||
<param name="X" type="float"/>
|
||||
<param name="Y" type="float"/>
|
||||
<param name="Z" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="Cylinder-mesh-map">
|
||||
<float_array id="Cylinder-mesh-map-array" count="120">1 1 0.8333333 0.5 1 0.5 0.8333333 1 0.6666666 0.5 0.8333333 0.5 0.6666666 1 0.5 0.5 0.6666666 0.5 0.5 1 0.3333333 0.5 0.5 0.5 0.25 0.49 0.04215389 0.13 0.4578461 0.1299999 0.3333333 1 0.1666666 0.5 0.3333333 0.5 0.1666666 1 0 0.5 0.1666666 0.5 0.5421539 0.13 0.5421539 0.37 0.9578461 0.37 1 1 0.8333333 1 0.8333333 0.5 0.8333333 1 0.6666666 1 0.6666666 0.5 0.6666666 1 0.5 1 0.5 0.5 0.5 1 0.3333333 1 0.3333333 0.5 0.4578461 0.1299999 0.4578461 0.37 0.25 0.49 0.25 0.49 0.04215389 0.37 0.04215389 0.13 0.04215389 0.13 0.25 0.00999999 0.4578461 0.1299999 0.3333333 1 0.1666666 1 0.1666666 0.5 0.1666666 1 0 1 0 0.5 0.5421539 0.37 0.75 0.49 0.9578461 0.37 0.9578461 0.37 0.9578461 0.1299999 0.75 0.00999999 0.75 0.00999999 0.5421539 0.13 0.9578461 0.37</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#Cylinder-mesh-map-array" count="60" stride="2">
|
||||
<param name="S" type="float"/>
|
||||
<param name="T" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<vertices id="Cylinder-mesh-vertices">
|
||||
<input semantic="POSITION" source="#Cylinder-mesh-positions"/>
|
||||
</vertices>
|
||||
<polylist count="20">
|
||||
<input semantic="VERTEX" source="#Cylinder-mesh-vertices" offset="0"/>
|
||||
<input semantic="NORMAL" source="#Cylinder-mesh-normals" offset="1"/>
|
||||
<input semantic="TEXCOORD" source="#Cylinder-mesh-map" offset="2" set="0"/>
|
||||
<vcount>3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 </vcount>
|
||||
<p>1 0 0 2 0 1 0 0 2 3 1 3 4 1 4 2 1 5 5 2 6 6 2 7 4 2 8 7 3 9 8 3 10 6 3 11 1 4 12 9 4 13 5 4 14 9 5 15 10 5 16 8 5 17 11 6 18 0 6 19 10 6 20 8 7 21 10 7 22 2 7 23 1 0 24 3 0 25 2 0 26 3 8 27 5 8 28 4 8 29 5 9 30 7 9 31 6 9 32 7 10 33 9 10 34 8 10 35 5 11 36 3 11 37 1 11 38 1 12 39 11 12 40 9 12 41 9 13 42 7 13 43 5 13 44 9 5 45 11 5 46 10 5 47 11 6 48 1 6 49 0 6 50 10 14 51 0 14 52 2 14 53 2 15 54 4 15 55 6 15 56 6 7 57 8 7 58 2 7 59</p>
|
||||
</polylist>
|
||||
</mesh>
|
||||
</geometry>
|
||||
</library_geometries>
|
||||
<library_visual_scenes>
|
||||
<visual_scene id="Scene" name="Scene">
|
||||
<node id="Cylinder" name="Cylinder" type="NODE">
|
||||
<matrix sid="transform">1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</matrix>
|
||||
<instance_geometry url="#Cylinder-mesh" name="Cylinder"/>
|
||||
</node>
|
||||
</visual_scene>
|
||||
</library_visual_scenes>
|
||||
<scene>
|
||||
<instance_visual_scene url="#Scene"/>
|
||||
</scene>
|
||||
</COLLADA>
|
||||
|
|
@ -1883,8 +1883,13 @@ bool LLAppViewer::doFrame()
|
|||
S32 work_pending = 0;
|
||||
S32 io_pending = 0;
|
||||
F32 max_time = llmin(gFrameIntervalSeconds.value() *10.f, 1.f);
|
||||
|
||||
// <FS:Beq> instrument image decodes
|
||||
{
|
||||
FSZoneN("updateTextureThreads");
|
||||
// FSPlot("max_time_ms",max_time);
|
||||
// <FS:Beq/>
|
||||
work_pending += updateTextureThreads(max_time);
|
||||
} // <FS:Beq/> instrument image decodes
|
||||
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_LFS);
|
||||
|
|
@ -3829,6 +3834,7 @@ LLSD LLAppViewer::getViewerInfo() const
|
|||
// CPU
|
||||
info["CPU"] = gSysCPU.getCPUString();
|
||||
info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB().valueInUnits<LLUnits::Megabytes>());
|
||||
info["CONCURRENCY"] = LLSD::Integer((S32)boost::thread::hardware_concurrency()); // <FS:Beq> Add hardware concurrency to info
|
||||
// Moved hack adjustment to Windows memory size into llsys.cpp
|
||||
info["OS_VERSION"] = LLOSInfo::instance().getOSString();
|
||||
info["GRAPHICS_CARD_VENDOR"] = ll_safe_string((const char*)(glGetString(GL_VENDOR)));
|
||||
|
|
|
|||
|
|
@ -864,9 +864,11 @@ void LLFloaterModelPreview::draw()
|
|||
|
||||
if (!mModelPreview->mLoading)
|
||||
{
|
||||
if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_MATERIALS )
|
||||
if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_MATERIALS_NOT_A_SUBSET )// <FS:Beq/> Improve error reporting
|
||||
{
|
||||
childSetTextArg("status", "[STATUS]", getString("status_material_mismatch"));
|
||||
// <FS:Beq> cleanup/improve errors - this error is effectively duplicated, the unused one was actually better
|
||||
// childSetTextArg("status", "[STATUS]", getString("status_material_mismatch"));
|
||||
childSetTextArg("status", "[STATUS]", getString("mesh_status_invalid_material_list"));
|
||||
}
|
||||
else
|
||||
if ( mModelPreview->getLoadState() > LLModelLoader::ERROR_MODEL )
|
||||
|
|
@ -879,6 +881,13 @@ void LLFloaterModelPreview::draw()
|
|||
childSetTextArg("status", "[STATUS]", getString("status_parse_error"));
|
||||
toggleCalculateButton(false);
|
||||
}
|
||||
// <FS:Beq> improve error reporting
|
||||
else
|
||||
if ( mModelPreview->getLoadState() == LLModelLoader::ERROR_LOD_MODEL_MISMATCH )
|
||||
{
|
||||
childSetTextArg("status", "[STATUS]", getString("status_lod_model_mismatch"));
|
||||
toggleCalculateButton(false);
|
||||
}
|
||||
else
|
||||
if (mModelPreview->getLoadState() == LLModelLoader::WARNING_BIND_SHAPE_ORIENTATION)
|
||||
{
|
||||
|
|
@ -1130,8 +1139,21 @@ void LLFloaterModelPreview::onPhysicsUseLOD(LLUICtrl* ctrl, void* userdata)
|
|||
S32 file_mode = iface->getItemCount() - 1;
|
||||
if (which_mode < file_mode)
|
||||
{
|
||||
S32 which_lod = num_lods - which_mode;
|
||||
sInstance->mModelPreview->setPhysicsFromLOD(which_lod);
|
||||
// <FS:Beq> FIRE-30963 Support pre-defined physics shapes (initially cube)
|
||||
// S32 which_lod = num_lods - which_mode;
|
||||
// sInstance->mModelPreview->setPhysicsFromLOD(which_lod);
|
||||
if(which_mode >= num_lods)
|
||||
{
|
||||
// which_mode is between the last LOD entry and file selection
|
||||
// so it is a preset
|
||||
sInstance->mModelPreview->setPhysicsFromPreset(which_mode-num_lods);
|
||||
}
|
||||
else
|
||||
{
|
||||
S32 which_lod = num_lods - which_mode;
|
||||
sInstance->mModelPreview->setPhysicsFromLOD(which_lod);
|
||||
}
|
||||
// </FS:Beq>
|
||||
}
|
||||
|
||||
LLModelPreview *model_preview = sInstance->mModelPreview;
|
||||
|
|
@ -1738,7 +1760,7 @@ void LLFloaterModelPreview::setCtrlLoadFromFile(S32 lod)
|
|||
LLComboBox* lod_combo = findChild<LLComboBox>("physics_lod_combo");
|
||||
if (lod_combo)
|
||||
{
|
||||
lod_combo->setCurrentByIndex(5);
|
||||
lod_combo->setCurrentByIndex(lod_combo->getItemCount() - 1); // <FS:Beq/> FIRE-30963 - better physics defaults
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -2234,6 +2234,22 @@ bool LLInventoryModel::loadSkeleton(
|
|||
LLFile::remove(inventory_filename);
|
||||
}
|
||||
|
||||
// also delete library cache if inventory cache is purged, so issues with EEP settings going missing
|
||||
// and bridge objects not being found can be resolved
|
||||
inventory_filename = getInvCacheAddres(ALEXANDRIA_LINDEN_ID);
|
||||
if (LLFile::isfile(inventory_filename))
|
||||
{
|
||||
LL_INFOS("LLInventoryModel") << "Purging library cache file: " << inventory_filename << LL_ENDL;
|
||||
LLFile::remove(inventory_filename);
|
||||
}
|
||||
|
||||
inventory_filename.append(".gz");
|
||||
if (LLFile::isfile(inventory_filename))
|
||||
{
|
||||
LL_INFOS("LLInventoryModel") << "Purging library cache file: " << inventory_filename << LL_ENDL;
|
||||
LLFile::remove(inventory_filename);
|
||||
}
|
||||
|
||||
LL_INFOS("LLInventoryModel") << "Clear inventory cache marker removed: " << delete_cache_marker << LL_ENDL;
|
||||
LLFile::remove(delete_cache_marker);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -368,6 +368,118 @@ U32 LLModelPreview::calcResourceCost()
|
|||
return (U32)streaming_cost;
|
||||
}
|
||||
|
||||
// <FS:Beq> relocate from llmodel and rewrite so it does what it is meant to
|
||||
// Material matching should work as the comment below states (subsets are allowed)
|
||||
// prior to this a mess in multiple places meant that all LODs are forced to carry unwanted triangles for unused materials
|
||||
bool LLModelPreview::matchMaterialOrder(LLModel* lod, LLModel* ref, int& refFaceCnt, int& modelFaceCnt )
|
||||
{
|
||||
//Is this a subset?
|
||||
//LODs cannot currently add new materials, e.g.
|
||||
//1. ref = a,b,c lod1 = d,e => This is not permitted
|
||||
//2. ref = a,b,c lod1 = c => This would be permitted
|
||||
|
||||
LL_INFOS("MESHSKININFO") << "In matchMaterialOrder." << LL_ENDL;
|
||||
bool isASubset = lod->isMaterialListSubset( ref );
|
||||
if ( !isASubset )
|
||||
{
|
||||
LL_INFOS("MESHSKININFO")<<"Material of model is not a subset of reference."<<LL_ENDL;
|
||||
std::ostringstream out;
|
||||
out << "LOD model " << lod->getName() << "'s materials are not a subset of the High LOD (reference) model " << ref->getName();
|
||||
LL_INFOS() << out.str() << LL_ENDL;
|
||||
LLFloaterModelPreview::addStringToLog(out, true);
|
||||
return false;
|
||||
}
|
||||
|
||||
LL_DEBUGS("MESHSKININFO") << "subset check passed." << LL_ENDL;
|
||||
std::map<std::string, U32> index_map;
|
||||
|
||||
//build a map of material slot names to face indexes
|
||||
bool reorder = false;
|
||||
auto max_lod_mats = lod->mMaterialList.size();
|
||||
|
||||
for ( U32 i = 0; i < ref->mMaterialList.size(); i++ )
|
||||
{
|
||||
// create the reference map for later
|
||||
index_map[ref->mMaterialList[i]] = i;
|
||||
LL_DEBUGS("MESHSKININFO") << "setting reference material " << ref->mMaterialList[i] << " as index " << i << LL_ENDL;
|
||||
if( i >= max_lod_mats || lod->mMaterialList[i] != ref->mMaterialList[i] )
|
||||
{
|
||||
// i is already out of range of the original material sets in this LOD OR is not matching.
|
||||
LL_DEBUGS("MESHSKININFO") << "mismatch at " << i << " " << ref->mMaterialList[i]
|
||||
<< " != " << ((i >= max_lod_mats)? "Out-of-range":lod->mMaterialList[i]) << LL_ENDL;
|
||||
// we have a misalignment/ordering
|
||||
// check that ref[i] is in cur and if not add a blank
|
||||
U32 j{0};
|
||||
for ( ; j < max_lod_mats; j++ )
|
||||
{
|
||||
if( i != j && lod->mMaterialList[j] == ref->mMaterialList[i] )
|
||||
{
|
||||
LL_DEBUGS("MESHSKININFO") << "material " << ref->mMaterialList[i]
|
||||
<< " found at " << j << LL_ENDL;
|
||||
// we found it but in the wrong place.
|
||||
reorder = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( j >= max_lod_mats )
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "material " << ref->mMaterialList[i]
|
||||
<< " not found in lod adding placeholder";
|
||||
LL_DEBUGS("MESHSKININFO") << out.str() << LL_ENDL;
|
||||
if (mImporterDebug)
|
||||
{
|
||||
LLFloaterModelPreview::addStringToLog(out, false);
|
||||
}
|
||||
// The material is not in the submesh, add a placeholder.
|
||||
// this is appended to the existing data so we'll need to reorder
|
||||
// Note that this placeholder will be eliminated on the writeData (upload) and replaced with
|
||||
// "NoGeometry" in the LLSD
|
||||
reorder = true;
|
||||
LLVolumeFace face;
|
||||
|
||||
face.resizeIndices(3);
|
||||
face.resizeVertices(1);
|
||||
face.mPositions->clear();
|
||||
face.mNormals->clear();
|
||||
face.mTexCoords->setZero();
|
||||
memset(face.mIndices, 0, sizeof(U16)*3);
|
||||
lod->addFace(face);
|
||||
lod->mMaterialList.push_back( ref->mMaterialList[i] );
|
||||
}
|
||||
}
|
||||
//if any material name does not match reference, we need to reorder
|
||||
}
|
||||
LL_DEBUGS("MESHSKININFO") << "finished parsing materials" << LL_ENDL;
|
||||
for ( U32 i = 0; i < lod->mMaterialList.size(); i++ )
|
||||
{
|
||||
LL_DEBUGS("MESHSKININFO") << "lod material " << lod->mMaterialList[i] << " has index " << i << LL_ENDL;
|
||||
}
|
||||
// Sanity check. We have added placeholders for any mats in ref that are not in this.
|
||||
// the mat count MUST be equal now.
|
||||
if (lod->mMaterialList.size() != ref->mMaterialList.size())
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Material of LOD model " << lod->getName() << " has more materials than the reference " << ref->getName() << ".";
|
||||
LL_INFOS("MESHSKININFO") << out.str() << LL_ENDL;
|
||||
LLFloaterModelPreview::addStringToLog(out, true);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// <FS:Beq> Fix up material matching badness
|
||||
// if (reorder && (base_mat == cur_mat)) //don't reorder if material name sets don't match
|
||||
if ( reorder )
|
||||
{
|
||||
LL_INFOS("MESHSKININFO") << "re-ordering." << LL_ENDL;
|
||||
lod->sortVolumeFacesByMaterialName();
|
||||
lod->mMaterialList = ref->mMaterialList;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
//</FS:Beq>
|
||||
|
||||
void LLModelPreview::rebuildUploadData()
|
||||
{
|
||||
assert_main_thread();
|
||||
|
|
@ -582,7 +694,7 @@ void LLModelPreview::rebuildUploadData()
|
|||
if (!high_lod_model)
|
||||
{
|
||||
LLFloaterModelPreview::addStringToLog("Model " + instance.mLabel + " has no High Lod (LOD3).", true);
|
||||
load_state = LLModelLoader::ERROR_MATERIALS;
|
||||
load_state = LLModelLoader::ERROR_HIGH_LOD_MODEL_MISSING; // <FS:Beq/> FIRE-30965 Cleanup braindead mesh parsing error handlers
|
||||
mFMP->childDisable("calculate_btn");
|
||||
}
|
||||
else
|
||||
|
|
@ -592,10 +704,13 @@ void LLModelPreview::rebuildUploadData()
|
|||
int refFaceCnt = 0;
|
||||
int modelFaceCnt = 0;
|
||||
llassert(instance.mLOD[i]);
|
||||
if (instance.mLOD[i] && !instance.mLOD[i]->matchMaterialOrder(high_lod_model, refFaceCnt, modelFaceCnt))
|
||||
// <FS:Beq> Fix material matching algorithm to work as per design
|
||||
// if (instance.mLOD[i] && !instance.mLOD[i]->matchMaterialOrder(high_lod_model, refFaceCnt, modelFaceCnt))
|
||||
if (instance.mLOD[i] && !matchMaterialOrder(instance.mLOD[i],high_lod_model, refFaceCnt, modelFaceCnt))
|
||||
// </FS:Beq>
|
||||
{
|
||||
LLFloaterModelPreview::addStringToLog("Model " + instance.mLabel + " has mismatching materials between lods." , true);
|
||||
load_state = LLModelLoader::ERROR_MATERIALS;
|
||||
load_state = LLModelLoader::ERROR_MATERIALS_NOT_A_SUBSET; // <FS:Beq/> more descriptive errors
|
||||
mFMP->childDisable("calculate_btn");
|
||||
}
|
||||
}
|
||||
|
|
@ -644,14 +759,15 @@ void LLModelPreview::rebuildUploadData()
|
|||
}
|
||||
if (!found_model && mModel[lod][model_ind] && !mModel[lod][model_ind]->mSubmodelID)
|
||||
{
|
||||
if (mImporterDebug)
|
||||
// <FS:Beq> this is not debug, this is an important/useful error advisory
|
||||
// if (mImporterDebug)
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Model " << mModel[lod][model_ind]->mLabel << " was not used - mismatching lod models.";
|
||||
LL_INFOS() << out.str() << LL_ENDL;
|
||||
LLFloaterModelPreview::addStringToLog(out, true);
|
||||
}
|
||||
load_state = LLModelLoader::ERROR_MATERIALS;
|
||||
load_state = LLModelLoader::ERROR_LOD_MODEL_MISMATCH;
|
||||
mFMP->childDisable("calculate_btn");
|
||||
}
|
||||
}
|
||||
|
|
@ -663,7 +779,12 @@ void LLModelPreview::rebuildUploadData()
|
|||
// encountered issues
|
||||
setLoadState(load_state);
|
||||
}
|
||||
else if (getLoadState() == LLModelLoader::ERROR_MATERIALS
|
||||
// <FS:Beq> FIRE-30965 Cleanup braindead mesh parsing error handlers
|
||||
// else if (getLoadState() == LLModelLoader::ERROR_MATERIALS
|
||||
else if (getLoadState() == LLModelLoader::ERROR_MATERIALS_NOT_A_SUBSET
|
||||
|| getLoadState() == LLModelLoader::ERROR_HIGH_LOD_MODEL_MISSING
|
||||
|| getLoadState() == LLModelLoader::ERROR_LOD_MODEL_MISMATCH
|
||||
// </FS:Beq>
|
||||
|| getLoadState() == LLModelLoader::WARNING_BIND_SHAPE_ORIENTATION)
|
||||
{
|
||||
// This is only valid for these two error types because they are
|
||||
|
|
@ -922,7 +1043,38 @@ void LLModelPreview::setPhysicsFromLOD(S32 lod)
|
|||
updateStatusMessages();
|
||||
}
|
||||
}
|
||||
// <FS:Beq> FIRE-30963 - better physics defaults
|
||||
void LLModelPreview::setPhysicsFromPreset(S32 preset)
|
||||
{
|
||||
assert_main_thread();
|
||||
|
||||
mPhysicsSearchLOD = -1;
|
||||
mLODFile[LLModel::LOD_PHYSICS].clear();
|
||||
mFMP->childSetValue("physics_file", mLODFile[LLModel::LOD_PHYSICS]);
|
||||
mVertexBuffer[LLModel::LOD_PHYSICS].clear();
|
||||
if(preset == 1)
|
||||
{
|
||||
mPhysicsSearchLOD = LLModel::LOD_PHYSICS;
|
||||
loadModel( gDirUtilp->getExpandedFilename(LL_PATH_FS_RESOURCES, "cube_phys.dae"), LLModel::LOD_PHYSICS);
|
||||
}
|
||||
else if(preset == 2)
|
||||
{
|
||||
mPhysicsSearchLOD = LLModel::LOD_PHYSICS;
|
||||
loadModel( gDirUtilp->getExpandedFilename(LL_PATH_FS_RESOURCES, "hex_phys.dae"), LLModel::LOD_PHYSICS);
|
||||
}
|
||||
else if(preset == 3)
|
||||
{
|
||||
auto ud_physics = gSavedSettings.getString("FSPhysicsPresetUser1");
|
||||
LL_INFOS() << "Loading User defined Physics Preset [" << ud_physics << "]" << LL_ENDL;
|
||||
if (ud_physics != "" && gDirUtilp->fileExists(ud_physics))
|
||||
{
|
||||
// loading physics from file
|
||||
mPhysicsSearchLOD = LLModel::LOD_PHYSICS;
|
||||
loadModel( gDirUtilp->getExpandedFilename(LL_PATH_NONE, gDirUtilp->getDirName(ud_physics), gDirUtilp->getBaseFileName(ud_physics, false)), LLModel::LOD_PHYSICS);
|
||||
}
|
||||
}
|
||||
}
|
||||
// </FS:Beq>
|
||||
void LLModelPreview::clearIncompatible(S32 lod)
|
||||
{
|
||||
//Don't discard models if specified model is the physic rep
|
||||
|
|
@ -1841,7 +1993,7 @@ void LLModelPreview::updateStatusMessages()
|
|||
LLModel* model_high_lod = instance.mLOD[LLModel::LOD_HIGH];
|
||||
if (!model_high_lod)
|
||||
{
|
||||
setLoadState(LLModelLoader::ERROR_MATERIALS);
|
||||
setLoadState(LLModelLoader::ERROR_HIGH_LOD_MODEL_MISSING); // <FS:Beq/> FIRE-30965 Cleanup braindead mesh parsing error handlers
|
||||
mFMP->childDisable("calculate_btn");
|
||||
continue;
|
||||
}
|
||||
|
|
@ -1851,7 +2003,7 @@ void LLModelPreview::updateStatusMessages()
|
|||
LLModel* lod_model = instance.mLOD[i];
|
||||
if (!lod_model)
|
||||
{
|
||||
setLoadState(LLModelLoader::ERROR_MATERIALS);
|
||||
setLoadState(LLModelLoader::ERROR_LOD_MODEL_MISMATCH); // <FS:Beq/> FIRE-30965 Cleanup braindead mesh parsing error handlers
|
||||
mFMP->childDisable("calculate_btn");
|
||||
}
|
||||
else
|
||||
|
|
@ -2365,10 +2517,7 @@ void LLModelPreview::updateStatusMessages()
|
|||
|
||||
//fmp->childSetEnabled("physics_optimize", !use_hull);
|
||||
|
||||
// <FS:Ansariel> Enable mesh analysis in SL only for now
|
||||
//bool enable = (phys_tris > 0 || phys_hulls > 0) && fmp->mCurRequest.empty();
|
||||
bool enable = (phys_tris > 0 || phys_hulls > 0) && fmp->mCurRequest.empty() && LLGridManager::instance().isInSecondLife();
|
||||
// </FS:Ansariel>
|
||||
bool enable = (phys_tris > 0 || phys_hulls > 0) && fmp->mCurRequest.empty();
|
||||
//enable = enable && !use_hull && fmp->childGetValue("physics_optimize").asBoolean();
|
||||
|
||||
//enable/disable "analysis" UI
|
||||
|
|
@ -2402,13 +2551,10 @@ void LLModelPreview::updateStatusMessages()
|
|||
fmp->childEnable("Simplify");
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Enable mesh analysis in SL only for now
|
||||
//if (phys_tris || phys_hulls > 0)
|
||||
//{
|
||||
// fmp->childEnable("Decompose");
|
||||
//}
|
||||
fmp->childSetEnabled("Decompose", (phys_tris || phys_hulls > 0) && LLGridManager::instance().isInSecondLife());
|
||||
// </FS:Ansariel>
|
||||
if (phys_tris || phys_hulls > 0)
|
||||
{
|
||||
fmp->childEnable("Decompose");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -3227,6 +3373,7 @@ BOOL LLModelPreview::render()
|
|||
|
||||
gGL.loadIdentity();
|
||||
gPipeline.enableLightsPreview();
|
||||
gObjectPreviewProgram.uniform4fv(LLShaderMgr::AMBIENT, 1, LLPipeline::PreviewAmbientColor.mV); // <FS:Beq> pass ambient setting to shader
|
||||
|
||||
LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) *
|
||||
LLQuaternion(mCameraYaw, LLVector3::z_axis);
|
||||
|
|
|
|||
|
|
@ -139,6 +139,7 @@ public:
|
|||
void setTexture(U32 name) { mTextureName = name; }
|
||||
|
||||
void setPhysicsFromLOD(S32 lod);
|
||||
void setPhysicsFromPreset(S32 preset);// <FS:Beq/> FIRE-30963 - better physics defaults
|
||||
BOOL render();
|
||||
void update();
|
||||
void genBuffers(S32 lod, bool skinned);
|
||||
|
|
@ -199,7 +200,7 @@ public:
|
|||
bool mHasDegenerate;
|
||||
|
||||
protected:
|
||||
|
||||
bool matchMaterialOrder(LLModel* lod, LLModel* ref, int& refFaceCnt, int& modelFaceCnt ); // <FS:Beq/> FIRE-30965 Cleanup mesh material parsing
|
||||
static void loadedCallback(LLModelLoader::scene& scene, LLModelLoader::model_list& model_list, S32 lod, void* opaque);
|
||||
static void stateChangedCallback(U32 state, void* opaque);
|
||||
|
||||
|
|
|
|||
|
|
@ -235,4 +235,28 @@ void LLPreviewAnim::onClose(bool app_quitting)
|
|||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
// virtual
|
||||
void LLPreviewAnim::refreshFromItem()
|
||||
{
|
||||
LLPreview::refreshFromItem();
|
||||
|
||||
const LLInventoryItem* item = getItem();
|
||||
if (item)
|
||||
{
|
||||
pMotion = gAgentAvatarp->createMotion(item->getAssetUUID()); // preload the animation
|
||||
|
||||
if (pMotion)
|
||||
{
|
||||
LLTextBox* stats_box_left = getChild<LLTextBox>("AdvancedStatsLeft");
|
||||
LLTextBox* stats_box_right = getChild<LLTextBox>("AdvancedStatsRight");
|
||||
stats_box_left->setTextArg("[PRIORITY]", llformat("%d", pMotion->getPriority()));
|
||||
stats_box_left->setTextArg("[DURATION]", llformat("%.2f", pMotion->getDuration()));
|
||||
stats_box_left->setTextArg("[IS_LOOP]", (pMotion->getLoop() ? LLTrans::getString("PermYes") : LLTrans::getString("PermNo")));
|
||||
stats_box_right->setTextArg("[EASE_IN]", llformat("%.2f", pMotion->getEaseInDuration()));
|
||||
stats_box_right->setTextArg("[EASE_OUT]", llformat("%.2f", pMotion->getEaseOutDuration()));
|
||||
stats_box_right->setTextArg("[NUM_JOINTS]", llformat("%d", pMotion->getNumJointMotions()));
|
||||
}
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ public:
|
|||
void play(const LLSD& param);
|
||||
// <FS:Ansariel> Improved animation preview
|
||||
//void showAdvanced();
|
||||
/*virtual*/ void refreshFromItem();
|
||||
|
||||
protected:
|
||||
|
||||
|
|
|
|||
|
|
@ -3956,6 +3956,13 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
|
|||
gSavedPerAccountSettings.setBOOL("FSRenderFriendsOnly", FALSE);
|
||||
}
|
||||
// </FS:Beq>
|
||||
// <FS:Beq pp Becca> FIRE-30947: Auto-Unmute
|
||||
if (gSavedSettings.getBOOL("MuteSounds") && gSavedSettings.getBOOL("FSAutoUnmuteSounds"))
|
||||
gSavedSettings.setBOOL("MuteSounds", FALSE);
|
||||
|
||||
if (gSavedSettings.getBOOL("MuteAmbient") && gSavedSettings.getBOOL("FSAutoUnmuteAmbient"))
|
||||
gSavedSettings.setBOOL("MuteAmbient", FALSE);
|
||||
// </FS:Beq pp Becca>
|
||||
if (gAgent.getTeleportKeepsLookAt())
|
||||
{
|
||||
// *NOTE: the LookAt data we get from the sim here doesn't
|
||||
|
|
|
|||
|
|
@ -3219,7 +3219,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
|||
|
||||
if (success)
|
||||
{
|
||||
gObjectPreviewProgram.mName = "Simple Shader";
|
||||
gObjectPreviewProgram.mName = "Preview Shader"; // <FS:Beq> update preview shader name
|
||||
gObjectPreviewProgram.mFeatures.calculatesLighting = false;
|
||||
gObjectPreviewProgram.mFeatures.calculatesAtmospherics = false;
|
||||
gObjectPreviewProgram.mFeatures.hasGamma = false;
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@
|
|||
<string name="status_material_mismatch">
|
||||
Fehler: Das Material des Modells ist keine Teilmenge des Referenzmodells.
|
||||
</string>
|
||||
<string name="status_lod_model_mismatch">
|
||||
Fehler: LOD-Model hat keinen Vorgänger.
|
||||
</string>
|
||||
<string name="status_reading_file">
|
||||
Laden...
|
||||
</string>
|
||||
|
|
@ -239,6 +242,15 @@
|
|||
<combo_item name="physics_lowest">
|
||||
Niedrigste
|
||||
</combo_item>
|
||||
<combo_item name="physics_cube">
|
||||
Würfel
|
||||
</combo_item>
|
||||
<combo_item name="physics_hex">
|
||||
Hexagon
|
||||
</combo_item>
|
||||
<combo_item name="physics_ud">
|
||||
Benutzerdefiniert
|
||||
</combo_item>
|
||||
<combo_item name="load_from_file">
|
||||
Aus Datei
|
||||
</combo_item>
|
||||
|
|
@ -369,6 +381,10 @@
|
|||
</text>
|
||||
<check_box label="Gewichte automatisch aktivieren" tool_tip="Automatisch die Gewichte für Netze mit Rigging-Informationen aktivieren" name="mesh_preview_auto_weights"/>
|
||||
<check_box label="Automatische Vorschau für Gewichte" tool_tip="Zeigt automatisch die Gewichte für Netze mit Rigging-Informationen in der Vorschau" name="mesh_preview_auto_show_weights"/>
|
||||
<text name="mesh_preview_ud_preset_label" width="220">
|
||||
Benutzerdefinierte Physik-Einstellungen:
|
||||
</text>
|
||||
<line_editor name="ud_physics" tool_tip="Dateipfad zu einer einfachen Collada Mesh-Definition, die für Physik verwendet wird." />
|
||||
<text name="mesh_preview_colors_label">
|
||||
Farben für Modell-Upload:
|
||||
</text>
|
||||
|
|
@ -377,6 +393,7 @@
|
|||
</text>
|
||||
<color_swatch label="Hintergrund" tool_tip="Hintergrundfarbe für den Uploader" name="mesh_preview_canvas_color"/>
|
||||
<color_swatch label="Modell-Kanten" tool_tip="Farbe für Kanten des Modells im Vorschau-Fenster" name="mesh_preview_edge_color"/>
|
||||
<color_swatch label="Umgebungslicht" tool_tip="Umgebungslicht im Vorschau-Fenster (hat ebenfalls Auswirkung u.a. auf Vorschau für Animationsupload)" name="preview_ambient_color"/>
|
||||
<text name="physics_settings_label">
|
||||
Physik:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -135,6 +135,7 @@
|
|||
<slider label="Zusätzliche Textur-Speicherbuffer-Reserve (%):" name="FSDynamicTextureMemoryCacheReserve" tool_tip="Prozentsatz des gesamten Videospeichers, der zum Zwischenspeichern von geladenen Texturen verwendet wird, die aktuell nicht dargestellt werden."/>
|
||||
<slider label="Physische Videospeicher-Reserve (%):" name="FSDynamicTextureMemoryGPUReserve" tool_tip="Prozentsatz des gesamten Videospeichers, der für andere Zwecke reserviert wird."/>
|
||||
<spinner label="Nebeldistanzverhältnis:" name="fog"/>
|
||||
<spinner label="Parallelität Textur-Dekodierung:" name="image_decode_threads" tool_tip="Die Anzahl an Threads, für zur Dekodierung von Texturen verwendet wird. 0 = Automatisch ermitteln, 1 = Synchron, 2+ = Benutzerdefiniert. (Empfohlen: 0 oder 1)"/>
|
||||
</panel>
|
||||
|
||||
<panel label="Darstellung" name="Rendering">
|
||||
|
|
|
|||
|
|
@ -25,6 +25,11 @@
|
|||
<check_box label="Aktiviert" name="enable_media"/>
|
||||
<slider label="Voice-Chat" name="Voice Volume"/>
|
||||
<check_box label="Aktiviert" name="enable_voice_check_volume"/>
|
||||
<text name="auto_unmute_label">
|
||||
Stummschaltung nach Teleport automatisch aufheben:
|
||||
</text>
|
||||
<check_box name="FSAutoUnmuteAmbient" label="Umgebung" tool_tip="Automatisch Stummschaltung für Umgebungsgeräusche nach Teleport aufheben, falls stummgeschaltet (Standard: Aus)"/>
|
||||
<check_box name="FSAutoUnmuteSounds" label="Klänge" tool_tip="Automatisch Stummschaltung für Klänge nach Teleport aufheben, falls stummgeschaltet (Standard: Aus)"/>
|
||||
<text name="friends_logon_sounds_label">
|
||||
Klang abspielen wenn sich Freunde:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ SLURL: <nolink>[SLURL]</nolink>
|
|||
<string name="AboutSystem">
|
||||
CPU: [CPU]
|
||||
Speicher: [MEMORY_MB] MB
|
||||
Parallelität: [CONCURRENCY]
|
||||
Betriebssystemversion: [OS_VERSION]
|
||||
Grafikkartenhersteller: [GRAPHICS_CARD_VENDOR]
|
||||
Grafikkarte: [GRAPHICS_CARD]
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by:
|
|||
top_pad="4"
|
||||
width="450"
|
||||
wrap="true">
|
||||
Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, MorganMegan, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
|
||||
Albatroz Hird, Alexie Birman, Andromeda Rage, Angeldark Raymaker, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, MorganMegan, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Rebecca Ashbourne, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
|
||||
</text>
|
||||
<text
|
||||
follows="top|left"
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
<string name="status_parse_error">Error: Dae parsing issue - see log for details.</string>
|
||||
<string name="status_bind_shape_orientation">Warning: bind shape matrix is not in standard X-forward orientation.</string>
|
||||
<string name="status_material_mismatch">Error: Material of model is not a subset of reference model.</string>
|
||||
<string name="status_lod_model_mismatch">Error: LOD Model has no parent.</string>
|
||||
<string name="status_reading_file">Loading...</string>
|
||||
<string name="status_generating_meshes">Generating Meshes...</string>
|
||||
<string name="status_vertex_number_overflow">Error: Vertex number is more than 65535, aborted!</string>
|
||||
|
|
@ -787,6 +788,9 @@
|
|||
<combo_item name="physics_medium"> Medium </combo_item>
|
||||
<combo_item name="physics_low"> Low </combo_item>
|
||||
<combo_item name="physics_lowest"> Lowest </combo_item>
|
||||
<combo_item name="physics_cube"> Cube </combo_item>
|
||||
<combo_item name="physics_hex"> Hexagon </combo_item>
|
||||
<combo_item name="physics_ud"> User Defined </combo_item>
|
||||
<combo_item name="load_from_file"> From file </combo_item>
|
||||
</combo_box>
|
||||
<line_editor
|
||||
|
|
@ -956,15 +960,15 @@
|
|||
left_pad="40"
|
||||
name="pass_method_header"
|
||||
height="15"
|
||||
width="41">
|
||||
width="79">
|
||||
Passes:
|
||||
</text>
|
||||
<text
|
||||
follows="top|left"
|
||||
left_pad="40"
|
||||
left_pad="2"
|
||||
name="Detail Scale label"
|
||||
height="15"
|
||||
width="80">
|
||||
width="100">
|
||||
Detail scale:
|
||||
</text>
|
||||
<text
|
||||
|
|
@ -1414,12 +1418,35 @@
|
|||
<check_box
|
||||
control_name="FSMeshUploadAutoShowWeightsWhenEnabled"
|
||||
follows="top|left"
|
||||
top_pad="8"
|
||||
left="24"
|
||||
left_pad="5"
|
||||
width="300"
|
||||
label="Auto-preview weights"
|
||||
tool_tip="Automatically show weights in preview for meshes with rigging info"
|
||||
name="mesh_preview_auto_show_weights"/>
|
||||
<text
|
||||
follows="left|top"
|
||||
layout="topleft"
|
||||
left="24"
|
||||
height="12"
|
||||
name="mesh_preview_ud_preset_label"
|
||||
top_pad="10"
|
||||
width="200">
|
||||
Physics User Defined Preset:
|
||||
</text>
|
||||
<line_editor
|
||||
control_name="FSPhysicsPresetUser1"
|
||||
border_style="line"
|
||||
border_thickness="1"
|
||||
follows="left|top"
|
||||
font="SansSerif"
|
||||
height="23"
|
||||
top_delta="-7"
|
||||
layout="topleft"
|
||||
left_pad="5"
|
||||
max_length_chars="4096"
|
||||
name="ud_physics"
|
||||
tool_tip="Full system path to a simple Collada mesh definition to be used for physics."
|
||||
width="270" />
|
||||
<text
|
||||
follows="left|top"
|
||||
layout="topleft"
|
||||
|
|
@ -1465,6 +1492,16 @@
|
|||
label="Model Edge"
|
||||
tool_tip="Edge color for the model in preview window on the Mesh uploader"
|
||||
name="mesh_preview_edge_color"/>
|
||||
<color_swatch
|
||||
control_name="PreviewAmbientColor"
|
||||
follows="top|left"
|
||||
left_pad="24"
|
||||
height="64"
|
||||
width="120"
|
||||
can_apply_immediately="true"
|
||||
label="Ambient Light"
|
||||
tool_tip="Ambient light level in preview window (also affects animation preview etc)"
|
||||
name="preview_ambient_color"/>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
|
|
@ -1882,7 +1919,7 @@ Analysed:
|
|||
name="show_joint_positions"
|
||||
word_wrap="down"
|
||||
left_pad="0"
|
||||
width="65"/>
|
||||
width="70"/>
|
||||
<check_box
|
||||
follows="top|left"
|
||||
label="Joint Pos. Overrides"
|
||||
|
|
@ -1890,7 +1927,7 @@ Analysed:
|
|||
layout="topleft"
|
||||
name="show_joint_overrides"
|
||||
left_pad="5"
|
||||
width="100">
|
||||
width="110">
|
||||
</check_box>
|
||||
</panel>
|
||||
<!-- ========== NOTE MESSAGE ========== -->
|
||||
|
|
|
|||
|
|
@ -1085,6 +1085,22 @@
|
|||
name="fog"
|
||||
top_pad="7"
|
||||
width="262" />
|
||||
<spinner
|
||||
control_name="FSImageDecodeThreads"
|
||||
decimal_digits="0"
|
||||
increment="1"
|
||||
follows="left|top"
|
||||
height="22"
|
||||
label="Image decode concurrency:"
|
||||
label_width="198"
|
||||
layout="topleft"
|
||||
left="10"
|
||||
max_val="64"
|
||||
min_val="0"
|
||||
name="image_decode_threads"
|
||||
tool_tip="The number of threads to use for decoding images. 0 = Auto, 1 = Synchronous, 2+ = user specified. (0 or 1 are recommended)"
|
||||
top_pad="7"
|
||||
width="262" />
|
||||
</panel>
|
||||
|
||||
<!--Rendering-->
|
||||
|
|
|
|||
|
|
@ -363,6 +363,38 @@
|
|||
width="110"/>
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="top|left"
|
||||
height="15"
|
||||
layout="topleft"
|
||||
left="26"
|
||||
top_pad="15"
|
||||
name="auto_unmute_label"
|
||||
width="430">
|
||||
Automatically unmute after teleport:
|
||||
</text>
|
||||
<check_box
|
||||
control_name="FSAutoUnmuteAmbient"
|
||||
name="FSAutoUnmuteAmbient"
|
||||
label="Ambient"
|
||||
tool_tip="Automatically unmute Ambient after teleporting, if muted (default: off)"
|
||||
layout="topleft"
|
||||
top_pad="5"
|
||||
left_delta="5"
|
||||
height="16"
|
||||
width="85" />
|
||||
<check_box
|
||||
control_name="FSAutoUnmuteSounds"
|
||||
name="FSAutoUnmuteSounds"
|
||||
label="Sound Effects"
|
||||
tool_tip="Automatically unmute Sound Effects after teleporting, if muted (default: off)"
|
||||
layout="topleft"
|
||||
left_pad="0"
|
||||
height="18"
|
||||
width="85" />
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="top|left"
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ You are in [REGION]
|
|||
<string name="AboutSystem">
|
||||
CPU: [CPU]
|
||||
Memory: [MEMORY_MB] MB
|
||||
Concurrency: [CONCURRENCY]
|
||||
OS Version: [OS_VERSION]
|
||||
Graphics Card Vendor: [GRAPHICS_CARD_VENDOR]
|
||||
Graphics Card: [GRAPHICS_CARD]
|
||||
|
|
|
|||
|
|
@ -173,6 +173,15 @@
|
|||
<combo_item name="physics_lowest">
|
||||
Le plus faible
|
||||
</combo_item>
|
||||
<combo_item name="physics_cube">
|
||||
Cube
|
||||
</combo_item>
|
||||
<combo_item name="physics_hex">
|
||||
Hexagone
|
||||
</combo_item>
|
||||
<combo_item name="physics_ud">
|
||||
Défini par l'utilisateur
|
||||
</combo_item>
|
||||
<combo_item name="load_from_file">
|
||||
Du fichier
|
||||
</combo_item>
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@
|
|||
<slider label="Réserve supplémentaire de mémoire tampon (%):" name="FSDynamicTextureMemoryCacheReserve" tool_tip="Le pourcentage de mémoire vidéo physique réservé aux textures chargées en cache qui ne sont actuellement pas affichées."/>
|
||||
<slider label="Réserve de mémoire vidéo physique (%):" name="FSDynamicTextureMemoryGPUReserve" tool_tip="Le pourcentage de mémoire vidéo physique réservé à un autre usage."/>
|
||||
<spinner label="Ratio de distance du brouillard :" name="fog"/>
|
||||
<spinner label="Décodage des images :" name="image_decode_threads" tool_tip="Le nombre de threads à utiliser pour le décodage des images. 0 = Auto, 1 = Synchrone, 2+ = spécifié par l'utilisateur. (0 ou 1 sont recommandés)"/>
|
||||
</panel>
|
||||
<panel label="Rendu" name="Rendering">
|
||||
<text name="World Updating">Actualisation de l'univers :</text>
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
<string name="status_parse_error">Błąd: Problem z parsowaniem Dae, zobacz log.</string>
|
||||
<string name="status_bind_shape_orientation">Uwaga: Macierz powiązań kształtu nie jest w standardowej orientacji X-forward.</string>
|
||||
<string name="status_material_mismatch">Błąd: Materiał nie jest podzbiorem modelu referencyjnego.</string>
|
||||
<string name="status_lod_model_mismatch">Błąd: Model LOD nie ma rodzica.</string>
|
||||
<string name="status_reading_file">Wczytywanie...</string>
|
||||
<string name="status_generating_meshes">Generowanie meszy...</string>
|
||||
<string name="status_vertex_number_overflow">Błąd: Ilość wierzchołków większa niż 65535, przerwano!</string>
|
||||
|
|
@ -101,6 +102,9 @@
|
|||
<combo_item name="physics_medium">Średnie</combo_item>
|
||||
<combo_item name="physics_low">Niskie</combo_item>
|
||||
<combo_item name="physics_lowest">Najniższe</combo_item>
|
||||
<combo_item name="physics_cube"> Sześcian </combo_item>
|
||||
<combo_item name="physics_hex"> Heksagon </combo_item>
|
||||
<combo_item name="physics_ud"> Użytkownika </combo_item>
|
||||
<combo_item name="load_from_file">Z pliku</combo_item>
|
||||
</combo_box>
|
||||
<button name="physics_browse" label="Przeglądaj"/>
|
||||
|
|
@ -197,6 +201,10 @@
|
|||
</text>
|
||||
<check_box label="Auto-włączanie wag" tool_tip="Automatycznie włącz wagi dla meszy z informacjami o riggowaniu" name="mesh_preview_auto_weights" />
|
||||
<check_box label="Auto-podgląd wag" tool_tip="Automatycznie wyświetlaj wagi w podglądzie dla meszy z informacjami o riggowaniu" name="mesh_preview_auto_show_weights" />
|
||||
<text name="mesh_preview_ud_preset_label">
|
||||
Fizyka użytkownika:
|
||||
</text>
|
||||
<line_editor name="ud_physics" tool_tip="Pełna ścieżka systemowa do prostej definicji meszu Collada dla wykorzystania w fizyce." />
|
||||
<text name="mesh_preview_colors_label">
|
||||
Kolory podglądu przesyłania:
|
||||
</text>
|
||||
|
|
@ -205,6 +213,7 @@
|
|||
</text>
|
||||
<color_swatch label="Tło" tool_tip="Kolor tła przesyłania modelu" name="mesh_preview_canvas_color" />
|
||||
<color_swatch label="Krawędź modelu" tool_tip="Kolor krawędzi modelu w oknie podglądu podczas przesyłania meszu" name="mesh_preview_edge_color" />
|
||||
<color_swatch label="Światła otoczenia" tool_tip="Poziom oświetlenia otoczenia w oknie podglądu (wpływa również na podgląd animacji itp.)" name="preview_ambient_color" />
|
||||
<text name="physics_settings_label">
|
||||
Fizyka:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -121,6 +121,7 @@
|
|||
<slider label="Dodatkowy zapas pamięci podręcznej tekstur (%):" name="FSDynamicTextureMemoryCacheReserve" tool_tip="Procent fizycznej pamięci wideo zarezerwowanej dla tekstur ładowanych do pamięci podręcznej, które obecnie nie są wyświetlane." />
|
||||
<slider label="Fizyczny zapas pamięci wideo (%):" name="FSDynamicTextureMemoryGPUReserve" tool_tip="Procent fizycznej pamięci wideo zarezerwowanej do innego użytku." />
|
||||
<spinner label="Stosunek odległości dla mgły:" name="fog"/>
|
||||
<spinner label="Wątki dekodowania obrazów:" name="image_decode_threads" tool_tip="Liczba wątków używanych do dekodowania obrazów. 0 = Auto, 1 = Synchroniczne, 2+ = określone przez użytkownika. Zalecane 0 lub 1." />
|
||||
</panel>
|
||||
<panel name="Rendering">
|
||||
<text name="World Updating">
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ Położenie: [REGION]
|
|||
<string name="AboutSystem">
|
||||
Procesor (CPU): [CPU]
|
||||
Pamięć (Memory): [MEMORY_MB] MB
|
||||
Wątki dekodowania (Concurrency): [CONCURRENCY]
|
||||
System operacyjny (OS Version): [OS_VERSION]
|
||||
Dostawca karty graficznej (Graphics Card Vendor): [GRAPHICS_CARD_VENDOR]
|
||||
Karta graficzna (Graphics Card): [GRAPHICS_CARD]
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
<string name="status_parse_error">Ошибка: Проблема при анализе файла DAE – см. подробности в журнале.</string>
|
||||
<string name="status_bind_shape_orientation">Предупреждение: форма матрицы стандартно не ориентирована по координате X.</string>
|
||||
<string name="status_material_mismatch">Ошибка: Материал модели не входит в эталонную модель.</string>
|
||||
<string name="status_lod_model_mismatch">Ошибка: Уровень детализации модели не имеет родителя.</string>
|
||||
<string name="status_reading_file">Загрузка...</string>
|
||||
<string name="status_generating_meshes">Создаются меши...</string>
|
||||
<string name="status_vertex_number_overflow">Ошибка: Число вершин превышает 65535, Прервано!</string>
|
||||
|
|
@ -103,6 +104,9 @@
|
|||
<combo_item name="physics_medium">Средний</combo_item>
|
||||
<combo_item name="physics_low">Низкий</combo_item>
|
||||
<combo_item name="physics_lowest">Низший</combo_item>
|
||||
<combo_item name="physics_cube">Куб</combo_item>
|
||||
<combo_item name="physics_hex">Шестиугольник</combo_item>
|
||||
<combo_item name="physics_ud">Определенные</combo_item>
|
||||
<combo_item name="load_from_file">Из файла</combo_item>
|
||||
</combo_box>
|
||||
<button label="Обзор..." name="physics_browse"/>
|
||||
|
|
@ -167,6 +171,10 @@
|
|||
<check_box label="Автоматический просмотр весов"
|
||||
tool_tip="Автоматически показывать веса в предпросмотре для ригованых мешей"
|
||||
name="mesh_preview_auto_show_weights"/>
|
||||
<text name="mesh_preview_ud_preset_label">
|
||||
Предустановки физики:
|
||||
</text>
|
||||
<line_editor name="ud_physics" tool_tip="Полный системный путь к простому определению сетки Collada для использования в физике."/>
|
||||
<text name="mesh_preview_colors_label">
|
||||
Цвета предварительного просмотра:
|
||||
</text>
|
||||
|
|
|
|||
|
|
@ -123,6 +123,7 @@
|
|||
<slider label="Дополнительный резерв памяти текстур (%):" name="FSDynamicTextureMemoryCacheReserve" tool_tip="Процент физической видеопамяти, зарезервированной для кэширования загруженных текстур, которые в данный момент не отображаются."/>
|
||||
<slider label="Резерв физической видеопамяти (%):" name="FSDynamicTextureMemoryGPUReserve" tool_tip="Процент физической видеопамяти, зарезервированной для другого использования."/>
|
||||
<spinner label="Коэффициент дистанции тумана:" name="fog"/>
|
||||
<spinner label="Декодирование изображений:" name="image_decode_threads" tool_tip="Количество потоков, используемых для декодирования изображений. 0 = Авто, 1 = Синхронно, 2+ = указано пользователем. (Рекомендуется 0 или 1)"/>
|
||||
</panel>
|
||||
<panel label="Прорисовка" name="Rendering">
|
||||
<text name="World Updating">
|
||||
|
|
|
|||
|
|
@ -172,6 +172,7 @@ class ViewerManifest(LLManifest,FSViewerManifest):
|
|||
# <FS:AO> Include firestorm resources
|
||||
with self.prefix(src_dst="fs_resources"):
|
||||
self.path("*.lsltxt")
|
||||
self.path("*.dae") # <FS:Beq> FIRE-30963 - better physics defaults
|
||||
|
||||
# skins
|
||||
with self.prefix(src_dst="skins"):
|
||||
|
|
|
|||
Loading…
Reference in New Issue