From 12e08417bfdf5d50feea544a54bbb333ad01acce Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Tue, 28 Jun 2011 12:41:12 -0500 Subject: SH-1169 Fix for convex decompositions not working post mesh-asset-deprecation work. (also default SLM usage to on) --- indra/newview/app_settings/settings.xml | 2 +- indra/newview/llfloatermodelpreview.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index cf07350d85..3c309f93bc 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5587,7 +5587,7 @@ Type Boolean Value - 0 + 1 MeshUploadLogXML diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 0006e3423b..67841620ea 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -1968,10 +1968,6 @@ bool LLModelLoader::loadFromSLM(const std::string& filename) mPreview->critiqueRigForUploadApplicability( loaded_model->mSkinInfo.mJointNames ); } } - else - { - return false; - } } } @@ -1980,6 +1976,12 @@ bool LLModelLoader::loadFromSLM(const std::string& filename) return false; } + if (model[LLModel::LOD_PHYSICS].empty()) + { //no explicit physics block, copy HIGH_LOD into physics array to recover convex decomp + model[LLModel::LOD_PHYSICS] = model[LLModel::LOD_HIGH]; + } + + //load instance list model_instance_list instance_list; -- cgit v1.2.3 From 38778fcc6186abe2c6f037f07191780f87dd8cd7 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Thu, 30 Jun 2011 18:19:09 -0500 Subject: SH-680 Update streaming cost to be based on a triangle budget instead of a magic scaler. Reviewed by Nyx. --- indra/newview/app_settings/settings.xml | 37 ++++++++++++--- indra/newview/llmeshrepository.cpp | 80 ++++++++++++++++++--------------- indra/newview/llsceneview.cpp | 15 +++++-- indra/newview/llviewerwindow.cpp | 4 +- 4 files changed, 88 insertions(+), 48 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 3c309f93bc..2372c19fb9 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -9145,28 +9145,51 @@ Value 1.0 - MeshStreamingCostScaler + MeshTriangleBudget Comment - DEBUG + Target visible triangle budget to use when estimating streaming cost. Persist 1 Type - F32 + U32 Value - 2.0 + 250000 - MeshThreadCount + MeshMetaDataDiscount Comment - Number of threads to use for loading meshes. + Number of bytes to deduct for metadata when determining streaming cost. Persist 1 Type U32 Value - 8 + 384 + MeshMinimumByteSize + + Comment + Minimum number of bytes per LoD block when determining streaming cost. + Persist + 1 + Type + U32 + Value + 16 + + MeshBytesPerTriangle + + Comment + Approximation of bytes per triangle to use for determining mesh streaming cost. + Persist + 1 + Type + U32 + Value + 16 + + MeshMaxConcurrentRequests Comment diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 4da5da9493..be11c53efa 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -3185,58 +3185,66 @@ void LLMeshRepository::uploadError(LLSD& args) //static F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod) { - F32 dlowest = llmin(radius/0.03f, 256.f); - F32 dlow = llmin(radius/0.06f, 256.f); - F32 dmid = llmin(radius/0.24f, 256.f); + F32 max_distance = 512.f; + + F32 dlowest = llmin(radius/0.03f, max_distance); + F32 dlow = llmin(radius/0.06f, max_distance); + F32 dmid = llmin(radius/0.24f, max_distance); - F32 METADATA_DISCOUNT = 128.f; //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead - F32 MINIMUM_SIZE = 32.f; //make sure nothing is "free" + F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32("MeshMetaDataDiscount"); //discount 128 bytes to cover the cost of LLSD tags and compression domain overhead + F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32("MeshMinimumByteSize"); //make sure nothing is "free" - F32 bytes_lowest = llmax((F32) header["lowest_lod"]["size"].asReal()-METADATA_DISCOUNT, MINIMUM_SIZE)/1024.f; - F32 bytes_low = llmax((F32) header["low_lod"]["size"].asReal()/-METADATA_DISCOUNT, MINIMUM_SIZE)/1024.f; - F32 bytes_mid = llmax((F32) header["medium_lod"]["size"].asReal()-METADATA_DISCOUNT, MINIMUM_SIZE)/1024.f; - F32 bytes_high = llmax((F32) header["high_lod"]["size"].asReal()-METADATA_DISCOUNT, MINIMUM_SIZE)/1024.f; + F32 bytes_per_triangle = (F32) gSavedSettings.getU32("MeshBytesPerTriangle"); - if (bytes) + S32 bytes_lowest = header["lowest_lod"]["size"].asInteger(); + S32 bytes_low = header["low_lod"]["size"].asInteger(); + S32 bytes_mid = header["medium_lod"]["size"].asInteger(); + S32 bytes_high = header["high_lod"]["size"].asInteger(); + + if (bytes_high == 0) { - *bytes = 0; - *bytes += header["lowest_lod"]["size"].asInteger(); - *bytes += header["low_lod"]["size"].asInteger(); - *bytes += header["medium_lod"]["size"].asInteger(); - *bytes += header["high_lod"]["size"].asInteger(); + return 0.f; } - - if (bytes_visible) + if (bytes_mid == 0) { - lod = LLMeshRepository::getActualMeshLOD(header, lod); - if (lod >= 0 && lod <= 3) - { - *bytes_visible = header[header_lod[lod]]["size"].asInteger(); - } + bytes_mid = bytes_high; } - if (bytes_high == 0.f) + if (bytes_low == 0) { - return 0.f; + bytes_low = bytes_mid; } - if (bytes_mid == 0.f) + if (bytes_lowest == 0) { - bytes_mid = bytes_high; + bytes_lowest = bytes_low; } - if (bytes_low == 0.f) + F32 triangles_lowest = llmax((F32) bytes_lowest-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; + F32 triangles_low = llmax((F32) bytes_low-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; + F32 triangles_mid = llmax((F32) bytes_mid-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; + F32 triangles_high = llmax((F32) bytes_high-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle; + + if (bytes) { - bytes_low = bytes_mid; + *bytes = 0; + *bytes += header["lowest_lod"]["size"].asInteger(); + *bytes += header["low_lod"]["size"].asInteger(); + *bytes += header["medium_lod"]["size"].asInteger(); + *bytes += header["high_lod"]["size"].asInteger(); } - if (bytes_lowest == 0.f) + if (bytes_visible) { - bytes_lowest = bytes_low; + lod = LLMeshRepository::getActualMeshLOD(header, lod); + if (lod >= 0 && lod <= 3) + { + *bytes_visible = header[header_lod[lod]]["size"].asInteger(); + } } - F32 max_area = 65536.f; + F32 max_area = 102932.f; //area of circle that encompasses region F32 min_area = 1.f; F32 high_area = llmin(F_PI*dmid*dmid, max_area); @@ -3259,12 +3267,12 @@ F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32 low_area /= total_area; lowest_area /= total_area; - F32 weighted_avg = bytes_high*high_area + - bytes_mid*mid_area + - bytes_low*low_area + - bytes_lowest*lowest_area; + F32 weighted_avg = triangles_high*high_area + + triangles_mid*mid_area + + triangles_low*low_area + + triangles_lowest*lowest_area; - return weighted_avg * gSavedSettings.getF32("MeshStreamingCostScaler"); + return weighted_avg/gSavedSettings.getU32("MeshTriangleBudget")*15000.f; } diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp index 8e8fc9dd25..09e799e4f7 100644 --- a/indra/newview/llsceneview.cpp +++ b/indra/newview/llsceneview.cpp @@ -83,6 +83,9 @@ void LLSceneView::draw() S32 total_visible_triangles[] = {0, 0}; S32 total_triangles[] = {0, 0}; + S32 total_visible_bytes[] = {0, 0}; + S32 total_bytes[] = {0, 0}; + //streaming cost std::vector streaming_cost[2]; F32 total_streaming[] = { 0.f, 0.f }; @@ -122,13 +125,19 @@ void LLSceneView::draw() visible_triangles[idx].push_back(visible); triangles[idx].push_back(high_triangles); - F32 streaming = object->getStreamingCost(); + S32 bytes = 0; + S32 visible_bytes = 0; + + F32 streaming = object->getStreamingCost(&bytes, &visible_bytes); total_streaming[idx] += streaming; streaming_cost[idx].push_back(streaming); F32 physics = object->getPhysicsCost(); total_physics[idx] += physics; physics_cost[idx].push_back(physics); + + total_bytes[idx] += bytes; + total_visible_bytes[idx] += visible_bytes; } } } @@ -279,8 +288,8 @@ void LLSceneView::draw() total_visible += tri_count; } - std::string label = llformat("%s Object Triangle Counts (Ktris) -- [%.2f, %.2f] Mean: %.2f Median: %.2f Visible: %.2f/%.2f", - category[idx], tri_domain[0]/1024.f, tri_domain[1]/1024.f, (total/count)/1024.f, triangles[idx][count/2]/1024.f, total_visible_triangles[idx]/1024.f, total_triangles[idx]/1024.f); + std::string label = llformat("%s Object Triangle Counts (Ktris) -- Visible: %.2f/%.2f (%.2f KB Visible)", + category[idx], total_visible_triangles[idx]/1024.f, total_triangles[idx]/1024.f, total_visible_bytes[idx]/1024.f); LLFontGL::getFontMonospace()->renderUTF8(label, 0 , tri_rect.mLeft, tri_rect.mTop+margin, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 1dffb9e5e3..b2fd802ae7 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -528,8 +528,8 @@ public: addText(xpos,ypos, llformat("%s streaming cost: %.1f", label, cost)); ypos += y_inc; - addText(xpos, ypos, llformat(" %.1f KTris, %.1f/%.1f KB, %d objects", - count/1024.f, visible_bytes/1024.f, total_bytes/1024.f, object_count)); + addText(xpos, ypos, llformat(" %.3f KTris, %.1f/%.1f KB, %d objects", + count/1000.f, visible_bytes/1024.f, total_bytes/1024.f, object_count)); ypos += y_inc; } -- cgit v1.2.3