diff --git a/lighting_dynamic_sky.py b/lighting_dynamic_sky.py index f5358a45cdd5b9a666426d300f619a3cb5d77949..98d61fd6f1f4209b17d48cf5e3035e4d797fc2e7 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")