diff options
| -rw-r--r-- | indra/newview/llfloatermodelpreview.cpp | 86 | ||||
| -rw-r--r-- | indra/newview/llfloatermodelpreview.h | 3 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.cpp | 15 | ||||
| -rw-r--r-- | indra/newview/llmeshrepository.h | 8 | 
4 files changed, 105 insertions, 7 deletions
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 6a6766fb3f..08d3488ef2 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -503,7 +503,10 @@ void LLFloaterModelPreview::onClickCalculateBtn()      mUploadModelUrl.clear();      mModelPhysicsFee.clear(); -    gMeshRepo.uploadModel(mModelPreview->mUploadData, mModelPreview->mPreviewScale, +    lod_sources_map_t lod_sources; +    fillLODSourceStatistics(lod_sources); + +    gMeshRepo.uploadModel(mModelPreview->mUploadData, lod_sources, mModelPreview->mPreviewScale,                            childGetValue("upload_textures").asBoolean(),                            upload_skinweights, upload_joint_positions, lock_scale_if_joint_position,                            mUploadModelUrl, mDestinationFolderId, false, @@ -1317,8 +1320,84 @@ void LLFloaterModelPreview::createSmoothComboBox(LLComboBox* combo_box, float mi          std::string label = (++ilabel == SMOOTH_VALUES_NUMBER) ? "10 (max)" : llformat("%.1d", ilabel);          combo_box->add(label, value, ADD_BOTTOM, true);      } +} + +std::string get_source_file_extr(const std::string& filename) +{ +    if (std::string::npos != filename.rfind(".gltf") +        || std::string::npos != filename.rfind(".glb")) +    { +        return "gltf"; +    } +    else if (std::string::npos != filename.rfind(".dae")) +    { +        return "dae"; +    } +    else if (std::string::npos != filename.rfind(".slm")) +    { +        return "slm"; +    } +    else +    { +        return "unknown file"; +    } +} +void LLFloaterModelPreview::fillLODSourceStatistics(LLFloaterModelPreview::lod_sources_map_t& lod_sources) const +{ +    lod_sources.clear(); +    // This doesn't nessesarily reflect the actual source of meshes, just user choices, +    // some meshes could have been matched from different lods, but should be good +    // enough for statistics. +    for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod) +    { +        const std::string &lod_string = lod_name[lod]; +        if (mLODMode[lod] == LLModelPreview::USE_LOD_ABOVE) +        { +            lod_sources[lod_string] = "lod above"; +        } +        else if (mLODMode[lod] == LLModelPreview::MESH_OPTIMIZER_AUTO +            || mLODMode[lod] == LLModelPreview::MESH_OPTIMIZER_PRECISE +            || mLODMode[lod] == LLModelPreview::MESH_OPTIMIZER_SLOPPY) +        { +            lod_sources[lod_string] = "generated"; +        } +        else if (mLODMode[lod] == LLModelPreview::LOD_FROM_FILE) +        { +            const std::string& file = mModelPreview->mLODFile[lod]; +            lod_sources[lod_string] = get_source_file_extr(file); +        } +        else +        { +            lod_sources[lod_string] = "unknown source"; +        } +    } +    if (mModelPreview->mLODFile[LLModel::LOD_PHYSICS].empty()) +    { +        if (mModelPreview->mPhysicsSearchLOD >= 0 && mModelPreview->mPhysicsSearchLOD <= 3) +        { +            lod_sources["physics"] = lod_name[mModelPreview->mPhysicsSearchLOD]; +        } +        else +        { +            lod_sources["physics"] = "none"; +        } +    } +    else +    { +        const std::string& file = mModelPreview->mLODFile[LLModel::LOD_PHYSICS]; +        if (std::string::npos == file.rfind("cube.dae")) +        { +            // There is a chance it will misfire if someone tries to upload a cube.dae mesh, +            // but should be negligible enough. +            lod_sources["physics"] = get_source_file_extr(file); +        } +        else +        { +            lod_sources["physics"] = "bounding box"; +        } +    }  }  //----------------------------------------------------------------------------- @@ -1656,7 +1735,10 @@ void LLFloaterModelPreview::onUpload(void* user_data)          mp->mModelPreview->saveUploadData(upload_skinweights, upload_joint_positions, lock_scale_if_joint_position);      } -    gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, mp->mModelPreview->mPreviewScale, +    lod_sources_map_t lod_sources; +    mp->fillLODSourceStatistics(lod_sources); + +    gMeshRepo.uploadModel(mp->mModelPreview->mUploadData, lod_sources, mp->mModelPreview->mPreviewScale,                            mp->childGetValue("upload_textures").asBoolean(),                            upload_skinweights, upload_joint_positions, lock_scale_if_joint_position,                            mp->mUploadModelUrl, mp->mDestinationFolderId, diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 7b652a3613..982f36c46e 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -223,6 +223,9 @@ private:      void createSmoothComboBox(LLComboBox* combo_box, float min, float max); +    typedef std::map<std::string, std::string> lod_sources_map_t; +    void fillLODSourceStatistics(lod_sources_map_t& lod_sources) const; +      LLUUID mDestinationFolderId;      LLButton* mUploadBtn;      LLButton* mCalculateBtn; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 07d68fc3ec..fd3360b234 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -2569,7 +2569,8 @@ EMeshProcessingResult LLMeshRepoThread::physicsShapeReceived(const LLUUID& mesh_      return MESH_OK;  } -LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLVector3& scale, bool upload_textures, +LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, const LLMeshUploadThread::lod_sources_map_t& sources_list, +                                       LLVector3& scale, bool upload_textures,                                         bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,                                         const std::string & upload_url, LLUUID destination_folder_id, bool do_upload,                                         LLHandle<LLWholeModelFeeObserver> fee_observer, @@ -2584,6 +2585,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data,      mUploadObserverHandle(upload_observer)  {      mInstanceList = data; +    mLodSources = sources_list;      mUploadTextures = upload_textures;      mUploadSkin = upload_skin;      mUploadJoints = upload_joints; @@ -2721,6 +2723,12 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, std::vector<std::string>&      res["mesh_list"] = LLSD::emptyArray();      res["texture_list"] = LLSD::emptyArray();      res["instance_list"] = LLSD::emptyArray(); +    LLSD& lod_sources = res["source_format"]; +    lod_sources["high"] = 0; +    for (auto &source : mLodSources) +    { +        lod_sources[source.first] = source.second; +    }      S32 mesh_num = 0;      S32 texture_num = 0; @@ -5026,12 +5034,13 @@ bool LLMeshRepoThread::hasHeader(const LLUUID& mesh_id) const      return iter != mMeshHeader.end();  } -void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures, +void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, const std::map<std::string, std::string> &lod_sources, +                                   LLVector3& scale, bool upload_textures,                                     bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,                                     std::string upload_url, const LLUUID& destination_folder_id, bool do_upload,                                     LLHandle<LLWholeModelFeeObserver> fee_observer, LLHandle<LLWholeModelUploadObserver> upload_observer)  { -    LLMeshUploadThread* thread = new LLMeshUploadThread(data, scale, upload_textures, +    LLMeshUploadThread* thread = new LLMeshUploadThread(data, lod_sources, scale, upload_textures,                                                          upload_skin, upload_joints, lock_scale_if_joint_position,                                                          upload_url, destination_folder_id, do_upload, fee_observer, upload_observer);      mUploadWaitList.push_back(thread); diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 2b772f7803..ab17b921d6 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -691,6 +691,8 @@ public:      };      typedef std::map<LLPointer<LLModel>, instance_list, LLUploadModelInstanceLess> instance_map;      instance_map    mInstance; +    typedef std::map<std::string, std::string> lod_sources_map_t; +    lod_sources_map_t mLodSources;      LLMutex*        mMutex;      S32             mPendingUploads; @@ -707,7 +709,8 @@ public:      std::string     mWholeModelUploadURL;      LLUUID          mDestinationFolderId; -    LLMeshUploadThread(instance_list& data, LLVector3& scale, bool upload_textures, +    LLMeshUploadThread(instance_list& data, const lod_sources_map_t& sources_list, +                       LLVector3& scale, bool upload_textures,                         bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,                         const std::string & upload_url,                         const LLUUID destination_folder_id = LLUUID::null, @@ -869,7 +872,8 @@ public:      bool meshUploadEnabled();      bool meshRezEnabled(); -    void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures, +    void uploadModel(std::vector<LLModelInstance>& data, const std::map<std::string, std::string> &lod_sources, +                     LLVector3& scale, bool upload_textures,                       bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,                       std::string upload_url,                       const LLUUID& destination_folder_id = LLUUID::null,  | 
