UI: add material settings in shader editor sidebar.
authorLucas Boutrot <thornydre>
Thu, 6 Dec 2018 23:43:07 +0000 (00:43 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Thu, 6 Dec 2018 23:57:20 +0000 (00:57 +0100)
Differential Revision: https://developer.blender.org/D3926

intern/cycles/blender/addon/ui.py
release/scripts/startup/bl_ui/properties_material.py
release/scripts/startup/bl_ui/space_node.py

index afd13b304cefcefc9fd6ec5275f63f95597f242a..b276d0bee10769b6c37ec118d39b2f7583f3a4c6 100644 (file)
@@ -54,6 +54,16 @@ class CyclesButtonsPanel:
         return context.engine in cls.COMPAT_ENGINES
 
 
+class CyclesNodeButtonsPanel:
+    bl_space_type = "NODE_EDITOR"
+    bl_region_type = "UI"
+    COMPAT_ENGINES = {'CYCLES'}
+
+    @classmethod
+    def poll(cls, context):
+        return context.engine in cls.COMPAT_ENGINES
+
+
 def get_device_type(context):
     return context.user_preferences.addons[__package__].preferences.compute_device_type
 
@@ -1668,31 +1678,29 @@ class CYCLES_MATERIAL_PT_settings(CyclesButtonsPanel, Panel):
     def poll(cls, context):
         return context.material and CyclesButtonsPanel.poll(context)
 
-    def draw(self, context):
+    @staticmethod
+    def draw_shared(self, mat):
         layout = self.layout
         layout.use_property_split = True
         layout.use_property_decorate = False
 
-        mat = context.material
-
         layout.prop(mat, "pass_index")
 
+    def draw(self, context):
+        self.draw_shared(self, context.material)
+
 
 class CYCLES_MATERIAL_PT_settings_surface(CyclesButtonsPanel, Panel):
     bl_label = "Surface"
     bl_parent_id = "CYCLES_MATERIAL_PT_settings"
     bl_context = "material"
 
-    @classmethod
-    def poll(cls, context):
-        return context.material and CyclesButtonsPanel.poll(context)
-
-    def draw(self, context):
+    @staticmethod
+    def draw_shared(self, mat):
         layout = self.layout
         layout.use_property_split = True
         layout.use_property_decorate = False
 
-        mat = context.material
         cmat = mat.cycles
 
         col = layout.column()
@@ -1700,22 +1708,21 @@ class CYCLES_MATERIAL_PT_settings_surface(CyclesButtonsPanel, Panel):
         col.prop(cmat, "use_transparent_shadow")
         col.prop(cmat, "displacement_method", text="Displacement Method")
 
+    def draw(self, context):
+        self.draw_shared(self, context.material)
+
 
 class CYCLES_MATERIAL_PT_settings_volume(CyclesButtonsPanel, Panel):
     bl_label = "Volume"
     bl_parent_id = "CYCLES_MATERIAL_PT_settings"
     bl_context = "material"
 
-    @classmethod
-    def poll(cls, context):
-        return context.material and CyclesButtonsPanel.poll(context)
-
-    def draw(self, context):
+    @staticmethod
+    def draw_shared(self, context, mat):
         layout = self.layout
         layout.use_property_split = True
         layout.use_property_decorate = False
 
-        mat = context.material
         cmat = mat.cycles
 
         col = layout.column()
@@ -1725,6 +1732,9 @@ class CYCLES_MATERIAL_PT_settings_volume(CyclesButtonsPanel, Panel):
         col.prop(cmat, "volume_interpolation", text="Interpolation")
         col.prop(cmat, "homogeneous_volume", text="Homogeneous")
 
+    def draw(self, context):
+        self.draw_shared(self, context, context.material)
+
 
 class CYCLES_RENDER_PT_bake(CyclesButtonsPanel, Panel):
     bl_label = "Bake"
@@ -1959,6 +1969,42 @@ class CYCLES_RENDER_PT_simplify_culling(CyclesButtonsPanel, Panel):
         sub.prop(cscene, "distance_cull_margin", text="Distance")
 
 
+class CYCLES_NODE_PT_settings(CyclesNodeButtonsPanel, Panel):
+    bl_label = "Settings"
+    bl_category = "Node"
+    bl_options = {'DEFAULT_CLOSED'}
+
+    @classmethod
+    def poll(cls, context):
+        snode = context.space_data
+        return CyclesNodeButtonsPanel.poll(context) and \
+               snode.tree_type == 'ShaderNodeTree' and snode.id
+
+    def draw(self, context):
+        material = context.space_data.id
+        CYCLES_MATERIAL_PT_settings.draw_shared(self, material)
+
+
+class CYCLES_NODE_PT_settings_surface(CyclesNodeButtonsPanel, Panel):
+    bl_label = "Surface"
+    bl_category = "Node"
+    bl_parent_id = "CYCLES_NODE_PT_settings"
+
+    def draw(self, context):
+        material = context.space_data.id
+        CYCLES_MATERIAL_PT_settings_surface.draw_shared(self, material)
+
+
+class CYCLES_NODE_PT_settings_volume(CyclesNodeButtonsPanel, Panel):
+    bl_label = "Volume"
+    bl_category = "Node"
+    bl_parent_id = "CYCLES_NODE_PT_settings"
+
+    def draw(self, context):
+        material = context.space_data.id
+        CYCLES_MATERIAL_PT_settings_volume.draw_shared(self, context, material)
+
+
 def draw_device(self, context):
     scene = context.scene
     layout = self.layout
@@ -2087,6 +2133,9 @@ classes = (
     CYCLES_MATERIAL_PT_settings_volume,
     CYCLES_RENDER_PT_bake,
     CYCLES_RENDER_PT_debug,
+    CYCLES_NODE_PT_settings,
+    CYCLES_NODE_PT_settings_surface,
+    CYCLES_NODE_PT_settings_volume,
 )
 
 
index 89c1f32ed2dee28143b4f17ecd1263a11de5f0e6..aa3166febee1341d5191ee07615d0e582c606e8a 100644 (file)
@@ -204,8 +204,8 @@ class EEVEE_MATERIAL_PT_volume(MaterialButtonsPanel, Panel):
         panel_node_draw(layout, mat.node_tree, 'OUTPUT_MATERIAL', "Volume")
 
 
-class EEVEE_MATERIAL_PT_options(MaterialButtonsPanel, Panel):
-    bl_label = "Options"
+class EEVEE_MATERIAL_PT_settings(MaterialButtonsPanel, Panel):
+    bl_label = "Settings"
     bl_context = "material"
     COMPAT_ENGINES = {'BLENDER_EEVEE'}
 
@@ -214,12 +214,11 @@ class EEVEE_MATERIAL_PT_options(MaterialButtonsPanel, Panel):
         engine = context.engine
         return context.material and (engine in cls.COMPAT_ENGINES)
 
-    def draw(self, context):
+    @staticmethod
+    def draw_shared(self, mat):
         layout = self.layout
         layout.use_property_split = True
 
-        mat = context.material
-
         layout.prop(mat, "blend_method")
 
         if mat.blend_method != 'OPAQUE':
@@ -236,6 +235,9 @@ class EEVEE_MATERIAL_PT_options(MaterialButtonsPanel, Panel):
         layout.prop(mat, "refraction_depth")
         layout.prop(mat, "use_sss_translucency")
 
+    def draw(self, context):
+        self.draw_shared(self, context.material)
+
 
 class MATERIAL_PT_viewport(MaterialButtonsPanel, Panel):
     bl_label = "Viewport Display"
@@ -246,9 +248,8 @@ class MATERIAL_PT_viewport(MaterialButtonsPanel, Panel):
     def poll(cls, context):
         return context.material
 
-    def draw(self, context):
-        mat = context.material
-
+    @staticmethod
+    def draw_shared(self, mat):
         layout = self.layout
         layout.use_property_split = True
 
@@ -257,6 +258,9 @@ class MATERIAL_PT_viewport(MaterialButtonsPanel, Panel):
         col.prop(mat, "metallic")
         col.prop(mat, "roughness")
 
+    def draw(self, context):
+        self.draw_shared(self, context.material)
+
 
 classes = (
     MATERIAL_MT_specials,
@@ -265,7 +269,7 @@ classes = (
     EEVEE_MATERIAL_PT_context_material,
     EEVEE_MATERIAL_PT_surface,
     EEVEE_MATERIAL_PT_volume,
-    EEVEE_MATERIAL_PT_options,
+    EEVEE_MATERIAL_PT_settings,
     MATERIAL_PT_viewport,
     MATERIAL_PT_custom_props,
 )
index d799251fe30436420d23318388d4d86b4a8836d3..1674940b77febcdbb6a767eb8a16ebf60406a4a1 100644 (file)
@@ -27,6 +27,10 @@ from .properties_grease_pencil_common import (
     AnnotationDataPanel,
     GreasePencilToolsPanel,
 )
+from .properties_material import (
+    EEVEE_MATERIAL_PT_settings,
+    MATERIAL_PT_viewport
+)
 
 
 class NODE_HT_header(Header):
@@ -552,6 +556,41 @@ class NODE_PT_grease_pencil_tools(GreasePencilToolsPanel, Panel):
     # toolbar, but which may not necessarily be open
 
 
+class EEVEE_NODE_PT_material_settings(Panel):
+    bl_space_type = 'NODE_EDITOR'
+    bl_region_type = 'UI'
+    bl_category = "Node"
+    bl_label = "Settings"
+    COMPAT_ENGINES = {'BLENDER_EEVEE'}
+
+    @classmethod
+    def poll(cls, context):
+        snode = context.space_data
+        return (context.engine in cls.COMPAT_ENGINES) and \
+               snode.tree_type == 'ShaderNodeTree' and snode.id
+
+    def draw(self, context):
+        material = context.space_data.id
+        EEVEE_MATERIAL_PT_settings.draw_shared(self, material)
+
+
+class NODE_PT_material_viewport(Panel):
+    bl_space_type = 'NODE_EDITOR'
+    bl_region_type = 'UI'
+    bl_category = "Node"
+    bl_label = "Viewport Display"
+    bl_options = {'DEFAULT_CLOSED'}
+
+    @classmethod
+    def poll(cls, context):
+        snode = context.space_data
+        return snode.tree_type == 'ShaderNodeTree' and snode.id
+
+    def draw(self, context):
+        material = context.space_data.id
+        MATERIAL_PT_viewport.draw_shared(self, material)
+
+
 def node_draw_tree_view(layout, context):
     pass
 
@@ -574,6 +613,8 @@ classes = (
     NODE_UL_interface_sockets,
     NODE_PT_grease_pencil,
     NODE_PT_grease_pencil_tools,
+    EEVEE_NODE_PT_material_settings,
+    NODE_PT_material_viewport,
 )