Commit: a1a4d50cf5d1981f5fceb806749e4fa260d8aefc Author: Dalai Felinto Date: Wed Jul 29 11:30:08 2015 -0300 Branches: experimental-build https://developer.blender.org/rBa1a4d50cf5d1981f5fceb806749e4fa260d8aefc
Spherical Stereo - now building for OSX too =================================================================== M intern/cycles/app/cycles_xml.cpp M intern/cycles/blender/addon/properties.py M intern/cycles/blender/blender_camera.cpp M intern/cycles/blender/blender_session.cpp M intern/cycles/blender/blender_sync.h M intern/cycles/kernel/kernel_camera.h M intern/cycles/kernel/kernel_projection.h M intern/cycles/kernel/kernel_types.h M intern/cycles/render/camera.cpp M intern/cycles/render/camera.h M release/scripts/startup/bl_ui/properties_data_camera.py M source/blender/makesrna/intern/rna_render.c M source/blender/render/extern/include/RE_engine.h M source/blender/render/intern/source/external_engine.c M source/blenderplayer/bad_level_call_stubs/stubs.c =================================================================== diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp index edea8cd..25da1be 100644 --- a/intern/cycles/app/cycles_xml.cpp +++ b/intern/cycles/app/cycles_xml.cpp @@ -359,6 +359,10 @@ static void xml_read_camera(const XMLReadState& state, pugi::xml_node node) xml_read_float(&cam->fisheye_fov, node, "fisheye_fov"); xml_read_float(&cam->fisheye_lens, node, "fisheye_lens"); + xml_read_float(&cam->use_spherical_stereo, node, "use_spherical_stereo"); + xml_read_float(&cam->interocular_distance, node, "interocular_distance"); + xml_read_float(&cam->convergence_distance, node, "convergence_distance"); + xml_read_float(&cam->sensorwidth, node, "sensorwidth"); xml_read_float(&cam->sensorheight, node, "sensorheight"); diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 3417435..4d38e50 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -630,6 +630,12 @@ class CyclesCameraSettings(bpy.types.PropertyGroup): subtype='ANGLE', default=math.pi, ) + cls.use_spherical_stereo = BoolProperty( + name="Spherical Stereo", + description="Render every pixel rotating the camera around the " + "middle of the interocular distance", + default=True, + ) @classmethod def unregister(cls): diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp index 0a79bfb..6fb2856 100644 --- a/intern/cycles/blender/blender_camera.cpp +++ b/intern/cycles/blender/blender_camera.cpp @@ -57,6 +57,9 @@ struct BlenderCamera { float latitude_max; float longitude_min; float longitude_max; + bool use_spherical_stereo; + float interocular_distance; + float convergence_distance; enum { AUTO, HORIZONTAL, VERTICAL } sensor_fit; float sensor_width; @@ -95,7 +98,24 @@ static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings b_render bcam->full_height = render_resolution_y(b_render); } -static float blender_camera_focal_distance(BL::RenderEngine b_engine, BL::Object b_ob, BL::Camera b_camera) +static float camera_shift_x(BL::RenderEngine b_engine, BL::Object b_ob, BL::Camera b_camera, bool use_spherical_stereo) +{ + if(use_spherical_stereo) + return b_camera.shift_x(); + else + return b_engine.camera_shift_x(b_ob); +} + +static void camera_model_matrix(BL::RenderEngine b_engine, BL::Object b_ob, bool use_spherical_stereo, + BL::Array<float, 16> &r_matrix) +{ + if(use_spherical_stereo) + memcpy(r_matrix, b_ob.matrix_world(), sizeof(float)*16); + else + b_engine.camera_model_matrix(b_ob, r_matrix); +} + +static float blender_camera_focal_distance(BL::RenderEngine b_engine, BL::Object b_ob, BL::Camera b_camera, bool use_spherical_stereo) { BL::Object b_dof_object = b_camera.dof_object(); @@ -104,15 +124,28 @@ static float blender_camera_focal_distance(BL::RenderEngine b_engine, BL::Object /* 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); + camera_model_matrix(b_engine, b_ob, use_spherical_stereo, b_ob_matrix); + Transform obmat = transform_clear_scale(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); } -static void blender_camera_from_object(BlenderCamera *bcam, BL::RenderEngine b_engine, BL::Object b_ob, bool skip_panorama = false) +static bool blender_camera_use_spherical_stereo(BL::RenderSettings b_render, BlenderCamera *bcam, PointerRNA *ccamera) +{ + if(b_render.use_multiview() && + b_render.views_format() == BL::RenderSettings::views_format_STEREO_3D && + bcam->type == CAMERA_PANORAMA && + RNA_boolean_get(ccamera, "use_spherical_stereo")) + { + return true; + } + return false; +} + +static void blender_camera_from_object(BlenderCamera *bcam, BL::RenderEngine b_engine, BL::RenderSettings b_render, + BL::Object b_ob, bool skip_panorama = false) { BL::ID b_ob_data = b_ob.data(); @@ -164,6 +197,10 @@ static void blender_camera_from_object(BlenderCamera *bcam, BL::RenderEngine b_e bcam->longitude_min = RNA_float_get(&ccamera, "longitude_min"); bcam->longitude_max = RNA_float_get(&ccamera, "longitude_max"); + bcam->interocular_distance = b_camera.stereo().interocular_distance(); + bcam->convergence_distance = b_camera.stereo().convergence_distance(); + bcam->use_spherical_stereo = blender_camera_use_spherical_stereo(b_render, bcam, &ccamera); + bcam->ortho_scale = b_camera.ortho_scale(); bcam->lens = b_camera.lens(); @@ -186,10 +223,10 @@ static void blender_camera_from_object(BlenderCamera *bcam, BL::RenderEngine b_e 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->focaldistance = blender_camera_focal_distance(b_engine, b_ob, b_camera, bcam->use_spherical_stereo); bcam->aperture_ratio = RNA_float_get(&ccamera, "aperture_ratio"); - bcam->shift.x = b_engine.camera_shift_x(b_ob); + bcam->shift.x = camera_shift_x(b_engine, b_ob, b_camera, bcam->use_spherical_stereo); bcam->shift.y = b_camera.shift_y(); bcam->sensor_width = b_camera.sensor_width(); @@ -331,7 +368,7 @@ static void blender_camera_viewplane(BlenderCamera *bcam, } } -static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int height) +static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int height, const char *viewname) { /* copy camera to compare later */ Camera prevcam = *cam; @@ -388,6 +425,20 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int cam->longitude_min = bcam->longitude_min; cam->longitude_max = bcam->longitude_max; + /* panorama stereo */ + cam->interocular_distance = bcam->interocular_distance; + cam->convergence_distance = bcam->convergence_distance; + cam->use_spherical_stereo = bcam->use_spherical_stereo; + + if(cam->use_spherical_stereo) { + if(strcmp(viewname, "left") == 0) + cam->stereo_eye = STEREO_LEFT; + else if(strcmp(viewname, "right") == 0) + cam->stereo_eye = STEREO_RIGHT; + else + cam->stereo_eye = STEREO_NONE; + } + /* anamorphic lens bokeh */ cam->aperture_ratio = bcam->aperture_ratio; @@ -421,7 +472,7 @@ static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int /* Sync Render Camera */ -void BlenderSync::sync_camera(BL::RenderSettings b_render, BL::Object b_override, int width, int height) +void BlenderSync::sync_camera(BL::RenderSettings b_render, BL::Object b_override, int width, int height, const char *viewname) { BlenderCamera bcam; blender_camera_init(&bcam, b_render); @@ -447,14 +498,14 @@ void BlenderSync::sync_camera(BL::RenderSettings b_render, BL::Object b_override if(b_ob) { BL::Array<float, 16> b_ob_matrix; - blender_camera_from_object(&bcam, b_engine, b_ob); - b_engine.camera_model_matrix(b_ob, b_ob_matrix); + blender_camera_from_object(&bcam, b_engine, b_render, b_ob); + camera_model_matrix(b_engine, b_ob, bcam.use_spherical_stereo, b_ob_matrix); bcam.matrix = get_transform(b_ob_matrix); } /* sync */ Camera *cam = scene->camera; - blender_camera_sync(cam, &bcam, width, height); + blender_camera_sync(cam, &bcam, width, height, viewname); } void BlenderSync::sync_camera_motion(BL::RenderSettings b_render, @@ -467,7 +518,7 @@ void BlenderSync::sync_camera_motion(BL::RenderSettings b_render, Camera *cam = scene->camera; BL::Array<float, 16> b_ob_matrix; - b_engine.camera_model_matrix(b_ob, b_ob_matrix); + camera_model_matrix(b_engine, b_ob, cam->use_spherical_stereo, b_ob_matrix); Transform tfm = get_transform(b_ob_matrix); tfm = blender_camera_matrix(tfm, cam->type, cam->panorama_type); @@ -487,7 +538,7 @@ void BlenderSync::sync_camera_motion(BL::RenderSettings b_render, BlenderCamera bcam; float aspectratio, sensor_size; blender_camera_init(&bcam, b_render); - blender_camera_from_object(&bcam, b_engine, b_ob); + blender_camera_from_object(&bcam, b_engine, b_render, b_ob); blender_camera_viewplane(&bcam, width, height, NULL, @@ -527,7 +578,7 @@ static void blender_camera_from_view(BlenderCamera *bcam, BL::RenderEngine b_eng BL::Object b_ob = (b_v3d.lock_camera_and_layers())? b_scene.camera(): b_v3d.camera(); if(b_ob) { - blender_camera_from_object(bcam, b_engine, b_ob, skip_panorama); + blender_camera_from_object(bcam, b_engine, b_scene.render(), b_ob, skip_panorama); if(!skip_panorama && bcam->type == CAMERA_PANORAMA) { /* in panorama camera view, we map viewplane to camera border */ @@ -588,7 +639,7 @@ static void blender_camera_view_subset(BL::RenderEngine b_engine, BL::RenderSett /* get camera viewplane */ BlenderCamera cam_bcam; blender_camera_init(&cam_bcam, b_render); - blender_camera_from_object(&cam_bcam, b_engine, b_ob, true); + blender_camera_from_object(&cam_bcam, b_engine, b_render, b_ob, true); blender_camera_viewplane(&cam_bcam, cam_bcam.full_width, cam_bcam.full_height, &cam, &cam_aspect, &sensor_size); @@ -686,7 +737,7 @@ void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int blender_camera_from_view(&bcam, b_engine, b_scene, b_v3d, b_rv3d, width, height); blender_camera_border(&bcam, b_engine, b_scene.render(), b_scene, b_v3d, b_rv3d, width, height); - blender_camera_sync(scene->camera, &bcam, width, height); + blender_camera_sync(scene->camera, &bcam, width, height, ""); } BufferParams BlenderSync::get_buffer_params(BL::RenderSettings b_render, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, Camera *cam, int width, int height) diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blen @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs