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()) {
23 PointerRNA cscene = RNA_pointer_get(&b_scene.ptr,
"cycles");
25 const bool cam_supported = (scene->camera->get_camera_type() == CAMERA_PERSPECTIVE) ||
26 (scene->camera->get_camera_type() == CAMERA_ORTHOGRAPHIC);
28 use_scene_camera_cull_ = cam_supported && !b_scene.render().use_multiview() &&
29 get_boolean(cscene,
"use_camera_cull");
30 use_scene_distance_cull_ = cam_supported && !b_scene.render().use_multiview() &&
31 get_boolean(cscene,
"use_distance_cull");
33 camera_cull_margin_ = get_float(cscene,
"camera_cull_margin");
34 distance_cull_margin_ = get_float(cscene,
"distance_cull_margin");
36 if (distance_cull_margin_ == 0.0f) {
37 use_scene_distance_cull_ = false;
44 if (!use_scene_camera_cull_ && !use_scene_distance_cull_) {
50 use_camera_cull_ = use_scene_camera_cull_ &&
get_boolean(cobject,
"use_camera_cull");
51 use_distance_cull_ = use_scene_distance_cull_ &&
get_boolean(cobject,
"use_distance_cull");
53 if (use_camera_cull_ || use_distance_cull_) {
55 scene->
camera->update(scene);
61 if (!use_camera_cull_ && !use_distance_cull_) {
67 BL::Array<float, 24> boundbox = b_ob.bound_box();
68 for (
int i = 0;
i < 8; ++
i) {
73 const bool camera_culled = use_camera_cull_ && test_camera(scene, bb);
74 const bool distance_culled = use_distance_cull_ && test_distance(scene, bb);
76 return ((camera_culled && distance_culled) || (camera_culled && !use_distance_cull_) ||
77 (distance_culled && !use_camera_cull_));
83bool BlenderObjectCulling::test_camera(
Scene *scene,
const float3 bb[8])
89 bool all_behind =
true;
90 for (
int i = 0;
i < 8; ++
i) {
100 if (c.
z >= -camera_cull_margin_) {
103 bb_min =
min(bb_min, p);
104 bb_max =
max(bb_max, p);
109 return (bb_min.
x >= 1.0f + camera_cull_margin_ || bb_min.
y >= 1.0f + camera_cull_margin_ ||
110 bb_max.
x <= -camera_cull_margin_ || bb_max.
y <= -camera_cull_margin_);
113bool BlenderObjectCulling::test_distance(
Scene *scene,
const float3 bb[8])
120 for (
int i = 0;
i < 8; ++
i) {
122 bb_min =
min(bb_min, p);
123 bb_max =
max(bb_max, p);
128 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)
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
static bool get_boolean(PointerRNA &ptr, const char *name)
#define CCL_NAMESPACE_END
VecBase< float, 3 > float3
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