[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27340] trunk/blender: option to use offscreen opengl drawing with the sequencer scene strips.

Campbell Barton ideasman42 at gmail.com
Mon Mar 8 22:33:51 CET 2010


Revision: 27340
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27340
Author:   campbellbarton
Date:     2010-03-08 22:33:51 +0100 (Mon, 08 Mar 2010)

Log Message:
-----------
option to use offscreen opengl drawing with the sequencer scene strips.

warning, uses bad level call, will need to resolve very very soon!

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_sequencer.py
    trunk/blender/source/blender/blenkernel/intern/screen.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/makesdna/DNA_sequence_types.h
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c

Modified: trunk/blender/release/scripts/ui/space_sequencer.py
===================================================================
--- trunk/blender/release/scripts/ui/space_sequencer.py	2010-03-08 20:37:45 UTC (rev 27339)
+++ trunk/blender/release/scripts/ui/space_sequencer.py	2010-03-08 21:33:51 UTC (rev 27340)
@@ -617,6 +617,7 @@
         strip = act_strip(context)
 
         layout.template_ID(strip, "scene")
+        layout.prop(strip, "use_opengl")
 
 
 class SEQUENCER_PT_filter(SequencerButtonsPanel):

Modified: trunk/blender/source/blender/blenkernel/intern/screen.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/screen.c	2010-03-08 20:37:45 UTC (rev 27339)
+++ trunk/blender/source/blender/blenkernel/intern/screen.c	2010-03-08 21:33:51 UTC (rev 27340)
@@ -351,4 +351,3 @@
 	}
 	return NULL;
 }
-

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c	2010-03-08 20:37:45 UTC (rev 27339)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c	2010-03-08 21:33:51 UTC (rev 27340)
@@ -39,6 +39,7 @@
 #include "DNA_sequence_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_anim_types.h"
+#include "DNA_object_types.h"
 
 #include "BKE_global.h"
 #include "BKE_image.h"
@@ -46,6 +47,7 @@
 #include "BKE_sequencer.h"
 #include "BKE_fcurve.h"
 #include "BKE_utildefines.h"
+#include "BKE_scene.h"
 #include "RNA_access.h"
 #include "RE_pipeline.h"
 
@@ -1938,6 +1940,8 @@
 static TStripElem* do_build_seq_array_recursively(Scene *scene,
 				ListBase *seqbasep, int cfra, int chanshown, int render_size);
 
