[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26688] trunk/blender/source/blender: Partial fix for [#20567] SEQUENCER: Image Preview completely unusable

Andrea Weikert elubie at gmx.net
Sun Feb 7 20:07:57 CET 2010


Revision: 26688
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26688
Author:   elubie
Date:     2010-02-07 20:07:56 +0100 (Sun, 07 Feb 2010)

Log Message:
-----------
Partial fix for [#20567] SEQUENCER: Image Preview completely unusable
* Zoom and Pan should work now (thanks Aligorith for reviewing)
* mostly removed ancient drawing code
* Fit preview in Window still has issue, HOME key in preview area should be working though

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_intern.h
    trunk/blender/source/blender/editors/space_sequencer/space_sequencer.c
    trunk/blender/source/blender/makesdna/DNA_space_types.h

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2010-02-07 18:14:38 UTC (rev 26687)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2010-02-07 19:07:56 UTC (rev 26688)
@@ -5921,6 +5921,29 @@
 	ar->v2d.flag = (V2D_PIXELOFS_X|V2D_PIXELOFS_Y);
 }
 
+static void sequencer_init_preview_region(ARegion* ar)
+{
+	// XXX a bit ugly still, copied from space_sequencer
+	/* NOTE: if you change values here, also change them in space_sequencer.c, sequencer_new */
+	ar->regiontype= RGN_TYPE_PREVIEW;
+	ar->alignment= RGN_ALIGN_TOP;
+	ar->flag |= RGN_FLAG_HIDDEN;
+	ar->v2d.keepzoom= V2D_KEEPASPECT | V2D_KEEPZOOM;
+	ar->v2d.minzoom= 0.00001f;
+	ar->v2d.maxzoom= 100000.0f;
+	ar->v2d.tot.xmin= -960.0f; /* 1920 width centered */
+	ar->v2d.tot.ymin= -540.0f; /* 1080 height centered */
+	ar->v2d.tot.xmax= 960.0f;
+	ar->v2d.tot.ymax= 540.0f;
+	ar->v2d.min[0]= 0.0f;
+	ar->v2d.min[1]= 0.0f;
+	ar->v2d.max[0]= 12000.0f;
+	ar->v2d.max[1]= 12000.0f;
+	ar->v2d.cur= ar->v2d.tot;
+	ar->v2d.align= V2D_ALIGN_FREE; // (V2D_ALIGN_NO_NEG_X|V2D_ALIGN_NO_NEG_Y);
+	ar->v2d.keeptot= V2D_KEEPTOT_FREE;
+}
+
 /* 2.50 patch */
 static void area_add_window_regions(ScrArea *sa, SpaceLink *sl, ListBase *lb)
 {
@@ -6001,9 +6024,7 @@
 				}
 				ar= MEM_callocN(sizeof(ARegion), "preview area for sequencer");
 				BLI_insertlinkbefore(lb, ar_main, ar);
-				ar->regiontype= RGN_TYPE_PREVIEW;
-				ar->alignment= RGN_ALIGN_TOP;
-				ar->flag |= RGN_FLAG_HIDDEN;
+				sequencer_init_preview_region(ar);
 				break;
 			case SPACE_VIEW3D:
 				/* toolbar */
@@ -10300,7 +10321,7 @@
 								break;
 						}
 
-						if (ar) {
+						if (ar && (ar->regiontype == RGN_TYPE_PREVIEW)) {
 							SpaceType *st= BKE_spacetype_from_id(SPACE_SEQ);
 							BKE_area_region_free(st, ar);
 							BLI_freelinkN(regionbase, ar);
@@ -10345,9 +10366,7 @@
 							}
 							ar= MEM_callocN(sizeof(ARegion), "preview area for sequencer");
 							BLI_insertlinkbefore(regionbase, ar_main, ar);
-							ar->regiontype= RGN_TYPE_PREVIEW;
-							ar->alignment= RGN_ALIGN_TOP;
-							ar->flag |= RGN_FLAG_HIDDEN;
+							sequencer_init_preview_region(ar);
 						}
 					}
 				}
@@ -10454,7 +10473,6 @@
 				ma->vol.ms_intensity = 1.f;	
 			}
 		}
-		
 	}
 	
 	if (main->versionfile < 250 || (main->versionfile == 250 && main->subversionfile < 13)) {
@@ -10558,6 +10576,40 @@
 				sce->r.border.ymax= 1.0f;
 			}
 		}
