[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