diff --git a/indra/llcommon/fstelemetry.h b/indra/llcommon/fstelemetry.h index 87ec75b00a..9a0cdd5e18 100644 --- a/indra/llcommon/fstelemetry.h +++ b/indra/llcommon/fstelemetry.h @@ -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 diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 8fbbc36162..2d6ebc0ad4 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -35,6 +35,7 @@ #include "lltrace.h" #include "lltracethreadrecorder.h" #include "llexception.h" +#include "fstelemetry.h" // allow thread naming #if LL_LINUX || LL_SOLARIS #include @@ -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()); - + // - Add threadnames to telemetry + LL_INFOS("THREAD") << "Started thread " << mName << LL_ENDL; + FSThreadName( mName.c_str() ); + // // Run the user supplied function do { diff --git a/indra/llfilesystem/lldiskcache.h b/indra/llfilesystem/lldiskcache.h index b89205016a..13570d1126 100644 --- a/indra/llfilesystem/lldiskcache.h +++ b/indra/llfilesystem/lldiskcache.h @@ -195,7 +195,7 @@ class LLDiskCache : class FSPurgeDiskCacheThread : public LLThread { public: - FSPurgeDiskCacheThread::FSPurgeDiskCacheThread(); + FSPurgeDiskCacheThread(); protected: void run() override; diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp index 0f44df12f2..468140e408 100644 --- a/indra/llimage/llimageworker.cpp +++ b/indra/llimage/llimageworker.cpp @@ -25,7 +25,7 @@ */ #include "linden_common.h" - +#include "fstelemetry.h" // 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); // instrument image decodes LLMutexLock lock(mCreationMutex); + // instrument image decodes + { + FSZoneC(tracy::Color::Blue1); + // 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(); + // instrument image decodes + } + { + FSZoneC(tracy::Color::Blue2); + // S32 res = LLQueuedThread::update(max_time_ms); + // FSPlot("img_decode_pending", (int64_t)res); // instrument image decodes return res; + } // 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); // instrument the image decode pipeline + // 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); // 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); // instrument the image decode pipeline + LLMutexLock lock(mCreationMutex); + mCreationList.push_back(creation_info(handle, image, priority, discard, needs_aux, responder)); + } + // return handle; } @@ -230,10 +268,19 @@ bool LLImageDecodeThread::ImageRequest::processRequest() bool LLImageDecodeThread::ImageRequest::processRequestIntern() { - const F32 decode_time_slice = .1f; + // 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 + } + // bool done = true; if (!mDecodedRaw && mFormattedImage.notNull()) { + FSZoneC(tracy::Color::DarkOrange1); // 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); // 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(); } - + // 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; + } + // // Image thread pool from CoolVL if (mFlags & FLAG_ASYNC) { diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp index 0e605cf8b2..f46bcacb64 100644 --- a/indra/llimagej2coj/llimagej2coj.cpp +++ b/indra/llimagej2coj/llimagej2coj.cpp @@ -25,6 +25,7 @@ */ #include "linden_common.h" +#include "fstelemetry.h" // 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) { // texture comment metadata reader + FSZone; // 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) diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp index 300a60c551..e1e7863cca 100644 --- a/indra/llkdu/llimagej2ckdu.cpp +++ b/indra/llkdu/llimagej2ckdu.cpp @@ -32,7 +32,7 @@ #include "llpointer.h" #include "llmath.h" #include "llkdumem.h" - +#include "fstelemetry.h" // 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; // 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; // 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; // instrument image decodes ECodeStreamMode mode = MODE_FAST; LLTimer decode_timer; diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index a2596335c2..ef008e0a81 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -1220,7 +1220,13 @@ bool LLModel::isMaterialListSubset( LLModel* ref ) { int refCnt = ref->mMaterialList.size(); int modelCnt = mMaterialList.size(); - + // 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; + } + // 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 +// 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."< 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 index_map; +// std::map 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 base_mat; - std::set cur_mat; +// std::set base_mat; +// std::set 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 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 new_face_list; +// new_face_list.resize(mMaterialList.size()); - std::vector new_material_list; - new_material_list.resize(mMaterialList.size()); +// std::vector 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; +// } +// bool LLModel::loadSkinInfo(LLSD& header, std::istream &is) { diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index c2a5389b6c..d77a13f145 100644 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -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 ); // FIRE-30965 error handling improvements (function relocated) bool isMaterialListSubset( LLModel* ref ); bool needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt ); diff --git a/indra/llprimitive/llmodelloader.h b/indra/llprimitive/llmodelloader.h index a67c39252c..20278dcdb5 100644 --- a/indra/llprimitive/llmodelloader.h +++ b/indra/llprimitive/llmodelloader.h @@ -87,7 +87,7 @@ public: DONE, WARNING_BIND_SHAPE_ORIENTATION, ERROR_PARSING, //basically loading failed - ERROR_MATERIALS, + ERROR_MATERIALS_NOT_A_SUBSET, // 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, // clean up and improve error reporting + ERROR_HIGH_LOD_MODEL_MISSING, // 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; diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a504cfbad5..391fa2e506 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9399,6 +9399,17 @@ Value salt_and_pepper.jpg + FSPhysicsPresetUser1 + + Comment + full system path to a user provided physics mesh (DAE). + Persist + 1 + Type + String + Value + + MigrateCacheDirectory Comment @@ -25672,5 +25683,27 @@ Change of this parameter will affect the layout of buttons in notification toast Value 1 + FSAutoUnmuteSounds + + Comment + If Sound Effects are muted, unmute on TP. Default (false) + Persist + 1 + Type + Boolean + Value + 0 + + FSAutoUnmuteAmbient + + Comment + If Ambient sounds are muted, unmute on TP. Default (false) + Persist + 1 + Type + Boolean + Value + 0 + diff --git a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl index 4bb588335a..3945160db6 100644 --- a/indra/newview/app_settings/shaders/class1/objects/previewV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/previewV.glsl @@ -25,6 +25,7 @@ uniform mat3 normal_matrix; uniform mat4 texture_matrix0; +uniform vec4 ambient_color; // 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; // 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); diff --git a/indra/newview/fs_resources/cube_phys.dae b/indra/newview/fs_resources/cube_phys.dae new file mode 100644 index 0000000000..80a92cb38c --- /dev/null +++ b/indra/newview/fs_resources/cube_phys.dae @@ -0,0 +1,74 @@ + + + + + Avastar User + Avastar 2-0-10 on Blender 2.78 (sub 0) + + 2017-02-03T17:31:59 + 2017-02-03T17:31:59 + + Z_UP + + + + + + + + + + -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 + + + + + + + + + + -1 -0 0 0 1 0 1 -0 0 0 -1 0 0 0 -1 0 -0 1 + + + + + + + + + + + + + + + 4 4 4 4 4 4 +

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

