5#ifndef __LIGHT_TREE_H__
6#define __LIGHT_TREE_H__
109 float area_measure = area == 0 ?
len(
bbox.
size()) : area;
169 else if (!other.shareable) {
181 unique_ptr<LightTreeNode>
root;
199 return root !=
nullptr;
313 void make_leaf(
const int first_emitter_index,
const int num_emitters)
323 void make_distant(
const int first_emitter_index,
const int num_emitters)
338 instance.reference = reference;
378 unique_ptr<LightTreeNode> root_;
387 std::unordered_map<Mesh *, int> offset_map_;
391 uint max_lights_in_leaf_;
416 return make_unique<LightTreeNode>(measure, bit_trial);
421 return emitters_.size();
426 return emitters_.data();
433 enum { MIN_EMITTERS_PER_THREAD = 4096 };
435 void recursive_build(
Child child,
452 bool triangle_usable_as_light(
Mesh *mesh,
int prim_id);
455 void add_mesh(
Scene *scene,
Mesh *mesh,
int object_id);
LightTree(Scene *scene, DeviceScene *dscene, Progress &progress, uint max_lights_in_leaf)
std::atomic< int > num_nodes
const LightTreeEmitter * get_emitters() const
unique_ptr< LightTreeNode > create_node(const LightTreeMeasure &measure, const uint &bit_trial)
uint64_t light_link_receiver_used
LightTreeNode * build(Scene *scene, DeviceScene *dscene)
local_group_size(16, 16) .push_constant(Type b
#define CCL_NAMESPACE_END
LightTreeMeasure operator+(const LightTreeMeasure &a, const LightTreeMeasure &b)
OrientationBounds merge(const OrientationBounds &cone_a, const OrientationBounds &cone_b)
ccl_device_inline bool is_zero(const float2 a)
blender::draw::overlay::Instance Instance
unsigned __int64 uint64_t
BoundBox transformed(const Transform *tfm) const
__forceinline float3 size() const
__forceinline void grow(const float3 &pt)
__forceinline float area() const
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
LightTreeEmitter(Object *object, int object_id)
__forceinline bool is_triangle() const
unique_ptr< LightTreeNode > root
uint64_t light_set_membership
__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)
__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()
__forceinline OrientationBounds(const float3 &axis_, float theta_o_, float theta_e_)
__forceinline bool is_empty() const
__forceinline OrientationBounds(empty_t)
float calculate_measure() const
ccl_device_inline float inversesqrtf(float f)