[Bf-blender-cvs] [5c0981b5999] tmp-eevee-aov: EEVEE-AOV: Data management + UI
Jeroen Bakker
noreply at git.blender.org
Wed Sep 23 17:21:54 CEST 2020
Commit: 5c0981b5999f721c07780386ecff4eeed9fd7674
Author: Jeroen Bakker
Date: Wed Sep 23 13:42:18 2020 +0200
Branches: tmp-eevee-aov
https://developer.blender.org/rB5c0981b5999f721c07780386ecff4eeed9fd7674
EEVEE-AOV: Data management + UI
- Adds a ViewLayerAOV
- Add layer kernel functions to modify and validate AOVs
- Add Operators to add/remove AOV
- Enable the AOV panel for EEVEE
- Enable the AOV render pass selection in the viewport.
Note that no changes have been made to EEVEE yet.
===================================================================
M release/scripts/startup/bl_ui/properties_view_layer.py
M source/blender/blenkernel/BKE_layer.h
M source/blender/blenkernel/intern/layer.c
M source/blender/blenloader/intern/readfile.c
M source/blender/blenloader/intern/writefile.c
M source/blender/editors/render/render_intern.h
M source/blender/editors/render/render_ops.c
M source/blender/editors/render/render_shading.c
M source/blender/makesdna/DNA_layer_types.h
M source/blender/makesdna/DNA_view3d_types.h
M source/blender/makesrna/RNA_access.h
M source/blender/makesrna/intern/rna_internal.h
M source/blender/makesrna/intern/rna_layer.c
M source/blender/makesrna/intern/rna_scene.c
M source/blender/makesrna/intern/rna_space.c
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/intern/wm_window.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py
index 36bbf78d8ab..35cd7ae5ab9 100644
--- a/release/scripts/startup/bl_ui/properties_view_layer.py
+++ b/release/scripts/startup/bl_ui/properties_view_layer.py
@@ -17,7 +17,16 @@
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
-from bpy.types import Panel
+from bpy.types import Panel, UIList
+
+
+class VIEWLAYER_UL_aov(UIList):
+ def draw_item(self, context, layout, data, item, icon, active_data, active_propname):
+ row = layout.row()
+ split = row.split(factor=0.65)
+ icon = 'NONE' if item.is_valid else 'ERROR'
+ split.row().prop(item, "name", text="", icon=icon, emboss=False)
+ split.row().prop(item, "type", text="", emboss=False)
class ViewLayerButtonsPanel:
@@ -49,7 +58,7 @@ class VIEWLAYER_PT_layer(ViewLayerButtonsPanel, Panel):
col.prop(rd, "use_single_layer", text="Render Single Layer")
-class VIEWLAYER_PT_eevee_layer_passes(ViewLayerButtonsPanel, Panel):
+class VIEWLAYER_PT_layer_passes(ViewLayerButtonsPanel, Panel):
bl_label = "Passes"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@@ -59,7 +68,7 @@ class VIEWLAYER_PT_eevee_layer_passes(ViewLayerButtonsPanel, Panel):
class VIEWLAYER_PT_eevee_layer_passes_data(ViewLayerButtonsPanel, Panel):
bl_label = "Data"
- bl_parent_id = "VIEWLAYER_PT_eevee_layer_passes"
+ bl_parent_id = "VIEWLAYER_PT_layer_passes"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
@@ -81,7 +90,7 @@ class VIEWLAYER_PT_eevee_layer_passes_data(ViewLayerButtonsPanel, Panel):
class VIEWLAYER_PT_eevee_layer_passes_light(ViewLayerButtonsPanel, Panel):
bl_label = "Light"
- bl_parent_id = "VIEWLAYER_PT_eevee_layer_passes"
+ bl_parent_id = "VIEWLAYER_PT_layer_passes"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
def draw(self, context):
@@ -116,7 +125,7 @@ class VIEWLAYER_PT_eevee_layer_passes_light(ViewLayerButtonsPanel, Panel):
class VIEWLAYER_PT_eevee_layer_passes_effects(ViewLayerButtonsPanel, Panel):
bl_label = "Effects"
- bl_parent_id = "VIEWLAYER_PT_eevee_layer_passes"
+ bl_parent_id = "VIEWLAYER_PT_layer_passes"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
def draw(self, context):
@@ -134,12 +143,42 @@ class VIEWLAYER_PT_eevee_layer_passes_effects(ViewLayerButtonsPanel, Panel):
col.prop(view_layer_eevee, "use_pass_bloom", text="Bloom")
col.active = scene_eevee.use_bloom
+
+class VIEWLAYER_PT_layer_passes_aov(ViewLayerButtonsPanel, Panel):
+ bl_label = "Shader AOV"
+ bl_parent_id = "VIEWLAYER_PT_layer_passes"
+ COMPAT_ENGINES = {'BLENDER_EEVEE'}
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ view_layer = context.view_layer
+
+ row = layout.row()
+ col = row.column()
+ col.template_list("VIEWLAYER_UL_aov", "aovs", view_layer, "aovs", view_layer, "active_aov_index", rows=2)
+
+ col = row.column()
+ sub = col.column(align=True)
+ sub.operator("scene.view_layer_add_aov", icon='ADD', text="")
+ sub.operator("scene.view_layer_remove_aov", icon='REMOVE', text="")
+
+ aov = view_layer.active_aov
+ if aov and not aov.is_valid:
+ layout.label(text="Conflicts with another render pass with the same name", icon='ERROR')
+
+
classes = (
VIEWLAYER_PT_layer,
- VIEWLAYER_PT_eevee_layer_passes,
+ VIEWLAYER_PT_layer_passes,
VIEWLAYER_PT_eevee_layer_passes_data,
VIEWLAYER_PT_eevee_layer_passes_light,
VIEWLAYER_PT_eevee_layer_passes_effects,
+ VIEWLAYER_PT_layer_passes_aov,
+ VIEWLAYER_UL_aov,
)
if __name__ == "__main__": # only for live edit.
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 024d58174e8..6093ce61c94 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -39,6 +39,7 @@ struct Depsgraph;
struct LayerCollection;
struct Main;
struct Object;
+struct RenderEngine;
struct Scene;
struct View3D;
struct ViewLayer;
@@ -430,6 +431,14 @@ bool BKE_view_layer_filter_edit_mesh_has_edges(struct Object *ob, void *user_dat
BKE_view_layer_array_from_objects_in_mode( \
view_layer, v3d, r_len, {.object_mode = mode, .no_dup_data = true})
+struct ViewLayerAOV *BKE_view_layer_add_aov(struct ViewLayer *view_layer);
+void BKE_view_layer_remove_aov(struct ViewLayer *view_layer, struct ViewLayerAOV *aov);
+void BKE_view_layer_set_active_aov(struct ViewLayer *view_layer, struct ViewLayerAOV *aov);
+void BKE_view_layer_verify_aov(struct RenderEngine *engine,
+ struct Scene *scene,
+ struct ViewLayer *view_layer);
+ViewLayer *BKE_view_layer_find_with_aov(struct Scene *scene, struct ViewLayerAOV *view_layer_aov);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 1d47fb002e6..f45ad4b04c8 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -54,6 +54,8 @@
#include "DRW_engine.h"
+#include "RE_engine.h"
+
#include "MEM_guardedalloc.h"
/* Set of flags which are dependent on a collection settings. */
@@ -274,6 +276,8 @@ void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user)
}
}
BLI_freelistN(&view_layer->drawdata);
+ BLI_freelistN(&view_layer->aovs);
+ view_layer->active_aov = NULL;
MEM_SAFE_FREE(view_layer->stats);
@@ -399,6 +403,28 @@ void BKE_view_layer_base_select_and_set_active(struct ViewLayer *view_layer, Bas
}
/**************************** Copy View Layer and Layer Collections ***********************/
+static void layer_aov_copy_data(ViewLayer *view_layer_dst,
+ const ViewLayer *view_layer_src,
+ ListBase *aovs_dst,
+ const ListBase *aovs_src)
+{
+ if (aovs_src != NULL) {
+ BLI_duplicatelist(aovs_dst, aovs_src);
+ }
+
+ ViewLayerAOV *aov_dst = aovs_dst->first;
+ const ViewLayerAOV *aov_src = aovs_src->first;
+
+ while (aov_dst != NULL) {
+ BLI_assert(aov_src);
+ if (aov_src == view_layer_src->active_aov) {
+ view_layer_dst->active_aov = aov_dst;
+ }
+
+ aov_dst = aov_dst->next;
+ aov_src = aov_src->next;
+ }
+}
static void layer_collections_copy_data(ViewLayer *view_layer_dst,
const ViewLayer *view_layer_src,
@@ -469,6 +495,10 @@ void BKE_view_layer_copy_data(Scene *scene_dst,
LayerCollection *lc_scene_dst = view_layer_dst->layer_collections.first;
lc_scene_dst->collection = scene_dst->master_collection;
+ BLI_listbase_clear(&view_layer_dst->aovs);
+ layer_aov_copy_data(
+ view_layer_dst, view_layer_src, &view_layer_dst->aovs, &view_layer_src->aovs);
+
if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
id_us_plus((ID *)view_layer_dst->mat_override);
}
@@ -1827,3 +1857,98 @@ void BKE_layer_eval_view_layer_indexed(struct Depsgraph *depsgraph,
BLI_assert(view_layer != NULL);
layer_eval_view_layer(depsgraph, scene, view_layer);
}
+
+/* -------------------------------------------------------------------- */
+/** \name Shader AOV
+ * \{ */
+
+static void viewlayer_aov_active_set(ViewLayer *view_layer, ViewLayerAOV *aov)
+{
+ if (aov != NULL) {
+ BLI_assert(BLI_findindex(&view_layer->aovs, aov) != -1);
+ view_layer->active_aov = aov;
+ }
+ else {
+ view_layer->active_aov = NULL;
+ }
+}
+
+struct ViewLayerAOV *BKE_view_layer_add_aov(struct ViewLayer *view_layer)
+{
+ ViewLayerAOV *aov;
+ aov = MEM_callocN(sizeof(ViewLayerAOV), __func__);
+ BLI_addtail(&view_layer->aovs, aov);
+ BLI_strncpy(aov->name, "AOV", 64);
+ viewlayer_aov_active_set(view_layer, aov);
+ return aov;
+}
+
+void BKE_view_layer_remove_aov(ViewLayer *view_layer, ViewLayerAOV *aov)
+{
+ BLI_assert(BLI_findindex(&view_layer->aovs, aov) != -1);
+ BLI_assert(aov != NULL);
+ if (view_layer->active_aov == aov) {
+ if (aov->next) {
+ viewlayer_aov_active_set(view_layer, aov->next);
+ }
+ else {
+ viewlayer_aov_active_set(view_layer, aov->prev);
+ }
+ }
+ BLI_freelinkN(&view_layer->aovs, aov);
+}
+
+void BKE_view_layer_set_active_aov(ViewLayer *view_layer, ViewLayerAOV *aov)
+{
+ viewlayer_aov_active_set(view_layer, aov);
+}
+
+static void bke_view_layer_verify_aov_cb(void *userdata,
+ Scene *UNUSED(scene),
+ ViewLayer *UNUSED(view_layer),
+ const char *name,
+ int UNUSED(channels),
+ const char *UNUSED(chanid),
+ int UNUSED(type))
+{
+ GHash *name_count = userdata;
+ void **value_p;
+ void *key = BLI_strdup(name);
+
+ if (!BLI_ghash_ensure_p(name_count, key, &value_p)) {
+ *value_p = POINTER_FROM_INT(1);
+ }
+ else {
+ int value = POINTER_AS_INT(*value_p);
+ value++;
+ *value_p = POINTER_FROM_INT(value);
+ MEM_freeN(key);
+ }
+}
+
+void BKE_view_layer_verify_aov(struct RenderEngine *engine,
+ struct Scene *scene,
+ struct ViewLayer *view_layer)
+{
+ GHash *name_count = BLI_ghash_str_new(__func__);
+ RE_engine_update_render_passes(
+ engine, scene, view_layer, bke_view_layer_verify_aov_cb, name_count);
+ LISTBASE_FOREACH (ViewLayerAOV *, aov, &view_layer->aovs) {
+ void **value_p = BLI_ghash_lookup(name_count, aov->name);
+ int count = POINTER_AS_INT(value_p);
+ SET_FLAG_FROM_TEST(aov->flag, count > 1, AOV_CONFLICT);
+ }
+ BLI_ghash_free(name_count, MEM_freeN, NULL);
+}
+
+ViewLayer *BKE_view_layer_find_with_aov(struct Scene *scene, struct ViewLayerAOV *aov)
+{
+ LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
+ if (BLI_findindex(&view_layer->aovs, aov) != -1) {
+ return view_layer;
+ }
+ }
+ return NULL;
+}
+
+/** \} */
\ No newline at end of file
diff --git a/so
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list