SL-19349 Fix for hang on bulk upload of materials, add bulk upload option to material selector, incidental decruft.
parent
56e5385bd2
commit
b9b913a60a
|
|
@ -214,12 +214,18 @@ bool LLLocalGLTFMaterial::loadMaterial()
|
|||
LLStringUtil::toLower(filename_lc);
|
||||
std::string material_name;
|
||||
|
||||
// Might be a good idea to make these textures into local textures
|
||||
decode_successful = LLTinyGLTFHelper::getMaterialFromFile(
|
||||
mFilename,
|
||||
mMaterialIndex,
|
||||
this,
|
||||
material_name);
|
||||
tinygltf::Model model;
|
||||
decode_successful = LLTinyGLTFHelper::loadModel(mFilename, model);
|
||||
if (decode_successful)
|
||||
{
|
||||
// Might be a good idea to make these textures into local textures
|
||||
decode_successful = LLTinyGLTFHelper::getMaterialFromModel(
|
||||
mFilename,
|
||||
model,
|
||||
mMaterialIndex,
|
||||
this,
|
||||
material_name);
|
||||
}
|
||||
|
||||
if (!material_name.empty())
|
||||
{
|
||||
|
|
@ -308,7 +314,10 @@ S32 LLLocalGLTFMaterialMgr::addUnit(const std::vector<std::string>& filenames)
|
|||
|
||||
S32 LLLocalGLTFMaterialMgr::addUnit(const std::string& filename)
|
||||
{
|
||||
S32 materials_in_file = LLTinyGLTFHelper::getMaterialCountFromFile(filename);
|
||||
tinygltf::Model model;
|
||||
LLTinyGLTFHelper::loadModel(filename, model);
|
||||
|
||||
S32 materials_in_file = model.materials.size();
|
||||
if (materials_in_file <= 0)
|
||||
{
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -1622,40 +1622,13 @@ static void pack_textures(
|
|||
}
|
||||
}
|
||||
|
||||
void LLMaterialEditor::uploadMaterialFromFile(const std::string& filename, S32 index)
|
||||
void LLMaterialEditor::uploadMaterialFromModel(const std::string& filename, tinygltf::Model& model_in, S32 index)
|
||||
{
|
||||
if (index < 0 || !LLMaterialEditor::capabilitiesAvailable())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
tinygltf::TinyGLTF loader;
|
||||
std::string error_msg;
|
||||
std::string warn_msg;
|
||||
|
||||
bool loaded = false;
|
||||
tinygltf::Model model_in;
|
||||
|
||||
std::string filename_lc = filename;
|
||||
LLStringUtil::toLower(filename_lc);
|
||||
|
||||
// Load a tinygltf model fom a file. Assumes that the input filename has already been
|
||||
// been sanitized to one of (.gltf , .glb) extensions, so does a simple find to distinguish.
|
||||
if (std::string::npos == filename_lc.rfind(".gltf"))
|
||||
{ // file is binary
|
||||
loaded = loader.LoadBinaryFromFile(&model_in, &error_msg, &warn_msg, filename);
|
||||
}
|
||||
else
|
||||
{ // file is ascii
|
||||
loaded = loader.LoadASCIIFromFile(&model_in, &error_msg, &warn_msg, filename);
|
||||
}
|
||||
|
||||
if (!loaded)
|
||||
{
|
||||
LLNotificationsUtil::add("CannotUploadMaterial");
|
||||
return;
|
||||
}
|
||||
|
||||
if (model_in.materials.empty())
|
||||
{
|
||||
// materials are missing
|
||||
|
|
@ -1672,13 +1645,15 @@ void LLMaterialEditor::uploadMaterialFromFile(const std::string& filename, S32 i
|
|||
// This uses 'filename' to make sure multiple bulk uploads work
|
||||
// instead of fighting for a single instance.
|
||||
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor", LLSD().with("filename", filename).with("index", LLSD::Integer(index)));
|
||||
me->loadMaterial(model_in, filename_lc, index, false);
|
||||
me->loadMaterial(model_in, filename, index, false);
|
||||
me->saveIfNeeded();
|
||||
}
|
||||
|
||||
|
||||
void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 index)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_UI;
|
||||
|
||||
tinygltf::TinyGLTF loader;
|
||||
std::string error_msg;
|
||||
std::string warn_msg;
|
||||
|
|
@ -1725,12 +1700,12 @@ void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 ind
|
|||
if (index >= 0)
|
||||
{
|
||||
// Prespecified material
|
||||
me->loadMaterial(model_in, filename_lc, index);
|
||||
me->loadMaterial(model_in, filename, index);
|
||||
}
|
||||
else if (model_in.materials.size() == 1)
|
||||
{
|
||||
// Only one, just load it
|
||||
me->loadMaterial(model_in, filename_lc, 0);
|
||||
me->loadMaterial(model_in, filename, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1738,6 +1713,7 @@ void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 ind
|
|||
std::list<std::string> material_list;
|
||||
std::vector<tinygltf::Material>::const_iterator mat_iter = model_in.materials.begin();
|
||||
std::vector<tinygltf::Material>::const_iterator mat_end = model_in.materials.end();
|
||||
|
||||
for (; mat_iter != mat_end; mat_iter++)
|
||||
{
|
||||
std::string mat_name = mat_iter->name;
|
||||
|
|
@ -1750,10 +1726,13 @@ void LLMaterialEditor::loadMaterialFromFile(const std::string& filename, S32 ind
|
|||
material_list.push_back(mat_name);
|
||||
}
|
||||
}
|
||||
|
||||
material_list.push_back(me->getString("material_batch_import_text"));
|
||||
|
||||
LLFloaterComboOptions::showUI(
|
||||
[me, model_in, filename_lc](const std::string& option, S32 index)
|
||||
[me, model_in, filename](const std::string& option, S32 index)
|
||||
{
|
||||
me->loadMaterial(model_in, filename_lc, index);
|
||||
me->loadMaterial(model_in, filename, index);
|
||||
},
|
||||
me->getString("material_selection_title"),
|
||||
me->getString("material_selection_text"),
|
||||
|
|
@ -1961,13 +1940,22 @@ void LLMaterialEditor::onSaveObjectsMaterialAsMsgCallback(const LLSD& notificati
|
|||
}
|
||||
}
|
||||
|
||||
void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std::string &filename_lc, S32 index, bool open_floater)
|
||||
const void upload_bulk(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter type);
|
||||
|
||||
void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std::string &filename, S32 index, bool open_floater)
|
||||
{
|
||||
if (index == model_in.materials.size())
|
||||
{
|
||||
// bulk upload all the things
|
||||
upload_bulk({ filename }, LLFilePicker::FFLOAD_MATERIAL);
|
||||
return;
|
||||
}
|
||||
|
||||
if (model_in.materials.size() <= index)
|
||||
{
|
||||
return;
|
||||
}
|
||||
std::string folder = gDirUtilp->getDirName(filename_lc);
|
||||
std::string folder = gDirUtilp->getDirName(filename);
|
||||
|
||||
tinygltf::Material material_in = model_in.materials[index];
|
||||
|
||||
|
|
@ -2055,7 +2043,7 @@ void LLMaterialEditor::loadMaterial(const tinygltf::Model &model_in, const std::
|
|||
|
||||
setFromGltfModel(model_in, index);
|
||||
|
||||
setFromGltfMetaData(filename_lc, model_in, index);
|
||||
setFromGltfMetaData(filename, model_in, index);
|
||||
|
||||
markChangesUnsaved(U32_MAX);
|
||||
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ class LLMaterialEditor : public LLPreview, public LLVOInventoryListener
|
|||
void loadAsset() override;
|
||||
// @index if -1 and file contains more than one material,
|
||||
// will promt to select specific one
|
||||
static void uploadMaterialFromFile(const std::string& filename, S32 index);
|
||||
static void uploadMaterialFromModel(const std::string& filename, tinygltf::Model& model, S32 index);
|
||||
static void loadMaterialFromFile(const std::string& filename, S32 index = -1);
|
||||
|
||||
void onSelectionChanged(); // live overrides selection changes
|
||||
|
|
@ -237,7 +237,7 @@ private:
|
|||
void setFromGLTFMaterial(LLGLTFMaterial* mat);
|
||||
bool setFromSelection();
|
||||
|
||||
void loadMaterial(const tinygltf::Model &model, const std::string &filename_lc, S32 index, bool open_floater = true);
|
||||
void loadMaterial(const tinygltf::Model &model, const std::string & filename, S32 index, bool open_floater = true);
|
||||
|
||||
friend class LLMaterialFilePicker;
|
||||
|
||||
|
|
|
|||
|
|
@ -183,19 +183,16 @@ LLImageRaw * LLTinyGLTFHelper::getTexture(const std::string & folder, const tiny
|
|||
return rawImage;
|
||||
}
|
||||
|
||||
S32 LLTinyGLTFHelper::getMaterialCountFromFile(const std::string& filename)
|
||||
bool LLTinyGLTFHelper::loadModel(const std::string& filename, tinygltf::Model& model_in)
|
||||
{
|
||||
std::string exten = gDirUtilp->getExtension(filename);
|
||||
S32 materials_in_file = 0;
|
||||
|
||||
|
||||
if (exten == "gltf" || exten == "glb")
|
||||
{
|
||||
tinygltf::TinyGLTF loader;
|
||||
std::string error_msg;
|
||||
std::string warn_msg;
|
||||
|
||||
tinygltf::Model model_in;
|
||||
|
||||
std::string filename_lc = filename;
|
||||
LLStringUtil::toLower(filename_lc);
|
||||
|
||||
|
|
@ -217,57 +214,33 @@ S32 LLTinyGLTFHelper::getMaterialCountFromFile(const std::string& filename)
|
|||
<< ", warning:" << warn_msg
|
||||
<< " file: " << filename
|
||||
<< LL_ENDL;
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (model_in.materials.empty())
|
||||
{
|
||||
// materials are missing
|
||||
LL_WARNS("GLTF") << "Cannot load. File has no materials " << filename << LL_ENDL;
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
materials_in_file = model_in.materials.size();
|
||||
|
||||
return true;
|
||||
}
|
||||
return materials_in_file;
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LLTinyGLTFHelper::getMaterialFromFile(
|
||||
bool LLTinyGLTFHelper::getMaterialFromModel(
|
||||
const std::string& filename,
|
||||
const tinygltf::Model& model_in,
|
||||
S32 mat_index,
|
||||
LLFetchedGLTFMaterial* material,
|
||||
std::string& material_name)
|
||||
{
|
||||
llassert(material);
|
||||
|
||||
tinygltf::TinyGLTF loader;
|
||||
std::string error_msg;
|
||||
std::string warn_msg;
|
||||
tinygltf::Model model_in;
|
||||
std::string filename_lc = filename;
|
||||
bool decode_successful = true;
|
||||
|
||||
LLStringUtil::toLower(filename_lc);
|
||||
|
||||
// Load a tinygltf model fom a file. Assumes that the input filename has already been
|
||||
// been sanitized to one of (.gltf , .glb) extensions, so does a simple find to distinguish.
|
||||
if (std::string::npos == filename_lc.rfind(".gltf"))
|
||||
{ // file is binary
|
||||
decode_successful = loader.LoadBinaryFromFile(&model_in, &error_msg, &warn_msg, filename_lc);
|
||||
}
|
||||
else
|
||||
{ // file is ascii
|
||||
decode_successful = loader.LoadASCIIFromFile(&model_in, &error_msg, &warn_msg, filename_lc);
|
||||
}
|
||||
|
||||
if (!decode_successful)
|
||||
{
|
||||
LL_WARNS("GLTF") << "Cannot load Material, error: " << error_msg
|
||||
<< ", warning:" << warn_msg
|
||||
<< " file: " << filename
|
||||
<< LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
else if (model_in.materials.size() <= mat_index)
|
||||
if (model_in.materials.size() <= mat_index)
|
||||
{
|
||||
// materials are missing
|
||||
LL_WARNS("GLTF") << "Cannot load Material, Material " << mat_index << " is missing, " << filename << LL_ENDL;
|
||||
|
|
@ -276,7 +249,7 @@ bool LLTinyGLTFHelper::getMaterialFromFile(
|
|||
|
||||
material->setFromModel(model_in, mat_index);
|
||||
|
||||
std::string folder = gDirUtilp->getDirName(filename_lc);
|
||||
std::string folder = gDirUtilp->getDirName(filename);
|
||||
tinygltf::Material material_in = model_in.materials[mat_index];
|
||||
|
||||
material_name = material_in.name;
|
||||
|
|
|
|||
|
|
@ -43,10 +43,11 @@ namespace LLTinyGLTFHelper
|
|||
|
||||
LLImageRaw* getTexture(const std::string& folder, const tinygltf::Model& model, S32 texture_index);
|
||||
|
||||
S32 getMaterialCountFromFile(const std::string& filename);
|
||||
bool loadModel(const std::string& filename, tinygltf::Model& model_out);
|
||||
|
||||
bool getMaterialFromFile(
|
||||
bool getMaterialFromModel(
|
||||
const std::string& filename,
|
||||
const tinygltf::Model& model,
|
||||
S32 mat_index,
|
||||
LLFetchedGLTFMaterial* material,
|
||||
std::string& material_name);
|
||||
|
|
|
|||
|
|
@ -488,14 +488,18 @@ void do_bulk_upload(std::vector<std::string> filenames, const LLSD& notification
|
|||
// gltf does not use normal upload procedure
|
||||
if (ext == "gltf" || ext == "glb")
|
||||
{
|
||||
S32 materials_in_file = LLTinyGLTFHelper::getMaterialCountFromFile(filename);
|
||||
|
||||
for (S32 i = 0; i < materials_in_file; i++)
|
||||
tinygltf::Model model;
|
||||
if (LLTinyGLTFHelper::loadModel(filename, model))
|
||||
{
|
||||
// Todo:
|
||||
// 1. Decouple bulk upload from material editor
|
||||
// 2. Take into account possiblity of identical textures
|
||||
LLMaterialEditor::uploadMaterialFromFile(filename, i);
|
||||
S32 materials_in_file = model.materials.size();
|
||||
|
||||
for (S32 i = 0; i < materials_in_file; i++)
|
||||
{
|
||||
// Todo:
|
||||
// 1. Decouple bulk upload from material editor
|
||||
// 2. Take into account possiblity of identical textures
|
||||
LLMaterialEditor::uploadMaterialFromModel(filename, model, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -530,37 +534,43 @@ bool get_bulk_upload_expected_cost(const std::vector<std::string>& filenames, S3
|
|||
if (ext == "gltf" || ext == "glb")
|
||||
{
|
||||
S32 texture_upload_cost = LLAgentBenefitsMgr::current().getTextureUploadCost();
|
||||
S32 materials_in_file = LLTinyGLTFHelper::getMaterialCountFromFile(filename);
|
||||
|
||||
tinygltf::Model model;
|
||||
|
||||
for (S32 i = 0; i < materials_in_file; i++)
|
||||
if (LLTinyGLTFHelper::loadModel(filename, model))
|
||||
{
|
||||
LLPointer<LLFetchedGLTFMaterial> material = new LLFetchedGLTFMaterial();
|
||||
std::string material_name;
|
||||
bool decode_successful = LLTinyGLTFHelper::getMaterialFromFile(filename, i, material.get(), material_name);
|
||||
S32 materials_in_file = model.materials.size();
|
||||
|
||||
if (decode_successful)
|
||||
for (S32 i = 0; i < materials_in_file; i++)
|
||||
{
|
||||
// Todo: make it account for possibility of same texture in different
|
||||
// materials and even in scope of same material
|
||||
S32 texture_count = 0;
|
||||
if (material->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR].notNull())
|
||||
LLPointer<LLFetchedGLTFMaterial> material = new LLFetchedGLTFMaterial();
|
||||
std::string material_name;
|
||||
bool decode_successful = LLTinyGLTFHelper::getMaterialFromModel(filename, model, i, material.get(), material_name);
|
||||
|
||||
if (decode_successful)
|
||||
{
|
||||
texture_count++;
|
||||
// Todo: make it account for possibility of same texture in different
|
||||
// materials and even in scope of same material
|
||||
S32 texture_count = 0;
|
||||
if (material->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_BASE_COLOR].notNull())
|
||||
{
|
||||
texture_count++;
|
||||
}
|
||||
if (material->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS].notNull())
|
||||
{
|
||||
texture_count++;
|
||||
}
|
||||
if (material->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL].notNull())
|
||||
{
|
||||
texture_count++;
|
||||
}
|
||||
if (material->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE].notNull())
|
||||
{
|
||||
texture_count++;
|
||||
}
|
||||
total_cost += texture_count * texture_upload_cost;
|
||||
file_count++;
|
||||
}
|
||||
if (material->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS].notNull())
|
||||
{
|
||||
texture_count++;
|
||||
}
|
||||
if (material->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_NORMAL].notNull())
|
||||
{
|
||||
texture_count++;
|
||||
}
|
||||
if (material->mTextureId[LLGLTFMaterial::GLTF_TEXTURE_INFO_EMISSIVE].notNull())
|
||||
{
|
||||
texture_count++;
|
||||
}
|
||||
total_cost += texture_count * texture_upload_cost;
|
||||
file_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -335,18 +335,6 @@ static LLCullResult* sCull = NULL;
|
|||
|
||||
void validate_framebuffer_object();
|
||||
|
||||
// override the projection_matrix uniform on the given shader to that which would be set by the main camera
|
||||
void set_camera_projection_matrix(LLGLSLShader& shader)
|
||||
{
|
||||
auto camProj = LLViewerCamera::getInstance()->getProjection();
|
||||
glh::matrix4f projection = get_current_projection();
|
||||
projection.set_row(0, glh::vec4f(camProj.mMatrix[0][0], camProj.mMatrix[0][1], camProj.mMatrix[0][2], camProj.mMatrix[0][3]));
|
||||
projection.set_row(0, glh::vec4f(camProj.mMatrix[1][0], camProj.mMatrix[1][1], camProj.mMatrix[1][2], camProj.mMatrix[1][3]));
|
||||
projection.set_row(0, glh::vec4f(camProj.mMatrix[2][0], camProj.mMatrix[2][1], camProj.mMatrix[2][2], camProj.mMatrix[2][3]));
|
||||
projection.set_row(0, glh::vec4f(camProj.mMatrix[3][0], camProj.mMatrix[3][1], camProj.mMatrix[3][2], camProj.mMatrix[3][3]));
|
||||
shader.uniformMatrix4fv(LLShaderMgr::PROJECTION_MATRIX, 1, FALSE, projection.m);
|
||||
}
|
||||
|
||||
// Add color attachments for deferred rendering
|
||||
// target -- RenderTarget to add attachments to
|
||||
bool addDeferredAttachments(LLRenderTarget& target, bool for_impostor = false)
|
||||
|
|
@ -4716,9 +4704,6 @@ void LLPipeline::renderDebug()
|
|||
bindDeferredShader(gReflectionProbeDisplayProgram, NULL);
|
||||
mScreenTriangleVB->setBuffer();
|
||||
|
||||
// Provide our projection matrix.
|
||||
set_camera_projection_matrix(gReflectionProbeDisplayProgram);
|
||||
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_FALSE);
|
||||
|
||||
|
|
@ -7410,40 +7395,6 @@ void LLPipeline::renderFinalize()
|
|||
|
||||
if (RenderScreenSpaceReflections && !gCubeSnapshot)
|
||||
{
|
||||
#if 0
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_PIPELINE("renderDeferredLighting - screen space reflections");
|
||||
LL_PROFILE_GPU_ZONE("screen space reflections");
|
||||
|
||||
bindDeferredShader(gPostScreenSpaceReflectionProgram, NULL);
|
||||
mScreenTriangleVB->setBuffer();
|
||||
|
||||
set_camera_projection_matrix(gPostScreenSpaceReflectionProgram);
|
||||
|
||||
// We need linear depth.
|
||||
static LLStaticHashedString zfar("zFar");
|
||||
static LLStaticHashedString znear("zNear");
|
||||
float nearClip = LLViewerCamera::getInstance()->getNear();
|
||||
float farClip = LLViewerCamera::getInstance()->getFar();
|
||||
gPostScreenSpaceReflectionProgram.uniform1f(zfar, farClip);
|
||||
gPostScreenSpaceReflectionProgram.uniform1f(znear, nearClip);
|
||||
|
||||
S32 channel = gPostScreenSpaceReflectionProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP, screenTarget()->getUsage());
|
||||
if (channel > -1)
|
||||
{
|
||||
screenTarget()->bindTexture(0, channel, LLTexUnit::TFO_POINT);
|
||||
}
|
||||
|
||||
{
|
||||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
|
||||
|
||||
stop_glerror();
|
||||
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
unbindDeferredShader(gPostScreenSpaceReflectionProgram);
|
||||
#else
|
||||
LL_PROFILE_GPU_ZONE("ssr copy");
|
||||
LLGLDepthTest depth(GL_TRUE, GL_TRUE, GL_ALWAYS);
|
||||
|
||||
|
|
@ -7465,7 +7416,6 @@ void LLPipeline::renderFinalize()
|
|||
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
|
||||
dst.flush();
|
||||
#endif
|
||||
}
|
||||
|
||||
screenTarget()->bindTarget();
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
<string name="upload_fee_string">L$[FEE] upload fee</string>
|
||||
<string name="material_selection_title">Material selection</string>
|
||||
<string name="material_selection_text">Select material:</string>
|
||||
<string name="material_batch_import_text">--- Bulk Upload All ---</string>
|
||||
<string name="material_override_title">Editing Material</string>
|
||||
|
||||
<scroll_container
|
||||
|
|
|
|||
|
|
@ -589,7 +589,7 @@
|
|||
control_name="RenderDeferredSSAO"
|
||||
height="16"
|
||||
initial_value="true"
|
||||
label="Ambient Occlusion"
|
||||
label="Screen Space Ambient Occlusion"
|
||||
layout="topleft"
|
||||
left="420"
|
||||
name="UseSSAO"
|
||||
|
|
|
|||
Loading…
Reference in New Issue