[Bf-blender-cvs] [4aad147] viewport_experiments: Support camera GPU parameters when looking/rendering through camera in the viewport.

Antony Riakiotakis noreply at git.blender.org
Tue Nov 4 14:32:07 CET 2014


Commit: 4aad147fe457d7d1cc916645e07569a19833e068
Author: Antony Riakiotakis
Date:   Tue Nov 4 14:28:25 2014 +0100
Branches: viewport_experiments
https://developer.blender.org/rB4aad147fe457d7d1cc916645e07569a19833e068

Support camera GPU parameters when looking/rendering through camera in
the viewport.

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

M	source/blender/blenkernel/BKE_camera.h
M	source/blender/blenkernel/intern/camera.c
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/render/render_opengl.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/gpu/intern/gpu_compositing.c
M	source/blender/makesdna/DNA_gpu_types.h
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/source/blender/blenkernel/BKE_camera.h b/source/blender/blenkernel/BKE_camera.h
index 01b401c..52fbc73 100644
--- a/source/blender/blenkernel/BKE_camera.h
+++ b/source/blender/blenkernel/BKE_camera.h
@@ -46,6 +46,7 @@ struct RenderData;
 struct Scene;
 struct rctf;
 struct View3D;
+struct GPUFXOptions;
 
 /* Camera Datablock */
 
@@ -120,6 +121,8 @@ void BKE_camera_view_frame(struct Scene *scene, struct Camera *camera, float r_v
 bool BKE_camera_view_frame_fit_to_scene(struct Scene *scene, struct View3D *v3d, struct Object *camera_ob,
                                         float r_co[3]);
 
+void BKE_GPU_dof_from_camera(struct Object *camera, struct GPUFXOptions *options);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c
index 1402f62..215da01 100644
--- a/source/blender/blenkernel/intern/camera.c
+++ b/source/blender/blenkernel/intern/camera.c
@@ -593,3 +593,19 @@ bool BKE_camera_view_frame_fit_to_scene(Scene *scene, struct View3D *v3d, Object
 		}
 	}
 }
+
+void BKE_GPU_dof_from_camera(struct Object *camera, struct GPUFXOptions *options)
+{
+	if (camera->type == OB_CAMERA) {
+		Camera *cam = camera->data;
+		options->dof_options = &cam->gpu_dof;
+		if (cam->dof_ob) {
+			float vec[3];
+			sub_v3_v3v3(vec, cam->dof_ob->obmat[3], camera->obmat[3]);
+			options->dof_options->dof_focus_distance = len_v3(vec);
+		}
+		else {
+			options->dof_options->dof_focus_distance = cam->YF_dofdist;
+		}
+	}
+}
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index 9b998fc..b51e210 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -63,6 +63,7 @@ struct wmOperatorType;
 struct wmWindow;
 struct GPUFX;
 struct GPUOffScreen;
+struct GPUFXOptions;
 
 /* for derivedmesh drawing callbacks, for view3d_select, .... */
 typedef struct ViewContext {
@@ -306,7 +307,7 @@ int ED_view3d_scene_layer_set(int lay, const int *values, int *active);
 bool ED_view3d_context_activate(struct bContext *C);
 void ED_view3d_draw_offscreen_init(struct Scene *scene, struct View3D *v3d);
 void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int winx, int winy, float viewmat[4][4],
-                              float winmat[4][4], bool do_bgpic, bool do_sky, struct GPUFX *fx, bool is_persp, struct GPUOffScreen *ofs);
+                              float winmat[4][4], bool do_bgpic, bool do_sky, struct GPUFX *fx, bool is_persp, struct GPUOffScreen *ofs, struct GPUFXOptions *fxoptions, int fxflags);
 
 struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey, unsigned int flag,
                                              bool draw_background, int alpha_mode, char err_out[256]);
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index cadd086..7266f5e 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -33,6 +33,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_camera_types.h"
 #include "BLI_math.h"
 #include "BLI_math_color_blend.h"
 #include "BLI_blenlib.h"
@@ -42,6 +43,7 @@
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
 
+#include "BKE_camera.h"
 #include "BKE_context.h"
 #include "BKE_global.h"
 #include "BKE_image.h"
@@ -206,6 +208,12 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 	}
 	else if (view_context) {
 		bool is_persp;
+		/* full copy */
+		GPUFXOptions options = {0};
+
+		if (v3d->fxoptions)
+			options = *v3d->fxoptions;
+
 		ED_view3d_draw_offscreen_init(scene, v3d);
 
 		GPU_offscreen_bind(oglrender->ofs, true); /* bind */
@@ -216,6 +224,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 			camera = v3d->camera;
 			RE_GetCameraWindow(oglrender->re, camera, scene->r.cfra, winmat);
 			is_persp = true;
+			BKE_GPU_dof_from_camera(camera, &options);
 		}
 		else {
 			rctf viewplane;
@@ -231,7 +240,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 		rect = MEM_mallocN(sizex * sizey * sizeof(unsigned char) * 4, "offscreen rect");
 
 		if ((scene->r.mode & R_OSA) == 0) {
-			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs);
+			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs, &options, v3d->shader_fx);
 			GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
 		}
 		else {
@@ -244,7 +253,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 			BLI_jitter_init(jit_ofs, scene->r.osa);
 
 			/* first sample buffer, also initializes 'rv3d->persmat' */
-			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs);
+			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs, &options, v3d->shader_fx);
 			GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
 
 			for (i = 0; i < sizex * sizey * 4; i++)
