[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25622] trunk/blender/source/blender: bake is now modal like render and updates the image view while baking.

Campbell Barton ideasman42 at gmail.com
Wed Dec 30 15:37:25 CET 2009


Revision: 25622
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25622
Author:   campbellbarton
Date:     2009-12-30 15:37:25 +0100 (Wed, 30 Dec 2009)

Log Message:
-----------
bake is now modal like render and updates the image view while baking.
it also has an exec function which doesnt update (like render too)

Modified Paths:
--------------
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/mesh/meshtools.c
    trunk/blender/source/blender/editors/object/object_edit.c
    trunk/blender/source/blender/editors/object/object_intern.h
    trunk/blender/source/blender/editors/object/object_ops.c
    trunk/blender/source/blender/editors/space_image/space_image.c
    trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
    trunk/blender/source/blender/render/intern/source/rendercore.c

Added Paths:
-----------
    trunk/blender/source/blender/editors/object/object_bake.c

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h	2009-12-30 10:29:26 UTC (rev 25621)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2009-12-30 14:37:25 UTC (rev 25622)
@@ -85,8 +85,6 @@
 int			join_mesh_exec(struct bContext *C, struct wmOperator *op);
 int			join_mesh_shapes_exec(struct bContext *C, struct wmOperator *op);
 
-void		objects_bake_render(struct Scene *scene, short event, char **error_msg);
-
 /* mesh_ops.c */
 void		ED_operatortypes_mesh(void);
 void		ED_operatormacros_mesh(void);

Modified: trunk/blender/source/blender/editors/mesh/meshtools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/meshtools.c	2009-12-30 10:29:26 UTC (rev 25621)
+++ trunk/blender/source/blender/editors/mesh/meshtools.c	2009-12-30 14:37:25 UTC (rev 25622)
@@ -76,16 +76,6 @@
 #include "BKE_utildefines.h"
 #include "BKE_report.h"
 
-#include "RE_pipeline.h"
-#include "RE_shader_ext.h"
-
-#include "PIL_time.h"
-
-#include "IMB_imbuf_types.h"
-#include "IMB_imbuf.h"
-
-#include "GPU_draw.h"
-
 #include "BLO_sys_types.h" // for intptr_t support
 
 #include "ED_mesh.h"
@@ -99,8 +89,6 @@
 #include "mesh_intern.h"
 
 /* XXX */
-static void waitcursor(int val) {}
-static void error() {}
 static int pupmenu() {return 0;}
 /* XXX */
 
@@ -1132,191 +1120,3 @@
 	
 	return mirrorfaces;
 }
