[Bf-blender-cvs] [02e5bdf] overscan: Initial implementation of overscan rendering

Sergey Sharybin noreply at git.blender.org
Thu Apr 17 15:27:52 CEST 2014


Commit: 02e5bdf864bdf001af5ef751f296e90c02edad5b
Author: Sergey Sharybin
Date:   Fri Mar 23 23:12:24 2012 +0100
https://developer.blender.org/rB02e5bdf864bdf001af5ef751f296e90c02edad5b

Initial implementation of overscan rendering

For now only affects blender internal renderer and viewport.
Currently it's possible to define overscan (in %%) manually
or make it so distortion matches the motrack displacement
model.

Still need to do loads of things in compositor, but it's
not such a bad starting point.

We can even start a branch for this.

Reviewers: dfelinto

Differential Revision: https://developer.blender.org/D462

===================================================================

M	release/scripts/startup/bl_ui/properties_render.py
M	source/blender/blenkernel/BKE_camera.h
M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/BKE_tracking.h
M	source/blender/blenkernel/intern/camera.c
M	source/blender/blenkernel/intern/depsgraph.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenkernel/intern/tracking.c
M	source/blender/editors/gpencil/drawgpencil.c
M	source/blender/editors/gpencil/gpencil_edit.c
M	source/blender/editors/gpencil/gpencil_paint.c
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/render/render_internal.c
M	source/blender/editors/render/render_opengl.c
M	source/blender/editors/space_node/drawnode.c
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/editors/space_view3d/view3d_edit.c
M	source/blender/editors/space_view3d/view3d_fly.c
M	source/blender/editors/space_view3d/view3d_intern.h
M	source/blender/editors/space_view3d/view3d_view.c
M	source/blender/editors/space_view3d/view3d_walk.c
M	source/blender/editors/transform/transform_manipulator.c
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/source/initrender.c
M	source/blender/render/intern/source/pipeline.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index ce375ec..c8c3ae3 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -172,6 +172,12 @@ class RENDER_PT_dimensions(RenderButtonsPanel, Panel):
         subrow.prop(rd, "frame_map_old", text="Old")
         subrow.prop(rd, "frame_map_new", text="New")
 
+        col = layout.column()
+        col.prop(rd, "use_detect_overscan")
+        sub = col.row()
+        sub.active = not rd.use_detect_overscan
+        sub.prop(rd, "overscan")
+
 
 class RENDER_PT_antialiasing(RenderButtonsPanel, Panel):
     bl_label = "Anti-Aliasing"
diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h
index 01b401c..ac59151 100644
--- a/source/blender/blenkernel/BKE_camera.h
+++ b/source/blender/blenkernel/BKE_camera.h
@@ -97,7 +97,12 @@ typedef struct CameraParams {
 	float ycor;
 	float viewdx;
 	float viewdy;
-	rctf viewplane;
+	rctf viewplane;  /* viewplane used for displaying/rendering which might include overscan correction */
+	rctf underscan_viewplane;  /* viewplane which isn't affected by overscan */
+
+	/* overscan */
+	float overscan;
+	bool apply_overscan;
 
 	/* computed matrix */
 	float winmat[4][4];
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 5fe8904..a02b192 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -138,6 +138,10 @@ int BKE_scene_num_threads(const struct Scene *scene);
 int BKE_render_num_threads(const struct RenderData *r);
 
 int BKE_scene_num_omp_threads(const struct Scene *scene);
+
+/* overscan */
+void BKE_scene_update_overscan(struct Scene *scene);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/BKE_tracking.h b/source/blender/blenkernel/BKE_tracking.h
index 6d155ba..3a0d7f4 100644
--- a/source/blender/blenkernel/BKE_tracking.h
+++ b/source/blender/blenkernel/BKE_tracking.h
@@ -188,6 +188,8 @@ void BKE_tracking_distortion_free(struct MovieDistortion *distortion);
 void BKE_tracking_distort_v2(struct MovieTracking *tracking, const float co[2], float r_co[2]);
 void BKE_tracking_undistort_v2(struct MovieTracking *tracking, const float co[2], float r_co[2]);
 
+float BKE_tracking_overscan_detect(struct MovieClip *clip);
+
 struct ImBuf *BKE_tracking_undistort_frame(struct MovieTracking *tracking, struct ImBuf *ibuf,
                                            int calibration_width, int calibration_height, float overscan);
 struct ImBuf *BKE_tracking_distort_frame(struct MovieTracking *tracking, struct ImBuf *ibuf,
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index b20ba40..ded7db7 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -202,6 +202,9 @@ void BKE_camera_params_init(CameraParams *params)
 	/* fallback for non camera objects */
 	params->clipsta = 0.1f;
 	params->clipsta = 100.0f;
+
+	params->overscan = 0.0f;
+	params->apply_overscan = false;
 }
 
 void BKE_camera_params_from_object(CameraParams *params, Object *ob)
@@ -227,6 +230,8 @@ void BKE_camera_params_from_object(CameraParams *params, Object *ob)
 
 		params->clipsta = cam->clipsta;
 		params->clipend = cam->clipend;
+
+		params->apply_overscan = true;
 	}
 	else if (ob->type == OB_LAMP) {
 		/* lamp object */
@@ -286,9 +291,11 @@ void BKE_camera_params_from_view3d(CameraParams *params, View3D *v3d, RegionView
 
 void BKE_camera_params_compute_viewplane(CameraParams *params, int winx, int winy, float xasp, float yasp)
 {
-	rctf viewplane;
+	rctf viewplane, underscan_viewplane;
 	float pixsize, viewfac, sensor_size, dx, dy;
 	int sensor_fit;
+	float overscan = params->overscan / 100.0f;
+	float viewx, viewy;
 
 	/* fields rendering */
 	params->ycor = yasp / xasp;
@@ -335,15 +342,32 @@ void BKE_camera_params_compute_viewplane(CameraParams *params, int winx, int win
 	viewplane.xmax += dx;
 	viewplane.ymax += dy;
 
+	underscan_viewplane = viewplane;
+
+	/* apply overscan */
+	if (params->apply_overscan) {
+		viewx = viewplane.xmax - viewplane.xmin;
+		viewy = viewplane.ymax - viewplane.ymin;
+
+		viewplane.xmin -= 0.5f*overscan*viewx;
+		viewplane.xmax += 0.5f*overscan*viewx;
+		viewplane.ymin -= 0.5f*overscan*viewy;
+		viewplane.ymax += 0.5f*overscan*viewy;
+	}
+
 	/* fields offset */
 	if (params->field_second) {
 		if (params->field_odd) {
 			viewplane.ymin -= 0.5f * params->ycor;
 			viewplane.ymax -= 0.5f * params->ycor;
+			underscan_viewplane.ymin -= 0.5f * params->ycor;
+			underscan_viewplane.ymax -= 0.5f * params->ycor;
 		}
 		else {
 			viewplane.ymin += 0.5f * params->ycor;
 			viewplane.ymax += 0.5f * params->ycor;
+			underscan_viewplane.ymin += 0.5f * params->ycor;
+			underscan_viewplane.ymax += 0.5f * params->ycor;
 		}
 	}
 
@@ -354,9 +378,15 @@ void BKE_camera_params_compute_viewplane(CameraParams *params, int winx, int win
 	viewplane.ymin *= pixsize;
 	viewplane.ymax *= pixsize;
 
+	underscan_viewplane.xmin *= pixsize;
+	underscan_viewplane.xmax *= pixsize;
+	underscan_viewplane.ymin *= pixsize;
+	underscan_viewplane.ymax *= pixsize;
+
 	params->viewdx = pixsize;
 	params->viewdy = params->ycor * pixsize;
 	params->viewplane = viewplane;
+	params->underscan_viewplane = underscan_viewplane;
 }
 
 /* viewplane is assumed to be already computed */
@@ -380,6 +410,7 @@ void BKE_camera_view_frame_ex(Scene *scene, Camera *camera, float drawsize, cons
 {
 	float facx, facy;
 	float depth;
+	float overscan_factor= 1.0f;
 
 	/* aspect correcton */
 	if (scene) {
@@ -387,6 +418,8 @@ void BKE_camera_view_frame_ex(Scene *scene, Camera *camera, float drawsize, cons
 		float aspy = (float) scene->r.ysch * scene->r.yasp;
 		int sensor_fit = BKE_camera_sensor_fit(camera->sensor_fit, aspx, aspy);
 
+		overscan_factor = 1.0f + scene->r.overscan / 100.0f;
+
 		if (sensor_fit == CAMERA_SENSOR_FIT_HOR) {
 			r_asp[0] = 1.0;
 			r_asp[1] = aspy / aspx;
@@ -401,12 +434,12 @@ void BKE_camera_view_frame_ex(Scene *scene, Camera *camera, float drawsize, cons
 		r_asp[1] = 1.0f;
 	}
 
-	if (camera->type == CAM_ORTHO) {
-		facx = 0.5f * camera->ortho_scale * r_asp[0] * scale[0];
-		facy = 0.5f * camera->ortho_scale * r_asp[1] * scale[1];
-		r_shift[0] = camera->shiftx * camera->ortho_scale * scale[0];
-		r_shift[1] = camera->shifty * camera->ortho_scale * scale[1];
-		depth = do_clip ? -((camera->clipsta * scale[2]) + 0.1f) : -drawsize * camera->ortho_scale * scale[2];
+	if (camera->type==CAM_ORTHO) {
+		facx = 0.5f * camera->ortho_scale * r_asp[0] * scale[0] * overscan_factor;
+		facy = 0.5f * camera->ortho_scale * r_asp[1] * scale[1] * overscan_factor;
+		r_shift[0] = camera->shiftx * camera->ortho_scale * scale[0] * overscan_factor;
+		r_shift[1] = camera->shifty * camera->ortho_scale * scale[1] * overscan_factor;
+		depth = do_clip ? -((camera->clipsta * scale[2]) + 0.1f) : - drawsize * camera->ortho_scale * scale[2];
 
 		*r_drawsize = 0.5f * camera->ortho_scale;
 	}
@@ -435,10 +468,10 @@ void BKE_camera_view_frame_ex(Scene *scene, Camera *camera, float drawsize, cons
 			scale_y = scale[1];
 		}
 
-		facx = fac * r_asp[0] * scale_x;
-		facy = fac * r_asp[1] * scale_y;
-		r_shift[0] = camera->shiftx * fac * 2.0f * scale_x;
-		r_shift[1] = camera->shifty * fac * 2.0f * scale_y;
+		facx = fac * r_asp[0] * scale_x * overscan_factor;
+		facy = fac * r_asp[1] * scale_y * overscan_factor;
+		r_shift[0] = camera->shiftx * fac * 2.0f * scale_x * overscan_factor;
+		r_shift[1] = camera->shifty * fac * 2.0f * scale_y * overscan_factor;
 	}
 
 	r_vec[0][0] = r_shift[0] + facx; r_vec[0][1] = r_shift[1] + facy; r_vec[0][2] = depth;
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index df1695d..f051582 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -2475,9 +2475,15 @@ static void dag_id_flush_update(Main *bmain, Scene *sce, ID *id)
 
 		if (idtype == ID_MC) {
 			MovieClip *clip = (MovieClip *) id;
+			Scene *scene;
 
 			BKE_tracking_dopesheet_tag_update(&clip->tracking);
 
+			for (scene = bmain->scene.first; scene; scene = scene->id.next) {
+				if (scene->clip == (MovieClip*)id)
+					BKE_scene_update_overscan(scene);
+			}
+
 			for (obt = bmain->object.first; obt; obt = obt->id.next) {
 				bConstraint *con;
 				for (con = obt->constraints.first; con; con = con->next) {
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 608b049..01eb245 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -52,6 +52,7 @@
 #include "DNA_screen_types.h"
 #include "DNA_sequence_types.h"
 #include "DNA_space_types.h"
+#include "DNA_movieclip_types.h"
 
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
@@ -86,6 +87,8 @@
 #include "BKE_sequencer.h"
 #include "BKE_sound.h"
 #include "BKE_world.h"
+#include "BKE_movieclip.h"
+#include "BKE_tracking.h"
 
 #include "RE_engine.h"
 
@@ -1891,3 +1894,14 @@ int BKE_scene_num_omp_threads(const struct Scene *scene)
 	else
 		return scene->omp_threads;
 }
+
+/* overscan */
+void BKE_scene_update_overscan(Scene *scene)
+{
+	float overscan = scene->r.overscan;
+
+	if (scene->r.detect_overscan && scene->clip)
+		overscan = BKE_tracking_overscan_detect(scene->clip);
+
+	scene->r.overscan = overscan;
+}
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index ca0b52b..80db404 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -49,6 +49,7 @@
 #include "BLI_listbase.h"
 #include "BLI_ghash.h"
 #include "BLI_path_util.h"
+#include "BLI_rect.h"
 #include "BLI_string.h"
 #include "BLI_threads.h"
 
@@ -1954,6 +1955,34 @@ void BKE_tracking_max_undistortion_delta_across_bound(MovieTracking *tracking, r
 	}
 }
 
+float BKE_tracking_overscan_detect(MovieClip *clip)
+{
+	float overscan = 0.0f;
+	float scalex = 1.0f, scaley = 1.0f;
+	int width, height;
+	float delta[2];
+	rcti rect;
+	MovieClipUser 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list