diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-03-17 19:52:05 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-03-17 23:53:13 +0300 |
commit | df96455c55110da00f0543c5895376ffbc66313b (patch) | |
tree | d1fc0a55f44d4b931362d84eea77a7662c1955a6 | |
parent | f79ad428085edd8289f37027ba3d5ed3a52bce67 (diff) |
UI: add light/world settings in shader node editor.
Material was already there. Implementation was changed so it's just a
single line of code to adapt a panel to the node editor.
-rw-r--r-- | intern/cycles/blender/addon/ui.py | 80 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/properties_data_light.py | 18 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/properties_material.py | 16 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/space_node.py | 65 | ||||
-rw-r--r-- | source/blender/editors/space_node/space_node.c | 22 |
5 files changed, 94 insertions, 107 deletions
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index e0de3031466..a3ee5533fe7 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -50,14 +50,18 @@ class CyclesButtonsPanel: return context.engine in cls.COMPAT_ENGINES -class CyclesNodeButtonsPanel: - bl_space_type = "NODE_EDITOR" - bl_region_type = "UI" - COMPAT_ENGINES = {'CYCLES'} +# Adapt properties editor panel to display in node editor. We have to +# copy the class rather than inherit due to the way bpy registration works. +def node_panel(cls): + node_cls = type('NODE_' + cls.__name__, cls.__bases__, dict(cls.__dict__)) - @classmethod - def poll(cls, context): - return context.engine in cls.COMPAT_ENGINES + node_cls.bl_space_type = 'NODE_EDITOR' + node_cls.bl_region_type = 'UI' + node_cls.bl_category = "Node" + if hasattr(node_cls, 'bl_parent_id'): + node_cls.bl_parent_id = 'NODE_' + node_cls.bl_parent_id + + return node_cls def get_device_type(context): @@ -1328,13 +1332,16 @@ class CYCLES_LIGHT_PT_light(CyclesButtonsPanel, Panel): light = context.light clamp = light.cycles - # cscene = context.scene.cycles - - layout.prop(light, "type", expand=True) - layout.use_property_split = True layout.use_property_decorate = False + if self.bl_space_type == 'PROPERTIES': + layout.row().prop(light, "type", expand=True) + layout.use_property_split = True + else: + layout.use_property_split = True + layout.row().prop(light, "type") + col = layout.column() if light.type in {'POINT', 'SUN', 'SPOT'}: @@ -2035,43 +2042,6 @@ 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 and \ - snode.id.bl_rna.identifier == 'Material' - - 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 @@ -2118,6 +2088,8 @@ def get_panels(): 'DATA_PT_spot', 'MATERIAL_PT_context_material', 'MATERIAL_PT_preview', + 'NODE_DATA_PT_light', + 'NODE_DATA_PT_spot', 'VIEWLAYER_PT_filter', 'VIEWLAYER_PT_layer_passes', 'RENDER_PT_post_processing', @@ -2203,9 +2175,15 @@ classes = ( CYCLES_RENDER_PT_bake_selected_to_active, CYCLES_RENDER_PT_bake_output, CYCLES_RENDER_PT_debug, - CYCLES_NODE_PT_settings, - CYCLES_NODE_PT_settings_surface, - CYCLES_NODE_PT_settings_volume, + node_panel(CYCLES_MATERIAL_PT_settings), + node_panel(CYCLES_MATERIAL_PT_settings_surface), + node_panel(CYCLES_MATERIAL_PT_settings_volume), + node_panel(CYCLES_WORLD_PT_ray_visibility), + node_panel(CYCLES_WORLD_PT_settings), + node_panel(CYCLES_WORLD_PT_settings_surface), + node_panel(CYCLES_WORLD_PT_settings_volume), + node_panel(CYCLES_LIGHT_PT_light), + node_panel(CYCLES_LIGHT_PT_spot), ) diff --git a/release/scripts/startup/bl_ui/properties_data_light.py b/release/scripts/startup/bl_ui/properties_data_light.py index d6f37245d96..acda015f8d4 100644 --- a/release/scripts/startup/bl_ui/properties_data_light.py +++ b/release/scripts/startup/bl_ui/properties_data_light.py @@ -69,7 +69,13 @@ class DATA_PT_light(DataButtonsPanel, Panel): light = context.light - layout.row().prop(light, "type", expand=True) + # Compact layout for node editor. + if self.bl_space_type == 'PROPERTIES': + layout.row().prop(light, "type", expand=True) + layout.use_property_split = True + else: + layout.use_property_split = True + layout.row().prop(light, "type") class DATA_PT_EEVEE_light(DataButtonsPanel, Panel): @@ -80,9 +86,13 @@ class DATA_PT_EEVEE_light(DataButtonsPanel, Panel): layout = self.layout light = context.light - layout.row().prop(light, "type", expand=True) - - layout.use_property_split = True + # Compact layout for node editor. + if self.bl_space_type == 'PROPERTIES': + layout.row().prop(light, "type", expand=True) + layout.use_property_split = True + else: + layout.use_property_split = True + layout.row().prop(light, "type") col = layout.column() col.prop(light, "color") diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 6e21fba51f2..260e57c4b1c 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -206,11 +206,12 @@ class EEVEE_MATERIAL_PT_settings(MaterialButtonsPanel, Panel): bl_context = "material" COMPAT_ENGINES = {'BLENDER_EEVEE'} - @staticmethod - def draw_shared(self, mat): + def draw(self, context): layout = self.layout layout.use_property_split = True + mat = context.material + layout.prop(mat, "blend_method") if mat.blend_method != 'OPAQUE': @@ -228,9 +229,6 @@ class EEVEE_MATERIAL_PT_settings(MaterialButtonsPanel, Panel): layout.prop(mat, "use_sss_translucency") layout.prop(mat, "pass_index") - def draw(self, context): - self.draw_shared(self, context.material) - class MATERIAL_PT_viewport(MaterialButtonsPanel, Panel): bl_label = "Viewport Display" @@ -242,19 +240,17 @@ class MATERIAL_PT_viewport(MaterialButtonsPanel, Panel): mat = context.material return mat and not mat.grease_pencil - @staticmethod - def draw_shared(self, mat): + def draw(self, context): layout = self.layout layout.use_property_split = True + mat = context.material + col = layout.column() col.prop(mat, "diffuse_color", text="Color") col.prop(mat, "metallic") col.prop(mat, "roughness") - def draw(self, context): - self.draw_shared(self, context.material) - classes = ( MATERIAL_MT_context_menu, diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py index e6765d59723..31451d7eedf 100644 --- a/release/scripts/startup/bl_ui/space_node.py +++ b/release/scripts/startup/bl_ui/space_node.py @@ -30,6 +30,13 @@ from .properties_material import ( EEVEE_MATERIAL_PT_settings, MATERIAL_PT_viewport ) +from .properties_world import ( + WORLD_PT_viewport_display +) +from .properties_data_light import ( + DATA_PT_light, + DATA_PT_EEVEE_light, +) class NODE_HT_header(Header): @@ -569,49 +576,22 @@ 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) and - (snode.id.bl_rna.identifier == 'Material') - ) - - 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'} +def node_draw_tree_view(layout, context): + pass - @classmethod - def poll(cls, context): - snode = context.space_data - return ( - (snode.tree_type == 'ShaderNodeTree' and snode.id) and - (snode.id.bl_rna.identifier == "Material") - ) - def draw(self, context): - material = context.space_data.id - MATERIAL_PT_viewport.draw_shared(self, material) +# Adapt properties editor panel to display in node editor. We have to +# copy the class rather than inherit due to the way bpy registration works. +def node_panel(cls): + node_cls = type('NODE_' + cls.__name__, cls.__bases__, dict(cls.__dict__)) + node_cls.bl_space_type = 'NODE_EDITOR' + node_cls.bl_region_type = 'UI' + node_cls.bl_category = "Node" + if hasattr(node_cls, 'bl_parent_id'): + node_cls.bl_parent_id = 'NODE_' + node_cls.bl_parent_id -def node_draw_tree_view(layout, context): - pass + return node_cls classes = ( @@ -632,8 +612,11 @@ classes = ( NODE_UL_interface_sockets, NODE_PT_grease_pencil, NODE_PT_grease_pencil_tools, - EEVEE_NODE_PT_material_settings, - NODE_PT_material_viewport, + node_panel(EEVEE_MATERIAL_PT_settings), + node_panel(MATERIAL_PT_viewport), + node_panel(WORLD_PT_viewport_display), + node_panel(DATA_PT_light), + node_panel(DATA_PT_EEVEE_light), ) diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c index fc8d880080d..1271bf51c5f 100644 --- a/source/blender/editors/space_node/space_node.c +++ b/source/blender/editors/space_node/space_node.c @@ -793,7 +793,9 @@ static void node_region_listener( } } -const char *node_context_dir[] = {"selected_nodes", "active_node", NULL}; +const char *node_context_dir[] = { + "selected_nodes", "active_node", "light", "material", "world", NULL +}; static int node_context(const bContext *C, const char *member, bContextDataResult *result) { @@ -833,6 +835,24 @@ static int node_context(const bContext *C, const char *member, bContextDataResul CTX_data_type_set(result, CTX_DATA_TYPE_POINTER); return 1; } + else if (CTX_data_equals(member, "material")) { + if (snode->id && GS(snode->id->name) == ID_MA) { + CTX_data_id_pointer_set(result, snode->id); + } + return 1; + } + else if (CTX_data_equals(member, "light")) { + if (snode->id && GS(snode->id->name) == ID_LA) { + CTX_data_id_pointer_set(result, snode->id); + } + return 1; + } + else if (CTX_data_equals(member, "world")) { + if (snode->id && GS(snode->id->name) == ID_WO) { + CTX_data_id_pointer_set(result, snode->id); + } + return 1; + } return 0; } |