This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/release/scripts/startup/nodes/function_nodes/noise.py

144 lines
4.4 KiB
Python

import bpy
import random
from bpy.props import *
from .. base import FunctionNode
from .. node_builder import NodeBuilder
class PerlinNoiseNode(bpy.types.Node, FunctionNode):
bl_idname = "fn_PerlinNoiseNode"
bl_label = "Perlin Noise"
def declaration(self, builder: NodeBuilder):
builder.fixed_input("position", "Position", "Vector")
builder.fixed_input("amplitude", "Amplitude", "Float", default=1)
builder.fixed_input("scale", "Scale", "Float", default=1)
builder.fixed_output("noise_1d", "Noise", "Float")
builder.fixed_output("noise_3d", "Noise", "Vector")
class RandomFloatNode(bpy.types.Node, FunctionNode):
bl_idname = "fn_RandomFloatNode"
bl_label = "Random Float"
node_seed: IntProperty(
name="Node Seed",
)
def init_props(self):
self.node_seed = new_node_seed()
def declaration(self, builder: NodeBuilder):
builder.fixed_input("min", "Min", "Float", default=0)
builder.fixed_input("max", "Max", "Float", default=1)
builder.fixed_input("seed", "Seed", "Integer")
builder.fixed_output("value", "Value", "Float")
def draw_advanced(self, layout):
layout.prop(self, "node_seed")
def duplicate(self, src_node):
self.node_seed = new_node_seed()
class RandomFloatsNode(bpy.types.Node, FunctionNode):
bl_idname = "fn_RandomFloatsNode"
bl_label = "Random Floats"
node_seed: IntProperty(
name="Node Seed",
)
def init_props(self):
self.node_seed = new_node_seed()
def declaration(self, builder: NodeBuilder):
builder.fixed_input("amount", "Amount", "Integer", default=10)
builder.fixed_input("min", "Min", "Float")
builder.fixed_input("max", "Max", "Float", default=1)
builder.fixed_input("seed", "Seed", "Integer")
builder.fixed_output("values", "Values", "Float List")
def draw_advanced(self, layout):
layout.prop(self, "node_seed")
def duplicate(self, src_node):
self.node_seed = new_node_seed()
random_vector_mode_items = [
("UNIFORM_IN_CUBE", "Uniform in Cube", "Generate a vector that is somewhere in the volume of a cube", "NONE", 0),
("UNIFORM_ON_SPHERE", "Uniform on Sphere", "Generate a vector that is somewhere on the surface of a sphere", 1),
("UNIFORM_IN_SPHERE", "Uniform in Sphere", "Generate a vector that is somewhere in the volume of a sphere", 2),
]
class RandomVectorNode(bpy.types.Node, FunctionNode):
bl_idname = "fn_RandomVectorNode"
bl_label = "Random Vector"
node_seed: IntProperty(
name="Node Seed",
)
mode: EnumProperty(
name="Mode",
items=random_vector_mode_items,
default="UNIFORM_IN_CUBE",
)
use_list__factor: NodeBuilder.VectorizedProperty()
use_list__seed: NodeBuilder.VectorizedProperty()
def init_props(self):
self.node_seed = new_node_seed()
def declaration(self, builder: NodeBuilder):
builder.vectorized_input("factor", "use_list__factor", "Factor", "Factors", "Vector", default=(1, 1, 1))
builder.vectorized_input("seed", "use_list__seed", "Seed", "Seeds", "Integer")
builder.vectorized_output("vector", ["use_list__factor", "use_list__seed"], "Vector", "Vectors", "Vector")
def draw(self, layout):
layout.prop(self, "mode", text="")
def draw_advanced(self, layout):
layout.prop(self, "node_seed")
def duplicate(self, src_node):
self.node_seed = new_node_seed()
class RandomVectorsNode(bpy.types.Node, FunctionNode):
bl_idname = "fn_RandomVectorsNode"
bl_label = "Random Vectors"
node_seed: IntProperty(
name="Node Seed",
)
mode: EnumProperty(
name="Mode",
items=random_vector_mode_items,
default="UNIFORM_IN_CUBE",
)
def init_props(self):
self.node_seed = new_node_seed()
def declaration(self, builder: NodeBuilder):
builder.fixed_input("amount", "Amount", "Integer", default=10)
builder.fixed_input("factor", "Factor", "Vector", default=(1, 1, 1))
builder.fixed_input("seed", "Seed", "Integer")
builder.fixed_output("vectors", "Vectors", "Vector List")
def draw(self, layout):
layout.prop(self, "mode", text="")
def draw_advanced(self, layout):
layout.prop(self, "node_seed")
def duplicate(self, src_node):
self.node_seed = new_node_seed()
def new_node_seed():
return random.randint(0, 10000)