diff options
-rw-r--r-- | indra/newview/llgltfmateriallist.cpp | 129 |
1 files changed, 80 insertions, 49 deletions
diff --git a/indra/newview/llgltfmateriallist.cpp b/indra/newview/llgltfmateriallist.cpp index 173e9ebb1d..206be33051 100644 --- a/indra/newview/llgltfmateriallist.cpp +++ b/indra/newview/llgltfmateriallist.cpp @@ -163,67 +163,102 @@ public: LL_WARNS() << "LLGLTFMaterialOverrideDispatchHandler: Attempted to read parameter data into LLSD but failed:" << llsdRaw << LL_ENDL; } } + + LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop"); + LL::WorkQueue::ptr_t general_queue = LL::WorkQueue::getInstance("General"); - LLUUID object_id = message["object_id"].asUUID(); - - LLViewerObject * obj = gObjectList.findObject(object_id); // NOTE: null object here does NOT mean nothing to do, parse message and queue results for later - bool clear_all = true; + struct ReturnData + { + public: + std::vector<LLPointer<LLGLTFMaterial> > mMaterialVector; + std::vector<bool> mResults; + }; - if (message.has("sides") && message.has("gltf_json")) + // fromJson() is performance heavy offload to a thread. + main_queue->postTo( + general_queue, + [message]() // Work done on general queue { - LLSD& sides = message["sides"]; - LLSD& gltf_json = message["gltf_json"]; + ReturnData result; - if (sides.isArray() && gltf_json.isArray() && - sides.size() != 0 && - sides.size() == gltf_json.size()) + if (message.has("sides") && message.has("gltf_json")) { - clear_all = false; + LLSD& sides = message.get("sides"); + LLSD& gltf_json = message.get("gltf_json"); - // message should be interpreted thusly: - /// sides is a list of face indices - // gltf_json is a list of corresponding json - // any side not represented in "sides" has no override + if (sides.isArray() && gltf_json.isArray() && + sides.size() != 0 && + sides.size() == gltf_json.size()) + { + // message should be interpreted thusly: + /// sides is a list of face indices + // gltf_json is a list of corresponding json + // any side not represented in "sides" has no override + result.mResults.resize(sides.size()); + result.mMaterialVector.resize(sides.size()); + + // parse json + for (int i = 0; i < sides.size(); ++i) + { + LLPointer<LLGLTFMaterial> override_data = new LLGLTFMaterial(); - // parse json - std::unordered_set<S32> side_set; + std::string gltf_json_str = gltf_json[i].asString(); - for (int i = 0; i < sides.size(); ++i) - { - LLPointer<LLGLTFMaterial> override_data = new LLGLTFMaterial(); - - std::string gltf_json = message["gltf_json"][i].asString(); + std::string warn_msg, error_msg; - std::string warn_msg, error_msg; - - bool success = override_data->fromJSON(gltf_json, warn_msg, error_msg); + bool success = override_data->fromJSON(gltf_json_str, warn_msg, error_msg); - if (!success) - { - LL_WARNS() << "failed to parse GLTF override data. errors: " << error_msg << " | warnings: " << warn_msg << LL_ENDL; + result.mResults[i] = success; - // unblock material editor - if (obj && obj->isAnySelected()) + if (success) { - LLMaterialEditor::updateLive(object_id, sides[i].asInteger()); + result.mMaterialVector[i] = override_data; + } + else + { + LL_WARNS() << "failed to parse GLTF override data. errors: " << error_msg << " | warnings: " << warn_msg << LL_ENDL; } } - else + } + } + return result; + }, + [message](ReturnData result) // Callback to main thread + mutable { + + LLUUID object_id = message["object_id"].asUUID(); + LLSD& sides = message["sides"]; + LLViewerObject * obj = gObjectList.findObject(object_id); + std::unordered_set<S32> side_set; + + if (result.mResults.size() > 0 ) + { + for (int i = 0; i < result.mResults.size(); ++i) + { + if (result.mResults[i]) { S32 side = sides[i].asInteger(); // flag this side to not be nulled out later side_set.insert(sides[i]); - if (!obj || !obj->setTEGLTFMaterialOverride(side, override_data)) + if (!obj || !obj->setTEGLTFMaterialOverride(side, result.mMaterialVector[i])) { // object not ready to receive override data, queue for later - gGLTFMaterialList.queueOverrideUpdate(object_id, side, override_data); + gGLTFMaterialList.queueOverrideUpdate(object_id, side, result.mMaterialVector[i]); } else if (obj && obj->isAnySelected()) { LLMaterialEditor::updateLive(object_id, side); } } + else + { + // unblock material editor + if (obj && obj->isAnySelected()) + { + LLMaterialEditor::updateLive(object_id, sides[i].asInteger()); + } + } } if (obj && side_set.size() != obj->getNumTEs()) @@ -242,24 +277,20 @@ public: } } } - else - { - LL_WARNS() << "Malformed GLTF override message data: " << message << LL_ENDL; - } - } - - if (clear_all && obj) - { // override list was empty or an error occurred, null out all overrides for this object - bool object_has_selection = obj->isAnySelected(); - for (int i = 0; i < obj->getNumTEs(); ++i) - { - obj->setTEGLTFMaterialOverride(i, nullptr); - if (object_has_selection) + else if (obj) + { // override list was empty or an error occurred, null out all overrides for this object + bool object_has_selection = obj->isAnySelected(); + for (int i = 0; i < obj->getNumTEs(); ++i) { - LLMaterialEditor::updateLive(obj->getID(), i); + obj->setTEGLTFMaterialOverride(i, nullptr); + if (object_has_selection) + { + LLMaterialEditor::updateLive(obj->getID(), i); + } } } - } + }); + return true; } }; |