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:
authorBrecht Van Lommel <brecht@blender.org>2021-10-04 13:28:28 +0300
committerBrecht Van Lommel <brecht@blender.org>2021-10-04 14:58:37 +0300
commitfc4886a31426b6fe40982f5288c8d129a1ce3223 (patch)
tree6c3f7aadb787e5c4fbbc4c1b5423caf993f89f0d /intern
parent326bd76d3b6d75d34fa3a6313ff0db374446d4ab (diff)
Fix T91894: Cycles baking normal maps of transformed objects not working
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/kernel/geom/geom_shader_data.h2
-rw-r--r--intern/cycles/kernel/integrator/integrator_init_from_bake.h25
2 files changed, 23 insertions, 4 deletions
diff --git a/intern/cycles/kernel/geom/geom_shader_data.h b/intern/cycles/kernel/geom/geom_shader_data.h
index fb2cb5cb1ea..0e373c10086 100644
--- a/intern/cycles/kernel/geom/geom_shader_data.h
+++ b/intern/cycles/kernel/geom/geom_shader_data.h
@@ -103,7 +103,7 @@ ccl_device_inline void shader_setup_from_ray(const KernelGlobals *ccl_restrict k
sd->flag |= kernel_tex_fetch(__shaders, (sd->shader & SHADER_MASK)).flags;
- if (isect->object != OBJECT_NONE) {
+ if (!(sd->object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
/* instance transform */
object_normal_transform_auto(kg, sd, &sd->N);
object_normal_transform_auto(kg, sd, &sd->Ng);
diff --git a/intern/cycles/kernel/integrator/integrator_init_from_bake.h b/intern/cycles/kernel/integrator/integrator_init_from_bake.h
index 96db606cee1..6e4e1be55fa 100644
--- a/intern/cycles/kernel/integrator/integrator_init_from_bake.h
+++ b/intern/cycles/kernel/integrator/integrator_init_from_bake.h
@@ -109,9 +109,17 @@ ccl_device bool integrator_init_from_bake(INTEGRATOR_STATE_ARGS,
}
/* Position and normal on triangle. */
+ const int object = kernel_data.bake.object_index;
float3 P, Ng;
int shader;
- triangle_point_normal(kg, kernel_data.bake.object_index, prim, u, v, &P, &Ng, &shader);
+ triangle_point_normal(kg, object, prim, u, v, &P, &Ng, &shader);
+
+ const int object_flag = kernel_tex_fetch(__object_flag, object);
+ if (!(object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+ P = transform_point_auto(&tfm, P);
+ }
+
if (kernel_data.film.pass_background != PASS_UNUSED) {
/* Environment baking. */
@@ -130,8 +138,13 @@ ccl_device bool integrator_init_from_bake(INTEGRATOR_STATE_ARGS,
}
else {
/* Surface baking. */
- const float3 N = (shader & SHADER_SMOOTH_NORMAL) ? triangle_smooth_normal(kg, Ng, prim, u, v) :
- Ng;
+ float3 N = (shader & SHADER_SMOOTH_NORMAL) ? triangle_smooth_normal(kg, Ng, prim, u, v) : Ng;
+
+ if (!(object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
+ Transform itfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
+ N = normalize(transform_direction_transposed(&itfm, N));
+ Ng = normalize(transform_direction_transposed(&itfm, Ng));
+ }
/* Setup ray. */
Ray ray ccl_optional_struct_init;
@@ -143,6 +156,12 @@ ccl_device bool integrator_init_from_bake(INTEGRATOR_STATE_ARGS,
/* Setup differentials. */
float3 dPdu, dPdv;
triangle_dPdudv(kg, prim, &dPdu, &dPdv);
+ if (!(object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
+ Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
+ dPdu = transform_direction(&tfm, dPdu);
+ dPdv = transform_direction(&tfm, dPdv);
+ }
+
differential3 dP;
dP.dx = dPdu * dudx + dPdv * dvdx;
dP.dy = dPdu * dudy + dPdv * dvdy;