[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26077] trunk/blender/source/blender: - opengl render anim exec function so python can render opengl animations without and have it block until its done .

Campbell Barton ideasman42 at gmail.com
Mon Jan 18 15:40:07 CET 2010


Revision: 26077
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26077
Author:   campbellbarton
Date:     2010-01-18 15:40:06 +0100 (Mon, 18 Jan 2010)

Log Message:
-----------
- opengl render anim exec function so python can render opengl animations without and have it block until its done.
- timeline rna camera access.
- new textblocks have tabs as spaces enabled by default since this is blenders default.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/text.c
    trunk/blender/source/blender/editors/screen/screen_ops.c
    trunk/blender/source/blender/makesrna/intern/rna_timeline.c

Modified: trunk/blender/source/blender/blenkernel/intern/text.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/text.c	2010-01-18 14:08:40 UTC (rev 26076)
+++ trunk/blender/source/blender/blenkernel/intern/text.c	2010-01-18 14:40:06 UTC (rev 26077)
@@ -190,7 +190,7 @@
     init_undo_text(ta);
 
 	ta->nlines=1;
-	ta->flags= TXT_ISDIRTY | TXT_ISMEM;
+	ta->flags= TXT_ISDIRTY | TXT_ISMEM | TXT_TABSTOSPACES;
 
 	ta->lines.first= ta->lines.last= NULL;
 	ta->markers.first= ta->markers.last= NULL;
@@ -355,6 +355,8 @@
 	ta->markers.first= ta->markers.last= NULL;
 	ta->curl= ta->sell= NULL;
 	
+	ta->flags= TXT_TABSTOSPACES;
+	
 	fseek(fp, 0L, SEEK_END);
 	len= ftell(fp);
 	fseek(fp, 0L, SEEK_SET);	

Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c	2010-01-18 14:08:40 UTC (rev 26076)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c	2010-01-18 14:40:06 UTC (rev 26077)
@@ -3260,7 +3260,7 @@
 	bMovieHandle *mh;
 	int cfrao, nfra;
 	
-	wmTimer *timer;
+	wmTimer *timer; /* use to check if running modal or not (invoke'd or exec'd)*/
 } OGLRender;
 
 static void screen_opengl_render_apply(OGLRender *oglrender)
@@ -3378,8 +3378,8 @@
 		if(BKE_imtype_is_movie(scene->r.imtype))
 			oglrender->mh->end_movie();
 	}
-	
-	if(oglrender->timer) {
+
+	if(oglrender->timer) { /* exec will not have a timer */
 		scene->r.cfra= oglrender->cfrao;
 		scene_update_for_newframe(scene, scene->lay);
 		
@@ -3401,8 +3401,33 @@
 	return OPERATOR_CANCELLED;
 }
 
-static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *event)
+/* share between invoke and exec */
+static int screen_opengl_render_anim_initialize(bContext *C, wmOperator *op)
 {
+	/* initialize animation */
+	OGLRender *oglrender;
+	Scene *scene;
+
+	oglrender= op->customdata;
+	scene= oglrender->scene;
+
+	oglrender->reports= op->reports;
+	oglrender->mh= BKE_get_movie_handle(scene->r.imtype);
+	if(BKE_imtype_is_movie(scene->r.imtype)) {
+		if(!oglrender->mh->start_movie(scene, &scene->r, oglrender->sizex, oglrender->sizey, oglrender->reports)) {
+			screen_opengl_render_end(C, oglrender);
+			return 0;
+		}
+	}
+
+	oglrender->cfrao= scene->r.cfra;
+	oglrender->nfra= SFRA;
+	scene->r.cfra= SFRA;
+
+	return 1;
+}
+static int screen_opengl_render_anim_step(bContext *C, wmOperator *op)
+{
 	OGLRender *oglrender= op->customdata;
 	Scene *scene= oglrender->scene;
 	ImBuf *ibuf;
@@ -3410,32 +3435,18 @@
 	char name[FILE_MAXDIR+FILE_MAXFILE];
 	unsigned int lay;
 	int ok= 0;
-	
-	switch(event->type) {
-		case ESCKEY:
-			/* cancel */
-			screen_opengl_render_end(C, op->customdata);
-			return OPERATOR_FINISHED;
-		case TIMER:
-			/* render frame? */
-			if(oglrender->timer == event->customdata)
-				break;
-		default:
-			/* nothing to do */
-			return OPERATOR_RUNNING_MODAL;
-	}
-	
+
 	/* go to next frame */
 	while(CFRA<oglrender->nfra) {
 		if(scene->lay & 0xFF000000)
 			lay= scene->lay & 0xFF000000;
 		else
 			lay= scene->lay;
-		
+
 		scene_update_for_newframe(scene, lay);
 		CFRA++;
 	}
-	
+
 	scene_update_for_newframe(scene, scene->lay);
 
 	if(oglrender->rv3d->persp==RV3D_CAMOB && oglrender->v3d->camera && oglrender->v3d->scenelock) {
@@ -3446,7 +3457,7 @@
 		if(camera)
 			oglrender->v3d->camera= scene->camera= camera;
 	}
-
+	
 	/* render into offscreen buffer */
 	screen_opengl_render_apply(oglrender);
 	
@@ -3477,11 +3488,42 @@
 	oglrender->nfra += scene->r.frame_step;
 	scene->r.cfra++;
 	
+	/* stop at the end or on error */
+	if(scene->r.cfra > EFRA || !ok) {
+		screen_opengl_render_end(C, op->customdata);
+		return 0;
+	}
+
+	return 1;
+}
+
+
+static int screen_opengl_render_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+	OGLRender *oglrender= op->customdata;
+
+	int ret;
+
+	switch(event->type) {
+		case ESCKEY:
+			/* cancel */
+			screen_opengl_render_end(C, op->customdata);
+			return OPERATOR_FINISHED;
+		case TIMER:
+			/* render frame? */
+			if(oglrender->timer == event->customdata)
+				break;
+		default:
+			/* nothing to do */
+			return OPERATOR_RUNNING_MODAL;
+	}
+
+	ret= screen_opengl_render_anim_step(C, op);
+
 	WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, oglrender->scene);
 	
 	/* stop at the end or on error */
