uv_texture_atlas/bake to vcols: moved to contrib: update class names: T63750
[blender-addons-contrib.git] / amaranth / node_editor / normal_node.py
1 #  This program is free software; you can redistribute it and/or
2 #  modify it under the terms of the GNU General Public License
3 #  as published by the Free Software Foundation; either version 2
4 #  of the License, or (at your option) any later version.
5 #
6 #  This program is distributed in the hope that it will be useful,
7 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
8 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9 #  GNU General Public License for more details.
10 #
11 #  You should have received a copy of the GNU General Public License
12 #  along with this program; if not, write to the Free Software Foundation,
13 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
14 """
15 Nodes: XYZ Sliders for Normal Node
16
17 Tweak the Normal node more accurately by using these sliders. Not the most
18 intuitive way to tweak, but it helps.
19
20 ProTip: Hit Shift+Drag for moving in very small steps.
21
22 Coded by Lukas Töenne. Thanks!
23 Find it on the Properties panel, when selecting a Normal node.
24 """
25
26
27 import bpy
28 from mathutils import Vector
29
30
31 # FEATURE: Normal Node Values, by Lukas Tönne
32 def init():
33     prop_normal_vector = bpy.props.FloatVectorProperty(
34         name="Normal", size=3, subtype='XYZ',
35         min=-1.0, max=1.0, soft_min=-1.0, soft_max=1.0,
36         get=normal_vector_get, set=normal_vector_set
37         )
38     bpy.types.ShaderNodeNormal.normal_vector = prop_normal_vector
39     bpy.types.CompositorNodeNormal.normal_vector = prop_normal_vector
40
41
42 def clear():
43     del bpy.types.ShaderNodeNormal.normal_vector
44     del bpy.types.CompositorNodeNormal.normal_vector
45
46
47 def normal_vector_get(self):
48     return self.outputs['Normal'].default_value
49
50
51 def normal_vector_set(self, values):
52     # default_value allows un-normalized values,
53     # do this here to prevent awkward results
54     values = Vector(values).normalized()
55     self.outputs['Normal'].default_value = values
56
57
58 def act_node(context):
59     try:
60         return context.active_node
61     except AttributeError:
62         return None
63
64
65 def ui_node_normal_values(self, context):
66
67     node = act_node(context)
68
69     if act_node:
70         if node and node.type == 'NORMAL':
71             self.layout.prop(node, "normal_vector", text="")
72
73 # // FEATURE: Normal Node Values, by Lukas Tönne
74
75
76 def register():
77     init()
78     bpy.types.NODE_PT_active_node_properties.append(ui_node_normal_values)
79
80
81 def unregister():
82     bpy.types.NODE_PT_active_node_properties.remove(ui_node_normal_values)
83     clear()