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
path: root/intern
diff options
context:
space:
mode:
authorWilliam Leeson <leesonw>2021-11-18 11:21:47 +0300
committerWilliam Leeson <william@blender.org>2021-11-18 11:31:29 +0300
commit8c0370ef7b8d2854ca6eac8f57c626bb3c4b2f2b (patch)
tree137d4a60095e3ecd870196cdf32c7760a50511f6 /intern
parenta182b05f07aecc0ef48920512ba6f2685a5cc5c0 (diff)
Fix T93102: Principled hair shader stack was built incorrectly
stack_assign_if was used in the middle of creating the shader value blocks. Which caused stack variables to be inserted in the middle of the shader value data. This resulted in the shader node data no being in sequential order. This was also the case for the wave texture wave node. Reviewed By: brecht Maniphest Tasks: T93102 Differential Revision: https://developer.blender.org/D13262
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/scene/shader_nodes.cpp84
1 files changed, 48 insertions, 36 deletions
diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp
index 94c96d473b6..8a9ef56b0ae 100644
--- a/intern/cycles/scene/shader_nodes.cpp
+++ b/intern/cycles/scene/shader_nodes.cpp
@@ -1503,18 +1503,21 @@ void WaveTextureNode::compile(SVMCompiler &compiler)
int vector_offset = tex_mapping.compile_begin(compiler, vector_in);
+ int scale_ofs = compiler.stack_assign_if_linked(scale_in);
+ int distortion_ofs = compiler.stack_assign_if_linked(distortion_in);
+ int detail_ofs = compiler.stack_assign_if_linked(detail_in);
+ int dscale_ofs = compiler.stack_assign_if_linked(dscale_in);
+ int droughness_ofs = compiler.stack_assign_if_linked(droughness_in);
+ int phase_ofs = compiler.stack_assign_if_linked(phase_in);
+ int color_ofs = compiler.stack_assign_if_linked(color_out);
+ int fac_ofs = compiler.stack_assign_if_linked(fac_out);
+
compiler.add_node(NODE_TEX_WAVE,
compiler.encode_uchar4(wave_type, bands_direction, rings_direction, profile),
- compiler.encode_uchar4(vector_offset,
- compiler.stack_assign_if_linked(scale_in),
- compiler.stack_assign_if_linked(distortion_in)),
- compiler.encode_uchar4(compiler.stack_assign_if_linked(detail_in),
- compiler.stack_assign_if_linked(dscale_in),
- compiler.stack_assign_if_linked(droughness_in),
- compiler.stack_assign_if_linked(phase_in)));
+ compiler.encode_uchar4(vector_offset, scale_ofs, distortion_ofs),
+ compiler.encode_uchar4(detail_ofs, dscale_ofs, droughness_ofs, phase_ofs));
- compiler.add_node(compiler.encode_uchar4(compiler.stack_assign_if_linked(color_out),
- compiler.stack_assign_if_linked(fac_out)),
+ compiler.add_node(compiler.encode_uchar4(color_ofs, fac_ofs),
__float_as_int(scale),
__float_as_int(distortion),
__float_as_int(detail));
@@ -3572,45 +3575,54 @@ void PrincipledHairBsdfNode::compile(SVMCompiler &compiler)
int tint_ofs = compiler.stack_assign(input("Tint"));
int absorption_coefficient_ofs = compiler.stack_assign(input("Absorption Coefficient"));
+ int roughness_ofs = compiler.stack_assign_if_linked(roughness_in);
+ int radial_roughness_ofs = compiler.stack_assign_if_linked(radial_roughness_in);
+
+ int normal_ofs = compiler.stack_assign_if_linked(input("Normal"));
+ int offset_ofs = compiler.stack_assign_if_linked(offset_in);
+ int ior_ofs = compiler.stack_assign_if_linked(ior_in);
+
+ int coat_ofs = compiler.stack_assign_if_linked(coat_in);
+ int melanin_ofs = compiler.stack_assign_if_linked(melanin_in);
+ int melanin_redness_ofs = compiler.stack_assign_if_linked(melanin_redness_in);
+
ShaderInput *random_in = input("Random");
int attr_random = random_in->link ? SVM_STACK_INVALID :
compiler.attribute(ATTR_STD_CURVE_RANDOM);
+ int random_in_ofs = compiler.stack_assign_if_linked(random_in);
+ int random_color_ofs = compiler.stack_assign_if_linked(random_color_in);
+ int random_roughness_ofs = compiler.stack_assign_if_linked(random_roughness_in);
/* Encode all parameters into data nodes. */
- compiler.add_node(NODE_CLOSURE_BSDF,
- /* Socket IDs can be packed 4 at a time into a single data packet */
- compiler.encode_uchar4(closure,
- compiler.stack_assign_if_linked(roughness_in),
- compiler.stack_assign_if_linked(radial_roughness_in),
- compiler.closure_mix_weight_offset()),
- /* The rest are stored as unsigned integers */
- __float_as_uint(roughness),
- __float_as_uint(radial_roughness));
-
- compiler.add_node(compiler.stack_assign_if_linked(input("Normal")),
- compiler.encode_uchar4(compiler.stack_assign_if_linked(offset_in),
- compiler.stack_assign_if_linked(ior_in),
- color_ofs,
- parametrization),
+ /* node */
+ compiler.add_node(
+ NODE_CLOSURE_BSDF,
+ /* Socket IDs can be packed 4 at a time into a single data packet */
+ compiler.encode_uchar4(
+ closure, roughness_ofs, radial_roughness_ofs, compiler.closure_mix_weight_offset()),
+ /* The rest are stored as unsigned integers */
+ __float_as_uint(roughness),
+ __float_as_uint(radial_roughness));
+ /* data node */
+ compiler.add_node(normal_ofs,
+ compiler.encode_uchar4(offset_ofs, ior_ofs, color_ofs, parametrization),
__float_as_uint(offset),
__float_as_uint(ior));
-
- compiler.add_node(compiler.encode_uchar4(compiler.stack_assign_if_linked(coat_in),
- compiler.stack_assign_if_linked(melanin_in),
- compiler.stack_assign_if_linked(melanin_redness_in),
- absorption_coefficient_ofs),
+ /* data node 2 */
+ compiler.add_node(compiler.encode_uchar4(
+ coat_ofs, melanin_ofs, melanin_redness_ofs, absorption_coefficient_ofs),
__float_as_uint(coat),
__float_as_uint(melanin),
__float_as_uint(melanin_redness));
- compiler.add_node(compiler.encode_uchar4(tint_ofs,
- compiler.stack_assign_if_linked(random_in),
- compiler.stack_assign_if_linked(random_color_in),
- compiler.stack_assign_if_linked(random_roughness_in)),
- __float_as_uint(random),
- __float_as_uint(random_color),
- __float_as_uint(random_roughness));
+ /* data node 3 */
+ compiler.add_node(
+ compiler.encode_uchar4(tint_ofs, random_in_ofs, random_color_ofs, random_roughness_ofs),
+ __float_as_uint(random),
+ __float_as_uint(random_color),
+ __float_as_uint(random_roughness));
+ /* data node 4 */
compiler.add_node(
compiler.encode_uchar4(
SVM_STACK_INVALID, SVM_STACK_INVALID, SVM_STACK_INVALID, SVM_STACK_INVALID),