Blender  V2.93
pipeline.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2006 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include <errno.h>
25 #include <limits.h>
26 #include <math.h>
27 #include <stddef.h>
28 #include <stdlib.h>
29 #include <string.h>
30 
31 #include "DNA_anim_types.h"
32 #include "DNA_collection_types.h"
33 #include "DNA_image_types.h"
34 #include "DNA_node_types.h"
35 #include "DNA_object_types.h"
36 #include "DNA_particle_types.h"
37 #include "DNA_scene_types.h"
38 #include "DNA_sequence_types.h"
39 #include "DNA_space_types.h"
40 #include "DNA_userdef_types.h"
41 
42 #include "MEM_guardedalloc.h"
43 
44 #include "BLI_fileops.h"
45 #include "BLI_listbase.h"
46 #include "BLI_math.h"
47 #include "BLI_path_util.h"
48 #include "BLI_rect.h"
49 #include "BLI_string.h"
50 #include "BLI_threads.h"
51 #include "BLI_timecode.h"
52 
53 #include "BLT_translation.h"
54 
55 #include "BKE_anim_data.h"
56 #include "BKE_animsys.h" /* <------ should this be here?, needed for sequencer update */
57 #include "BKE_callbacks.h"
58 #include "BKE_camera.h"
59 #include "BKE_colortools.h"
60 #include "BKE_context.h" /* XXX needed by wm_window.h */
61 #include "BKE_global.h"
62 #include "BKE_image.h"
63 #include "BKE_layer.h"
64 #include "BKE_lib_id.h"
65 #include "BKE_lib_remap.h"
66 #include "BKE_mask.h"
67 #include "BKE_modifier.h"
68 #include "BKE_node.h"
69 #include "BKE_object.h"
70 #include "BKE_pointcache.h"
71 #include "BKE_report.h"
72 #include "BKE_scene.h"
73 #include "BKE_sound.h"
74 #include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */
75 
76 #include "DEG_depsgraph.h"
77 #include "DEG_depsgraph_build.h"
78 #include "DEG_depsgraph_debug.h"
79 #include "DEG_depsgraph_query.h"
80 
81 #include "IMB_colormanagement.h"
82 #include "IMB_imbuf.h"
83 #include "IMB_imbuf_types.h"
84 #include "IMB_metadata.h"
85 #include "PIL_time.h"
86 
87 #include "RE_engine.h"
88 #include "RE_pipeline.h"
89 #include "RE_texture.h"
90 
91 #include "SEQ_relations.h"
92 #include "SEQ_render.h"
93 
94 #include "../../windowmanager/WM_api.h" /* XXX */
95 #include "../../windowmanager/wm_window.h" /* XXX */
96 #include "GPU_context.h"
97 
98 #ifdef WITH_FREESTYLE
99 # include "FRS_freestyle.h"
100 #endif
101 
102 #include "DEG_depsgraph.h"
103 
104 /* internal */
105 #include "initrender.h"
106 #include "pipeline.h"
107 #include "render_result.h"
108 #include "render_types.h"
109 
110 /* render flow
111  *
112  * 1) Initialize state
113  * - state data, tables
114  * - movie/image file init
115  * - everything that doesn't change during animation
116  *
117  * 2) Initialize data
118  * - camera, world, matrices
119  * - make render verts, faces, halos, strands
120  * - everything can change per frame/field
121  *
122  * 3) Render Processor
123  * - multiple layers
124  * - tiles, rect, baking
125  * - layers/tiles optionally to disk or directly in Render Result
126  *
127  * 4) Composite Render Result
128  * - also read external files etc
129  *
130  * 5) Image Files
131  * - save file or append in movie
132  */
133 
134 /* ********* globals ******** */
135 
136 /* here we store all renders */
137 static struct {
140 
141 /* ********* callbacks ******** */
142 
143 static void render_callback_exec_null(Render *re, Main *bmain, eCbEvent evt)
144 {
145  if (re->r.scemode & R_BUTS_PREVIEW) {
146  return;
147  }
148  BKE_callback_exec_null(bmain, evt);
149 }
150 
151 static void render_callback_exec_id(Render *re, Main *bmain, ID *id, eCbEvent evt)
152 {
153  if (re->r.scemode & R_BUTS_PREVIEW) {
154  return;
155  }
156  BKE_callback_exec_id(bmain, id, evt);
157 }
158 
159 /* ********* alloc and free ******** */
160 
161 static int do_write_image_or_movie(Render *re,
162  Main *bmain,
163  Scene *scene,
164  bMovieHandle *mh,
165  const int totvideos,
166  const char *name_override);
167 
168 /* default callbacks, set in each new render */
169 static void result_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr))
170 {
171 }
172 static void result_rcti_nothing(void *UNUSED(arg),
173  RenderResult *UNUSED(rr),
174  volatile struct rcti *UNUSED(rect))
175 {
176 }
177 static void current_scene_nothing(void *UNUSED(arg), Scene *UNUSED(scene))
178 {
179 }
180 static void stats_nothing(void *UNUSED(arg), RenderStats *UNUSED(rs))
181 {
182 }
183 static void float_nothing(void *UNUSED(arg), float UNUSED(val))
184 {
185 }
186 static int default_break(void *UNUSED(arg))
187 {
188  return G.is_break == true;
189 }
190 
191 static void stats_background(void *UNUSED(arg), RenderStats *rs)
192 {
193  if (rs->infostr == NULL) {
194  return;
195  }
196 
197  uintptr_t mem_in_use, peak_memory;
198  float megs_used_memory, megs_peak_memory;
199  char info_time_str[32];
200 
202  peak_memory = MEM_get_peak_memory();
203 
204  megs_used_memory = (mem_in_use) / (1024.0 * 1024.0);
205  megs_peak_memory = (peak_memory) / (1024.0 * 1024.0);
206 
207  fprintf(stdout,
208  TIP_("Fra:%d Mem:%.2fM (Peak %.2fM) "),
209  rs->cfra,
210  megs_used_memory,
211  megs_peak_memory);
212 
214  info_time_str, sizeof(info_time_str), PIL_check_seconds_timer() - rs->starttime);
215  fprintf(stdout, TIP_("| Time:%s | "), info_time_str);
216 
217  fprintf(stdout, "%s", rs->infostr);
218 
219  /* Flush stdout to be sure python callbacks are printing stuff after blender. */
220  fflush(stdout);
221 
222  /* NOTE: using G_MAIN seems valid here???
223  * Not sure it's actually even used anyway, we could as well pass NULL? */
225 
226  fputc('\n', stdout);
227  fflush(stdout);
228 }
229 
230 static void render_print_save_message(ReportList *reports, const char *name, int ok, int err)
231 {
232  if (ok) {
233  /* no need to report, just some helpful console info */
234  printf("Saved: '%s'\n", name);
235  }
236  else {
237  /* report on error since users will want to know what failed */
238  BKE_reportf(reports, RPT_ERROR, "Render error (%s) cannot save: '%s'", strerror(err), name);
239  }
240 }
241 
243  Scene *scene,
244  struct RenderResult *rr,
245  ImBuf *ibuf,
246  const char *name,
247  const ImageFormatData *imf,
248  bool stamp)
249 {
250  int ok;
251 
252  if (stamp) {
253  /* writes the name of the individual cameras */
254  ok = BKE_imbuf_write_stamp(scene, rr, ibuf, name, imf);
255  }
256  else {
257  ok = BKE_imbuf_write(ibuf, name, imf);
258  }
259 
260  render_print_save_message(reports, name, ok, errno);
261 
262  return ok;
263 }
264 
266 {
267  render_result_free(rr);
268 }
269 
270 float *RE_RenderLayerGetPass(volatile RenderLayer *rl, const char *name, const char *viewname)
271 {
272  RenderPass *rpass = RE_pass_find_by_name(rl, name, viewname);
273  return rpass ? rpass->rect : NULL;
274 }
275 
277 {
278  if (rr == NULL) {
279  return NULL;
280  }
281 
282  return BLI_findstring(&rr->layers, name, offsetof(RenderLayer, name));
283 }
284 
286 {
287  return (re->r.scemode & R_SINGLE_LAYER);
288 }
289 
291  void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
292 {
293  return render_result_new_from_exr(exrhandle, colorspace, predivide, rectx, recty);
294 }
295 
297 {
298  ViewLayer *view_layer = BLI_findlink(&re->view_layers, re->active_view_layer);
299 
300  if (view_layer) {
301  RenderLayer *rl = BLI_findstring(&rr->layers, view_layer->name, offsetof(RenderLayer, name));
302 
303  if (rl) {
304  return rl;
305  }
306  }
307 
308  return rr->layers.first;
309 }
310 
312 {
313  if (single_layer) {
314  return true;
315  }
316 
317  ViewLayer *view_layer;
318  for (view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) {
319  if (view_layer->flag & VIEW_LAYER_RENDER) {
320  return true;
321  }
322  }
323  return false;
324 }
325 
326 /* *************************************************** */
327 
328 Render *RE_GetRender(const char *name)
329 {
330  Render *re;
331 
332  /* search for existing renders */
333  for (re = RenderGlobal.renderlist.first; re; re = re->next) {
334  if (STREQLEN(re->name, name, RE_MAXNAME)) {
335  break;
336  }
337  }
338 
339  return re;
340 }
341 
342 /* if you want to know exactly what has been done */
344 {
345  if (re) {
347  return re->result;
348  }
349 
350  return NULL;
351 }
352 
354 {
355  if (re) {
357  return re->result;
358  }
359 
360  return NULL;
361 }
362 
364 {
365  if (re) {
367  re->result = NULL;
368  }
369 }
370 
372 {
373  /* for keeping render buffers */
374  if (re) {
375  SWAP(RenderResult *, re->result, *rr);
376  }
377 }
378 
380 {
381  if (re) {
383  }
384 }
385 
386 /* displist.c util.... */
388 {
389  if (re) {
390  return re->scene;
391  }
392  return NULL;
393 }
394 
395 void RE_SetScene(Render *re, Scene *sce)
396 {
397  if (re) {
398  re->scene = sce;
399  }
400 }
401 
408 {
409  memset(rr, 0, sizeof(RenderResult));
410 
411  if (re) {
413 
414  if (re->result) {
415  RenderLayer *rl;
416  RenderView *rv, *rview;
417 
418  rr->rectx = re->result->rectx;
419  rr->recty = re->result->recty;
420 
421  /* creates a temporary duplication of views */
423 
424  rv = rr->views.first;
425  rr->have_combined = (rv->rectf != NULL);
426 
427  /* active layer */
428  rl = render_get_active_layer(re, re->result);
429 
430  if (rl) {
431  if (rv->rectf == NULL) {
432  for (rview = (RenderView *)rr->views.first; rview; rview = rview->next) {
434  }
435  }
436 
437  if (rv->rectz == NULL) {
438  for (rview = (RenderView *)rr->views.first; rview; rview = rview->next) {
439  rview->rectz = RE_RenderLayerGetPass(rl, RE_PASSNAME_Z, rview->name);
440  }
441  }
442  }
443 
444  rr->layers = re->result->layers;
445  rr->xof = re->disprect.xmin;
446  rr->yof = re->disprect.ymin;
447  rr->stamp_data = re->result->stamp_data;
448  }
449  }
450 }
451 
452 /* clear temporary renderresult struct */
454 {
455  if (re) {
456  if (rr) {
458  }
460  }
461 }
462 
463 /* fill provided result struct with what's currently active or done */
464 /* this RenderResult struct is the only exception to the rule of a RenderResult */
465 /* always having at least one RenderView */
466 void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id)
467 {
468  memset(rr, 0, sizeof(RenderResult));
469 
470  if (re) {
472 
473  if (re->result) {
474  RenderLayer *rl;
475  RenderView *rv;
476 
477  rr->rectx = re->result->rectx;
478  rr->recty = re->result->recty;
479 
480  /* actview view */
481  rv = RE_RenderViewGetById(re->result, view_id);
482  rr->have_combined = (rv->rectf != NULL);
483 
484  rr->rectf = rv->rectf;
485  rr->rectz = rv->rectz;
486  rr->rect32 = rv->rect32;
487 
488  /* active layer */
489  rl = render_get_active_layer(re, re->result);
490 
491  if (rl) {
492  if (rv->rectf == NULL) {
494  }
495 
496  if (rv->rectz == NULL) {
498  }
499  }
500 
501  rr->layers = re->result->layers;
502  rr->views = re->result->views;
503 
504  rr->xof = re->disprect.xmin;
505  rr->yof = re->disprect.ymin;
506 
507  rr->stamp_data = re->result->stamp_data;
508  }
509  }
510 }
511 
513 {
514  if (re) {
516  }
517 }
518 
519 /* caller is responsible for allocating rect in correct size! */
520 void RE_ResultGet32(Render *re, unsigned int *rect)
521 {
522  RenderResult rres;
523  const int view_id = BKE_scene_multiview_view_id_get(&re->r, re->viewname);
524 
525  RE_AcquireResultImageViews(re, &rres);
527  rect,
528  re->rectx,
529  re->recty,
530  &re->scene->view_settings,
531  &re->scene->display_settings,
532  view_id);
533  RE_ReleaseResultImageViews(re, &rres);
534 }
535 
536 /* caller is responsible for allocating rect in correct size! */
537 /* Only for acquired results, for lock */
540  unsigned int *rect,
541  const int view_id)
542 {
544  rect,
545  re->rectx,
546  re->recty,
547  &re->scene->view_settings,
548  &re->scene->display_settings,
549  view_id);
550 }
551 
553 {
554  return &re->i;
555 }
556 
557 Render *RE_NewRender(const char *name)
558 {
559  Render *re;
560 
561  /* only one render per name exists */
562  re = RE_GetRender(name);
563  if (re == NULL) {
564 
565  /* new render data struct */
566  re = MEM_callocN(sizeof(Render), "new render");
567  BLI_addtail(&RenderGlobal.renderlist, re);
568  BLI_strncpy(re->name, name, RE_MAXNAME);
571  }
572 
573  RE_InitRenderCB(re);
574 
575  return re;
576 }
577 
578 /* MAX_ID_NAME + sizeof(Library->name) + space + null-terminator. */
579 #define MAX_SCENE_RENDER_NAME (MAX_ID_NAME + 1024 + 2)
580 
581 static void scene_render_name_get(const Scene *scene, const size_t max_size, char *render_name)
582 {
583  if (ID_IS_LINKED(scene)) {
584  BLI_snprintf(render_name, max_size, "%s %s", scene->id.lib->id.name, scene->id.name);
585  }
586  else {
587  BLI_snprintf(render_name, max_size, "%s", scene->id.name);
588  }
589 }
590 
592 {
593  char render_name[MAX_SCENE_RENDER_NAME];
594  scene_render_name_get(scene, sizeof(render_name), render_name);
595  return RE_GetRender(render_name);
596 }
597 
599 {
600  char render_name[MAX_SCENE_RENDER_NAME];
601  scene_render_name_get(scene, sizeof(render_name), render_name);
602  return RE_NewRender(render_name);
603 }
604 
605 /* called for new renders and when finishing rendering so
606  * we always have valid callbacks on a render */
608 {
609  /* set default empty callbacks */
614  re->progress = float_nothing;
616  if (G.background) {
618  }
619  else {
621  }
622  /* clear callback handles */
623  re->dih = re->dch = re->duh = re->sdh = re->prh = re->tbh = NULL;
624 }
625 
626 /* only call this while you know it will remove the link too */
628 {
629  if (re->engine) {
630  RE_engine_free(re->engine);
631  }
632 
635 
637  BLI_freelistN(&re->r.views);
638 
640 
641  /* main dbase can already be invalid now, some database-free code checks it */
642  re->main = NULL;
643  re->scene = NULL;
644 
647 
648  BLI_remlink(&RenderGlobal.renderlist, re);
649  MEM_freeN(re);
650 }
651 
652 /* exit blender */
654 {
655  while (RenderGlobal.renderlist.first) {
656  RE_FreeRender(RenderGlobal.renderlist.first);
657  }
658 
659 #ifdef WITH_FREESTYLE
660  /* finalize Freestyle */
661  FRS_exit();
662 #endif
663 }
664 
665 /* on file load, free all re */
667 {
668  Render *re;
669 
670  for (re = RenderGlobal.renderlist.first; re; re = re->next) {
673 
674  re->result = NULL;
675  re->pushedresult = NULL;
676  }
677 }
678 
680 {
681  Render *re;
682  for (re = RenderGlobal.renderlist.first; re != NULL; re = re->next) {
683  if (re->engine != NULL) {
685  RE_engine_free(re->engine);
686  re->engine = NULL;
687  }
688  }
689 }
690 
692 {
693  /* If engine is currently rendering, just wait for it to be freed when it finishes rendering. */
694  if (re->engine && !(re->engine->flag & RE_ENGINE_RENDERING)) {
695  RE_engine_free(re->engine);
696  re->engine = NULL;
697  }
698 }
699 
701 {
702  /* Render engines can be kept around for quick re-render, this clears all or one scene. */
703  if (scene) {
705  if (re) {
707  }
708  }
709  else {
710  for (Render *re = RenderGlobal.renderlist.first; re; re = re->next) {
712  }
713  }
714 }
715 
716 /* ********* initialize state ******** */
717 
718 /* clear full sample and tile flags if needed */
720 {
721  int scemode = rd->scemode;
722 
723  /* not supported by any current renderer */
724  scemode &= ~R_FULL_SAMPLE;
725 
726 #ifdef WITH_OPENEXR
727  if (scemode & R_FULL_SAMPLE) {
728  scemode |= R_EXR_TILE_FILE; /* enable automatic */
729  }
730 #else
731  /* can't do this without openexr support */
732  scemode &= ~(R_EXR_TILE_FILE | R_FULL_SAMPLE);
733 #endif
734 
735  return scemode;
736 }
737 
738 static void re_init_resolution(Render *re, Render *source, int winx, int winy, rcti *disprect)
739 {
740  re->winx = winx;
741  re->winy = winy;
742  if (source && (source->r.mode & R_BORDER)) {
743  /* eeh, doesn't seem original bordered disprect is storing anywhere
744  * after insertion on black happening in do_render_engine(),
745  * so for now simply re-calculate disprect using border from source
746  * renderer (sergey)
747  */
748 
749  re->disprect.xmin = source->r.border.xmin * winx;
750  re->disprect.xmax = source->r.border.xmax * winx;
751 
752  re->disprect.ymin = source->r.border.ymin * winy;
753  re->disprect.ymax = source->r.border.ymax * winy;
754 
755  re->rectx = BLI_rcti_size_x(&re->disprect);
756  re->recty = BLI_rcti_size_y(&re->disprect);
757 
758  /* copy border itself, since it could be used by external engines */
759  re->r.border = source->r.border;
760  }
761  else if (disprect) {
762  re->disprect = *disprect;
763  re->rectx = BLI_rcti_size_x(&re->disprect);
764  re->recty = BLI_rcti_size_y(&re->disprect);
765  }
766  else {
767  re->disprect.xmin = re->disprect.ymin = 0;
768  re->disprect.xmax = winx;
769  re->disprect.ymax = winy;
770  re->rectx = winx;
771  re->recty = winy;
772  }
773 }
774 
776 {
777  BLI_freelistN(&to->views);
779 
780  *to = *from;
781 
782  BLI_duplicatelist(&to->views, &from->views);
783  BKE_curvemapping_copy_data(&to->mblur_shutter_curve, &from->mblur_shutter_curve);
784 }
785 
786 /* what doesn't change during entire render sequence */
787 /* disprect is optional, if NULL it assumes full window render */
789  Render *source,
790  RenderData *rd,
791  ListBase *render_layers,
792  ViewLayer *single_layer,
793  int winx,
794  int winy,
795  rcti *disprect)
796 {
797  bool had_freestyle = (re->r.mode & R_EDGE_FRS) != 0;
798 
799  re->ok = true; /* maybe flag */
800 
802 
803  /* copy render data and render layers for thread safety */
804  render_copy_renderdata(&re->r, rd);
806  BLI_duplicatelist(&re->view_layers, render_layers);
807  re->active_view_layer = 0;
808 
809  if (source) {
810  /* reuse border flags from source renderer */
811  re->r.mode &= ~(R_BORDER | R_CROP);
812  re->r.mode |= source->r.mode & (R_BORDER | R_CROP);
813 
814  /* dimensions shall be shared between all renderers */
815  re->r.xsch = source->r.xsch;
816  re->r.ysch = source->r.ysch;
817  re->r.size = source->r.size;
818  }
819 
820  re_init_resolution(re, source, winx, winy, disprect);
821 
822  /* disable border if it's a full render anyway */
823  if (re->r.border.xmin == 0.0f && re->r.border.xmax == 1.0f && re->r.border.ymin == 0.0f &&
824  re->r.border.ymax == 1.0f) {
825  re->r.mode &= ~R_BORDER;
826  }
827 
828  if (re->rectx < 1 || re->recty < 1 ||
829  (BKE_imtype_is_movie(rd->im_format.imtype) && (re->rectx < 16 || re->recty < 16))) {
830  BKE_report(re->reports, RPT_ERROR, "Image too small");
831  re->ok = 0;
832  return;
833  }
834 
835  re->r.scemode = check_mode_full_sample(&re->r);
836 
837  if (single_layer) {
838  int index = BLI_findindex(render_layers, single_layer);
839  if (index != -1) {
840  re->active_view_layer = index;
841  re->r.scemode |= R_SINGLE_LAYER;
842  }
843  }
844 
845  /* if preview render, we try to keep old result */
847 
848  if (re->r.scemode & R_BUTS_PREVIEW) {
849  if (had_freestyle || (re->r.mode & R_EDGE_FRS)) {
850  /* freestyle manipulates render layers so always have to free */
852  re->result = NULL;
853  }
854  else if (re->result) {
855  ViewLayer *active_render_layer = BLI_findlink(&re->view_layers, re->active_view_layer);
856  RenderLayer *rl;
857  bool have_layer = false;
858 
859  for (rl = re->result->layers.first; rl; rl = rl->next) {
860  if (STREQ(rl->name, active_render_layer->name)) {
861  have_layer = true;
862  }
863  }
864 
865  if (re->result->rectx == re->rectx && re->result->recty == re->recty && have_layer) {
866  /* keep render result, this avoids flickering black tiles
867  * when the preview changes */
868  }
869  else {
870  /* free because resolution changed */
872  re->result = NULL;
873  }
874  }
875  }
876  else {
877 
878  /* make empty render result, so display callbacks can initialize */
880  re->result = MEM_callocN(sizeof(RenderResult), "new render result");
881  re->result->rectx = re->rectx;
882  re->result->recty = re->recty;
884  }
885 
886  /* ensure renderdatabase can use part settings correct */
887  RE_parts_clamp(re);
888 
890 
892 
894 }
895 
896 /* update some variables that can be animated, and otherwise wouldn't be due to
897  * RenderData getting copied once at the start of animation render */
899 {
900  /* filter */
901  re->r.gauss = rd->gauss;
902 
903  /* motion blur */
904  re->r.blurfac = rd->blurfac;
905 
906  /* freestyle */
909 
910  /* render layers */
912  BLI_duplicatelist(&re->view_layers, render_layers);
913 
914  /* render views */
915  BLI_freelistN(&re->r.views);
916  BLI_duplicatelist(&re->r.views, &rd->views);
917 }
918 
919 /* image and movie output has to move to either imbuf or kernel */
920 void RE_display_init_cb(Render *re, void *handle, void (*f)(void *handle, RenderResult *rr))
921 {
922  re->display_init = f;
923  re->dih = handle;
924 }
925 void RE_display_clear_cb(Render *re, void *handle, void (*f)(void *handle, RenderResult *rr))
926 {
927  re->display_clear = f;
928  re->dch = handle;
929 }
931  void *handle,
932  void (*f)(void *handle, RenderResult *rr, volatile rcti *rect))
933 {
934  re->display_update = f;
935  re->duh = handle;
936 }
937 void RE_current_scene_update_cb(Render *re, void *handle, void (*f)(void *handle, Scene *scene))
938 {
939  re->current_scene_update = f;
940  re->suh = handle;
941 }
942 void RE_stats_draw_cb(Render *re, void *handle, void (*f)(void *handle, RenderStats *rs))
943 {
944  re->stats_draw = f;
945  re->sdh = handle;
946 }
947 void RE_progress_cb(Render *re, void *handle, void (*f)(void *handle, float))
948 {
949  re->progress = f;
950  re->prh = handle;
951 }
952 
953 void RE_draw_lock_cb(Render *re, void *handle, void (*f)(void *handle, bool lock))
954 {
955  re->draw_lock = f;
956  re->dlh = handle;
957 }
958 
959 void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle))
960 {
961  re->test_break = f;
962  re->tbh = handle;
963 }
964 
965 /* ********* GL Context ******** */
966 
968 {
969  /* Needs to be created in the main ogl thread. */
971  /* So we activate the window's one afterwards. */
973 }
974 
976 {
977  /* Needs to be called from the thread which used the ogl context for rendering. */
978  if (re->gl_context) {
979  if (re->gpu_context) {
983  re->gpu_context = NULL;
984  }
985 
987  re->gl_context = NULL;
988  }
989 }
990 
992 {
993  return re->gl_context;
994 }
995 
997 {
998  if (re->gpu_context == NULL) {
1000  }
1001  return re->gpu_context;
1002 }
1003 
1004 /* ************ This part uses API, for rendering Blender scenes ********** */
1005 
1006 /* make sure disprect is not affected by the render border */
1008 {
1009  re->disprect.xmin = re->disprect.ymin = 0;
1010  re->disprect.xmax = re->winx;
1011  re->disprect.ymax = re->winy;
1012  re->rectx = re->winx;
1013  re->recty = re->winy;
1014 }
1015 
1017 {
1018  /* when using border render with crop disabled, insert render result into
1019  * full size with black pixels outside */
1020  if (re->result && (re->r.mode & R_BORDER)) {
1021  if ((re->r.mode & R_CROP) == 0) {
1022  RenderResult *rres;
1023 
1024  /* backup */
1025  const rcti orig_disprect = re->disprect;
1026  const int orig_rectx = re->rectx, orig_recty = re->recty;
1027 
1029 
1030  /* sub-rect for merge call later on */
1031  re->result->tilerect = re->disprect;
1032 
1033  /* weak is: it chances disprect from border */
1035 
1038 
1039  render_result_clone_passes(re, rres, NULL);
1040 
1041  render_result_merge(rres, re->result);
1043  re->result = rres;
1044 
1045  /* weak... the display callback wants an active renderlayer pointer... */
1046  re->result->renlay = render_get_active_layer(re, re->result);
1047 
1049 
1050  re->display_init(re->dih, re->result);
1051  re->display_update(re->duh, re->result, NULL);
1052 
1053  /* restore the disprect from border */
1054  re->disprect = orig_disprect;
1055  re->rectx = orig_rectx;
1056  re->recty = orig_recty;
1057  }
1058  else {
1059  /* set offset (again) for use in compositor, disprect was manipulated. */
1060  re->result->xof = 0;
1061  re->result->yof = 0;
1062  }
1063  }
1064 }
1065 
1066 /* Render scene into render result, with a render engine. */
1067 static void do_render_engine(Render *re)
1068 {
1069  Object *camera = RE_GetCamera(re);
1070  /* also check for camera here */
1071  if (camera == NULL) {
1072  BKE_report(re->reports, RPT_ERROR, "Cannot render, no camera");
1073  G.is_break = true;
1074  return;
1075  }
1076 
1077  /* now use renderdata and camera to set viewplane */
1078  RE_SetCamera(re, camera);
1079 
1080  re->current_scene_update(re->suh, re->scene);
1081  RE_engine_render(re, false);
1082 
1083  /* when border render, check if we have to insert it in black */
1085 }
1086 
1087 /* Render scene into render result, within a compositor node tree.
1088  * Uses the same image dimensions, does not recursively perform compositing. */
1089 static void do_render_compositor_scene(Render *re, Scene *sce, int cfra)
1090 {
1091  Render *resc = RE_NewSceneRender(sce);
1092  int winx = re->winx, winy = re->winy;
1093 
1094  sce->r.cfra = cfra;
1095 
1097 
1098  /* exception: scene uses own size (unfinished code) */
1099  if (0) {
1100  winx = (sce->r.size * sce->r.xsch) / 100;
1101  winy = (sce->r.size * sce->r.ysch) / 100;
1102  }
1103 
1104  /* initial setup */
1105  RE_InitState(resc, re, &sce->r, &sce->view_layers, NULL, winx, winy, &re->disprect);
1106 
1107  /* We still want to use 'rendercache' setting from org (main) scene... */
1108  resc->r.scemode = (resc->r.scemode & ~R_EXR_CACHE_FILE) | (re->r.scemode & R_EXR_CACHE_FILE);
1109 
1110  /* still unsure entity this... */
1111  resc->main = re->main;
1112  resc->scene = sce;
1113 
1114  /* copy callbacks */
1115  resc->display_update = re->display_update;
1116  resc->duh = re->duh;
1117  resc->test_break = re->test_break;
1118  resc->tbh = re->tbh;
1119  resc->stats_draw = re->stats_draw;
1120  resc->sdh = re->sdh;
1122  resc->suh = re->suh;
1123 
1124  do_render_engine(resc);
1125 }
1126 
1127 /* helper call to detect if this scene needs a render,
1128  * or if there's a any render layer to render. */
1129 static int compositor_needs_render(Scene *sce, int this_scene)
1130 {
1131  bNodeTree *ntree = sce->nodetree;
1132  bNode *node;
1133 
1134  if (ntree == NULL) {
1135  return 1;
1136  }
1137  if (sce->use_nodes == false) {
1138  return 1;
1139  }
1140  if ((sce->r.scemode & R_DOCOMP) == 0) {
1141  return 1;
1142  }
1143 
1144  for (node = ntree->nodes.first; node; node = node->next) {
1145  if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) {
1146  if (this_scene == 0 || node->id == NULL || node->id == &sce->id) {
1147  return 1;
1148  }
1149  }
1150  }
1151  return 0;
1152 }
1153 
1154 /* Render all scenes within a compositor node tree. */
1156 {
1157  bNode *node;
1158  int cfra = re->scene->r.cfra;
1159  Scene *restore_scene = re->scene;
1160 
1161  if (re->scene->nodetree == NULL) {
1162  return;
1163  }
1164 
1165  /* now foreach render-result node we do a full render */
1166  /* results are stored in a way compositor will find it */
1167  GSet *scenes_rendered = BLI_gset_ptr_new(__func__);
1168  for (node = re->scene->nodetree->nodes.first; node; node = node->next) {
1169  if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) {
1170  if (node->id && node->id != (ID *)re->scene) {
1171  Scene *scene = (Scene *)node->id;
1172  if (!BLI_gset_haskey(scenes_rendered, scene) &&
1174  do_render_compositor_scene(re, scene, cfra);
1175  BLI_gset_add(scenes_rendered, scene);
1176  nodeUpdate(restore_scene->nodetree, node);
1177  }
1178  }
1179  }
1180  }
1181  BLI_gset_free(scenes_rendered, NULL);
1182 }
1183 
1184 /* bad call... need to think over proper method still */
1185 static void render_compositor_stats(void *arg, const char *str)
1186 {
1187  Render *re = (Render *)arg;
1188 
1189  RenderStats i;
1190  memcpy(&i, &re->i, sizeof(i));
1191  i.infostr = str;
1192  re->stats_draw(re->sdh, &i);
1193 }
1194 
1195 /* Render compositor nodes, along with any scenes required for them.
1196  * The result will be output into a compositing render layer in the render result. */
1198 {
1200  int update_newframe = 0;
1201 
1203  /* save memory... free all cached images */
1205 
1206  /* render the frames
1207  * it could be optimized to render only the needed view
1208  * but what if a scene has a different number of views
1209  * than the main scene? */
1210  do_render_engine(re);
1211  }
1212  else {
1213  re->i.cfra = re->r.cfra;
1214 
1215  /* ensure new result gets added, like for regular renders */
1217 
1219  if ((re->r.mode & R_CROP) == 0) {
1221  }
1223 
1225 
1226  /* scene render process already updates animsys */
1227  update_newframe = 1;
1228  }
1229 
1230  /* swap render result */
1231  if (re->r.scemode & R_SINGLE_LAYER) {
1235  }
1236 
1237  if (!re->test_break(re->tbh)) {
1238 
1239  if (ntree) {
1241  }
1242 
1243  if (ntree && re->scene->use_nodes && re->r.scemode & R_DOCOMP) {
1244  /* checks if there are render-result nodes that need scene */
1245  if ((re->r.scemode & R_SINGLE_LAYER) == 0) {
1247  }
1248 
1249  if (!re->test_break(re->tbh)) {
1251  ntree->test_break = re->test_break;
1252  ntree->progress = re->progress;
1253  ntree->sdh = re;
1254  ntree->tbh = re->tbh;
1255  ntree->prh = re->prh;
1256 
1257  if (update_newframe) {
1258  /* If we have consistent depsgraph now would be a time to update them. */
1259  }
1260 
1261  RenderView *rv;
1262  for (rv = re->result->views.first; rv; rv = rv->next) {
1264  ntree,
1265  &re->r,
1266  true,
1267  G.background == 0,
1268  &re->scene->view_settings,
1269  &re->scene->display_settings,
1270  rv->name);
1271  }
1272 
1273  ntree->stats_draw = NULL;
1274  ntree->test_break = NULL;
1275  ntree->progress = NULL;
1276  ntree->tbh = ntree->sdh = ntree->prh = NULL;
1277  }
1278  }
1279  }
1280 
1281  /* weak... the display callback wants an active renderlayer pointer... */
1282  if (re->result != NULL) {
1283  re->result->renlay = render_get_active_layer(re, re->result);
1284  re->display_update(re->duh, re->result, NULL);
1285  }
1286 }
1287 
1289 {
1290  RenderResult rres;
1291  RenderView *rv;
1292  int nr;
1293 
1294  /* this is the basic trick to get the displayed float or char rect from render result */
1295  nr = 0;
1296  for (rv = re->result->views.first; rv; rv = rv->next, nr++) {
1297  RE_SetActiveRenderView(re, rv->name);
1298  RE_AcquireResultImage(re, &rres, nr);
1299 
1300  Object *ob_camera_eval = DEG_get_evaluated_object(re->pipeline_depsgraph, RE_GetCamera(re));
1302  ob_camera_eval,
1303  (re->r.stamp & R_STAMP_STRIPMETA) ? rres.stamp_data : NULL,
1304  (unsigned char *)rres.rect32,
1305  rres.rectf,
1306  rres.rectx,
1307  rres.recty,
1308  4);
1310  }
1311 }
1312 
1314 {
1315  Editing *ed;
1316  Sequence *seq;
1317 
1318  ed = scene->ed;
1319 
1320  if (!(rd->scemode & R_DOSEQ) || !ed || !ed->seqbase.first) {
1321  return 0;
1322  }
1323 
1324  for (seq = ed->seqbase.first; seq; seq = seq->next) {
1325  if (seq->type != SEQ_TYPE_SOUND_RAM) {
1326  return 1;
1327  }
1328  }
1329 
1330  return 0;
1331 }
1332 
1333 /* Render sequencer strips into render result. */
1334 static void do_render_sequencer(Render *re)
1335 {
1336  static int recurs_depth = 0;
1337  struct ImBuf *out;
1338  RenderResult *rr; /* don't assign re->result here as it might change during give_ibuf_seq */
1339  int cfra = re->r.cfra;
1341  int view_id, tot_views;
1342  struct ImBuf **ibuf_arr;
1343  int re_x, re_y;
1344 
1345  re->i.cfra = cfra;
1346 
1347  recurs_depth++;
1348 
1349  if ((re->r.mode & R_BORDER) && (re->r.mode & R_CROP) == 0) {
1350  /* if border rendering is used and cropping is disabled, final buffer should
1351  * be as large as the whole frame */
1352  re_x = re->winx;
1353  re_y = re->winy;
1354  }
1355  else {
1356  re_x = re->result->rectx;
1357  re_y = re->result->recty;
1358  }
1359 
1360  tot_views = BKE_scene_multiview_num_views_get(&re->r);
1361  ibuf_arr = MEM_mallocN(sizeof(ImBuf *) * tot_views, "Sequencer Views ImBufs");
1362 
1364  re->pipeline_depsgraph,
1365  re->scene,
1366  re_x,
1367  re_y,
1369  true,
1370  &context);
1371 
1372  /* the renderresult gets destroyed during the rendering, so we first collect all ibufs
1373  * and then we populate the final renderesult */
1374 
1375  for (view_id = 0; view_id < tot_views; view_id++) {
1376  context.view_id = view_id;
1377  out = SEQ_render_give_ibuf(&context, cfra, 0);
1378 
1379  if (out) {
1380  ibuf_arr[view_id] = IMB_dupImBuf(out);
1381  IMB_metadata_copy(ibuf_arr[view_id], out);
1382  IMB_freeImBuf(out);
1384  }
1385  else {
1386  ibuf_arr[view_id] = NULL;
1387  }
1388  }
1389 
1390  rr = re->result;
1391 
1393  render_result_views_new(rr, &re->r);
1395 
1396  for (view_id = 0; view_id < tot_views; view_id++) {
1397  RenderView *rv = RE_RenderViewGetById(rr, view_id);
1399 
1400  if (ibuf_arr[view_id]) {
1401  /* copy ibuf into combined pixel rect */
1402  RE_render_result_rect_from_ibuf(rr, &re->r, ibuf_arr[view_id], view_id);
1403 
1404  if (ibuf_arr[view_id]->metadata && (re->r.stamp & R_STAMP_STRIPMETA)) {
1405  /* ensure render stamp info first */
1407  BKE_stamp_info_from_imbuf(rr, ibuf_arr[view_id]);
1408  }
1409 
1410  if (recurs_depth == 0) { /* With nested scenes, only free on top-level. */
1411  Editing *ed = re->pipeline_scene_eval->ed;
1412  if (ed) {
1414  }
1415  }
1416  IMB_freeImBuf(ibuf_arr[view_id]);
1417  }
1418  else {
1419  /* render result is delivered empty in most cases, nevertheless we handle all cases */
1420  render_result_rect_fill_zero(rr, view_id);
1421  }
1422 
1424 
1425  /* would mark display buffers as invalid */
1426  RE_SetActiveRenderView(re, rv->name);
1427  re->display_update(re->duh, re->result, NULL);
1428  }
1429 
1430  MEM_freeN(ibuf_arr);
1431 
1432  recurs_depth--;
1433 
1434  /* just in case this flag went missing at some point */
1435  re->r.scemode |= R_DOSEQ;
1436 
1437  /* set overall progress of sequence rendering */
1438  if (re->r.efra != re->r.sfra) {
1439  re->progress(re->prh, (float)(cfra - re->r.sfra) / (re->r.efra - re->r.sfra));
1440  }
1441  else {
1442  re->progress(re->prh, 1.0f);
1443  }
1444 }
1445 
1446 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
1447 
1448 /* Render full pipeline, using render engine, sequencer and compositing nodes. */
1450 {
1451  bool render_seq = false;
1452 
1453  re->current_scene_update(re->suh, re->scene);
1454 
1456 
1458 
1459  /* ensure no images are in memory from previous animated sequences */
1462 
1463  if (RE_engine_render(re, true)) {
1464  /* in this case external render overrides all */
1465  }
1466  else if (RE_seq_render_active(re->scene, &re->r)) {
1467  /* note: do_render_sequencer() frees rect32 when sequencer returns float images */
1468  if (!re->test_break(re->tbh)) {
1469  do_render_sequencer(re);
1470  render_seq = true;
1471  }
1472 
1473  re->stats_draw(re->sdh, &re->i);
1474  re->display_update(re->duh, re->result, NULL);
1475  }
1476  else {
1478  }
1479 
1481 
1482  re->stats_draw(re->sdh, &re->i);
1483 
1484  /* save render result stamp if needed */
1485  if (re->result != NULL) {
1486  /* sequence rendering should have taken care of that already */
1487  if (!(render_seq && (re->r.stamp & R_STAMP_STRIPMETA))) {
1488  Object *ob_camera_eval = DEG_get_evaluated_object(re->pipeline_depsgraph, RE_GetCamera(re));
1489  BKE_render_result_stamp_info(re->scene, ob_camera_eval, re->result, false);
1490  }
1491 
1492  /* stamp image info here */
1493  if ((re->r.stamp & R_STAMP_ALL) && (re->r.stamp & R_STAMP_DRAW)) {
1495  re->display_update(re->duh, re->result, NULL);
1496  }
1497  }
1498 }
1499 
1501  Object *camera_override,
1502  ReportList *reports)
1503 {
1504  if (scene->r.scemode & R_DOCOMP && scene->use_nodes) {
1506 
1507  while (node) {
1508  if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) {
1509  Scene *sce = node->id ? (Scene *)node->id : scene;
1510  if (sce->camera == NULL) {
1512  }
1513  if (sce->camera == NULL) {
1514  /* all render layers nodes need camera */
1515  BKE_reportf(reports,
1516  RPT_ERROR,
1517  "No camera found in scene \"%s\" (used in compositing of scene \"%s\")",
1518  sce->id.name + 2,
1519  scene->id.name + 2);
1520  return false;
1521  }
1522  }
1523  node = node->next;
1524  }
1525 
1526  return true;
1527  }
1528 
1529  const bool ok = (camera_override != NULL || scene->camera != NULL);
1530  if (!ok) {
1531  BKE_reportf(reports, RPT_ERROR, "No camera found in scene \"%s\"", scene->id.name + 2);
1532  }
1533 
1534  return ok;
1535 }
1536 
1538 {
1539  SceneRenderView *srv;
1540  bool active_view = false;
1541 
1542  if (camera == NULL || (scene->r.scemode & R_MULTIVIEW) == 0) {
1543  return true;
1544  }
1545 
1546  for (srv = scene->r.views.first; srv; srv = srv->next) {
1548  active_view = true;
1549 
1551  Object *view_camera;
1552  view_camera = BKE_camera_multiview_render(scene, camera, srv->name);
1553 
1554  if (view_camera == camera) {
1555  /* if the suffix is not in the camera, means we are using the fallback camera */
1556  if (!BLI_str_endswith(view_camera->id.name + 2, srv->suffix)) {
1557  BKE_reportf(reports,
1558  RPT_ERROR,
1559  "Camera \"%s\" is not a multi-view camera",
1560  camera->id.name + 2);
1561  return false;
1562  }
1563  }
1564  }
1565  }
1566  }
1567 
1568  if (!active_view) {
1569  BKE_reportf(reports, RPT_ERROR, "No active view found in scene \"%s\"", scene->id.name + 2);
1570  return false;
1571  }
1572 
1573  return true;
1574 }
1575 
1576 static int check_valid_camera(Scene *scene, Object *camera_override, ReportList *reports)
1577 {
1578  if (camera_override == NULL && scene->camera == NULL) {
1580  }
1581 
1582  if (!check_valid_camera_multiview(scene, scene->camera, reports)) {
1583  return false;
1584  }
1585 
1586  if (RE_seq_render_active(scene, &scene->r)) {
1587  if (scene->ed) {
1588  Sequence *seq = scene->ed->seqbase.first;
1589 
1590  while (seq) {
1591  if ((seq->type == SEQ_TYPE_SCENE) && ((seq->flag & SEQ_SCENE_STRIPS) == 0) &&
1592  (seq->scene != NULL)) {
1593  if (!seq->scene_camera) {
1594  if (!seq->scene->camera &&
1596  /* camera could be unneeded due to composite nodes */
1597  Object *override = (seq->scene == scene) ? camera_override : NULL;
1598 
1599  if (!check_valid_compositing_camera(seq->scene, override, reports)) {
1600  return false;
1601  }
1602  }
1603  }
1604  else if (!check_valid_camera_multiview(seq->scene, seq->scene_camera, reports)) {
1605  return false;
1606  }
1607  }
1608 
1609  seq = seq->next;
1610  }
1611  }
1612  }
1613  else if (!check_valid_compositing_camera(scene, camera_override, reports)) {
1614  return false;
1615  }
1616 
1617  return true;
1618 }
1619 
1621 {
1622  bNode *node;
1623 
1624  for (node = ntree->nodes.first; node; node = node->next) {
1626  return true;
1627  }
1628  if (ELEM(node->type, NODE_GROUP, NODE_CUSTOM_GROUP)) {
1629  if (node->id) {
1631  return true;
1632  }
1633  }
1634  }
1635  }
1636 
1637  return false;
1638 }
1639 
1641 {
1643 }
1644 
1646  ViewLayer *single_layer,
1647  Object *camera_override,
1648  ReportList *reports)
1649 {
1650  int scemode = check_mode_full_sample(&scene->r);
1651 
1652  if (scene->r.mode & R_BORDER) {
1653  if (scene->r.border.xmax <= scene->r.border.xmin ||
1654  scene->r.border.ymax <= scene->r.border.ymin) {
1655  BKE_report(reports, RPT_ERROR, "No border area selected");
1656  return 0;
1657  }
1658  }
1659 
1660  if (scemode & (R_EXR_TILE_FILE | R_FULL_SAMPLE)) {
1661  char str[FILE_MAX];
1662 
1664 
1665  if (!BLI_file_is_writable(str)) {
1666  BKE_report(reports, RPT_ERROR, "Cannot save render buffers, check the temp default path");
1667  return 0;
1668  }
1669  }
1670 
1671  if (RE_seq_render_active(scene, &scene->r)) {
1672  /* Sequencer */
1673  if (scene->r.mode & R_BORDER) {
1674  BKE_report(reports, RPT_ERROR, "Border rendering is not supported by sequencer");
1675  return false;
1676  }
1677  }
1678  else if ((scemode & R_DOCOMP) && scene->use_nodes) {
1679  /* Compositor */
1680  if (!scene->nodetree) {
1681  BKE_report(reports, RPT_ERROR, "No node tree in scene");
1682  return 0;
1683  }
1684 
1686  BKE_report(reports, RPT_ERROR, "No render output node in scene");
1687  return 0;
1688  }
1689 
1690  if (scemode & R_FULL_SAMPLE) {
1691  if (compositor_needs_render(scene, 0) == 0) {
1692  BKE_report(reports, RPT_ERROR, "Full sample AA not supported without 3D rendering");
1693  return 0;
1694  }
1695  }
1696  }
1697  else {
1698  /* Regular Render */
1699  if (!render_scene_has_layers_to_render(scene, single_layer)) {
1700  BKE_report(reports, RPT_ERROR, "All render layers are disabled");
1701  return 0;
1702  }
1703  }
1704 
1705  /* check valid camera, without camera render is OK (compo, seq) */
1706  if (!check_valid_camera(scene, camera_override, reports)) {
1707  return 0;
1708  }
1709 
1710  return 1;
1711 }
1712 
1714 {
1715  if (RE_engine_is_external(re)) {
1716  /* not supported yet */
1717  re->r.scemode &= ~R_FULL_SAMPLE;
1718  }
1719 }
1720 
1722  Scene *scene,
1723  ViewLayer *view_layer,
1724  int UNUSED(anim_init))
1725 {
1726  PTCacheBaker baker;
1727 
1728  memset(&baker, 0, sizeof(baker));
1729  baker.bmain = re->main;
1730  baker.scene = scene;
1731  baker.view_layer = view_layer;
1732  baker.depsgraph = BKE_scene_ensure_depsgraph(re->main, scene, view_layer);
1733  baker.bake = 0;
1734  baker.render = 1;
1735  baker.anim_init = 1;
1736  baker.quick_step = 1;
1737 
1738  BKE_ptcache_bake(&baker);
1739 }
1740 
1741 void RE_SetActiveRenderView(Render *re, const char *viewname)
1742 {
1743  BLI_strncpy(re->viewname, viewname, sizeof(re->viewname));
1744 }
1745 
1747 {
1748  return re->viewname;
1749 }
1750 
1751 /* evaluating scene options for general Blender render */
1753  const RenderData *rd,
1754  Main *bmain,
1755  Scene *scene,
1756  ViewLayer *single_layer,
1757  Object *camera_override,
1758  int anim,
1759  int anim_init)
1760 {
1761  int winx, winy;
1762  rcti disprect;
1763 
1764  /* r.xsch and r.ysch has the actual view window size
1765  * r.border is the clipping rect */
1766 
1767  /* calculate actual render result and display size */
1768  winx = (rd->size * rd->xsch) / 100;
1769  winy = (rd->size * rd->ysch) / 100;
1770 
1771  /* We always render smaller part, inserting it in larger image is compositor business,
1772  * it uses 'disprect' for it. */
1773  if (scene->r.mode & R_BORDER) {
1774  disprect.xmin = rd->border.xmin * winx;
1775  disprect.xmax = rd->border.xmax * winx;
1776 
1777  disprect.ymin = rd->border.ymin * winy;
1778  disprect.ymax = rd->border.ymax * winy;
1779  }
1780  else {
1781  disprect.xmin = disprect.ymin = 0;
1782  disprect.xmax = winx;
1783  disprect.ymax = winy;
1784  }
1785 
1786  re->main = bmain;
1787  re->scene = scene;
1788  re->camera_override = camera_override;
1789  re->viewname[0] = '\0';
1790 
1791  /* not too nice, but it survives anim-border render */
1792  if (anim) {
1794  re->disprect = disprect;
1795  return 1;
1796  }
1797 
1798  /*
1799  * Disabled completely for now,
1800  * can be later set as render profile option
1801  * and default for background render.
1802  */
1803  if (0) {
1804  /* make sure dynamics are up to date */
1806  update_physics_cache(re, scene, view_layer, anim_init);
1807  }
1808 
1809  if (single_layer || scene->r.scemode & R_SINGLE_LAYER) {
1813  }
1814 
1815  RE_InitState(re, NULL, &scene->r, &scene->view_layers, single_layer, winx, winy, &disprect);
1816  if (!re->ok) { /* if an error was printed, abort */
1817  return 0;
1818  }
1819 
1820  /* initstate makes new result, have to send changed tags around */
1822 
1824 
1825  re->display_init(re->dih, re->result);
1826  re->display_clear(re->dch, re->result);
1827 
1828  return 1;
1829 }
1830 
1831 void RE_SetReports(Render *re, ReportList *reports)
1832 {
1833  re->reports = reports;
1834 }
1835 
1837 {
1838  Scene *scene = re->scene;
1841 }
1842 
1844 {
1845  Scene *scene = re->scene;
1846  ViewLayer *view_layer = BKE_view_layer_default_render(re->scene);
1847 
1848  re->pipeline_depsgraph = DEG_graph_new(re->main, scene, view_layer, DAG_EVAL_RENDER);
1849  DEG_debug_name_set(re->pipeline_depsgraph, "RENDER PIPELINE");
1850 
1851  /* Make sure there is a correct evaluated scene pointer. */
1853 
1854  /* Update immediately so we have proper evaluated scene. */
1856 
1858 }
1859 
1860 /* Free data only needed during rendering operation. */
1862 {
1863  if (re->engine && !RE_engine_use_persistent_data(re->engine)) {
1864  RE_engine_free(re->engine);
1865  re->engine = NULL;
1866  }
1867  if (re->pipeline_depsgraph != NULL) {
1869  re->pipeline_depsgraph = NULL;
1870  re->pipeline_scene_eval = NULL;
1871  }
1872  /* Destroy the opengl context in the correct thread. */
1874 }
1875 
1876 /* general Blender frame render call */
1878  Main *bmain,
1879  Scene *scene,
1880  ViewLayer *single_layer,
1881  Object *camera_override,
1882  int frame,
1883  const bool write_still)
1884 {
1886 
1887  /* Ugly global still...
1888  * is to prevent preview events and signal subsurfs etc to make full resol. */
1889  G.is_rendering = true;
1890 
1891  scene->r.cfra = frame;
1892 
1893  if (render_init_from_main(re, &scene->r, bmain, scene, single_layer, camera_override, 0, 0)) {
1894  const RenderData rd = scene->r;
1896 
1898 
1900 
1902 
1903  if (write_still && !G.is_break) {
1905  /* operator checks this but in case its called from elsewhere */
1906  printf("Error: can't write single images with a movie format!\n");
1907  }
1908  else {
1909  char name[FILE_MAX];
1911  rd.pic,
1912  BKE_main_blendfile_path(bmain),
1913  scene->r.cfra,
1914  &rd.im_format,
1915  (rd.scemode & R_EXTENSION) != 0,
1916  false,
1917  NULL);
1918 
1919  /* reports only used for Movie */
1920  do_write_image_or_movie(re, bmain, scene, NULL, 0, name);
1921  }
1922  }
1923 
1924  /* keep after file save */
1926  if (write_still) {
1928  }
1929  }
1930 
1932  re->main,
1933  &scene->id,
1935 
1937 
1938  /* UGLY WARNING */
1939  G.is_rendering = false;
1940 }
1941 
1942 #ifdef WITH_FREESTYLE
1943 
1944 /* Not freestyle specific, currently only used by free-style. */
1945 static void change_renderdata_engine(Render *re, const char *new_engine)
1946 {
1947  if (!STREQ(re->r.engine, new_engine)) {
1948  if (re->engine) {
1949  RE_engine_free(re->engine);
1950  re->engine = NULL;
1951  }
1952  BLI_strncpy(re->r.engine, new_engine, sizeof(re->r.engine));
1953  }
1954 }
1955 
1956 static bool use_eevee_for_freestyle_render(Render *re)
1957 {
1959  return !(type->flag & RE_USE_CUSTOM_FREESTYLE);
1960 }
1961 
1962 void RE_RenderFreestyleStrokes(Render *re, Main *bmain, Scene *scene, int render)
1963 {
1964  re->result_ok = 0;
1965  if (render_init_from_main(re, &scene->r, bmain, scene, NULL, NULL, 0, 0)) {
1966  if (render) {
1967  char scene_engine[32];
1968  BLI_strncpy(scene_engine, re->r.engine, sizeof(scene_engine));
1969  if (use_eevee_for_freestyle_render(re)) {
1970  change_renderdata_engine(re, RE_engine_id_BLENDER_EEVEE);
1971  }
1972 
1973  RE_engine_render(re, false);
1974 
1975  change_renderdata_engine(re, scene_engine);
1976  }
1977  }
1978  re->result_ok = 1;
1979 }
1980 
1981 void RE_RenderFreestyleExternal(Render *re)
1982 {
1983  if (re->test_break(re->tbh)) {
1984  return;
1985  }
1986 
1988 
1989  LISTBASE_FOREACH (RenderView *, rv, &re->result->views) {
1990  RE_SetActiveRenderView(re, rv->name);
1991 
1992  ViewLayer *active_view_layer = BLI_findlink(&re->view_layers, re->active_view_layer);
1994 
1995  LISTBASE_FOREACH (ViewLayer *, view_layer, &re->view_layers) {
1996  if ((re->r.scemode & R_SINGLE_LAYER) && view_layer != active_view_layer) {
1997  continue;
1998  }
1999 
2000  if (FRS_is_freestyle_enabled(view_layer)) {
2001  FRS_do_stroke_rendering(re, view_layer);
2002  }
2003  }
2004 
2006  }
2007 }
2008 #endif
2009 
2011  ReportList *reports, RenderResult *rr, Scene *scene, const bool stamp, char *name)
2012 {
2013  bool ok = true;
2014  RenderData *rd = &scene->r;
2015 
2016  if (!rr) {
2017  return false;
2018  }
2019 
2020  bool is_mono = BLI_listbase_count_at_most(&rr->views, 2) < 2;
2022  RE_HasFloatPixels(rr);
2023 
2024  if (rd->im_format.views_format == R_IMF_VIEWS_MULTIVIEW && is_exr_rr) {
2025  ok = RE_WriteRenderResult(reports, rr, name, &rd->im_format, NULL, -1);
2026  render_print_save_message(reports, name, ok, errno);
2027  }
2028 
2029  /* mono, legacy code */
2030  else if (is_mono || (rd->im_format.views_format == R_IMF_VIEWS_INDIVIDUAL)) {
2031  RenderView *rv;
2032  int view_id;
2033  char filepath[FILE_MAX];
2034 
2035  BLI_strncpy(filepath, name, sizeof(filepath));
2036 
2037  for (view_id = 0, rv = rr->views.first; rv; rv = rv->next, view_id++) {
2038  if (!is_mono) {
2040  }
2041 
2042  if (is_exr_rr) {
2043  ok = RE_WriteRenderResult(reports, rr, name, &rd->im_format, rv->name, -1);
2044  render_print_save_message(reports, name, ok, errno);
2045 
2046  /* optional preview images for exr */
2047  if (ok && (rd->im_format.flag & R_IMF_FLAG_PREVIEW_JPG)) {
2048  ImageFormatData imf = rd->im_format;
2050 
2051  if (BLI_path_extension_check(name, ".exr")) {
2052  name[strlen(name) - 4] = 0;
2053  }
2055 
2056  ImBuf *ibuf = render_result_rect_to_ibuf(rr, rd, view_id);
2057  ibuf->planes = 24;
2059  ibuf, true, false, &scene->view_settings, &scene->display_settings, &imf);
2060 
2061  ok = render_imbuf_write_stamp_test(reports, scene, rr, ibuf, name, &imf, stamp);
2062 
2063  IMB_freeImBuf(ibuf);
2064  }
2065  }
2066  else {
2067  ImBuf *ibuf = render_result_rect_to_ibuf(rr, rd, view_id);
2068 
2070  ibuf, true, false, &scene->view_settings, &scene->display_settings, &rd->im_format);
2071 
2072  ok = render_imbuf_write_stamp_test(reports, scene, rr, ibuf, name, &rd->im_format, stamp);
2073 
2074  /* imbuf knows which rects are not part of ibuf */
2075  IMB_freeImBuf(ibuf);
2076  }
2077  }
2078  }
2079  else { /* R_IMF_VIEWS_STEREO_3D */
2081 
2083  printf("Stereo 3D not supported for MultiLayer image: %s\n", name);
2084  }
2085  else {
2086  ImBuf *ibuf_arr[3] = {NULL};
2087  const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
2088  int i;
2089 
2090  for (i = 0; i < 2; i++) {
2091  int view_id = BLI_findstringindex(&rr->views, names[i], offsetof(RenderView, name));
2092  ibuf_arr[i] = render_result_rect_to_ibuf(rr, rd, view_id);
2094  true,
2095  false,
2096  &scene->view_settings,
2098  &scene->r.im_format);
2099  IMB_prepare_write_ImBuf(IMB_isfloat(ibuf_arr[i]), ibuf_arr[i]);
2100  }
2101 
2102  ibuf_arr[2] = IMB_stereo3d_ImBuf(&scene->r.im_format, ibuf_arr[0], ibuf_arr[1]);
2103 
2105  reports, scene, rr, ibuf_arr[2], name, &rd->im_format, stamp);
2106 
2107  /* optional preview images for exr */
2108  if (ok && is_exr_rr && (rd->im_format.flag & R_IMF_FLAG_PREVIEW_JPG)) {
2109  ImageFormatData imf = rd->im_format;
2111 
2112  if (BLI_path_extension_check(name, ".exr")) {
2113  name[strlen(name) - 4] = 0;
2114  }
2115 
2117  ibuf_arr[2]->planes = 24;
2118 
2120  reports, scene, rr, ibuf_arr[2], name, &rd->im_format, stamp);
2121  }
2122 
2123  /* imbuf knows which rects are not part of ibuf */
2124  for (i = 0; i < 3; i++) {
2125  IMB_freeImBuf(ibuf_arr[i]);
2126  }
2127  }
2128  }
2129 
2130  return ok;
2131 }
2132 
2134  RenderResult *rr,
2135  Scene *scene,
2136  RenderData *rd,
2137  bMovieHandle *mh,
2138  void **movie_ctx_arr,
2139  const int totvideos,
2140  bool preview)
2141 {
2142  bool is_mono;
2143  bool ok = true;
2144 
2145  if (!rr) {
2146  return false;
2147  }
2148 
2149  is_mono = BLI_listbase_count_at_most(&rr->views, 2) < 2;
2150 
2151  if (is_mono || (scene->r.im_format.views_format == R_IMF_VIEWS_INDIVIDUAL)) {
2152  int view_id;
2153  for (view_id = 0; view_id < totvideos; view_id++) {
2154  const char *suffix = BKE_scene_multiview_view_id_suffix_get(&scene->r, view_id);
2155  ImBuf *ibuf = render_result_rect_to_ibuf(rr, &scene->r, view_id);
2156 
2158  ibuf, true, false, &scene->view_settings, &scene->display_settings, &scene->r.im_format);
2159 
2160  ok &= mh->append_movie(movie_ctx_arr[view_id],
2161  rd,
2162  preview ? scene->r.psfra : scene->r.sfra,
2163  scene->r.cfra,
2164  (int *)ibuf->rect,
2165  ibuf->x,
2166  ibuf->y,
2167  suffix,
2168  reports);
2169 
2170  /* imbuf knows which rects are not part of ibuf */
2171  IMB_freeImBuf(ibuf);
2172  }
2173  printf("Append frame %d\n", scene->r.cfra);
2174  }
2175  else { /* R_IMF_VIEWS_STEREO_3D */
2176  const char *names[2] = {STEREO_LEFT_NAME, STEREO_RIGHT_NAME};
2177  ImBuf *ibuf_arr[3] = {NULL};
2178  int i;
2179 
2180  BLI_assert((totvideos == 1) && (scene->r.im_format.views_format == R_IMF_VIEWS_STEREO_3D));
2181 
2182  for (i = 0; i < 2; i++) {
2183  int view_id = BLI_findstringindex(&rr->views, names[i], offsetof(RenderView, name));
2184  ibuf_arr[i] = render_result_rect_to_ibuf(rr, &scene->r, view_id);
2185 
2187  true,
2188  false,
2189  &scene->view_settings,
2191  &scene->r.im_format);
2192  }
2193 
2194  ibuf_arr[2] = IMB_stereo3d_ImBuf(&scene->r.im_format, ibuf_arr[0], ibuf_arr[1]);
2195 
2196  ok = mh->append_movie(movie_ctx_arr[0],
2197  rd,
2198  preview ? scene->r.psfra : scene->r.sfra,
2199  scene->r.cfra,
2200  (int *)ibuf_arr[2]->rect,
2201  ibuf_arr[2]->x,
2202  ibuf_arr[2]->y,
2203  "",
2204  reports);
2205 
2206  for (i = 0; i < 3; i++) {
2207  /* imbuf knows which rects are not part of ibuf */
2208  IMB_freeImBuf(ibuf_arr[i]);
2209  }
2210  }
2211 
2212  return ok;
2213 }
2214 
2216  Main *bmain,
2217  Scene *scene,
2218  bMovieHandle *mh,
2219  const int totvideos,
2220  const char *name_override)
2221 {
2222  char name[FILE_MAX];
2223  RenderResult rres;
2224  double render_time;
2225  bool ok = true;
2226 
2227  RE_AcquireResultImageViews(re, &rres);
2228 
2229  /* write movie or image */
2232  re->reports, &rres, scene, &re->r, mh, re->movie_ctx_arr, totvideos, false);
2233  }
2234  else {
2235  if (name_override) {
2236  BLI_strncpy(name, name_override, sizeof(name));
2237  }
2238  else {
2240  scene->r.pic,
2241  BKE_main_blendfile_path(bmain),
2242  scene->r.cfra,
2243  &scene->r.im_format,
2244  (scene->r.scemode & R_EXTENSION) != 0,
2245  true,
2246  NULL);
2247  }
2248 
2249  /* write images as individual images or stereo */
2250  ok = RE_WriteRenderViewsImage(re->reports, &rres, scene, true, name);
2251  }
2252 
2253  RE_ReleaseResultImageViews(re, &rres);
2254 
2255  render_time = re->i.lastframetime;
2257 
2259  printf(" Time: %s", name);
2260 
2261  /* Flush stdout to be sure python callbacks are printing stuff after blender. */
2262  fflush(stdout);
2263 
2264  /* NOTE: using G_MAIN seems valid here???
2265  * Not sure it's actually even used anyway, we could as well pass NULL? */
2267 
2268  BLI_timecode_string_from_time_simple(name, sizeof(name), re->i.lastframetime - render_time);
2269  printf(" (Saving: %s)\n", name);
2270 
2271  fputc('\n', stdout);
2272  fflush(stdout);
2273 
2274  return ok;
2275 }
2276 
2277 static void get_videos_dimensions(const Render *re,
2278  const RenderData *rd,
2279  size_t *r_width,
2280  size_t *r_height)
2281 {
2282  size_t width, height;
2283  if (re->r.mode & R_BORDER) {
2284  if ((re->r.mode & R_CROP) == 0) {
2285  width = re->winx;
2286  height = re->winy;
2287  }
2288  else {
2289  width = re->rectx;
2290  height = re->recty;
2291  }
2292  }
2293  else {
2294  width = re->rectx;
2295  height = re->recty;
2296  }
2297 
2298  BKE_scene_multiview_videos_dimensions_get(rd, width, height, r_width, r_height);
2299 }
2300 
2301 static void re_movie_free_all(Render *re, bMovieHandle *mh, int totvideos)
2302 {
2303  int i;
2304 
2305  for (i = 0; i < totvideos; i++) {
2306  mh->end_movie(re->movie_ctx_arr[i]);
2307  mh->context_free(re->movie_ctx_arr[i]);
2308  }
2309 
2311 }
2312 
2313 /* saves images to disk */
2315  Main *bmain,
2316  Scene *scene,
2317  ViewLayer *single_layer,
2318  Object *camera_override,
2319  int sfra,
2320  int efra,
2321  int tfra)
2322 {
2323  /* Call hooks before taking a copy of scene->r, so user can alter the render settings prior to
2324  * copying (e.g. alter the output path). */
2326 
2327  const RenderData rd = scene->r;
2328  bMovieHandle *mh = NULL;
2329  const int cfrao = rd.cfra;
2330  int nfra, totrendered = 0, totskipped = 0;
2331  const int totvideos = BKE_scene_multiview_num_videos_get(&rd);
2332  const bool is_movie = BKE_imtype_is_movie(rd.im_format.imtype);
2333  const bool is_multiview_name = ((rd.scemode & R_MULTIVIEW) != 0 &&
2335 
2336  /* do not fully call for each frame, it initializes & pops output window */
2337  if (!render_init_from_main(re, &rd, bmain, scene, single_layer, camera_override, 0, 1)) {
2338  return;
2339  }
2340 
2342 
2343  if (is_movie) {
2344  size_t width, height;
2345  int i;
2346  bool is_error = false;
2347 
2348  get_videos_dimensions(re, &rd, &width, &height);
2349 
2351  if (mh == NULL) {
2352  BKE_report(re->reports, RPT_ERROR, "Movie format unsupported");
2353  return;
2354  }
2355 
2356  re->movie_ctx_arr = MEM_mallocN(sizeof(void *) * totvideos, "Movies' Context");
2357 
2358  for (i = 0; i < totvideos; i++) {
2359  const char *suffix = BKE_scene_multiview_view_id_suffix_get(&re->r, i);
2360 
2361  re->movie_ctx_arr[i] = mh->context_create();
2362 
2363  if (!mh->start_movie(re->movie_ctx_arr[i],
2364  re->pipeline_scene_eval,
2365  &re->r,
2366  width,
2367  height,
2368  re->reports,
2369  false,
2370  suffix)) {
2371  is_error = true;
2372  break;
2373  }
2374  }
2375 
2376  if (is_error) {
2377  /* report is handled above */
2378  re_movie_free_all(re, mh, i + 1);
2380  return;
2381  }
2382  }
2383 
2384  /* Ugly global still... is to prevent renderwin events and signal subsurfs etc to make full resol
2385  * is also set by caller renderwin.c */
2386  G.is_rendering = true;
2387 
2388  re->flag |= R_ANIMATION;
2389 
2390  {
2391  for (nfra = sfra, scene->r.cfra = sfra; scene->r.cfra <= efra; scene->r.cfra++) {
2392  char name[FILE_MAX];
2393 
2394  /* A feedback loop exists here -- render initialization requires updated
2395  * render layers settings which could be animated, but scene evaluation for
2396  * the frame happens later because it depends on what layers are visible to
2397  * render engine.
2398  *
2399  * The idea here is to only evaluate animation data associated with the scene,
2400  * which will make sure render layer settings are up-to-date, initialize the
2401  * render database itself and then perform full scene update with only needed
2402  * layers.
2403  * -sergey-
2404  */
2405  {
2406  float ctime = BKE_scene_frame_get(scene);
2408  const AnimationEvalContext anim_eval_context = BKE_animsys_eval_context_construct(
2409  re->pipeline_depsgraph, ctime);
2410  BKE_animsys_evaluate_animdata(&scene->id, adt, &anim_eval_context, ADT_RECALC_ALL, false);
2411  }
2412 
2414 
2415  /* only border now, todo: camera lens. (ton) */
2416  render_init_from_main(re, &rd, bmain, scene, single_layer, camera_override, 1, 0);
2417 
2418  if (nfra != scene->r.cfra) {
2419  /* Skip this frame, but could update for physics and particles system. */
2420  continue;
2421  }
2422 
2423  nfra += tfra;
2424 
2425  /* Touch/NoOverwrite options are only valid for image's */
2426  if (is_movie == false) {
2427  if (rd.mode & (R_NO_OVERWRITE | R_TOUCH)) {
2429  rd.pic,
2430  BKE_main_blendfile_path(bmain),
2431  scene->r.cfra,
2432  &rd.im_format,
2433  (rd.scemode & R_EXTENSION) != 0,
2434  true,
2435  NULL);
2436  }
2437 
2438  if (rd.mode & R_NO_OVERWRITE) {
2439  if (!is_multiview_name) {
2440  if (BLI_exists(name)) {
2441  printf("skipping existing frame \"%s\"\n", name);
2442  totskipped++;
2443  continue;
2444  }
2445  }
2446  else {
2447  SceneRenderView *srv;
2448  bool is_skip = false;
2449  char filepath[FILE_MAX];
2450 
2451  for (srv = scene->r.views.first; srv; srv = srv->next) {
2453  continue;
2454  }
2455 
2456  BKE_scene_multiview_filepath_get(srv, name, filepath);
2457 
2458  if (BLI_exists(filepath)) {
2459  is_skip = true;
2460  printf("skipping existing frame \"%s\" for view \"%s\"\n", filepath, srv->name);
2461  }
2462  }
2463 
2464  if (is_skip) {
2465  totskipped++;
2466  continue;
2467  }
2468  }
2469  }
2470 
2471  if (rd.mode & R_TOUCH) {
2472  if (!is_multiview_name) {
2473  if (!BLI_exists(name)) {
2474  BLI_make_existing_file(name); /* makes the dir if its not there */
2476  }
2477  }
2478  else {
2479  SceneRenderView *srv;
2480  char filepath[FILE_MAX];
2481 
2482  for (srv = scene->r.views.first; srv; srv = srv->next) {
2484  continue;
2485  }
2486 
2487  BKE_scene_multiview_filepath_get(srv, name, filepath);
2488 
2489  if (!BLI_exists(filepath)) {
2490  BLI_make_existing_file(filepath); /* makes the dir if its not there */
2491  BLI_file_touch(filepath);
2492  }
2493  }
2494  }
2495  }
2496  }
2497 
2498  re->r.cfra = scene->r.cfra; /* weak.... */
2499 
2500  /* run callbacks before rendering, before the scene is updated */
2502 
2504  totrendered++;
2505 
2506  if (re->test_break(re->tbh) == 0) {
2507  if (!G.is_break) {
2508  if (!do_write_image_or_movie(re, bmain, scene, mh, totvideos, NULL)) {
2509  G.is_break = true;
2510  }
2511  }
2512  }
2513  else {
2514  G.is_break = true;
2515  }
2516 
2517  if (G.is_break == true) {
2518  /* remove touched file */
2519  if (is_movie == false) {
2520  if ((rd.mode & R_TOUCH)) {
2521  if (!is_multiview_name) {
2522  if ((BLI_file_size(name) == 0)) {
2523  /* BLI_exists(name) is implicit */
2524  BLI_delete(name, false, false);
2525  }
2526  }
2527  else {
2528  SceneRenderView *srv;
2529  char filepath[FILE_MAX];
2530 
2531  for (srv = scene->r.views.first; srv; srv = srv->next) {
2533  continue;
2534  }
2535 
2536  BKE_scene_multiview_filepath_get(srv, name, filepath);
2537 
2538  if ((BLI_file_size(filepath) == 0)) {
2539  /* BLI_exists(filepath) is implicit */
2540  BLI_delete(filepath, false, false);
2541  }
2542  }
2543  }
2544  }
2545  }
2546 
2547  break;
2548  }
2549 
2550  if (G.is_break == false) {
2551  /* keep after file save */
2554  }
2555  }
2556  }
2557 
2558  /* end movie */
2559  if (is_movie) {
2560  re_movie_free_all(re, mh, totvideos);
2561  }
2562 
2563  if (totskipped && totrendered == 0) {
2564  BKE_report(re->reports, RPT_INFO, "No frames rendered, skipped to not overwrite");
2565  }
2566 
2567  scene->r.cfra = cfrao;
2568 
2569  re->flag &= ~R_ANIMATION;
2570 
2572  re->main,
2573  &scene->id,
2576 
2578 
2579  /* UGLY WARNING */
2580  G.is_rendering = false;
2581 }
2582 
2583 void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
2584 {
2585  Object *camera;
2586  int winx, winy;
2587 
2588  winx = (sce->r.size * sce->r.xsch) / 100;
2589  winy = (sce->r.size * sce->r.ysch) / 100;
2590 
2591  RE_InitState(re, NULL, &sce->r, &sce->view_layers, NULL, winx, winy, NULL);
2592 
2593  re->main = bmain;
2594  re->scene = sce;
2595 
2596  camera = RE_GetCamera(re);
2597  RE_SetCamera(re, camera);
2598 
2599  RE_engine_render(re, false);
2600 
2601  /* No persistent data for preview render. */
2602  if (re->engine) {
2603  RE_engine_free(re->engine);
2604  re->engine = NULL;
2605  }
2606 }
2607 
2608 /* note; repeated win/disprect calc... solve that nicer, also in compo */
2609 
2610 /* only the temp file! */
2612 {
2613  Render *re;
2614  int winx, winy;
2615  bool success;
2616  rcti disprect;
2617 
2618  /* calculate actual render result and display size */
2619  winx = (scene->r.size * scene->r.xsch) / 100;
2620  winy = (scene->r.size * scene->r.ysch) / 100;
2621 
2622  /* only in movie case we render smaller part */
2623  if (scene->r.mode & R_BORDER) {
2624  disprect.xmin = scene->r.border.xmin * winx;
2625  disprect.xmax = scene->r.border.xmax * winx;
2626 
2627  disprect.ymin = scene->r.border.ymin * winy;
2628  disprect.ymax = scene->r.border.ymax * winy;
2629  }
2630  else {
2631  disprect.xmin = disprect.ymin = 0;
2632  disprect.xmax = winx;
2633  disprect.ymax = winy;
2634  }
2635 
2636  if (scenode) {
2637  scene = scenode;
2638  }
2639 
2640  /* get render: it can be called from UI with draw callbacks */
2641  re = RE_GetSceneRender(scene);
2642  if (re == NULL) {
2643  re = RE_NewSceneRender(scene);
2644  }
2645  RE_InitState(re, NULL, &scene->r, &scene->view_layers, NULL, winx, winy, &disprect);
2646  re->scene = scene;
2647 
2649  success = render_result_exr_file_cache_read(re);
2651 
2653 
2654  return success;
2655 }
2656 
2658 {
2659  re->r.threads = BKE_render_num_threads(&re->r);
2660 }
2661 
2662 /* loads in image into a result, size must match
2663  * x/y offsets are only used on a partial copy when dimensions don't match */
2665  RenderLayer *layer, ReportList *reports, const char *filename, int x, int y)
2666 {
2667  /* OCIO_TODO: assume layer was saved in default color space */
2668  ImBuf *ibuf = IMB_loadiffname(filename, IB_rect, NULL);
2669  RenderPass *rpass = NULL;
2670 
2671  /* multiview: since the API takes no 'view', we use the first combined pass found */
2672  for (rpass = layer->passes.first; rpass; rpass = rpass->next) {
2673  if (STREQ(rpass->name, RE_PASSNAME_COMBINED)) {
2674  break;
2675  }
2676  }
2677 
2678  if (rpass == NULL) {
2679  BKE_reportf(reports,
2680  RPT_ERROR,
2681  "%s: no Combined pass found in the render layer '%s'",
2682  __func__,
2683  filename);
2684  }
2685 
2686  if (ibuf && (ibuf->rect || ibuf->rect_float)) {
2687  if (ibuf->x == layer->rectx && ibuf->y == layer->recty) {
2688  if (ibuf->rect_float == NULL) {
2689  IMB_float_from_rect(ibuf);
2690  }
2691 
2692  memcpy(rpass->rect, ibuf->rect_float, sizeof(float[4]) * layer->rectx * layer->recty);
2693  }
2694  else {
2695  if ((ibuf->x - x >= layer->rectx) && (ibuf->y - y >= layer->recty)) {
2696  ImBuf *ibuf_clip;
2697 
2698  if (ibuf->rect_float == NULL) {
2699  IMB_float_from_rect(ibuf);
2700  }
2701 
2702  ibuf_clip = IMB_allocImBuf(layer->rectx, layer->recty, 32, IB_rectfloat);
2703  if (ibuf_clip) {
2704  IMB_rectcpy(ibuf_clip, ibuf, 0, 0, x, y, layer->rectx, layer->recty);
2705 
2706  memcpy(
2707  rpass->rect, ibuf_clip->rect_float, sizeof(float[4]) * layer->rectx * layer->recty);
2708  IMB_freeImBuf(ibuf_clip);
2709  }
2710  else {
2711  BKE_reportf(
2712  reports, RPT_ERROR, "%s: failed to allocate clip buffer '%s'", __func__, filename);
2713  }
2714  }
2715  else {
2716  BKE_reportf(reports,
2717  RPT_ERROR,
2718  "%s: incorrect dimensions for partial copy '%s'",
2719  __func__,
2720  filename);
2721  }
2722  }
2723 
2724  IMB_freeImBuf(ibuf);
2725  }
2726  else {
2727  BKE_reportf(reports, RPT_ERROR, "%s: failed to load '%s'", __func__, filename);
2728  }
2729 }
2730 
2731 void RE_result_load_from_file(RenderResult *result, ReportList *reports, const char *filename)
2732 {
2733  if (!render_result_exr_file_read_path(result, NULL, filename)) {
2734  BKE_reportf(reports, RPT_ERROR, "%s: failed to load '%s'", __func__, filename);
2735  return;
2736  }
2737 }
2738 
2739 /* Used in the interface to decide whether to show layers or passes. */
2741 {
2742  switch (BLI_listbase_count_at_most(&rr->layers, 2)) {
2743  case 0:
2744  return false;
2745  case 1:
2746  return (((RenderLayer *)rr->layers.first)->name[0] != '\0');
2747  default:
2748  return true;
2749  }
2750  return false;
2751 }
2752 
2754 {
2755  LISTBASE_FOREACH (RenderPass *, rp, &rl->passes) {
2756  if (!STREQ(rp->name, "Combined")) {
2757  return true;
2758  }
2759  }
2760 
2761  return false;
2762 }
2763 
2764 RenderPass *RE_pass_find_by_name(volatile RenderLayer *rl, const char *name, const char *viewname)
2765 {
2766  RenderPass *rp = NULL;
2767 
2768  for (rp = rl->passes.last; rp; rp = rp->prev) {
2769  if (STREQ(rp->name, name)) {
2770  if (viewname == NULL || viewname[0] == '\0') {
2771  break;
2772  }
2773  if (STREQ(rp->view, viewname)) {
2774  break;
2775  }
2776  }
2777  }
2778  return rp;
2779 }
2780 
2781 /* Only provided for API compatibility, don't use this in new code! */
2782 RenderPass *RE_pass_find_by_type(volatile RenderLayer *rl, int passtype, const char *viewname)
2783 {
2784 #define CHECK_PASS(NAME) \
2785  if (passtype == SCE_PASS_##NAME) { \
2786  return RE_pass_find_by_name(rl, RE_PASSNAME_##NAME, viewname); \
2787  } \
2788  ((void)0)
2789 
2790  CHECK_PASS(COMBINED);
2791  CHECK_PASS(Z);
2792  CHECK_PASS(VECTOR);
2793  CHECK_PASS(NORMAL);
2794  CHECK_PASS(UV);
2795  CHECK_PASS(EMIT);
2796  CHECK_PASS(SHADOW);
2797  CHECK_PASS(AO);
2798  CHECK_PASS(ENVIRONMENT);
2799  CHECK_PASS(INDEXOB);
2800  CHECK_PASS(INDEXMA);
2801  CHECK_PASS(MIST);
2802  CHECK_PASS(RAYHITS);
2803  CHECK_PASS(DIFFUSE_DIRECT);
2804  CHECK_PASS(DIFFUSE_INDIRECT);
2805  CHECK_PASS(DIFFUSE_COLOR);
2806  CHECK_PASS(GLOSSY_DIRECT);
2807  CHECK_PASS(GLOSSY_INDIRECT);
2808  CHECK_PASS(GLOSSY_COLOR);
2809  CHECK_PASS(TRANSM_DIRECT);
2810  CHECK_PASS(TRANSM_INDIRECT);
2811  CHECK_PASS(TRANSM_COLOR);
2812  CHECK_PASS(SUBSURFACE_DIRECT);
2813  CHECK_PASS(SUBSURFACE_INDIRECT);
2814  CHECK_PASS(SUBSURFACE_COLOR);
2815 
2816 #undef CHECK_PASS
2817 
2818  return NULL;
2819 }
2820 
2821 /* create a renderlayer and renderpass for grease pencil layer */
2822 RenderPass *RE_create_gp_pass(RenderResult *rr, const char *layername, const char *viewname)
2823 {
2824  RenderLayer *rl = BLI_findstring(&rr->layers, layername, offsetof(RenderLayer, name));
2825  /* only create render layer if not exist */
2826  if (!rl) {
2827  rl = MEM_callocN(sizeof(RenderLayer), layername);
2828  BLI_addtail(&rr->layers, rl);
2829  BLI_strncpy(rl->name, layername, sizeof(rl->name));
2830  rl->layflag = SCE_LAY_SOLID;
2832  rl->rectx = rr->rectx;
2833  rl->recty = rr->recty;
2834  }
2835 
2836  /* clear previous pass if exist or the new image will be over previous one*/
2838  if (rp) {
2839  if (rp->rect) {
2840  MEM_freeN(rp->rect);
2841  }
2842  BLI_freelinkN(&rl->passes, rp);
2843  }
2844  /* create a totally new pass */
2845  return render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, viewname, "RGBA");
2846 }
2847 
2849 {
2850  /* override not showing object when duplis are used with particles */
2851  if (ob->transflag & OB_DUPLIPARTS) {
2852  /* pass */ /* let particle system(s) handle showing vs. not showing */
2853  }
2854  else if (ob->transflag & OB_DUPLI) {
2855  return false;
2856  }
2857  return true;
2858 }
struct AnimData * BKE_animdata_from_id(struct ID *id)
Definition: anim_data.c:96
AnimationEvalContext BKE_animsys_eval_context_construct(struct Depsgraph *depsgraph, float eval_time)
Definition: anim_sys.c:637
@ ADT_RECALC_ALL
Definition: BKE_animsys.h:239
void BKE_animsys_evaluate_animdata(struct ID *id, struct AnimData *adt, const struct AnimationEvalContext *anim_eval_context, eAnimData_Recalc recalc, const bool flush_to_original)
void BKE_callback_exec_null(struct Main *bmain, eCbEvent evt)
Definition: callbacks.c:46
eCbEvent
Definition: BKE_callbacks.h:39
@ BKE_CB_EVT_RENDER_COMPLETE
Definition: BKE_callbacks.h:47
@ BKE_CB_EVT_RENDER_POST
Definition: BKE_callbacks.h:43
@ BKE_CB_EVT_RENDER_STATS
Definition: BKE_callbacks.h:45
@ BKE_CB_EVT_RENDER_PRE
Definition: BKE_callbacks.h:42
@ BKE_CB_EVT_RENDER_WRITE
Definition: BKE_callbacks.h:44
@ BKE_CB_EVT_RENDER_INIT
Definition: BKE_callbacks.h:46
@ BKE_CB_EVT_RENDER_CANCEL
Definition: BKE_callbacks.h:48
void BKE_callback_exec_id(struct Main *bmain, struct ID *id, eCbEvent evt)
Definition: callbacks.c:51
Camera data-block and utility functions.
struct Object * BKE_camera_multiview_render(const struct Scene *scene, struct Object *camera, const char *viewname)
void BKE_curvemapping_free_data(struct CurveMapping *cumap)
Definition: colortools.c:99
void BKE_curvemapping_copy_data(struct CurveMapping *target, const struct CurveMapping *cumap)
#define G_MAIN
Definition: BKE_global.h:232
int BKE_imbuf_write(struct ImBuf *ibuf, const char *name, const struct ImageFormatData *imf)
void BKE_image_path_from_imformat(char *string, const char *base, const char *relbase, int frame, const struct ImageFormatData *im_format, const bool use_ext, const bool use_frames, const char *suffix)
int BKE_image_path_ensure_ext_from_imformat(char *string, const struct ImageFormatData *im_format)
struct StampData * BKE_stamp_data_copy(const struct StampData *stamp_data)
bool BKE_imtype_is_movie(const char imtype)
Definition: image.c:1443
int BKE_imbuf_write_stamp(struct Scene *scene, struct RenderResult *rr, struct ImBuf *ibuf, const char *name, const struct ImageFormatData *imf)
Definition: image.c:3036
void BKE_stamp_info_from_imbuf(struct RenderResult *rr, struct ImBuf *ibuf)
Definition: image.c:2800
void BKE_render_result_stamp_info(struct Scene *scene, struct Object *camera, struct RenderResult *rr, bool allocate_only)
Definition: image.c:2611
void BKE_image_stamp_buf(struct Scene *scene, struct Object *camera, const struct StampData *stamp_data_template, unsigned char *rect, float *rectf, int width, int height, int channels)
void BKE_image_all_free_anim_ibufs(struct Main *bmain, int cfra)
Definition: image.c:1315
struct Object * BKE_view_layer_camera_find(struct ViewLayer *view_layer)
Definition: layer.c:337
struct ViewLayer * BKE_view_layer_context_active_PLACEHOLDER(const struct Scene *scene)
struct ViewLayer * BKE_view_layer_default_render(const struct Scene *scene)
const char * BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL()
#define NODE_CUSTOM_GROUP
Definition: BKE_node.h:876
void ntreeCompositTagRender(struct Scene *scene)
void ntreeFreeCache(struct bNodeTree *ntree)
Definition: node.cc:3039
void nodeUpdate(struct bNodeTree *ntree, struct bNode *node)
Definition: node.cc:4326
void ntreeCompositExecTree(struct Scene *scene, struct bNodeTree *ntree, struct RenderData *rd, int rendering, int do_previews, const struct ColorManagedViewSettings *view_settings, const struct ColorManagedDisplaySettings *display_settings, const char *view_name)
#define CMP_NODE_OUTPUT_FILE
Definition: BKE_node.h:1154
#define CMP_NODE_R_LAYERS
Definition: BKE_node.h:1152
General operations, lookup, etc. for blender objects.
void BKE_ptcache_bake(struct PTCacheBaker *baker)
Definition: pointcache.c:3215
void BKE_report(ReportList *reports, ReportType type, const char *message)
Definition: report.c:104
void BKE_reportf(ReportList *reports, ReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
const char * BKE_scene_multiview_view_id_suffix_get(const struct RenderData *rd, const int view_id)
int BKE_scene_multiview_num_videos_get(const struct RenderData *rd)
void BKE_scene_update_sound(struct Depsgraph *depsgraph, struct Main *bmain)
Definition: scene.c:2604
bool BKE_scene_multiview_is_render_view_active(const struct RenderData *rd, const struct SceneRenderView *srv)
void BKE_scene_multiview_view_filepath_get(const struct RenderData *rd, const char *filepath, const char *view, char *r_filepath)
float BKE_scene_frame_get(const struct Scene *scene)
int BKE_render_num_threads(const struct RenderData *r)
bool BKE_scene_camera_switch_update(struct Scene *scene)
Definition: scene.c:2349
int BKE_scene_multiview_num_views_get(const struct RenderData *rd)
int BKE_scene_multiview_view_id_get(const struct RenderData *rd, const char *viewname)
struct Depsgraph * BKE_scene_ensure_depsgraph(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer)
Definition: scene.c:3526
void BKE_scene_multiview_filepath_get(struct SceneRenderView *srv, const char *filepath, char *r_filepath)
Definition: scene.c:3243
void BKE_scene_multiview_videos_dimensions_get(const struct RenderData *rd, const size_t width, const size_t height, size_t *r_width, size_t *r_height)
void BKE_sound_reset_scene_specs(struct Scene *scene)
bMovieHandle * BKE_movie_handle_get(const char imtype)
Definition: writeavi.c:114
#define BLI_assert(a)
Definition: BLI_assert.h:58
File and directory operations.
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: storage.c:349
bool BLI_file_touch(const char *file) ATTR_NONNULL()
Definition: fileops.c:294
bool BLI_file_is_writable(const char *file) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: fileops.c:265
int BLI_delete(const char *file, bool dir, bool recursive) ATTR_NONNULL()
Definition: fileops.c:1037
size_t BLI_file_size(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
Definition: storage.c:219
struct GSet GSet
Definition: BLI_ghash.h:189
GSet * BLI_gset_ptr_new(const char *info)
bool BLI_gset_haskey(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:1216
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
Definition: BLI_ghash.c:1253
bool BLI_gset_add(GSet *gs, void *key)
Definition: BLI_ghash.c:1160
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:281
void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
int BLI_listbase_count_at_most(const struct ListBase *listbase, const int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition: listbase.c:547
void * BLI_findstring(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:133
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_findstringindex(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
bool BLI_make_existing_file(const char *name)
Definition: path_util.c:1347
#define FILE_MAX
bool BLI_path_extension_check(const char *str, const char *ext) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT
Definition: path_util.c:1459
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition: BLI_rect.h:157
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition: BLI_rect.h:153
bool BLI_str_endswith(const char *__restrict str, const char *__restrict end) ATTR_NONNULL()
Definition: string.c:1040
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
Definition: string.c:108
void BLI_rw_mutex_end(ThreadRWMutex *mutex)
Definition: threads.cc:531
#define THREAD_LOCK_READ
Definition: BLI_threads.h:121
#define THREAD_LOCK_WRITE
Definition: BLI_threads.h:122
void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode)
Definition: threads.cc:516
void BLI_rw_mutex_init(ThreadRWMutex *mutex)
Definition: threads.cc:511
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
Definition: threads.cc:526
size_t BLI_timecode_string_from_time_simple(char *str, const size_t maxncpy, const double time_seconds) ATTR_NONNULL()
Definition: timecode.c:206
#define SWAP(type, a, b)
#define STREQLEN(a, b, n)
#define UNUSED(x)
#define ELEM(...)
#define STREQ(a, b)
#define TIP_(msgid)
Depsgraph * DEG_graph_new(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, eEvaluationMode mode)
Definition: depsgraph.cc:281
@ DAG_EVAL_RENDER
Definition: DEG_depsgraph.h:62
void DEG_evaluate_on_framechange(Depsgraph *graph, float ctime)
void DEG_graph_free(Depsgraph *graph)
Definition: depsgraph.cc:314
void DEG_graph_build_for_render_pipeline(struct Depsgraph *graph)
void DEG_debug_name_set(struct Depsgraph *depsgraph, const char *name)
struct Object * DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define ID_IS_LINKED(_id)
Definition: DNA_ID.h:426
Object groups, one object can be in many groups at once.
@ VIEW_LAYER_RENDER
#define NODE_MUTED
Object is a sort of wrapper for general info.
@ OB_DUPLI
@ OB_DUPLIPARTS
#define R_STAMP_ALL
#define RE_PASSNAME_COMBINED
#define STEREO_LEFT_NAME
#define R_EXTENSION
#define R_SINGLE_LAYER
#define R_BORDER
#define R_MULTIVIEW
#define R_CROP
#define CFRA
#define R_NO_OVERWRITE
#define R_DOCOMP
#define R_DOSEQ
#define R_BUTS_PREVIEW
#define R_EXR_CACHE_FILE
#define R_IMF_IMTYPE_MULTILAYER
#define R_STAMP_DRAW
@ SCE_VIEWS_FORMAT_MULTIVIEW
#define SCE_LAY_SOLID
#define R_FULL_SAMPLE
#define R_STAMP_STRIPMETA
#define R_TOUCH
#define RE_PASSNAME_Z
#define R_EXR_TILE_FILE
#define R_EDGE_FRS
@ R_IMF_VIEWS_MULTIVIEW
@ R_IMF_VIEWS_STEREO_3D
@ R_IMF_VIEWS_INDIVIDUAL
#define STEREO_RIGHT_NAME
#define R_IMF_FLAG_PREVIEW_JPG
#define R_IMF_IMTYPE_OPENEXR
@ SCE_PASS_COMBINED
#define R_IMF_IMTYPE_JPEG90
@ SEQ_SCENE_STRIPS
@ SEQ_TYPE_SOUND_RAM
@ SEQ_TYPE_SCENE
@ SEQ_RENDER_SIZE_SCENE
void FRS_init_stroke_renderer(struct Render *re)
void FRS_exit(void)
void FRS_end_stroke_rendering(struct Render *re)
void FRS_begin_stroke_rendering(struct Render *re)
int FRS_is_freestyle_enabled(struct ViewLayer *view_layer)
void FRS_do_stroke_rendering(struct Render *re, struct ViewLayer *view_layer)
void GPU_context_discard(GPUContext *)
Definition: gpu_context.cc:113
GPUContext * GPU_context_create(void *ghost_window)
Definition: gpu_context.cc:99
void GPU_context_active_set(GPUContext *)
Definition: gpu_context.cc:121
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei height
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
#define Z
Definition: GeomUtils.cpp:215
struct ImBuf * IMB_colormanagement_imbuf_for_write(struct ImBuf *ibuf, bool save_as_render, bool allocate_result, const struct ColorManagedViewSettings *view_settings, const struct ColorManagedDisplaySettings *display_settings, struct ImageFormatData *image_format_data)
void IMB_float_from_rect(struct ImBuf *ibuf)
Definition: divers.c:780
struct ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
Definition: allocimbuf.c:478
struct ImBuf * IMB_dupImBuf(const struct ImBuf *ibuf1)
void IMB_freeImBuf(struct ImBuf *ibuf)
Definition: allocimbuf.c:211
bool IMB_prepare_write_ImBuf(const bool isfloat, struct ImBuf *ibuf)
Definition: writeimage.c:68
struct ImBuf * IMB_stereo3d_ImBuf(struct ImageFormatData *im_format, struct ImBuf *ibuf_left, struct ImBuf *ibuf_right)
Definition: stereoimbuf.c:761
struct ImBuf * IMB_loadiffname(const char *filepath, int flags, char colorspace[IM_MAX_SPACE])
Definition: readimage.c:224
bool IMB_isfloat(const struct ImBuf *ibuf)
void IMB_rectcpy(struct ImBuf *dbuf, const struct ImBuf *sbuf, int destx, int desty, int srcx, int srcy, int width, int height)
Contains defines and structs used throughout the imbuf module.
@ IB_rectfloat
@ IB_rect
void IMB_metadata_copy(struct ImBuf *dimb, struct ImBuf *simb)
Definition: metadata.c:80
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
NODE_GROUP
Group RGB to NORMAL
Group RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume Image Sky Noise Wave Voronoi Brick Texture Vector Combine Vertex Separate Vector White RGB Map Separate Set CMP_NODE_COMPOSITE
Platform independent time functions.
#define RE_USE_CUSTOM_FREESTYLE
Definition: RE_engine.h:67
#define RE_ENGINE_RENDERING
Definition: RE_engine.h:74
#define RE_MAXNAME
Definition: RE_pipeline.h:51
OperationNode * node
StackEntry * from
Scene scene
bNodeTree * ntree
RenderEngineType * RE_engines_find(const char *idname)
Definition: engine.c:108
bool RE_engine_is_external(const Render *re)
Definition: engine.c:120
bool RE_engine_use_persistent_data(RenderEngine *engine)
Definition: engine.c:621
bool RE_engine_render(Render *re, bool do_all)
Definition: engine.c:889
void RE_engine_free(RenderEngine *engine)
Definition: engine.c:161
#define str(s)
static FT_Error err
Definition: freetypefont.c:52
void RE_SetCamera(Render *re, Object *cam_ob)
Definition: initrender.c:185
void RE_parts_clamp(Render *re)
Definition: initrender.c:258
struct Object * RE_GetCamera(Render *re)
Definition: initrender.c:169
static char ** names
Definition: makesdna.c:162
size_t(* MEM_get_peak_memory)(void)
Definition: mallocn.c:62
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void(* MEM_reset_peak_memory)(void)
Definition: mallocn.c:61
size_t(* MEM_get_memory_in_use)(void)
Definition: mallocn.c:59
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
static size_t mem_in_use
bool RE_HasSingleLayer(Render *re)
Definition: pipeline.c:285
void RE_ReleaseResultImageViews(Render *re, RenderResult *rr)
Definition: pipeline.c:453
Render * RE_GetRender(const char *name)
Definition: pipeline.c:328
void RE_stats_draw_cb(Render *re, void *handle, void(*f)(void *handle, RenderStats *rs))
Definition: pipeline.c:942
static int do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle *mh, const int totvideos, const char *name_override)
Definition: pipeline.c:2215
static int check_mode_full_sample(RenderData *rd)
Definition: pipeline.c:719
static void re_free_persistent_data(Render *re)
Definition: pipeline.c:691
RenderPass * RE_create_gp_pass(RenderResult *rr, const char *layername, const char *viewname)
Definition: pipeline.c:2822
void RE_FreeRender(Render *re)
Definition: pipeline.c:627
static void do_render_engine(Render *re)
Definition: pipeline.c:1067
static void result_rcti_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr), volatile struct rcti *UNUSED(rect))
Definition: pipeline.c:172
RenderResult * RE_AcquireResultRead(Render *re)
Definition: pipeline.c:343
void RE_ReleaseResultImage(Render *re)
Definition: pipeline.c:512
void RE_progress_cb(Render *re, void *handle, void(*f)(void *handle, float))
Definition: pipeline.c:947
void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
Definition: pipeline.c:2583
static int render_init_from_main(Render *re, const RenderData *rd, Main *bmain, Scene *scene, ViewLayer *single_layer, Object *camera_override, int anim, int anim_init)
Definition: pipeline.c:1752
static void update_physics_cache(Render *re, Scene *scene, ViewLayer *view_layer, int UNUSED(anim_init))
Definition: pipeline.c:1721
static void do_render_compositor_scenes(Render *re)
Definition: pipeline.c:1155
static void do_render_compositor_scene(Render *re, Scene *sce, int cfra)
Definition: pipeline.c:1089
static void re_movie_free_all(Render *re, bMovieHandle *mh, int totvideos)
Definition: pipeline.c:2301
int RE_seq_render_active(Scene *scene, RenderData *rd)
Definition: pipeline.c:1313
bool RE_WriteRenderViewsMovie(ReportList *reports, RenderResult *rr, Scene *scene, RenderData *rd, bMovieHandle *mh, void **movie_ctx_arr, const int totvideos, bool preview)
Definition: pipeline.c:2133
static void render_callback_exec_null(Render *re, Main *bmain, eCbEvent evt)
Definition: pipeline.c:143
static void stats_background(void *UNUSED(arg), RenderStats *rs)
Definition: pipeline.c:191
static void result_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr))
Definition: pipeline.c:169
float * RE_RenderLayerGetPass(volatile RenderLayer *rl, const char *name, const char *viewname)
Definition: pipeline.c:270
void RE_current_scene_update_cb(Render *re, void *handle, void(*f)(void *handle, Scene *scene))
Definition: pipeline.c:937
void * RE_gpu_context_get(Render *re)
Definition: pipeline.c:996
void * RE_gl_context_get(Render *re)
Definition: pipeline.c:991
Render * RE_GetSceneRender(const Scene *scene)
Definition: pipeline.c:591
void render_copy_renderdata(RenderData *to, RenderData *from)
Definition: pipeline.c:775
void RE_RenderFrame(Render *re, Main *bmain, Scene *scene, ViewLayer *single_layer, Object *camera_override, int frame, const bool write_still)
Definition: pipeline.c:1877
ListBase renderlist
Definition: pipeline.c:138
bool RE_WriteRenderViewsImage(ReportList *reports, RenderResult *rr, Scene *scene, const bool stamp, char *name)
Definition: pipeline.c:2010
void RE_FreePersistentData(const Scene *scene)
Definition: pipeline.c:700
static int compositor_needs_render(Scene *sce, int this_scene)
Definition: pipeline.c:1129
static bool check_valid_camera_multiview(Scene *scene, Object *camera, ReportList *reports)
Definition: pipeline.c:1537
static void stats_nothing(void *UNUSED(arg), RenderStats *UNUSED(rs))
Definition: pipeline.c:180
void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, const char *filename, int x, int y)
Definition: pipeline.c:2664
static void render_update_depsgraph(Render *re)
Definition: pipeline.c:1836
void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id)
Definition: pipeline.c:466
static int check_compositor_output(Scene *scene)
Definition: pipeline.c:1640
#define MAX_SCENE_RENDER_NAME
Definition: pipeline.c:579
void RE_ClearResult(Render *re)
Definition: pipeline.c:363
void RE_SwapResult(Render *re, RenderResult **rr)
Definition: pipeline.c:371
Render * RE_NewRender(const char *name)
Definition: pipeline.c:557
void RE_FreeRenderResult(RenderResult *rr)
Definition: pipeline.c:265
static void current_scene_nothing(void *UNUSED(arg), Scene *UNUSED(scene))
Definition: pipeline.c:177
static void render_pipeline_free(Render *re)
Definition: pipeline.c:1861
bool RE_passes_have_name(struct RenderLayer *rl)
Definition: pipeline.c:2753
RenderLayer * render_get_active_layer(Render *re, RenderResult *rr)
Definition: pipeline.c:296
void RE_FreeAllPersistentData(void)
Definition: pipeline.c:679
static void float_nothing(void *UNUSED(arg), float UNUSED(val))
Definition: pipeline.c:183
void RE_InitRenderCB(Render *re)
Definition: pipeline.c:607
static int check_valid_camera(Scene *scene, Object *camera_override, ReportList *reports)
Definition: pipeline.c:1576
void render_update_anim_renderdata(Render *re, RenderData *rd, ListBase *render_layers)
Definition: pipeline.c:898
void RE_gl_context_destroy(Render *re)
Definition: pipeline.c:975
static void scene_render_name_get(const Scene *scene, const size_t max_size, char *render_name)
Definition: pipeline.c:581
RenderPass * RE_pass_find_by_type(volatile RenderLayer *rl, int passtype, const char *viewname)
Definition: pipeline.c:2782
static void render_result_uncrop(Render *re)
Definition: pipeline.c:1016
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
Definition: pipeline.c:276
static struct @1133 RenderGlobal
Render * RE_NewSceneRender(const Scene *scene)
Definition: pipeline.c:598
static void render_result_disprect_to_full_resolution(Render *re)
Definition: pipeline.c:1007
static void do_render_sequencer(Render *re)
Definition: pipeline.c:1334
void RE_result_load_from_file(RenderResult *result, ReportList *reports, const char *filename)
Definition: pipeline.c:2731
void RE_InitState(Render *re, Render *source, RenderData *rd, ListBase *render_layers, ViewLayer *single_layer, int winx, int winy, rcti *disprect)
Definition: pipeline.c:788
void RE_ReleaseResult(Render *re)
Definition: pipeline.c:379
static void render_compositor_stats(void *arg, const char *str)
Definition: pipeline.c:1185
void RE_RenderAnim(Render *re, Main *bmain, Scene *scene, ViewLayer *single_layer, Object *camera_override, int sfra, int efra, int tfra)
Definition: pipeline.c:2314
static void do_render_full_pipeline(Render *re)
Definition: pipeline.c:1449
static bool node_tree_has_compositor_output(bNodeTree *ntree)
Definition: pipeline.c:1620
RenderPass * RE_pass_find_by_name(volatile RenderLayer *rl, const char *name, const char *viewname)
Definition: pipeline.c:2764
const char * RE_GetActiveRenderView(Render *re)
Definition: pipeline.c:1746
RenderResult * RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
Definition: pipeline.c:290
static void do_render_compositor(Render *re)
Definition: pipeline.c:1197
RenderResult * RE_AcquireResultWrite(Render *re)
Definition: pipeline.c:353
Scene * RE_GetScene(Render *re)
Definition: pipeline.c:387
static void re_init_resolution(Render *re, Render *source, int winx, int winy, rcti *disprect)
Definition: pipeline.c:738
bool RE_layers_have_name(struct RenderResult *rr)
Definition: pipeline.c:2740
void RE_display_clear_cb(Render *re, void *handle, void(*f)(void *handle, RenderResult *rr))
Definition: pipeline.c:925
bool RE_allow_render_generic_object(Object *ob)
Definition: pipeline.c:2848
void RE_gl_context_create(Render *re)
Definition: pipeline.c:967
void RE_test_break_cb(Render *re, void *handle, int(*f)(void *handle))
Definition: pipeline.c:959
static void get_videos_dimensions(const Render *re, const RenderData *rd, size_t *r_width, size_t *r_height)
Definition: pipeline.c:2277
void RE_display_update_cb(Render *re, void *handle, void(*f)(void *handle, RenderResult *rr, volatile rcti *rect))
Definition: pipeline.c:930
static void render_print_save_message(ReportList *reports, const char *name, int ok, int err)
Definition: pipeline.c:230
static void renderresult_stampinfo(Render *re)
Definition: pipeline.c:1288
static void render_init_depsgraph(Render *re)
Definition: pipeline.c:1843
void RE_AcquiredResultGet32(Render *re, RenderResult *result, unsigned int *rect, const int view_id)
Definition: pipeline.c:538
bool RE_is_rendering_allowed(Scene *scene, ViewLayer *single_layer, Object *camera_override, ReportList *reports)
Definition: pipeline.c:1645
void RE_draw_lock_cb(Render *re, void *handle, void(*f)(void *handle, bool lock))
Definition: pipeline.c:953
void RE_SetReports(Render *re, ReportList *reports)
Definition: pipeline.c:1831
void RE_FreeAllRender(void)
Definition: pipeline.c:653
void RE_AcquireResultImageViews(Render *re, RenderResult *rr)
Definition: pipeline.c:407
static int default_break(void *UNUSED(arg))
Definition: pipeline.c:186
static bool render_scene_has_layers_to_render(Scene *scene, ViewLayer *single_layer)
Definition: pipeline.c:311
bool RE_ReadRenderResult(Scene *scene, Scene *scenode)
Definition: pipeline.c:2611
void RE_SetScene(Render *re, Scene *sce)
Definition: pipeline.c:395
#define CHECK_PASS(NAME)
static void validate_render_settings(Render *re)
Definition: pipeline.c:1713
static int render_imbuf_write_stamp_test(ReportList *reports, Scene *scene, struct RenderResult *rr, ImBuf *ibuf, const char *name, const ImageFormatData *imf, bool stamp)
Definition: pipeline.c:242
void RE_ResultGet32(Render *re, unsigned int *rect)
Definition: pipeline.c:520
static void render_callback_exec_id(Render *re, Main *bmain, ID *id, eCbEvent evt)
Definition: pipeline.c:151
static bool check_valid_compositing_camera(Scene *scene, Object *camera_override, ReportList *reports)
Definition: pipeline.c:1500
void RE_FreeAllRenderResults(void)
Definition: pipeline.c:666
void RE_SetActiveRenderView(Render *re, const char *viewname)
Definition: pipeline.c:1741
RenderStats * RE_GetStats(Render *re)
Definition: pipeline.c:552
void RE_init_threadcount(Render *re)
Definition: pipeline.c:2657
void RE_display_init_cb(Render *re, void *handle, void(*f)(void *handle, RenderResult *rr))
Definition: pipeline.c:920
ImBuf * SEQ_render_give_ibuf(const SeqRenderData *context, float timeline_frame, int chanshown)
Definition: render.c:1964
void SEQ_render_new_render_data(Main *bmain, struct Depsgraph *depsgraph, Scene *scene, int rectx, int recty, int preview_render_size, int for_render, SeqRenderData *r_context)
Definition: render.c:211
void SEQ_render_imbuf_from_sequencer_space(Scene *scene, ImBuf *ibuf)
Definition: render.c:174
bool RE_WriteRenderResult(ReportList *reports, RenderResult *rr, const char *filename, ImageFormatData *imf, const char *view, int layer)
void render_result_single_layer_end(Render *re)
RenderView * RE_RenderViewGetById(RenderResult *rr, const int view_id)
void render_result_exr_file_path(Scene *scene, const char *layname, int sample, char *filepath)
bool render_result_exr_file_cache_read(Render *re)
void render_result_rect_fill_zero(RenderResult *rr, const int view_id)
void render_result_views_shallowdelete(RenderResult *rr)
void render_result_views_new(RenderResult *rr, const RenderData *rd)
void render_result_merge(RenderResult *rr, RenderResult *rrpart)
int render_result_exr_file_read_path(RenderResult *rr, RenderLayer *rl_single, const char *filepath)
void render_result_view_new(RenderResult *rr, const char *viewname)
RenderResult * render_result_new_from_exr(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
void render_result_free(RenderResult *rr)
Definition: render_result.c:85
void render_result_rect_get_pixels(RenderResult *rr, unsigned int *rect, int rectx, int recty, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const int view_id)
RenderPass * render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, const char *name, const char *viewname, const char *chan_id)
bool RE_HasFloatPixels(RenderResult *rr)
ImBuf * render_result_rect_to_ibuf(RenderResult *rr, const RenderData *rd, const int view_id)
void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname)
RenderResult * render_result_new(Render *re, rcti *partrct, int savebuffers, const char *layername, const char *viewname)
void render_result_single_layer_begin(Render *re)
void RE_render_result_rect_from_ibuf(RenderResult *rr, RenderData *UNUSED(rd), ImBuf *ibuf, const int view_id)
void render_result_views_shallowcopy(RenderResult *dst, RenderResult *src)
#define RR_USE_MEM
Definition: render_result.h:28
#define RR_ALL_VIEWS
Definition: render_result.h:32
#define RR_ALL_LAYERS
Definition: render_result.h:31
#define R_ANIMATION
Definition: render_types.h:164
const char * RE_engine_id_BLENDER_EEVEE
Definition: scene.c:1742
struct SELECTID_Context context
Definition: select_engine.c:47
_W64 unsigned int uintptr_t
Definition: stdint.h:122
void SEQ_relations_free_all_anim_ibufs(Scene *scene, int timeline_frame)
void SEQ_relations_free_imbuf(Scene *scene, ListBase *seqbase, bool for_render)
ListBase seqbase
Definition: DNA_ID.h:273
struct Library * lib
Definition: DNA_ID.h:277
char name[66]
Definition: DNA_ID.h:283
struct IDProperty * metadata
unsigned char planes
char name[IMB_FILENAME_SIZE]
unsigned int * rect
float * rect_float
ID id
Definition: DNA_ID.h:349
void * last
Definition: DNA_listBase.h:47
void * first
Definition: DNA_listBase.h:47
Definition: BKE_main.h:116
short transflag
struct Scene * scene
struct Main * bmain
struct Depsgraph * depsgraph
struct ViewLayer * view_layer
struct CurveMapping mblur_shutter_curve
char engine[32]
struct ImageFormatData im_format
char pic[1024]
ListBase views
int line_thickness_mode
short views_format
float unit_line_thickness
ListBase passes
Definition: RE_pipeline.h:108
char name[RE_MAXNAME]
Definition: RE_pipeline.h:100
struct RenderLayer * next
Definition: RE_pipeline.h:97
char name[64]
Definition: RE_pipeline.h:80
char view[64]
Definition: RE_pipeline.h:86
float * rect
Definition: RE_pipeline.h:82
struct RenderPass * prev
Definition: RE_pipeline.h:78
struct RenderPass * next
Definition: RE_pipeline.h:78
ListBase views
Definition: RE_pipeline.h:138
ListBase layers
Definition: RE_pipeline.h:135
volatile RenderLayer * renlay
Definition: RE_pipeline.h:142
float * rectz
Definition: RE_pipeline.h:127
struct StampData * stamp_data
Definition: RE_pipeline.h:157
float * rectf
Definition: RE_pipeline.h:125
double starttime
Definition: RE_pipeline.h:163
double lastframetime
Definition: RE_pipeline.h:163
const char * infostr
Definition: RE_pipeline.h:164
float * rectf
Definition: RE_pipeline.h:69
float * rectz
Definition: RE_pipeline.h:71
int * rect32
Definition: RE_pipeline.h:73
struct RenderView * next
Definition: RE_pipeline.h:65
char name[64]
Definition: RE_pipeline.h:66
void(* current_scene_update)(void *handle, struct Scene *scene)
Definition: render_types.h:136
int recty
Definition: render_types.h:97
void * dch
Definition: render_types.h:133
void * sdh
Definition: render_types.h:140
void(* progress)(void *handle, float i)
Definition: render_types.h:141
Scene * pipeline_scene_eval
Definition: render_types.h:127
void * duh
Definition: render_types.h:135
void * prh
Definition: render_types.h:142
RenderResult * result
Definition: render_types.h:79
Depsgraph * pipeline_depsgraph
Definition: render_types.h:126
RenderResult * pushedresult
Definition: render_types.h:81
RenderData r
Definition: render_types.h:113
int winy
Definition: render_types.h:92
struct RenderEngine * engine
Definition: render_types.h:122
struct Main * main
Definition: render_types.h:111
void * dih
Definition: render_types.h:131
short ok
Definition: render_types.h:76
int active_view_layer
Definition: render_types.h:115
void * dlh
Definition: render_types.h:145
Scene * scene
Definition: render_types.h:112
int rectx
Definition: render_types.h:97
ThreadRWMutex partsmutex
Definition: render_types.h:118
short result_ok
Definition: render_types.h:76
short flag
Definition: render_types.h:76
ThreadRWMutex resultmutex
Definition: render_types.h:87
char viewname[MAX_NAME]
Definition: render_types.h:154
struct Render * next
Definition: render_types.h:71
RenderStats i
Definition: render_types.h:149
void * tbh
Definition: render_types.h:147
void ** movie_ctx_arr
Definition: render_types.h:153
int winx
Definition: render_types.h:92
void(* display_init)(void *handle, RenderResult *rr)
Definition: render_types.h:130
void(* draw_lock)(void *handle, bool lock)
Definition: render_types.h:144
void(* stats_draw)(void *handle, RenderStats *ri)
Definition: render_types.h:139
void(* display_clear)(void *handle, RenderResult *rr)
Definition: render_types.h:132
int(* test_break)(void *handle)
Definition: render_types.h:146
void * suh
Definition: render_types.h:137
struct ReportList * reports
Definition: render_types.h:151
rcti disprect
Definition: render_types.h:93
struct Object * camera_override
Definition: render_types.h:116
void * gl_context
Definition: render_types.h:157
ListBase view_layers
Definition: render_types.h:114
char name[RE_MAXNAME]
Definition: render_types.h:72
void(* display_update)(void *handle, RenderResult *rr, volatile rcti *rect)
Definition: render_types.h:134
void * gpu_context
Definition: render_types.h:158
struct SceneRenderView * next
struct bNodeTree * nodetree
ColorManagedViewSettings view_settings
struct Editing * ed
struct RenderData r
ListBase view_layers
struct Object * camera
char use_nodes
ColorManagedDisplaySettings display_settings
struct Scene * scene
struct Object * scene_camera
struct Sequence * next
struct ViewLayer * next
char name[64]
Definition: IMB_anim.h:87
void(* end_movie)(void *context_v)
Definition: BKE_writeavi.h:54
int(* start_movie)(void *context_v, const struct Scene *scene, struct RenderData *rd, int rectx, int recty, struct ReportList *reports, bool preview, const char *suffix)
Definition: BKE_writeavi.h:37
void(* context_free)(void *context_v)
Definition: BKE_writeavi.h:63
void *(* context_create)(void)
Definition: BKE_writeavi.h:62
int(* append_movie)(void *context_v, struct RenderData *rd, int start_frame, int frame, int *pixels, int rectx, int recty, const char *suffix, struct ReportList *reports)
Definition: BKE_writeavi.h:45
void(* progress)(void *, float progress)
int(* test_break)(void *)
void(* stats_draw)(void *, const char *str)
ListBase nodes
float xmax
Definition: DNA_vec_types.h:85
float xmin
Definition: DNA_vec_types.h:85
float ymax
Definition: DNA_vec_types.h:86
float ymin
Definition: DNA_vec_types.h:86
int ymin
Definition: DNA_vec_types.h:80
int ymax
Definition: DNA_vec_types.h:80
int xmin
Definition: DNA_vec_types.h:79
int xmax
Definition: DNA_vec_types.h:79
void RE_point_density_fix_linking(void)
double PIL_check_seconds_timer(void)
Definition: time.c:80
#define G(x, y, z)
void * WM_opengl_context_create(void)
Definition: wm_window.c:2421
void wm_window_reset_drawable(void)
Definition: wm_window.c:1074
void WM_opengl_context_activate(void *context)
Definition: wm_window.c:2443
void WM_opengl_context_dispose(void *context)
Definition: wm_window.c:2437