320
332
glClearColor(.1875, .1875, .1875, 1.0);
321
333
glClear(GL_COLOR_BUFFER_BIT);
323
if (just_clear || !R.rectot) {
324
336
glColor3ub(0, 0, 0);
325
glRectfv(disprect[0], disprect[1]);
337
glRectfv(fullrect[0], fullrect[1]);
327
glPixelZoom(rw->zoom, rw->zoom);
328
if(rw->flags & RW_FLAGS_ALPHA) {
329
char *rect= (char *)R.rectot;
331
glColorMask(1, 0, 0, 0);
332
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, rect+3);
333
glColorMask(0, 1, 0, 0);
334
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, rect+2);
335
glColorMask(0, 0, 1, 0);
336
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, rect+1);
337
glColorMask(1, 1, 1, 1);
341
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, R.rectot);
343
glPixelZoom(1.0, 1.0);
342
rres.rectx= rw->sparex;
343
rres.recty= rw->sparey;
344
rres.rect32= rw->rectspare;
345
rres.rectf= rw->rectsparef;
348
RE_GetResultImage(RE_GetRender(G.scene->id.name), &rres);
350
if(rres.rectf || rres.rect32) {
352
glPixelZoom(rw->zoom, rw->zoom);
353
if(rw->flags & RW_FLAGS_ALPHA) {
355
/* swap bytes, so alpha is most significant one, then just draw it as luminance int */
356
if(G.order==B_ENDIAN)
357
glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
358
glaDrawPixelsSafe(fullrect[0][0], fullrect[0][1], rres.rectx, rres.recty, rres.rectx, GL_LUMINANCE, GL_UNSIGNED_INT, rres.rect32);
359
glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
362
float *trectf= MEM_mallocN(rres.rectx*rres.recty*4, "temp");
365
for(a= rres.rectx*rres.recty -1, b= 4*a+3; a>=0; a--, b-=4)
366
trectf[a]= rres.rectf[b];
368
glaDrawPixelsSafe(fullrect[0][0], fullrect[0][1], rres.rectx, rres.recty, rres.rectx, GL_LUMINANCE, GL_FLOAT, trectf);
374
glaDrawPixelsSafe(fullrect[0][0], fullrect[0][1], rres.rectx, rres.recty, rres.rectx, GL_RGBA, GL_UNSIGNED_BYTE, rres.rect32);
376
glaDrawPixelsSafe_to32(fullrect[0][0], fullrect[0][1], rres.rectx, rres.recty, rres.rectx, rres.rectf);
378
glPixelZoom(1.0, 1.0);
346
382
/* info text is overlayed on bottom */
723
760
* Note: blocked queue handling while rendering to prevent that (ton)
726
/* in render window; display a couple of scanlines of rendered image (see callback below) */
727
static void renderwin_progress(RenderWin *rw, int start_y, int nlines, int rect_w, int rect_h, unsigned char *rect)
763
/* can get as well the full picture, as the parts while rendering */
764
static void renderwin_progress(RenderWin *rw, RenderResult *rr, volatile rcti *renrect)
729
float disprect[2][2];
767
float *rectf= NULL, fullrect[2][2];
768
unsigned int *rect32= NULL;
769
int ymin, ymax, xmin, xmax;
771
/* if renrect argument, we only display scanlines */
773
/* if ymax==recty, rendering of layer is ready, we should not draw, other things happen... */
774
if(rr->renlay==NULL || renrect->ymax>=rr->recty)
777
/* xmin here is first subrect x coord, xmax defines subrect width */
778
xmin = renrect->xmin;
779
xmax = renrect->xmax - xmin;
783
ymax= renrect->ymax - ymin;
786
renrect->ymin= renrect->ymax;
790
xmax = rr->rectx - 2*rr->crop;
791
ymax = rr->recty - 2*rr->crop;
794
/* renderwindow cruft */
732
795
win_rct.xmin= win_rct.ymin= 0;
733
796
window_get_size(rw->win, &win_rct.xmax, &win_rct.ymax);
734
797
win_rct.ymax-= RW_HEADERY;
736
renderwin_get_disprect(rw, disprect);
738
/* for efficiency & speed; not drawing in Blender UI while rendering */
739
//window_make_active(rw->win);
798
renderwin_get_fullrect(rw, fullrect);
800
/* find current float rect for display, first case is after composit... still weak */
807
if(rr->renlay==NULL || rr->renlay->rectf==NULL) return;
808
rectf= rr->renlay->rectf;
812
/* if scanline updates... */
813
rectf+= 4*(rr->rectx*ymin + xmin);
815
/* when rendering more pixels than needed, we crop away cruft */
817
rectf+= 4*(rr->crop*rr->rectx + rr->crop);
820
/* tilerect defines drawing offset from (0,0) */
821
/* however, tilerect (xmin, ymin) is first pixel */
822
fullrect[0][0] += (rr->tilerect.xmin + rr->crop + xmin)*rw->zoom;
823
fullrect[0][1] += (rr->tilerect.ymin + rr->crop + ymin)*rw->zoom;
741
825
glEnable(GL_SCISSOR_TEST);
742
826
glaDefine2DArea(&win_rct);
744
830
glDrawBuffer(GL_FRONT);
745
832
glPixelZoom(rw->zoom, rw->zoom);
746
glaDrawPixelsSafe(disprect[0][0], disprect[0][1] + start_y*rw->zoom, rect_w, nlines, &rect[start_y*rect_w*4]);
835
glaDrawPixelsSafe(fullrect[0][0], fullrect[0][1], xmax, ymax, rr->rectx, GL_RGBA, GL_UNSIGNED_BYTE, rect32);
837
glaDrawPixelsSafe_to32(fullrect[0][0], fullrect[0][1], xmax, ymax, rr->rectx, rectf);
747
839
glPixelZoom(1.0, 1.0);
842
window_swap_buffers(render_win->win);
749
845
glDrawBuffer(GL_BACK);
753
850
/* in render window; display a couple of scanlines of rendered image */
754
static void renderwin_progress_display_cb(int y1, int y2, int w, int h, unsigned int *rect)
851
static void renderwin_progress_display_cb(RenderResult *rr, volatile rcti *rect)
756
853
if (render_win) {
757
renderwin_progress(render_win, y1, y2-y1+1, w, h, (unsigned char*) rect);
762
/* -------------- callbacks for render loop: in View3D ----------------------- */
765
static View3D *render_view3d = NULL;
767
/* init Render view callback */
768
static void renderview_init_display_cb(void)
772
/* Choose the first view with a persp camera,
773
* if one doesn't exist we will get the first
777
for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
778
if (sa->win && sa->spacetype==SPACE_VIEW3D) {
779
View3D *vd= sa->spacedata.first;
781
if (vd->persp==2 && vd->camera==G.scene->camera) {
784
} else if (!render_view3d) {
792
/* in 3d view; display a couple of scanlines of rendered image */
793
static void renderview_progress_display_cb(int y1, int y2, int w, int h, unsigned int *rect)
796
View3D *v3d= render_view3d;
798
float sx, sy, facx, facy;
801
calc_viewborder(v3d, &vb);
803
/* if border render */
804
if(G.scene->r.mode & R_BORDER) {
806
/* but, if image is full (at end of border render, without crop) we don't */
807
if(R.rectx != (G.scene->r.size*G.scene->r.xsch)/100 ||
808
R.recty != (G.scene->r.size*G.scene->r.ysch)/100 ) {
810
facx= (float) (vb.xmax-vb.xmin);
811
facy= (float) (vb.ymax-vb.ymin);
813
vb.xmax= vb.xmin + facx*G.scene->r.border.xmax;
814
vb.ymax= vb.ymin + facy*G.scene->r.border.ymax;
815
vb.xmin+= facx*G.scene->r.border.xmin;
816
vb.ymin+= facy*G.scene->r.border.ymin;
820
facx= (float) (vb.xmax-vb.xmin)/R.rectx;
821
facy= (float) (vb.ymax-vb.ymin)/R.recty;
823
bwin_get_rect(v3d->area->win, &win_rct);
825
glaDefine2DArea(&win_rct);
827
glDrawBuffer(GL_FRONT);
830
sy= vb.ymin + facy*y1;
832
glPixelZoom(facx, facy);
833
glaDrawPixelsSafe(sx, sy, w, nlines, rect+w*y1);
834
glPixelZoom(1.0, 1.0);
837
glDrawBuffer(GL_BACK);
838
v3d->flag |= V3D_DISPIMAGE;
839
v3d->area->win_swap= WIN_FRONT_OK;
844
/* in 3d view; display stats of rendered image */
845
static void renderview_draw_render_info(char *str)
848
View3D *v3d= render_view3d;
851
calc_viewborder(v3d, &vb);
853
bwin_get_rect(v3d->area->win, &win_rct);
854
glaDefine2DArea(&win_rct);
856
glDrawBuffer(GL_FRONT);
858
/* clear header rect */
859
BIF_ThemeColor(TH_HEADER);
860
glRecti(vb.xmin, vb.ymax, vb.xmax, vb.ymax+RW_HEADERY);
863
BIF_ThemeColor(TH_TEXT);
864
glRasterPos2i(vb.xmin+12, vb.ymax+5);
865
BMF_DrawString(G.fonts, str);
869
glDrawBuffer(GL_BACK);
871
v3d->area->win_swap= WIN_FRONT_OK;
854
renderwin_progress(render_win, rr, rect);
877
858
/* -------------- callbacks for render loop: interactivity ----------------------- */
860
/* string is RW_MAXTEXT chars min */
861
void make_renderinfo_string(RenderStats *rs, char *str)
863
extern char info_time_str[32]; // header_info.c
864
extern unsigned long mem_in_use, mmap_in_use;
865
float megs_used_memory, mmap_used_memory;
868
megs_used_memory= (mem_in_use-mmap_in_use)/(1024.0*1024.0);
869
mmap_used_memory= (mmap_in_use)/(1024.0*1024.0);
871
if(G.scene->lay & 0xFF000000)
872
spos+= sprintf(spos, "Localview | ");
873
else if(G.scene->r.scemode & R_SINGLE_LAYER)
874
spos+= sprintf(spos, "Single Layer | ");
877
spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d Ha:%d La:%d Mem:%.2fM (%.2fM) ", (G.scene->r.cfra), rs->totvert, rs->totface, rs->tothalo, rs->totlamp, megs_used_memory, mmap_used_memory);
879
spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d La:%d Mem:%.2fM (%.2fM) ", (G.scene->r.cfra), rs->totvert, rs->totface, rs->totlamp, megs_used_memory, mmap_used_memory);
882
spos+= sprintf(spos, "Field %d ", rs->curfield);
884
spos+= sprintf(spos, "Blur %d ", rs->curblur);
886
BLI_timestr(rs->lastframetime, info_time_str);
887
spos+= sprintf(spos, "Time:%s ", info_time_str);
890
spos+= sprintf(spos, "| %s ", rs->infostr);
892
/* very weak... but 512 characters is quite safe... we cannot malloc during thread render */
893
if(spos >= str+RW_MAXTEXT)
894
printf("WARNING! renderwin text beyond limit \n");
880
898
/* callback for print info in top header of renderwin */
881
/* time is only not zero on last call, we then don't update the other stats */
882
static void printrenderinfo_cb(double time, int sample)
899
static void renderwin_renderinfo_cb(RenderStats *rs)
884
extern int mem_in_use;
885
static int totvert=0, totvlak=0, tothalo=0, totlamp=0;
886
static float megs_used_memory=0.0;
887
char str[300], *spos= str;
890
megs_used_memory= mem_in_use/(1024.0*1024.0);
898
spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d Ha:%d La:%d Mem:%.2fM", (G.scene->r.cfra), totvert, totvlak, tothalo, totlamp, megs_used_memory);
900
spos+= sprintf(spos, "Fra:%d Ve:%d Fa:%d La:%d Mem:%.2fM", (G.scene->r.cfra), totvert, totvlak, totlamp, megs_used_memory);
903
if (R.r.mode & R_FIELDS) {
904
spos+= sprintf(spos, "Field %c ", (R.flag&R_SEC_FIELD)?'B':'A');
907
spos+= sprintf(spos, "Sample: %d ", sample);
911
extern char info_time_str[32]; // header_info.c
912
timestr(time, info_time_str);
913
spos+= sprintf(spos, " Time:%s ", info_time_str);
917
if(render_win->render_text) MEM_freeN(render_win->render_text);
918
render_win->render_text= BLI_strdup(str);
904
make_renderinfo_string(rs, render_win->render_text);
919
908
glDrawBuffer(GL_FRONT);
920
910
renderwin_draw_render_info(render_win);
913
window_swap_buffers(render_win->win);
922
916
glDrawBuffer(GL_BACK);
924
else renderview_draw_render_info(str);
927
922
/* -------------- callback system to allow ESC from rendering ----------------------- */
1027
1032
/* - initialize displays
1028
- both opengl render as blender render
1029
1033
- set callbacks
1033
static void do_render(View3D *ogl_render_view3d, int anim, int force_dispwin)
1037
static void do_render(int anim)
1036
/* we set this flag to prevent renderwindow queue to execute another render */
1037
R.flag= R_RENDERING;
1040
if (G.displaymode == R_DISPLAYWIN || force_dispwin) {
1041
RE_set_initrenderdisplay_callback(NULL);
1042
RE_set_clearrenderdisplay_callback(renderwin_clear_display_cb);
1043
RE_set_renderdisplay_callback(renderwin_progress_display_cb);
1045
renderwin_init_display_cb();
1048
BIF_close_render_display();
1049
RE_set_initrenderdisplay_callback(renderview_init_display_cb);
1050
RE_set_clearrenderdisplay_callback(NULL);
1051
RE_set_renderdisplay_callback(renderview_progress_display_cb);
1054
init_test_break_callback();
1055
RE_set_test_break_callback(test_break);
1057
RE_set_timecursor_callback(set_timecursor);
1058
RE_set_printrenderinfo_callback(printrenderinfo_cb);
1039
Render *re= RE_NewRender(G.scene->id.name);
1040
unsigned int lay= G.scene->lay;
1041
int scemode= G.scene->r.scemode;
1043
/* UGLY! we set this flag to prevent renderwindow queue to execute another render */
1044
/* is reset in RE_BlenderFrame */
1047
/* set render callbacks, also starts ESC timer */
1048
BIF_init_render_callbacks(re, 1);
1061
1052
window_set_cursor(render_win->win, CURSOR_WAIT);
1062
// when opening new window... not cross platform identical behaviour, so
1063
// for now call it each time
1064
// if(ogl_render_view3d) init_gl_stuff();
1068
if(G.obedit && !(G.scene->r.scemode & R_OGL)) {
1069
1055
exit_editmode(0); /* 0 = no free data */
1073
RE_animrender(ogl_render_view3d);
1076
RE_initrender(ogl_render_view3d);
1079
if (render_win) window_set_cursor(render_win->win, CURSOR_STD);
1057
/* allow localview render for objects with lights in normal layers */
1058
if(curarea->spacetype==SPACE_VIEW3D) {
1059
if(G.vd->lay & 0xFF000000) {
1060
G.scene->lay |= G.vd->lay;
1061
G.scene->r.scemode |= R_SINGLE_LAYER;
1063
else G.scene->lay= G.vd->lay;
1067
RE_BlenderAnim(re, G.scene, G.scene->r.sfra, G.scene->r.efra);
1069
RE_BlenderFrame(re, G.scene, G.scene->r.cfra);
1071
/* restore local view exception */
1073
G.scene->r.scemode= scemode;
1075
if(render_win) window_set_cursor(render_win->win, CURSOR_STD);
1081
1077
free_filesel_spec(G.scene->r.pic);
1084
end_test_break_callback();
1086
/* in dispiew it will destroy the image otherwise
1087
window_make_active() raises window at osx and sends redraws */
1088
if(G.displaymode==R_DISPLAYWIN) {
1089
mainwindow_make_active();
1091
/* after an envmap creation... */
1092
if(R.flag & R_REDRAW_PRV) {
1093
BIF_all_preview_changed();
1095
allqueue(REDRAWBUTSSCENE, 0); // visualize fbuf for example
1098
R.flag= 0; // before scene update!
1080
BIF_end_render_callbacks();
1082
/* after an envmap creation... */
1083
// if(R.flag & R_REDRAW_PRV) {
1084
// BIF_preview_changed(ID_TE);
1100
1087
scene_update_for_newframe(G.scene, G.scene->lay); // no redraw needed, this restores to view as we left it
1102
waitcursor(0); // waitcursor checks rendering R.flag...
1105
/* finds area with a 'dispview' set */
1106
static ScrArea *find_dispimage_v3d(void)
1110
for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
1111
if (sa->spacetype==SPACE_VIEW3D) {
1112
View3D *vd= sa->spacedata.first;
1113
if (vd->flag & V3D_DISPIMAGE)
1121
/* used for swapping with spare buffer, when images are different size */
1122
static void scalefastrect(unsigned int *recto, unsigned int *rectn, int oldx, int oldy, int newx, int newy)
1124
unsigned int *rect, *newrect;
1126
int ofsx, ofsy, stepx, stepy;
1128
stepx = (int)((65536.0 * (oldx - 1.0) / (newx - 1.0)) + 0.5);
1129
stepy = (int)((65536.0 * (oldy - 1.0) / (newy - 1.0)) + 0.5);
1133
for (y = newy; y > 0 ; y--){
1135
rect += (ofsy >> 16) * oldx;
1138
for (x = newx ; x>0 ; x--){
1139
*newrect++ = rect[ofsx >> 16];
1092
static void renderwin_store_spare(void)
1096
if(render_win==0 || render_win->storespare==0)
1099
if(render_win->showspare) {
1100
render_win->showspare= 0;
1101
window_set_title(render_win->win, renderwin_get_title(1));
1104
BLI_strncpy(render_win->render_text_spare, render_win->render_text, RW_MAXTEXT);
1106
if(render_win->rectspare) MEM_freeN(render_win->rectspare);
1107
render_win->rectspare= NULL;
1108
if(render_win->rectsparef) MEM_freeN(render_win->rectsparef);
1109
render_win->rectsparef= NULL;
1111
RE_GetResultImage(RE_GetRender(G.scene->id.name), &rres);
1114
render_win->rectspare= MEM_dupallocN(rres.rect32);
1116
render_win->rectsparef= MEM_dupallocN(rres.rectf);
1118
render_win->sparex= rres.rectx;
1119
render_win->sparey= rres.recty;
1145
1122
/* -------------- API: externally called --------------- */
1147
/* not used anywhere ??? */
1149
void BIF_renderwin_make_active(void)
1152
window_make_active(render_win->win);
1124
static void error_cb(char *str){error(str);}
1125
static int esc_timer_set= 0;
1127
/* set callbacks, exported to sequence render too.
1128
Only call in foreground (UI) renders. */
1130
void BIF_init_render_callbacks(Render *re, int do_display)
1133
if(G.displaymode!=R_DISPLAYWIN) {
1135
BIF_close_render_display();
1136
imagewindow_render_callbacks(re);
1139
RE_display_init_cb(re, renderwin_init_display_cb);
1140
RE_display_draw_cb(re, renderwin_progress_display_cb);
1141
RE_display_clear_cb(re, renderwin_clear_display_cb);
1142
RE_stats_draw_cb(re, renderwin_renderinfo_cb);
1146
RE_error_cb(re, error_cb);
1150
render_win->flags &= ~RW_FLAGS_ESCAPE;
1152
/* start esc timer. ensure it happens once only */
1153
if(esc_timer_set==0)
1154
init_test_break_callback();
1157
RE_test_break_cb(re, test_break);
1158
RE_timecursor_cb(re, set_timecursor);
1162
/* the init/end callbacks can be called multiple times (sequence render) */
1163
void BIF_end_render_callbacks(void)
1166
if(esc_timer_set==0) {
1167
end_test_break_callback();
1170
mainwindow_make_active();
1158
1174
/* set up display, render an image or scene */
1159
1175
void BIF_do_render(int anim)
1167
1183
slink_flag = 1;
1171
/* if start render in 3d win, use layer from window (e.g also local view) */
1172
if(curarea && curarea->spacetype==SPACE_VIEW3D) {
1173
int lay= G.scene->lay;
1175
* if view is defined (might not be if called form script), check
1179
if(G.vd->lay & 0xFF000000) // localview
1180
G.scene->lay |= G.vd->lay;
1182
G.scene->lay= G.vd->lay;
1185
do_render(NULL, anim, 0);
1187
if(render_win && render_win->showspare)
1188
renderwin_store_spare();
1192
if(G.scene->use_nodes) {
1193
allqueue(REDRAWNODE, 1);
1194
allqueue(REDRAWIMAGE, 1);
1189
else do_render(NULL, anim, 0);
1191
1196
if (slink_flag) G.f |= G_DOSCRIPTLINKS;
1192
1197
if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_POSTRENDER);
1195
1200
/* set up display, render the current area view in an image */
1196
void BIF_do_ogl_render(View3D *ogl_render_view3d, int anim)
1201
/* the RE_Render is only used to make sure we got the picture in the result */
1202
void BIF_do_ogl_render(View3D *v3d, int anim)
1198
G.scene->r.scemode |= R_OGL;
1199
do_render(ogl_render_view3d, anim, 1);
1200
G.scene->r.scemode &= ~R_OGL;
1204
Render *re= RE_NewRender(G.scene->id.name);
1209
init_test_break_callback();
1211
winx= (G.scene->r.size*G.scene->r.xsch)/100;
1212
winy= (G.scene->r.size*G.scene->r.ysch)/100;
1214
RE_InitState(re, &G.scene->r, winx, winy, NULL);
1216
/* for now, result is defaulting to floats still... */
1217
rr= RE_GetResult(re);
1218
if(rr->rect32==NULL)
1219
rr->rect32= MEM_mallocN(sizeof(int)*winx*winy, "32 bits rects");
1222
renderwin_init_display_cb(rr);
1224
render_win->flags &= ~RW_FLAGS_ESCAPE;
1231
bMovieHandle *mh= BKE_get_movie_handle(G.scene->r.imtype);
1234
if(BKE_imtype_is_movie(G.scene->r.imtype))
1235
mh->start_movie(&G.scene->r, winx, winy);
1237
for(CFRA= SFRA; CFRA<=EFRA; CFRA++) {
1238
/* user event can close window */
1239
if(render_win==NULL)
1241
drawview3d_render(v3d, winx, winy);
1242
glReadPixels(0, 0, winx, winy, GL_RGBA, GL_UNSIGNED_BYTE, rr->rect32);
1243
window_swap_buffers(render_win->win);
1245
if(BKE_imtype_is_movie(G.scene->r.imtype)) {
1246
mh->append_movie(CFRA, rr->rect32, winx, winy);
1247
printf("Append frame %d", G.scene->r.cfra);
1250
ImBuf *ibuf= IMB_allocImBuf(winx, winy, G.scene->r.planes, 0, 0);
1251
char name[FILE_MAXDIR+FILE_MAXFILE];
1254
BKE_makepicstring(name, (G.scene->r.cfra));
1256
ibuf->rect= rr->rect32;
1257
ok= BKE_write_ibuf(ibuf, name, G.scene->r.imtype, G.scene->r.subimtype, G.scene->r.quality);
1260
printf("Write error: cannot save %s\n", name);
1263
else printf("Saved: %s", name);
1265
/* imbuf knows which rects are not part of ibuf */
1266
IMB_freeImBuf(ibuf);
1268
/* movie stats prints have no line break */
1271
if(test_break()) break;
1274
if(BKE_imtype_is_movie(G.scene->r.imtype))
1280
drawview3d_render(v3d, winx, winy);
1281
glReadPixels(0, 0, winx, winy, GL_RGBA, GL_UNSIGNED_BYTE, rr->rect32);
1282
window_swap_buffers(render_win->win);
1286
renderwin_draw(render_win, 0);
1288
mainwindow_make_active();
1291
scene_update_for_newframe(G.scene, G.scene->lay); // no redraw needed, this restores to view as we left it
1293
end_test_break_callback();
1203
1297
void BIF_redraw_render_rect(void)
1207
if (G.displaymode == R_DISPLAYWIN) {
1208
// don't open render_win if rendering has been
1209
// canceled or the render_win has been actively closed
1211
renderwin_queue_redraw(render_win);
1301
renderwin_queue_redraw(render_win);
1304
Image *ima = (Image *)find_id("IM", "Render Result");
1305
if(ima && ima->ibuf) {
1306
IMB_freeImBuf(ima->ibuf);
1308
allqueue(REDRAWIMAGE, 0);
1214
renderview_init_display_cb();
1215
renderview_progress_display_cb(0, R.recty-1, R.rectx, R.recty, R.rectot);
1219
1313
void BIF_swap_render_rects(void)
1223
if(R.rectspare==0) {
1224
R.rectspare= (unsigned int *)MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
1228
else if(R.sparex!=R.rectx || R.sparey!=R.recty) {
1229
temp= (unsigned int *)MEM_callocN(sizeof(int)*R.rectx*R.recty, "rectot");
1231
scalefastrect(R.rectspare, temp, R.sparex, R.sparey, R.rectx, R.recty);
1232
MEM_freeN(R.rectspare);
1240
R.rectot= R.rectspare;
1243
if (G.displaymode == R_DISPLAYWIN) {
1245
char *tmp= render_win->render_text_spare;
1246
render_win->render_text_spare= render_win->render_text;
1247
render_win->render_text= tmp;
1249
window_set_title(render_win->win, renderwin_get_title(1));
1317
if (render_win==NULL) return;
1319
render_win->storespare= 1;
1320
render_win->showspare ^= 1;
1322
RE_GetResultImage(RE_GetRender(G.scene->id.name), &rres);
1324
if(render_win->sparex!=rres.rectx || render_win->sparey!=rres.recty) {
1325
if(render_win->rectspare) MEM_freeN(render_win->rectspare);
1326
render_win->rectspare= NULL;
1327
if(render_win->rectsparef) MEM_freeN(render_win->rectsparef);
1328
render_win->rectsparef= NULL;
1331
window_set_title(render_win->win, renderwin_get_title(1));
1255
1334
BIF_redraw_render_rect();
1258
1338
/* called from usiblender.c too, to free and close renderwin */
1259
1339
void BIF_close_render_display(void)
1261
1341
if (render_win) {
1263
1342
if (render_win->info_text) MEM_freeN(render_win->info_text);
1264
1343
if (render_win->render_text) MEM_freeN(render_win->render_text);
1265
1344
if (render_win->render_text_spare) MEM_freeN(render_win->render_text_spare);
1345
if (render_win->rectspare) MEM_freeN(render_win->rectspare);
1346
if (render_win->rectsparef) MEM_freeN(render_win->rectsparef);
1267
1348
window_destroy(render_win->win); /* ghost close window */
1268
1349
MEM_freeN(render_win);