+extern ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height);
+
 static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int cfra,
 			      int build_proxy_run, int render_size)
 {
@@ -2130,48 +2134,53 @@
 		
 		if (!sce_valid) {
 			se->ok = STRIPELEM_FAILED;
-		} else if (se->ibuf==NULL && sce_valid) {
-			int do_opengl= 0;
-			if(do_opengl && have_seq==0 && (sequencer_view3d_cb!=NULL)) {
+		}
+		else if (se->ibuf==NULL && sce_valid) {
+			int frame= seq->sfra + se->nr + seq->anim_startofs;
+			int oldcfra = seq->scene->r.cfra;
+
+			/* Hack! This function can be called from do_render_seq(), in that case
+			   the seq->scene can already have a Render initialized with same name,
+			   so we have to use a default name. (compositor uses scene name to
+			   find render).
+			   However, when called from within the UI (image preview in sequencer)
+			   we do want to use scene Render, that way the render result is defined
+			   for display in render/imagewindow
+
+			   Hmm, don't see, why we can't do that all the time,
+			   and since G.rendering is uhm, gone... (Peter)
+			*/
+
+			int rendering = 1;
+			int doseq;
+
+			/* prevent eternal loop */
+			doseq= scene->r.scemode & R_DOSEQ;
+			scene->r.scemode &= ~R_DOSEQ;
+
+			seq->scene->r.cfra= frame;
+
+			if(G.background==0 && (seq->flag & SEQ_USE_SCENE_OPENGL) && have_seq==0) {
 				/* opengl offscreen render */
 
-				/* sequencer_view3d_cb */
-				// void (*seq_view3d_cb)(Scene *, int, int, int, int)= sequencer_view3d_cb;
-
-				// seq_view3d_cb(scene, cfra, render_size, seqrectx, seqrecty);
+#ifdef DURIAN_CAMERA_SWITCH
+				Object *camera= scene_find_camera_switch(seq->scene);
+				if(camera)
+					seq->scene->camera= camera;
+#endif
+				scene_update_for_newframe(seq->scene, seq->scene->lay);
+				se->ibuf= ED_view3d_draw_offscreen_imbuf_simple(seq->scene, seqrectx, seqrecty); // BAD LEVEL CALL! DONT ALLOW THIS FOR MORE THEN A FEW DAYS, USE A CALLBACK!!! - campell
 			}
 			else {
 				RenderResult rres;
-				int oldcfra;
-				/* Hack! This function can be called from do_render_seq(), in that case
-				   the seq->scene can already have a Render initialized with same name,
-				   so we have to use a default name. (compositor uses scene name to
-				   find render).
-				   However, when called from within the UI (image preview in sequencer)
-				   we do want to use scene Render, that way the render result is defined
-				   for display in render/imagewindow
 
-				   Hmm, don't see, why we can't do that all the time,
-				   and since G.rendering is uhm, gone... (Peter)
-				*/
-
-				int rendering = 1;
-				int doseq;
-
-				oldcfra = seq->scene->r.cfra;
-
 				if(rendering)
 					re= RE_NewRender(" do_build_seq_ibuf", RE_SLOT_DEFAULT);
 				else
 					re= RE_NewRender(sce->id.name, RE_SLOT_VIEW);
 
-				/* prevent eternal loop */
-				doseq= scene->r.scemode & R_DOSEQ;
-				scene->r.scemode &= ~R_DOSEQ;
+				RE_BlenderFrame(re, sce, NULL, frame);
 
-				RE_BlenderFrame(re, sce, NULL,
-						seq->sfra+se->nr+seq->anim_startofs);
-
 				RE_AcquireResultImage(re, &rres);
 
 				if(rres.rectf) {
@@ -2189,13 +2198,13 @@
 				RE_ReleaseResultImage(re);
 
 				// BIF_end_render_callbacks();
-
-				/* restore */
-				scene->r.scemode |= doseq;
+			}
 			
-				seq->scene->r.cfra = oldcfra;
-			}
+			/* restore */
+			scene->r.scemode |= doseq;
 
+			seq->scene->r.cfra = oldcfra;
+
 			copy_to_ibuf_still(seq, se);
 
 			if (!build_proxy_run) {

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2010-03-08 20:37:45 UTC (rev 27339)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2010-03-08 21:33:51 UTC (rev 27340)
@@ -159,6 +159,7 @@
 	int winx, int winy, float viewmat[][4], float winmat[][4]);
 
 struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey);
+struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height);
 
 void view3d_clipping_local(struct RegionView3D *rv3d, float mat[][4]);
 

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2010-03-08 20:37:45 UTC (rev 27339)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2010-03-08 21:33:51 UTC (rev 27340)
@@ -5515,7 +5515,7 @@
 		memcpy(array, rv3d->winmat, sizeof(rv3d->winmat)); array += sizeof(rv3d->winmat)/sizeof(float);
 		memcpy(array, rv3d->viewmat, sizeof(rv3d->viewmat)); array += sizeof(rv3d->viewmat)/sizeof(float);
 		orth= project_paint_view_clip(v3d, rv3d, &array[0], &array[1]);
-		array[2]= orth ? 1.0f : 0.0f;
+		array[2]= orth ? 1.0f : 0.0f; /* using float for a bool is dodgy but since its an extra member in the array... easier then adding a single bool prop */
 
 		IDP_AddToGroup(idgroup, view_data);
 

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2010-03-08 20:37:45 UTC (rev 27339)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2010-03-08 21:33:51 UTC (rev 27340)
@@ -687,6 +687,9 @@
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
 
+	/* without this colors can flicker from previous opengl state */
+	glColor4ub(255, 255, 255, 255);
+
 	UI_view2d_totRect_set(v2d, viewrectx + 0.5f, viewrecty + 0.5f);
 	UI_view2d_curRect_validate(v2d);
 

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-03-08 20:37:45 UTC (rev 27339)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2010-03-08 21:33:51 UTC (rev 27340)
@@ -2031,6 +2031,8 @@
 	ar->winy= bwiny;
 
 	glPopMatrix();
+
+	glColor4ub(255, 255, 255, 255); // XXX, without this the sequencer flickers with opengl draw enabled, need to find out why - campbell
 }
 
 /* utility func for ED_view3d_draw_offscreen */
