[Bf-blender-cvs] [e9e72fee1c9] soc-2022-many-lights-sampling: Cleanup: reduce the size of `KernelLightTreeEmitter`

Weizhen Huang noreply at git.blender.org
Tue Nov 22 14:51:30 CET 2022


Commit: e9e72fee1c985737afa6ef9ae51be0ad4a1900d7
Author: Weizhen Huang
Date:   Tue Nov 22 14:50:36 2022 +0100
Branches: soc-2022-many-lights-sampling
https://developer.blender.org/rBe9e72fee1c985737afa6ef9ae51be0ad4a1900d7

Cleanup: reduce the size of `KernelLightTreeEmitter`

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

M	intern/cycles/kernel/light/tree.h
M	intern/cycles/kernel/types.h
M	intern/cycles/scene/light.cpp
M	intern/cycles/scene/shader.h

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

diff --git a/intern/cycles/kernel/light/tree.h b/intern/cycles/kernel/light/tree.h
index 58c51c529b3..c762f2b4cbf 100644
--- a/intern/cycles/kernel/light/tree.h
+++ b/intern/cycles/kernel/light/tree.h
@@ -181,24 +181,23 @@ ccl_device void light_tree_emitter_importance(KernelGlobals kg,
   ccl_global const KernelLightTreeEmitter *kemitter = &kernel_data_fetch(light_tree_emitters,
                                                                          emitter_index);
 
-  float3 bcone_axis = make_float3(kemitter->bounding_cone_axis[0],
-                                  kemitter->bounding_cone_axis[1],
-                                  kemitter->bounding_cone_axis[2]);
   float theta_o = kemitter->theta_o;
   float min_distance, distance;
   float max_distance = 0.0f;
   float cos_theta_u = 1.0f;
-  float3 centroid = make_float3(
-      kemitter->centroid[0], kemitter->centroid[1], kemitter->centroid[2]);
-  float3 point_to_centroid = safe_normalize_len(centroid - P, &distance);
+  float3 bcone_axis, centroid, point_to_centroid;
   bool bbox_is_visible = has_transmission;
 
   const int prim = kemitter->prim_id;
+  /* TODO: pack in functions and move to header files for respective light types */
   if (prim < 0) {
     const int lamp = -prim - 1;
     const ccl_global KernelLight *klight = &kernel_data_fetch(lights, lamp);
+    centroid = make_float3(klight->co[0], klight->co[1], klight->co[2]);
+    point_to_centroid = safe_normalize_len(centroid - P, &distance);
 
     if (klight->type == LIGHT_SPOT || klight->type == LIGHT_POINT) {
+      bcone_axis = make_float3(klight->spot.dir[0], klight->spot.dir[1], klight->spot.dir[2]);
       const float radius = klight->spot.radius;
       min_distance = distance;
       max_distance = sqrtf(sqr(radius) + sqr(distance));
@@ -207,6 +206,7 @@ ccl_device void light_tree_emitter_importance(KernelGlobals kg,
       bbox_is_visible = true; /* will be tested later */
     }
     else { /* area light */
+      bcone_axis = make_float3(klight->area.dir[0], klight->area.dir[1], klight->area.dir[2]);
       const float3 extentu = make_float3(
           klight->area.extentu[0], klight->area.extentu[1], klight->area.extentu[2]);
       const float3 extentv = make_float3(
@@ -231,10 +231,21 @@ ccl_device void light_tree_emitter_importance(KernelGlobals kg,
   }
   else { /* mesh light */
     const int object = kemitter->mesh_light.object_id;
-    float3 V[3];
-    triangle_world_space_vertices(kg, object, prim, -1.0f, V);
+    float3 vertices[3];
+    triangle_world_space_vertices(kg, object, prim, -1.0f, vertices);
+    centroid = (vertices[0] + vertices[1] + vertices[2]) / 3.0f;
+    point_to_centroid = safe_normalize_len(centroid - P, &distance);
+    bcone_axis = safe_normalize(cross(vertices[1] - vertices[0], vertices[2] - vertices[0]));
+    if (kemitter->mesh_light.emission_sampling == EMISSION_SAMPLING_BACK) {
+      bcone_axis = -bcone_axis;
+    }
+    else if (kemitter->mesh_light.emission_sampling == EMISSION_SAMPLING_FRONT_BACK) {
+      bcone_axis *= -signf(dot(bcone_axis, point_to_centroid));
+    }
+    theta_o = 0.0f;
+
     for (int i = 0; i < 3; i++) {
-      const float3 corner = V[i];
+      const float3 corner = vertices[i];
       float distance_point_to_corner;
       const float3 point_to_corner = safe_normalize_len(corner - P, &distance_point_to_corner);
       cos_theta_u = fminf(cos_theta_u, dot(point_to_centroid, point_to_corner));
diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h
index 683dc26748c..d2719dedae2 100644
--- a/intern/cycles/kernel/types.h
+++ b/intern/cycles/kernel/types.h
@@ -467,6 +467,16 @@ typedef enum ShaderFlag {
                   SHADER_EXCLUDE_ANY)
 } ShaderFlag;
 
+enum EmissionSampling {
+  EMISSION_SAMPLING_NONE = 0,
+  EMISSION_SAMPLING_AUTO = 1,
+  EMISSION_SAMPLING_FRONT = 2,
+  EMISSION_SAMPLING_BACK = 3,
+  EMISSION_SAMPLING_FRONT_BACK = 4,
+
+  EMISSION_SAMPLING_NUM
+};
+
 /* Light Type */
 
 typedef enum LightType {
@@ -1364,10 +1374,7 @@ typedef struct KernelLightTreeNode {
 static_assert_align(KernelLightTreeNode, 16);
 
 typedef struct KernelLightTreeEmitter {
-  float centroid[3];
-
   /* Bounding cone. */
-  float bounding_cone_axis[3];
   float theta_o;
   float theta_e;
 
@@ -1376,22 +1383,14 @@ typedef struct KernelLightTreeEmitter {
 
   /* prim_id denotes the location in the lights or triangles array. */
   int prim_id;
-  union {
-    struct {
-      int shader_flag;
-      int object_id;
-    } mesh_light;
-    struct {
-      float pad1;
-      float size;
-    } lamp;
-  };
+  struct {
+    int shader_flag;
+    int object_id;
+    EmissionSampling emission_sampling;
+  } mesh_light;
 
   /* Parent. */
   int parent_index;
-
-  /* Padding */
-  float pad3[3];
 } KernelLightTreeEmitter;
 static_assert_align(KernelLightTreeEmitter, 16);
 
diff --git a/intern/cycles/scene/light.cpp b/intern/cycles/scene/light.cpp
index b2d85256523..970c8b78201 100644
--- a/intern/cycles/scene/light.cpp
+++ b/intern/cycles/scene/light.cpp
@@ -604,11 +604,6 @@ void LightManager::device_update_tree(Device *device,
         LightTreePrimitive &prim = light_prims[emitter_index];
 
         light_tree_emitters[emitter_index].energy = prim.energy;
-
-        for (int i = 0; i < 3; i++) {
-          light_tree_emitters[emitter_index].centroid[i] = prim.centroid[i];
-          light_tree_emitters[emitter_index].bounding_cone_axis[i] = prim.bcone.axis[i];
-        }
         light_tree_emitters[emitter_index].theta_o = prim.bcone.theta_o;
         light_tree_emitters[emitter_index].theta_e = prim.bcone.theta_e;
 
@@ -618,6 +613,9 @@ void LightManager::device_update_tree(Device *device,
           int shader_flag = 0;
           Object *object = scene->objects[prim.object_id];
           Mesh *mesh = static_cast<Mesh *>(object->get_geometry());
+          Shader *shader = static_cast<Shader *>(
+              mesh->get_used_shaders()[mesh->get_shader()[prim.prim_id]]);
+
           if (!(object->get_visibility() & PATH_RAY_CAMERA)) {
             shader_flag |= SHADER_EXCLUDE_CAMERA;
           }
@@ -639,12 +637,12 @@ void LightManager::device_update_tree(Device *device,
 
           light_tree_emitters[emitter_index].prim_id = prim.prim_id + mesh->prim_offset;
           light_tree_emitters[emitter_index].mesh_light.shader_flag = shader_flag;
+          light_tree_emitters[emitter_index].mesh_light.emission_sampling =
+              shader->emission_sampling;
           triangle_array[prim.prim_id + object_lookup_offsets[prim.object_id]] = emitter_index;
         }
         else {
-          Light *lamp = scene->lights[prim.object_id];
           light_tree_emitters[emitter_index].prim_id = prim.prim_id;
-          light_tree_emitters[emitter_index].lamp.size = lamp->size;
           light_array[~prim.prim_id] = emitter_index;
         }
 
diff --git a/intern/cycles/scene/shader.h b/intern/cycles/scene/shader.h
index e1fa4585bdf..8f59eefae05 100644
--- a/intern/cycles/scene/shader.h
+++ b/intern/cycles/scene/shader.h
@@ -34,15 +34,6 @@ struct float3;
 enum ShadingSystem { SHADINGSYSTEM_OSL, SHADINGSYSTEM_SVM };
 
 /* Keep those in sync with the python-defined enum. */
-enum EmissionSampling {
-  EMISSION_SAMPLING_NONE = 0,
-  EMISSION_SAMPLING_AUTO = 1,
-  EMISSION_SAMPLING_FRONT = 2,
-  EMISSION_SAMPLING_BACK = 3,
-  EMISSION_SAMPLING_FRONT_BACK = 4,
-
-  EMISSION_SAMPLING_NUM
-};
 
 enum VolumeSampling {
   VOLUME_SAMPLING_DISTANCE = 0,



More information about the Bf-blender-cvs mailing list