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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Stockner <lukas.stockner@freenet.de>2015-12-29 16:42:49 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2016-01-02 01:25:37 +0300
commit5c682a901b2ae9acf656f19e5f9b470d957d71cc (patch)
tree18ffa9d0ed4164ce601c285c700642a26a3c6eb9 /intern/cycles/kernel
parent1991ee173865ed79a78b50afc3f7a46af472e9dd (diff)
Cycles: Add Saw option to the wave texture
This commit adds "Bands Saw" and "Rings Saw" to the options for the Wave texture node in Cycles, behaving similar to the Saw option in BI textures. Requested by @cekuhnen on BA. Reviewers: dingto, sergey Subscribers: cekuhnen Differential Revision: https://developer.blender.org/D1699
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r--intern/cycles/kernel/shaders/node_wave_texture.osl16
-rw-r--r--intern/cycles/kernel/svm/svm_types.h5
-rw-r--r--intern/cycles/kernel/svm/svm_wave.h15
3 files changed, 29 insertions, 7 deletions
diff --git a/intern/cycles/kernel/shaders/node_wave_texture.osl b/intern/cycles/kernel/shaders/node_wave_texture.osl
index 569f284cbac..beb2a9de112 100644
--- a/intern/cycles/kernel/shaders/node_wave_texture.osl
+++ b/intern/cycles/kernel/shaders/node_wave_texture.osl
@@ -19,7 +19,7 @@
/* Wave */
-float wave(point p, string type, float detail, float distortion, float dscale)
+float wave(point p, string type, string profile, float detail, float distortion, float dscale)
{
float n = 0.0;
@@ -33,13 +33,23 @@ float wave(point p, string type, float detail, float distortion, float dscale)
if (distortion != 0.0) {
n = n + (distortion * noise_turbulence(p * dscale, detail, 0));
}
- return 0.5 + 0.5 * sin(n);
+
+ if (profile == "Sine") {
+ return 0.5 + 0.5 * sin(n);
+ }
+ else {
+ /* Saw profile */
+ n /= M_2PI;
+ n -= (int) n;
+ return (n < 0.0)? n + 1.0: n;
+ }
}
shader node_wave_texture(
int use_mapping = 0,
matrix mapping = matrix(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
string Type = "Bands",
+ string Profile = "Sine",
float Scale = 5.0,
float Distortion = 0.0,
float Detail = 2.0,
@@ -53,7 +63,7 @@ shader node_wave_texture(
if (use_mapping)
p = transform(mapping, p);
- Fac = wave(p * Scale, Type, Detail, Distortion, DetailScale);
+ Fac = wave(p * Scale, Type, Profile, Detail, Distortion, DetailScale);
Color = Fac;
}
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index bf7e067616f..7df139103b7 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -293,6 +293,11 @@ typedef enum NodeWaveType {
NODE_WAVE_RINGS
} NodeWaveType;
+typedef enum NodeWaveProfiles {
+ NODE_WAVE_PROFILE_SIN,
+ NODE_WAVE_PROFILE_SAW,
+} NodeWaveProfile;
+
typedef enum NodeSkyType {
NODE_SKY_OLD,
NODE_SKY_NEW
diff --git a/intern/cycles/kernel/svm/svm_wave.h b/intern/cycles/kernel/svm/svm_wave.h
index 6eaddaf301c..6ce69458a03 100644
--- a/intern/cycles/kernel/svm/svm_wave.h
+++ b/intern/cycles/kernel/svm/svm_wave.h
@@ -18,7 +18,7 @@ CCL_NAMESPACE_BEGIN
/* Wave */
-ccl_device_noinline float svm_wave(NodeWaveType type, float3 p, float detail, float distortion, float dscale)
+ccl_device_noinline float svm_wave(NodeWaveType type, NodeWaveProfile profile, float3 p, float detail, float distortion, float dscale)
{
float n;
@@ -26,11 +26,18 @@ ccl_device_noinline float svm_wave(NodeWaveType type, float3 p, float detail, fl
n = (p.x + p.y + p.z) * 10.0f;
else /* NODE_WAVE_RINGS */
n = len(p) * 20.0f;
-
+
if(distortion != 0.0f)
n += distortion * noise_turbulence(p*dscale, detail, 0);
- return 0.5f + 0.5f * sinf(n);
+ if(profile == NODE_WAVE_PROFILE_SIN) {
+ return 0.5f + 0.5f * sinf(n);
+ }
+ else { /* NODE_WAVE_PROFILE_SAW */
+ n /= M_2PI_F;
+ n -= (int) n;
+ return (n < 0.0f)? n + 1.0f: n;
+ }
}
ccl_device void svm_node_tex_wave(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
@@ -49,7 +56,7 @@ ccl_device void svm_node_tex_wave(KernelGlobals *kg, ShaderData *sd, float *stac
float distortion = stack_load_float_default(stack, distortion_offset, node2.z);
float dscale = stack_load_float_default(stack, dscale_offset, node2.w);
- float f = svm_wave((NodeWaveType)type, co*scale, detail, distortion, dscale);
+ float f = svm_wave((NodeWaveType)type, (NodeWaveProfile)node.w, co*scale, detail, distortion, dscale);
if(stack_valid(fac_offset)) stack_store_float(stack, fac_offset, f);
if(stack_valid(color_offset)) stack_store_float3(stack, color_offset, make_float3(f, f, f));