diff --git a/src/noggit/MapChunk.cpp b/src/noggit/MapChunk.cpp index 1656eed1..e4e1d2c9 100755 --- a/src/noggit/MapChunk.cpp +++ b/src/noggit/MapChunk.cpp @@ -1482,6 +1482,10 @@ void MapChunk::save(sExtendableArray& lADTFile if(texture_set) { + // hackfix -- temp hackfix to bruteforce update + save + texture_set->apply_alpha_changes(); + texture_set->updateDoodadMapping(); + std::copy(texture_set->getDoodadMappingBase(), texture_set->getDoodadMappingBase() + 8 , lMCNK_header->doodadMapping); *reinterpret_cast(lMCNK_header->doodadStencil) diff --git a/src/noggit/rendering/TileRender.cpp b/src/noggit/rendering/TileRender.cpp index fb07169c..8d63f4f9 100755 --- a/src/noggit/rendering/TileRender.cpp +++ b/src/noggit/rendering/TileRender.cpp @@ -111,7 +111,8 @@ void TileRender::draw (OpenGL::Scoped::use_program& mcnk_shader } // run chunk updates. running this when splitdraw call detected unused sampler configuration as well. - if (_map_tile->_chunk_update_flags || is_selected != _selected || need_paintability_update || _requires_sampler_reset || _texture_not_loaded || _requires_ground_effect_color_recalc) + if (_map_tile->_chunk_update_flags || is_selected != _selected || need_paintability_update || _requires_sampler_reset || _texture_not_loaded + || _requires_ground_effect_color_recalc || _require_geffect_active_texture_update) { gl.bindBuffer(GL_UNIFORM_BUFFER, _chunk_instance_data_ubo); @@ -159,8 +160,13 @@ void TileRender::draw (OpenGL::Scoped::use_program& mcnk_shader { // recalculate doodad mapping. chunk->getTextureSet()->updateDoodadMapping(); - - // setChunkGroundEffectActiveData(); + // update render + setChunkGroundEffectActiveData(chunk.get()); + } + else if (_require_geffect_active_texture_update) + { + // active texture render changed, just update render + setChunkGroundEffectActiveData(chunk.get()); } if (!flags) @@ -249,6 +255,7 @@ void TileRender::draw (OpenGL::Scoped::use_program& mcnk_shader _requires_sampler_reset = false; _requires_ground_effect_color_recalc = false; + _require_geffect_active_texture_update = false; if (_split_drawcall) { @@ -611,7 +618,7 @@ void TileRender::setChunkDetaildoodadsExclusionData(MapChunk* chunk) chunk_render_instance.ChunkDoodadsEnabled2_ChunksLayerEnabled2[1] = exclusionmap2; } -void Noggit::Rendering::TileRender::setChunkGroundEffectActiveData(MapChunk* chunk, std::string active_texture) +void Noggit::Rendering::TileRender::setChunkGroundEffectActiveData(MapChunk* chunk) { // 1 : check if chunk has our texture AND set // if it does, then check if it's the active layer for each unit @@ -620,7 +627,7 @@ void Noggit::Rendering::TileRender::setChunkGroundEffectActiveData(MapChunk* chu int layer_id = -1; for (int i = 0; i < chunk->getTextureSet()->num(); ++i) { - if (chunk->getTextureSet()->filename(i) == active_texture) + if (chunk->getTextureSet()->filename(i) == _geffect_active_texture) { layer_id = i; } @@ -664,3 +671,14 @@ void Noggit::Rendering::TileRender::setChunkGroundEffectActiveData(MapChunk* chu chunk_render_instance.ChunkDoodadsEnabled2_ChunksLayerEnabled2[2] = active_map1; chunk_render_instance.ChunkDoodadsEnabled2_ChunksLayerEnabled2[3] = active_map2; } + +void Noggit::Rendering::TileRender::setActiveRenderGEffectTexture(std::string active_texture) +{ + if (active_texture == _geffect_active_texture) + return; + + _geffect_active_texture = active_texture; + + _require_geffect_active_texture_update = true; + +} diff --git a/src/noggit/rendering/TileRender.hpp b/src/noggit/rendering/TileRender.hpp index c855f865..a9ccf0a7 100755 --- a/src/noggit/rendering/TileRender.hpp +++ b/src/noggit/rendering/TileRender.hpp @@ -44,7 +44,8 @@ namespace Noggit::Rendering void initChunkData(MapChunk* chunk); void setChunkDetaildoodadsExclusionData(MapChunk* chunk); - void setChunkGroundEffectActiveData(MapChunk* chunk, std::string active_texture); + void setChunkGroundEffectActiveData(MapChunk* chunk); + void setActiveRenderGEffectTexture(std::string active_texture); [[nodiscard]] unsigned objectsFrustumCullTest() const { return _objects_frustum_cull_test; }; @@ -76,6 +77,9 @@ namespace Noggit::Rendering bool _requires_paintability_recalc = true; bool _requires_ground_effect_color_recalc = true; bool _texture_not_loaded = false; + bool _require_geffect_active_texture_update = true; + + std::string _geffect_active_texture = ""; // culling unsigned _objects_frustum_cull_test = 0; diff --git a/src/noggit/ui/GroundEffectsTool.cpp b/src/noggit/ui/GroundEffectsTool.cpp index 95839f76..12d85710 100644 --- a/src/noggit/ui/GroundEffectsTool.cpp +++ b/src/noggit/ui/GroundEffectsTool.cpp @@ -536,6 +536,7 @@ namespace Noggit for (MapTile* tile : _map_view->getWorld()->mapIndex.loaded_tiles()) { + tile->renderer()->setActiveRenderGEffectTexture(active_texture); for (int x = 0; x < 16; x++) { for (int y = 0; y < 16; y++) @@ -546,8 +547,10 @@ namespace Noggit // reset to black by default tile->renderer()->setChunkGroundEffectColor(chunk_index, glm::vec3(0.0, 0.0, 0.0)); - // ! Set the chunk active layer data - tile->renderer()->setChunkGroundEffectActiveData(chunk, active_texture); + + // ! Set the chunk active layer data. + // new system : just update the active texture and mark dirty to the renderer + // tile->renderer()->setChunkGroundEffectActiveData(chunk); if (active_texture.empty() || active_texture == "tileset\\generic\\black.blp" || _loaded_effects.empty()) continue;