14 : use_scene_camera_cull_(false),
15 use_camera_cull_(false),
16 camera_cull_margin_(0.0f),
17 use_scene_distance_cull_(false),
18 use_distance_cull_(false),
19 distance_cull_margin_(0.0f)
21 if (b_scene.render().use_simplify()) {
25 !b_scene.render().use_multiview() &&
28 !b_scene.render().use_multiview() &&
31 camera_cull_margin_ =
get_float(cscene,
"camera_cull_margin");
32 distance_cull_margin_ =
get_float(cscene,
"distance_cull_margin");
34 if (distance_cull_margin_ == 0.0f) {
35 use_scene_distance_cull_ =
false;
42 if (!use_scene_camera_cull_ && !use_scene_distance_cull_) {
48 use_camera_cull_ = use_scene_camera_cull_ &&
get_boolean(cobject,
"use_camera_cull");
49 use_distance_cull_ = use_scene_distance_cull_ &&
get_boolean(cobject,
"use_distance_cull");
51 if (use_camera_cull_ || use_distance_cull_) {
59 if (!use_camera_cull_ && !use_distance_cull_) {
65 BL::Array<float, 24> boundbox = b_ob.bound_box();
66 for (
int i = 0; i < 8; ++i) {
67 float3 p =
make_float3(boundbox[3 * i + 0], boundbox[3 * i + 1], boundbox[3 * i + 2]);
71 bool camera_culled = use_camera_cull_ && test_camera(
scene, bb);
72 bool distance_culled = use_distance_cull_ && test_distance(
scene, bb);
74 return ((camera_culled && distance_culled) || (camera_culled && !use_distance_cull_) ||
75 (distance_culled && !use_camera_cull_));
87 bool all_behind =
true;
88 for (
int i = 0; i < 8; ++i) {
98 if (
c.z >= -camera_cull_margin_) {
101 bb_min =
min(bb_min, p);
102 bb_max =
max(bb_max, p);
107 return (bb_min.
x >= 1.0f + camera_cull_margin_ || bb_min.
y >= 1.0f + camera_cull_margin_ ||
108 bb_max.x <= -camera_cull_margin_ || bb_max.y <= -camera_cull_margin_);
115 bb_max =
make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX);
118 for (
int i = 0; i < 8; ++i) {
120 bb_min =
min(bb_min, p);
121 bb_max =
max(bb_max, p);
126 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)
#define CCL_NAMESPACE_END
static float get_float(PointerRNA &ptr, const char *name)
static bool get_boolean(PointerRNA &ptr, const char *name)
ccl_device_inline float3 camera_position(KernelGlobals kg)
ccl_device_inline float len_squared(const float3 a)
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
ProjectionTransform worldtondc
ccl_device_inline float3 float4_to_float3(const float4 a)