Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'render_povray/nodes.py')
-rw-r--r--render_povray/nodes.py1056
1 files changed, 1056 insertions, 0 deletions
diff --git a/render_povray/nodes.py b/render_povray/nodes.py
new file mode 100644
index 00000000..d7662d14
--- /dev/null
+++ b/render_povray/nodes.py
@@ -0,0 +1,1056 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+# <pep8 compliant>
+""""Nodes based User interface for shaders exported to POV textures."""
+import bpy
+
+from bpy.utils import register_class, unregister_class
+from bpy.types import Node, CompositorNodeTree, TextureNodeTree
+from bpy.props import (
+ StringProperty,
+ BoolProperty,
+ IntProperty,
+ FloatProperty,
+ EnumProperty,
+)
+from . import nodes_properties
+
+
+# -------- Output
+class PovrayOutputNode(Node, nodes_properties.ObjectNodeTree):
+ """Output"""
+
+ bl_idname = "PovrayOutputNode"
+ bl_label = "Output"
+ bl_icon = "SHADING_TEXTURE"
+
+ def init(self, context):
+
+ self.inputs.new("PovraySocketTexture", "Texture")
+
+ def draw_buttons(self, context, layout):
+
+ ob = context.object
+ layout.prop(ob.pov, "object_ior", slider=True)
+
+ def draw_buttons_ext(self, context, layout):
+
+ ob = context.object
+ layout.prop(ob.pov, "object_ior", slider=True)
+
+ def draw_label(self):
+ return "Output"
+
+
+# -------- Material
+class PovrayTextureNode(Node, nodes_properties.ObjectNodeTree):
+ """Texture"""
+
+ bl_idname = "PovrayTextureNode"
+ bl_label = "Simple texture"
+ bl_icon = "SHADING_TEXTURE"
+
+ def init(self, context):
+
+ color = self.inputs.new("PovraySocketColor", "Pigment")
+ color.default_value = (1, 1, 1)
+ normal = self.inputs.new("NodeSocketFloat", "Normal")
+ normal.hide_value = True
+ finish = self.inputs.new("NodeSocketVector", "Finish")
+ finish.hide_value = True
+
+ self.outputs.new("PovraySocketTexture", "Texture")
+
+ def draw_label(self):
+ return "Simple texture"
+
+
+class PovrayFinishNode(Node, nodes_properties.ObjectNodeTree):
+ """Finish"""
+
+ bl_idname = "PovrayFinishNode"
+ bl_label = "Finish"
+ bl_icon = "SHADING_TEXTURE"
+
+ def init(self, context):
+
+ self.inputs.new("PovraySocketFloat_0_1", "Emission")
+ ambient = self.inputs.new("NodeSocketVector", "Ambient")
+ ambient.hide_value = True
+ diffuse = self.inputs.new("NodeSocketVector", "Diffuse")
+ diffuse.hide_value = True
+ specular = self.inputs.new("NodeSocketVector", "Highlight")
+ specular.hide_value = True
+ mirror = self.inputs.new("NodeSocketVector", "Mirror")
+ mirror.hide_value = True
+ iridescence = self.inputs.new("NodeSocketVector", "Iridescence")
+ iridescence.hide_value = True
+ subsurface = self.inputs.new("NodeSocketVector", "Translucency")
+ subsurface.hide_value = True
+ self.outputs.new("NodeSocketVector", "Finish")
+
+ def draw_label(self):
+ return "Finish"
+
+
+class PovrayDiffuseNode(Node, nodes_properties.ObjectNodeTree):
+ """Diffuse"""
+
+ bl_idname = "PovrayDiffuseNode"
+ bl_label = "Diffuse"
+ bl_icon = "MATSPHERE"
+
+ def init(self, context):
+
+ intensity = self.inputs.new("PovraySocketFloat_0_1", "Intensity")
+ intensity.default_value = 0.8
+ albedo = self.inputs.new("NodeSocketBool", "Albedo")
+ albedo.default_value = False
+ brilliance = self.inputs.new("PovraySocketFloat_0_10", "Brilliance")
+ brilliance.default_value = 1.8
+ self.inputs.new("PovraySocketFloat_0_1", "Crand")
+ self.outputs.new("NodeSocketVector", "Diffuse")
+
+ def draw_label(self):
+ return "Diffuse"
+
+
+class PovrayPhongNode(Node, nodes_properties.ObjectNodeTree):
+ """Phong"""
+
+ bl_idname = "PovrayPhongNode"
+ bl_label = "Phong"
+ bl_icon = "MESH_UVSPHERE"
+
+ def init(self, context):
+
+ albedo = self.inputs.new("NodeSocketBool", "Albedo")
+ intensity = self.inputs.new("PovraySocketFloat_0_1", "Intensity")
+ intensity.default_value = 0.8
+ phong_size = self.inputs.new("PovraySocketInt_0_256", "Size")
+ phong_size.default_value = 60
+ metallic = self.inputs.new("PovraySocketFloat_0_1", "Metallic")
+
+ self.outputs.new("NodeSocketVector", "Phong")
+
+ def draw_label(self):
+ return "Phong"
+
+
+class PovraySpecularNode(Node, nodes_properties.ObjectNodeTree):
+ """Specular"""
+
+ bl_idname = "PovraySpecularNode"
+ bl_label = "Specular"
+ bl_icon = "MESH_UVSPHERE"
+
+ def init(self, context):
+
+ albedo = self.inputs.new("NodeSocketBool", "Albedo")
+ intensity = self.inputs.new("PovraySocketFloat_0_1", "Intensity")
+ intensity.default_value = 0.8
+ roughness = self.inputs.new("PovraySocketFloat_0_1", "Roughness")
+ roughness.default_value = 0.02
+ metallic = self.inputs.new("PovraySocketFloat_0_1", "Metallic")
+
+ self.outputs.new("NodeSocketVector", "Specular")
+
+ def draw_label(self):
+ return "Specular"
+
+
+class PovrayMirrorNode(Node, nodes_properties.ObjectNodeTree):
+ """Mirror"""
+
+ bl_idname = "PovrayMirrorNode"
+ bl_label = "Mirror"
+ bl_icon = "SHADING_TEXTURE"
+
+ def init(self, context):
+
+ color = self.inputs.new("PovraySocketColor", "Color")
+ color.default_value = (1, 1, 1)
+ metallic = self.inputs.new("PovraySocketFloat_0_1", "Metallic")
+ metallic.default_value = 1.0
+ exponent = self.inputs.new("PovraySocketFloat_0_1", "Exponent")
+ exponent.default_value = 1.0
+ self.inputs.new("PovraySocketFloat_0_1", "Falloff")
+ self.inputs.new("NodeSocketBool", "Fresnel")
+ self.inputs.new("NodeSocketBool", "Conserve energy")
+ self.outputs.new("NodeSocketVector", "Mirror")
+
+ def draw_label(self):
+ return "Mirror"
+
+
+class PovrayAmbientNode(Node, nodes_properties.ObjectNodeTree):
+ """Ambient"""
+
+ bl_idname = "PovrayAmbientNode"
+ bl_label = "Ambient"
+ bl_icon = "SHADING_SOLID"
+
+ def init(self, context):
+
+ self.inputs.new("PovraySocketColor", "Ambient")
+
+ self.outputs.new("NodeSocketVector", "Ambient")
+
+ def draw_label(self):
+ return "Ambient"
+
+
+class PovrayIridescenceNode(Node, nodes_properties.ObjectNodeTree):
+ """Iridescence"""
+
+ bl_idname = "PovrayIridescenceNode"
+ bl_label = "Iridescence"
+ bl_icon = "MESH_UVSPHERE"
+
+ def init(self, context):
+
+ amount = self.inputs.new("NodeSocketFloat", "Amount")
+ amount.default_value = 0.25
+ thickness = self.inputs.new("NodeSocketFloat", "Thickness")
+ thickness.default_value = 1
+ self.inputs.new("NodeSocketFloat", "Turbulence")
+
+ self.outputs.new("NodeSocketVector", "Iridescence")
+
+ def draw_label(self):
+ return "Iridescence"
+
+
+class PovraySubsurfaceNode(Node, nodes_properties.ObjectNodeTree):
+ """Subsurface"""
+
+ bl_idname = "PovraySubsurfaceNode"
+ bl_label = "Subsurface"
+ bl_icon = "MESH_UVSPHERE"
+
+ def init(self, context):
+
+ translucency = self.inputs.new("NodeSocketColor", "Translucency")
+ translucency.default_value = (0, 0, 0, 1)
+ energy = self.inputs.new("PovraySocketInt_0_256", "Energy")
+ energy.default_value = 20
+ self.outputs.new("NodeSocketVector", "Translucency")
+
+ def draw_buttons(self, context, layout):
+ scene = context.scene
+ layout.prop(scene.pov, "sslt_enable", text="SSLT")
+
+ def draw_buttons_ext(self, context, layout):
+ scene = context.scene
+ layout.prop(scene.pov, "sslt_enable", text="SSLT")
+
+ def draw_label(self):
+ return "Subsurface"
+
+
+# ---------------------------------------------------------------- #
+
+
+class PovrayMappingNode(Node, nodes_properties.ObjectNodeTree):
+ """Mapping"""
+
+ bl_idname = "PovrayMappingNode"
+ bl_label = "Mapping"
+ bl_icon = "NODE_TEXTURE"
+
+ warp_type: EnumProperty(
+ name="Warp Types",
+ description="Select the type of warp",
+ items=(
+ ("cubic", "Cubic", ""),
+ ("cylindrical", "Cylindrical", ""),
+ ("planar", "Planar", ""),
+ ("spherical", "Spherical", ""),
+ ("toroidal", "Toroidal", ""),
+ ("uv_mapping", "UV", ""),
+ ("NONE", "None", "No indentation"),
+ ),
+ default="NONE",
+ )
+
+ warp_orientation: EnumProperty(
+ name="Warp Orientation",
+ description="Select the orientation of warp",
+ items=(("x", "X", ""), ("y", "Y", ""), ("z", "Z", "")),
+ default="y",
+ )
+
+ warp_dist_exp: FloatProperty(
+ name="Distance exponent", description="Distance exponent", min=0.0, max=100.0, default=1.0
+ )
+
+ warp_tor_major_radius: FloatProperty(
+ name="Major radius",
+ description="Torus is distance from major radius",
+ min=0.0,
+ max=5.0,
+ default=1.0,
+ )
+
+ def init(self, context):
+ self.outputs.new("NodeSocketVector", "Mapping")
+
+ def draw_buttons(self, context, layout):
+
+ column = layout.column()
+ column.prop(self, "warp_type", text="Warp type")
+ if self.warp_type in {"toroidal", "spherical", "cylindrical", "planar"}:
+ column.prop(self, "warp_orientation", text="Orientation")
+ column.prop(self, "warp_dist_exp", text="Exponent")
+ if self.warp_type == "toroidal":
+ column.prop(self, "warp_tor_major_radius", text="Major R")
+
+ def draw_buttons_ext(self, context, layout):
+
+ column = layout.column()
+ column.prop(self, "warp_type", text="Warp type")
+ if self.warp_type in {"toroidal", "spherical", "cylindrical", "planar"}:
+ column.prop(self, "warp_orientation", text="Orientation")
+ column.prop(self, "warp_dist_exp", text="Exponent")
+ if self.warp_type == "toroidal":
+ column.prop(self, "warp_tor_major_radius", text="Major R")
+
+ def draw_label(self):
+ return "Mapping"
+
+
+class PovrayMultiplyNode(Node, nodes_properties.ObjectNodeTree):
+ """Multiply"""
+
+ bl_idname = "PovrayMultiplyNode"
+ bl_label = "Multiply"
+ bl_icon = "SHADING_SOLID"
+
+ amount_x: FloatProperty(
+ name="X", description="Number of repeats", min=1.0, max=10000.0, default=1.0
+ )
+
+ amount_y: FloatProperty(
+ name="Y", description="Number of repeats", min=1.0, max=10000.0, default=1.0
+ )
+
+ amount_z: FloatProperty(
+ name="Z", description="Number of repeats", min=1.0, max=10000.0, default=1.0
+ )
+
+ def init(self, context):
+ self.outputs.new("NodeSocketVector", "Amount")
+
+ def draw_buttons(self, context, layout):
+
+ column = layout.column()
+ column.label(text="Amount")
+ row = column.row(align=True)
+ row.prop(self, "amount_x")
+ row.prop(self, "amount_y")
+ row.prop(self, "amount_z")
+
+ def draw_buttons_ext(self, context, layout):
+
+ column = layout.column()
+ column.label(text="Amount")
+ row = column.row(align=True)
+ row.prop(self, "amount_x")
+ row.prop(self, "amount_y")
+ row.prop(self, "amount_z")
+
+ def draw_label(self):
+ return "Multiply"
+
+
+class PovrayTransformNode(Node, nodes_properties.ObjectNodeTree):
+ """Transform"""
+
+ bl_idname = "PovrayTransformNode"
+ bl_label = "Transform"
+ bl_icon = "NODE_TEXTURE"
+
+ def init(self, context):
+
+ self.inputs.new("PovraySocketFloatUnlimited", "Translate x")
+ self.inputs.new("PovraySocketFloatUnlimited", "Translate y")
+ self.inputs.new("PovraySocketFloatUnlimited", "Translate z")
+ self.inputs.new("PovraySocketFloatUnlimited", "Rotate x")
+ self.inputs.new("PovraySocketFloatUnlimited", "Rotate y")
+ self.inputs.new("PovraySocketFloatUnlimited", "Rotate z")
+ sX = self.inputs.new("PovraySocketFloatUnlimited", "Scale x")
+ sX.default_value = 1.0
+ sY = self.inputs.new("PovraySocketFloatUnlimited", "Scale y")
+ sY.default_value = 1.0
+ sZ = self.inputs.new("PovraySocketFloatUnlimited", "Scale z")
+ sZ.default_value = 1.0
+
+ self.outputs.new("NodeSocketVector", "Transform")
+
+ def draw_label(self):
+ return "Transform"
+
+
+class PovrayValueNode(Node, nodes_properties.ObjectNodeTree):
+ """Value"""
+
+ bl_idname = "PovrayValueNode"
+ bl_label = "Value"
+ bl_icon = "SHADING_SOLID"
+
+ def init(self, context):
+
+ self.outputs.new("PovraySocketUniversal", "Value")
+
+ def draw_label(self):
+ return "Value"
+
+
+class PovrayModifierNode(Node, nodes_properties.ObjectNodeTree):
+ """Modifier"""
+
+ bl_idname = "PovrayModifierNode"
+ bl_label = "Modifier"
+ bl_icon = "NODE_TEXTURE"
+
+ def init(self, context):
+
+ turb_x = self.inputs.new("PovraySocketFloat_0_10", "Turb X")
+ turb_x.default_value = 0.1
+ turb_y = self.inputs.new("PovraySocketFloat_0_10", "Turb Y")
+ turb_y.default_value = 0.1
+ turb_z = self.inputs.new("PovraySocketFloat_0_10", "Turb Z")
+ turb_z.default_value = 0.1
+ octaves = self.inputs.new("PovraySocketInt_1_9", "Octaves")
+ octaves.default_value = 1
+ lambat = self.inputs.new("PovraySocketFloat_0_10", "Lambda")
+ lambat.default_value = 2.0
+ omega = self.inputs.new("PovraySocketFloat_0_10", "Omega")
+ omega.default_value = 0.5
+ freq = self.inputs.new("PovraySocketFloat_0_10", "Frequency")
+ freq.default_value = 2.0
+ self.inputs.new("PovraySocketFloat_0_10", "Phase")
+
+ self.outputs.new("NodeSocketVector", "Modifier")
+
+ def draw_label(self):
+ return "Modifier"
+
+
+class PovrayPigmentNode(Node, nodes_properties.ObjectNodeTree):
+ """Pigment"""
+
+ bl_idname = "PovrayPigmentNode"
+ bl_label = "Color"
+ bl_icon = "SHADING_SOLID"
+
+ def init(self, context):
+
+ color = self.inputs.new("PovraySocketColor", "Color")
+ color.default_value = (1, 1, 1)
+ pov_filter = self.inputs.new("PovraySocketFloat_0_1", "Filter")
+ transmit = self.inputs.new("PovraySocketFloat_0_1", "Transmit")
+ self.outputs.new("NodeSocketColor", "Pigment")
+
+ def draw_label(self):
+ return "Color"
+
+
+class PovrayColorImageNode(Node, nodes_properties.ObjectNodeTree):
+ """ColorImage"""
+
+ bl_idname = "PovrayColorImageNode"
+ bl_label = "Image map"
+
+ map_type: bpy.props.EnumProperty(
+ name="Map type",
+ description="",
+ items=(
+ ("uv_mapping", "UV", ""),
+ ("0", "Planar", "Default planar mapping"),
+ ("1", "Spherical", "Spherical mapping"),
+ ("2", "Cylindrical", "Cylindrical mapping"),
+ ("5", "Torroidal", "Torus or donut shaped mapping"),
+ ),
+ default="0",
+ )
+ image: StringProperty(maxlen=1024) # , subtype="FILE_PATH"
+ interpolate: EnumProperty(
+ name="Interpolate",
+ description="Adding the interpolate keyword can smooth the jagged look of a bitmap",
+ items=(
+ ("2", "Bilinear", "Gives bilinear interpolation"),
+ ("4", "Normalized", "Gives normalized distance"),
+ ),
+ default="2",
+ )
+ premultiplied: BoolProperty(default=False)
+ once: BoolProperty(description="Not to repeat", default=False)
+
+ def init(self, context):
+
+ gamma = self.inputs.new("PovraySocketFloat_000001_10", "Gamma")
+ gamma.default_value = 2.0
+ transmit = self.inputs.new("PovraySocketFloat_0_1", "Transmit")
+ pov_filter = self.inputs.new("PovraySocketFloat_0_1", "Filter")
+ mapping = self.inputs.new("NodeSocketVector", "Mapping")
+ mapping.hide_value = True
+ transform = self.inputs.new("NodeSocketVector", "Transform")
+ transform.hide_value = True
+ modifier = self.inputs.new("NodeSocketVector", "Modifier")
+ modifier.hide_value = True
+
+ self.outputs.new("NodeSocketColor", "Pigment")
+
+ def draw_buttons(self, context, layout):
+
+ column = layout.column()
+ im = None
+ for image in bpy.data.images:
+ if image.name == self.image:
+ im = image
+ split = column.split(factor=0.8, align=True)
+ split.prop_search(self, "image", context.blend_data, "images", text="")
+ split.operator("pov.imageopen", text="", icon="FILEBROWSER")
+ if im is not None:
+ column.prop(im, "source", text="")
+ column.prop(self, "map_type", text="")
+ column.prop(self, "interpolate", text="")
+ row = column.row()
+ row.prop(self, "premultiplied", text="Premul")
+ row.prop(self, "once", text="Once")
+
+ def draw_buttons_ext(self, context, layout):
+
+ column = layout.column()
+ im = None
+ for image in bpy.data.images:
+ if image.name == self.image:
+ im = image
+ split = column.split(factor=0.8, align=True)
+ split.prop_search(self, "image", context.blend_data, "images", text="")
+ split.operator("pov.imageopen", text="", icon="FILEBROWSER")
+ if im is not None:
+ column.prop(im, "source", text="")
+ column.prop(self, "map_type", text="")
+ column.prop(self, "interpolate", text="")
+ row = column.row()
+ row.prop(self, "premultiplied", text="Premul")
+ row.prop(self, "once", text="Once")
+
+ def draw_label(self):
+ return "Image map"
+
+
+class PovrayBumpMapNode(Node, nodes_properties.ObjectNodeTree):
+ """BumpMap"""
+
+ bl_idname = "PovrayBumpMapNode"
+ bl_label = "Bump map"
+ bl_icon = "TEXTURE"
+
+ map_type: bpy.props.EnumProperty(
+ name="Map type",
+ description="",
+ items=(
+ ("uv_mapping", "UV", ""),
+ ("0", "Planar", "Default planar mapping"),
+ ("1", "Spherical", "Spherical mapping"),
+ ("2", "Cylindrical", "Cylindrical mapping"),
+ ("5", "Torroidal", "Torus or donut shaped mapping"),
+ ),
+ default="0",
+ )
+ image: StringProperty(maxlen=1024) # , subtype="FILE_PATH"
+ interpolate: EnumProperty(
+ name="Interpolate",
+ description="Adding the interpolate keyword can smooth the jagged look of a bitmap",
+ items=(
+ ("2", "Bilinear", "Gives bilinear interpolation"),
+ ("4", "Normalized", "Gives normalized distance"),
+ ),
+ default="2",
+ )
+ once: BoolProperty(description="Not to repeat", default=False)
+
+ def init(self, context):
+
+ self.inputs.new("PovraySocketFloat_0_10", "Normal")
+ mapping = self.inputs.new("NodeSocketVector", "Mapping")
+ mapping.hide_value = True
+ transform = self.inputs.new("NodeSocketVector", "Transform")
+ transform.hide_value = True
+ modifier = self.inputs.new("NodeSocketVector", "Modifier")
+ modifier.hide_value = True
+
+ normal = self.outputs.new("NodeSocketFloat", "Normal")
+ normal.hide_value = True
+
+ def draw_buttons(self, context, layout):
+
+ column = layout.column()
+ im = None
+ for image in bpy.data.images:
+ if image.name == self.image:
+ im = image
+ split = column.split(factor=0.8, align=True)
+ split.prop_search(self, "image", context.blend_data, "images", text="")
+ split.operator("pov.imageopen", text="", icon="FILEBROWSER")
+ if im is not None:
+ column.prop(im, "source", text="")
+ column.prop(self, "map_type", text="")
+ column.prop(self, "interpolate", text="")
+ column.prop(self, "once", text="Once")
+
+ def draw_buttons_ext(self, context, layout):
+
+ column = layout.column()
+ im = None
+ for image in bpy.data.images:
+ if image.name == self.image:
+ im = image
+ split = column.split(factor=0.8, align=True)
+ split.prop_search(self, "image", context.blend_data, "images", text="")
+ split.operator("pov.imageopen", text="", icon="FILEBROWSER")
+ if im is not None:
+ column.prop(im, "source", text="")
+ column.prop(self, "map_type", text="")
+ column.prop(self, "interpolate", text="")
+ column.prop(self, "once", text="Once")
+
+ def draw_label(self):
+ return "Bump Map"
+
+
+class PovrayImagePatternNode(Node, nodes_properties.ObjectNodeTree):
+ """ImagePattern"""
+
+ bl_idname = "PovrayImagePatternNode"
+ bl_label = "Image pattern"
+ bl_icon = "NODE_TEXTURE"
+
+ map_type: bpy.props.EnumProperty(
+ name="Map type",
+ description="",
+ items=(
+ ("uv_mapping", "UV", ""),
+ ("0", "Planar", "Default planar mapping"),
+ ("1", "Spherical", "Spherical mapping"),
+ ("2", "Cylindrical", "Cylindrical mapping"),
+ ("5", "Torroidal", "Torus or donut shaped mapping"),
+ ),
+ default="0",
+ )
+ image: StringProperty(maxlen=1024) # , subtype="FILE_PATH"
+ interpolate: EnumProperty(
+ name="Interpolate",
+ description="Adding the interpolate keyword can smooth the jagged look of a bitmap",
+ items=(
+ ("2", "Bilinear", "Gives bilinear interpolation"),
+ ("4", "Normalized", "Gives normalized distance"),
+ ),
+ default="2",
+ )
+ premultiplied: BoolProperty(default=False)
+ once: BoolProperty(description="Not to repeat", default=False)
+ use_alpha: BoolProperty(default=True)
+
+ def init(self, context):
+
+ gamma = self.inputs.new("PovraySocketFloat_000001_10", "Gamma")
+ gamma.default_value = 2.0
+
+ self.outputs.new("PovraySocketPattern", "Pattern")
+
+ def draw_buttons(self, context, layout):
+
+ column = layout.column()
+ im = None
+ for image in bpy.data.images:
+ if image.name == self.image:
+ im = image
+ split = column.split(factor=0.8, align=True)
+ split.prop_search(self, "image", context.blend_data, "images", text="")
+ split.operator("pov.imageopen", text="", icon="FILEBROWSER")
+ if im is not None:
+ column.prop(im, "source", text="")
+ column.prop(self, "map_type", text="")
+ column.prop(self, "interpolate", text="")
+ row = column.row()
+ row.prop(self, "premultiplied", text="Premul")
+ row.prop(self, "once", text="Once")
+ column.prop(self, "use_alpha", text="Use alpha")
+
+ def draw_buttons_ext(self, context, layout):
+
+ column = layout.column()
+ im = None
+ for image in bpy.data.images:
+ if image.name == self.image:
+ im = image
+ split = column.split(factor=0.8, align=True)
+ split.prop_search(self, "image", context.blend_data, "images", text="")
+ split.operator("pov.imageopen", text="", icon="FILEBROWSER")
+ if im is not None:
+ column.prop(im, "source", text="")
+ column.prop(self, "map_type", text="")
+ column.prop(self, "interpolate", text="")
+ row = column.row()
+ row.prop(self, "premultiplied", text="Premul")
+ row.prop(self, "once", text="Once")
+
+ def draw_label(self):
+ return "Image pattern"
+
+
+class ShaderPatternNode(Node, nodes_properties.ObjectNodeTree):
+ """Pattern"""
+
+ bl_idname = "ShaderPatternNode"
+ bl_label = "Other patterns"
+
+ pattern: EnumProperty(
+ name="Pattern",
+ description="Agate, Crackle, Gradient, Pavement, Spiral, Tiling",
+ items=(
+ ("agate", "Agate", ""),
+ ("crackle", "Crackle", ""),
+ ("gradient", "Gradient", ""),
+ ("pavement", "Pavement", ""),
+ ("spiral1", "Spiral 1", ""),
+ ("spiral2", "Spiral 2", ""),
+ ("tiling", "Tiling", ""),
+ ),
+ default="agate",
+ )
+
+ agate_turb: FloatProperty(
+ name="Agate turb", description="Agate turbulence", min=0.0, max=100.0, default=0.5
+ )
+
+ crackle_form_x: FloatProperty(
+ name="X", description="Form vector X", min=-150.0, max=150.0, default=-1
+ )
+
+ crackle_form_y: FloatProperty(
+ name="Y", description="Form vector Y", min=-150.0, max=150.0, default=1
+ )
+
+ crackle_form_z: FloatProperty(
+ name="Z", description="Form vector Z", min=-150.0, max=150.0, default=0
+ )
+
+ crackle_metric: FloatProperty(
+ name="Metric", description="Crackle metric", min=0.0, max=150.0, default=1
+ )
+
+ crackle_solid: BoolProperty(name="Solid", description="Crackle solid", default=False)
+
+ spiral_arms: FloatProperty(name="Number", description="", min=0.0, max=256.0, default=2.0)
+
+ tiling_number: IntProperty(name="Number", description="", min=1, max=27, default=1)
+
+ gradient_orient: EnumProperty(
+ name="Orient",
+ description="",
+ items=(("x", "X", ""), ("y", "Y", ""), ("z", "Z", "")),
+ default="x",
+ )
+
+ def init(self, context):
+
+ pat = self.outputs.new("PovraySocketPattern", "Pattern")
+
+ def draw_buttons(self, context, layout):
+
+ layout.prop(self, "pattern", text="")
+ if self.pattern == "agate":
+ layout.prop(self, "agate_turb")
+ if self.pattern == "crackle":
+ layout.prop(self, "crackle_metric")
+ layout.prop(self, "crackle_solid")
+ layout.label(text="Form:")
+ layout.prop(self, "crackle_form_x")
+ layout.prop(self, "crackle_form_y")
+ layout.prop(self, "crackle_form_z")
+ if self.pattern in {"spiral1", "spiral2"}:
+ layout.prop(self, "spiral_arms")
+ if self.pattern in {"tiling"}:
+ layout.prop(self, "tiling_number")
+ if self.pattern in {"gradient"}:
+ layout.prop(self, "gradient_orient")
+
+ def draw_buttons_ext(self, context, layout):
+ pass
+
+ def draw_label(self):
+ return "Other patterns"
+
+
+class ShaderTextureMapNode(Node, nodes_properties.ObjectNodeTree):
+ """Texture Map"""
+
+ bl_idname = "ShaderTextureMapNode"
+ bl_label = "Texture map"
+
+ brick_size_x: FloatProperty(name="X", description="", min=0.0000, max=1.0000, default=0.2500)
+
+ brick_size_y: FloatProperty(name="Y", description="", min=0.0000, max=1.0000, default=0.0525)
+
+ brick_size_z: FloatProperty(name="Z", description="", min=0.0000, max=1.0000, default=0.1250)
+
+ brick_mortar: FloatProperty(
+ name="Mortar", description="Mortar", min=0.000, max=1.500, default=0.01
+ )
+
+ def init(self, context):
+ mat = bpy.context.object.active_material
+ self.inputs.new("PovraySocketPattern", "")
+ color = self.inputs.new("NodeSocketColor", "Color ramp")
+ color.hide_value = True
+ for i in range(4):
+ transform = self.inputs.new("PovraySocketTransform", "Transform")
+ transform.hide_value = True
+ number = mat.pov.inputs_number
+ for i in range(number):
+ self.inputs.new("PovraySocketTexture", "%s" % i)
+
+ self.outputs.new("PovraySocketTexture", "Texture")
+
+ def draw_buttons(self, context, layout):
+
+ if self.inputs[0].default_value == "brick":
+ layout.prop(self, "brick_mortar")
+ layout.label(text="Brick size:")
+ layout.prop(self, "brick_size_x")
+ layout.prop(self, "brick_size_y")
+ layout.prop(self, "brick_size_z")
+
+ def draw_buttons_ext(self, context, layout):
+
+ if self.inputs[0].default_value == "brick":
+ layout.prop(self, "brick_mortar")
+ layout.label(text="Brick size:")
+ layout.prop(self, "brick_size_x")
+ layout.prop(self, "brick_size_y")
+ layout.prop(self, "brick_size_z")
+
+ def draw_label(self):
+ return "Texture map"
+
+
+class ShaderNormalMapNode(Node, nodes_properties.ObjectNodeTree):
+ """Normal Map"""
+
+ bl_idname = "ShaderNormalMapNode"
+ bl_label = "Normal map"
+
+ brick_size_x: FloatProperty(name="X", description="", min=0.0000, max=1.0000, default=0.2500)
+
+ brick_size_y: FloatProperty(name="Y", description="", min=0.0000, max=1.0000, default=0.0525)
+
+ brick_size_z: FloatProperty(name="Z", description="", min=0.0000, max=1.0000, default=0.1250)
+
+ brick_mortar: FloatProperty(
+ name="Mortar", description="Mortar", min=0.000, max=1.500, default=0.01
+ )
+
+ def init(self, context):
+ self.inputs.new("PovraySocketPattern", "")
+ normal = self.inputs.new("PovraySocketFloat_10", "Normal")
+ slope = self.inputs.new("PovraySocketMap", "Slope map")
+ for i in range(4):
+ transform = self.inputs.new("PovraySocketTransform", "Transform")
+ transform.hide_value = True
+ self.outputs.new("PovraySocketNormal", "Normal")
+
+ def draw_buttons(self, context, layout):
+ # for i, inp in enumerate(self.inputs):
+
+ if self.inputs[0].default_value == "brick":
+ layout.prop(self, "brick_mortar")
+ layout.label(text="Brick size:")
+ layout.prop(self, "brick_size_x")
+ layout.prop(self, "brick_size_y")
+ layout.prop(self, "brick_size_z")
+
+ def draw_buttons_ext(self, context, layout):
+
+ if self.inputs[0].default_value == "brick":
+ layout.prop(self, "brick_mortar")
+ layout.label(text="Brick size:")
+ layout.prop(self, "brick_size_x")
+ layout.prop(self, "brick_size_y")
+ layout.prop(self, "brick_size_z")
+
+ def draw_label(self):
+ return "Normal map"
+
+
+class ShaderNormalMapEntryNode(Node, nodes_properties.ObjectNodeTree):
+ """Normal Map Entry"""
+
+ bl_idname = "ShaderNormalMapEntryNode"
+ bl_label = "Normal map entry"
+
+ def init(self, context):
+ self.inputs.new("PovraySocketFloat_0_1", "Stop")
+ self.inputs.new("PovraySocketFloat_0_1", "Gray")
+
+ def draw_label(self):
+ return "Normal map entry"
+
+
+class IsoPropsNode(Node, CompositorNodeTree):
+ """ISO Props"""
+
+ bl_idname = "IsoPropsNode"
+ bl_label = "Iso"
+ node_label: StringProperty(maxlen=1024)
+
+ def init(self, context):
+ ob = bpy.context.object
+ self.node_label = ob.name
+ text_name = ob.pov.function_text
+ if text_name:
+ text = bpy.data.texts[text_name]
+ for line in text.lines:
+ split = line.body.split()
+ if split[0] == "#declare":
+ socket = self.inputs.new("NodeSocketFloat", "%s" % split[1])
+ value = split[3].split(";")
+ value = value[0]
+ socket.default_value = float(value)
+
+ def draw_label(self):
+ return self.node_label
+
+
+class PovrayFogNode(Node, CompositorNodeTree):
+ """Fog settings"""
+
+ bl_idname = "PovrayFogNode"
+ bl_label = "Fog"
+
+ def init(self, context):
+ color = self.inputs.new("NodeSocketColor", "Color")
+ color.default_value = (0.7, 0.7, 0.7, 0.25)
+ self.inputs.new("PovraySocketFloat_0_1", "Filter")
+ distance = self.inputs.new("NodeSocketInt", "Distance")
+ distance.default_value = 150
+ self.inputs.new("NodeSocketBool", "Ground")
+ fog_offset = self.inputs.new("NodeSocketFloat", "Offset")
+ fog_alt = self.inputs.new("NodeSocketFloat", "Altitude")
+ turb = self.inputs.new("NodeSocketVector", "Turbulence")
+ turb_depth = self.inputs.new("PovraySocketFloat_0_10", "Depth")
+ turb_depth.default_value = 0.5
+ octaves = self.inputs.new("PovraySocketInt_1_9", "Octaves")
+ octaves.default_value = 5
+ lambdat = self.inputs.new("PovraySocketFloat_0_10", "Lambda")
+ lambdat.default_value = 1.25
+ omega = self.inputs.new("PovraySocketFloat_0_10", "Omega")
+ omega.default_value = 0.35
+ translate = self.inputs.new("NodeSocketVector", "Translate")
+ rotate = self.inputs.new("NodeSocketVector", "Rotate")
+ scale = self.inputs.new("NodeSocketVector", "Scale")
+ scale.default_value = (1, 1, 1)
+
+ def draw_label(self):
+ return "Fog"
+
+
+class PovraySlopeNode(Node, TextureNodeTree):
+ """Output"""
+
+ bl_idname = "PovraySlopeNode"
+ bl_label = "Slope Map"
+
+ def init(self, context):
+ self.use_custom_color = True
+ self.color = (0, 0.2, 0)
+ slope = self.inputs.new("PovraySocketSlope", "0")
+ slope = self.inputs.new("PovraySocketSlope", "1")
+ slopemap = self.outputs.new("PovraySocketMap", "Slope map")
+ slopemap.hide_value = True
+
+ def draw_buttons(self, context, layout):
+
+ layout.operator("pov.nodeinputadd")
+ row = layout.row()
+ row.label(text="Value")
+ row.label(text="Height")
+ row.label(text="Slope")
+
+ def draw_buttons_ext(self, context, layout):
+
+ layout.operator("pov.nodeinputadd")
+ row = layout.row()
+ row.label(text="Value")
+ row.label(text="Height")
+ row.label(text="Slope")
+
+ def draw_label(self):
+ return "Slope Map"
+
+
+# -------- Texture nodes
+class TextureOutputNode(Node, TextureNodeTree):
+ """Output"""
+
+ bl_idname = "TextureOutputNode"
+ bl_label = "Color Map"
+
+ def init(self, context):
+ tex = bpy.context.object.active_material.active_texture
+ num_sockets = int(tex.pov.density_lines / 32)
+ for i in range(num_sockets):
+ color = self.inputs.new("NodeSocketColor", "%s" % i)
+ color.hide_value = True
+
+ def draw_buttons(self, context, layout):
+
+ layout.label(text="Color Ramps:")
+
+ def draw_label(self):
+ return "Color Map"
+
+
+classes = (
+ PovrayOutputNode,
+ PovrayTextureNode,
+ PovrayFinishNode,
+ PovrayDiffuseNode,
+ PovrayPhongNode,
+ PovraySpecularNode,
+ PovrayMirrorNode,
+ PovrayAmbientNode,
+ PovrayIridescenceNode,
+ PovraySubsurfaceNode,
+ PovrayMappingNode,
+ PovrayMultiplyNode,
+ PovrayTransformNode,
+ PovrayValueNode,
+ PovrayModifierNode,
+ PovrayPigmentNode,
+ PovrayColorImageNode,
+ PovrayBumpMapNode,
+ PovrayImagePatternNode,
+ ShaderPatternNode,
+ ShaderTextureMapNode,
+ ShaderNormalMapNode,
+ ShaderNormalMapEntryNode,
+ IsoPropsNode,
+ PovrayFogNode,
+ PovraySlopeNode,
+ TextureOutputNode,
+)
+
+
+def register():
+ for cls in classes:
+ register_class(cls)
+
+
+def unregister():
+ for cls in reversed(classes):
+ unregister_class(cls)