@@ -2075,6 +2077,47 @@
 	return ibuf;
 }
 
+/* creates own 3d views, used by the sequencer */
+ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height)
+{
+	View3D v3d;
+	ARegion ar;
+	RegionView3D rv3d;
+
+	memset(&v3d, 0, sizeof(v3d));
+	memset(&ar, 0, sizeof(ar));
+	memset(&rv3d, 0, sizeof(rv3d));
+
+	/* connect data */
+	v3d.regionbase.first= v3d.regionbase.last= &ar;
+	ar.regiondata= &rv3d;
+	ar.regiontype= RGN_TYPE_WINDOW;
+
+	v3d.camera= scene->camera;
+	v3d.lay= scene->lay;
+	v3d.drawtype = OB_SOLID; /* should be able to configure */
+
+	rv3d.persp= RV3D_CAMOB;
+
+	copy_m4_m4(rv3d.viewinv, v3d.camera->obmat);
+	normalize_m4(rv3d.viewinv);
+	invert_m4_m4(rv3d.viewmat, rv3d.viewinv);
+
+	{
+		float _yco, _dx, _dy;
+		rctf _viewplane;
+		object_camera_matrix(&scene->r, v3d.camera, width, height, 0, rv3d.winmat, &_viewplane, &v3d.near, &v3d.far, &v3d.lens, &_yco, &_dx, &_dy);
+	}
+
+	mul_m4_m4m4(rv3d.persmat, rv3d.viewmat, rv3d.winmat);
+	invert_m4_m4(rv3d.persinv, rv3d.viewinv);
+
+	return ED_view3d_draw_offscreen_imbuf(scene, &v3d, &ar, width, height);
+
+	// seq_view3d_cb(scene, cfra, render_size, seqrectx, seqrecty);
+}
+
+
 /* NOTE: the info that this uses is updated in ED_refresh_viewport_fps(), 
  * which currently gets called during SCREEN_OT_animation_step.
  */

Modified: trunk/blender/source/blender/makesdna/DNA_sequence_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2010-03-08 20:37:45 UTC (rev 27339)
+++ trunk/blender/source/blender/makesdna/DNA_sequence_types.h	2010-03-08 21:33:51 UTC (rev 27340)
@@ -273,6 +273,8 @@
 #define SEQ_USE_PROXY_CUSTOM_FILE             2097152
 #define SEQ_USE_EFFECT_DEFAULT_FADE           4194304
 
+#define SEQ_USE_SCENE_OPENGL         		  8388608
+
 /* deprecated, dont use a flag anymore*/
 /*#define SEQ_ACTIVE                            1048576*/
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_sequencer.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_sequencer.c	2010-03-08 20:37:45 UTC (rev 27339)
+++ trunk/blender/source/blender/makesrna/intern/rna_sequencer.c	2010-03-08 21:33:51 UTC (rev 27340)
@@ -920,7 +920,13 @@
 	RNA_def_property_flag(prop, PROP_EDITABLE);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list