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

math.py « function_nodes « nodes « startup « scripts « release - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b8c3e79f526288b9005aead82b1346f0e5087ae6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import bpy
from bpy.props import *
from .. base import FunctionNode
from .. node_builder import NodeBuilder

def create_variadic_math_node(data_type, idname, label):
    class MathNode(bpy.types.Node, FunctionNode):
        bl_idname = idname
        bl_label = label

        variadic: NodeBuilder.BaseListVariadicProperty()

        def declaration(self, builder: NodeBuilder):
            builder.base_list_variadic_input("inputs", "variadic", data_type)

            if NodeBuilder.BaseListVariadicPropertyHasList(self.variadic):
                builder.fixed_output("result", "Result", data_type + " List")
            else:
                builder.fixed_output("result", "Result", data_type)

    return MathNode

def create_single_type_two_inputs_math_node(data_type, idname, label):
    return create_two_inputs_math_node(data_type, data_type, data_type, idname, label)

def create_two_inputs_math_node(input_type1, input_type2, output_type, idname, label):
    class MathNode(bpy.types.Node, FunctionNode):
        bl_idname = idname
        bl_label = label

        use_list__a: NodeBuilder.VectorizedProperty()
        use_list__b: NodeBuilder.VectorizedProperty()

        def declaration(self, builder: NodeBuilder):
            builder.vectorized_input("a", "use_list__a", "A", "A", input_type1)
            builder.vectorized_input("b", "use_list__b", "B", "B", input_type2)
            builder.vectorized_output("result", ["use_list__a", "use_list__b"], "Result", "Result", output_type)

    return MathNode

def create_single_input_math_node(input_type, output_type, idname, label):

    class MathNode(bpy.types.Node, FunctionNode):
        bl_idname = idname
        bl_label = label

        use_list: NodeBuilder.VectorizedProperty()

        def declaration(self, builder: NodeBuilder):
            builder.vectorized_input("input", "use_list", "Value", "Values", input_type)
            builder.vectorized_output("output", ["use_list"], "Result", "Result", output_type)

    return MathNode

AddFloatsNode = create_variadic_math_node("Float", "fn_AddFloatsNode", "Add Floats")
MultiplyFloatsNode = create_variadic_math_node("Float", "fn_MultiplyFloatsNode", "Multiply Floats")
MinimumFloatsNode = create_variadic_math_node("Float", "fn_MinimumFloatsNode", "Minimum Floats")
MaximumFloatsNode = create_variadic_math_node("Float", "fn_MaximumFloatsNode", "Maximum Floats")

SubtractFloatsNode = create_single_type_two_inputs_math_node("Float", "fn_SubtractFloatsNode", "Subtract Floats")
DivideFloatsNode = create_single_type_two_inputs_math_node("Float", "fn_DivideFloatsNode", "Divide Floats")
PowerFloatsNode = create_single_type_two_inputs_math_node("Float", "fn_PowerFloatsNode", "Power Floats")

SqrtFloatNode = create_single_input_math_node("Float", "Float", "fn_SqrtFloatNode", "Sqrt Float")
AbsFloatNode = create_single_input_math_node("Float", "Float", "fn_AbsoluteFloatNode", "Absolute Float")
SineFloatNode = create_single_input_math_node("Float", "Float", "fn_SineFloatNode", "Sine")
CosineFloatNode = create_single_input_math_node("Float", "Float", "fn_CosineFloatNode", "Cosine")

CeilFloatNode = create_single_input_math_node("Float", "Float", "fn_CeilFloatNode", "Ceil Float")
FloorFloatNode = create_single_input_math_node("Float", "Float", "fn_FloorFloatNode", "Floor Float")

AddVectorsNode = create_variadic_math_node("Vector", "fn_AddVectorsNode", "Add Vectors")
SubtractVectorsNode = create_single_type_two_inputs_math_node("Vector", "fn_SubtractVectorsNode", "Subtract Vectors")
MultiplyVectorsNode = create_variadic_math_node("Vector", "fn_MultiplyVectorsNode", "Multiply Vectors")
DivideVectorsNode = create_single_type_two_inputs_math_node("Vector", "fn_DivideVectorsNode", "Divide Vectors")
MultiplyVectorWithFloatNode = create_two_inputs_math_node("Vector", "Float", "Vector", "fn_MultiplyVectorWithFloatNode", "Multiply Vector with Float")

VectorCrossProductNode = create_single_type_two_inputs_math_node("Vector", "fn_VectorCrossProductNode", "Cross Product")
VectorReflectNode = create_single_type_two_inputs_math_node("Vector", "fn_ReflectVectorNode", "Reflect Vector")
VectorProjectNode = create_single_type_two_inputs_math_node("Vector", "fn_ProjectVectorNode", "Project Vector")
VectorDotProductNode = create_two_inputs_math_node("Vector", "Vector", "Float", "fn_VectorDotProductNode", "Dot Product")
VectorDistanceNode = create_two_inputs_math_node("Vector", "Vector", "Float", "fn_VectorDistanceNode", "Vector Distance")
NormalizeVectorNode = create_single_input_math_node("Vector", "Vector", "fn_NormalizeVectorNode", "Normalize Vector")
VectorLengthNode = create_single_input_math_node("Vector", "Float", "fn_VectorLengthNode", "Vector Length")

BooleanAndNode = create_variadic_math_node("Boolean", "fn_BooleanAndNode", "And")
BooleanOrNode = create_variadic_math_node("Boolean", "fn_BooleanOrNode", "Or")
BooleanNotNode = create_single_input_math_node("Boolean", "Boolean", "fn_BooleanNotNode", "Not")

LessThanFloatNode = create_two_inputs_math_node("Float", "Float", "Boolean", "fn_LessThanFloatNode", "Less Than Float")
GreaterThanFloatNode = create_two_inputs_math_node("Float", "Float", "Boolean", "fn_GreaterThanFloatNode", "Greater Than Float")

class MapRangeNode(bpy.types.Node, FunctionNode):
    bl_idname = "fn_MapRangeNode"
    bl_label = "Map Range"

    clamp: BoolProperty(
        name="Clamp",
        default=True,
    )

    use_list__value: NodeBuilder.VectorizedProperty()
    use_list__from_min: NodeBuilder.VectorizedProperty()
    use_list__from_max: NodeBuilder.VectorizedProperty()
    use_list__to_min: NodeBuilder.VectorizedProperty()
    use_list__to_max: NodeBuilder.VectorizedProperty()

    def declaration(self, builder: NodeBuilder):
        builder.vectorized_input("value", "use_list__value", "Value", "Values", "Float")
        builder.vectorized_input("from_min", "use_list__from_min", "From Min", "From Min", "Float")
        builder.vectorized_input("from_max", "use_list__from_max", "From Max", "From Max", "Float")
        builder.vectorized_input("to_min", "use_list__to_min", "To Min", "To Min", "Float")
        builder.vectorized_input("to_max", "use_list__to_max", "To Max", "To Max", "Float")
        builder.vectorized_output("value", [
            "use_list__value", "use_list__from_min", "use_list__from_max",
            "use_list__to_min", "use_list__to_max"], "Value", "Values", "Float")

    def draw(self, layout):
        layout.prop(self, "clamp")

class FloatClampNode(bpy.types.Node, FunctionNode):
    bl_idname = "fn_FloatClampNode"
    bl_label = "Clamp"

    def declaration(self, builder: NodeBuilder):
        builder.fixed_input("value", "Value", "Float")
        builder.fixed_input("min", "Min", "Float", default=0)
        builder.fixed_input("max", "Max", "Float", default=1)
        builder.fixed_output("value", "Value", "Float")