diff options
author | Ton Roosendaal <ton@blender.org> | 2006-06-18 15:38:34 +0400 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-06-18 15:38:34 +0400 |
commit | 94e23fe939413bf96be2b475408a69ec408688f1 (patch) | |
tree | 0f41b0855bcab56eecaf7383d7112ac4b94e999d /source | |
parent | 7784ea53bf3865c0cf6725611034da771b4535bf (diff) |
Bugfix #4351
ESC wasn't supported for sequence-based rendering yet.
Solved it with correctly initializing the sequence render with all
render callbacks, including render updates (which it didn't do yet).
Cleanup:
- Bug in ghostwinlay code: the get_mbut() function reads from the window
struct if a mouse is pressed. However, when you press the mouse in the
sequencer, which causes a render, this value was hanging because then
the active window was a render window.
- The new render display options (image window) didn't work for sequence
render OK. There was a recursion even, because a sequence draw command
calls a render, which in turn now calls redraws.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/include/BIF_renderwin.h | 4 | ||||
-rw-r--r-- | source/blender/src/drawseq.c | 26 | ||||
-rw-r--r-- | source/blender/src/ghostwinlay.c | 1 | ||||
-rw-r--r-- | source/blender/src/renderwin.c | 98 | ||||
-rw-r--r-- | source/blender/src/sequence.c | 13 |
5 files changed, 78 insertions, 64 deletions
diff --git a/source/blender/include/BIF_renderwin.h b/source/blender/include/BIF_renderwin.h index dad4f36412c..d5b934d9050 100644 --- a/source/blender/include/BIF_renderwin.h +++ b/source/blender/include/BIF_renderwin.h @@ -30,6 +30,7 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ +struct Render; struct ScrArea; struct RenderStats; @@ -51,6 +52,9 @@ void BIF_redraw_render_rect(void); void BIF_swap_render_rects(void); void BIF_toggle_render_display(void); +void BIF_init_render_callbacks(struct Render *re); +void BIF_end_render_callbacks(void); + /* should not be here, ~WIP~ */ void make_renderinfo_string(struct RenderStats *rs, char *str); diff --git a/source/blender/src/drawseq.c b/source/blender/src/drawseq.c index 22f31bc7e4f..119d9838df5 100644 --- a/source/blender/src/drawseq.c +++ b/source/blender/src/drawseq.c @@ -747,6 +747,7 @@ static void draw_image_seq(ScrArea *sa) struct ImBuf *ibuf; int x1, y1, rectx, recty; int free_ibuf = 0; + static int recursive= 0; float zoom; glClearColor(0.0, 0.0, 0.0, 0.0); @@ -758,9 +759,26 @@ static void draw_image_seq(ScrArea *sa) rectx= (G.scene->r.size*G.scene->r.xsch)/100; recty= (G.scene->r.size*G.scene->r.ysch)/100; - ibuf= (ImBuf *)give_ibuf_seq(rectx, recty, - (G.scene->r.cfra), sseq->chanshown); - + /* 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 { + recursive= 1; + ibuf= (ImBuf *)give_ibuf_seq(rectx, recty, (G.scene->r.cfra), sseq->chanshown); + recursive= 0; + + /* HURMF! the give_ibuf_seq can call image display in this window */ + if(sa->spacetype!=SPACE_SEQ) + return; + if(sa!=curarea) { + areawinset(sa->win); + } + } + if(special_seq_update) { se = special_seq_update->curelem; if(se) { @@ -801,7 +819,7 @@ static void draw_image_seq(ScrArea *sa) /* needed for gla draw */ glaDefine2DArea(&curarea->winrct); glPixelZoom(zoom, zoom); - + glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect); glPixelZoom(1.0, 1.0); diff --git a/source/blender/src/ghostwinlay.c b/source/blender/src/ghostwinlay.c index 207ab2c27d2..b9796f8b119 100644 --- a/source/blender/src/ghostwinlay.c +++ b/source/blender/src/ghostwinlay.c @@ -450,6 +450,7 @@ void window_set_custom_cursor_ex(Window *win, BCursor *cursor, int useBig) { void window_make_active(Window *win) { if (win != active_gl_window) { + win->lmbut= 0; /* keeps hanging when mousepressed while other window opened */ active_gl_window= win; GHOST_ActivateWindowDrawingContext(win->ghostwin); } diff --git a/source/blender/src/renderwin.c b/source/blender/src/renderwin.c index 25ec97f6b14..fbbbe2c47cc 100644 --- a/source/blender/src/renderwin.c +++ b/source/blender/src/renderwin.c @@ -1050,7 +1050,6 @@ static void end_test_break_callback() - set callbacks - cleanup */ -static void error_cb(char *str){error(str);} static void do_render(int anim) { @@ -1061,24 +1060,9 @@ static void do_render(int anim) /* UGLY! we set this flag to prevent renderwindow queue to execute another render */ /* is reset in RE_BlenderFrame */ G.rendering= 1; - G.afbreek= 0; - /* set callbacks */ - if(G.displaymode!=R_DISPLAYWIN) { - if(render_win) - BIF_close_render_display(); - imagewindow_render_callbacks(re); - } - else { - RE_display_init_cb(re, renderwin_init_display_cb); - RE_display_draw_cb(re, renderwin_progress_display_cb); - RE_display_clear_cb(re, renderwin_clear_display_cb); - RE_stats_draw_cb(re, renderwin_renderinfo_cb); - } - RE_error_cb(re, error_cb); - init_test_break_callback(); - RE_test_break_cb(re, test_break); - RE_timecursor_cb(re, set_timecursor); + /* set render callbacks, also starts ESC timer */ + BIF_init_render_callbacks(re); waitcursor(1); if(render_win) @@ -1110,47 +1094,18 @@ static void do_render(int anim) free_filesel_spec(G.scene->r.pic); G.afbreek= 0; - end_test_break_callback(); - - mainwindow_make_active(); + BIF_end_render_callbacks(); /* after an envmap creation... */ // if(R.flag & R_REDRAW_PRV) { // BIF_preview_changed(ID_TE); // } - allqueue(REDRAWBUTSSCENE, 0); // visualize fbuf for example scene_update_for_newframe(G.scene, G.scene->lay); // no redraw needed, this restores to view as we left it waitcursor(0); } -#if 0 -/* used for swapping with spare buffer, when images are different size */ -static void scalefastrect(unsigned int *recto, unsigned int *rectn, int oldx, int oldy, int newx, int newy) -{ - unsigned int *rect, *newrect; - int x, y; - int ofsx, ofsy, stepx, stepy; - - stepx = (int)((65536.0 * (oldx - 1.0) / (newx - 1.0)) + 0.5); - stepy = (int)((65536.0 * (oldy - 1.0) / (newy - 1.0)) + 0.5); - ofsy = 32768; - newrect= rectn; - - for (y = newy; y > 0 ; y--){ - rect = recto; - rect += (ofsy >> 16) * oldx; - ofsy += stepy; - ofsx = 32768; - for (x = newx ; x>0 ; x--){ - *newrect++ = rect[ofsx >> 16]; - ofsx += stepx; - } - } -} -#endif - static void renderwin_store_spare(void) { RenderResult rres; @@ -1183,18 +1138,51 @@ static void renderwin_store_spare(void) /* -------------- API: externally called --------------- */ -/* not used anywhere ??? */ -#if 0 -void BIF_renderwin_make_active(void) +static void error_cb(char *str){error(str);} +static int esc_timer_set= 0; + +/* set callbacks, exported to sequence render too. + Only call in foreground (UI) renders. */ + +void BIF_init_render_callbacks(Render *re) { - if(render_win) { - window_make_active(render_win->win); - mywinset(2); + + if(G.displaymode!=R_DISPLAYWIN) { + if(render_win) + BIF_close_render_display(); + imagewindow_render_callbacks(re); } + else { + RE_display_init_cb(re, renderwin_init_display_cb); + RE_display_draw_cb(re, renderwin_progress_display_cb); + RE_display_clear_cb(re, renderwin_clear_display_cb); + RE_stats_draw_cb(re, renderwin_renderinfo_cb); + } + + RE_error_cb(re, error_cb); + + G.afbreek= 0; + /* start esc timer. ensure it happens once only */ + if(esc_timer_set==0) + init_test_break_callback(); + esc_timer_set++; + + RE_test_break_cb(re, test_break); + RE_timecursor_cb(re, set_timecursor); + } -#endif +/* the init/end callbacks can be called multiple times (sequence render) */ +void BIF_end_render_callbacks(void) +{ + esc_timer_set--; + if(esc_timer_set==0) + end_test_break_callback(); + + if(render_win) + mainwindow_make_active(); +} /* set up display, render an image or scene */ void BIF_do_render(int anim) diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c index 4c61c6ea4a3..13fc4de2842 100644 --- a/source/blender/src/sequence.c +++ b/source/blender/src/sequence.c @@ -886,7 +886,7 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra) } } } - else if(seq->type==SEQ_SCENE && se->ibuf==0 && seq->scene) { // scene can be NULL after deletions + else if(seq->type==SEQ_SCENE && se->ibuf==NULL && seq->scene) { // scene can be NULL after deletions int oldcfra = CFRA; Scene *sce= seq->scene, *oldsce= G.scene; Render *re= RE_NewRender(sce->id.name); @@ -899,10 +899,12 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra) doseq= sce->r.scemode & R_DOSEQ; sce->r.scemode &= ~R_DOSEQ; + BIF_init_render_callbacks(re); + /* hrms, set_scene still needed? work on that... */ - set_scene_bg(sce); + if(sce!=oldsce) set_scene_bg(sce); RE_BlenderFrame(re, sce, seq->sfra + se->nr); - set_scene_bg(oldsce); + if(sce!=oldsce) set_scene_bg(oldsce); RE_GetResultImage(re, &rres); @@ -913,7 +915,9 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra) /* not yet */ } } - + + BIF_end_render_callbacks(); + /* restore */ sce->r.scemode |= doseq; @@ -1101,7 +1105,6 @@ ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown) do_seq_test_unref_cfra(ed->seqbasep, cfra); } - if(!seqfirst) return 0; if(!seqfirst->curelem) return 0; return seqfirst->curelem->ibuf; |