diff options
-rw-r--r-- | intern/cycles/blender/blender_shader.cpp | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/shaders/node_wave_texture.osl | 16 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_types.h | 5 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_wave.h | 15 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 16 | ||||
-rw-r--r-- | intern/cycles/render/nodes.h | 5 | ||||
-rw-r--r-- | source/blender/editors/space_node/drawnode.c | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_node_types.h | 5 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_nodetree.c | 12 |
9 files changed, 66 insertions, 10 deletions
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index 2b4d0e4af9c..abf1fc25f7b 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -718,6 +718,7 @@ static ShaderNode *add_node(Scene *scene, BL::ShaderNodeTexWave b_wave_node(b_node); WaveTextureNode *wave = new WaveTextureNode(); wave->type = WaveTextureNode::type_enum[(int)b_wave_node.wave_type()]; + wave->profile = WaveTextureNode::profile_enum[(int)b_wave_node.wave_profile()]; get_tex_mapping(&wave->tex_mapping, b_wave_node.texture_mapping()); node = wave; } 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)); diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 92ade79781a..e35c4a9dd46 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -1073,12 +1073,24 @@ static ShaderEnum wave_type_init() return enm; } +static ShaderEnum wave_profile_init() +{ + ShaderEnum enm; + + enm.insert("Sine", NODE_WAVE_PROFILE_SIN); + enm.insert("Saw", NODE_WAVE_PROFILE_SAW); + + return enm; +} + ShaderEnum WaveTextureNode::type_enum = wave_type_init(); +ShaderEnum WaveTextureNode::profile_enum = wave_profile_init(); WaveTextureNode::WaveTextureNode() : TextureNode("wave_texture") { type = ustring("Bands"); + profile = ustring("Sine"); add_input("Scale", SHADER_SOCKET_FLOAT, 1.0f); add_input("Distortion", SHADER_SOCKET_FLOAT, 0.0f); @@ -1120,7 +1132,8 @@ void WaveTextureNode::compile(SVMCompiler& compiler) compiler.add_node(NODE_TEX_WAVE, compiler.encode_uchar4(type_enum[type], color_out->stack_offset, fac_out->stack_offset, dscale_in->stack_offset), - compiler.encode_uchar4(vector_offset, scale_in->stack_offset, detail_in->stack_offset, distortion_in->stack_offset)); + compiler.encode_uchar4(vector_offset, scale_in->stack_offset, detail_in->stack_offset, distortion_in->stack_offset), + profile_enum[profile]); compiler.add_node( __float_as_int(scale_in->value.x), @@ -1137,6 +1150,7 @@ void WaveTextureNode::compile(OSLCompiler& compiler) tex_mapping.compile(compiler); compiler.parameter("Type", type); + compiler.parameter("Profile", profile); compiler.add(this, "node_wave_texture"); } diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 67943775b92..cede4205a6a 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -267,12 +267,15 @@ public: virtual int get_group() { return NODE_GROUP_LEVEL_2; } ustring type; + ustring profile; static ShaderEnum type_enum; + static ShaderEnum profile_enum; virtual bool equals(const ShaderNode *other) { const WaveTextureNode *wave_node = (const WaveTextureNode*)other; return TextureNode::equals(other) && - type == wave_node->type; + type == wave_node->type && + profile == wave_node->profile; } }; diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c index 603db9564cf..50e31ffca64 100644 --- a/source/blender/editors/space_node/drawnode.c +++ b/source/blender/editors/space_node/drawnode.c @@ -939,6 +939,7 @@ static void node_shader_buts_tex_brick(uiLayout *layout, bContext *UNUSED(C), Po static void node_shader_buts_tex_wave(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) { uiItemR(layout, ptr, "wave_type", 0, "", ICON_NONE); + uiItemR(layout, ptr, "wave_profile", 0, "", ICON_NONE); } static void node_shader_buts_tex_musgrave(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 86713d7dcc8..7aec437b62b 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -778,7 +778,7 @@ typedef struct NodeTexMusgrave { typedef struct NodeTexWave { NodeTexBase base; int wave_type; - int pad; + int wave_profile; } NodeTexWave; typedef struct NodeTexMagic { @@ -972,6 +972,9 @@ typedef struct NodeSunBeams { #define SHD_WAVE_BANDS 0 #define SHD_WAVE_RINGS 1 +#define SHD_WAVE_PROFILE_SIN 0 +#define SHD_WAVE_PROFILE_SAW 1 + /* sky texture */ #define SHD_SKY_OLD 0 #define SHD_SKY_NEW 1 diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index c10fe52bb29..984ecbe96ac 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -3858,6 +3858,12 @@ static void def_sh_tex_wave(StructRNA *srna) {0, NULL, 0, NULL, NULL} }; + static EnumPropertyItem prop_wave_profile_items[] = { + {SHD_WAVE_PROFILE_SIN, "SIN", 0, "Sine", "Use a standard sine profile"}, + {SHD_WAVE_PROFILE_SAW, "SAW", 0, "Saw", "Use a sawtooth profile"}, + {0, NULL, 0, NULL, NULL} + }; + PropertyRNA *prop; RNA_def_struct_sdna_from(srna, "NodeTexWave", "storage"); @@ -3868,6 +3874,12 @@ static void def_sh_tex_wave(StructRNA *srna) RNA_def_property_enum_items(prop, prop_wave_type_items); RNA_def_property_ui_text(prop, "Wave Type", ""); RNA_def_property_update(prop, 0, "rna_Node_update"); + + prop = RNA_def_property(srna, "wave_profile", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "wave_profile"); + RNA_def_property_enum_items(prop, prop_wave_profile_items); + RNA_def_property_ui_text(prop, "Wave Profile", ""); + RNA_def_property_update(prop, 0, "rna_Node_update"); } static void def_sh_tex_coord(StructRNA *srna) |