134
142
float megs_used_memory= mem_in_use/(1024.0*1024.0);
135
143
char str[400], *spos= str;
137
if(rs->convertdone) {
139
spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", G.scene->r.cfra, megs_used_memory);
142
spos+= sprintf(spos, "Field %d ", rs->curfield);
144
spos+= sprintf(spos, "Blur %d ", rs->curblur);
147
spos+= sprintf(spos, "| %s", rs->infostr);
151
spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
153
spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->totlamp);
155
printf(str); printf("\n");
145
spos+= sprintf(spos, "Fra:%d Mem:%.2fM ", G.scene->r.cfra, megs_used_memory);
148
spos+= sprintf(spos, "Field %d ", rs->curfield);
150
spos+= sprintf(spos, "Blur %d ", rs->curblur);
153
spos+= sprintf(spos, "| %s", rs->infostr);
157
spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d Ha:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->tothalo, rs->totlamp);
159
spos+= sprintf(spos, "Sce: %s Ve:%d Fa:%d La:%d", G.scene->id.name+2, rs->totvert, rs->totface, rs->totlamp);
161
printf(str); printf("\n");
159
static void free_render_result(RenderResult *res)
164
void RE_FreeRenderResult(RenderResult *res)
161
166
if(res==NULL) return;
163
168
while(res->layers.first) {
164
169
RenderLayer *rl= res->layers.first;
166
if(rl->rectf) MEM_freeT(rl->rectf);
167
/* acolrect is optionally allocated in shade_tile, only free here since it can be used for drawing */
168
if(rl->acolrect) MEM_freeT(rl->acolrect);
171
if(rl->rectf) MEM_freeN(rl->rectf);
172
/* acolrect and scolrect are optionally allocated in shade_tile, only free here since it can be used for drawing */
173
if(rl->acolrect) MEM_freeN(rl->acolrect);
174
if(rl->scolrect) MEM_freeN(rl->scolrect);
170
176
while(rl->passes.first) {
171
177
RenderPass *rpass= rl->passes.first;
172
if(rpass->rect) MEM_freeT(rpass->rect);
178
if(rpass->rect) MEM_freeN(rpass->rect);
173
179
BLI_remlink(&rl->passes, rpass);
176
182
BLI_remlink(&res->layers, rl);
181
MEM_freeT(res->rect32);
187
MEM_freeN(res->rect32);
183
MEM_freeT(res->rectz);
189
MEM_freeN(res->rectz);
185
MEM_freeT(res->rectf);
191
MEM_freeN(res->rectf);
196
/* version that's compatible with fullsample buffers */
197
static void free_render_result(ListBase *lb, RenderResult *rr)
199
RenderResult *rrnext;
201
for(; rr; rr= rrnext) {
207
RE_FreeRenderResult(rr);
190
212
/* all layers except the active one get temporally pushed away */
191
213
static void push_render_result(Render *re)
193
215
/* officially pushed result should be NULL... error can happen with do_seq */
194
free_render_result(re->pushedresult);
216
RE_FreeRenderResult(re->pushedresult);
196
218
re->pushedresult= re->result;
197
219
re->result= NULL;
233
free_render_result(re->pushedresult);
255
RE_FreeRenderResult(re->pushedresult);
234
256
re->pushedresult= NULL;
260
/* NOTE: OpenEXR only supports 32 chars for layer+pass names
261
In blender we now use max 10 chars for pass, max 20 for layer */
239
262
static char *get_pass_name(int passtype, int channel)
242
265
if(passtype == SCE_PASS_COMBINED) {
266
if(channel==-1) return "Combined";
243
267
if(channel==0) return "Combined.R";
244
else if(channel==1) return "Combined.G";
245
else if(channel==2) return "Combined.B";
246
else return "Combined.A";
248
if(passtype == SCE_PASS_Z)
268
if(channel==1) return "Combined.G";
269
if(channel==2) return "Combined.B";
272
if(passtype == SCE_PASS_Z) {
273
if(channel==-1) return "Depth";
250
276
if(passtype == SCE_PASS_VECTOR) {
277
if(channel==-1) return "Vector";
251
278
if(channel==0) return "Vector.X";
252
else if(channel==1) return "Vector.Y";
253
else if(channel==2) return "Vector.Z";
254
else return "Vector.W";
279
if(channel==1) return "Vector.Y";
280
if(channel==2) return "Vector.Z";
256
283
if(passtype == SCE_PASS_NORMAL) {
284
if(channel==-1) return "Normal";
257
285
if(channel==0) return "Normal.X";
258
else if(channel==1) return "Normal.Y";
259
else return "Normal.Z";
286
if(channel==1) return "Normal.Y";
289
if(passtype == SCE_PASS_UV) {
290
if(channel==-1) return "UV";
291
if(channel==0) return "UV.U";
292
if(channel==1) return "UV.V";
261
295
if(passtype == SCE_PASS_RGBA) {
296
if(channel==-1) return "Color";
262
297
if(channel==0) return "Color.R";
263
else if(channel==1) return "Color.G";
264
else if(channel==2) return "Color.B";
265
else return "Color.A";
298
if(channel==1) return "Color.G";
299
if(channel==2) return "Color.B";
267
302
if(passtype == SCE_PASS_DIFFUSE) {
303
if(channel==-1) return "Diffuse";
268
304
if(channel==0) return "Diffuse.R";
269
else if(channel==1) return "Diffuse.G";
270
else return "Diffuse.B";
305
if(channel==1) return "Diffuse.G";
272
308
if(passtype == SCE_PASS_SPEC) {
309
if(channel==-1) return "Spec";
273
310
if(channel==0) return "Spec.R";
274
else if(channel==1) return "Spec.G";
275
else return "Spec.B";
311
if(channel==1) return "Spec.G";
277
314
if(passtype == SCE_PASS_SHADOW) {
315
if(channel==-1) return "Shadow";
278
316
if(channel==0) return "Shadow.R";
279
else if(channel==1) return "Shadow.G";
280
else return "Shadow.B";
317
if(channel==1) return "Shadow.G";
282
320
if(passtype == SCE_PASS_AO) {
321
if(channel==-1) return "AO";
283
322
if(channel==0) return "AO.R";
284
else if(channel==1) return "AO.G";
287
if(passtype == SCE_PASS_RAY) {
288
if(channel==0) return "Ray.R";
289
else if(channel==1) return "Ray.G";
323
if(channel==1) return "AO.G";
326
if(passtype == SCE_PASS_REFLECT) {
327
if(channel==-1) return "Reflect";
328
if(channel==0) return "Reflect.R";
329
if(channel==1) return "Reflect.G";
332
if(passtype == SCE_PASS_REFRACT) {
333
if(channel==-1) return "Refract";
334
if(channel==0) return "Refract.R";
335
if(channel==1) return "Refract.G";
338
if(passtype == SCE_PASS_RADIO) {
339
if(channel==-1) return "Radio";
340
if(channel==0) return "Radio.R";
341
if(channel==1) return "Radio.G";
344
if(passtype == SCE_PASS_INDEXOB) {
345
if(channel==-1) return "IndexOB";
348
if(passtype == SCE_PASS_MIST) {
349
if(channel==-1) return "Mist";
292
352
return "Unknown";
295
static void render_unique_exr_name(Render *re, char *str)
297
char di[FILE_MAXDIR+FILE_MAXFILE], name[FILE_MAXFILE], fi[FILE_MAXFILE];
299
BLI_strncpy(di, G.sce, FILE_MAXDIR+FILE_MAXFILE);
355
static int passtype_from_name(char *str)
358
if(strcmp(str, "Combined")==0)
359
return SCE_PASS_COMBINED;
361
if(strcmp(str, "Depth")==0)
364
if(strcmp(str, "Vector")==0)
365
return SCE_PASS_VECTOR;
367
if(strcmp(str, "Normal")==0)
368
return SCE_PASS_NORMAL;
370
if(strcmp(str, "UV")==0)
373
if(strcmp(str, "Color")==0)
374
return SCE_PASS_RGBA;
376
if(strcmp(str, "Diffuse")==0)
377
return SCE_PASS_DIFFUSE;
379
if(strcmp(str, "Spec")==0)
380
return SCE_PASS_SPEC;
382
if(strcmp(str, "Shadow")==0)
383
return SCE_PASS_SHADOW;
385
if(strcmp(str, "AO")==0)
388
if(strcmp(str, "Reflect")==0)
389
return SCE_PASS_REFLECT;
391
if(strcmp(str, "Refract")==0)
392
return SCE_PASS_REFRACT;
394
if(strcmp(str, "Radio")==0)
395
return SCE_PASS_RADIO;
397
if(strcmp(str, "IndexOB")==0)
398
return SCE_PASS_INDEXOB;
400
if(strcmp(str, "Mist")==0)
401
return SCE_PASS_MIST;
406
static void render_unique_exr_name(Render *re, char *str, int sample)
408
char di[FILE_MAX], name[FILE_MAXFILE], fi[FILE_MAXFILE];
410
BLI_strncpy(di, G.sce, FILE_MAX);
300
411
BLI_splitdirstring(di, fi);
301
sprintf(name, "%s_%s.exr", fi, re->scene->id.name+2);
303
BLI_make_file_string("/", str, "/tmp/", name);
414
sprintf(name, "%s_%s.exr", fi, re->scene->id.name+2);
305
BLI_make_file_string("/", str, U.tempdir, name);
416
sprintf(name, "%s_%s%d.exr", fi, re->scene->id.name+2, sample);
418
BLI_make_file_string("/", str, btempdir, name);
309
421
static void render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, int passtype)
311
423
char *typestr= get_pass_name(passtype, 0);
312
RenderPass *rpass= MEM_callocT(sizeof(RenderPass), typestr);
424
RenderPass *rpass= MEM_callocN(sizeof(RenderPass), typestr);
313
425
int rectsize= rr->rectx*rr->recty*channels;
315
427
BLI_addtail(&rl->passes, rpass);
399
516
if((re->r.scemode & R_SINGLE_LAYER) && nr!=re->r.actlay)
518
if(srl->layflag & SCE_LAY_DISABLE)
402
rl= MEM_callocT(sizeof(RenderLayer), "new render layer");
521
rl= MEM_callocN(sizeof(RenderLayer), "new render layer");
403
522
BLI_addtail(&rr->layers, rl);
405
524
strcpy(rl->name, srl->name);
406
525
rl->lay= srl->lay;
526
rl->lay_zmask= srl->lay_zmask;
407
527
rl->layflag= srl->layflag;
408
528
rl->passflag= srl->passflag;
529
rl->pass_xor= srl->pass_xor;
530
rl->light_override= srl->light_override;
531
rl->mat_override= srl->mat_override;
410
533
if(rr->exrhandle) {
411
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R");
412
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.G");
413
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.B");
414
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.A");
534
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
535
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.G", 0, 0, NULL);
536
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.B", 0, 0, NULL);
537
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.A", 0, 0, NULL);
417
rl->rectf= MEM_mapallocT(rectx*recty*sizeof(float)*4, "Combined rgba");
540
rl->rectf= MEM_mapallocN(rectx*recty*sizeof(float)*4, "Combined rgba");
419
542
if(srl->passflag & SCE_PASS_Z)
420
543
render_layer_add_pass(rr, rl, 1, SCE_PASS_Z);
422
545
render_layer_add_pass(rr, rl, 4, SCE_PASS_VECTOR);
423
546
if(srl->passflag & SCE_PASS_NORMAL)
424
547
render_layer_add_pass(rr, rl, 3, SCE_PASS_NORMAL);
548
if(srl->passflag & SCE_PASS_UV)
549
render_layer_add_pass(rr, rl, 3, SCE_PASS_UV);
425
550
if(srl->passflag & SCE_PASS_RGBA)
426
551
render_layer_add_pass(rr, rl, 4, SCE_PASS_RGBA);
427
552
if(srl->passflag & SCE_PASS_DIFFUSE)
428
553
render_layer_add_pass(rr, rl, 3, SCE_PASS_DIFFUSE);
429
554
if(srl->passflag & SCE_PASS_SPEC)
430
555
render_layer_add_pass(rr, rl, 3, SCE_PASS_SPEC);
556
if(srl->passflag & SCE_PASS_AO)
557
render_layer_add_pass(rr, rl, 3, SCE_PASS_AO);
431
558
if(srl->passflag & SCE_PASS_SHADOW)
432
559
render_layer_add_pass(rr, rl, 3, SCE_PASS_SHADOW);
433
if(srl->passflag & SCE_PASS_AO)
434
render_layer_add_pass(rr, rl, 3, SCE_PASS_AO);
435
if(srl->passflag & SCE_PASS_RAY)
436
render_layer_add_pass(rr, rl, 3, SCE_PASS_RAY);
560
if(srl->passflag & SCE_PASS_REFLECT)
561
render_layer_add_pass(rr, rl, 3, SCE_PASS_REFLECT);
562
if(srl->passflag & SCE_PASS_REFRACT)
563
render_layer_add_pass(rr, rl, 3, SCE_PASS_REFRACT);
564
if(srl->passflag & SCE_PASS_RADIO)
565
render_layer_add_pass(rr, rl, 3, SCE_PASS_RADIO);
566
if(srl->passflag & SCE_PASS_INDEXOB)
567
render_layer_add_pass(rr, rl, 1, SCE_PASS_INDEXOB);
568
if(srl->passflag & SCE_PASS_MIST)
569
render_layer_add_pass(rr, rl, 1, SCE_PASS_MIST);
439
/* previewrender and envmap don't do layers, so we make a default one */
572
/* sss, previewrender and envmap don't do layers, so we make a default one */
440
573
if(rr->layers.first==NULL) {
441
rl= MEM_callocT(sizeof(RenderLayer), "new render layer");
574
rl= MEM_callocN(sizeof(RenderLayer), "new render layer");
442
575
BLI_addtail(&rr->layers, rl);
444
rl->rectf= MEM_mapallocT(rectx*recty*sizeof(float)*4, "prev/env float rgba");
577
/* duplicate code... */
579
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
580
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.G", 0, 0, NULL);
581
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.B", 0, 0, NULL);
582
IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.A", 0, 0, NULL);
585
rl->rectf= MEM_mapallocN(rectx*recty*sizeof(float)*4, "Combined rgba");
446
587
/* note, this has to be in sync with scene.c */
447
588
rl->lay= (1<<20) -1;
547
687
int a, xstride= 4;
548
688
for(a=0; a<xstride; a++)
549
IMB_exr_set_channel(re->result->exrhandle, rlp->name, get_pass_name(SCE_PASS_COMBINED, a),
550
xstride, xstride*pa->rectx, rlp->rectf+a + xstride*offs);
689
IMB_exr_set_channel(rr->exrhandle, rlp->name, get_pass_name(SCE_PASS_COMBINED, a),
690
xstride, xstride*rrpart->rectx, rlp->rectf+a + xstride*offs);
553
693
/* passes are allocated in sync */
554
694
for(rpassp= rlp->passes.first; rpassp; rpassp= rpassp->next) {
555
695
int a, xstride= rpassp->channels;
556
696
for(a=0; a<xstride; a++)
557
IMB_exr_set_channel(re->result->exrhandle, rlp->name, get_pass_name(rpassp->passtype, a),
558
xstride, xstride*pa->rectx, rpassp->rect+a + xstride*offs);
697
IMB_exr_set_channel(rr->exrhandle, rlp->name, get_pass_name(rpassp->passtype, a),
698
xstride, xstride*rrpart->rectx, rpassp->rect+a + xstride*offs);
563
703
party= rrpart->tilerect.ymin + rrpart->crop;
564
704
partx= rrpart->tilerect.xmin + rrpart->crop;
565
IMB_exrtile_write_channels(re->result->exrhandle, partx, party);
567
BLI_unlock_thread(LOCK_CUSTOM1);
571
static void read_render_result(Render *re)
705
IMB_exrtile_write_channels(rr->exrhandle, partx, party, 0);
707
BLI_unlock_thread(LOCK_IMAGE);
711
static void save_empty_result_tiles(Render *re)
716
for(rr= re->result; rr; rr= rr->next) {
717
IMB_exrtile_clear_channels(rr->exrhandle);
719
for(pa= re->parts.first; pa; pa= pa->next) {
721
int party= pa->disprect.ymin - re->disprect.ymin + pa->crop;
722
int partx= pa->disprect.xmin - re->disprect.xmin + pa->crop;
723
IMB_exrtile_write_channels(rr->exrhandle, partx, party, 0);
730
/* for passes read from files, these have names stored */
731
static char *make_pass_name(RenderPass *rpass, int chan)
733
static char name[16];
736
BLI_strncpy(name, rpass->name, EXR_PASS_MAXNAME);
739
name[len+1]= rpass->chan_id[chan];
745
/* filename already made absolute */
746
/* called from within UI, saves both rendered result as a file-read result */
747
void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress)
751
void *exrhandle= IMB_exr_get_handle();
753
BLI_make_existing_file(filename);
755
/* composite result */
757
IMB_exr_add_channel(exrhandle, "Composite", "Combined.R", 4, 4*rr->rectx, rr->rectf);
758
IMB_exr_add_channel(exrhandle, "Composite", "Combined.G", 4, 4*rr->rectx, rr->rectf+1);
759
IMB_exr_add_channel(exrhandle, "Composite", "Combined.B", 4, 4*rr->rectx, rr->rectf+2);
760
IMB_exr_add_channel(exrhandle, "Composite", "Combined.A", 4, 4*rr->rectx, rr->rectf+3);
763
/* add layers/passes and assign channels */
764
for(rl= rr->layers.first; rl; rl= rl->next) {
769
for(a=0; a<xstride; a++)
770
IMB_exr_add_channel(exrhandle, rl->name, get_pass_name(SCE_PASS_COMBINED, a),
771
xstride, xstride*rr->rectx, rl->rectf+a);
774
/* passes are allocated in sync */
775
for(rpass= rl->passes.first; rpass; rpass= rpass->next) {
776
int a, xstride= rpass->channels;
777
for(a=0; a<xstride; a++) {
779
IMB_exr_add_channel(exrhandle, rl->name, get_pass_name(rpass->passtype, a),
780
xstride, xstride*rr->rectx, rpass->rect+a);
782
IMB_exr_add_channel(exrhandle, rl->name, make_pass_name(rpass, a),
783
xstride, xstride*rr->rectx, rpass->rect+a);
788
IMB_exr_begin_write(exrhandle, filename, rr->rectx, rr->recty, compress);
790
IMB_exr_write_channels(exrhandle);
791
IMB_exr_close(exrhandle);
794
/* callbacks for RE_MultilayerConvert */
795
static void *ml_addlayer_cb(void *base, char *str)
797
RenderResult *rr= base;
800
rl= MEM_callocN(sizeof(RenderLayer), "new render layer");
801
BLI_addtail(&rr->layers, rl);
803
BLI_strncpy(rl->name, str, EXR_LAY_MAXNAME);
806
static void ml_addpass_cb(void *base, void *lay, char *str, float *rect, int totchan, char *chan_id)
808
RenderLayer *rl= lay;
809
RenderPass *rpass= MEM_callocN(sizeof(RenderPass), "loaded pass");
812
BLI_addtail(&rl->passes, rpass);
813
rpass->channels= totchan;
815
rpass->passtype= passtype_from_name(str);
816
if(rpass->passtype==0) printf("unknown pass %s\n", str);
817
rl->passflag |= rpass->passtype;
819
BLI_strncpy(rpass->name, str, EXR_PASS_MAXNAME);
820
/* channel id chars */
821
for(a=0; a<totchan; a++)
822
rpass->chan_id[a]= chan_id[a];
827
/* from imbuf, if a handle was returned we convert this to render result */
828
RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty)
830
RenderResult *rr= MEM_callocN(sizeof(RenderResult), "loaded render result");
835
IMB_exr_multilayer_convert(exrhandle, rr, ml_addlayer_cb, ml_addpass_cb);
840
/* called in end of render, to add names to passes... for UI only */
841
static void renderresult_add_names(RenderResult *rr)
846
for(rl= rr->layers.first; rl; rl= rl->next)
847
for(rpass= rl->passes.first; rpass; rpass= rpass->next)
848
strcpy(rpass->name, get_pass_name(rpass->passtype, -1));
852
/* only for temp buffer files, makes exact copy of render result */
853
static void read_render_result(Render *re, int sample)
574
856
RenderPass *rpass;
575
857
void *exrhandle= IMB_exr_get_handle();
576
858
int rectx, recty;
577
char str[FILE_MAXDIR+FILE_MAXFILE];
579
free_render_result(re->result);
861
RE_FreeRenderResult(re->result);
580
862
re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
582
render_unique_exr_name(re, str);
864
render_unique_exr_name(re, str, sample);
583
865
if(IMB_exr_begin_read(exrhandle, str, &rectx, &recty)==0) {
584
printf("cannot read render result\n");
866
IMB_exr_close(exrhandle);
867
printf("cannot read: %s\n", str);
588
if(rectx!=re->result->rectx || recty!=re->result->recty) {
871
printf("read exr tmp file: %s\n", str);
873
if(re->result == NULL || rectx!=re->result->rectx || recty!=re->result->recty) {
589
874
printf("error in reading render result\n");
789
1075
re->recty= winy;
792
if(re->rectx < 2 || re->recty < 2) {
1078
if(re->rectx < 2 || re->recty < 2 || (BKE_imtype_is_movie(rd->imtype) &&
1079
(re->rectx < 16 || re->recty < 16) )) {
793
1080
re->error("Image too small");
797
/* check state variables, osa? */
798
if(re->r.mode & (R_OSA)) {
800
if(re->osa>16) re->osa= 16;
1084
#ifndef WITH_OPENEXR
1085
/* can't do this without openexr support */
1086
re->r.scemode &= ~R_EXR_TILE_FILE;
1089
if(!(re->r.scemode & R_EXR_TILE_FILE))
1090
re->r.scemode &= ~R_FULL_SAMPLE; /* clear, so we can use this flag for test both */
1092
/* fullsample wants uniform osa levels */
1093
if(source && (re->r.scemode & R_FULL_SAMPLE)) {
1094
/* but, if source has no full sample we disable it */
1095
if((source->r.scemode & R_FULL_SAMPLE)==0)
1096
re->r.scemode &= ~R_FULL_SAMPLE;
1098
re->r.osa= re->osa= source->osa;
1101
/* check state variables, osa? */
1102
if(re->r.mode & (R_OSA)) {
1104
if(re->osa>16) re->osa= 16;
804
1109
/* always call, checks for gamma, gamma tables and jitter too */
805
1110
make_sample_tables(re);
807
1112
/* make empty render result, so display callbacks can initialize */
808
free_render_result(re->result);
1113
RE_FreeRenderResult(re->result);
809
1114
re->result= MEM_callocN(sizeof(RenderResult), "new render result");
810
1115
re->result->rectx= re->rectx;
811
1116
re->result->recty= re->recty;
1118
/* we clip faces with a minimum of 2 pixel boundary outside of image border. see zbuf.c */
1119
re->clipcrop= 1.0f + 2.0f/(float)(re->winx>re->winy?re->winy:re->winx);
1121
RE_init_threadcount(re);
1125
/* part of external api, not called for regular render pipeline */
815
1126
void RE_SetDispRect (struct Render *re, rcti *disprect)
817
1128
re->disprect= *disprect;
1091
1442
re->i.infostr= NULL;
1445
/* make osa new results for samples */
1446
static RenderResult *new_full_sample_buffers_exr(Render *re)
1450
for(a=0; a<re->osa; a++) {
1451
RenderResult *rr= new_render_result(re, &re->disprect, 0, 1);
1452
BLI_addtail(&re->fullresult, rr);
1456
return re->fullresult.first;
1094
1459
static void threaded_tile_processor(Render *re)
1096
1461
ListBase threads;
1097
1462
RenderPart *pa, *nextpa;
1099
1463
rctf viewplane= re->viewplane;
1100
int maxthreads, rendering=1, counter= 1, drawtimer=0, hasdrawn, minx=0;
1102
/* first step; the entire render result, or prepare exr buffer saving */
1103
free_render_result(re->result);
1104
rr= re->result= new_render_result(re, &re->disprect, 0, re->r.scemode & R_EXR_TILE_FILE);
1464
int rendering=1, counter= 1, drawtimer=0, hasdrawn, minx=0;
1466
/* first step; free the entire render result, make new, and/or prepare exr buffer saving */
1467
RE_FreeRenderResult(re->result);
1470
re->result= new_render_result(re, &re->disprect, 0, 0);
1471
else if(re->r.scemode & R_FULL_SAMPLE)
1472
re->result= new_full_sample_buffers_exr(re);
1474
re->result= new_render_result(re, &re->disprect, 0, re->r.scemode & R_EXR_TILE_FILE);
1476
if(re->result==NULL)
1108
1479
/* warning; no return here without closing exr file */
1109
// if(re->re->test_break())
1115
char str[FILE_MAXDIR+FILE_MAXFILE];
1117
render_unique_exr_name(re, str);
1119
printf("write exr tmp file, %dx%d, %s\n", rr->rectx, rr->recty, str);
1120
IMB_exrtile_begin_write(rr->exrhandle, str, rr->rectx, rr->recty, rr->rectx/re->xparts, rr->recty/re->yparts);
1483
if(re->result->exrhandle) {
1487
for(rr= re->result; rr; rr= rr->next) {
1488
render_unique_exr_name(re, str, rr->sample_nr);
1490
printf("write exr tmp file, %dx%d, %s\n", rr->rectx, rr->recty, str);
1491
IMB_exrtile_begin_write(rr->exrhandle, str, 0, rr->rectx, rr->recty, re->partx, re->party);
1123
if(re->r.mode & R_THREADS) maxthreads= 2;
1126
BLI_init_threads(&threads, do_part_thread, maxthreads);
1495
BLI_init_threads(&threads, do_part_thread, re->r.threads);
1128
1497
/* assuming no new data gets added to dbase... */
1443
1827
static void load_backbuffer(Render *re)
1445
1829
if(re->r.alphamode == R_ADDSKY) {
1447
1831
char name[256];
1449
1833
strcpy(name, re->r.backbuf);
1450
BLI_convertstringcode(name, G.sce, re->r.cfra);
1834
BLI_convertstringcode(name, G.sce);
1835
BLI_convertstringframe(name, re->r.cfra);
1452
1837
if(re->backbuf) {
1453
1838
re->backbuf->id.us--;
1458
re->backbuf= add_image(name);
1460
if(bima && bima->id.us<1) {
1461
free_image_buffers(bima);
1464
if(re->backbuf && re->backbuf->ibuf==NULL) {
1465
re->backbuf->ibuf= IMB_loadiffname(re->backbuf->name, IB_rect);
1466
if(re->backbuf->ibuf==NULL)
1471
if (re->r.mode & R_FIELDS)
1472
image_de_interlace(re->backbuf, re->r.mode & R_ODDFIELD);
1475
if(re->backbuf==NULL || re->backbuf->ok==0) {
1839
if(re->backbuf->id.us<1)
1840
BKE_image_signal(re->backbuf, NULL, IMA_SIGNAL_RELOAD);
1843
re->backbuf= BKE_add_image_file(name);
1844
ibuf= BKE_image_get_ibuf(re->backbuf, NULL);
1476
1846
// error() doesnt work with render window open
1477
1847
//error("No backbuf there!");
1478
1848
printf("Error: No backbuf %s\n", name);
1851
if (re->r.mode & R_FIELDS)
1852
image_de_interlace(re->backbuf, re->r.mode & R_ODDFIELD);
1630
2022
R.i.infostr= NULL;
2026
/* reads all buffers, calls optional composite, merges in first result->rectf */
2027
static void do_merge_fullsample(Render *re, bNodeTree *ntree)
2029
float *rectf, filt[3][3];
2032
/* filtmask needs it */
2035
/* we accumulate in here */
2036
rectf= MEM_mapallocN(re->rectx*re->recty*sizeof(float)*4, "fullsample rgba");
2038
for(sample=0; sample<re->r.osa; sample++) {
2042
/* set all involved renders on the samplebuffers (first was done by render itself) */
2043
/* also function below assumes this */
2047
tag_scenes_for_render(re);
2048
for(re1= RenderList.first; re1; re1= re1->next) {
2049
if(re1->scene->id.flag & LIB_DOIT)
2050
if(re1->r.scemode & R_FULL_SAMPLE)
2051
read_render_result(re1, sample);
2057
ntreeCompositTagRender(re->scene);
2058
ntreeCompositTagAnimated(ntree);
2060
ntreeCompositExecTree(ntree, &re->r, G.background==0);
2063
/* ensure we get either composited result or the active layer */
2064
RE_GetResultImage(re, &rres);
2066
/* accumulate with filter, and clip */
2068
mask_array(mask, filt);
2070
for(y=0; y<re->recty; y++) {
2071
float *rf= rectf + 4*y*re->rectx;
2072
float *col= rres.rectf + 4*y*re->rectx;
2074
for(x=0; x<re->rectx; x++, rf+=4, col+=4) {
2075
if(col[0]<0.0f) col[0]=0.0f; else if(col[0] > 1.0f) col[0]= 1.0f;
2076
if(col[1]<0.0f) col[1]=0.0f; else if(col[1] > 1.0f) col[1]= 1.0f;
2077
if(col[2]<0.0f) col[2]=0.0f; else if(col[2] > 1.0f) col[2]= 1.0f;
2079
add_filt_fmask_coord(filt, col, rf, re->rectx, re->recty, x, y);
2084
if(sample!=re->osa-1) {
2085
/* weak... the display callback wants an active renderlayer pointer... */
2086
re->result->renlay= render_get_active_layer(re, re->result);
2087
re->display_draw(re->result, NULL);
2090
if(re->test_break())
2094
if(re->result->rectf)
2095
MEM_freeN(re->result->rectf);
2096
re->result->rectf= rectf;
2099
void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree)
2104
/* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */
2106
/* tag scenes unread */
2107
for(scene= G.main->scene.first; scene; scene= scene->id.next)
2108
scene->id.flag |= LIB_DOIT;
2110
for(node= ntree->nodes.first; node; node= node->next) {
2111
if(node->type==CMP_NODE_R_LAYERS) {
2112
Scene *nodescene= (Scene *)node->id;
2114
if(nodescene==NULL) nodescene= sce;
2115
if(nodescene->id.flag & LIB_DOIT) {
2116
nodescene->r.mode |= R_OSA; /* render struct needs tables */
2117
RE_ReadRenderResult(sce, nodescene);
2118
nodescene->id.flag &= ~LIB_DOIT;
2123
/* own render result should be read/allocated */
2124
if(G.scene->id.flag & LIB_DOIT)
2125
RE_ReadRenderResult(G.scene, G.scene);
2127
/* and now we can draw (result is there) */
2128
re->display_init(re->result);
2129
re->display_clear(re->result);
2131
do_merge_fullsample(re, ntree);
1633
2134
/* returns fully composited render-result on given time step (in RenderData) */
1634
2135
static void do_render_composite_fields_blur_3d(Render *re)
1636
2137
bNodeTree *ntree= re->scene->nodetree;
1638
2139
/* INIT seeding, compositor can use random texture */
1639
BLI_srand(re->r.cfra);
2140
BLI_srandom(re->r.cfra);
1641
2142
if(composite_needs_render(re->scene)) {
1642
2143
/* save memory... free all cached images */
1649
2150
if(re->r.scemode & R_SINGLE_LAYER)
1650
2151
pop_render_result(re);
1652
if(!re->test_break() && ntree) {
1653
ntreeCompositTagRender(ntree);
1654
ntreeCompositTagAnimated(ntree);
1656
if(re->r.scemode & R_DOCOMP) {
1657
/* checks if there are render-result nodes that need scene */
1658
if((re->r.scemode & R_SINGLE_LAYER)==0)
1659
ntree_render_scenes(re);
1661
if(!re->test_break()) {
1662
ntree->stats_draw= render_composit_stats;
1663
ntree->test_break= re->test_break;
1664
/* in case it was never initialized */
1665
R.stats_draw= re->stats_draw;
2153
if(!re->test_break()) {
2156
ntreeCompositTagRender(re->scene);
2157
ntreeCompositTagAnimated(ntree);
2160
if(1 || !(re->r.scemode & R_COMP_RERENDER)) {
2161
if(ntree && re->r.scemode & R_DOCOMP) {
2162
/* checks if there are render-result nodes that need scene */
2163
if((re->r.scemode & R_SINGLE_LAYER)==0)
2164
ntree_render_scenes(re);
1667
ntreeCompositExecTree(ntree, &re->r, G.background==0);
1668
ntree->stats_draw= NULL;
1669
ntree->test_break= NULL;
2166
if(!re->test_break()) {
2167
ntree->stats_draw= render_composit_stats;
2168
ntree->test_break= re->test_break;
2169
/* in case it was never initialized */
2170
R.stats_draw= re->stats_draw;
2172
if(re->r.scemode & R_FULL_SAMPLE)
2173
do_merge_fullsample(re, ntree);
2175
ntreeCompositExecTree(ntree, &re->r, G.background==0);
2177
ntree->stats_draw= NULL;
2178
ntree->test_break= NULL;
2181
else if(re->r.scemode & R_FULL_SAMPLE)
2182
do_merge_fullsample(re, NULL);
2186
/* weak... the display callback wants an active renderlayer pointer... */
2187
re->result->renlay= render_get_active_layer(re, re->result);
1674
2188
re->display_draw(re->result, NULL);
2191
#ifndef DISABLE_YAFRAY
1678
2192
/* yafray: main yafray render/export call */
1679
2193
static void yafrayRender(Render *re)
1681
free_render_result(re->result);
2195
RE_FreeRenderResult(re->result);
1682
2196
re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
1684
2198
// need this too, for aspect/ortho/etc info
1920
2485
int dofree = 0;
1921
2486
/* note; the way it gets 32 bits rects is weak... */
1922
2487
if(rres.rect32==NULL) {
1923
rres.rect32= MEM_mapallocT(sizeof(int)*rres.rectx*rres.recty, "temp 32 bits rect");
2488
rres.rect32= MEM_mapallocN(sizeof(int)*rres.rectx*rres.recty, "temp 32 bits rect");
1926
RE_ResultGet32(re, rres.rect32);
2491
RE_ResultGet32(re, (unsigned int *)rres.rect32);
1927
2492
mh->append_movie(scene->r.cfra, rres.rect32, rres.rectx, rres.recty);
1929
MEM_freeT(rres.rect32);
2494
MEM_freeN(rres.rect32);
1931
2496
printf("Append frame %d", scene->r.cfra);
1933
ImBuf *ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.planes, 0, 0);
1936
BKE_makepicstring(name, (scene->r.cfra));
1938
/* if not exists, BKE_write_ibuf makes one */
1939
ibuf->rect= rres.rect32;
1940
ibuf->rect_float= rres.rectf;
1941
ibuf->zbuf_float= rres.rectz;
1943
/* float factor for random dither, imbuf takes care of it */
1944
ibuf->dither= scene->r.dither_intensity;
1946
ok= BKE_write_ibuf(ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
1949
printf("Render error: cannot save %s\n", name);
1953
else printf("Saved: %s", name);
1955
/* optional preview images for exr */
1956
if(ok && scene->r.imtype==R_OPENEXR && (scene->r.subimtype & R_PREVIEW_JPG)) {
1957
if(BLI_testextensie(name, ".exr"))
1958
name[strlen(name)-4]= 0;
1959
BKE_add_image_extension(name, R_JPEG90);
1961
BKE_write_ibuf(ibuf, name, R_JPEG90, scene->r.subimtype, scene->r.quality);
1962
printf("\nSaved: %s", name);
1965
/* imbuf knows which rects are not part of ibuf */
1966
IMB_freeImBuf(ibuf);
2499
BKE_makepicstring(name, scene->r.pic, scene->r.cfra, scene->r.imtype);
2501
if(re->r.imtype==R_MULTILAYER) {
2503
RE_WriteRenderResult(re->result, name, scene->r.quality);
2504
printf("Saved: %s", name);
2508
ImBuf *ibuf= IMB_allocImBuf(rres.rectx, rres.recty, scene->r.planes, 0, 0);
2511
/* if not exists, BKE_write_ibuf makes one */
2512
ibuf->rect= (unsigned int *)rres.rect32;
2513
ibuf->rect_float= rres.rectf;
2514
ibuf->zbuf_float= rres.rectz;
2516
/* float factor for random dither, imbuf takes care of it */
2517
ibuf->dither= scene->r.dither_intensity;
2519
ok= BKE_write_ibuf(ibuf, name, scene->r.imtype, scene->r.subimtype, scene->r.quality);
2522
printf("Render error: cannot save %s\n", name);
2525
else printf("Saved: %s", name);
2527
/* optional preview images for exr */
2528
if(ok && scene->r.imtype==R_OPENEXR && (scene->r.subimtype & R_PREVIEW_JPG)) {
2529
if(BLI_testextensie(name, ".exr"))
2530
name[strlen(name)-4]= 0;
2531
BKE_add_image_extension(name, R_JPEG90);
2533
BKE_write_ibuf(ibuf, name, R_JPEG90, scene->r.subimtype, scene->r.quality);
2534
printf("\nSaved: %s", name);
2537
/* imbuf knows which rects are not part of ibuf */
2538
IMB_freeImBuf(ibuf);
1969
2542
BLI_timestr(re->i.lastframetime, name);