[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