forked from bartvdbraak/blender
Added an 'angle' parameter to the Perlin Noise 1D and 2D geometry modifiers
to specify a displacement direction in degrees.
This commit is contained in:
parent
1c153b011d
commit
edde9f2666
@ -419,6 +419,46 @@ class SinusDisplacementShader(StrokeShader):
|
||||
n = n * self._amplitude * math.cos(distance / self._wavelength * 2 * math.pi + self._phase)
|
||||
v.setPoint(p + n)
|
||||
|
||||
class PerlinNoise1DShader(StrokeShader):
|
||||
def __init__(self, freq = 10, amp = 10, oct = 4, angle = 45, seed = -1):
|
||||
StrokeShader.__init__(self)
|
||||
self.__noise = Noise(seed)
|
||||
self.__freq = freq
|
||||
self.__amp = amp
|
||||
self.__oct = oct
|
||||
theta = pi * angle / 180.0
|
||||
self.__dir = Vector([cos(theta), sin(theta)])
|
||||
def getName(self):
|
||||
return "PerlinNoise1DShader"
|
||||
def shade(self, stroke):
|
||||
it = stroke.strokeVerticesBegin()
|
||||
while not it.isEnd():
|
||||
v = it.getObject()
|
||||
i = v.getProjectedX() + v.getProjectedY()
|
||||
nres = self.__noise.turbulence1(i, self.__freq, self.__amp, self.__oct)
|
||||
v.setPoint(v.getPoint() + nres * self.__dir)
|
||||
it.increment()
|
||||
|
||||
class PerlinNoise2DShader(StrokeShader):
|
||||
def __init__(self, freq = 10, amp = 10, oct = 4, angle = 45, seed = -1):
|
||||
StrokeShader.__init__(self)
|
||||
self.__noise = Noise(seed)
|
||||
self.__freq = freq
|
||||
self.__amp = amp
|
||||
self.__oct = oct
|
||||
theta = pi * angle / 180.0
|
||||
self.__dir = Vector([cos(theta), sin(theta)])
|
||||
def getName(self):
|
||||
return "PerlinNoise2DShader"
|
||||
def shade(self, stroke):
|
||||
it = stroke.strokeVerticesBegin()
|
||||
while not it.isEnd():
|
||||
v = it.getObject()
|
||||
vec = Vector([v.getProjectedX(), v.getProjectedY()])
|
||||
nres = self.__noise.turbulence2(vec, self.__freq, self.__amp, self.__oct)
|
||||
v.setPoint(v.getPoint() + nres * self.__dir)
|
||||
it.increment()
|
||||
|
||||
# Predicates and helper functions
|
||||
|
||||
class QuantitativeInvisibilityRangeUP1D(UnaryPredicate1D):
|
||||
@ -836,11 +876,11 @@ def process(layer_name, lineset_name):
|
||||
shaders_list.append(SpatialNoiseShader(
|
||||
m.amplitude, m.scale, m.octaves, m.smooth, m.pure_random))
|
||||
elif m.type == "PERLIN_NOISE_1D":
|
||||
shaders_list.append(pyPerlinNoise1DShader(
|
||||
m.frequency, m.amplitude, m.octaves, _seed.get(m.seed)))
|
||||
shaders_list.append(PerlinNoise1DShader(
|
||||
m.frequency, m.amplitude, m.octaves, m.angle, _seed.get(m.seed)))
|
||||
elif m.type == "PERLIN_NOISE_2D":
|
||||
shaders_list.append(pyPerlinNoise2DShader(
|
||||
m.frequency, m.amplitude, m.octaves, _seed.get(m.seed)))
|
||||
shaders_list.append(PerlinNoise2DShader(
|
||||
m.frequency, m.amplitude, m.octaves, m.angle, _seed.get(m.seed)))
|
||||
elif m.type == "BACKBONE_STRETCHER":
|
||||
shaders_list.append(BackboneStretcherShader(
|
||||
m.amount))
|
||||
|
@ -477,12 +477,14 @@ class RENDER_PT_freestyle_linestyle(RenderButtonsPanel, Panel):
|
||||
box.prop(modifier, "frequency")
|
||||
box.prop(modifier, "amplitude")
|
||||
box.prop(modifier, "octaves")
|
||||
box.prop(modifier, "angle")
|
||||
box.prop(modifier, "seed")
|
||||
|
||||
elif modifier.type == "PERLIN_NOISE_2D":
|
||||
box.prop(modifier, "frequency")
|
||||
box.prop(modifier, "amplitude")
|
||||
box.prop(modifier, "octaves")
|
||||
box.prop(modifier, "angle")
|
||||
box.prop(modifier, "seed")
|
||||
|
||||
elif modifier.type == "BACKBONE_STRETCHER":
|
||||
|
@ -403,11 +403,13 @@ int FRS_add_linestyle_geometry_modifier(FreestyleLineStyle *linestyle, int type)
|
||||
((LineStyleGeometryModifier_PerlinNoise1D *)m)->frequency = 10.0;
|
||||
((LineStyleGeometryModifier_PerlinNoise1D *)m)->amplitude = 10.0;
|
||||
((LineStyleGeometryModifier_PerlinNoise1D *)m)->octaves = 4;
|
||||
((LineStyleGeometryModifier_PerlinNoise1D *)m)->angle = 45.0;
|
||||
break;
|
||||
case LS_MODIFIER_PERLIN_NOISE_2D:
|
||||
((LineStyleGeometryModifier_PerlinNoise2D *)m)->frequency = 10.0;
|
||||
((LineStyleGeometryModifier_PerlinNoise2D *)m)->amplitude = 10.0;
|
||||
((LineStyleGeometryModifier_PerlinNoise2D *)m)->octaves = 4;
|
||||
((LineStyleGeometryModifier_PerlinNoise2D *)m)->angle = 45.0;
|
||||
break;
|
||||
case LS_MODIFIER_BACKBONE_STRETCHER:
|
||||
((LineStyleGeometryModifier_BackboneStretcher *)m)->amount = 10.0;
|
||||
|
@ -261,18 +261,20 @@ typedef struct LineStyleGeometryModifier_SpatialNoise {
|
||||
typedef struct LineStyleGeometryModifier_PerlinNoise1D {
|
||||
struct LineStyleModifier modifier;
|
||||
|
||||
float frequency, amplitude;
|
||||
float frequency, amplitude, angle;
|
||||
unsigned int octaves;
|
||||
int seed;
|
||||
int pad1;
|
||||
|
||||
} LineStyleGeometryModifier_PerlinNoise1D;
|
||||
|
||||
typedef struct LineStyleGeometryModifier_PerlinNoise2D {
|
||||
struct LineStyleModifier modifier;
|
||||
|
||||
float frequency, amplitude;
|
||||
float frequency, amplitude, angle;
|
||||
unsigned int octaves;
|
||||
int seed;
|
||||
int pad1;
|
||||
|
||||
} LineStyleGeometryModifier_PerlinNoise2D;
|
||||
|
||||
|
@ -578,6 +578,11 @@ static void rna_def_linestyle_modifiers(BlenderRNA *brna)
|
||||
RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the Perlin noise).");
|
||||
RNA_def_property_update(prop, NC_SCENE, NULL);
|
||||
|
||||
prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE);
|
||||
RNA_def_property_float_sdna(prop, NULL, "angle");
|
||||
RNA_def_property_ui_text(prop, "Angle", "Displacement direction in degrees.");
|
||||
RNA_def_property_update(prop, NC_SCENE, NULL);
|
||||
|
||||
prop= RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
|
||||
RNA_def_property_int_sdna(prop, NULL, "seed");
|
||||
RNA_def_property_ui_text(prop, "Seed", "Seed for random number generation. If negative, time is used as a seed instead.");
|
||||
@ -602,6 +607,11 @@ static void rna_def_linestyle_modifiers(BlenderRNA *brna)
|
||||
RNA_def_property_ui_text(prop, "Octaves", "Number of octaves (i.e., the amount of detail of the Perlin noise).");
|
||||
RNA_def_property_update(prop, NC_SCENE, NULL);
|
||||
|
||||
prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE);
|
||||
RNA_def_property_float_sdna(prop, NULL, "angle");
|
||||
RNA_def_property_ui_text(prop, "Angle", "Displacement direction in degrees.");
|
||||
RNA_def_property_update(prop, NC_SCENE, NULL);
|
||||
|
||||
prop= RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
|
||||
RNA_def_property_int_sdna(prop, NULL, "seed");
|
||||
RNA_def_property_ui_text(prop, "Seed", "Seed for random number generation. If negative, time is used as a seed instead.");
|
||||
|
Loading…
Reference in New Issue
Block a user