+
+
+ + + 1 + + +
+
+ + + + + 5.93563 6.77334 -14.9673 + 0 0 1 0 + 0 1 0 0 + 1 0 0 0 + 1 1 1 + + + + + + + +
+ diff --git a/indra/newview/fs_resources/hex_phys.dae b/indra/newview/fs_resources/hex_phys.dae new file mode 100644 index 0000000000..21d05cca6f --- /dev/null +++ b/indra/newview/fs_resources/hex_phys.dae @@ -0,0 +1,70 @@ + + + + + Blender User + Blender 2.80.43 commit date:2019-01-29, commit time:22:41, hash:a1ae04d15a9f + + 2019-02-05T14:28:24 + 2019-02-05T14:28:24 + + Z_UP + + + + + + + 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 + + + + + + + + + + 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 + + + + + + + + + + 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 + + + + + + + + + + + + + + + 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 +

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

+
+
+
+
+ + + + 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 + + + + + + + +
\ No newline at end of file diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 8a9b0a2063..f3105ef3e5 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -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); - + // instrument image decodes + { + FSZoneN("updateTextureThreads"); + // FSPlot("max_time_ms",max_time); + // work_pending += updateTextureThreads(max_time); + } // 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()); + info["CONCURRENCY"] = LLSD::Integer((S32)boost::thread::hardware_concurrency()); // 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))); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index f24c047c25..8370d36a14 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -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 )// Improve error reporting { - childSetTextArg("status", "[STATUS]", getString("status_material_mismatch")); + // 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); } + // 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); + // 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); + } + // } LLModelPreview *model_preview = sInstance->mModelPreview; @@ -1738,7 +1760,7 @@ void LLFloaterModelPreview::setCtrlLoadFromFile(S32 lod) LLComboBox* lod_combo = findChild("physics_lod_combo"); if (lod_combo) { - lod_combo->setCurrentByIndex(5); + lod_combo->setCurrentByIndex(lod_combo->getItemCount() - 1); // FIRE-30963 - better physics defaults } } else diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index d3cc03914f..e8542dcaf6 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -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); } diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index 3cbe727461..83e4fe3326 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -368,6 +368,118 @@ U32 LLModelPreview::calcResourceCost() return (U32)streaming_cost; } +// 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."<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 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; + } + + + // 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; +} +// + 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; // 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)) + // 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)) + // { LLFloaterModelPreview::addStringToLog("Model " + instance.mLabel + " has mismatching materials between lods." , true); - load_state = LLModelLoader::ERROR_MATERIALS; + load_state = LLModelLoader::ERROR_MATERIALS_NOT_A_SUBSET; // 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) + // 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 + // 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 + // || 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(); } } +// 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); + } + } +} +// 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); // 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); // 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); - // 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(); - // + 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"); } - // 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()); - // + 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); // pass ambient setting to shader LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) * LLQuaternion(mCameraYaw, LLVector3::z_axis); diff --git a/indra/newview/llmodelpreview.h b/indra/newview/llmodelpreview.h index a0e1d2b18c..2cfee9e3cb 100644 --- a/indra/newview/llmodelpreview.h +++ b/indra/newview/llmodelpreview.h @@ -139,6 +139,7 @@ public: void setTexture(U32 name) { mTextureName = name; } void setPhysicsFromLOD(S32 lod); + void setPhysicsFromPreset(S32 preset);// 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 ); // 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); diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp index 29accdb074..b9a27dc799 100644 --- a/indra/newview/llpreviewanim.cpp +++ b/indra/newview/llpreviewanim.cpp @@ -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("AdvancedStatsLeft"); + LLTextBox* stats_box_right = getChild("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())); + } + } +} // diff --git a/indra/newview/llpreviewanim.h b/indra/newview/llpreviewanim.h index df5ad99187..7ce6cfc371 100644 --- a/indra/newview/llpreviewanim.h +++ b/indra/newview/llpreviewanim.h @@ -45,6 +45,7 @@ public: void play(const LLSD& param); // Improved animation preview //void showAdvanced(); + /*virtual*/ void refreshFromItem(); protected: diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 270e342ec3..d37d84b188 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3956,6 +3956,13 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) gSavedPerAccountSettings.setBOOL("FSRenderFriendsOnly", FALSE); } // + // 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); + // if (gAgent.getTeleportKeepsLookAt()) { // *NOTE: the LookAt data we get from the sim here doesn't diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 3ca714fd46..525387af51 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -3219,7 +3219,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() if (success) { - gObjectPreviewProgram.mName = "Simple Shader"; + gObjectPreviewProgram.mName = "Preview Shader"; // update preview shader name gObjectPreviewProgram.mFeatures.calculatesLighting = false; gObjectPreviewProgram.mFeatures.calculatesAtmospherics = false; gObjectPreviewProgram.mFeatures.hasGamma = false; diff --git a/indra/newview/skins/default/xui/de/floater_model_preview.xml b/indra/newview/skins/default/xui/de/floater_model_preview.xml index 6e9572fd8e..088be49dbb 100644 --- a/indra/newview/skins/default/xui/de/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/de/floater_model_preview.xml @@ -13,6 +13,9 @@ Fehler: Das Material des Modells ist keine Teilmenge des Referenzmodells. + + Fehler: LOD-Model hat keinen Vorgänger. + Laden... @@ -239,6 +242,15 @@ Niedrigste + + Würfel + + + Hexagon + + + Benutzerdefiniert + Aus Datei @@ -369,6 +381,10 @@ + + Benutzerdefinierte Physik-Einstellungen: + + Farben für Modell-Upload: @@ -377,6 +393,7 @@ + Physik: diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index c16bc836a9..a39a977fb8 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -135,6 +135,7 @@ + diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml index a6a81583c0..8cdf0fa6dd 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml @@ -25,6 +25,11 @@ + + Stummschaltung nach Teleport automatisch aufheben: + + + Klang abspielen wenn sich Freunde: diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index f5eba43d8e..6b7bfadb3a 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -53,6 +53,7 @@ SLURL: <nolink>[SLURL]</nolink> CPU: [CPU] Speicher: [MEMORY_MB] MB +Parallelität: [CONCURRENCY] Betriebssystemversion: [OS_VERSION] Grafikkartenhersteller: [GRAPHICS_CARD_VENDOR] Grafikkarte: [GRAPHICS_CARD] diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 13ae3186e7..8af051c4dd 100644 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -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. Error: Dae parsing issue - see log for details. Warning: bind shape matrix is not in standard X-forward orientation. Error: Material of model is not a subset of reference model. + Error: LOD Model has no parent. Loading... Generating Meshes... Error: Vertex number is more than 65535, aborted! @@ -787,6 +788,9 @@ Medium Low Lowest + Cube + Hexagon + User Defined From file + width="79"> Passes: + width="100"> Detail scale: + + Physics User Defined Preset: + + + + width="70"/> + width="110"> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index d481a12277..ad17f343fd 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -1085,6 +1085,22 @@ name="fog" top_pad="7" width="262" /> + diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index 23589e936a..66d63b7dc0 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -363,6 +363,38 @@ width="110"/> + Automatically unmute after teleport: + + + + + CPU: [CPU] Memory: [MEMORY_MB] MB +Concurrency: [CONCURRENCY] OS Version: [OS_VERSION] Graphics Card Vendor: [GRAPHICS_CARD_VENDOR] Graphics Card: [GRAPHICS_CARD] diff --git a/indra/newview/skins/default/xui/fr/floater_model_preview.xml b/indra/newview/skins/default/xui/fr/floater_model_preview.xml index 0103aaea5e..24f9602392 100644 --- a/indra/newview/skins/default/xui/fr/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_model_preview.xml @@ -173,6 +173,15 @@ Le plus faible + + Cube + + + Hexagone + + + Défini par l'utilisateur + Du fichier diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml index c57734a419..b97038eea4 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml @@ -89,6 +89,7 @@ + Actualisation de l'univers : diff --git a/indra/newview/skins/default/xui/pl/floater_model_preview.xml b/indra/newview/skins/default/xui/pl/floater_model_preview.xml index 0b89eea908..d9b91fd3b7 100644 --- a/indra/newview/skins/default/xui/pl/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/pl/floater_model_preview.xml @@ -4,6 +4,7 @@ Błąd: Problem z parsowaniem Dae, zobacz log. Uwaga: Macierz powiązań kształtu nie jest w standardowej orientacji X-forward. Błąd: Materiał nie jest podzbiorem modelu referencyjnego. + Błąd: Model LOD nie ma rodzica. Wczytywanie... Generowanie meszy... Błąd: Ilość wierzchołków większa niż 65535, przerwano! @@ -101,6 +102,9 @@ Średnie Niskie Najniższe + Sześcian + Heksagon + Użytkownika Z pliku