15 : use_scene_camera_cull_(
false),
16 use_camera_cull_(
false),
17 camera_cull_margin_(0.0f),
18 use_scene_distance_cull_(
false),
19 use_distance_cull_(
false),
20 distance_cull_margin_(0.0f)
22 if (b_scene.render().use_simplify()) {
25 use_scene_camera_cull_ = scene->camera->get_camera_type() !=
CAMERA_PANORAMA &&
26 !b_scene.render().use_multiview() &&
28 use_scene_distance_cull_ = scene->camera->get_camera_type() !=
CAMERA_PANORAMA &&
29 !b_scene.render().use_multiview() &&
32 camera_cull_margin_ =
get_float(cscene,
"camera_cull_margin");
33 distance_cull_margin_ =
get_float(cscene,
"distance_cull_margin");
35 if (distance_cull_margin_ == 0.0f) {
36 use_scene_distance_cull_ =
false;
43 if (!use_scene_camera_cull_ && !use_scene_distance_cull_) {
49 use_camera_cull_ = use_scene_camera_cull_ &&
get_boolean(cobject,
"use_camera_cull");
50 use_distance_cull_ = use_scene_distance_cull_ &&
get_boolean(cobject,
"use_distance_cull");
52 if (use_camera_cull_ || use_distance_cull_) {
54 scene->camera->update(scene);
60 if (!use_camera_cull_ && !use_distance_cull_) {
66 BL::Array<float, 24> boundbox = b_ob.bound_box();
67 for (
int i = 0; i < 8; ++i) {
68 float3 p =
make_float3(boundbox[3 * i + 0], boundbox[3 * i + 1], boundbox[3 * i + 2]);
72 bool camera_culled = use_camera_cull_ && test_camera(scene, bb);
73 bool distance_culled = use_distance_cull_ && test_distance(scene, bb);
75 return ((camera_culled && distance_culled) || (camera_culled && !use_distance_cull_) ||
76 (distance_culled && !use_camera_cull_));
82bool BlenderObjectCulling::test_camera(
Scene *scene,
float3 bb[8])
84 Camera *cam = scene->camera;
88 bool all_behind =
true;
89 for (
int i = 0; i < 8; ++i) {
99 if (c.z >= -camera_cull_margin_) {
102 bb_min =
min(bb_min, p);
103 bb_max =
max(bb_max, p);
108 return (bb_min.
x >= 1.0f + camera_cull_margin_ || bb_min.
y >= 1.0f + camera_cull_margin_ ||
109 bb_max.x <= -camera_cull_margin_ || bb_max.y <= -camera_cull_margin_);
112bool BlenderObjectCulling::test_distance(
Scene *scene,
float3 bb[8])
119 for (
int i = 0; i < 8; ++i) {
121 bb_min =
min(bb_min, p);
122 bb_max =
max(bb_max, p);
127 distance_cull_margin_ * distance_cull_margin_);
BlenderObjectCulling(Scene *scene, BL::Scene &b_scene)
void init_object(Scene *scene, BL::Object &b_ob)
bool test(Scene *scene, BL::Object &b_ob, Transform &tfm)
local_group_size(16, 16) .push_constant(Type b
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
static float get_float(PointerRNA &ptr, const char *name)
static bool get_boolean(PointerRNA &ptr, const char *name)
#define CCL_NAMESPACE_END
ccl_device_inline float3 camera_position(KernelGlobals kg)
ccl_device_inline float len_squared(const float2 a)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
ProjectionTransform worldtondc
ccl_device_inline float3 float4_to_float3(const float4 a)