diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-12-30 17:37:25 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-12-30 17:37:25 +0300 |
commit | 57cd505d3f29b83bea74f4132455f00b248d5808 (patch) | |
tree | eef3278dc77873f421201d806ad2411095f7e3a1 /source/blender/editors/mesh | |
parent | a4913896b8f42be9bdde6ebc320a4955578a8f9e (diff) |
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)
Diffstat (limited to 'source/blender/editors/mesh')
-rw-r--r-- | source/blender/editors/mesh/meshtools.c | 200 |
1 files changed, 0 insertions, 200 deletions
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c index 1feaa2dc83a..b52447e111f 100644 --- a/source/blender/editors/mesh/meshtools.c +++ b/source/blender/editors/mesh/meshtools.c @@ -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 @@ int *mesh_get_x_mirror_faces(Object *ob, EditMesh *em) 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); -} - |