From 5e415e333105497cc4810e7e3f60d6cf72605b10 Mon Sep 17 00:00:00 2001 From: "auria.mg" Date: Tue, 27 Dec 2016 22:08:27 -0500 Subject: [PATCH] Install all materials before loading meshes --- src/graphics/material.cpp | 4 +++- src/graphics/material.hpp | 4 ++-- src/graphics/material_manager.cpp | 12 ++++++++++++ src/graphics/material_manager.hpp | 1 + src/tracks/track.cpp | 4 ++++ 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/graphics/material.cpp b/src/graphics/material.cpp index abf6d2937..677d42d6b 100644 --- a/src/graphics/material.cpp +++ b/src/graphics/material.cpp @@ -518,10 +518,12 @@ void Material::install(bool is_full_path, bool complain_if_not_found) if (m_mask.size() > 0) { m_texture->grab(); + irr_driver->removeTexture(m_texture); video::ITexture* tex = irr_driver->applyMask(m_texture, m_mask); if (tex) { - irr_driver->removeTexture(m_texture); + // TODO: cleanup + //m_texture->drop(); m_texture = tex; } else diff --git a/src/graphics/material.hpp b/src/graphics/material.hpp index 20c764918..746f8c435 100644 --- a/src/graphics/material.hpp +++ b/src/graphics/material.hpp @@ -271,7 +271,6 @@ private: bool m_installed; void init (); - void install (bool is_full_path=false, bool complain_if_not_found=true); void initCustomSFX(const XMLNode *sfx); void initParticlesEffect(const XMLNode *node); @@ -283,7 +282,8 @@ public: bool load_texture = true); ~Material (); - void unloadTexture(); + void install(bool is_full_path = false, bool complain_if_not_found = true); + void unloadTexture(); void setSFXSpeed(SFXBase *sfx, float speed, bool should_be_paused) const; void setMaterialProperties(video::SMaterial *m, scene::IMeshBuffer* mb); diff --git a/src/graphics/material_manager.cpp b/src/graphics/material_manager.cpp index 3b3cac772..0b711c78a 100644 --- a/src/graphics/material_manager.cpp +++ b/src/graphics/material_manager.cpp @@ -395,6 +395,18 @@ void MaterialManager::unloadAllTextures() } } +// ---------------------------------------------------------------------------- + +void MaterialManager::installAllTextures() +{ + std::string texture_folder = file_manager->getAssetDirectory(FileManager::TEXTURE); + for (int i = 0; i < m_shared_material_index; i++) + { + if (m_materials[i]->getTexFullPath().find(texture_folder) != std::string::npos) + m_materials[i]->install(true, true); + } +} + // ---------------------------------------------------------------------------- bool MaterialManager::hasMaterial(const std::string& fname) { diff --git a/src/graphics/material_manager.hpp b/src/graphics/material_manager.hpp index 6f3a7f0a3..b8d2bb0e7 100644 --- a/src/graphics/material_manager.hpp +++ b/src/graphics/material_manager.hpp @@ -83,6 +83,7 @@ public: void makeMaterialsPermanent(); bool hasMaterial(const std::string& fname); + void installAllTextures(); void unloadAllTextures(); Material* getLatestMaterial() { return m_materials[m_materials.size()-1]; } diff --git a/src/tracks/track.cpp b/src/tracks/track.cpp index 6218111b8..4b256479b 100644 --- a/src/tracks/track.cpp +++ b/src/tracks/track.cpp @@ -1645,10 +1645,14 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id) { if(!m_materials_loaded) material_manager->addSharedMaterial(materials_file); + material_manager->installAllTextures(); m_materials_loaded = true; } else + { material_manager->pushTempMaterial(materials_file); + material_manager->installAllTextures(); + } } catch (std::exception& e) {