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

Reply via email to