+
+		/* sequencer changes */
+		{
+			bScreen *screen;
+			ScrArea *sa;
+			SpaceLink *sl;
+
+			for(screen= main->screen.first; screen; screen= screen->id.next) {
+				for(sa= screen->areabase.first; sa; sa= sa->next) {
+					for(sl= sa->spacedata.first; sl; sl= sl->next) {
+						if(sl->spacetype==SPACE_SEQ) {
+							ARegion *ar_preview;
+							ListBase *regionbase;
+							SpaceSeq *sseq = (SpaceSeq *)sl;
+
+							if (sl == sa->spacedata.first) {
+								regionbase = &sa->regionbase;
+							} else {
+								regionbase = &sl->regionbase;
+							}
+
+							ar_preview = (ARegion*)regionbase->first;
+							for (; ar_preview; ar_preview = ar_preview->next) {
+								if (ar_preview->regiontype == RGN_TYPE_PREVIEW)
+									break;
+							}
+							if (ar_preview && (ar_preview->regiontype == RGN_TYPE_PREVIEW)) {
+								sequencer_init_preview_region(ar_preview);
+							}
+						}
+					}
+				}
+			}
+		} /* sequencer changes */
 	}
 
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2010-02-07 18:14:38 UTC (rev 26687)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2010-02-07 19:07:56 UTC (rev 26688)
@@ -611,22 +611,19 @@
 	else special_seq_update= 0;
 }
 
-// XXX todo: remove special offset code for image-buf calculations...
-void draw_image_seq(Scene *scene, ARegion *ar, SpaceSeq *sseq)
+void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq)
 {
 	extern void gl_round_box(int mode, float minx, float miny, float maxx, float maxy, float rad);
 	struct ImBuf *ibuf;
-	int x1, y1, rectx, recty;
+	struct View2D *v2d = &ar->v2d;
+	int rectx, recty;
 	int free_ibuf = 0;
 	static int recursive= 0;
-	float zoom;
-	float zoomx, zoomy;
 	float render_size = 0.0;
 	float proxy_size = 100.0;
+	GLuint texid;
+	GLuint last_texid;
 
-	glClearColor(0.0, 0.0, 0.0, 0.0);
-	glClear(GL_COLOR_BUFFER_BIT);
-
 	render_size = sseq->render_size;
 	if (render_size == 0) {
 		render_size = scene->r.size;
@@ -637,14 +634,21 @@
 		return;
 	}
 
-	rectx= (render_size*scene->r.xsch)/100;
-	recty= (render_size*scene->r.ysch)/100;
+	rectx= (render_size*(float)scene->r.xsch)/100.0f+0.5f;
+	recty= (render_size*(float)scene->r.ysch)/100.0f+0.5f;
 
+	/* XXX TODO: take color from theme */
+	glClearColor(0.0, 0.0, 0.0, 0.0);
+	glClear(GL_COLOR_BUFFER_BIT);
+
+	UI_view2d_totRect_set(v2d, rectx, recty);
+	UI_view2d_curRect_validate(v2d);
+
 	/* BIG PROBLEM: the give_ibuf_seq() can call a rendering, which in turn calls redraws...
 	   this shouldn't belong in a window drawing....
 	   So: solve this once event based. 
 	   Now we check for recursion, space type and active area again (ton) */
-	
+
 	if(recursive)
 		return;
 	else {
@@ -708,34 +712,37 @@
 		IMB_rect_from_float(ibuf);	
 	}
 	
-	/* needed for gla draw */
-	glaDefine2DArea(&ar->winrct);
-	
-	zoom= SEQ_ZOOM_FAC(sseq->zoom);
-	if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
-		zoom /= proxy_size / 100.0;
-		zoomx = zoom * ((float)scene->r.xasp / (float)scene->r.yasp);
-		zoomy = zoom;
-	} else {
-		zoomx = zoomy = zoom;
-	}
+	/* setting up the view - actual drawing starts here */
+	UI_view2d_view_ortho(C, v2d);
 
-	/* calc location */
-	x1= (ar->winx-zoomx*ibuf->x)/2 + sseq->xof;
-	y1= (ar->winy-zoomy*ibuf->y)/2 + sseq->yof;
-	
-	glPixelZoom(zoomx, zoomy);
-	
-	glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
-	
-	glPixelZoom(1.0, 1.0);
+	last_texid= glaGetOneInteger(GL_TEXTURE_2D);
+	glEnable(GL_TEXTURE_2D);
+	glGenTextures(1, (GLuint *)&texid);
 
+	glBindTexture(GL_TEXTURE_2D, texid);
+
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ibuf->x, ibuf->y, 0, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+	glBegin(GL_QUADS); 
+		glTexCoord2f(0.0f, 0.0f); glVertex2f(v2d->tot.xmin, v2d->tot.ymin);
+		glTexCoord2f(0.0f, 1.0f);glVertex2f(v2d->tot.xmin, v2d->tot.ymax); 
+		glTexCoord2f(1.0f, 1.0f);glVertex2f(v2d->tot.xmax, v2d->tot.ymax);
+		glTexCoord2f(1.0f, 0.0f);glVertex2f(v2d->tot.xmax, v2d->tot.ymin); 
+	glEnd( );
+	glBindTexture(GL_TEXTURE_2D, last_texid);
+	glDisable(GL_TEXTURE_2D);
+	glDeleteTextures(1, &texid);
+
 	/* safety border */
 	if (sseq->mainb == SEQ_DRAW_IMG_IMBUF && 
 	    (sseq->flag & SEQ_DRAW_SAFE_MARGINS) != 0) {
 		float fac= 0.1;
-		float x2 = x1 + ibuf->x * zoomx;
-		float y2 = y1 + ibuf->y * zoomy;
+		float x1 = v2d->tot.xmin;
+		float y1 = v2d->tot.ymin;
+		float x2 = v2d->tot.xmax;
+		float y2 = v2d->tot.ymax;
 		
 		float a= fac*(x2-x1);
 		x1+= a; 
@@ -769,83 +776,10 @@
 //	if (sseq->flag & SEQ_DRAW_GPENCIL)
 // XXX		draw_gpencil_2dview(sa, 0);
 	
-	/* ortho at pixel level sa */
-// XXX	myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375);
-	
+	/* ortho at pixel level */
+	UI_view2d_view_restore(C);
 }
 
