WIP update groundeffect rendering updates

This commit is contained in:
T1ti
2024-08-30 21:10:34 +02:00
parent 7b5e3b4125
commit d31a76009b
4 changed files with 37 additions and 8 deletions

View File

@@ -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<std::uint64_t*>(lMCNK_header->doodadStencil)

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;