Blender V4.5
RE_pipeline.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2006 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "DNA_ID.h"
12#include "DNA_listBase.h"
13#include "DNA_vec_types.h"
14
15struct GPUTexture;
16struct ImBuf;
17struct Image;
18struct ImageFormatData;
19struct MovieWriter;
20struct Main;
21struct Object;
22struct RenderData;
23struct RenderResult;
24struct ReportList;
25struct Scene;
26struct StampData;
27struct ViewLayer;
28
29/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
30/* this include is what is exposed of render to outside world */
31/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
32
33/* length of the scene name + passname */
34#define RE_MAXNAME ((MAX_ID_NAME - 2) + 10)
35
36/* only used as handle */
37struct RenderView {
38 struct RenderView *next, *prev;
39 char name[64]; /* EXR_VIEW_MAXNAME */
40
41 /* Image buffer of a composited layer or a sequencer output.
42 * The ibuf is only allocated if it has an actual data in one of its buffers (float, byte, or
43 * GPU). */
44 struct ImBuf *ibuf;
45};
46
47struct RenderPass {
48 struct RenderPass *next, *prev;
50 char name[64]; /* amount defined in IMB_openexr.hh */
51 char chan_id[8]; /* amount defined in IMB_openexr.hh */
52
53 /* Image buffer which contains data of this pass.
54 *
55 * The data can be either CPU side stored in ibuf->float_buffer, or a GPU-side stored in
56 * ibuf->gpu (during rendering, i.e.).
57 *
58 * The pass data storage is lazily allocated, and until data is actually provided (via either CPU
59 * buffer of GPU texture) the ibuf is not allocated. */
60 struct ImBuf *ibuf;
61
63
64 char fullname[64]; /* EXR_PASS_MAXNAME */
65 char view[64]; /* EXR_VIEW_MAXNAME */
66 int view_id; /* quick lookup */
67
68 char _pad0[4];
69};
70
91
94
95 /* The number of users of this render result. Default value is 0. The result is freed when
96 * #RE_FreeRenderResult is called with the render result with 0 users. In a way this is
97 * off-by-one, but it is the easiest for the currently used zero-initialized state. The way to
98 * think of it is the number of extra users.
99 *
100 * TODO: Make it an actual number of users, so the #RE_FreeRenderResult frees the result when
101 * the number of users goes to 0.
102 *
103 * TODO: Make it atomic. Currently it is not to allow shallow copying. */
105
106 /* target image size */
108
109 /* The temporary storage to pass image data from #RE_AcquireResultImage.
110 * Is null pointer when the RenderResult is not coming from the #RE_AcquireResultImage, and is
111 * a pointer to an existing ibuf in either RenderView or a RenderPass otherwise. */
112 struct ImBuf *ibuf;
113
114 /* coordinates within final image (after cropping) */
116 /* offset to apply to get a border render in full image */
117 int xof, yof;
118
119 /* the main buffers */
121
122 /* multiView maps to a StringVector in OpenEXR */
123 ListBase views; /* RenderView */
124
125 /* Render layer to display. */
127
128 /* for render results in Image, verify validity for sequences */
130
137 double ppm[2];
138
139 /* for acquire image, to indicate if it there is a combined layer */
141
142 /* render info text */
143 char *text;
144 char *error;
145
147
149};
150
159
160/* *********************** API ******************** */
161
166struct Render *RE_NewRender(const char *name);
167struct Render *RE_GetRender(const char *name);
168
169struct Scene;
170struct Render *RE_NewSceneRender(const struct Scene *scene);
171struct Render *RE_GetSceneRender(const struct Scene *scene);
172
173struct RenderEngineType;
174struct ViewRender *RE_NewViewRender(struct RenderEngineType *engine_type);
175
176/* Creates a new render for interactive compositing of the given scene. If an existing render
177 * exists for the given scene, it is returned instead. See interactive_compositor_renders in
178 * RenderGlobal for more information. */
180
181/* Assign default dummy callbacks. */
182
187void RE_InitRenderCB(struct Render *re);
188
194void RE_FreeRender(struct Render *re);
195void RE_FreeViewRender(struct ViewRender *view_render);
199void RE_FreeAllRender(void);
200
205
209void RE_FreeAllRenderResults(void);
210
215void RE_FreeAllPersistentData(void);
220
224void RE_FreeGPUTextureCaches(void);
225
231
235void RE_FreeRenderResult(struct RenderResult *rr);
239struct RenderResult *RE_AcquireResultRead(struct Render *re);
240struct RenderResult *RE_AcquireResultWrite(struct Render *re);
242void RE_ReleaseResult(struct Render *re);
248void RE_AcquireResultImageViews(struct Render *re, struct RenderResult *rr);
252void RE_ReleaseResultImageViews(struct Render *re, struct RenderResult *rr);
253
259void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, int view_id);
260void RE_ReleaseResultImage(struct Render *re);
261void RE_SwapResult(struct Render *re, struct RenderResult **rr);
262void RE_ClearResult(struct Render *re);
263struct RenderStats *RE_GetStats(struct Render *re);
264
268void RE_ResultGet32(struct Render *re, unsigned int *rect);
269void RE_ResultGetFloat(struct Render *re, float *rect);
270
271bool RE_ResultIsMultiView(struct RenderResult *rr);
272
273void RE_render_result_full_channel_name(char *fullname,
274 const char *layname,
275 const char *passname,
276 const char *viewname,
277 const char *chan_id,
278 int channel);
279
281 const struct ImageFormatData *imf,
282 const float dither,
283 int view_id);
285 const struct ImBuf *ibuf,
286 int view_id);
287
288struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
289float *RE_RenderLayerGetPass(struct RenderLayer *rl, const char *name, const char *viewname);
291 const char *name,
292 const char *viewname);
293
294bool RE_HasSingleLayer(struct Render *re);
295
300struct RenderPass *RE_create_gp_pass(struct RenderResult *rr,
301 const char *layername,
302 const char *viewname);
303
304void RE_create_render_pass(struct RenderResult *rr,
305 const char *name,
306 int channels,
307 const char *chan_id,
308 const char *layername,
309 const char *viewname,
310 bool allocate);
311
316void RE_InitState(struct Render *re,
317 struct Render *source,
318 struct RenderData *rd,
319 struct ListBase *render_layers,
320 struct ViewLayer *single_layer,
321 int winx,
322 int winy,
323 const rcti *disprect);
324
330struct Object *RE_GetCamera(struct Render *re);
331void RE_SetOverrideCamera(struct Render *re, struct Object *cam_ob);
337void RE_SetCamera(struct Render *re, const struct Object *cam_ob);
338
342void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect);
343
348
350 struct RenderResult *rr,
351 struct Scene *scene,
352 struct RenderData *rd,
353 struct MovieWriter **movie_writers,
354 int totvideos,
355 bool preview);
356
366void RE_RenderFrame(struct Render *re,
367 struct Main *bmain,
368 struct Scene *scene,
369 struct ViewLayer *single_layer,
370 struct Object *camera_override,
371 int frame,
372 float subframe,
373 bool write_still);
377void RE_RenderAnim(struct Render *re,
378 struct Main *bmain,
379 struct Scene *scene,
380 struct ViewLayer *single_layer,
381 struct Object *camera_override,
382 int sfra,
383 int efra,
384 int tfra);
385#ifdef WITH_FREESTYLE
386void RE_RenderFreestyleStrokes(struct Render *re,
387 struct Main *bmain,
388 struct Scene *scene,
389 bool render);
390void RE_RenderFreestyleExternal(struct Render *re);
391#endif
392
393void RE_SetActiveRenderView(struct Render *re, const char *viewname);
394const char *RE_GetActiveRenderView(struct Render *re);
395
399void RE_SetReports(struct Render *re, struct ReportList *reports);
400
404void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
405
409bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
410
412 void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty);
413
414/* Display and event callbacks. */
415
419void RE_display_init_cb(struct Render *re,
420 void *handle,
421 void (*f)(void *handle, RenderResult *rr));
422void RE_display_clear_cb(struct Render *re,
423 void *handle,
424 void (*f)(void *handle, RenderResult *rr));
425void RE_display_update_cb(struct Render *re,
426 void *handle,
427 void (*f)(void *handle, RenderResult *rr, struct rcti *rect));
428void RE_stats_draw_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
429void RE_progress_cb(struct Render *re, void *handle, void (*f)(void *handle, float));
430void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, bool lock));
431void RE_test_break_cb(struct Render *re, void *handle, bool (*f)(void *handle));
432void RE_prepare_viewlayer_cb(struct Render *re,
433 void *handle,
434 bool (*f)(void *handle, ViewLayer *vl, struct Depsgraph *depsgraph));
435void RE_current_scene_update_cb(struct Render *re,
436 void *handle,
437 void (*f)(void *handle, struct Scene *scene));
438
442
445
451float RE_filter_value(int type, float x);
452
453bool RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
454
459bool RE_passes_have_name(struct RenderLayer *rl);
460
462 const char *name,
463 const char *viewname);
468 int passtype,
469 const char *viewname);
470
476void RE_pass_set_buffer_data(struct RenderPass *pass, float *data);
477
481struct GPUTexture *RE_pass_ensure_gpu_texture_cache(struct Render *re, struct RenderPass *rpass);
482
483/* shaded view or baking options */
484#define RE_BAKE_NORMALS 0
485#define RE_BAKE_DISPLACEMENT 1
486#define RE_BAKE_AO 2
487
488void RE_GetCameraWindow(struct Render *re, const struct Object *camera, float r_winmat[4][4]);
492void RE_GetCameraWindowWithOverscan(const struct Render *re, float overscan, float r_winmat[4][4]);
493void RE_GetCameraModelMatrix(const struct Render *re,
494 const struct Object *camera,
495 float r_modelmat[4][4]);
496
497void RE_GetWindowMatrixWithOverscan(bool is_ortho,
498 float clip_start,
499 float clip_end,
500 rctf viewplane,
501 float overscan,
502 float r_winmat[4][4]);
503
504struct Scene *RE_GetScene(struct Render *re);
505void RE_SetScene(struct Render *re, struct Scene *sce);
506
507bool RE_is_rendering_allowed(struct Scene *scene,
508 struct ViewLayer *single_layer,
509 struct Object *camera_override,
510 struct ReportList *reports);
511
513
514/******* defined in `render_result.cc` *********/
515
519struct RenderView *RE_RenderViewGetById(struct RenderResult *rr, int view_id);
520struct RenderView *RE_RenderViewGetByName(struct RenderResult *rr, const char *viewname);
521
523
524struct ImBuf *RE_RenderPassEnsureImBuf(RenderPass *render_pass);
525struct ImBuf *RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view);
526
527/* Returns true if the pass is a color (as opposite of data) and needs to be color managed. */
528bool RE_RenderPassIsColor(const RenderPass *render_pass);
ID and Library types, which are fundamental for SDNA.
These structs are the foundation for all linked lists in the library system.
struct ImBuf * RE_render_result_rect_to_ibuf(struct RenderResult *rr, const struct ImageFormatData *imf, const float dither, int view_id)
void RE_current_scene_update_cb(struct Render *re, void *handle, void(*f)(void *handle, struct Scene *scene))
void RE_ResultGet32(struct Render *re, unsigned int *rect)
void RE_FreeRender(struct Render *re)
void RE_GetCameraWindowWithOverscan(const struct Render *re, float overscan, float r_winmat[4][4])
void * RE_blender_gpu_context_ensure(Render *re)
void RE_test_break_cb(struct Render *re, void *handle, bool(*f)(void *handle))
void * RE_system_gpu_context_get(Render *re)
void RE_GetWindowMatrixWithOverscan(bool is_ortho, float clip_start, float clip_end, rctf viewplane, float overscan, float r_winmat[4][4])
void RE_FreePersistentData(const struct Scene *scene)
bool RE_ResultIsMultiView(struct RenderResult *rr)
bool RE_layers_have_name(struct RenderResult *result)
struct RenderPass * RE_pass_find_by_type(struct RenderLayer *rl, int passtype, const char *viewname)
bool RE_HasCombinedLayer(const RenderResult *result)
void RE_ReferenceRenderResult(struct RenderResult *rr)
void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, int view_id)
void RE_display_update_cb(struct Render *re, void *handle, void(*f)(void *handle, RenderResult *rr, struct rcti *rect))
void RE_render_result_full_channel_name(char *fullname, const char *layname, const char *passname, const char *viewname, const char *chan_id, int channel)
struct Render * RE_GetSceneRender(const struct Scene *scene)
bool RE_RenderPassIsColor(const RenderPass *render_pass)
struct RenderView * RE_RenderViewGetById(struct RenderResult *rr, int view_id)
void RE_FreeUnusedGPUResources(void)
void RE_ReleaseResult(struct Render *re)
float * RE_RenderLayerGetPass(struct RenderLayer *rl, const char *name, const char *viewname)
struct ViewRender * RE_NewViewRender(struct RenderEngineType *engine_type)
void RE_SetScene(struct Render *re, struct Scene *sce)
void RE_draw_lock_cb(struct Render *re, void *handle, void(*f)(void *handle, bool lock))
void RE_RenderFrame(struct Render *re, struct Main *bmain, struct Scene *scene, struct ViewLayer *single_layer, struct Object *camera_override, int frame, float subframe, bool write_still)
struct Render * RE_NewSceneRender(const struct Scene *scene)
struct Object * RE_GetCamera(struct Render *re)
bool RE_seq_render_active(struct Scene *scene, struct RenderData *rd)
bool RE_passes_have_name(struct RenderLayer *rl)
void RE_RenderAnim(struct Render *re, struct Main *bmain, struct Scene *scene, struct ViewLayer *single_layer, struct Object *camera_override, int sfra, int efra, int tfra)
void RE_FreeAllPersistentData(void)
struct RenderPass * RE_create_gp_pass(struct RenderResult *rr, const char *layername, const char *viewname)
bool RE_HasFloatPixels(const RenderResult *result)
const char * RE_GetActiveRenderView(struct Render *re)
void RE_ReleaseResultImage(struct Render *re)
struct Scene * RE_GetScene(struct Render *re)
void RE_blender_gpu_context_free(Render *re)
void RE_ResultGetFloat(struct Render *re, float *rect)
void RE_SetActiveRenderView(struct Render *re, const char *viewname)
void RE_pass_set_buffer_data(struct RenderPass *pass, float *data)
void RE_InitRenderCB(struct Render *re)
void RE_prepare_viewlayer_cb(struct Render *re, void *handle, bool(*f)(void *handle, ViewLayer *vl, struct Depsgraph *depsgraph))
void RE_GetCameraModelMatrix(const struct Render *re, const struct Object *camera, float r_modelmat[4][4])
void RE_SwapResult(struct Render *re, struct RenderResult **rr)
struct RenderResult * RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
struct RenderLayer * RE_GetRenderLayer(struct RenderResult *rr, const char *name)
void RE_SetReports(struct Render *re, struct ReportList *reports)
void RE_ClearResult(struct Render *re)
void RE_FreeRenderResult(struct RenderResult *rr)
struct RenderResult * RE_AcquireResultRead(struct Render *re)
#define RE_MAXNAME
Definition RE_pipeline.h:34
struct ImBuf * RE_RenderLayerGetPassImBuf(struct RenderLayer *rl, const char *name, const char *viewname)
void RE_ReleaseResultImageViews(struct Render *re, struct RenderResult *rr)
struct Render * RE_GetRender(const char *name)
bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode)
void RE_system_gpu_context_ensure(Render *re)
struct Render * RE_NewInteractiveCompositorRender(const struct Scene *scene)
bool RE_allow_render_generic_object(struct Object *ob)
void RE_stats_draw_cb(struct Render *re, void *handle, void(*f)(void *handle, RenderStats *rs))
struct ImBuf * RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view)
bool RE_is_rendering_allowed(struct Scene *scene, struct ViewLayer *single_layer, struct Object *camera_override, struct ReportList *reports)
struct RenderResult * RE_AcquireResultWrite(struct Render *re)
void RE_display_clear_cb(struct Render *re, void *handle, void(*f)(void *handle, RenderResult *rr))
void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene)
void RE_create_render_pass(struct RenderResult *rr, const char *name, int channels, const char *chan_id, const char *layername, const char *viewname, bool allocate)
void RE_FreeInteractiveCompositorRenders(void)
struct RenderView * RE_RenderViewGetByName(struct RenderResult *rr, const char *viewname)
void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect)
void RE_FreeGPUTextureCaches(void)
RenderResult * RE_DuplicateRenderResult(RenderResult *rr)
void RE_render_result_rect_from_ibuf(struct RenderResult *rr, const struct ImBuf *ibuf, int view_id)
struct ImBuf * RE_RenderPassEnsureImBuf(RenderPass *render_pass)
bool RE_HasSingleLayer(struct Render *re)
void RE_display_init_cb(struct Render *re, void *handle, void(*f)(void *handle, RenderResult *rr))
void RE_system_gpu_context_free(Render *re)
void RE_AcquireResultImageViews(struct Render *re, struct RenderResult *rr)
struct RenderStats * RE_GetStats(struct Render *re)
void RE_SetCamera(struct Render *re, const struct Object *cam_ob)
float RE_filter_value(int type, float x)
bool RE_WriteRenderViewsMovie(struct ReportList *reports, struct RenderResult *rr, struct Scene *scene, struct RenderData *rd, struct MovieWriter **movie_writers, int totvideos, bool preview)
struct RenderPass * RE_pass_find_by_name(struct RenderLayer *rl, const char *name, const char *viewname)
void RE_FreeAllRenderResults(void)
void RE_SetOverrideCamera(struct Render *re, struct Object *cam_ob)
struct GPUTexture * RE_pass_ensure_gpu_texture_cache(struct Render *re, struct RenderPass *rpass)
struct Render * RE_NewRender(const char *name)
bool RE_RenderResult_is_stereo(const RenderResult *result)
void RE_GetCameraWindow(struct Render *re, const struct Object *camera, float r_winmat[4][4])
void RE_InitState(struct Render *re, struct Render *source, struct RenderData *rd, struct ListBase *render_layers, struct ViewLayer *single_layer, int winx, int winy, const rcti *disprect)
void RE_progress_cb(struct Render *re, void *handle, void(*f)(void *handle, float))
void RE_init_threadcount(Render *re)
void RE_FreeViewRender(struct ViewRender *view_render)
ReportList * reports
Definition WM_types.hh:1025
volatile int lock
BMesh const char void * data
BPy_StructRNA * depsgraph
#define MAX_ID_NAME
struct PreviewImage * preview
ListBase passes
Definition RE_pipeline.h:89
char name[RE_MAXNAME]
Definition RE_pipeline.h:81
struct RenderLayer * next
Definition RE_pipeline.h:78
void * exrhandle
Definition RE_pipeline.h:87
struct RenderLayer * prev
Definition RE_pipeline.h:78
struct ImBuf * ibuf
Definition RE_pipeline.h:60
char chan_id[8]
Definition RE_pipeline.h:51
char _pad0[4]
Definition RE_pipeline.h:68
char name[64]
Definition RE_pipeline.h:50
char fullname[64]
Definition RE_pipeline.h:64
char view[64]
Definition RE_pipeline.h:65
struct RenderPass * prev
Definition RE_pipeline.h:48
struct RenderPass * next
Definition RE_pipeline.h:48
struct RenderResult * next
Definition RE_pipeline.h:93
ListBase views
ListBase layers
struct RenderResult * prev
Definition RE_pipeline.h:93
struct StampData * stamp_data
bool passes_allocated
double ppm[2]
struct ImBuf * ibuf
RenderLayer * renlay
const char * statstr
char scene_name[MAX_ID_NAME - 2]
double starttime
double lastframetime
const char * infostr
struct ImBuf * ibuf
Definition RE_pipeline.h:44
struct RenderView * prev
Definition RE_pipeline.h:38
struct RenderView * next
Definition RE_pipeline.h:38
char name[64]
Definition RE_pipeline.h:39
Scene * scene
char name[RE_MAXNAME]