From d8fef30b36f540abad22547c68b78929054d7324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Tue, 2 Jul 2024 16:36:43 +0200 Subject: [PATCH] Fix: EEVEE: Broken object attributes on volume, pointcloud and curves This was a simple oversight. Also adding a version of `extract_object_attributes` for single material object. Fixes #123997 --- .../draw/engines/eevee_next/eevee_instance.cc | 2 +- .../draw/engines/eevee_next/eevee_sync.cc | 11 ++++++++- .../draw/engines/eevee_next/eevee_sync.hh | 5 +++- source/blender/draw/intern/draw_manager.hh | 24 +++++++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc index 41b68d41e87..804be3a8eb1 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.cc +++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc @@ -291,7 +291,7 @@ void Instance::object_sync(Object *ob) sync.sync_point_cloud(ob, ob_handle, res_handle, ob_ref); break; case OB_VOLUME: - sync.sync_volume(ob, ob_handle, res_handle); + sync.sync_volume(ob, ob_handle, res_handle, ob_ref); break; case OB_CURVES: sync.sync_curves(ob, ob_handle, res_handle, ob_ref); diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.cc b/source/blender/draw/engines/eevee_next/eevee_sync.cc index 9c3d48a8d89..325f2087931 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sync.cc +++ b/source/blender/draw/engines/eevee_next/eevee_sync.cc @@ -322,6 +322,8 @@ void SyncModule::sync_point_cloud(Object *ob, inst_.manager->update_handle_bounds(res_handle, ob_ref, mat->inflate_bounds); } + inst_.manager->extract_object_attributes(res_handle, ob_ref, material.shading.gpumat); + inst_.shadows.sync_object(ob, ob_handle, res_handle, @@ -335,7 +337,10 @@ void SyncModule::sync_point_cloud(Object *ob, /** \name Volume Objects * \{ */ -void SyncModule::sync_volume(Object *ob, ObjectHandle & /*ob_handle*/, ResourceHandle res_handle) +void SyncModule::sync_volume(Object *ob, + ObjectHandle & /*ob_handle*/, + ResourceHandle res_handle, + const ObjectRef &ob_ref) { if (!inst_.use_volumes) { return; @@ -363,6 +368,8 @@ void SyncModule::sync_volume(Object *ob, ObjectHandle & /*ob_handle*/, ResourceH } }; + inst_.manager->extract_object_attributes(res_handle, ob_ref, material.volume_material.gpumat); + drawcall_add(material.volume_occupancy, geom, res_handle); drawcall_add(material.volume_material, geom, res_handle); } @@ -586,6 +593,8 @@ void SyncModule::sync_curves(Object *ob, inst_.manager->update_handle_bounds(res_handle, ob_ref, mat->inflate_bounds); } + inst_.manager->extract_object_attributes(res_handle, ob_ref, material.shading.gpumat); + inst_.shadows.sync_object(ob, ob_handle, res_handle, diff --git a/source/blender/draw/engines/eevee_next/eevee_sync.hh b/source/blender/draw/engines/eevee_next/eevee_sync.hh index 9409c1230b6..7b5690a723b 100644 --- a/source/blender/draw/engines/eevee_next/eevee_sync.hh +++ b/source/blender/draw/engines/eevee_next/eevee_sync.hh @@ -178,7 +178,10 @@ class SyncModule { ObjectHandle &ob_handle, ResourceHandle res_handle, const ObjectRef &ob_ref); - void sync_volume(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle); + void sync_volume(Object *ob, + ObjectHandle &ob_handle, + ResourceHandle res_handle, + const ObjectRef &ob_ref); void sync_gpencil(Object *ob, ObjectHandle &ob_handle, ResourceHandle res_handle); void sync_curves(Object *ob, ObjectHandle &ob_handle, diff --git a/source/blender/draw/intern/draw_manager.hh b/source/blender/draw/intern/draw_manager.hh index 12935885f5f..218337c61ed 100644 --- a/source/blender/draw/intern/draw_manager.hh +++ b/source/blender/draw/intern/draw_manager.hh @@ -159,7 +159,11 @@ class Manager { /** * Populate additional per resource data on demand. + * IMPORTANT: Should be called only **once** per object. */ + void extract_object_attributes(ResourceHandle handle, + const ObjectRef &ref, + const GPUMaterial *material); void extract_object_attributes(ResourceHandle handle, const ObjectRef &ref, Span materials); @@ -294,6 +298,26 @@ inline void Manager::update_handle_bounds(ResourceHandle handle, bounds_buf.current()[handle.resource_index()].sync(bounds_center, bounds_half_extent); } +inline void Manager::extract_object_attributes(ResourceHandle handle, + const ObjectRef &ref, + const GPUMaterial *material) +{ + ObjectInfos &infos = infos_buf.current().get_or_resize(handle.resource_index()); + infos.object_attrs_offset = attribute_len_; + + const GPUUniformAttrList *attr_list = GPU_material_uniform_attributes(material); + if (attr_list == nullptr) { + return; + } + + LISTBASE_FOREACH (const GPUUniformAttr *, attr, &attr_list->list) { + if (attributes_buf.get_or_resize(attribute_len_).sync(ref, *attr)) { + infos.object_attrs_len++; + attribute_len_++; + } + } +} + inline void Manager::extract_object_attributes(ResourceHandle handle, const ObjectRef &ref, Span materials)