-
-/* ****************** render BAKING ********************** */
-
-/* threaded break test */
-static int thread_break(void *unused)
-{
-	return G.afbreek;
-}
-
-static ScrArea *biggest_image_area(bScreen *screen)
-{
-	ScrArea *sa, *big= NULL;
-	int size, maxsize= 0;
-	
-	for(sa= screen->areabase.first; sa; sa= sa->next) {
-		if(sa->spacetype==SPACE_IMAGE) {
-			size= sa->winx*sa->winy;
-			if(sa->winx > 10 && sa->winy > 10 && size > maxsize) {
-				maxsize= size;
-				big= sa;
-			}
-		}
-	}
-	return big;
-}
-
-
-typedef struct BakeRender {
-	Render *re;
-	struct Object *actob;
-	int event, tot, ready;
-} BakeRender;
-
-static void *do_bake_render(void *bake_v)
-{
-	BakeRender *bkr= bake_v;
-	
-	bkr->tot= RE_bake_shade_all_selected(bkr->re, bkr->event, bkr->actob);
-	bkr->ready= 1;
-	
-	return NULL;
-}
-
-
-void objects_bake_render(Scene *scene, short event, char **error_msg)
-{
-	Object *actob= OBACT;
-	int active= scene->r.bake_flag & R_BAKE_TO_ACTIVE;
-	short prev_r_raytrace= 0, prev_wo_amb_occ= 0;
-	
-	if(event==0) event= scene->r.bake_mode;
-	
-	if(scene->r.renderer!=R_INTERN) {	 
-		*error_msg = "Bake only supported for Internal Renderer";
-		return;
-	}	 
-	
-	if(active && !actob) {
-		*error_msg = "No active object";
-		return;
-	}
-	
-	if(event>0) {
-		bScreen *screen= NULL; // XXX CTX
-		Render *re= RE_NewRender("_Bake View_");
-		ScrArea *area= NULL; //biggest_image_area(screen); // XXX
-		ListBase threads;
-		BakeRender bkr;
-		int timer=0, tot; // XXX, sculptmode= G.f & G_SCULPTMODE;
-
-// XXX		if(sculptmode) set_sculptmode();
-		
-		if(event==1) event= RE_BAKE_ALL;
-		else if(event==2) event= RE_BAKE_AO;
-		else if(event==3) event= RE_BAKE_NORMALS;
-		else if(event==4) event= RE_BAKE_TEXTURE;
-		else if(event==5) event= RE_BAKE_DISPLACEMENT;
-		else event= RE_BAKE_SHADOW;
-
-		if(event==RE_BAKE_AO) {
-			if(scene->world==NULL) {
-				*error_msg = "No world set up";
-				return;
-			}
-
-			/* If raytracing or AO is disabled, switch it on temporarily for baking. */
-			prev_wo_amb_occ = (scene->world->mode & WO_AMB_OCC) != 0;
-			scene->world->mode |= WO_AMB_OCC;
-		}
-		if(event==RE_BAKE_AO || active) {
-			prev_r_raytrace = (scene->r.mode & R_RAYTRACE) != 0;
-			scene->r.mode |= R_RAYTRACE;
-		}
-		
-		waitcursor(1);
-		RE_test_break_cb(re, NULL, thread_break);
-		G.afbreek= 0;	/* blender_test_break uses this global */
-		
-		RE_Database_Baking(re, scene, event, (active)? actob: NULL);
-		
-		/* baking itself is threaded, cannot use test_break in threads. we also update optional imagewindow */
-	
-		BLI_init_threads(&threads, do_bake_render, 1);
-		bkr.re= re;
-		bkr.event= event;
-		bkr.ready= 0;
-		bkr.actob= (active)? actob: NULL;
-		BLI_insert_thread(&threads, &bkr);
-		
-		while(bkr.ready==0) {
-			PIL_sleep_ms(50);
-			if(bkr.ready)
-				break;
-			
-			if (!G.background) {
-				blender_test_break();
-				
-				timer++;
-				if(area && timer==20) {
-					Image *ima= RE_bake_shade_get_image();
-					if(ima) ((SpaceImage *)area->spacedata.first)->image= ima;
-// XX					scrarea_do_windraw(area);
-//					myswapbuffers();	
-					timer= 0;
-				}
-			}
-		}
-		BLI_end_threads(&threads);
-		tot= bkr.tot;
-		
-		RE_Database_Free(re);
-		waitcursor(0);
-		
-		if(tot==0) *error_msg = "No Images found to bake to";
-		else {
-			Image *ima;
-			/* force OpenGL reload and mipmap recalc */
-			for(ima= G.main->image.first; ima; ima= ima->id.next) {
-				if(ima->ok==IMA_OK_LOADED) {
-					ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
-					if(ibuf && (ibuf->userflags & IB_BITMAPDIRTY)) {
-						GPU_free_image(ima); 
-						imb_freemipmapImBuf(ibuf);
-					}
-				}
-			}
-		}
-		
-		/* restore raytrace and AO */
-		if(event==RE_BAKE_AO)
-			if(prev_wo_amb_occ == 0)
-				scene->world->mode &= ~WO_AMB_OCC;
-
-		if(event==RE_BAKE_AO || active)
-			if(prev_r_raytrace == 0)
-				scene->r.mode &= ~R_RAYTRACE;
-		
-// XXX		if(sculptmode) set_sculptmode();
-		
-	}
-}
-
-/* all selected meshes with UV maps are rendered for current scene visibility */
-static void objects_bake_render_ui(Scene *scene, short event)
-{
-	char *error_msg = NULL;
-//	int is_editmode = (obedit!=NULL);
-	
-	/* Deal with editmode, this is a bit clunky but since UV's are in editmode, users are likely to bake from their */
-// XXX	if (is_editmode) exit_editmode(0);
-	
-	objects_bake_render(scene, event, &error_msg);
-	
-// XXX	if (is_editmode) enter_editmode(0);
-	
-	if (error_msg)
-		error(error_msg);
-}
-
-void objects_bake_render_menu(Scene *scene)
-{
-	short event;
-	
-	event= pupmenu("Bake Selected Meshes %t|Full Render %x1|Ambient Occlusion %x2|Normals %x3|Texture Only %x4|Displacement %x5|Shadow %x6");
-	if (event < 1) return;
-	objects_bake_render_ui(scene, event);
-}
-

