[Bf-blender-cvs] [46cc844] viewport_experiments: Offscreen rendering for viewport FX.

Antony Riakiotakis noreply at git.blender.org
Mon Nov 3 20:20:49 CET 2014


Commit: 46cc844f434aea48eec3e73cd5a5f1ab65e5be26
Author: Antony Riakiotakis
Date:   Mon Nov 3 20:20:32 2014 +0100
Branches: viewport_experiments
https://developer.blender.org/rB46cc844f434aea48eec3e73cd5a5f1ab65e5be26

Offscreen rendering for viewport FX.

This is working mostly from the 3D viewport currently, rendering from
the render buttons or the sequencer will not use the FX yet. Still it's
a solid step towards that direction. Also moved options out of the v3d
struct. Old options will be lost and people may get some warnings,
however simply enableing and disabling one of the compositing settings
will bring the controls back.

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/include/ED_view3d.h
M	source/blender/editors/render/render_opengl.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/gpu/GPU_compositing.h
M	source/blender/gpu/GPU_extensions.h
M	source/blender/gpu/intern/gpu_compositing.c
M	source/blender/gpu/intern/gpu_extensions.c
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesdna/DNA_view3d_types.h
M	source/blender/makesrna/intern/rna_scene.c
M	source/blender/makesrna/intern/rna_space.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 2da8a60..a3dc508 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2893,23 +2893,26 @@ class VIEW3D_PT_view3d_shading(Panel):
         if view.viewport_shade not in {'BOUNDBOX', 'WIREFRAME'}:
             if obj and obj.mode == 'EDIT':
                 col.prop(view, "show_occlude_wire")
+
+            fxoptions = view.fxoptions
+
             col.prop(view, "depth_of_field")
             if view.depth_of_field:
                 subcol = col.column(align=True)
-                subcol.prop(view, "dof_focus_distance")
+                subcol.prop(fxoptions, "dof_focus_distance")
                 #fstop is preferable?..
                 #subcol.prop(view, "dof_aperture")
-                subcol.prop(view, "dof_fstop")
-                subcol.prop(view, "dof_focal_length")
-                subcol.prop(view, "dof_sensor")
+                subcol.prop(fxoptions, "dof_fstop")
+                subcol.prop(fxoptions, "dof_focal_length")
+                subcol.prop(fxoptions, "dof_sensor")
             col.prop(view, "ssao")
             if view.ssao:
                 subcol = col.column(align=True)
-                subcol.prop(view, "ssao_darkening")
-                subcol.prop(view, "ssao_distance_max")
-                subcol.prop(view, "ssao_attenuation")
-                subcol.prop(view, "ssao_ray_sample_mode")
-                subcol.prop(view, "ssao_color")
+                subcol.prop(fxoptions, "ssao_darkening")
+                subcol.prop(fxoptions, "ssao_distance_max")
+                subcol.prop(fxoptions, "ssao_attenuation")
+                subcol.prop(fxoptions, "ssao_ray_sample_mode")
+                subcol.prop(fxoptions, "ssao_color")
 
 
 class VIEW3D_PT_view3d_motion_tracking(Panel):
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 52418a8..b1e745f 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6355,7 +6355,7 @@ static bool direct_link_screen(FileData *fd, bScreen *sc)
 		/* add local view3d too */
 		else if (sa->spacetype == SPACE_VIEW3D)
 			blo_do_versions_view3d_split_250(sa->spacedata.first, &sa->regionbase);
-		
+
 		/* incase we set above */
 		sa->butspacetype = sa->spacetype;
 
@@ -6403,6 +6403,10 @@ static bool direct_link_screen(FileData *fd, bScreen *sc)
 				/* render can be quite heavy, set to solid on load */
 				if (v3d->drawtype == OB_RENDER)
 					v3d->drawtype = OB_SOLID;
+
+				if (v3d->fxoptions) {
+					v3d->fxoptions = newdataadr(fd, v3d->fxoptions);
+				}
 				
 				blo_do_versions_view3d_split_250(v3d, &sl->regionbase);
 			}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 59f1265..2fb2d9c 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2640,6 +2640,7 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
 					for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next)
 						writestruct(wd, DATA, "BGpic", 1, bgpic);
 					if (v3d->localvd) writestruct(wd, DATA, "View3D", 1, v3d->localvd);
