Fix 3D materials not updating on texture deleted

This commit is contained in:
Brian Semrau 2021-10-29 02:07:13 -04:00
parent dae626ad64
commit 725fc63294
5 changed files with 67 additions and 1 deletions

View file

@ -30,6 +30,7 @@
#include "render_forward_clustered.h"
#include "core/config/project_settings.h"
#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
#include "servers/rendering/rendering_device.h"
#include "servers/rendering/rendering_server_default.h"
@ -2644,6 +2645,13 @@ void RenderForwardClustered::_geometry_instance_add_surface(GeometryInstanceForw
material = (SceneShaderForwardClustered::MaterialData *)storage->material_get_data(m_src, RendererStorageRD::SHADER_TYPE_3D);
if (!material || !material->shader_data->valid) {
material = nullptr;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
// Uniform set may be gone because a dependency was erased. In this case, it will happen
// if a texture is deleted, so just re-create it.
storage->material_force_update_textures(m_src, RendererStorageRD::SHADER_TYPE_3D);
}
}
}
@ -2665,6 +2673,11 @@ void RenderForwardClustered::_geometry_instance_add_surface(GeometryInstanceForw
material = (SceneShaderForwardClustered::MaterialData *)storage->material_get_data(next_pass, RendererStorageRD::SHADER_TYPE_3D);
if (!material || !material->shader_data->valid) {
break;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
storage->material_force_update_textures(m_src, RendererStorageRD::SHADER_TYPE_3D);
}
}
if (ginstance->data->dirty_dependencies) {
storage->material_update_dependency(next_pass, &ginstance->data->dependency_tracker);

View file

@ -30,6 +30,7 @@
#include "render_forward_mobile.h"
#include "core/config/project_settings.h"
#include "servers/rendering/renderer_rd/renderer_compositor_rd.h"
#include "servers/rendering/rendering_device.h"
#include "servers/rendering/rendering_server_default.h"
@ -2362,6 +2363,11 @@ void RenderForwardMobile::_geometry_instance_add_surface(GeometryInstanceForward
material = (SceneShaderForwardMobile::MaterialData *)storage->material_get_data(m_src, RendererStorageRD::SHADER_TYPE_3D);
if (!material || !material->shader_data->valid) {
material = nullptr;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
storage->material_force_update_textures(m_src, RendererStorageRD::SHADER_TYPE_3D);
}
}
}
@ -2383,6 +2389,11 @@ void RenderForwardMobile::_geometry_instance_add_surface(GeometryInstanceForward
material = (SceneShaderForwardMobile::MaterialData *)storage->material_get_data(next_pass, RendererStorageRD::SHADER_TYPE_3D);
if (!material || !material->shader_data->valid) {
break;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
storage->material_force_update_textures(m_src, RendererStorageRD::SHADER_TYPE_3D);
}
}
if (ginstance->data->dirty_dependencies) {
storage->material_update_dependency(next_pass, &ginstance->data->dependency_tracker);

View file

@ -3903,6 +3903,11 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
material = (FogMaterialData *)storage->material_get_data(fog_material, RendererStorageRD::SHADER_TYPE_FOG);
if (!material || !material->shader_data->valid) {
material = nullptr;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
storage->material_force_update_textures(fog_material, RendererStorageRD::SHADER_TYPE_FOG);
}
}
}

View file

@ -1048,6 +1048,11 @@ void RendererSceneSkyRD::setup(RendererSceneEnvironmentRD *p_env, RID p_render_b
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
if (!material || !material->shader_data->valid) {
material = nullptr;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
storage->material_force_update_textures(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
}
}
}
@ -1203,6 +1208,11 @@ void RendererSceneSkyRD::update(RendererSceneEnvironmentRD *p_env, const CameraM
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
if (!material || !material->shader_data->valid) {
material = nullptr;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
storage->material_force_update_textures(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
}
}
}
@ -1378,6 +1388,11 @@ void RendererSceneSkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_cont
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
if (!material || !material->shader_data->valid) {
material = nullptr;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
storage->material_force_update_textures(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
}
}
}
@ -1481,6 +1496,11 @@ void RendererSceneSkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, u
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
if (!material || !material->shader_data->valid) {
material = nullptr;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
storage->material_force_update_textures(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
}
}
}
@ -1568,6 +1588,11 @@ void RendererSceneSkyRD::draw(RD::DrawListID p_draw_list, RendererSceneEnvironme
material = (SkyMaterialData *)storage->material_get_data(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
if (!material || !material->shader_data->valid) {
material = nullptr;
} else if (material->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
material->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) {
storage->material_force_update_textures(sky_material, RendererStorageRD::SHADER_TYPE_SKY);
}
}
}

View file

@ -5291,7 +5291,19 @@ void RendererStorageRD::_particles_process(Particles *p_particles, double p_delt
RD::get_singleton()->buffer_update(p_particles->frame_params_buffer, 0, sizeof(ParticlesFrameParams) * p_particles->trail_params.size(), p_particles->trail_params.ptr());
ParticlesMaterialData *m = (ParticlesMaterialData *)material_get_data(p_particles->process_material, SHADER_TYPE_PARTICLES);
ParticlesMaterialData *m = nullptr;
if (p_particles->process_material.is_valid()) {
m = (ParticlesMaterialData *)material_get_data(p_particles->process_material, SHADER_TYPE_PARTICLES);
if (!m || !m->shader_data) {
m = nullptr;
} else if (m->last_frame != RendererCompositorRD::singleton->get_frame_number()) {
m->last_frame = RendererCompositorRD::singleton->get_frame_number();
if (!RD::get_singleton()->uniform_set_is_valid(m->uniform_set)) {
material_force_update_textures(p_particles->process_material, RendererStorageRD::SHADER_TYPE_PARTICLES);
}
}
}
if (!m) {
m = (ParticlesMaterialData *)material_get_data(particles_shader.default_material, SHADER_TYPE_PARTICLES);
}