107 const float area =
bbox.area();
108 const float area_measure = area == 0 ?
len(
bbox.size()) : area;
109 return energy * area_measure *
bcone.calculate_measure();
203 bool need_transformation =
false);
207 return root !=
nullptr;
321 void make_leaf(
const int first_emitter_index,
const int num_emitters)
331 void make_distant(
const int first_emitter_index,
const int num_emitters)
395 std::unordered_map<Mesh *, int> offset_map_;
399 uint max_lights_in_leaf_;
424 return make_unique<LightTreeNode>(measure, bit_trial);
429 return emitters_.size();
434 return emitters_.data();
441 enum { MIN_EMITTERS_PER_THREAD = 4096 };
443 void recursive_build(
Child child,
444 LightTreeNode *inner,
447 LightTreeEmitter *emitters,
448 const uint bit_trail,
451 bool should_split(LightTreeEmitter *emitters,
455 LightTreeMeasure &measure,
456 LightTreeLightLink &light_link,
460 bool triangle_usable_as_light(
Mesh *mesh,
const int prim_id);
463 void add_mesh(
Scene *scene,
Mesh *mesh,
const int object_id);
unsigned long long int uint64_t
std::atomic< int > num_nodes
const LightTreeEmitter * get_emitters() const
LightTree(Scene *scene, DeviceScene *dscene, Progress &progress, const uint max_lights_in_leaf)
unique_ptr< LightTreeNode > create_node(const LightTreeMeasure &measure, const uint &bit_trial)
uint64_t light_link_receiver_used
LightTreeNode * build(Scene *scene, DeviceScene *dscene)
size_t num_emitters() const
#define CCL_NAMESPACE_END
#define assert(assertion)
LightTreeMeasure operator+(const LightTreeMeasure &a, const LightTreeMeasure &b)
OrientationBounds merge(const OrientationBounds &cone_a, const OrientationBounds &cone_b)
ccl_device_inline float inversesqrtf(const float f)
ccl_device_inline bool is_zero(const float2 a)
void add(const LightTreeEmitter &emitter)
LightTreeBucket()=default
LightTreeLightLink light_link
static const int num_buckets
LightTreeBucket(const LightTreeMeasure &measure, const LightTreeLightLink &light_link, const int &count)
__forceinline bool is_mesh() const
__forceinline bool is_triangle() const
unique_ptr< LightTreeNode > root
uint64_t light_set_membership
LightTreeEmitter(Object *object, const int object_id)
__forceinline bool is_light() const
void add(const uint64_t prim_set_membership)
void add(const LightTreeLightLink &other)
LightTreeLightLink()=default
LightTreeLightLink(const uint64_t set_membership)
__forceinline LightTreeMeasure(empty_t)
bool transform(const Transform &tfm)
__forceinline LightTreeMeasure()=default
__forceinline void reset()
__forceinline float calculate()
__forceinline LightTreeMeasure(const LightTreeMeasure &other)=default
__forceinline LightTreeMeasure(const BoundBox &bbox, const OrientationBounds &bcone, const float &energy)
__forceinline void add(const LightTreeMeasure &measure)
__forceinline bool is_zero() const
unique_ptr< LightTreeNode > children[2]
LightTreeNode * reference
LightTreeNode(const LightTreeMeasure &measure, const uint &bit_trial)
void make_instance(LightTreeNode *reference, const int object_id)
__forceinline void add(const LightTreeEmitter &emitter)
__forceinline Inner & get_inner()
__forceinline Instance & get_instance()
__forceinline bool is_leaf() const
void make_leaf(const int first_emitter_index, const int num_emitters)
LightTreeNode * get_reference()
std::variant< Leaf, Inner, Instance > variant_type
void make_distant(const int first_emitter_index, const int num_emitters)
__forceinline bool is_inner() const
LightTreeLightLink light_link
__forceinline bool is_instance() const
__forceinline Leaf & get_leaf()
__forceinline bool is_distant() const
__forceinline const Inner & get_inner() const
__forceinline const Leaf & get_leaf() const
__forceinline const Instance & get_instance() const
__forceinline OrientationBounds(const float3 &axis_, float theta_o_, float theta_e_)
__forceinline bool is_empty() const
__forceinline OrientationBounds()=default
__forceinline OrientationBounds(empty_t)
float calculate_measure() const