-// XXX part of wacko image-drawing system...
-void seq_reset_imageofs(SpaceSeq *sseq)
-{
-	sseq->xof = sseq->yof = sseq->zoom = 0;
-}
-
-
-#if 0
-/* XXX - these should really be made to use View2D instead of so wacko private system - Aligorith */
-
-void seq_viewzoom(SpaceSeq *sseq, unsigned short event, int invert)
-{
-
-	if(event==PAD1)
-		sseq->zoom= 1.0;
-	else if(event==PAD2)
-		sseq->zoom= (invert)? 2.0: 0.5;
-	else if(event==PAD4)
-		sseq->zoom= (invert)? 4.0: 0.25;
-	else if(event==PAD8)
-		sseq->zoom= (invert)? 8.0: 0.125;
-	
-	/* ensure pixel exact locations for draw */
-	sseq->xof= (int)sseq->xof;
-	sseq->yof= (int)sseq->yof;
-}
-
-void seq_viewmove(Scene *scene, ARegion *ar, SpaceSeq *sseq)
-{	
-	short mval[2], mvalo[2];
-	short rectx, recty, xmin, xmax, ymin, ymax, pad;
-	int oldcursor;
-	Window *win;
-	
-	sa = sseq->area;
-	rectx= (scene->r.size*scene->r.xsch)/100;
-	recty= (scene->r.size*scene->r.ysch)/100;
-	
-	pad = 10;
-	xmin = -(ar->winx/2) - rectx/2 + pad;
-	xmax = ar->winx/2 + rectx/2 - pad;
-	ymin = -(ar->winy/2) - recty/2 + pad;
-	ymax = ar->winy/2 + recty/2 - pad;
-	
-	getmouseco_sc(mvalo);
-
-	oldcursor=get_cursor();
-	win=winlay_get_active_window();
-	
-	SetBlenderCursor(BC_NSEW_SCROLLCURSOR);
-	
-	while(get_mbut()&(L_MOUSE|M_MOUSE)) {
-		
-		getmouseco_sc(mval);
-		
-		if(mvalo[0]!=mval[0] || mvalo[1]!=mval[1]) {
-
-			sseq->xof -= (mvalo[0]-mval[0]);
-			sseq->yof -= (mvalo[1]-mval[1]);
-			
-			/* prevent dragging image outside of the window and losing it! */
-			CLAMP(sseq->xof, xmin, xmax);
-			CLAMP(sseq->yof, ymin, ymax);
-			
-			mvalo[0]= mval[0];
-			mvalo[1]= mval[1];
-			
-		}
-	}
-}
-#endif
-
 void drawprefetchseqspace(Scene *scene, ARegion *ar, SpaceSeq *sseq)
 {
 	int rectx, recty;

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c	2010-02-07 18:14:38 UTC (rev 26687)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_edit.c	2010-02-07 19:07:56 UTC (rev 26688)
@@ -2226,13 +2226,17 @@
 static int sequencer_view_all_preview_exec(bContext *C, wmOperator *op)
 {
 	Scene *scene= CTX_data_scene(C);
-	//bScreen *sc= CTX_wm_screen(C);
+	bScreen *sc= CTX_wm_screen(C);
 	ScrArea *area= CTX_wm_area(C);
 	ARegion *ar= CTX_wm_region(C);
 	SpaceSeq *sseq= area->spacedata.first;
-	//View2D *v2d= UI_view2d_fromcontext(C);
+	View2D *v2d= UI_view2d_fromcontext(C);
 
-
+	v2d->cur= v2d->tot;
+	UI_view2d_curRect_validate(v2d);
+	UI_view2d_sync(sc, area, v2d, V2D_LOCK_COPY);
+	
+#if 0
 	/* Like zooming on an image view */
 	float zoomX, zoomY;
 	int width, height, imgwidth, imgheight;
@@ -2261,6 +2265,7 @@
 	else {
 		sseq->zoom= 1.0f;
 	}
+#endif
 
 	ED_area_tag_redraw(CTX_wm_area(C));
 	return OPERATOR_FINISHED;


@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list