def init(node_tree): """Initialize node tree with links for this shader. NOTE: this shader can not be fully implemented, because in game this shader works with frame buffer which already has color of underlying pixel. :param node_tree: node tree on which this shader should be created :type node_tree: bpy.types.NodeTree """ start_pos_x = 0 start_pos_y = 0 pos_x_shift = 185 # node creation # geometry vcol_group_n = node_tree.nodes.new("ShaderNodeGroup") vcol_group_n.name = Glass.VCOL_GROUP_NODE vcol_group_n.label = Glass.VCOL_GROUP_NODE vcol_group_n.location = (start_pos_x - pos_x_shift, start_pos_y + 1650) vcol_group_n.node_tree = vcolor_input.get_node_group() geometry_n = node_tree.nodes.new("ShaderNodeGeometry") geometry_n.name = Glass.GEOM_NODE geometry_n.label = Glass.GEOM_NODE geometry_n.location = (start_pos_x - pos_x_shift, start_pos_y + 1500) geometry_n.uv_layer = _MESH_consts.none_uv # inputs refl_tex_n = node_tree.nodes.new("ShaderNodeTexture") refl_tex_n.name = Glass.REFL_TEX_NODE refl_tex_n.label = Glass.REFL_TEX_NODE refl_tex_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2700) env_col_n = node_tree.nodes.new("ShaderNodeRGB") env_col_n.name = Glass.ENV_COLOR_NODE env_col_n.label = Glass.ENV_COLOR_NODE env_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2400) tint_col_n = node_tree.nodes.new("ShaderNodeRGB") tint_col_n.name = Glass.TINT_COL_NODE tint_col_n.label = Glass.TINT_COL_NODE tint_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2200) tint_opacity_n = node_tree.nodes.new("ShaderNodeValue") tint_opacity_n.name = Glass.TINT_OPACITY_NODE tint_opacity_n.label = Glass.TINT_OPACITY_NODE tint_opacity_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2000) spec_col_n = node_tree.nodes.new("ShaderNodeRGB") spec_col_n.name = Glass.SPEC_COL_NODE spec_col_n.label = Glass.SPEC_COL_NODE spec_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 1900) diff_col_n = node_tree.nodes.new("ShaderNodeRGB") diff_col_n.name = Glass.DIFF_COL_NODE diff_col_n.label = Glass.DIFF_COL_NODE diff_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 1700) base_tex_n = node_tree.nodes.new("ShaderNodeTexture") base_tex_n.name = Glass.BASE_TEX_NODE base_tex_n.label = Glass.BASE_TEX_NODE base_tex_n.location = (start_pos_x + pos_x_shift, start_pos_y + 1500) # pass 1 add_env_gn = node_tree.nodes.new("ShaderNodeGroup") add_env_gn.name = Glass.ADD_ENV_GROUP_NODE add_env_gn.label = Glass.ADD_ENV_GROUP_NODE add_env_gn.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 2500) add_env_gn.node_tree = add_env.get_node_group() add_env_gn.inputs["Apply Fresnel"].default_value = 1.0 add_env_gn.inputs["Base Texture Alpha"].default_value = 1.0 add_env_gn.inputs["Fresnel Scale"].default_value = 2.0 add_env_gn.inputs["Fresnel Bias"].default_value = 1.0 tint_col_hsv_n = node_tree.nodes.new("ShaderNodeSeparateHSV") tint_col_hsv_n.name = Glass.TINT_HSV_NODE tint_col_hsv_n.label = Glass.TINT_HSV_NODE tint_col_hsv_n.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 2100) tint_opacity_combine_n = node_tree.nodes.new("ShaderNodeCombineRGB") tint_opacity_combine_n.name = Glass.TINT_OPACITY_COMBINE_NODE tint_opacity_combine_n.label = Glass.TINT_OPACITY_COMBINE_NODE tint_opacity_combine_n.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 1800) diff_vcol_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") diff_vcol_mult_n.name = Glass.DIFF_VCOL_MULT_NODE diff_vcol_mult_n.label = Glass.DIFF_VCOL_MULT_NODE diff_vcol_mult_n.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 1650) diff_vcol_mult_n.blend_type = "MULTIPLY" diff_vcol_mult_n.inputs["Fac"].default_value = 1 spec_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") spec_mult_n.name = Glass.SPEC_MULT_NODE spec_mult_n.label = Glass.SPEC_MULT_NODE spec_mult_n.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 1450) spec_mult_n.blend_type = "MULTIPLY" spec_mult_n.inputs["Fac"].default_value = 1 # pass 2 tint_sat_subtract_n = node_tree.nodes.new("ShaderNodeMath") tint_sat_subtract_n.name = Glass.TINT_SAT_SUBTRACT_NODE tint_sat_subtract_n.label = Glass.TINT_SAT_SUBTRACT_NODE tint_sat_subtract_n.location = (start_pos_x + pos_x_shift * 4, start_pos_y + 2200) tint_sat_subtract_n.operation = "SUBTRACT" tint_sat_subtract_n.inputs[0].default_value = 1.0 tint_vcol_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") tint_vcol_mult_n.name = Glass.TINT_VCOL_MULT_NODE tint_vcol_mult_n.label = Glass.TINT_VCOL_MULT_NODE tint_vcol_mult_n.location = (start_pos_x + pos_x_shift * 4, start_pos_y + 1950) tint_vcol_mult_n.blend_type = "MULTIPLY" tint_vcol_mult_n.inputs["Fac"].default_value = 1 diff_opacity_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") diff_opacity_mult_n.name = Glass.DIFF_OPACITY_MULT_NODE diff_opacity_mult_n.label = Glass.DIFF_OPACITY_MULT_NODE diff_opacity_mult_n.location = (start_pos_x + pos_x_shift * 4, start_pos_y + 1750) diff_opacity_mult_n.blend_type = "MULTIPLY" diff_opacity_mult_n.inputs["Fac"].default_value = 1 # pass 3 tint_val_sat_mult_n = node_tree.nodes.new("ShaderNodeMath") tint_val_sat_mult_n.name = Glass.TINT_VAL_SAT_MULT_NODE tint_val_sat_mult_n.label = Glass.TINT_VAL_SAT_MULT_NODE tint_val_sat_mult_n.location = (start_pos_x + pos_x_shift * 5, start_pos_y + 2150) tint_val_sat_mult_n.operation = "MULTIPLY" # pass 4 tint_diff_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") tint_diff_mult_n.name = Glass.TINT_DIFF_MULT_NODE tint_diff_mult_n.label = Glass.TINT_DIFF_MULT_NODE tint_diff_mult_n.location = (start_pos_x + pos_x_shift * 6, start_pos_y + 1900) tint_diff_mult_n.blend_type = "MULTIPLY" tint_diff_mult_n.inputs["Fac"].default_value = 1 # pass 5 out_mat_n = node_tree.nodes.new("ShaderNodeExtendedMaterial") out_mat_n.name = Glass.OUT_MAT_NODE out_mat_n.label = Glass.OUT_MAT_NODE if "Refl" in out_mat_n: out_mat_n.inputs["Refl"].default_value = 1.0 elif "Reflectivity" in out_mat_n: out_mat_n.inputs["Reflectivity"].default_value = 1.0 out_mat_n.location = (start_pos_x + pos_x_shift * 7, start_pos_y + 2100) tint_val_subtract_n = node_tree.nodes.new("ShaderNodeMath") tint_val_subtract_n.name = Glass.TINT_VAL_SUBTRACT_NODE tint_val_subtract_n.label = Glass.TINT_VAL_SUBTRACT_NODE tint_val_subtract_n.location = (start_pos_x + pos_x_shift * 7, start_pos_y + 1400) tint_val_subtract_n.operation = "SUBTRACT" tint_val_subtract_n.inputs[0].default_value = 1.0 # pass 6 out_add_spec_n = node_tree.nodes.new("ShaderNodeMixRGB") out_add_spec_n.name = Glass.OUT_ADD_SPEC_NODE out_add_spec_n.label = Glass.OUT_ADD_SPEC_NODE out_add_spec_n.location = (start_pos_x + pos_x_shift * 8, start_pos_y + 2050) out_add_spec_n.blend_type = "ADD" out_add_spec_n.inputs["Fac"].default_value = 1 out_add_spec_a_n = node_tree.nodes.new("ShaderNodeMath") out_add_spec_a_n.name = Glass.OUT_ADD_SPEC_A_NODE out_add_spec_a_n.label = Glass.OUT_ADD_SPEC_A_NODE out_add_spec_a_n.location = (start_pos_x + pos_x_shift * 8, start_pos_y + 1550) out_add_spec_a_n.operation = "ADD" max_tint_n = node_tree.nodes.new("ShaderNodeMath") max_tint_n.name = Glass.MAX_TINT_VAL_OR_OPACITY_NODE max_tint_n.label = Glass.MAX_TINT_VAL_OR_OPACITY_NODE max_tint_n.location = (start_pos_x + pos_x_shift * 8, start_pos_y + 1350) max_tint_n.operation = "MAXIMUM" # pass 7 out_add_refl_n = node_tree.nodes.new("ShaderNodeMixRGB") out_add_refl_n.name = Glass.OUT_ADD_REFL_NODE out_add_refl_n.label = Glass.OUT_ADD_REFL_NODE out_add_refl_n.location = (start_pos_x + pos_x_shift * 9, start_pos_y + 2200) out_add_refl_n.blend_type = "ADD" out_add_refl_n.inputs["Fac"].default_value = 1 out_add_tint_max_a_n = node_tree.nodes.new("ShaderNodeMath") out_add_tint_max_a_n.name = Glass.OUT_ADD_TINT_MAX_A_NODE out_add_tint_max_a_n.label = Glass.OUT_ADD_TINT_MAX_A_NODE out_add_tint_max_a_n.location = (start_pos_x + pos_x_shift * 9, start_pos_y + 1500) # output output_n = node_tree.nodes.new("ShaderNodeOutput") output_n.name = Glass.OUTPUT_NODE output_n.label = Glass.OUTPUT_NODE output_n.location = (start_pos_x + +pos_x_shift * 11, start_pos_y + 1900) # links creation # input node_tree.links.new(base_tex_n.inputs["Vector"], geometry_n.outputs["UV"]) node_tree.links.new(refl_tex_n.inputs["Vector"], geometry_n.outputs["Normal"]) # pass 1 node_tree.links.new(add_env_gn.inputs["Normal Vector"], geometry_n.outputs["Normal"]) node_tree.links.new(add_env_gn.inputs["View Vector"], geometry_n.outputs["View"]) node_tree.links.new(add_env_gn.inputs["Reflection Texture Color"], refl_tex_n.outputs["Color"]) node_tree.links.new(add_env_gn.inputs["Env Factor Color"], env_col_n.outputs["Color"]) node_tree.links.new(add_env_gn.inputs["Specular Color"], spec_col_n.outputs["Color"]) node_tree.links.new(tint_col_hsv_n.inputs["Color"], tint_col_n.outputs["Color"]) node_tree.links.new(tint_opacity_combine_n.inputs["R"], tint_opacity_n.outputs["Value"]) node_tree.links.new(tint_opacity_combine_n.inputs["G"], tint_opacity_n.outputs["Value"]) node_tree.links.new(tint_opacity_combine_n.inputs["B"], tint_opacity_n.outputs["Value"]) node_tree.links.new(diff_vcol_mult_n.inputs["Color1"], diff_col_n.outputs["Color"]) node_tree.links.new(diff_vcol_mult_n.inputs["Color2"], vcol_group_n.outputs["Vertex Color"]) node_tree.links.new(spec_mult_n.inputs["Color1"], spec_col_n.outputs["Color"]) node_tree.links.new(spec_mult_n.inputs["Color2"], base_tex_n.outputs["Value"]) # pass 2 node_tree.links.new(tint_sat_subtract_n.inputs[1], tint_col_hsv_n.outputs["S"]) node_tree.links.new(tint_vcol_mult_n.inputs["Color1"], tint_col_n.outputs["Color"]) node_tree.links.new(tint_vcol_mult_n.inputs["Color2"], vcol_group_n.outputs["Vertex Color"]) node_tree.links.new(diff_opacity_mult_n.inputs["Color1"], tint_opacity_combine_n.outputs["Image"]) node_tree.links.new(diff_opacity_mult_n.inputs["Color2"], diff_vcol_mult_n.outputs["Color"]) # pass 3 node_tree.links.new(tint_val_sat_mult_n.inputs[0], tint_sat_subtract_n.outputs[0]) node_tree.links.new(tint_val_sat_mult_n.inputs[1], tint_col_hsv_n.outputs["V"]) # pass 4 node_tree.links.new(tint_diff_mult_n.inputs["Fac"], tint_val_sat_mult_n.outputs["Value"]) node_tree.links.new(tint_diff_mult_n.inputs["Color1"], tint_vcol_mult_n.outputs["Color"]) node_tree.links.new(tint_diff_mult_n.inputs["Color2"], diff_opacity_mult_n.outputs["Color"]) # pass 5 node_tree.links.new(out_mat_n.inputs["Spec"], spec_mult_n.outputs["Color"]) node_tree.links.new(tint_val_subtract_n.inputs[1], vcol_group_n.outputs["Vertex Color Alpha"]) # pass 6 node_tree.links.new(out_add_spec_n.inputs["Color1"], out_mat_n.outputs["Spec"]) node_tree.links.new(out_add_spec_n.inputs["Color2"], tint_diff_mult_n.outputs["Color"]) node_tree.links.new(out_add_spec_a_n.inputs[0], out_mat_n.outputs["Spec"]) node_tree.links.new(out_add_spec_a_n.inputs[1], add_env_gn.outputs["Environment Addition Color"]) node_tree.links.new(max_tint_n.inputs[0], tint_val_subtract_n.outputs[0]) node_tree.links.new(max_tint_n.inputs[1], tint_opacity_n.outputs[0]) # pass 7 node_tree.links.new(out_add_refl_n.inputs["Color1"], add_env_gn.outputs["Environment Addition Color"]) node_tree.links.new(out_add_refl_n.inputs["Color2"], out_add_spec_n.outputs["Color"]) node_tree.links.new(out_add_tint_max_a_n.inputs[0], out_add_spec_a_n.outputs[0]) node_tree.links.new(out_add_tint_max_a_n.inputs[1], max_tint_n.outputs[0]) # output node_tree.links.new(output_n.inputs["Color"], out_add_refl_n.outputs["Color"]) node_tree.links.new(output_n.inputs["Alpha"], out_add_tint_max_a_n.outputs[0])
def init(node_tree): """Initialize node tree with links for this shader. :param node_tree: node tree on which this shader should be created :type node_tree: bpy.types.NodeTree """ start_pos_x = 0 start_pos_y = 0 pos_x_shift = 185 # init parent DifSpec.init(node_tree) geometry_n = node_tree.nodes[DifSpec.GEOM_NODE] spec_col_n = node_tree.nodes[DifSpec.SPEC_COL_NODE] base_tex_n = node_tree.nodes[DifSpec.BASE_TEX_NODE] out_mat_n = node_tree.nodes[DifSpec.OUT_MAT_NODE] output_n = node_tree.nodes[DifSpec.OUTPUT_NODE] # move existing output_n.location.x += pos_x_shift # node creation refl_tex_n = node_tree.nodes.new("ShaderNodeTexture") refl_tex_n.name = DifSpecAddEnv.REFL_TEX_NODE refl_tex_n.label = DifSpecAddEnv.REFL_TEX_NODE refl_tex_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2500) env_col_n = node_tree.nodes.new("ShaderNodeRGB") env_col_n.name = DifSpecAddEnv.ENV_COLOR_NODE env_col_n.label = DifSpecAddEnv.ENV_COLOR_NODE env_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2200) add_env_gn = node_tree.nodes.new("ShaderNodeGroup") add_env_gn.name = DifSpecAddEnv.ADD_ENV_GROUP_NODE add_env_gn.label = DifSpecAddEnv.ADD_ENV_GROUP_NODE add_env_gn.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 2300) add_env_gn.node_tree = add_env.get_node_group() add_env_gn.inputs['Apply Fresnel'].default_value = 1.0 add_env_gn.inputs['Fresnel Scale'].default_value = 0.9 add_env_gn.inputs['Fresnel Bias'].default_value = 0.2 out_add_refl_n = node_tree.nodes.new("ShaderNodeMixRGB") out_add_refl_n.name = DifSpecAddEnv.OUT_ADD_REFL_NODE out_add_refl_n.label = DifSpecAddEnv.OUT_ADD_REFL_NODE out_add_refl_n.location = (output_n.location.x - pos_x_shift, start_pos_y + 1950) out_add_refl_n.blend_type = "ADD" out_add_refl_n.inputs['Fac'].default_value = 1 # geometry links node_tree.links.new(add_env_gn.inputs['Normal Vector'], geometry_n.outputs['Normal']) node_tree.links.new(add_env_gn.inputs['View Vector'], geometry_n.outputs['View']) node_tree.links.new(refl_tex_n.inputs['Vector'], geometry_n.outputs['Normal']) node_tree.links.new(add_env_gn.inputs['Env Factor Color'], env_col_n.outputs['Color']) node_tree.links.new(add_env_gn.inputs['Reflection Texture Color'], refl_tex_n.outputs['Color']) node_tree.links.new(add_env_gn.inputs['Specular Color'], spec_col_n.outputs['Color']) node_tree.links.new(add_env_gn.inputs['Base Texture Alpha'], base_tex_n.outputs['Value']) # output pass node_tree.links.new(out_add_refl_n.inputs['Color1'], add_env_gn.outputs['Environment Addition Color']) node_tree.links.new(out_add_refl_n.inputs['Color2'], out_mat_n.outputs['Color']) node_tree.links.new(output_n.inputs['Color'], out_add_refl_n.outputs['Color'])
def add(node_tree, geom_n_name, spec_col_n_name, base_tex_n_name, out_mat_n_name, output_n_name): """Add add env pass to node tree with links. :param node_tree: node tree on which this shader should be created :type node_tree: bpy.types.NodeTree :param geom_n_name: name of geometry node from which normal will be taken :type geom_n_name: str :param spec_col_n_name: name of specular color node from which specular color will be taken :type spec_col_n_name: str :param base_tex_n_name: name of base texture node from which alpha will be taken (if empty string it won't be used) :type base_tex_n_name: str :param out_mat_n_name: name of output material node from which output color will be taken :type out_mat_n_name: str :param output_n_name: name of output node with color input node to which result will be given :type output_n_name: str """ start_pos_x = 0 start_pos_y = 0 pos_x_shift = 185 geometry_n = node_tree.nodes[geom_n_name] spec_col_n = node_tree.nodes[spec_col_n_name] base_tex_n = node_tree.nodes[base_tex_n_name] if base_tex_n_name in node_tree.nodes else None out_mat_n = node_tree.nodes[out_mat_n_name] output_n = node_tree.nodes[output_n_name] # move existing output_n.location.x += pos_x_shift # node creation refl_tex_n = node_tree.nodes.new("ShaderNodeTexture") refl_tex_n.name = refl_tex_n.label = StdAddEnv.REFL_TEX_NODE refl_tex_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2500) env_col_n = node_tree.nodes.new("ShaderNodeRGB") env_col_n.name = env_col_n.label = StdAddEnv.ENV_COLOR_NODE env_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2200) add_env_gn = node_tree.nodes.new("ShaderNodeGroup") add_env_gn.name = add_env_gn.label = StdAddEnv.ADD_ENV_GROUP_NODE add_env_gn.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 2300) add_env_gn.node_tree = add_env.get_node_group() add_env_gn.inputs['Apply Fresnel'].default_value = 1.0 add_env_gn.inputs['Fresnel Scale'].default_value = 0.9 add_env_gn.inputs['Fresnel Bias'].default_value = 0.2 add_env_gn.inputs['Base Texture Alpha'].default_value = 0.5 out_add_refl_n = node_tree.nodes.new("ShaderNodeMixRGB") out_add_refl_n.name = out_add_refl_n.label = StdAddEnv.OUT_ADD_REFL_NODE out_add_refl_n.location = (output_n.location.x - pos_x_shift, start_pos_y + 1950) out_add_refl_n.blend_type = "ADD" out_add_refl_n.inputs['Fac'].default_value = 1 # geometry links node_tree.links.new(add_env_gn.inputs['Normal Vector'], geometry_n.outputs['Normal']) node_tree.links.new(add_env_gn.inputs['View Vector'], geometry_n.outputs['View']) node_tree.links.new(refl_tex_n.inputs['Vector'], geometry_n.outputs['Normal']) # if out material node is really material node and has normal output, # use it as this normal might include normal maps if "Normal" in out_mat_n.outputs: node_tree.links.new(refl_tex_n.inputs['Vector'], out_mat_n.outputs['Normal']) node_tree.links.new(add_env_gn.inputs['Env Factor Color'], env_col_n.outputs['Color']) node_tree.links.new(add_env_gn.inputs['Reflection Texture Color'], refl_tex_n.outputs['Color']) node_tree.links.new(add_env_gn.inputs['Specular Color'], spec_col_n.outputs['Color']) if add_env_gn and base_tex_n: node_tree.links.new(add_env_gn.inputs['Base Texture Alpha'], base_tex_n.outputs['Value']) # output pass node_tree.links.new(out_add_refl_n.inputs['Color1'], add_env_gn.outputs['Environment Addition Color']) node_tree.links.new(out_add_refl_n.inputs['Color2'], out_mat_n.outputs['Color']) # try to find first color in output node if "Color" in output_n.inputs: node_tree.links.new(output_n.inputs['Color'], out_add_refl_n.outputs['Color']) elif "Color1" in output_n.inputs: node_tree.links.new(output_n.inputs['Color1'], out_add_refl_n.outputs['Color'])
def add(node_tree, geom_n_name, spec_col_n_name, base_tex_n_name, out_mat_n_name, output_n_name, output_n_socket_name="Env Color"): """Add add env pass to node tree with links. :param node_tree: node tree on which this shader should be created :type node_tree: bpy.types.NodeTree :param geom_n_name: name of geometry node from which normal will be taken :type geom_n_name: str :param spec_col_n_name: name of specular color node from which specular color will be taken :type spec_col_n_name: str :param base_tex_n_name: name of base texture node from which alpha will be taken (if empty string it won't be used) :type base_tex_n_name: str :param out_mat_n_name: name of output material node from which output color will be taken :type out_mat_n_name: str :param output_n_name: name of output node with color input node to which result will be given :type output_n_name: str """ start_pos_x = 0 start_pos_y = 0 pos_x_shift = 185 geometry_n = node_tree.nodes[geom_n_name] spec_col_n = node_tree.nodes[spec_col_n_name] base_tex_n = node_tree.nodes[ base_tex_n_name] if base_tex_n_name in node_tree.nodes else None out_mat_n = node_tree.nodes[out_mat_n_name] output_n = node_tree.nodes[output_n_name] # node creation refl_tex_n = node_tree.nodes.new("ShaderNodeTexture") refl_tex_n.name = refl_tex_n.label = StdAddEnv.REFL_TEX_NODE refl_tex_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2500) env_col_n = node_tree.nodes.new("ShaderNodeRGB") env_col_n.name = env_col_n.label = StdAddEnv.ENV_COLOR_NODE env_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2200) add_env_gn = node_tree.nodes.new("ShaderNodeGroup") add_env_gn.name = add_env_gn.label = StdAddEnv.ADD_ENV_GROUP_NODE add_env_gn.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 2300) add_env_gn.node_tree = add_env.get_node_group() add_env_gn.inputs['Apply Fresnel'].default_value = 1.0 add_env_gn.inputs['Fresnel Scale'].default_value = 0.9 add_env_gn.inputs['Fresnel Bias'].default_value = 0.2 add_env_gn.inputs['Base Texture Alpha'].default_value = 0.5 # geometry links node_tree.links.new(add_env_gn.inputs['Normal Vector'], geometry_n.outputs['Normal']) node_tree.links.new(add_env_gn.inputs['View Vector'], geometry_n.outputs['View']) node_tree.links.new(refl_tex_n.inputs['Vector'], geometry_n.outputs['Normal']) # if out material node is really material node and has normal output, # use it as this normal might include normal maps if "Normal" in out_mat_n.outputs: node_tree.links.new(refl_tex_n.inputs['Vector'], out_mat_n.outputs['Normal']) node_tree.links.new(add_env_gn.inputs['Env Factor Color'], env_col_n.outputs['Color']) node_tree.links.new(add_env_gn.inputs['Reflection Texture Color'], refl_tex_n.outputs['Color']) node_tree.links.new(add_env_gn.inputs['Specular Color'], spec_col_n.outputs['Color']) if add_env_gn and base_tex_n: node_tree.links.new(add_env_gn.inputs['Base Texture Alpha'], base_tex_n.outputs['Value']) node_tree.links.new(output_n.inputs[output_n_socket_name], add_env_gn.outputs['Environment Addition Color'])
def init(node_tree): """Initialize node tree with links for this shader. NOTE: this shader can not be fully implemented, because in game this shader works with frame buffer which already has color of underlying pixel. :param node_tree: node tree on which this shader should be created :type node_tree: bpy.types.NodeTree """ start_pos_x = 0 start_pos_y = 0 pos_x_shift = 185 # node creation # vertex colors vcol_group_n = node_tree.nodes.new("ShaderNodeGroup") vcol_group_n.name = Glass.VCOL_GROUP_NODE vcol_group_n.label = Glass.VCOL_GROUP_NODE vcol_group_n.location = (start_pos_x - pos_x_shift, start_pos_y + 1650) vcol_group_n.node_tree = vcolor_input.get_node_group() # geometry geometry_n = node_tree.nodes.new("ShaderNodeGeometry") geometry_n.name = Glass.GEOM_NODE geometry_n.label = Glass.GEOM_NODE geometry_n.location = (start_pos_x - pos_x_shift, start_pos_y + 1500) geometry_n.uv_layer = _MESH_consts.none_uv # inputs refl_tex_n = node_tree.nodes.new("ShaderNodeTexture") refl_tex_n.name = Glass.REFL_TEX_NODE refl_tex_n.label = Glass.REFL_TEX_NODE refl_tex_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2700) env_col_n = node_tree.nodes.new("ShaderNodeRGB") env_col_n.name = Glass.ENV_COLOR_NODE env_col_n.label = Glass.ENV_COLOR_NODE env_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2400) tint_col_n = node_tree.nodes.new("ShaderNodeRGB") tint_col_n.name = Glass.TINT_COL_NODE tint_col_n.label = Glass.TINT_COL_NODE tint_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2200) tint_opacity_n = node_tree.nodes.new("ShaderNodeValue") tint_opacity_n.name = Glass.TINT_OPACITY_NODE tint_opacity_n.label = Glass.TINT_OPACITY_NODE tint_opacity_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2000) spec_col_n = node_tree.nodes.new("ShaderNodeRGB") spec_col_n.name = Glass.SPEC_COL_NODE spec_col_n.label = Glass.SPEC_COL_NODE spec_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 1900) diff_col_n = node_tree.nodes.new("ShaderNodeRGB") diff_col_n.name = Glass.DIFF_COL_NODE diff_col_n.label = Glass.DIFF_COL_NODE diff_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 1700) base_tex_n = node_tree.nodes.new("ShaderNodeTexture") base_tex_n.name = Glass.BASE_TEX_NODE base_tex_n.label = Glass.BASE_TEX_NODE base_tex_n.location = (start_pos_x + pos_x_shift, start_pos_y + 1500) # pass 1 add_env_gn = node_tree.nodes.new("ShaderNodeGroup") add_env_gn.name = Glass.ADD_ENV_GROUP_NODE add_env_gn.label = Glass.ADD_ENV_GROUP_NODE add_env_gn.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 2500) add_env_gn.node_tree = add_env.get_node_group() add_env_gn.inputs['Apply Fresnel'].default_value = 1.0 add_env_gn.inputs['Base Texture Alpha'].default_value = 1.0 add_env_gn.inputs['Fresnel Scale'].default_value = 2.0 add_env_gn.inputs['Fresnel Bias'].default_value = 1.0 tint_col_hsv_n = node_tree.nodes.new("ShaderNodeSeparateHSV") tint_col_hsv_n.name = Glass.TINT_HSV_NODE tint_col_hsv_n.label = Glass.TINT_HSV_NODE tint_col_hsv_n.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 2100) tint_opacity_combine_n = node_tree.nodes.new("ShaderNodeCombineRGB") tint_opacity_combine_n.name = Glass.TINT_OPACITY_COMBINE_NODE tint_opacity_combine_n.label = Glass.TINT_OPACITY_COMBINE_NODE tint_opacity_combine_n.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 1800) diff_vcol_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") diff_vcol_mult_n.name = Glass.DIFF_VCOL_MULT_NODE diff_vcol_mult_n.label = Glass.DIFF_VCOL_MULT_NODE diff_vcol_mult_n.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 1650) diff_vcol_mult_n.blend_type = "MULTIPLY" diff_vcol_mult_n.inputs['Fac'].default_value = 1 spec_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") spec_mult_n.name = Glass.SPEC_MULT_NODE spec_mult_n.label = Glass.SPEC_MULT_NODE spec_mult_n.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 1450) spec_mult_n.blend_type = "MULTIPLY" spec_mult_n.inputs['Fac'].default_value = 1 # pass 2 tint_sat_subtract_n = node_tree.nodes.new("ShaderNodeMath") tint_sat_subtract_n.name = Glass.TINT_SAT_SUBTRACT_NODE tint_sat_subtract_n.label = Glass.TINT_SAT_SUBTRACT_NODE tint_sat_subtract_n.location = (start_pos_x + pos_x_shift * 4, start_pos_y + 2200) tint_sat_subtract_n.operation = "SUBTRACT" tint_sat_subtract_n.inputs[0].default_value = 1.0 tint_vcol_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") tint_vcol_mult_n.name = Glass.TINT_VCOL_MULT_NODE tint_vcol_mult_n.label = Glass.TINT_VCOL_MULT_NODE tint_vcol_mult_n.location = (start_pos_x + pos_x_shift * 4, start_pos_y + 1950) tint_vcol_mult_n.blend_type = "MULTIPLY" tint_vcol_mult_n.inputs['Fac'].default_value = 1 diff_opacity_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") diff_opacity_mult_n.name = Glass.DIFF_OPACITY_MULT_NODE diff_opacity_mult_n.label = Glass.DIFF_OPACITY_MULT_NODE diff_opacity_mult_n.location = (start_pos_x + pos_x_shift * 4, start_pos_y + 1750) diff_opacity_mult_n.blend_type = "MULTIPLY" diff_opacity_mult_n.inputs['Fac'].default_value = 1 # pass 3 tint_val_sat_mult_n = node_tree.nodes.new("ShaderNodeMath") tint_val_sat_mult_n.name = Glass.TINT_VAL_SAT_MULT_NODE tint_val_sat_mult_n.label = Glass.TINT_VAL_SAT_MULT_NODE tint_val_sat_mult_n.location = (start_pos_x + pos_x_shift * 5, start_pos_y + 2150) tint_val_sat_mult_n.operation = "MULTIPLY" # pass 4 tint_diff_mult_n = node_tree.nodes.new("ShaderNodeMixRGB") tint_diff_mult_n.name = Glass.TINT_DIFF_MULT_NODE tint_diff_mult_n.label = Glass.TINT_DIFF_MULT_NODE tint_diff_mult_n.location = (start_pos_x + pos_x_shift * 6, start_pos_y + 1900) tint_diff_mult_n.blend_type = "MULTIPLY" tint_diff_mult_n.inputs['Fac'].default_value = 1 # pass 5 out_mat_n = node_tree.nodes.new("ShaderNodeExtendedMaterial") out_mat_n.name = Glass.OUT_MAT_NODE out_mat_n.label = Glass.OUT_MAT_NODE if "SpecTra" in out_mat_n: out_mat_n.inputs['SpecTra'].default_value = 0.0 if "Refl" in out_mat_n: out_mat_n.inputs['Refl'].default_value = 1.0 elif "Reflectivity" in out_mat_n: out_mat_n.inputs['Reflectivity'].default_value = 1.0 out_mat_n.location = (start_pos_x + pos_x_shift * 7, start_pos_y + 2100) tint_val_subtract_n = node_tree.nodes.new("ShaderNodeMath") tint_val_subtract_n.name = Glass.TINT_VAL_SUBTRACT_NODE tint_val_subtract_n.label = Glass.TINT_VAL_SUBTRACT_NODE tint_val_subtract_n.location = (start_pos_x + pos_x_shift * 7, start_pos_y + 1400) tint_val_subtract_n.operation = "SUBTRACT" tint_val_subtract_n.inputs[0].default_value = 1.0 # pass 6 compose_lighting_n = node_tree.nodes.new("ShaderNodeGroup") compose_lighting_n.name = Glass.COMPOSE_LIGHTING_NODE compose_lighting_n.label = Glass.COMPOSE_LIGHTING_NODE compose_lighting_n.location = (start_pos_x + pos_x_shift * 8, start_pos_y + 2400) compose_lighting_n.node_tree = compose_lighting.get_node_group() out_add_spec_a_n = node_tree.nodes.new("ShaderNodeMath") out_add_spec_a_n.name = Glass.OUT_ADD_SPEC_A_NODE out_add_spec_a_n.label = Glass.OUT_ADD_SPEC_A_NODE out_add_spec_a_n.location = (start_pos_x + pos_x_shift * 8, start_pos_y + 1550) out_add_spec_a_n.operation = "ADD" max_tint_n = node_tree.nodes.new("ShaderNodeMath") max_tint_n.name = Glass.MAX_TINT_VAL_OR_OPACITY_NODE max_tint_n.label = Glass.MAX_TINT_VAL_OR_OPACITY_NODE max_tint_n.location = (start_pos_x + pos_x_shift * 8, start_pos_y + 1350) max_tint_n.operation = "MAXIMUM" # pass 7 out_add_spec_n = node_tree.nodes.new("ShaderNodeMixRGB") out_add_spec_n.name = Glass.OUT_ADD_SPEC_NODE out_add_spec_n.label = Glass.OUT_ADD_SPEC_NODE out_add_spec_n.location = (start_pos_x + pos_x_shift * 9, start_pos_y + 2200) out_add_spec_n.blend_type = "ADD" out_add_spec_n.inputs['Fac'].default_value = 1 out_add_tint_max_a_n = node_tree.nodes.new("ShaderNodeMath") out_add_tint_max_a_n.name = Glass.OUT_ADD_TINT_MAX_A_NODE out_add_tint_max_a_n.label = Glass.OUT_ADD_TINT_MAX_A_NODE out_add_tint_max_a_n.location = (start_pos_x + pos_x_shift * 9, start_pos_y + 1500) # output output_n = node_tree.nodes.new("ShaderNodeOutput") output_n.name = Glass.OUTPUT_NODE output_n.label = Glass.OUTPUT_NODE output_n.location = (start_pos_x + + pos_x_shift * 11, start_pos_y + 1900) # links creation # input node_tree.links.new(base_tex_n.inputs['Vector'], geometry_n.outputs['UV']) node_tree.links.new(refl_tex_n.inputs['Vector'], geometry_n.outputs['Normal']) # pass 1 node_tree.links.new(add_env_gn.inputs['Normal Vector'], geometry_n.outputs['Normal']) node_tree.links.new(add_env_gn.inputs['View Vector'], geometry_n.outputs['View']) node_tree.links.new(add_env_gn.inputs['Reflection Texture Color'], refl_tex_n.outputs['Color']) node_tree.links.new(add_env_gn.inputs['Env Factor Color'], env_col_n.outputs['Color']) node_tree.links.new(add_env_gn.inputs['Specular Color'], spec_col_n.outputs['Color']) node_tree.links.new(tint_col_hsv_n.inputs['Color'], tint_col_n.outputs['Color']) node_tree.links.new(tint_opacity_combine_n.inputs['R'], tint_opacity_n.outputs['Value']) node_tree.links.new(tint_opacity_combine_n.inputs['G'], tint_opacity_n.outputs['Value']) node_tree.links.new(tint_opacity_combine_n.inputs['B'], tint_opacity_n.outputs['Value']) node_tree.links.new(diff_vcol_mult_n.inputs['Color1'], diff_col_n.outputs['Color']) node_tree.links.new(diff_vcol_mult_n.inputs['Color2'], vcol_group_n.outputs['Vertex Color']) node_tree.links.new(spec_mult_n.inputs['Color1'], spec_col_n.outputs['Color']) node_tree.links.new(spec_mult_n.inputs['Color2'], base_tex_n.outputs['Value']) # pass 2 node_tree.links.new(tint_sat_subtract_n.inputs[1], tint_col_hsv_n.outputs['S']) node_tree.links.new(tint_vcol_mult_n.inputs['Color1'], tint_col_n.outputs['Color']) node_tree.links.new(tint_vcol_mult_n.inputs['Color2'], vcol_group_n.outputs['Vertex Color']) node_tree.links.new(diff_opacity_mult_n.inputs['Color1'], tint_opacity_combine_n.outputs['Image']) node_tree.links.new(diff_opacity_mult_n.inputs['Color2'], diff_vcol_mult_n.outputs['Color']) # pass 3 node_tree.links.new(tint_val_sat_mult_n.inputs[0], tint_sat_subtract_n.outputs[0]) node_tree.links.new(tint_val_sat_mult_n.inputs[1], tint_col_hsv_n.outputs['V']) # pass 4 node_tree.links.new(tint_diff_mult_n.inputs['Fac'], tint_val_sat_mult_n.outputs['Value']) node_tree.links.new(tint_diff_mult_n.inputs['Color1'], tint_vcol_mult_n.outputs['Color']) node_tree.links.new(tint_diff_mult_n.inputs['Color2'], diff_opacity_mult_n.outputs['Color']) # pass 5 node_tree.links.new(out_mat_n.inputs['Spec'], spec_mult_n.outputs['Color']) node_tree.links.new(tint_val_subtract_n.inputs[1], vcol_group_n.outputs['Vertex Color Alpha']) # pass 6 node_tree.links.new(compose_lighting_n.inputs['Diffuse Color'], tint_diff_mult_n.outputs['Color']) node_tree.links.new(compose_lighting_n.inputs['Material Color'], tint_diff_mult_n.outputs['Color']) node_tree.links.new(compose_lighting_n.inputs['Env Color'], add_env_gn.outputs['Environment Addition Color']) node_tree.links.new(out_add_spec_a_n.inputs[0], out_mat_n.outputs['Spec']) node_tree.links.new(out_add_spec_a_n.inputs[1], add_env_gn.outputs['Environment Addition Color']) node_tree.links.new(max_tint_n.inputs[0], tint_val_subtract_n.outputs[0]) node_tree.links.new(max_tint_n.inputs[1], tint_opacity_n.outputs[0]) # pass 7 node_tree.links.new(out_add_spec_n.inputs['Color1'], compose_lighting_n.outputs['Composed Color']) node_tree.links.new(out_add_spec_n.inputs['Color2'], out_mat_n.outputs['Spec']) node_tree.links.new(out_add_tint_max_a_n.inputs[0], out_add_spec_a_n.outputs[0]) node_tree.links.new(out_add_tint_max_a_n.inputs[1], max_tint_n.outputs[0]) # output node_tree.links.new(output_n.inputs['Color'], out_add_spec_n.outputs['Color']) node_tree.links.new(output_n.inputs['Alpha'], out_add_tint_max_a_n.outputs[0])
def init(node_tree): """Initialize node tree with links for this shader. :param node_tree: node tree on which this shader should be created :type node_tree: bpy.types.NodeTree """ start_pos_x = 0 start_pos_y = 0 pos_x_shift = 185 # init parent DifSpecWeight.init(node_tree) geometry_n = node_tree.nodes[DifSpecWeight.GEOM_NODE] spec_col_n = node_tree.nodes[DifSpecWeight.SPEC_COL_NODE] base_tex_n = node_tree.nodes[DifSpecWeight.BASE_TEX_NODE] out_mat_n = node_tree.nodes[DifSpecWeight.OUT_MAT_NODE] output_n = node_tree.nodes[DifSpecWeight.OUTPUT_NODE] # move existing output_n.location.x += pos_x_shift # node creation refl_tex_n = node_tree.nodes.new("ShaderNodeTexture") refl_tex_n.name = DifSpecWeightAddEnv.REFL_TEX_NODE refl_tex_n.label = DifSpecWeightAddEnv.REFL_TEX_NODE refl_tex_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2500) env_col_n = node_tree.nodes.new("ShaderNodeRGB") env_col_n.name = DifSpecWeightAddEnv.ENV_COLOR_NODE env_col_n.label = DifSpecWeightAddEnv.ENV_COLOR_NODE env_col_n.location = (start_pos_x + pos_x_shift, start_pos_y + 2200) add_env_gn = node_tree.nodes.new("ShaderNodeGroup") add_env_gn.name = DifSpecWeightAddEnv.ADD_ENV_GROUP_NODE add_env_gn.label = DifSpecWeightAddEnv.ADD_ENV_GROUP_NODE add_env_gn.location = (start_pos_x + pos_x_shift * 3, start_pos_y + 2300) add_env_gn.node_tree = add_env.get_node_group() add_env_gn.inputs["Apply Fresnel"].default_value = 1.0 add_env_gn.inputs["Fresnel Scale"].default_value = 0.9 add_env_gn.inputs["Fresnel Bias"].default_value = 0.2 out_add_refl_n = node_tree.nodes.new("ShaderNodeMixRGB") out_add_refl_n.name = DifSpecWeightAddEnv.OUT_ADD_REFL_NODE out_add_refl_n.label = DifSpecWeightAddEnv.OUT_ADD_REFL_NODE out_add_refl_n.location = (output_n.location.x - pos_x_shift, start_pos_y + 1950) out_add_refl_n.blend_type = "ADD" out_add_refl_n.inputs["Fac"].default_value = 1 # geometry links node_tree.links.new(add_env_gn.inputs["Normal Vector"], geometry_n.outputs["Normal"]) node_tree.links.new(add_env_gn.inputs["View Vector"], geometry_n.outputs["View"]) node_tree.links.new(refl_tex_n.inputs["Vector"], geometry_n.outputs["Normal"]) node_tree.links.new(add_env_gn.inputs["Env Factor Color"], env_col_n.outputs["Color"]) node_tree.links.new(add_env_gn.inputs["Reflection Texture Color"], refl_tex_n.outputs["Color"]) node_tree.links.new(add_env_gn.inputs["Specular Color"], spec_col_n.outputs["Color"]) node_tree.links.new(add_env_gn.inputs["Base Texture Alpha"], base_tex_n.outputs["Value"]) # output pass node_tree.links.new(out_add_refl_n.inputs["Color1"], add_env_gn.outputs["Environment Addition Color"]) node_tree.links.new(out_add_refl_n.inputs["Color2"], out_mat_n.outputs["Color"]) node_tree.links.new(output_n.inputs["Color"], out_add_refl_n.outputs["Color"])