Added: trunk/blender/source/blender/editors/object/object_bake.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_bake.c	                        (rev 0)
+++ trunk/blender/source/blender/editors/object/object_bake.c	2009-12-30 14:37:25 UTC (rev 25622)
@@ -0,0 +1,341 @@
+/**
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2004 by Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/*
+	meshtools.c: no editmode (violated already :), tools operating on meshes
+*/
+
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_image_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+#include "DNA_world_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_threads.h"
+
+#include "BKE_blender.h"
+#include "BKE_context.h"
+#include "BKE_global.h"
+#include "BKE_image.h"
+#include "BKE_main.h"
+#include "BKE_object.h"
+#include "BKE_utildefines.h"
+#include "BKE_report.h"
+
+#include "RE_pipeline.h"
+#include "RE_shader_ext.h"
+
+#include "PIL_time.h"
+
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+
+#include "GPU_draw.h" /* GPU_free_image */
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+
+/* ****************** render BAKING ********************** */
+
+/* threaded break test */
+static int thread_break(void *unused)
+{
+	return G.afbreek;
+}
+
+static ScrArea *biggest_image_area(bScreen *screen)
+{
+	ScrArea *sa, *big= NULL;
+	int size, maxsize= 0;
+
+	for(sa= screen->areabase.first; sa; sa= sa->next) {
+		if(sa->spacetype==SPACE_IMAGE) {
+			size= sa->winx*sa->winy;
+			if(sa->winx > 10 && sa->winy > 10 && size > maxsize) {
+				maxsize= size;
+				big= sa;
+			}
+		}
+	}
+	return big;
+}
+
+
+typedef struct BakeRender {
+	Render *re;
+	Scene *scene;
+	struct Object *actob;
+	int tot, ready;
+
+	ReportList *reports;
+
+	short *stop;
+	short *do_update;
+
+	ListBase threads;
+
+	/* backup */
+	short prev_wo_amb_occ;
+	short prev_r_raytrace;
+
+	/* for redrawing */
+	ScrArea *sa;
+} BakeRender;
+
+/* use by exec and invoke */
+int test_bake_internal(bContext *C, ReportList *reports)
+{
+	Scene *scene= CTX_data_scene(C);
+
+	if(scene->r.renderer!=R_INTERN) {
+		BKE_report(reports, RPT_ERROR, "Bake only supported for Internal Renderer");
+	} else if((scene->r.bake_flag & R_BAKE_TO_ACTIVE) && CTX_data_active_object(C)==NULL) {
+		BKE_report(reports, RPT_ERROR, "No active object");
+	}
+	else if(scene->r.bake_mode==RE_BAKE_AO && scene->world==NULL) {
+		BKE_report(reports, RPT_ERROR, "No world set up");
+	}
+	else {
+		return 1;
+	}
+
+	return 0;
+}
+
+static void init_bake_internal(BakeRender *bkr, bContext *C)
+{
+	Scene *scene= CTX_data_scene(C);
+
+	bkr->sa= biggest_image_area(CTX_wm_screen(C)); /* can be NULL */
+	bkr->scene= scene;
+	bkr->actob= (scene->r.bake_flag & R_BAKE_TO_ACTIVE) ? OBACT : NULL;
+	bkr->re= RE_NewRender("_Bake View_");
+
+	if(scene->r.bake_mode==RE_BAKE_AO) {
+		/* If raytracing or AO is disabled, switch it on temporarily for baking. */
+		bkr->prev_wo_amb_occ = (scene->world->mode & WO_AMB_OCC) != 0;
+		scene->world->mode |= WO_AMB_OCC;
+	}
+	if(scene->r.bake_mode==RE_BAKE_AO || bkr->actob) {
+		bkr->prev_r_raytrace = (scene->r.mode & R_RAYTRACE) != 0;
+		scene->r.mode |= R_RAYTRACE;
+	}
+}
+
+static void finish_bake_internal(BakeRender *bkr)
+{
+	RE_Database_Free(bkr->re);
+
+	/* restore raytrace and AO */
+	if(bkr->scene->r.bake_mode==RE_BAKE_AO)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list