From 8f830f44e9a1f118ab60b4eab6e667e9164f8acd Mon Sep 17 00:00:00 2001 From: lijenstina <lijenstina@gmail.com> Date: Mon, 18 Sep 2017 21:08:56 +0200 Subject: [PATCH] Fix T52714: Dynamic Sky not working with localization enabled Bumped version to 1.0.6 Adress the issue of accessing nodes with string keys Since they are translated in other UI languages could cause material generation to fail Add a poll to the operator as it only works if Cycles is enabled in add-ons Improve the tooltip If possible, to be included in the 2.79a version --- lighting_dynamic_sky.py | 175 +++++++++++++++++++++++----------------- 1 file changed, 102 insertions(+), 73 deletions(-) diff --git a/lighting_dynamic_sky.py b/lighting_dynamic_sky.py index f5358a45c..98d61fd6f 100644 --- a/lighting_dynamic_sky.py +++ b/lighting_dynamic_sky.py @@ -22,7 +22,7 @@ bl_info = { "name": "Dynamic Sky", "author": "Pratik Solanki", - "version": (1, 0, 4), + "version": (1, 0, 6), "blender": (2, 78, 0), "location": "View3D > Tools", "description": "Creates Dynamic Sky for Cycles", @@ -71,10 +71,26 @@ def check_world_name(name_id="Dynamic"): return name_id +def check_cycles(): + return ('cycles' in bpy.context.user_preferences.addons.keys()) + + class dsky(Operator): bl_idname = "sky.dyn" bl_label = "Make a Procedural sky" - bl_description = "Make a Procedural Sky" + bl_description = ("Make a Procedural Sky with parameters in the 3D View\n" + "Note: Available just for Cycles renderer\n" + "Only the last created Dynamic World can be accessed from this panel") + + @classmethod + def poll(cls, context): + return check_cycles() + + def get_node_types(self, node_tree, node_type): + for node in node_tree.nodes: + if node.type == node_type: + return node + return None def execute(self, context): try: @@ -88,48 +104,67 @@ class dsky(Operator): world.use_nodes = True nt = world.node_tree - bg = world.node_tree.nodes['Background'] - + # Note: (see T52714) to avoid string localization problems, assign the name for + # nodes that will be exposed in the 3D view (pattern UI name with underscore) + bg = self.get_node_types(nt, "BACKGROUND") + bg.name = "Scene_Brightness" bg.inputs[0].default_value[:3] = (0.5, .1, 0.6) bg.inputs[1].default_value = 1 + bg.location = (6708.3, 360) + ntl = nt.links.new tcor = nt.nodes.new(type="ShaderNodeTexCoord") - map = nt.nodes.new(type="ShaderNodeMapping") - map.vector_type = 'NORMAL' + tcor.location = (243.729, 1005) + + map1 = nt.nodes.new(type="ShaderNodeMapping") + map1.vector_type = 'NORMAL' + map1.location = (786.54, 730) nor = nt.nodes.new(type="ShaderNodeNormal") + nor.name = "Sky_normal" + nor.location = (1220.16, 685) cr1 = nt.nodes.new(type="ShaderNodeValToRGB") cr1.color_ramp.elements[0].position = 0.969 cr1.color_ramp.interpolation = 'EASE' + cr1.location = (1671.33, 415) cr2 = nt.nodes.new(type="ShaderNodeValToRGB") cr2.color_ramp.elements[0].position = 0.991 cr2.color_ramp.elements[1].position = 1 cr2.color_ramp.interpolation = 'EASE' + cr2.location = (2196.6, 415) cr3 = nt.nodes.new(type="ShaderNodeValToRGB") cr3.color_ramp.elements[0].position = 0.779 cr3.color_ramp.elements[1].position = 1 cr3.color_ramp.interpolation = 'EASE' + cr3.location = (2196.6, 415) mat1 = nt.nodes.new(type="ShaderNodeMath") mat1.operation = 'MULTIPLY' mat1.inputs[1].default_value = 0.2 + mat1.location = (2196.6, 685) mat2 = nt.nodes.new(type="ShaderNodeMath") mat2.operation = 'MULTIPLY' mat2.inputs[1].default_value = 2 + mat2.location = (3294, 685) mat3 = nt.nodes.new(type="ShaderNodeMath") mat3.operation = 'MULTIPLY' mat3.inputs[1].default_value = 40.9 + mat3.location = (2745.24, 415) mat4 = nt.nodes.new(type="ShaderNodeMath") mat4.operation = 'SUBTRACT' mat4.inputs[1].default_value = 1 + mat4.location = (3294, 415) ntl(mat2.inputs[0], mat1.outputs[0]) ntl(mat4.inputs[0], mat3.outputs[0]) ntl(mat1.inputs[0], cr3.outputs[0]) ntl(mat3.inputs[0], cr2.outputs[0]) soft = nt.nodes.new(type="ShaderNodeMixRGB") + soft.name = "Soft_hard" + soft.location = (3819.3, 550) soft_1 = nt.nodes.new(type="ShaderNodeMixRGB") + soft_1.location = (3819.3, 185) soft.inputs[0].default_value = 1 soft_1.inputs[0].default_value = 0.466 ntl(soft.inputs[1], mat2.outputs[0]) @@ -140,12 +175,16 @@ class dsky(Operator): mix1 = nt.nodes.new(type="ShaderNodeMixRGB") mix1.blend_type = 'MULTIPLY' mix1.inputs[0].default_value = 1 + mix1.location = (4344.3, 630) mix1_1 = nt.nodes.new(type="ShaderNodeMixRGB") mix1_1.blend_type = 'MULTIPLY' mix1_1.inputs[0].default_value = 1 + mix1_1.location = (4344.3, 90) mix2 = nt.nodes.new(type="ShaderNodeMixRGB") + mix2.location = (4782, 610) mix2_1 = nt.nodes.new(type="ShaderNodeMixRGB") + mix2_1.location = (5131.8, 270) mix2.inputs[1].default_value = (0, 0, 0, 1) mix2.inputs[2].default_value = (32, 22, 14, 200) mix2_1.inputs[1].default_value = (0, 0, 0, 1) @@ -158,22 +197,33 @@ class dsky(Operator): gam = nt.nodes.new(type="ShaderNodeGamma") gam.inputs[1].default_value = 2.3 + gam.location = (5131.8, 610) + gam2 = nt.nodes.new(type="ShaderNodeGamma") + gam2.name = "Sun_value" gam2.inputs[1].default_value = 1 + gam2.location = (5524.5, 610) + gam3 = nt.nodes.new(type="ShaderNodeGamma") + gam3.name = "Shadow_color_saturation" gam3.inputs[1].default_value = 1 + gam3.location = (5524.5, 880) sunopa = nt.nodes.new(type="ShaderNodeMixRGB") sunopa.blend_type = 'ADD' sunopa.inputs[0].default_value = 1 + sunopa.location = (5940.6, 610) sunopa_1 = nt.nodes.new(type="ShaderNodeMixRGB") sunopa_1.blend_type = 'ADD' sunopa_1.inputs[0].default_value = 1 + sunopa_1.location = (5524.5, 340) combine = nt.nodes.new(type="ShaderNodeMixRGB") + combine.location = (6313.8, 360) ntl(combine.inputs[1], sunopa.outputs[0]) ntl(combine.inputs[2], sunopa_1.outputs[0]) lp = nt.nodes.new(type="ShaderNodeLightPath") + lp.location = (5940.6, 130) ntl(combine.inputs[0], lp.outputs[0]) ntl(gam2.inputs[0], gam.outputs[0]) @@ -184,25 +234,33 @@ class dsky(Operator): map2.scale[2] = 6.00 map2.scale[0] = 1.5 map2.scale[1] = 1.5 + map2.location = (2196.6, 1510) n1 = nt.nodes.new(type="ShaderNodeTexNoise") n1.inputs[1].default_value = 3.8 n1.inputs[2].default_value = 2.4 n1.inputs[3].default_value = 0.5 + n1.location = (2745.24, 1780) n2 = nt.nodes.new(type="ShaderNodeTexNoise") n2.inputs[1].default_value = 2.0 n2.inputs[2].default_value = 10 n2.inputs[3].default_value = 0.2 + n2.location = (2745.24, 1510) ntl(n2.inputs[0], map2.outputs[0]) ntl(n1.inputs[0], map2.outputs[0]) sc1 = nt.nodes.new(type="ShaderNodeValToRGB") + sc1.location = (3294, 1780) sc2 = nt.nodes.new(type="ShaderNodeValToRGB") + sc2.location = (3294, 1510) sc3 = nt.nodes.new(type="ShaderNodeValToRGB") + sc3.location = (3819.3, 820) sc3_1 = nt.nodes.new(type="ShaderNodeValToRGB") + sc3_1.location = (4344.3, 1360) sc4 = nt.nodes.new(type="ShaderNodeValToRGB") + sc4.location = (3819.3, 1090) sc1.color_ramp.elements[1].position = 0.649 sc1.color_ramp.elements[0].position = 0.408 @@ -234,11 +292,24 @@ class dsky(Operator): sc3_1.color_ramp.elements[0].position = 0.0 smix1 = nt.nodes.new(type="ShaderNodeMixRGB") + smix1.location = (3819.3, 1550) + smix1.name = "Cloud_color" smix2 = nt.nodes.new(type="ShaderNodeMixRGB") + smix2.location = (4344.3, 1630) + smix2.name = "Cloud_density" smix2_1 = nt.nodes.new(type="ShaderNodeMixRGB") + smix2_1.location = (4782, 1360) + smix3 = nt.nodes.new(type="ShaderNodeMixRGB") + smix3.location = (4344.3, 1090) + smix3.name = "Sky_and_Horizon_colors" + smix4 = nt.nodes.new(type="ShaderNodeMixRGB") + smix4.location = (4782, 880) + smix5 = nt.nodes.new(type="ShaderNodeMixRGB") + smix5.name = "Cloud_opacity" + smix5.location = (5131.8, 880) smix1.inputs[1].default_value = (1, 1, 1, 1) smix1.inputs[2].default_value = (0, 0, 0, 1) @@ -255,12 +326,18 @@ class dsky(Operator): smix5.inputs[0].default_value = 1 srgb = nt.nodes.new(type="ShaderNodeSeparateRGB") + srgb.location = (786.54, 1370) aniadd = nt.nodes.new(type="ShaderNodeMath") + aniadd.location = (1220.16, 1235) crgb = nt.nodes.new(type="ShaderNodeCombineRGB") + crgb.location = (1671.33, 1510) sunrgb = nt.nodes.new(type="ShaderNodeMixRGB") + sunrgb.name = "Sun_color" + sunrgb.blend_type = 'MULTIPLY' sunrgb.inputs[2].default_value = (32, 30, 30, 200) sunrgb.inputs[0].default_value = 1 + sunrgb.location = (4344.3, 360) ntl(mix2.inputs[2], sunrgb.outputs[0]) @@ -283,6 +360,7 @@ class dsky(Operator): ntl(sc2.inputs[0], n2.outputs[0]) skynor = nt.nodes.new(type="ShaderNodeNormal") + skynor.location = (3294, 1070) ntl(sc3.inputs[0], skynor.outputs[1]) ntl(sc4.inputs[0], skynor.outputs[1]) @@ -299,69 +377,19 @@ class dsky(Operator): ntl(cr1.inputs[0], nor.outputs[1]) ntl(cr2.inputs[0], cr1.outputs[0]) ntl(cr3.inputs[0], nor.outputs[1]) - ntl(nor.inputs[0], map.outputs[0]) - ntl(map.inputs[0], tcor.outputs[0]) + ntl(nor.inputs[0], map1.outputs[0]) + ntl(map1.inputs[0], tcor.outputs[0]) ntl(sunopa_1.inputs[1], smix5.outputs[0]) ntl(sunopa_1.inputs[2], mix2_1.outputs[0]) - nt.nodes['Background'].location = (6708.3, 360) - - nt.nodes['ColorRamp'].location = (1671.33, 415) - nt.nodes['ColorRamp.001'].location = (2196.6, 415) - nt.nodes['ColorRamp.002'].location = (1671.33, 685) - nt.nodes['ColorRamp.003'].location = (3294, 1780) - nt.nodes['ColorRamp.004'].location = (3294, 1510) - nt.nodes['ColorRamp.005'].location = (3819.3, 820) - nt.nodes['ColorRamp.006'].location = (4344.3, 1360) - nt.nodes['ColorRamp.007'].location = (3819.3, 1090) - - nt.nodes['Combine RGB'].location = (1671.33, 1510) - - nt.nodes['Gamma'].location = (5131.8, 610) - nt.nodes['Gamma.001'].location = (5524.5, 610) - nt.nodes['Gamma.002'].location = (5524.5, 880) - nt.nodes['Light Path'].location = (5940.6, 130) - - nt.nodes['Mapping'].location = (786.54, 730) - nt.nodes['Mapping.001'].location = (2196.6, 1510) - - nt.nodes['Math'].location = (2196.6, 685) - nt.nodes['Math.001'].location = (3294, 685) - nt.nodes['Math.002'].location = (2745.24, 415) - nt.nodes['Math.003'].location = (3294, 415) - nt.nodes['Math.004'].location = (1220.16, 1235) - - nt.nodes['Mix'].location = (3819.3, 550) - nt.nodes['Mix.001'].location = (3819.3, 185) - nt.nodes['Mix.002'].location = (4344.3, 630) - nt.nodes['Mix.003'].location = (4344.3, 90) - nt.nodes['Mix.004'].location = (4782, 610) - nt.nodes['Mix.005'].location = (5131.8, 270) - nt.nodes['Mix.006'].location = (5940.6, 610) - nt.nodes['Mix.007'].location = (5524.5, 340) - nt.nodes['Mix.008'].location = (6313.8, 360) - nt.nodes['Mix.009'].location = (3819.3, 1550) - nt.nodes['Mix.010'].location = (4344.3, 1630) - nt.nodes['Mix.011'].location = (4782, 1360) - nt.nodes['Mix.012'].location = (4344.3, 1090) - nt.nodes['Mix.013'].location = (4782, 880) - nt.nodes['Mix.014'].location = (5131.8, 880) - nt.nodes['Mix.015'].location = (4344.3, 360) - - nt.nodes['Noise Texture'].location = (2745.24, 1780) - nt.nodes['Noise Texture.001'].location = (2745.24, 1510) - - nt.nodes['Normal'].location = (1220.16, 685) - nt.nodes['Normal.001'].location = (3294, 1070) - - nt.nodes['Separate RGB'].location = (786.54, 1370) - nt.nodes['Texture Coordinate'].location = (243.729, 1005) - nt.nodes['World Output'].location = (7167.3, 360) + world_out = self.get_node_types(nt, "OUTPUT_WORLD") + world_out.location = (7167.3, 360) except Exception as e: error_handlers(self, e, "Make a Procedural sky has failed") return {"CANCELLED"} + return {'FINISHED'} @@ -385,18 +413,19 @@ def draw_world_settings(col, context): pick_world = bpy.data.worlds[stored_name] try: m = pick_world.node_tree.nodes[28] - m = pick_world.node_tree.nodes['Mix.012'].inputs[1] - n = pick_world.node_tree.nodes['Mix.012'].inputs[2] - c = pick_world.node_tree.nodes['Mix.009'].inputs[1] - o = pick_world.node_tree.nodes['Mix.014'].inputs[0] - d = pick_world.node_tree.nodes['Mix.010'].inputs[0] - so = pick_world.node_tree.nodes['Gamma.001'].inputs[1] - so2 = pick_world.node_tree.nodes['Gamma.002'].inputs[1] - no = pick_world.node_tree.nodes['Normal'].outputs[0] - sof = pick_world.node_tree.nodes['Mix'].inputs[0] - bgp = pick_world.node_tree.nodes['Background'].inputs[1] - - suc = pick_world.node_tree.nodes['Mix.015'].inputs[1] + + m = pick_world.node_tree.nodes['Sky_and_Horizon_colors'].inputs[1] + n = pick_world.node_tree.nodes['Sky_and_Horizon_colors'].inputs[2] + c = pick_world.node_tree.nodes['Cloud_color'].inputs[1] + o = pick_world.node_tree.nodes['Cloud_opacity'].inputs[0] + d = pick_world.node_tree.nodes['Cloud_density'].inputs[0] + so = pick_world.node_tree.nodes['Sun_value'].inputs[1] + so2 = pick_world.node_tree.nodes['Shadow_color_saturation'].inputs[1] + no = pick_world.node_tree.nodes['Sky_normal'].outputs[0] + sof = pick_world.node_tree.nodes['Soft_hard'].inputs[0] + bgp = pick_world.node_tree.nodes['Scene_Brightness'].inputs[1] + + suc = pick_world.node_tree.nodes['Sun_color'].inputs[1] except: col.label(text="Please Create a new World", icon="INFO") col.label(text="seems that there was already", icon="BLANK1") -- GitLab