static float blender_camera_focal_distance(BL::RenderEngine b_engine, BL::Object b_ob, BL::Camera b_camera) { BL::Object b_dof_object = b_camera.dof_object(); if(!b_dof_object) return b_camera.dof_distance(); /* for dof object, return distance along camera Z direction */ BL::Array<float, 16> b_ob_matrix; b_engine.camera_model_matrix(b_ob, b_ob_matrix); Transform obmat = get_transform(b_ob_matrix); Transform dofmat = get_transform(b_dof_object.matrix_world()); float3 view_dir = normalize(transform_get_column(&obmat, 2)); float3 dof_dir = transform_get_column(&obmat, 3) - transform_get_column(&dofmat, 3); return fabsf(dot(view_dir, dof_dir)); }
static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera) { BL::Object b_dof_object = b_camera.dof_object(); if(!b_dof_object) return b_camera.dof_distance(); /* for dof object, return distance along camera Z direction */ Transform obmat = transform_clear_scale(get_transform(b_ob.matrix_world())); Transform dofmat = get_transform(b_dof_object.matrix_world()); Transform mat = transform_inverse(obmat) * dofmat; return fabsf(transform_get_column(&mat, 3).z); }
static float blender_camera_focal_distance(BL::RenderEngine b_engine, BL::Object b_ob, BL::Camera b_camera) { BL::Object b_dof_object = b_camera.dof_object(); if(!b_dof_object) return b_camera.dof_distance(); /* for dof object, return distance along camera Z direction */ BL::Array<float, 16> b_ob_matrix; b_engine.camera_model_matrix(b_ob, b_ob_matrix); Transform obmat = get_transform(b_ob_matrix); Transform dofmat = get_transform(b_dof_object.matrix_world()); Transform mat = transform_inverse(obmat) * dofmat; return fabsf(transform_get_column(&mat, 3).z); }
bool BlenderObjectCulling::test_distance(Scene *scene, float3 bb[8]) { float3 camera_position = transform_get_column(&scene->camera->matrix, 3); float3 bb_min = make_float3(FLT_MAX, FLT_MAX, FLT_MAX), bb_max = make_float3(-FLT_MAX, -FLT_MAX, -FLT_MAX); /* Find min & max points for x & y & z on bounding box */ for(int i = 0; i < 8; ++i) { float3 p = bb[i]; bb_min = min(bb_min, p); bb_max = max(bb_max, p); } float3 closest_point = max(min(bb_max,camera_position),bb_min); return (len_squared(camera_position - closest_point) > distance_cull_margin_ * distance_cull_margin_); }
void BlenderSync::sync_light(BL::Object& b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::Object& b_ob, BL::DupliObject& b_dupli_ob, Transform& tfm, bool *use_portal) { /* test if we need to sync */ Light *light; ObjectKey key(b_parent, persistent_id, b_ob); if(!light_map.sync(&light, b_ob, b_parent, key)) { if(light->is_portal) *use_portal = true; return; } BL::Lamp b_lamp(b_ob.data()); /* type */ switch(b_lamp.type()) { case BL::Lamp::type_POINT: { BL::PointLamp b_point_lamp(b_lamp); light->size = b_point_lamp.shadow_soft_size(); light->type = LIGHT_POINT; break; } case BL::Lamp::type_SPOT: { BL::SpotLamp b_spot_lamp(b_lamp); light->size = b_spot_lamp.shadow_soft_size(); light->type = LIGHT_SPOT; light->spot_angle = b_spot_lamp.spot_size(); light->spot_smooth = b_spot_lamp.spot_blend(); break; } case BL::Lamp::type_HEMI: { light->type = LIGHT_DISTANT; light->size = 0.0f; break; } case BL::Lamp::type_SUN: { BL::SunLamp b_sun_lamp(b_lamp); light->size = b_sun_lamp.shadow_soft_size(); light->type = LIGHT_DISTANT; break; } case BL::Lamp::type_AREA: { BL::AreaLamp b_area_lamp(b_lamp); light->size = 1.0f; light->axisu = transform_get_column(&tfm, 0); light->axisv = transform_get_column(&tfm, 1); light->sizeu = b_area_lamp.size(); if(b_area_lamp.shape() == BL::AreaLamp::shape_RECTANGLE) light->sizev = b_area_lamp.size_y(); else light->sizev = light->sizeu; light->type = LIGHT_AREA; break; } } /* location and (inverted!) direction */ light->co = transform_get_column(&tfm, 3); light->dir = -transform_get_column(&tfm, 2); light->tfm = tfm; /* shader */ vector<Shader*> used_shaders; find_shader(b_lamp, used_shaders, scene->default_light); light->shader = used_shaders[0]; /* shadow */ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); PointerRNA clamp = RNA_pointer_get(&b_lamp.ptr, "cycles"); light->cast_shadow = get_boolean(clamp, "cast_shadow"); light->use_mis = get_boolean(clamp, "use_multiple_importance_sampling"); int samples = get_int(clamp, "samples"); if(get_boolean(cscene, "use_square_samples")) light->samples = samples * samples; else light->samples = samples; light->max_bounces = get_int(clamp, "max_bounces"); if(b_dupli_ob) { light->random_id = b_dupli_ob.random_id(); } else { light->random_id = hash_int_2d(hash_string(b_ob.name().c_str()), 0); } if(light->type == LIGHT_AREA) light->is_portal = get_boolean(clamp, "is_portal"); else light->is_portal = false; if(light->is_portal) *use_portal = true; /* visibility */ uint visibility = object_ray_visibility(b_ob); light->use_diffuse = (visibility & PATH_RAY_DIFFUSE) != 0; light->use_glossy = (visibility & PATH_RAY_GLOSSY) != 0; light->use_transmission = (visibility & PATH_RAY_TRANSMIT) != 0; light->use_scatter = (visibility & PATH_RAY_VOLUME_SCATTER) != 0; /* tag */ light->tag_update(scene); }
void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSISTENT_ID_SIZE], BL::Object b_ob, Transform& tfm) { /* test if we need to sync */ Light *light; ObjectKey key(b_parent, persistent_id, b_ob); if(!light_map.sync(&light, b_ob, b_parent, key)) return; BL::Lamp b_lamp(b_ob.data()); /* type */ switch(b_lamp.type()) { case BL::Lamp::type_POINT: { BL::PointLamp b_point_lamp(b_lamp); light->size = b_point_lamp.shadow_soft_size(); light->type = LIGHT_POINT; break; } case BL::Lamp::type_SPOT: { BL::SpotLamp b_spot_lamp(b_lamp); light->size = b_spot_lamp.shadow_soft_size(); light->type = LIGHT_SPOT; light->spot_angle = b_spot_lamp.spot_size(); light->spot_smooth = b_spot_lamp.spot_blend(); break; } case BL::Lamp::type_HEMI: { light->type = LIGHT_DISTANT; light->size = 0.0f; break; } case BL::Lamp::type_SUN: { BL::SunLamp b_sun_lamp(b_lamp); light->size = b_sun_lamp.shadow_soft_size(); light->type = LIGHT_DISTANT; break; } case BL::Lamp::type_AREA: { BL::AreaLamp b_area_lamp(b_lamp); light->size = 1.0f; light->axisu = transform_get_column(&tfm, 0); light->axisv = transform_get_column(&tfm, 1); light->sizeu = b_area_lamp.size(); if(b_area_lamp.shape() == BL::AreaLamp::shape_RECTANGLE) light->sizev = b_area_lamp.size_y(); else light->sizev = light->sizeu; light->type = LIGHT_AREA; break; } } /* location and (inverted!) direction */ light->co = transform_get_column(&tfm, 3); light->dir = -transform_get_column(&tfm, 2); /* shader */ vector<uint> used_shaders; find_shader(b_lamp, used_shaders, scene->default_light); if(used_shaders.size() == 0) used_shaders.push_back(scene->default_light); light->shader = used_shaders[0]; /* shadow */ PointerRNA clamp = RNA_pointer_get(&b_lamp.ptr, "cycles"); light->cast_shadow = get_boolean(clamp, "cast_shadow"); light->use_mis = get_boolean(clamp, "use_multiple_importance_sampling"); light->samples = get_int(clamp, "samples"); /* tag */ light->tag_update(scene); }