-	if(scene->r.cfra > EFRA || !ok) {
-		screen_opengl_render_end(C, op->customdata);
+	if(ret == 0) {
 		return OPERATOR_FINISHED;
 	}
 	
@@ -3504,35 +3546,53 @@
 		return OPERATOR_FINISHED;
 	}
 	else {
-		/* initialize animation */
-		OGLRender *oglrender;
-		Scene *scene;
-		
-		oglrender= op->customdata;
-		scene= oglrender->scene;
-		
-		oglrender->reports= op->reports;
-		oglrender->mh= BKE_get_movie_handle(scene->r.imtype);
-		if(BKE_imtype_is_movie(scene->r.imtype)) {
-			if(!oglrender->mh->start_movie(scene, &scene->r, oglrender->sizex, oglrender->sizey, oglrender->reports)) {
-				screen_opengl_render_end(C, oglrender);
-				return OPERATOR_CANCELLED;
-			}
-		}
-		
-		oglrender->cfrao= scene->r.cfra;
-		oglrender->nfra= SFRA;
-		scene->r.cfra= SFRA;
-		
+		OGLRender *oglrender= op->customdata;
+
+		if(!screen_opengl_render_anim_initialize(C, op))
+			return OPERATOR_CANCELLED;
+
+		screen_set_image_output(C, event->x, event->y);
+
 		WM_event_add_modal_handler(C, op);
 		oglrender->timer= WM_event_add_timer(CTX_wm_manager(C), CTX_wm_window(C), TIMER, 0.01f);
-		
-		screen_set_image_output(C, event->x, event->y);
-		
+
 		return OPERATOR_RUNNING_MODAL;
 	}
 }
 
+/* executes blocking render */
+static int screen_opengl_render_exec(bContext *C, wmOperator *op)
+{
+	int anim= RNA_boolean_get(op->ptr, "animation");
+
+	if(!screen_opengl_render_init(C, op))
+		return OPERATOR_CANCELLED;
+
+	if(!anim) { /* same as invoke */
+		/* render image */
+		screen_opengl_render_apply(op->customdata);
+		screen_opengl_render_end(C, op->customdata);
+
+		return OPERATOR_FINISHED;
+	}
+	else {
+		int ret= 1;
+
+		if(!screen_opengl_render_anim_initialize(C, op))
+			return OPERATOR_CANCELLED;
+
+		while(ret) {
+			ret= screen_opengl_render_anim_step(C, op);
+		}
+	}
+
+	// no redraw needed, we leave state as we entered it
+//	ED_update_for_newframe(C, 1);
+	WM_event_add_notifier(C, NC_SCENE|ND_RENDER_RESULT, CTX_data_scene(C));
+
+	return OPERATOR_FINISHED;
+}
+
 static void SCREEN_OT_opengl_render(wmOperatorType *ot)
 {
 	/* identifiers */
@@ -3542,6 +3602,7 @@
 	
 	/* api callbacks */
 	ot->invoke= screen_opengl_render_invoke;
+	ot->exec= screen_opengl_render_exec; /* blocking */
 	ot->modal= screen_opengl_render_modal;
 	ot->cancel= screen_opengl_render_cancel;
 	

Modified: trunk/blender/source/blender/makesrna/intern/rna_timeline.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_timeline.c	2010-01-18 14:08:40 UTC (rev 26076)
+++ trunk/blender/source/blender/makesrna/intern/rna_timeline.c	2010-01-18 14:40:06 UTC (rev 26077)
@@ -51,6 +51,13 @@
 
 	prop= RNA_def_property(srna, "frame", PROP_INT, PROP_TIME);
 	RNA_def_property_ui_text(prop, "Frame", "The frame on which the timeline marker appears.");
+
+#ifdef DURIAN_CAMERA_SWITCH
+	prop= RNA_def_property(srna, "camera", PROP_POINTER, PROP_NONE);
+	RNA_def_property_struct_type(prop, "Object");
+	RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
+	RNA_def_property_ui_text(prop, "Camera", "Camera this timeline sets to active.");
+#endif
 }
 
 void RNA_def_timeline_marker(BlenderRNA *brna)





More information about the Bf-blender-cvs mailing list