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:
Diffstat (limited to 'intern/cycles/render/nodes.cpp')
-rw-r--r--intern/cycles/render/nodes.cpp153
1 files changed, 118 insertions, 35 deletions
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 86f0f3127e9..a98352aa85a 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -146,19 +146,26 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
compiler.stack_assign(alpha_out);
if(slot != -1) {
- int srgb = (is_float || color_space != "Color")? 0: 1;
compiler.stack_assign(vector_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+ int srgb = (is_float || color_space != "Color")? 0: 1;
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
compiler.add_node(NODE_TEX_IMAGE,
slot,
compiler.encode_uchar4(
- vector_in->stack_offset,
+ vector_offset,
color_out->stack_offset,
alpha_out->stack_offset,
srgb));
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
else {
/* image not found */
@@ -183,7 +190,18 @@ void ImageTextureNode::compile(OSLCompiler& compiler)
/* Environment Texture */
+static ShaderEnum projection_init()
+{
+ ShaderEnum enm;
+
+ enm.insert("Equirectangular", 0);
+ enm.insert("Mirror Ball", 1);
+
+ return enm;
+}
+
ShaderEnum EnvironmentTextureNode::color_space_enum = color_space_init();
+ShaderEnum EnvironmentTextureNode::projection_enum = projection_init();
EnvironmentTextureNode::EnvironmentTextureNode()
: TextureNode("environment_texture")
@@ -193,6 +211,7 @@ EnvironmentTextureNode::EnvironmentTextureNode()
is_float = false;
filename = "";
color_space = ustring("Color");
+ projection = ustring("Equirectangular");
add_input("Vector", SHADER_SOCKET_VECTOR, ShaderInput::POSITION);
add_output("Color", SHADER_SOCKET_COLOR);
@@ -228,22 +247,29 @@ void EnvironmentTextureNode::compile(SVMCompiler& compiler)
compiler.stack_assign(color_out);
if(!alpha_out->links.empty())
compiler.stack_assign(alpha_out);
-
+
if(slot != -1) {
- int srgb = (is_float || color_space != "Color")? 0: 1;
-
compiler.stack_assign(vector_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+ int srgb = (is_float || color_space != "Color")? 0: 1;
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
compiler.add_node(NODE_TEX_ENVIRONMENT,
slot,
compiler.encode_uchar4(
- vector_in->stack_offset,
+ vector_offset,
color_out->stack_offset,
alpha_out->stack_offset,
- srgb));
+ srgb),
+ projection_enum[projection]);
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
else {
/* image not found */
@@ -351,11 +377,19 @@ void SkyTextureNode::compile(SVMCompiler& compiler)
if(vector_in->link)
compiler.stack_assign(vector_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
compiler.stack_assign(color_out);
- compiler.add_node(NODE_TEX_SKY, vector_in->stack_offset, color_out->stack_offset);
+ compiler.add_node(NODE_TEX_SKY, vector_offset, color_out->stack_offset);
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
void SkyTextureNode::compile(OSLCompiler& compiler)
@@ -402,8 +436,12 @@ void GradientTextureNode::compile(SVMCompiler& compiler)
if(vector_in->link) compiler.stack_assign(vector_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
if(!fac_out->links.empty())
compiler.stack_assign(fac_out);
@@ -411,7 +449,10 @@ void GradientTextureNode::compile(SVMCompiler& compiler)
compiler.stack_assign(color_out);
compiler.add_node(NODE_TEX_GRADIENT,
- compiler.encode_uchar4(type_enum[type], vector_in->stack_offset, fac_out->stack_offset, color_out->stack_offset));
+ compiler.encode_uchar4(type_enum[type], vector_offset, fac_out->stack_offset, color_out->stack_offset));
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
void GradientTextureNode::compile(OSLCompiler& compiler)
@@ -448,8 +489,12 @@ void NoiseTextureNode::compile(SVMCompiler& compiler)
if(detail_in->link) compiler.stack_assign(detail_in);
if(distortion_in->link) compiler.stack_assign(distortion_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
if(!fac_out->links.empty())
compiler.stack_assign(fac_out);
@@ -457,12 +502,15 @@ void NoiseTextureNode::compile(SVMCompiler& compiler)
compiler.stack_assign(color_out);
compiler.add_node(NODE_TEX_NOISE,
- compiler.encode_uchar4(vector_in->stack_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),
compiler.encode_uchar4(color_out->stack_offset, fac_out->stack_offset));
compiler.add_node(
__float_as_int(scale_in->value.x),
__float_as_int(detail_in->value.x),
__float_as_int(distortion_in->value.x));
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
void NoiseTextureNode::compile(OSLCompiler& compiler)
@@ -506,16 +554,23 @@ void VoronoiTextureNode::compile(SVMCompiler& compiler)
if(vector_in->link) compiler.stack_assign(vector_in);
if(scale_in->link) compiler.stack_assign(scale_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
compiler.stack_assign(color_out);
compiler.stack_assign(fac_out);
compiler.add_node(NODE_TEX_VORONOI,
coloring_enum[coloring],
- compiler.encode_uchar4(scale_in->stack_offset, vector_in->stack_offset, fac_out->stack_offset, color_out->stack_offset),
+ compiler.encode_uchar4(scale_in->stack_offset, vector_offset, fac_out->stack_offset, color_out->stack_offset),
__float_as_int(scale_in->value.x));
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
void VoronoiTextureNode::compile(OSLCompiler& compiler)
@@ -578,8 +633,12 @@ void MusgraveTextureNode::compile(SVMCompiler& compiler)
if(gain_in->link) compiler.stack_assign(gain_in);
if(scale_in->link) compiler.stack_assign(scale_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
if(!fac_out->links.empty())
compiler.stack_assign(fac_out);
@@ -587,7 +646,7 @@ void MusgraveTextureNode::compile(SVMCompiler& compiler)
compiler.stack_assign(color_out);
compiler.add_node(NODE_TEX_MUSGRAVE,
- compiler.encode_uchar4(type_enum[type], vector_in->stack_offset, color_out->stack_offset, fac_out->stack_offset),
+ compiler.encode_uchar4(type_enum[type], vector_offset, color_out->stack_offset, fac_out->stack_offset),
compiler.encode_uchar4(dimension_in->stack_offset, lacunarity_in->stack_offset, detail_in->stack_offset, offset_in->stack_offset),
compiler.encode_uchar4(gain_in->stack_offset, scale_in->stack_offset));
compiler.add_node(__float_as_int(dimension_in->value.x),
@@ -596,6 +655,9 @@ void MusgraveTextureNode::compile(SVMCompiler& compiler)
__float_as_int(offset_in->value.x));
compiler.add_node(__float_as_int(gain_in->value.x),
__float_as_int(scale_in->value.x));
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
void MusgraveTextureNode::compile(OSLCompiler& compiler)
@@ -650,8 +712,12 @@ void WaveTextureNode::compile(SVMCompiler& compiler)
if(dscale_in->link) compiler.stack_assign(dscale_in);
if(vector_in->link) compiler.stack_assign(vector_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
if(!fac_out->links.empty())
compiler.stack_assign(fac_out);
@@ -660,13 +726,16 @@ 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_in->stack_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));
compiler.add_node(
__float_as_int(scale_in->value.x),
__float_as_int(detail_in->value.x),
__float_as_int(distortion_in->value.x),
__float_as_int(dscale_in->value.x));
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
void WaveTextureNode::compile(OSLCompiler& compiler)
@@ -703,8 +772,12 @@ void MagicTextureNode::compile(SVMCompiler& compiler)
if(distortion_in->link) compiler.stack_assign(distortion_in);
if(scale_in->link) compiler.stack_assign(scale_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
if(!fac_out->links.empty())
compiler.stack_assign(fac_out);
@@ -713,10 +786,13 @@ void MagicTextureNode::compile(SVMCompiler& compiler)
compiler.add_node(NODE_TEX_MAGIC,
compiler.encode_uchar4(depth, color_out->stack_offset, fac_out->stack_offset),
- compiler.encode_uchar4(vector_in->stack_offset, scale_in->stack_offset, distortion_in->stack_offset));
+ compiler.encode_uchar4(vector_offset, scale_in->stack_offset, distortion_in->stack_offset));
compiler.add_node(
__float_as_int(scale_in->value.x),
__float_as_int(distortion_in->value.x));
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
void MagicTextureNode::compile(OSLCompiler& compiler)
@@ -754,8 +830,12 @@ void CheckerTextureNode::compile(SVMCompiler& compiler)
compiler.stack_assign(color2_in);
if(scale_in->link) compiler.stack_assign(scale_in);
- if(!tex_mapping.skip())
- tex_mapping.compile(compiler, vector_in->stack_offset, vector_in->stack_offset);
+ int vector_offset = vector_in->stack_offset;
+
+ if(!tex_mapping.skip()) {
+ vector_offset = compiler.stack_find_offset(SHADER_SOCKET_VECTOR);
+ tex_mapping.compile(compiler, vector_in->stack_offset, vector_offset);
+ }
if(!color_out->links.empty())
compiler.stack_assign(color_out);
@@ -763,9 +843,12 @@ void CheckerTextureNode::compile(SVMCompiler& compiler)
compiler.stack_assign(fac_out);
compiler.add_node(NODE_TEX_CHECKER,
- compiler.encode_uchar4(vector_in->stack_offset, color1_in->stack_offset, color2_in->stack_offset, scale_in->stack_offset),
+ compiler.encode_uchar4(vector_offset, color1_in->stack_offset, color2_in->stack_offset, scale_in->stack_offset),
compiler.encode_uchar4(color_out->stack_offset, fac_out->stack_offset),
__float_as_int(scale_in->value.x));
+
+ if(vector_offset != vector_in->stack_offset)
+ compiler.stack_clear_offset(vector_in->type, vector_offset);
}
void CheckerTextureNode::compile(OSLCompiler& compiler)