[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4652] trunk/py/scripts/addons/ io_scene_fbx/cycles_shader_compat.py: module for FBX importer, cycles compatibility

Campbell Barton ideasman42 at gmail.com
Thu Aug 8 08:59:07 CEST 2013


Revision: 4652
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4652
Author:   campbellbarton
Date:     2013-08-08 06:59:06 +0000 (Thu, 08 Aug 2013)
Log Message:
-----------
module for FBX importer, cycles compatibility

Added Paths:
-----------
    trunk/py/scripts/addons/io_scene_fbx/cycles_shader_compat.py

Added: trunk/py/scripts/addons/io_scene_fbx/cycles_shader_compat.py
===================================================================
--- trunk/py/scripts/addons/io_scene_fbx/cycles_shader_compat.py	                        (rev 0)
+++ trunk/py/scripts/addons/io_scene_fbx/cycles_shader_compat.py	2013-08-08 06:59:06 UTC (rev 4652)
@@ -0,0 +1,356 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+
+__all__ = (
+    "CyclesShaderWrapper",
+    )
+
+
+class CyclesShaderWrapper():
+    """
+    Hard coded shader setup.
+    Suitable for importers, adds basic:
+    diffuse/spec/alpha/normal/bump/reflect.
+    """
+    __slots__ = (
+        "material",
+
+        "node_out",
+        "node_mix_shader_spec",
+        "node_mix_shader_alpha",
+        "node_mix_shader_refl",
+
+        "node_bsdf_alpha",
+        "node_bsdf_diff",
+        "node_bsdf_spec",
+        "node_bsdf_refl",
+
+        "node_mix_color_alpha",
+        "node_mix_color_diff",
+        "node_mix_color_spec",
+        "node_mix_color_spec_hard",
+        "node_mix_color_refl",
+        "node_mix_color_bump",
+
+        "node_normal_map",
+        )
+
+    _col_size = 200
+    _row_size = 220
+
+    def __init__(self, material):
+
+        COLOR_WHITE = 1.0, 1.0, 1.0, 1.0
+        COLOR_BLACK = 0.0, 0.0, 0.0, 1.0
+
+        self.material = material
+        self.material.use_nodes = True
+
+        tree = self.material.node_tree
+
+        nodes = tree.nodes
+        links = tree.links
+        nodes.clear()
+
+        # ----
+        # Add shaders
+        node = nodes.new(type='ShaderNodeOutputMaterial')
+        node.label = "Material Out"
+        node.location = self._grid_location(6, 4)
+        self.node_out = node
+        del node
+
+        node = nodes.new(type='ShaderNodeAddShader')
+        node.label = "Shader Add Refl"
+        node.location = self._grid_location(5, 4)
+        self.node_mix_shader_refl = node
+        del node
+        # Link
+        links.new(self.node_mix_shader_refl.outputs["Shader"],
+                  self.node_out.inputs["Surface"])
+
+        node = nodes.new(type='ShaderNodeAddShader')
+        node.label = "Shader Add Spec"
+        node.location = self._grid_location(4, 4)
+        self.node_mix_shader_spec = node
+        del node
+        # Link
+        links.new(self.node_mix_shader_spec.outputs["Shader"],
+                  self.node_mix_shader_refl.inputs[0])
+
+        # --------------------------------------------------------------------
+        # Reflection
+        node = nodes.new(type='ShaderNodeBsdfRefraction')
+        node.label = "Refl BSDF"
+        node.location = self._grid_location(6, 1)
+        node.mute = True  # unmute on use
+        self.node_bsdf_refl = node
+        del node
+        # Link
+        links.new(self.node_bsdf_refl.outputs["BSDF"],
+                  self.node_mix_shader_refl.inputs[1])
+
+        # Mix Refl Color
+        node = nodes.new(type='ShaderNodeMixRGB')
+        node.label = "Mix Color/Refl"
+        node.location = self._grid_location(5, 1)
+        node.blend_type = 'MULTIPLY'
+        node.inputs["Fac"].default_value = 1.0
+        # reverse of most other mix nodes
+        node.inputs["Color1"].default_value = COLOR_WHITE  # color
+        node.inputs["Color2"].default_value = COLOR_BLACK  # factor
+        self.node_mix_color_refl = node
+        del node
+        # Link
+        links.new(self.node_mix_color_refl.outputs["Color"],
+                  self.node_bsdf_refl.inputs["Color"])
+
+        # --------------------------------------------------------------------
+        # Alpha
+
+        # ----
+        # Mix shader
+        node = nodes.new(type='ShaderNodeMixShader')
+        node.label = "Shader Mix Alpha"
+        node.location = self._grid_location(3, 4)
+        node.inputs["Fac"].default_value = 1.0  # no alpha by default
+        self.node_mix_shader_alpha = node
+        del node
+        # Link
+        links.new(self.node_mix_shader_alpha.outputs["Shader"],
+                  self.node_mix_shader_spec.inputs[0])
+
+        # Alpha BSDF
+        node = nodes.new(type='ShaderNodeBsdfTransparent')
+        node.label = "Alpha BSDF"
+        node.location = self._grid_location(2, 4)
+        node.mute = True  # unmute on use
+        self.node_bsdf_alpha = node
+        del node
+        # Link
+        links.new(self.node_bsdf_alpha.outputs["BSDF"],
+                  self.node_mix_shader_alpha.inputs[1])  # first 'Shader'
+
+        # Mix Alpha Color
+        node = nodes.new(type='ShaderNodeMixRGB')
+        node.label = "Mix Color/Alpha"
+        node.location = self._grid_location(1, 5)
+        node.blend_type = 'MULTIPLY'
+        node.inputs["Fac"].default_value = 1.0
+        node.inputs["Color1"].default_value = COLOR_WHITE
+        node.inputs["Color2"].default_value = COLOR_WHITE
+        self.node_mix_color_alpha = node
+        del node
+        # Link
+        links.new(self.node_mix_color_alpha.outputs["Color"],
+                  self.node_mix_shader_alpha.inputs["Fac"])
+
+        # --------------------------------------------------------------------
+        # Diffuse
+
+        # Diffuse BSDF
+        node = nodes.new(type='ShaderNodeBsdfDiffuse')
+        node.label = "Diff BSDF"
+        node.location = self._grid_location(2, 3)
+        self.node_bsdf_diff = node
+        del node
+        # Link
+        links.new(self.node_bsdf_diff.outputs["BSDF"],
+                  self.node_mix_shader_alpha.inputs[2])  # first 'Shader'
+
+        # Mix Diffuse Color
+        node = nodes.new(type='ShaderNodeMixRGB')
+        node.label = "Mix Color/Diffuse"
+        node.location = self._grid_location(1, 3)
+        node.blend_type = 'MULTIPLY'
+        node.inputs["Fac"].default_value = 1.0
+        node.inputs["Color1"].default_value = COLOR_WHITE
+        node.inputs["Color2"].default_value = COLOR_WHITE
+        self.node_mix_color_diff = node
+        del node
+        # Link
+        links.new(self.node_mix_color_diff.outputs["Color"],
+                  self.node_bsdf_diff.inputs["Color"])
+
+        # --------------------------------------------------------------------
+        # Specular
+        node = nodes.new(type='ShaderNodeBsdfGlossy')
+        node.label = "Spec BSDF"
+        node.location = self._grid_location(2, 1)
+        node.mute = True  # unmute on use
+        self.node_bsdf_spec = node
+        del node
+        # Link (with add shader)
+        links.new(self.node_bsdf_spec.outputs["BSDF"],
+                  self.node_mix_shader_spec.inputs[1])  # second 'Shader' slot
+
+        node = nodes.new(type='ShaderNodeMixRGB')
+        node.label = "Mix Color/Diffuse"
+        node.location = self._grid_location(1, 1)
+        node.blend_type = 'MULTIPLY'
+        node.inputs["Fac"].default_value = 1.0
+        node.inputs["Color1"].default_value = COLOR_WHITE
+        node.inputs["Color2"].default_value = COLOR_BLACK
+        self.node_mix_color_spec = node
+        del node
+        # Link
+        links.new(self.node_mix_color_spec.outputs["Color"],
+                  self.node_bsdf_spec.inputs["Color"])
+
+        node = nodes.new(type='ShaderNodeMixRGB')
+        node.label = "Mix Color/Hardness"
+        node.location = self._grid_location(0, 0)
+        node.blend_type = 'MULTIPLY'
+        node.inputs["Fac"].default_value = 1.0
+        node.inputs["Color1"].default_value = COLOR_WHITE
+        node.inputs["Color2"].default_value = COLOR_BLACK
+        self.node_mix_color_spec_hard = node
+        del node
+        # Link
+        links.new(self.node_mix_color_spec_hard.outputs["Color"],
+                  self.node_bsdf_spec.inputs["Roughness"])
+
+        # --------------------------------------------------------------------
+        # Normal Map
+        node = nodes.new(type='ShaderNodeNormalMap')
+        node.label = "Normal/Map"
+        node.location = self._grid_location(1, 2)
+        node.mute = True  # unmute on use
+        self.node_normal_map = node
+        del node
+
+        # Link (with diff shader)
+        socket_src = self.node_normal_map.outputs["Normal"]
+        links.new(socket_src,
+                  self.node_bsdf_diff.inputs["Normal"])
+        # Link (with spec shader)
+        links.new(socket_src,
+                  self.node_bsdf_spec.inputs["Normal"])
+        # Link (with refl shader)
+        links.new(socket_src,
+                  self.node_bsdf_refl.inputs["Normal"])
+        del socket_src
+
+        # --------------------------------------------------------------------
+        # Bump Map
+        # Mix Refl Color
+        node = nodes.new(type='ShaderNodeMixRGB')
+        node.label = "Bump/Map"
+        node.location = self._grid_location(5, 3)
+        node.mute = True  # unmute on use
+        node.blend_type = 'MULTIPLY'
+        node.inputs["Fac"].default_value = 1.0
+        # reverse of most other mix nodes
+        node.inputs["Color1"].default_value = COLOR_WHITE  # color
+        node.inputs["Color2"].default_value = COLOR_BLACK  # factor
+        self.node_mix_color_bump = node
+        del node
+        # Link
+        links.new(self.node_mix_color_bump.outputs["Color"],
+                  self.node_out.inputs["Displacement"])
+
+    @staticmethod
+    def _image_create_helper(image, node_dst, sockets_dst):
+        tree = node_dst.id_data
+        nodes = tree.nodes
+        links = tree.links
+
+        node = nodes.new(type='ShaderNodeTexImage')
+        node.image = image
+        node.location = node_dst.location
+        node.location.x -= CyclesShaderWrapper._col_size
+        for socket in sockets_dst:
+            links.new(node.outputs["Color"],

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list