Fix #123758: Viewport Render Animation doesn't track World updates

Viewport instances created by the Viewport Render Animation operator
don't get `view_updated` notifications.
Fix update detection by implementing a `last_update` timestamp for
`World`, similar to the ones added in #115196.

Pull Request: https://projects.blender.org/blender/blender/pulls/124114
This commit is contained in:
Miguel Pozo 2024-07-05 18:05:27 +02:00
parent c446813dd3
commit b20bacf657
7 changed files with 18 additions and 18 deletions

@ -144,8 +144,10 @@ static void world_blend_write(BlendWriter *writer, ID *id, const void *id_addres
{ {
World *wrld = (World *)id; World *wrld = (World *)id;
/* Clean up, important in undo case to reduce false detection of changed datablocks. */ /* Clean up runtime data, important in undo case to reduce false detection of changed
* datablocks. */
BLI_listbase_clear(&wrld->gpumaterial); BLI_listbase_clear(&wrld->gpumaterial);
wrld->last_update = 0;
/* write LibData */ /* write LibData */
BLO_write_id_struct(writer, World, id_address, &wrld->id); BLO_write_id_struct(writer, World, id_address, &wrld->id);
@ -226,4 +228,5 @@ void BKE_world_eval(Depsgraph *depsgraph, World *world)
{ {
DEG_debug_print_eval(depsgraph, __func__, world->id.name, world); DEG_debug_print_eval(depsgraph, __func__, world->id.name, world);
GPU_material_free(&world->gpumaterial); GPU_material_free(&world->gpumaterial);
world->last_update = DEG_get_update_count(depsgraph);
} }

@ -175,7 +175,6 @@ void Instance::update_eval_members()
void Instance::view_update() void Instance::view_update()
{ {
sampling.reset(); sampling.reset();
sync.view_update();
} }
/** \} */ /** \} */

@ -318,6 +318,11 @@ class Instance {
return flags; return flags;
} }
int get_recalc_flags(const ::World &world)
{
return world.last_update > depsgraph_last_update_ ? ID_RECALC_SHADING : 0;
}
private: private:
static void object_sync_render(void *instance_, static void object_sync_render(void *instance_,
Object *ob, Object *ob,

@ -34,13 +34,6 @@ namespace blender::eevee {
* *
* \{ */ * \{ */
void SyncModule::view_update()
{
if (DEG_id_type_updated(inst_.depsgraph, ID_WO)) {
world_updated_ = true;
}
}
ObjectHandle &SyncModule::sync_object(const ObjectRef &ob_ref) ObjectHandle &SyncModule::sync_object(const ObjectRef &ob_ref)
{ {
ObjectKey key(ob_ref.object); ObjectKey key(ob_ref.object);
@ -56,11 +49,10 @@ ObjectHandle &SyncModule::sync_object(const ObjectRef &ob_ref)
return handle; return handle;
} }
WorldHandle SyncModule::sync_world() WorldHandle SyncModule::sync_world(const ::World &world)
{ {
WorldHandle handle; WorldHandle handle;
handle.recalc = world_updated_ ? int(ID_RECALC_SHADING) : 0; handle.recalc = inst_.get_recalc_flags(world);
world_updated_ = false;
return handle; return handle;
} }

@ -155,16 +155,12 @@ class SyncModule {
Map<ObjectKey, ObjectHandle> ob_handles = {}; Map<ObjectKey, ObjectHandle> ob_handles = {};
bool world_updated_ = false;
public: public:
SyncModule(Instance &inst) : inst_(inst){}; SyncModule(Instance &inst) : inst_(inst){};
~SyncModule(){}; ~SyncModule(){};
void view_update();
ObjectHandle &sync_object(const ObjectRef &ob_ref); ObjectHandle &sync_object(const ObjectRef &ob_ref);
WorldHandle sync_world(); WorldHandle sync_world(const ::World &world);
void sync_mesh(Object *ob, void sync_mesh(Object *ob,
ObjectHandle &ob_handle, ObjectHandle &ob_handle,

@ -104,7 +104,7 @@ void World::sync()
WorldHandle wo_handle = {0}; WorldHandle wo_handle = {0};
if (inst_.scene->world != nullptr) { if (inst_.scene->world != nullptr) {
/* Detect world update before overriding it. */ /* Detect world update before overriding it. */
wo_handle = inst_.sync.sync_world(); wo_handle = inst_.sync.sync_world(*inst_.scene->world);
has_update = wo_handle.recalc != 0; has_update = wo_handle.recalc != 0;
} }

@ -91,8 +91,13 @@ typedef struct World {
/** Light-group membership information. */ /** Light-group membership information. */
struct LightgroupMembership *lightgroup; struct LightgroupMembership *lightgroup;
void *_pad1;
/** Runtime. */ /** Runtime. */
ListBase gpumaterial; ListBase gpumaterial;
/* The Depsgraph::update_count when this World was last updated. */
uint64_t last_update;
} World; } World;
/* **************** WORLD ********************* */ /* **************** WORLD ********************* */