bool BlenderSync::object_is_mesh(BL::Object& b_ob) { BL::ID b_ob_data = b_ob.data(); if(!b_ob_data) { return false; } if(b_ob.type() == BL::Object::type_CURVE) { /* Skip exporting curves without faces, overhead can be * significant if there are many for path animation. */ BL::Curve b_curve(b_ob.data()); return (b_curve.bevel_object() || b_curve.extrude() != 0.0f || b_curve.bevel_depth() != 0.0f || b_curve.dimensions() == BL::Curve::dimensions_2D || b_ob.modifiers.length()); } else { return (b_ob_data.is_a(&RNA_Mesh) || b_ob_data.is_a(&RNA_Curve) || b_ob_data.is_a(&RNA_MetaBall)); } }
bool BlenderSync::object_is_mesh(BL::Object& b_ob) { BL::ID b_ob_data = b_ob.data(); return (b_ob_data && (b_ob_data.is_a(&RNA_Mesh) || b_ob_data.is_a(&RNA_Curve) || b_ob_data.is_a(&RNA_MetaBall))); }
static void blender_camera_from_object(BlenderCamera *bcam, BL::RenderEngine& b_engine, BL::Object& b_ob, bool skip_panorama = false) { BL::ID b_ob_data = b_ob.data(); if(b_ob_data.is_a(&RNA_Camera)) { BL::Camera b_camera(b_ob_data); PointerRNA ccamera = RNA_pointer_get(&b_camera.ptr, "cycles"); bcam->nearclip = b_camera.clip_start(); bcam->farclip = b_camera.clip_end(); switch(b_camera.type()) { case BL::Camera::type_ORTHO: bcam->type = CAMERA_ORTHOGRAPHIC; break; case BL::Camera::type_PANO: if(!skip_panorama) bcam->type = CAMERA_PANORAMA; else bcam->type = CAMERA_PERSPECTIVE; break; case BL::Camera::type_PERSP: default: bcam->type = CAMERA_PERSPECTIVE; break; } switch(RNA_enum_get(&ccamera, "panorama_type")) { case 1: bcam->panorama_type = PANORAMA_FISHEYE_EQUIDISTANT; break; case 2: bcam->panorama_type = PANORAMA_FISHEYE_EQUISOLID; break; case 3: bcam->panorama_type = PANORAMA_MIRRORBALL; break; case 0: default: bcam->panorama_type = PANORAMA_EQUIRECTANGULAR; break; } bcam->fisheye_fov = RNA_float_get(&ccamera, "fisheye_fov"); bcam->fisheye_lens = RNA_float_get(&ccamera, "fisheye_lens"); bcam->latitude_min = RNA_float_get(&ccamera, "latitude_min"); bcam->latitude_max = RNA_float_get(&ccamera, "latitude_max"); bcam->longitude_min = RNA_float_get(&ccamera, "longitude_min"); bcam->longitude_max = RNA_float_get(&ccamera, "longitude_max"); bcam->ortho_scale = b_camera.ortho_scale(); bcam->lens = b_camera.lens(); /* allow f/stop number to change aperture_size but still * give manual control over aperture radius */ int aperture_type = RNA_enum_get(&ccamera, "aperture_type"); if(aperture_type == 1) { float fstop = RNA_float_get(&ccamera, "aperture_fstop"); fstop = max(fstop, 1e-5f); if(bcam->type == CAMERA_ORTHOGRAPHIC) bcam->aperturesize = 1.0f/(2.0f*fstop); else bcam->aperturesize = (bcam->lens*1e-3f)/(2.0f*fstop); } else bcam->aperturesize = RNA_float_get(&ccamera, "aperture_size"); bcam->apertureblades = RNA_int_get(&ccamera, "aperture_blades"); bcam->aperturerotation = RNA_float_get(&ccamera, "aperture_rotation"); bcam->focaldistance = blender_camera_focal_distance(b_engine, b_ob, b_camera); bcam->aperture_ratio = RNA_float_get(&ccamera, "aperture_ratio"); bcam->shift.x = b_engine.camera_shift_x(b_ob); bcam->shift.y = b_camera.shift_y(); bcam->sensor_width = b_camera.sensor_width(); bcam->sensor_height = b_camera.sensor_height(); if(b_camera.sensor_fit() == BL::Camera::sensor_fit_AUTO) bcam->sensor_fit = BlenderCamera::AUTO; else if(b_camera.sensor_fit() == BL::Camera::sensor_fit_HORIZONTAL) bcam->sensor_fit = BlenderCamera::HORIZONTAL; else bcam->sensor_fit = BlenderCamera::VERTICAL; } else { /* from lamp not implemented yet */ } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Fill the Octane Camera properties from Blender data ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void BlenderSync::load_camera_from_object(Camera* cam, BL::Object b_ob, int width, int height, float2& offset, bool skip_panorama) { BL::ID b_ob_data = b_ob.data(); if(b_ob_data.is_a(&RNA_Camera)) { BL::Camera b_camera(b_ob_data); PointerRNA oct_camera = RNA_pointer_get(&b_camera.ptr, "octane"); switch(b_camera.type()) { case BL::Camera::type_ORTHO: cam->type = CAMERA_PERSPECTIVE; cam->ortho = true; break; case BL::Camera::type_PANO: if(!skip_panorama) cam->type = CAMERA_PANORAMA; else cam->type = CAMERA_PERSPECTIVE; cam->ortho = false; break; case BL::Camera::type_PERSP: default: cam->type = CAMERA_PERSPECTIVE; cam->ortho = false; break; } cam->near_clip_depth = b_camera.clip_start(); cam->far_clip_depth = b_camera.clip_end(); cam->set_focal_depth(b_ob, b_camera); get_cam_settings(cam, oct_camera); cam->lens_shift_x = b_camera.shift_x() / cam->zoom; cam->lens_shift_y = b_camera.shift_y() / cam->zoom; cam->sensorwidth = b_camera.sensor_width(); cam->sensorheight = b_camera.sensor_height(); cam->offset_x = offset.x * 2.0f / cam->zoom; cam->offset_y = offset.y * 2.0f / cam->zoom; if(b_camera.sensor_fit() == BL::Camera::sensor_fit_AUTO) cam->sensor_fit = Camera::AUTO; else if(b_camera.sensor_fit() == BL::Camera::sensor_fit_HORIZONTAL) cam->sensor_fit = Camera::HORIZONTAL; else cam->sensor_fit = Camera::VERTICAL; if(cam->ortho) { float ortho_scale; get_camera_ortho_scale(cam, b_camera, width, height, &ortho_scale); cam->fov = ortho_scale * cam->zoom; } else { float sensor_size; get_camera_sensor_size(cam, width, height, &sensor_size); cam->fov = 2.0f * atanf((0.5f * sensor_size * cam->zoom) / b_camera.lens()) *180.0f / M_PI_F; } // Position cam->eye_point.x = cam->matrix.x.w; cam->eye_point.y = cam->matrix.y.w; cam->eye_point.z = cam->matrix.z.w; float3 dir = transform_direction(&cam->matrix, make_float3(0.0f, 0.0f, -1.0f)); cam->look_at.x = cam->eye_point.x + dir.x; cam->look_at.y = cam->eye_point.y + dir.y; cam->look_at.z = cam->eye_point.z + dir.z; cam->up = normalize(transform_direction(&cam->matrix, make_float3(0.0f, 1.0f, 0.0f))); } else { //TODO: Implement it for Lamp } } //camera_from_object()
bool BlenderSync::object_is_light(BL::Object& b_ob) { BL::ID b_ob_data = b_ob.data(); return (b_ob_data && b_ob_data.is_a(&RNA_Lamp)); }
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 b_index, BL::Object b_ob, Transform& tfm) { /* test if we need to sync */ Light *light; ObjectKey key(b_parent, b_index, 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_POINT; 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 = make_float3(tfm.x.x, tfm.y.x, tfm.z.x); light->axisv = make_float3(tfm.x.y, tfm.y.y, tfm.z.y); 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 = make_float3(tfm.x.w, tfm.y.w, tfm.z.w); light->dir = -make_float3(tfm.x.z, tfm.y.z, tfm.z.z); /* 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"); /* 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); }