@@ -257,7 +266,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 				                    (jit_ofs[j][0] * 2.0f) / sizex,
 				                    (jit_ofs[j][1] * 2.0f) / sizey);
 
-				ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat_jitter, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs);
+				ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat_jitter, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs, &options, v3d->shader_fx);
 				GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
 
 				for (i = 0; i < sizex * sizey * 4; i++)
@@ -448,7 +457,7 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op)
 		 * running notifiers again will overwrite */
 		oglrender->scene->customdata_mask |= oglrender->scene->customdata_mask_modal;
 
-		if (oglrender->v3d->shader_fx & (V3D_FX_DEPTH_OF_FIELD | V3D_FX_DEPTH_OF_FIELD)) {
+		if (oglrender->v3d->shader_fx & (GPU_FX_DEPTH_OF_FIELD | GPU_FX_DEPTH_OF_FIELD)) {
 			oglrender->fx = GPU_create_fx_compositor();
 		}
 	}
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index c8386eb..e9bcb8fe 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -2501,7 +2501,7 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
 		invert_m4_m4(rv3d.persinv, rv3d.viewinv);
 
 		/* no need to call ED_view3d_draw_offscreen_init since shadow buffers were already updated */
-		ED_view3d_draw_offscreen(scene, v3d, &ar, winsize, winsize, viewmat, winmat, false, false, NULL, true, NULL);
+		ED_view3d_draw_offscreen(scene, v3d, &ar, winsize, winsize, viewmat, winmat, false, false, NULL, true, NULL, NULL, 0);
 		GPU_lamp_shadow_buffer_unbind(shadow->lamp);
 		
 		v3d->drawtype = drawtype;
@@ -2811,7 +2811,7 @@ void ED_view3d_draw_offscreen_init(Scene *scene, View3D *v3d)
  */
 void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx, int winy,
                               float viewmat[4][4], float winmat[4][4],
-                              bool do_bgpic, bool do_sky, GPUFX *fx, bool is_persp, GPUOffScreen *ofs)
+                              bool do_bgpic, bool do_sky, GPUFX *fx, bool is_persp, GPUOffScreen *ofs, GPUFXOptions *fxoptions, int fxflags)
 {
 	int bwinx, bwiny;
 	rcti brect;
@@ -2849,7 +2849,7 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
 
 	/* framebuffer fx needed, we need to draw offscreen first */
 	if (v3d->shader_fx && fx) {
-		do_compositing = GPU_initialize_fx_passes(fx, &ar->winrct, NULL, v3d->shader_fx, v3d->fxoptions);
+		do_compositing = GPU_initialize_fx_passes(fx, &ar->winrct, NULL, fxflags, fxoptions);
 	}
 
 	/* clear opengl buffers */
@@ -2937,6 +2937,8 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
 	/* render 3d view */
 	if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
 		CameraParams params;
+		GPUFXOptions options = {0};
+		Object *camera = v3d->camera;
 
 		BKE_camera_params_init(&params);
 		/* fallback for non camera objects */
@@ -2946,10 +2948,12 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
 		BKE_camera_params_compute_viewplane(&params, sizex, sizey, scene->r.xasp, scene->r.yasp);
 		BKE_camera_params_compute_matrix(&params);
 
-		ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, params.winmat, draw_background, draw_sky, NULL, !params.is_ortho, ofs);
+		BKE_GPU_dof_from_camera(camera, &options);
+
+		ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, params.winmat, draw_background, draw_sky, NULL, !params.is_ortho, ofs, &options, 0);
 	}
 	else {
-		ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL, draw_background, draw_sky, NULL, true, ofs);
+		ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, NULL, draw_background, draw_sky, NULL, true, ofs, NULL, 0);
 	}
 
 	/* read in pixels & stamp */
@@ -3442,10 +3446,14 @@ static void view3d_main_area_draw_objects(const bContext *C, Scene *scene, View3
 
 	/* framebuffer fx needed, we need to draw offscreen first */
 	if (v3d->shader_fx) {
+		GPUFXOptions options = *v3d->fxoptions;
 		if (!rv3d->compositor)
 			rv3d->compositor = GPU_create_fx_compositor();
 		
-		do_compositing = GPU_initialize_fx_passes(rv3d->compositor, &ar->winrct, &ar->drawrct, v3d->shader_fx, v3d->fxoptions);
+		if (rv3d->persp == RV3D_CAMOB && v3d->camera)
+			BKE_GPU_dof_from_camera(v3d->camera, &options);
+
+		do_compositing = GPU_initialize_fx_passes(rv3d->compositor, &ar->winrct, &ar->drawrct, v3d->shader_fx, &options);
 	}
 	
 	/* clear the background */
diff --git a/source/blender/gpu/intern/gpu_compositing.c b/source/blender/gpu/intern/gpu_compositing.c
index d441535..08ad144 100644
--- a/source/blender/gpu/intern/gpu_compositing.

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list