[Bf-blender-cvs] [39c30f69830] master: Cycles: Account for negative scale when using one-sided light tree sampling

Lukas Stockner noreply at git.blender.org
Tue Jan 10 02:56:20 CET 2023


Commit: 39c30f6983009847d010856bee8a193a8ee3e73c
Author: Lukas Stockner
Date:   Tue Jan 10 02:44:12 2023 +0100
Branches: master
https://developer.blender.org/rB39c30f6983009847d010856bee8a193a8ee3e73c

Cycles: Account for negative scale when using one-sided light tree sampling

Differential Revision: https://developer.blender.org/D16952

===================================================================

M	intern/cycles/kernel/light/tree.h
M	intern/cycles/scene/light_tree.cpp

===================================================================

diff --git a/intern/cycles/kernel/light/tree.h b/intern/cycles/kernel/light/tree.h
index 3c6f118ace3..423879bcddc 100644
--- a/intern/cycles/kernel/light/tree.h
+++ b/intern/cycles/kernel/light/tree.h
@@ -223,11 +223,16 @@ ccl_device bool compute_emitter_centroid_and_dir(KernelGlobals kg,
     triangle_world_space_vertices(kg, object, prim_id, -1.0f, vertices);
     centroid = (vertices[0] + vertices[1] + vertices[2]) / 3.0f;
 
-    if (kemitter->emission_sampling == EMISSION_SAMPLING_FRONT) {
+    const bool is_front_only = (kemitter->emission_sampling == EMISSION_SAMPLING_FRONT);
+    const bool is_back_only = (kemitter->emission_sampling == EMISSION_SAMPLING_BACK);
+    if (is_front_only || is_back_only) {
       dir = safe_normalize(cross(vertices[1] - vertices[0], vertices[2] - vertices[0]));
-    }
-    else if (kemitter->emission_sampling == EMISSION_SAMPLING_BACK) {
-      dir = -safe_normalize(cross(vertices[1] - vertices[0], vertices[2] - vertices[0]));
+      if (is_back_only) {
+        dir = -dir;
+      }
+      if (kernel_data_fetch(object_flag, object) & SD_OBJECT_NEGATIVE_SCALE) {
+        dir = -dir;
+      }
     }
     else {
       /* Double-sided: any vector in the plane. */
diff --git a/intern/cycles/scene/light_tree.cpp b/intern/cycles/scene/light_tree.cpp
index f9bd479cf1c..4fa4755479b 100644
--- a/intern/cycles/scene/light_tree.cpp
+++ b/intern/cycles/scene/light_tree.cpp
@@ -94,14 +94,17 @@ LightTreePrimitive::LightTreePrimitive(Scene *scene, int prim_id, int object_id)
      * seems to work fine */
     centroid = (vertices[0] + vertices[1] + vertices[2]) / 3.0f;
 
-    if (shader->emission_sampling == EMISSION_SAMPLING_FRONT) {
-      /* Front only. */
+    const bool is_front_only = (shader->emission_sampling == EMISSION_SAMPLING_FRONT);
+    const bool is_back_only = (shader->emission_sampling == EMISSION_SAMPLING_BACK);
+    if (is_front_only || is_back_only) {
+      /* One-sided. */
       bcone.axis = safe_normalize(cross(vertices[1] - vertices[0], vertices[2] - vertices[0]));
-      bcone.theta_o = 0;
-    }
-    else if (shader->emission_sampling == EMISSION_SAMPLING_BACK) {
-      /* Back only. */
-      bcone.axis = -safe_normalize(cross(vertices[1] - vertices[0], vertices[2] - vertices[0]));
+      if (is_back_only) {
+        bcone.axis = -bcone.axis;
+      }
+      if (transform_negative_scale(object->get_tfm())) {
+        bcone.axis = -bcone.axis;
+      }
       bcone.theta_o = 0;
     }
     else {



More information about the Bf-blender-cvs mailing list