diff options
Diffstat (limited to 'intern/cycles')
-rw-r--r-- | intern/cycles/blender/addon/ui.py | 46 | ||||
-rw-r--r-- | intern/cycles/blender/blender_camera.cpp | 54 | ||||
-rw-r--r-- | intern/cycles/blender/blender_session.cpp | 74 | ||||
-rw-r--r-- | intern/cycles/blender/blender_session.h | 1 |
4 files changed, 122 insertions, 53 deletions
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 956d8b962e9..74de31850ee 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -18,7 +18,7 @@ import bpy -from bpy.types import Panel, Menu, Operator +from bpy.types import Panel, Menu, Operator, UIList class CYCLES_MT_sampling_presets(Menu): @@ -413,6 +413,49 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel): col.prop(rl, "use_pass_environment") +class CyclesRender_PT_views(CyclesButtonsPanel, Panel): + bl_label = "Views" + bl_context = "render_layer" + + def draw_header(self, context): + rd = context.scene.render + self.layout.prop(rd, "use_multiview", text="") + + def draw(self, context): + layout = self.layout + + scene = context.scene + rd = scene.render + rv = rd.views.active + + + layout.active = rd.use_multiview + basic_stereo = (rd.views_format == 'STEREO_3D') + + row = layout.row() + row.prop(rd, "views_format", expand=True) + + if basic_stereo: + row = layout.row() + row.template_list("RENDERLAYER_UL_renderviews", "name", rd, "stereo_views", rd.views, "active_index", rows=2) + + row = layout.row() + row.label(text="File Suffix:") + row.prop(rv, "file_suffix", text="") + + else: + row = layout.row() + row.template_list("RENDERLAYER_UL_renderviews", "name", rd, "views", rd.views, "active_index", rows=2) + + col = row.column(align=True) + col.operator("scene.render_view_add", icon='ZOOMIN', text="") + col.operator("scene.render_view_remove", icon='ZOOMOUT', text="") + + row = layout.row() + row.label(text="Camera Suffix:") + row.prop(rv, "camera_suffix", text="") + + class Cycles_PT_post_processing(CyclesButtonsPanel, Panel): bl_label = "Post Processing" bl_options = {'DEFAULT_CLOSED'} @@ -1428,6 +1471,7 @@ def get_panels(): "DATA_PT_vertex_colors", "DATA_PT_camera", "DATA_PT_camera_display", + "DATA_PT_camera_stereoscopy", "DATA_PT_camera_safe_areas", "DATA_PT_lens", "DATA_PT_speaker", diff --git a/intern/cycles/blender/blender_camera.cpp b/intern/cycles/blender/blender_camera.cpp index 5b3e666e7c7..fffc46ec9a6 100644 --- a/intern/cycles/blender/blender_camera.cpp +++ b/intern/cycles/blender/blender_camera.cpp @@ -95,7 +95,7 @@ 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::Object b_ob, BL::Camera b_camera) +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(); @@ -103,14 +103,16 @@ static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera) 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())); + 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); } -static void blender_camera_from_object(BlenderCamera *bcam, BL::Object b_ob, bool skip_panorama = false) +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(); @@ -181,10 +183,10 @@ static void blender_camera_from_object(BlenderCamera *bcam, BL::Object b_ob, boo bcam->apertureblades = RNA_int_get(&ccamera, "aperture_blades"); bcam->aperturerotation = RNA_float_get(&ccamera, "aperture_rotation"); - bcam->focaldistance = blender_camera_focal_distance(b_ob, b_camera); + 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_camera.shift_x(); + bcam->shift.x = b_engine.camera_shift_x(b_ob); bcam->shift.y = b_camera.shift_y(); bcam->sensor_width = b_camera.sensor_width(); @@ -402,8 +404,10 @@ void BlenderSync::sync_camera(BL::RenderSettings b_render, BL::Object b_override b_ob = b_override; if(b_ob) { - blender_camera_from_object(&bcam, b_ob); - bcam.matrix = get_transform(b_ob.matrix_world()); + 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); + bcam.matrix = get_transform(b_ob_matrix); } /* sync */ @@ -414,8 +418,9 @@ void BlenderSync::sync_camera(BL::RenderSettings b_render, BL::Object b_override void BlenderSync::sync_camera_motion(BL::Object b_ob, float motion_time) { Camera *cam = scene->camera; - - Transform tfm = get_transform(b_ob.matrix_world()); + BL::Array<float, 16> b_ob_matrix; + b_engine.camera_model_matrix(b_ob, b_ob_matrix); + Transform tfm = get_transform(b_ob_matrix); tfm = blender_camera_matrix(tfm, cam->type); if(tfm != cam->matrix) { @@ -433,10 +438,10 @@ void BlenderSync::sync_camera_motion(BL::Object b_ob, float motion_time) /* Sync 3D View Camera */ -static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d, +static void blender_camera_view_subset(BL::RenderEngine b_engine, BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height, BoundBox2D *view_box, BoundBox2D *cam_box); -static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height, bool skip_panorama = false) +static void blender_camera_from_view(BlenderCamera *bcam, BL::RenderEngine b_engine, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height, bool skip_panorama = false) { /* 3d view parameters */ bcam->nearclip = b_v3d.clip_start(); @@ -449,13 +454,13 @@ static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL: 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_ob, skip_panorama); + blender_camera_from_object(bcam, b_engine, b_ob, skip_panorama); if(!skip_panorama && bcam->type == CAMERA_PANORAMA) { /* in panorama camera view, we map viewplane to camera border */ BoundBox2D view_box, cam_box; - blender_camera_view_subset(b_scene.render(), b_scene, b_ob, b_v3d, b_rv3d, width, height, + blender_camera_view_subset(b_engine, b_scene.render(), b_scene, b_ob, b_v3d, b_rv3d, width, height, &view_box, &cam_box); bcam->pano_viewplane = view_box.make_relative_to(cam_box); @@ -493,7 +498,7 @@ static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL: bcam->matrix = transform_inverse(get_transform(b_rv3d.view_matrix())); } -static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d, +static void blender_camera_view_subset(BL::RenderEngine b_engine, BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height, BoundBox2D *view_box, BoundBox2D *cam_box) { BoundBox2D cam, view; @@ -502,7 +507,7 @@ static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_ /* get viewport viewplane */ BlenderCamera view_bcam; blender_camera_init(&view_bcam, b_render); - blender_camera_from_view(&view_bcam, b_scene, b_v3d, b_rv3d, width, height, true); + blender_camera_from_view(&view_bcam, b_engine, b_scene, b_v3d, b_rv3d, width, height, true); blender_camera_viewplane(&view_bcam, width, height, &view, &view_aspect, &sensor_size); @@ -510,7 +515,7 @@ static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_ /* get camera viewplane */ BlenderCamera cam_bcam; blender_camera_init(&cam_bcam, b_render); - blender_camera_from_object(&cam_bcam, b_ob, true); + blender_camera_from_object(&cam_bcam, b_engine, b_ob, true); blender_camera_viewplane(&cam_bcam, cam_bcam.full_width, cam_bcam.full_height, &cam, &cam_aspect, &sensor_size); @@ -520,7 +525,8 @@ static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_ *cam_box = cam * (1.0f/cam_aspect); } -static void blender_camera_border_subset(BL::RenderSettings b_render, +static void blender_camera_border_subset(BL::RenderEngine b_engine, + BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, @@ -531,7 +537,7 @@ static void blender_camera_border_subset(BL::RenderSettings b_render, { /* Determine camera viewport subset. */ BoundBox2D view_box, cam_box; - blender_camera_view_subset(b_render, b_scene, b_ob, b_v3d, b_rv3d, width, height, + blender_camera_view_subset(b_engine, b_render, b_scene, b_ob, b_v3d, b_rv3d, width, height, &view_box, &cam_box); /* Determine viewport subset matching given border. */ @@ -539,7 +545,7 @@ static void blender_camera_border_subset(BL::RenderSettings b_render, *result = cam_box.subset(border); } -static void blender_camera_border(BlenderCamera *bcam, BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d, +static void blender_camera_border(BlenderCamera *bcam, BL::RenderEngine b_engine, BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height) { bool is_camera_view; @@ -568,7 +574,8 @@ static void blender_camera_border(BlenderCamera *bcam, BL::RenderSettings b_rend /* Determine camera border inside the viewport. */ BoundBox2D full_border; - blender_camera_border_subset(b_render, + blender_camera_border_subset(b_engine, + b_render, b_scene, b_v3d, b_rv3d, @@ -587,7 +594,8 @@ static void blender_camera_border(BlenderCamera *bcam, BL::RenderSettings b_rend bcam->border.top = b_render.border_max_y(); /* Determine viewport subset matching camera border. */ - blender_camera_border_subset(b_render, + blender_camera_border_subset(b_engine, + b_render, b_scene, b_v3d, b_rv3d, @@ -602,8 +610,8 @@ void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int { BlenderCamera bcam; blender_camera_init(&bcam, b_scene.render()); - blender_camera_from_view(&bcam, b_scene, b_v3d, b_rv3d, width, height); - blender_camera_border(&bcam, b_scene.render(), b_scene, b_v3d, b_rv3d, width, height); + 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); } diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 4f428bbea57..17bab0ab525 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -331,9 +331,9 @@ static ShaderEvalType get_shader_type(const string& pass_type) return SHADER_EVAL_BAKE; } -static BL::RenderResult begin_render_result(BL::RenderEngine b_engine, int x, int y, int w, int h, const char *layername) +static BL::RenderResult begin_render_result(BL::RenderEngine b_engine, int x, int y, int w, int h, const char *layername, const char *viewname) { - return b_engine.begin_result(x, y, w, h, layername); + return b_engine.begin_result(x, y, w, h, layername, viewname); } static void end_render_result(BL::RenderEngine b_engine, BL::RenderResult b_rr, bool cancel, bool do_merge_results) @@ -350,7 +350,7 @@ void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_upda int h = params.height; /* get render result */ - BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str()); + BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str(), b_rview_name.c_str()); /* can happen if the intersected rectangle gives 0 width or height */ if(b_rr.ptr.data == NULL) { @@ -415,13 +415,14 @@ void BlenderSession::render() /* render each layer */ BL::RenderSettings r = b_scene.render(); - BL::RenderSettings::layers_iterator b_iter; + BL::RenderSettings::layers_iterator b_layer_iter; + BL::RenderResult::views_iterator b_view_iter; - for(r.layers.begin(b_iter); b_iter != r.layers.end(); ++b_iter) { - b_rlay_name = b_iter->name(); + for(r.layers.begin(b_layer_iter); b_layer_iter != r.layers.end(); ++b_layer_iter) { + b_rlay_name = b_layer_iter->name(); - /* temporary render result to find needed passes */ - BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_rlay_name.c_str()); + /* temporary render result to find needed passes and views */ + BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_rlay_name.c_str(), NULL); BL::RenderResult::layers_iterator b_single_rlay; b_rr.layers.begin(b_single_rlay); @@ -456,31 +457,41 @@ void BlenderSession::render() } } - /* free result without merging */ - end_render_result(b_engine, b_rr, true, false); - buffer_params.passes = passes; - scene->film->pass_alpha_threshold = b_iter->pass_alpha_threshold(); + scene->film->pass_alpha_threshold = b_layer_iter->pass_alpha_threshold(); scene->film->tag_passes_update(scene, passes); scene->film->tag_update(scene); scene->integrator->tag_update(scene); - /* update scene */ - sync->sync_camera(b_render, b_engine.camera_override(), width, height); - sync->sync_data(b_v3d, b_engine.camera_override(), &python_thread_state, b_rlay_name.c_str()); + for(b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter) { + b_rview_name = b_view_iter->name(); - /* update number of samples per layer */ - int samples = sync->get_layer_samples(); - bool bound_samples = sync->get_layer_bound_samples(); + /* set the current view */ + b_engine.active_view_set(b_rview_name.c_str()); - if(samples != 0 && (!bound_samples || (samples < session_params.samples))) - session->reset(buffer_params, samples); - else - session->reset(buffer_params, session_params.samples); + /* update scene */ + sync->sync_camera(b_render, b_engine.camera_override(), width, height); + sync->sync_data(b_v3d, b_engine.camera_override(), &python_thread_state, b_rlay_name.c_str()); - /* render */ - session->start(); - session->wait(); + /* update number of samples per layer */ + int samples = sync->get_layer_samples(); + bool bound_samples = sync->get_layer_bound_samples(); + + if(samples != 0 && (!bound_samples || (samples < session_params.samples))) + session->reset(buffer_params, samples); + else + session->reset(buffer_params, session_params.samples); + + /* render */ + session->start(); + session->wait(); + + if(session->progress.get_cancel()) + break; + } + + /* free result without merging */ + end_render_result(b_engine, b_rr, true, false); if(session->progress.get_cancel()) break; @@ -619,10 +630,12 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::Re b_pass.rect(&pixels[0]); } } - - /* copy combined pass */ - if(buffers->get_pass_rect(PASS_COMBINED, exposure, rtile.sample, 4, &pixels[0])) - b_rlay.rect(&pixels[0]); + else { + /* copy combined pass */ + BL::RenderPass b_combined_pass(b_rlay.passes.find_by_type(BL::RenderPass::type_COMBINED, b_rview_name.c_str())); + if(buffers->get_pass_rect(PASS_COMBINED, exposure, rtile.sample, 4, &pixels[0])) + b_combined_pass.rect(&pixels[0]); + } /* tag result as updated */ b_engine.update_result(b_rr); @@ -841,6 +854,9 @@ void BlenderSession::update_status_progress() scene += " | " + b_scene.name(); if(b_rlay_name != "") scene += ", " + b_rlay_name; + + if(b_rview_name != "") + scene += ", " + b_rview_name; } else { BLI_timestr(total_time, time_str, sizeof(time_str)); diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h index c8070286006..b6fc709b92e 100644 --- a/intern/cycles/blender/blender_session.h +++ b/intern/cycles/blender/blender_session.h @@ -90,6 +90,7 @@ public: BL::SpaceView3D b_v3d; BL::RegionView3D b_rv3d; string b_rlay_name; + string b_rview_name; string last_status; string last_error; |