Blender V4.3
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
9#pragma once
10
11#include "DNA_ID.h"
12#include "DNA_listBase.h"
13#include "DNA_vec_types.h"
14
16
17struct GPUTexture;
18struct ImBuf;
19struct Image;
20struct ImageFormatData;
21struct Main;
22struct Object;
23struct RenderData;
24struct RenderResult;
25struct ReportList;
26struct Scene;
27struct StampData;
28struct ViewLayer;
29struct bMovieHandle;
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
36/* this include is what is exposed of render to outside world */
37/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
38
39/* length of the scene name + passname */
40#define RE_MAXNAME ((MAX_ID_NAME - 2) + 10)
41
42/* only used as handle */
43typedef struct Render Render;
44
45typedef struct RenderView {
46 struct RenderView *next, *prev;
47 char name[64]; /* EXR_VIEW_MAXNAME */
48
49 /* Image buffer of a composited layer or a sequencer output.
50 * The ibuf is only allocated if it has an actual data in one of its buffers (float, byte, or
51 * GPU). */
52 struct ImBuf *ibuf;
54
55typedef struct RenderPass {
56 struct RenderPass *next, *prev;
58 char name[64]; /* amount defined in IMB_openexr.hh */
59 char chan_id[8]; /* amount defined in IMB_openexr.hh */
60
61 /* Image buffer which contains data of this pass.
62 *
63 * The data can be either CPU side stored in ibuf->float_buffer, or a GPU-side stored in
64 * ibuf->gpu (during rendering, i.e.).
65 *
66 * The pass data storage is lazily allocated, and until data is actually provided (via either CPU
67 * buffer of GPU texture) the ibuf is not allocated. */
68 struct ImBuf *ibuf;
69
71
72 char fullname[64]; /* EXR_PASS_MAXNAME */
73 char view[64]; /* EXR_VIEW_MAXNAME */
74 int view_id; /* quick lookup */
75
76 char _pad0[4];
78
85typedef struct RenderLayer {
87
89 char name[RE_MAXNAME];
91
93
95 void *exrhandle;
96
98
100
101typedef struct RenderResult {
103
104 /* The number of users of this render result. Default value is 0. The result is freed when
105 * #RE_FreeRenderResult is called with the render result with 0 users. In a way this is
106 * off-by-one, but it is the easiest for the currently used zero-initialized state. The way to
107 * think of it is the number of extra users.
108 *
109 * TODO: Make it an actual number of users, so the #RE_FreeRenderResult frees the result when
110 * the number of users goes to 0.
111 *
112 * TODO: Make it atomic. Currently it is not to allow shallow copying. */
114
115 /* target image size */
117
118 /* The temporary storage to pass image data from #RE_AcquireResultImage.
119 * Is null pointer when the RenderResult is not coming from the #RE_AcquireResultImage, and is
120 * a pointer to an existing ibuf in either RenderView or a RenderPass otherwise. */
121 struct ImBuf *ibuf;
122
123 /* coordinates within final image (after cropping) */
125 /* offset to apply to get a border render in full image */
126 int xof, yof;
127
128 /* the main buffers */
130
131 /* multiView maps to a StringVector in OpenEXR */
132 ListBase views; /* RenderView */
133
134 /* Render layer to display. */
136
137 /* for render results in Image, verify validity for sequences */
139
140 /* for acquire image, to indicate if it there is a combined layer */
142
143 /* render info text */
144 char *text;
145 char *error;
146
148
151
160
161/* *********************** API ******************** */
162
167struct Render *RE_NewRender(const char *name);
168struct Render *RE_GetRender(const char *name);
169
170struct Scene;
171struct Render *RE_NewSceneRender(const struct Scene *scene);
172struct Render *RE_GetSceneRender(const struct Scene *scene);
173
174struct RenderEngineType;
175struct ViewRender *RE_NewViewRender(struct RenderEngineType *engine_type);
176
177/* Creates a new render for interactive compositing of the given scene. If an existing render
178 * exists for the given scene, it is returned instead. See interactive_compositor_renders in
179 * RenderGlobal for more information. */
180struct Render *RE_NewInteractiveCompositorRender(const struct Scene *scene);
181
182/* Assign default dummy callbacks. */
183
188void RE_InitRenderCB(struct Render *re);
189
195void RE_FreeRender(struct Render *re);
196void RE_FreeViewRender(struct ViewRender *view_render);
200void RE_FreeAllRender(void);
201
205void RE_FreeAllRenderResults(void);
206
211void RE_FreeAllPersistentData(void);
215void RE_FreePersistentData(const struct Scene *scene);
216
220void RE_FreeGPUTextureCaches(void);
221
227
231void RE_FreeRenderResult(struct RenderResult *rr);
235struct RenderResult *RE_AcquireResultRead(struct Render *re);
236struct RenderResult *RE_AcquireResultWrite(struct Render *re);
238void RE_ReleaseResult(struct Render *re);
244void RE_AcquireResultImageViews(struct Render *re, struct RenderResult *rr);
248void RE_ReleaseResultImageViews(struct Render *re, struct RenderResult *rr);
249
255void RE_AcquireResultImage(struct Render *re, struct RenderResult *rr, int view_id);
256void RE_ReleaseResultImage(struct Render *re);
257void RE_SwapResult(struct Render *re, struct RenderResult **rr);
258void RE_ClearResult(struct Render *re);
259struct RenderStats *RE_GetStats(struct Render *re);
260
264void RE_ResultGet32(struct Render *re, unsigned int *rect);
265void RE_ResultGetFloat(struct Render *re, float *rect);
266
267void RE_render_result_full_channel_name(char *fullname,
268 const char *layname,
269 const char *passname,
270 const char *viewname,
271 const char *chan_id,
272 int channel);
273
275 const struct ImageFormatData *imf,
276 const float dither,
277 int view_id);
279 const struct ImBuf *ibuf,
280 int view_id);
281
282struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name);
283float *RE_RenderLayerGetPass(struct RenderLayer *rl, const char *name, const char *viewname);
285 const char *name,
286 const char *viewname);
287
288bool RE_HasSingleLayer(struct Render *re);
289
294struct RenderPass *RE_create_gp_pass(struct RenderResult *rr,
295 const char *layername,
296 const char *viewname);
297
298void RE_create_render_pass(struct RenderResult *rr,
299 const char *name,
300 int channels,
301 const char *chan_id,
302 const char *layername,
303 const char *viewname,
304 bool allocate);
305
310void RE_InitState(struct Render *re,
311 struct Render *source,
312 struct RenderData *rd,
313 struct ListBase *render_layers,
314 struct ViewLayer *single_layer,
315 int winx,
316 int winy,
317 const rcti *disprect);
318
324struct Object *RE_GetCamera(struct Render *re);
325void RE_SetOverrideCamera(struct Render *re, struct Object *cam_ob);
331void RE_SetCamera(struct Render *re, const struct Object *cam_ob);
332
336void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect);
337
342
343bool RE_WriteRenderViewsMovie(struct ReportList *reports,
344 struct RenderResult *rr,
345 struct Scene *scene,
346 struct RenderData *rd,
347 struct bMovieHandle *mh,
348 void **movie_ctx_arr,
349 int totvideos,
350 bool preview);
351
361void RE_RenderFrame(struct Render *re,
362 struct Main *bmain,
363 struct Scene *scene,
364 struct ViewLayer *single_layer,
365 struct Object *camera_override,
366 int frame,
367 float subframe,
368 bool write_still);
372void RE_RenderAnim(struct Render *re,
373 struct Main *bmain,
374 struct Scene *scene,
375 struct ViewLayer *single_layer,
376 struct Object *camera_override,
377 int sfra,
378 int efra,
379 int tfra);
380#ifdef WITH_FREESTYLE
381void RE_RenderFreestyleStrokes(struct Render *re,
382 struct Main *bmain,
383 struct Scene *scene,
384 bool render);
385void RE_RenderFreestyleExternal(struct Render *re);
386#endif
387
388void RE_SetActiveRenderView(struct Render *re, const char *viewname);
389const char *RE_GetActiveRenderView(struct Render *re);
390
394void RE_SetReports(struct Render *re, struct ReportList *reports);
395
399void RE_PreviewRender(struct Render *re, struct Main *bmain, struct Scene *scene);
400
404bool RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
405
407 void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty);
408
409/* Display and event callbacks. */
410
414void RE_display_init_cb(struct Render *re,
415 void *handle,
416 void (*f)(void *handle, RenderResult *rr));
417void RE_display_clear_cb(struct Render *re,
418 void *handle,
419 void (*f)(void *handle, RenderResult *rr));
420void RE_display_update_cb(struct Render *re,
421 void *handle,
422 void (*f)(void *handle, RenderResult *rr, struct rcti *rect));
423void RE_stats_draw_cb(struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
424void RE_progress_cb(struct Render *re, void *handle, void (*f)(void *handle, float));
425void RE_draw_lock_cb(struct Render *re, void *handle, void (*f)(void *handle, bool lock));
426void RE_test_break_cb(struct Render *re, void *handle, bool (*f)(void *handle));
427void RE_prepare_viewlayer_cb(struct Render *re,
428 void *handle,
429 bool (*f)(void *handle, ViewLayer *vl, struct Depsgraph *depsgraph));
430void RE_current_scene_update_cb(struct Render *re,
431 void *handle,
432 void (*f)(void *handle, struct Scene *scene));
433
437
440
446float RE_filter_value(int type, float x);
447
448bool RE_seq_render_active(struct Scene *scene, struct RenderData *rd);
449
453bool RE_layers_have_name(struct RenderResult *result);
454bool RE_passes_have_name(struct RenderLayer *rl);
455
457 const char *name,
458 const char *viewname);
463 int passtype,
464 const char *viewname);
465
471void RE_pass_set_buffer_data(struct RenderPass *pass, float *data);
472
476struct GPUTexture *RE_pass_ensure_gpu_texture_cache(struct Render *re, struct RenderPass *rpass);
477
478/* shaded view or baking options */
479#define RE_BAKE_NORMALS 0
480#define RE_BAKE_DISPLACEMENT 1
481#define RE_BAKE_AO 2
482
483void RE_GetCameraWindow(struct Render *re, const struct Object *camera, float r_winmat[4][4]);
487void RE_GetCameraWindowWithOverscan(const struct Render *re, float overscan, float r_winmat[4][4]);
488void RE_GetCameraModelMatrix(const struct Render *re,
489 const struct Object *camera,
490 float r_modelmat[4][4]);
491
492void RE_GetWindowMatrixWithOverscan(bool is_ortho,
493 float clip_start,
494 float clip_end,
495 rctf viewplane,
496 float overscan,
497 float r_winmat[4][4]);
498
499struct Scene *RE_GetScene(struct Render *re);
500void RE_SetScene(struct Render *re, struct Scene *sce);
501
502bool RE_is_rendering_allowed(struct Scene *scene,
503 struct ViewLayer *single_layer,
504 struct Object *camera_override,
505 struct ReportList *reports);
506
508
509/******* defined in `render_result.cc` *********/
510
511bool RE_HasCombinedLayer(const RenderResult *result);
512bool RE_HasFloatPixels(const RenderResult *result);
513bool RE_RenderResult_is_stereo(const RenderResult *result);
514struct RenderView *RE_RenderViewGetById(struct RenderResult *rr, int view_id);
515struct RenderView *RE_RenderViewGetByName(struct RenderResult *rr, const char *viewname);
516
518
519struct ImBuf *RE_RenderPassEnsureImBuf(RenderPass *render_pass);
520struct ImBuf *RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view);
521
522/* Returns true if the pass is a color (as opposite of data) and needs to be color managed. */
523bool RE_RenderPassIsColor(const RenderPass *render_pass);
524
525#ifdef __cplusplus
526}
527#endif
ID and Library types, which are fundamental for SDNA.
#define MAX_ID_NAME
Definition DNA_ID.h:377
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])
struct RenderLayer RenderLayer
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_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))
struct RenderStats RenderStats
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)
struct RenderResult RenderResult
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:40
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_WriteRenderViewsMovie(struct ReportList *reports, struct RenderResult *rr, struct Scene *scene, struct RenderData *rd, struct bMovieHandle *mh, void **movie_ctx_arr, int totvideos, bool preview)
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)
struct RenderView RenderView
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)
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))
struct RenderPass RenderPass
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)
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)
volatile int lock
const Depsgraph * depsgraph
struct PreviewImage * preview
ListBase passes
Definition RE_pipeline.h:97
struct RenderLayer * next
Definition RE_pipeline.h:86
void * exrhandle
Definition RE_pipeline.h:95
struct RenderLayer * prev
Definition RE_pipeline.h:86
struct ImBuf * ibuf
Definition RE_pipeline.h:68
char chan_id[8]
Definition RE_pipeline.h:59
char _pad0[4]
Definition RE_pipeline.h:76
char fullname[64]
Definition RE_pipeline.h:72
struct RenderPass * prev
Definition RE_pipeline.h:56
struct RenderPass * next
Definition RE_pipeline.h:56
struct RenderResult * next
ListBase views
ListBase layers
struct RenderResult * prev
struct StampData * stamp_data
bool passes_allocated
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:52
struct RenderView * prev
Definition RE_pipeline.h:46
struct RenderView * next
Definition RE_pipeline.h:46