Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-06-18 15:38:34 +0400
committerTon Roosendaal <ton@blender.org>2006-06-18 15:38:34 +0400
commit94e23fe939413bf96be2b475408a69ec408688f1 (patch)
tree0f41b0855bcab56eecaf7383d7112ac4b94e999d /source
parent7784ea53bf3865c0cf6725611034da771b4535bf (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.h4
-rw-r--r--source/blender/src/drawseq.c26
-rw-r--r--source/blender/src/ghostwinlay.c1
-rw-r--r--source/blender/src/renderwin.c98
-rw-r--r--source/blender/src/sequence.c13
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;