+					if (v3d->fxoptions) writestruct(wd, DATA, "GPUFXOptions", 1, v3d->fxoptions);
 				}
 				else if (sl->spacetype==SPACE_IPO) {
 					SpaceIpo *sipo= (SpaceIpo *)sl;
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index bd4f37c..9b998fc 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -61,6 +61,8 @@ struct rcti;
 struct wmOperator;
 struct wmOperatorType;
 struct wmWindow;
+struct GPUFX;
+struct GPUOffScreen;
 
 /* for derivedmesh drawing callbacks, for view3d_select, .... */
 typedef struct ViewContext {
@@ -303,8 +305,8 @@ 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);
+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);
 
 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 559c86b..cadd086 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -68,6 +68,7 @@
 
 #include "GPU_extensions.h"
 #include "GPU_glew.h"
+#include "GPU_compositing.h"
 
 #include "wm_window.h"
 
@@ -93,6 +94,7 @@ typedef struct OGLRender {
 	ImageUser iuser;
 
 	GPUOffScreen *ofs;
+	GPUFX *fx;
 	int sizex, sizey;
 	int write_still;
 
@@ -179,7 +181,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 			int i;
 			unsigned char *gp_rect;
 
-			GPU_offscreen_bind(oglrender->ofs);
+			GPU_offscreen_bind(oglrender->ofs, true);
 
 			glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 			glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -197,22 +199,23 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 				rgba_uchar_to_float(col_src, &gp_rect[i]);
 				blend_color_mix_float(&rr->rectf[i], &rr->rectf[i], col_src);
 			}
-			GPU_offscreen_unbind(oglrender->ofs);
+			GPU_offscreen_unbind(oglrender->ofs, true);
 
 			MEM_freeN(gp_rect);
 		}
 	}
 	else if (view_context) {
+		bool is_persp;
 		ED_view3d_draw_offscreen_init(scene, v3d);
 
-		GPU_offscreen_bind(oglrender->ofs); /* bind */
+		GPU_offscreen_bind(oglrender->ofs, true); /* bind */
 
 		/* render 3d view */
 		if (rv3d->persp == RV3D_CAMOB && v3d->camera) {
 			/*int is_ortho = scene->r.mode & R_ORTHO;*/
 			camera = v3d->camera;
 			RE_GetCameraWindow(oglrender->re, camera, scene->r.cfra, winmat);
-			
+			is_persp = true;
 		}
 		else {
 			rctf viewplane;
@@ -221,12 +224,14 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 			bool is_ortho = ED_view3d_viewplane_get(v3d, rv3d, sizex, sizey, &viewplane, &clipsta, &clipend, NULL);
 			if (is_ortho) orthographic_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, -clipend, clipend);
 			else perspective_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, clipsta, clipend);
+
+			is_persp = !is_ortho;
 		}
 
 		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);
+			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs);
 			GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
 		}
 		else {
@@ -239,7 +244,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);
+			ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs);
 			GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
 
 			for (i = 0; i < sizex * sizey * 4; i++)
@@ -252,7 +257,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);
+				ED_view3d_draw_offscreen(scene, v3d, ar, sizex, sizey, NULL, winmat_jitter, draw_bgpic, draw_sky, oglrender->fx, is_persp, oglrender->ofs);
 				GPU_offscreen_read_pixels(oglrender->ofs, GL_UNSIGNED_BYTE, rect);
 
 				for (i = 0; i < sizex * sizey * 4; i++)
@@ -265,7 +270,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
 			MEM_freeN(accum_buffer);
 		}
 
-		GPU_offscreen_unbind(oglrender->ofs); /* unbind */
+		GPU_offscreen_unbind(oglrender->ofs, true); /* unbind */
 	}
 	else {
 		/* shouldnt suddenly give errors mid-render but possible */
@@ -443,6 +448,9 @@ 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)) {
+			oglrender->fx = GPU_create_fx_compositor();
+		}
 	}
 
 	/* create render */
@@ -492,6 +500,9 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender)
 
 	WM_event_add_notifier(C, NC_SCENE | ND_RENDER_RESULT, oglrender->scene);
 
+	if (oglrender->fx)
+		GPU_destroy_fx_compositor(oglrender->fx);
+
 	GPU_offscreen_free(oglrender->ofs);
 
 	oglrender->scene->customdata_mask_modal = 0;
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index a556665..95fb39b 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -419,6 +419,9 @@ static void view3d_free(SpaceLink *sl)
 		BKE_previewimg_free(&vd->defmaterial->preview);
 		MEM_freeN(vd->defmaterial);
 	}
+
+	if (vd->fxoptions)
+		MEM_freeN(vd->fxoptions);
 }
 
 
@@ -460,7 +463,8 @@ static SpaceLink *view3d_duplicate(SpaceLink *sl)
 	}
 
 	v3dn->properties_storage = NULL;
-	
+	v3dn->fxoptions = MEM_dupallocN(v3do->fxoptions);
+
 	return (SpaceLink *)v

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list