17#include <forward_list>
175 const char *filepath_override);
191 return G.is_break ==
true;
201 float megs_used_memory, megs_peak_memory;
202 char info_time_str[32];
207 megs_used_memory = (
mem_in_use) / (1024.0 * 1024.0);
208 megs_peak_memory = (peak_memory) / (1024.0 * 1024.0);
218 char *message =
BLI_sprintfN(
RPT_(
"Fra:%d Mem:%.2fM (Peak %.2fM) | Time:%s | %s"),
226 fprintf(stdout,
"%s\n", message);
260 return rpass ? rpass->
ibuf :
nullptr;
285 void *exrhandle,
const char *colorspace,
bool predivide,
int rectx,
int recty)
369 std::swap(re->
result, *rr);
419 if (rv->
ibuf ==
nullptr) {
472 if (rv->
ibuf ==
nullptr) {
525 re = MEM_new<Render>(
"new render");
537 ViewRender *view_render = MEM_new<ViewRender>(
"new view render");
543#define MAX_SCENE_RENDER_NAME (MAX_ID_NAME + 1024 + 2)
548 BLI_snprintf(render_name, max_size,
"%s %s", scene->id.lib->id.name, scene->id.name);
551 BLI_snprintf(render_name, max_size,
"%s", scene->id.name);
574 return RenderGlobal.interactive_compositor_renders.lookup_or_add_cb(render_name, [&]() {
575 Render *render = MEM_new<Render>(
"New Interactive Compositor Render");
576 STRNCPY(render->name, render_name);
612 MEM_delete(view_render);
638 re->result =
nullptr;
639 re->pushedresult =
nullptr;
640 re->result_has_gpu_texture_caches =
false;
647 if (re->engine !=
nullptr) {
650 re->engine =
nullptr;
665 if (result !=
nullptr) {
707 if (!(scene->use_nodes && scene->nodetree &&
719 if (snode.
nodetree == scene->nodetree) {
739 Render *interactive_compositor_render =
740 RenderGlobal.interactive_compositor_renders.lookup_default(re->name,
nullptr);
741 if (interactive_compositor_render) {
823 memcpy(to, from,
sizeof(*to));
835 const rcti *disprect)
864 re->
r.
mode &= ~R_BORDER;
893 bool have_layer =
false;
921 re->
result = MEM_cnew<RenderResult>(
"new render result");
1080 const int orig_rectx = re->
rectx, orig_recty = re->
recty;
1110 re->
rectx = orig_rectx;
1111 re->
recty = orig_recty;
1126 if (camera ==
nullptr) {
1147 int winx = re->
winx, winy = re->
winy;
1189 if (node->type == CMP_NODE_R_LAYERS) {
1190 return reinterpret_cast<Scene *
>(node->id);
1192 else if (node->type == CMP_NODE_CRYPTOMATTE &&
1195 return reinterpret_cast<Scene *
>(node->id);
1208 if (ntree ==
nullptr) {
1211 if (scene->use_nodes ==
false) {
1214 if ((scene->r.scemode &
R_DOCOMP) == 0) {
1218 for (
const bNode *node : ntree->all_nodes()) {
1220 if (node_scene && node_scene == scene) {
1239 if (node->type == CMP_NODE_COMPOSITE && node->flag &
NODE_DO_OUTPUT) {
1268 if (node_scene == re->
scene) {
1273 if (scenes_rendered.
contains(node_scene)) {
1281 scenes_rendered.
add_new(node_scene);
1298 memcpy(&i, &re->
i,
sizeof(i));
1308 bool update_newframe =
false;
1332 update_newframe =
true;
1368 if (update_newframe) {
1379 &compositor_render_context,
1384 ntree->
runtime->stats_draw =
nullptr;
1385 ntree->
runtime->test_break =
nullptr;
1386 ntree->
runtime->progress =
nullptr;
1393 if (re->
result !=
nullptr) {
1407 if (render_pass->ibuf) {
1459 static int recurs_depth = 0;
1462 int cfra = re->
r.
cfra;
1464 int view_id, tot_views;
1497 for (view_id = 0; view_id < tot_views; view_id++) {
1498 context.view_id = view_id;
1508 ibuf_arr[view_id] =
nullptr;
1518 for (view_id = 0; view_id < tot_views; view_id++) {
1522 if (ibuf_arr[view_id]) {
1532 if (recurs_depth == 0) {
1571 bool render_seq =
false;
1605 if (re->
result !=
nullptr) {
1626 if (scene->r.scemode &
R_DOCOMP && scene->use_nodes) {
1627 for (
bNode *node : scene->nodetree->all_nodes()) {
1628 if (node->type == CMP_NODE_R_LAYERS && (node->flag &
NODE_MUTED) == 0) {
1630 if (sce->
camera ==
nullptr) {
1633 if (sce->
camera ==
nullptr) {
1637 "No camera found in scene \"%s\" (used in compositing of scene \"%s\")",
1639 scene->id.name + 2);
1648 const bool ok = (camera_override !=
nullptr || scene->camera !=
nullptr);
1658 bool active_view =
false;
1660 if (camera ==
nullptr || (scene->r.scemode &
R_MULTIVIEW) == 0) {
1672 if (view_camera == camera) {
1677 "Camera \"%s\" is not a multi-view camera",
1678 camera->id.name + 2);
1696 if (camera_override ==
nullptr && scene->camera ==
nullptr) {
1708 (seq->scene !=
nullptr))
1710 if (!seq->scene_camera) {
1711 if (!seq->scene->camera &&
1715 Object *
override = (seq->scene ==
scene) ? camera_override :
nullptr;
1738 for (
const bNode *node : ntree->all_nodes()) {
1739 if (
ELEM(node->type, CMP_NODE_COMPOSITE, CMP_NODE_OUTPUT_FILE)) {
1775 if (
size_t(width) * height > (
size_t(max_texture_size) * max_texture_size) / 4) {
1776 BKE_report(reports,
RPT_ERROR,
"Render size too large for GPU, use CPU compositor instead");
1788 const int scemode = scene->r.scemode;
1791 if (scene->r.border.xmax <= scene->r.border.xmin ||
1792 scene->r.border.ymax <= scene->r.border.ymin)
1806 else if ((scemode &
R_DOCOMP) && scene->use_nodes) {
1808 if (!scene->nodetree) {
1845 memset(&baker, 0,
sizeof(baker));
1876 const bool anim_init)
1904 disprect.
xmax = winx;
1905 disprect.
ymax = winy;
1936 RE_InitState(re,
nullptr, &scene->
r, &scene->view_layers, single_layer, winx, winy, &disprect);
2008 const float subframe,
2009 const bool write_still)
2015 G.is_rendering =
true;
2017 scene->r.cfra = frame;
2018 scene->r.subframe = subframe;
2021 re, &scene->
r, bmain, scene, single_layer, camera_override,
false,
false))
2024 memcpy(&rd, &scene->r,
sizeof(rd));
2037 if (should_write && !
G.is_break) {
2040 printf(
"Error: can't write single images with a movie format!\n");
2073 G.is_rendering =
false;
2076#ifdef WITH_FREESTYLE
2079static void change_renderdata_engine(
Render *re,
const char *new_engine)
2090static bool use_eevee_for_freestyle_render(
Render *re)
2096void RE_RenderFreestyleStrokes(
Render *re,
Main *bmain,
Scene *scene,
const bool render)
2100 char scene_engine[32];
2102 if (use_eevee_for_freestyle_render(re)) {
2108 change_renderdata_engine(re, scene_engine);
2113void RE_RenderFreestyleExternal(
Render *re)
2152 void **movie_ctx_arr,
2153 const int totvideos,
2166 const float dither = scene->r.dither_intensity;
2170 for (view_id = 0; view_id < totvideos; view_id++) {
2178 preview ? scene->r.
psfra : scene->r.sfra,
2191 printf(
"Append frame %d\n", scene->r.cfra);
2196 ImBuf *ibuf_arr[3] = {
nullptr};
2201 for (i = 0; i < 2; i++) {
2212 preview ? scene->r.
psfra : scene->r.sfra,
2221 for (i = 0; i < 3; i++) {
2236 const int totvideos,
2237 const char *filepath_override)
2249 if (do_write_file) {
2258 if (filepath_override) {
2259 STRNCPY(filepath, filepath_override);
2266 &scene->r.im_format,
2283 std::string message = fmt::format(
"Time: {}", filepath);
2285 if (do_write_file) {
2288 message = fmt::format(
"{} (Saving: {})", message, filepath);
2292 printf(
"%s\n", message.c_str());
2302 fputc(
'\n', stdout);
2314 size_t width, height;
2337 for (i = 0; i < totvideos; i++) {
2359 memcpy(&rd, &scene->r,
sizeof(rd));
2361 const int cfra_old = rd.
cfra;
2362 const float subframe_old = rd.
subframe;
2363 int nfra, totrendered = 0, totskipped = 0;
2383 size_t width, height;
2385 bool is_error =
false;
2390 if (mh ==
nullptr) {
2396 re->
movie_ctx_arr = MEM_cnew_array<void *>(totvideos,
"Movies' Context");
2398 for (i = 0; i < totvideos; i++) {
2427 G.is_rendering =
true;
2432 scene->r.subframe = 0.0f;
2433 for (nfra = sfra, scene->r.cfra = sfra; scene->r.cfra <= efra; scene->r.cfra++) {
2463 if (nfra != scene->r.cfra) {
2471 if (
is_movie ==
false && do_write_file) {
2484 if (!is_multiview_name) {
2487 printf(
"skipping existing frame \"%s\"\n", filepath);
2494 bool is_skip =
false;
2507 "skipping existing frame \"%s\" for view \"%s\"\n", filepath_view, srv->name);
2520 if (!is_multiview_name) {
2545 re->
r.
cfra = scene->r.cfra;
2556 if (!
G.is_break && should_write) {
2566 if (
G.is_break ==
true) {
2568 if (
is_movie ==
false && do_write_file) {
2570 if (!is_multiview_name) {
2598 if (
G.is_break ==
false) {
2612 if (totskipped && totrendered == 0) {
2616 scene->r.cfra = cfra_old;
2617 scene->r.subframe = subframe_old;
2628 G.is_rendering =
false;
2680 disprect.
xmin = scene->r.border.xmin * winx;
2681 disprect.
xmax = scene->r.border.xmax * winx;
2683 disprect.
ymin = scene->r.border.ymin * winy;
2684 disprect.
ymax = scene->r.border.ymax * winy;
2688 disprect.
xmax = winx;
2689 disprect.
ymax = winy;
2698 if (re ==
nullptr) {
2701 RE_InitState(re,
nullptr, &scene->
r, &scene->view_layers,
nullptr, winx, winy, &disprect);
2726 for (rpass =
static_cast<RenderPass *
>(layer->passes.first); rpass; rpass = rpass->
next) {
2732 if (rpass ==
nullptr) {
2735 "%s: no Combined pass found in the render layer '%s'",
2741 if (ibuf->
x == layer->rectx && ibuf->
y == layer->recty) {
2748 sizeof(
float[4]) * layer->rectx * layer->recty);
2751 if ((ibuf->
x - x >= layer->rectx) && (ibuf->
y - y >= layer->recty)) {
2760 IMB_rectcpy(ibuf_clip, ibuf, 0, 0, x, y, layer->rectx, layer->recty);
2764 sizeof(
float[4]) * layer->rectx * layer->recty);
2769 reports,
RPT_ERROR,
"%s: failed to allocate clip buffer '%s'", __func__, filepath);
2775 "%s: incorrect dimensions for partial copy '%s'",
2802 return (((
RenderLayer *)result->layers.first)->name[0] !=
'\0');
2811 if (!
STREQ(rp->name,
"Combined")) {
2822 if (
STREQ(rp->name, name)) {
2823 if (viewname ==
nullptr || viewname[0] ==
'\0') {
2826 if (
STREQ(rp->view, viewname)) {
2836#define CHECK_PASS(NAME) \
2837 if (passtype == SCE_PASS_##NAME) { \
2838 return RE_pass_find_by_name(rl, RE_PASSNAME_##NAME, viewname); \
2877 rl = MEM_cnew<RenderLayer>(layername);
AnimData * BKE_animdata_from_id(const ID *id)
AnimationEvalContext BKE_animsys_eval_context_construct(struct Depsgraph *depsgraph, float eval_time) ATTR_WARN_UNUSED_RESULT
void BKE_animsys_evaluate_animdata(struct ID *id, struct AnimData *adt, const struct AnimationEvalContext *anim_eval_context, eAnimData_Recalc recalc, bool flush_to_original)
void BKE_callback_exec_id(Main *bmain, ID *id, eCbEvent evt)
void BKE_callback_exec_string(Main *bmain, eCbEvent evt, const char *str)
@ BKE_CB_EVT_RENDER_COMPLETE
@ BKE_CB_EVT_RENDER_STATS
@ BKE_CB_EVT_RENDER_WRITE
@ BKE_CB_EVT_RENDER_CANCEL
Camera data-block and utility functions.
struct Object * BKE_camera_multiview_render(const struct Scene *scene, struct Object *camera, const char *viewname)
void BKE_imbuf_stamp_info(const RenderResult *rr, ImBuf *ibuf)
void BKE_stamp_info_from_imbuf(RenderResult *rr, ImBuf *ibuf)
StampData * BKE_stamp_data_copy(const StampData *stamp_data)
void BKE_render_result_stamp_info(Scene *scene, Object *camera, RenderResult *rr, bool allocate_only)
void BKE_image_all_free_anim_ibufs(Main *bmain, int cfra)
void BKE_image_stamp_buf(Scene *scene, Object *camera, const StampData *stamp_data_template, unsigned char *rect, float *rectf, int width, int height)
bool BKE_image_render_write(ReportList *reports, RenderResult *rr, const Scene *scene, const bool stamp, const char *filepath_basis, const ImageFormatData *format=nullptr, bool save_as_render=true)
Object * BKE_view_layer_camera_find(const Scene *scene, ViewLayer *view_layer)
ViewLayer * BKE_view_layer_context_active_PLACEHOLDER(const Scene *scene)
ViewLayer * BKE_view_layer_default_render(const Scene *scene)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
#define NODE_CUSTOM_GROUP
void BKE_ptcache_bake(struct PTCacheBaker *baker)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_report(ReportList *reports, eReportType type, const char *message)
void BKE_render_resolution(const RenderData *r, const bool use_crop, int *r_width, int *r_height)
float BKE_scene_ctime_get(const Scene *scene)
int BKE_scene_multiview_num_views_get(const RenderData *rd)
bool BKE_scene_multiview_is_render_view_active(const RenderData *rd, const SceneRenderView *srv)
const char * BKE_scene_multiview_view_id_suffix_get(const RenderData *rd, int view_id)
int BKE_render_num_threads(const RenderData *r)
bool BKE_scene_camera_switch_update(Scene *scene)
Depsgraph * BKE_scene_ensure_depsgraph(Main *bmain, Scene *scene, ViewLayer *view_layer)
float BKE_scene_frame_get(const Scene *scene)
void BKE_scene_multiview_videos_dimensions_get(const RenderData *rd, size_t width, size_t height, size_t *r_width, size_t *r_height)
void BKE_scene_update_sound(Depsgraph *depsgraph, Main *bmain)
int BKE_scene_multiview_num_videos_get(const RenderData *rd)
void BKE_scene_multiview_filepath_get(const SceneRenderView *srv, const char *filepath, char *r_filepath)
int BKE_scene_multiview_view_id_get(const RenderData *rd, const char *viewname)
void BKE_sound_reset_scene_specs(struct Scene *scene)
bMovieHandle * BKE_movie_handle_get(char imtype)
File and directory operations.
bool BLI_file_touch(const char *filepath) ATTR_NONNULL(1)
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
int BLI_delete(const char *path, bool dir, bool recursive) ATTR_NONNULL()
size_t BLI_file_size(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
bool BLI_file_ensure_parent_dir_exists(const char *filepath) ATTR_NONNULL(1)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_BACKWARD(type, var, list)
int BLI_listbase_count_at_most(const struct ListBase *listbase, int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findstringindex(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
char * BLI_sprintfN(const char *__restrict format,...) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_PRINTF_FORMAT(1
#define STRNCPY(dst, src)
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
int bool bool BLI_str_endswith(const char *__restrict str, const char *__restrict end) ATTR_NONNULL(1
#define THREAD_LOCK_WRITE
#define BLI_MUTEX_INITIALIZER
void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode)
int BLI_thread_is_main(void)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
pthread_mutex_t ThreadMutex
Platform independent time functions.
double BLI_time_now_seconds(void)
size_t BLI_timecode_string_from_time_simple(char *str, size_t maxncpy, double time_seconds) ATTR_NONNULL()
#define STREQLEN(a, b, n)
Depsgraph * DEG_graph_new(Main *bmain, Scene *scene, ViewLayer *view_layer, eEvaluationMode mode)
void DEG_graph_id_tag_update(Main *bmain, Depsgraph *depsgraph, ID *id, unsigned int flags)
void DEG_graph_free(Depsgraph *graph)
void DEG_evaluate_on_framechange(Depsgraph *graph, float frame, DepsgraphEvaluateSyncWriteback sync_writeback=DEG_EVALUATE_SYNC_WRITEBACK_NO)
void DEG_graph_build_for_render_pipeline(Depsgraph *graph)
void DEG_debug_name_set(Depsgraph *depsgraph, const char *name)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
#define ID_IS_LINKED(_id)
Object groups, one object can be in many groups at once.
@ CMP_NODE_CRYPTOMATTE_SOURCE_RENDER
Object is a sort of wrapper for general info.
#define RE_PASSNAME_COMBINED
@ SCE_VIEWS_FORMAT_MULTIVIEW
#define STEREO_RIGHT_NAME
@ SCE_COMPOSITOR_DEVICE_GPU
void FRS_init_stroke_renderer(struct Render *re)
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)
int GPU_max_texture_size()
GPUContext * GPU_context_create(void *ghost_window, void *ghost_context)
void GPU_context_discard(GPUContext *)
void GPU_context_active_set(GPUContext *)
eGPUBackendType GPU_backend_get_type()
ImBuf * IMB_colormanagement_imbuf_for_write(ImBuf *ibuf, bool save_as_render, bool allocate_result, const ImageFormatData *image_format)
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
ImBuf * IMB_loadiffname(const char *filepath, int flags, char colorspace[IM_MAX_SPACE])
ImBuf * IMB_stereo3d_ImBuf(const ImageFormatData *im_format, ImBuf *ibuf_left, ImBuf *ibuf_right)
void IMB_rectcpy(ImBuf *dbuf, const ImBuf *sbuf, int destx, int desty, int srcx, int srcy, int width, int height)
void IMB_float_from_rect(ImBuf *ibuf)
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a or normal between camera
@ RE_USE_CUSTOM_FREESTYLE
struct GPUContext GPUContext
bool contains(const Key &key) const
void add_new(const Key &key)
void save_file_outputs(Scene *scene)
const Depsgraph * depsgraph
struct ImBuf * IMB_allocImBuf(unsigned int, unsigned int, unsigned char, unsigned int)
void IMB_freeImBuf(ImBuf *)
void SEQ_cache_cleanup(Scene *scene)
void RE_SetCamera(Render *re, const Object *cam_ob)
Object * RE_GetCamera(Render *re)
bool RE_engine_use_persistent_data(RenderEngine *engine)
RenderEngineType * RE_engines_find(const char *idname)
RenderEngine * RE_engine_create(RenderEngineType *type)
bool RE_engine_render(Render *re, bool do_all)
void RE_engine_free(RenderEngine *engine)
size_t(* MEM_get_peak_memory)(void)
void(* MEM_reset_peak_memory)(void)
size_t(* MEM_get_memory_in_use)(void)
void MEM_freeN(void *vmemh)
void ntreeCompositExecTree(Render *render, Scene *scene, bNodeTree *ntree, RenderData *rd, const char *view_name, blender::realtime_compositor::RenderContext *render_context, blender::realtime_compositor::Profiler *profiler)
void ntreeCompositTagRender(Scene *scene)
void RE_compositor_free(Render &render)
void SEQ_render_new_render_data(Main *bmain, Depsgraph *depsgraph, Scene *scene, int rectx, int recty, int preview_render_size, int for_render, SeqRenderData *r_context)
ImBuf * SEQ_render_give_ibuf(const SeqRenderData *context, float timeline_frame, int chanshown)
void SEQ_render_imbuf_from_sequencer_space(Scene *scene, ImBuf *ibuf)
bool render_result_exr_file_read_path(RenderResult *rr, RenderLayer *rl_single, ReportList *reports, const char *filepath)
void render_result_single_layer_end(Render *re)
void render_result_free_gpu_texture_caches(RenderResult *rr)
bool render_result_exr_file_cache_read(Render *re)
void RE_render_result_rect_from_ibuf(RenderResult *rr, const ImBuf *ibuf, const int view_id)
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)
void render_result_view_new(RenderResult *rr, const char *viewname)
RenderPass * render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, const char *name, const char *viewname, const char *chan_id, const bool allocate)
ImBuf * RE_render_result_rect_to_ibuf(RenderResult *rr, const ImageFormatData *imf, const float dither, const int view_id)
void render_result_passes_allocated_ensure(RenderResult *rr)
void render_result_free(RenderResult *rr)
RenderResult * render_result_new_from_exr(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname)
RenderView * RE_RenderViewGetById(RenderResult *rr, const int view_id)
void render_result_single_layer_begin(Render *re)
void render_result_rect_get_pixels(RenderResult *rr, uint *rect, int rectx, int recty, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const int view_id)
RenderResult * render_result_new(Render *re, const rcti *partrct, const char *layername, const char *viewname)
void render_result_views_shallowcopy(RenderResult *dst, RenderResult *src)
const char * RE_engine_id_BLENDER_EEVEE_NEXT
static bool is_movie(wmDrag *drag)
static void stats_background(void *, RenderStats *rs)
bool RE_HasSingleLayer(Render *re)
void RE_ReleaseResultImageViews(Render *re, RenderResult *rr)
void RE_stats_draw_cb(Render *re, void *handle, void(*f)(void *handle, RenderStats *rs))
static bool node_tree_has_composite_output(const bNodeTree *node_tree)
static void float_nothing(void *, float)
static void stats_nothing(void *, RenderStats *)
static void re_free_persistent_data(Render *re)
void RE_FreeRender(Render *re)
static void result_nothing(void *, RenderResult *)
static void do_render_engine(Render *re)
RenderResult * RE_MultilayerConvert(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
void * RE_blender_gpu_context_ensure(Render *re)
void RE_ReleaseResultImage(Render *re)
void RE_progress_cb(Render *re, void *handle, void(*f)(void *handle, float))
void RE_PreviewRender(Render *re, Main *bmain, Scene *sce)
void RE_test_break_cb(Render *re, void *handle, bool(*f)(void *handle))
void * RE_system_gpu_context_get(Render *re)
static bool node_tree_has_any_compositor_output(const bNodeTree *ntree)
RenderPass * RE_pass_find_by_type(RenderLayer *rl, int passtype, const char *viewname)
static bool default_break(void *)
static void do_render_compositor_scenes(Render *re)
static void do_render_compositor_scene(Render *re, Scene *sce, int cfra)
static void re_movie_free_all(Render *re, bMovieHandle *mh, int totvideos)
bool RE_WriteRenderViewsMovie(ReportList *reports, RenderResult *rr, Scene *scene, RenderData *rd, bMovieHandle *mh, void **movie_ctx_arr, const int totvideos, bool preview)
void RE_current_scene_update_cb(Render *re, void *handle, void(*f)(void *handle, Scene *scene))
void RE_FreeUnusedGPUResources()
RenderPass * RE_pass_find_by_name(RenderLayer *rl, const char *name, const char *viewname)
void RE_prepare_viewlayer_cb(Render *re, void *handle, bool(*f)(void *handle, ViewLayer *vl, Depsgraph *depsgraph))
void RE_InitState(Render *re, Render *source, RenderData *rd, ListBase *, ViewLayer *single_layer, int winx, int winy, const rcti *disprect)
void render_copy_renderdata(RenderData *to, RenderData *from)
void RE_FreeAllPersistentData()
void RE_ResultGet32(Render *re, uint *rect)
void RE_FreePersistentData(const Scene *scene)
static Scene * get_scene_referenced_by_node(const bNode *node)
static bool check_valid_camera_multiview(Scene *scene, Object *camera, ReportList *reports)
static void re_init_resolution(Render *re, Render *source, int winx, int winy, const rcti *disprect)
std::forward_list< Render * > render_list
static void render_update_depsgraph(Render *re)
void RE_AcquireResultImage(Render *re, RenderResult *rr, const int view_id)
Render * RE_NewRender(const char *name)
static int check_compositor_output(Scene *scene)
void RE_layer_load_from_file(RenderLayer *layer, ReportList *reports, const char *filepath, int x, int y)
#define MAX_SCENE_RENDER_NAME
void RE_ClearResult(Render *re)
void RE_SwapResult(Render *re, RenderResult **rr)
void RE_FreeAllRenderResults()
void RE_FreeRenderResult(RenderResult *rr)
ImBuf * RE_RenderLayerGetPassImBuf(RenderLayer *rl, const char *name, const char *viewname)
Render * RE_NewInteractiveCompositorRender(const Scene *scene)
RenderResult * RE_AcquireResultWrite(Render *re)
static struct @1358 RenderGlobal
static void render_pipeline_free(Render *re)
void RE_InitRenderCB(Render *re)
static void current_scene_nothing(void *, Scene *)
void RE_RenderFrame(Render *re, Main *bmain, Scene *scene, ViewLayer *single_layer, Object *camera_override, const int frame, const float subframe, const bool write_still)
static bool do_write_image_or_movie(Render *re, Main *bmain, Scene *scene, bMovieHandle *mh, const int totvideos, const char *filepath_override)
static int check_valid_camera(Scene *scene, Object *camera_override, ReportList *reports)
static void scene_render_name_get(const Scene *scene, const size_t max_size, char *render_name)
blender::Map< std::string, Render * > interactive_compositor_renders
static void render_result_uncrop(Render *re)
void RE_ReferenceRenderResult(RenderResult *rr)
Render * RE_NewSceneRender(const Scene *scene)
Scene * RE_GetScene(Render *re)
Render * RE_GetRender(const char *name)
static bool is_compositing_possible_on_gpu(Scene *scene, ReportList *reports)
void RE_blender_gpu_context_free(Render *re)
static void render_result_disprect_to_full_resolution(Render *re)
static void render_callback_exec_string(Render *re, Main *bmain, eCbEvent evt, const char *str)
bool RE_seq_render_active(Scene *scene, RenderData *rd)
bool RE_passes_have_name(RenderLayer *rl)
static void do_render_sequencer(Render *re)
RenderResult * RE_AcquireResultRead(Render *re)
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
void RE_ReleaseResult(Render *re)
const char * RE_GetActiveRenderView(Render *re)
static void render_compositor_stats(void *arg, const char *str)
void RE_RenderAnim(Render *re, Main *bmain, Scene *scene, ViewLayer *single_layer, Object *camera_override, int sfra, int efra, int tfra)
static void do_render_full_pipeline(Render *re)
static bool render_init_from_main(Render *re, const RenderData *rd, Main *bmain, Scene *scene, ViewLayer *single_layer, Object *camera_override, const bool anim, const bool anim_init)
static void do_render_compositor(Render *re)
void RE_system_gpu_context_ensure(Render *re)
void RE_display_clear_cb(Render *re, void *handle, void(*f)(void *handle, RenderResult *rr))
void RE_FreeGPUTextureCaches()
bool RE_layers_have_name(RenderResult *result)
bool RE_allow_render_generic_object(Object *ob)
void RE_result_load_from_file(RenderResult *result, ReportList *reports, const char *filepath)
void RE_display_update_cb(Render *re, void *handle, void(*f)(void *handle, RenderResult *rr, rcti *rect))
static void get_videos_dimensions(const Render *re, const RenderData *rd, size_t *r_width, size_t *r_height)
static bool compositor_needs_render(Scene *scene)
static void renderresult_stampinfo(Render *re)
static void render_init_depsgraph(Render *re)
ViewRender * RE_NewViewRender(RenderEngineType *engine_type)
Render * RE_GetSceneRender(const Scene *scene)
bool RE_is_rendering_allowed(Scene *scene, ViewLayer *single_layer, Object *camera_override, ReportList *reports)
RenderStats * RE_GetStats(Render *re)
static void renderresult_set_passes_metadata(Render *re)
static void update_physics_cache(Render *re, Scene *scene, ViewLayer *view_layer, const bool)
void RE_draw_lock_cb(Render *re, void *handle, void(*f)(void *handle, bool lock))
void RE_SetReports(Render *re, ReportList *reports)
void RE_AcquireResultImageViews(Render *re, RenderResult *rr)
static bool render_scene_has_layers_to_render(Scene *scene, ViewLayer *single_layer)
bool RE_ReadRenderResult(Scene *scene, Scene *scenode)
void RE_SetScene(Render *re, Scene *sce)
float * RE_RenderLayerGetPass(RenderLayer *rl, const char *name, const char *viewname)
void RE_system_gpu_context_free(Render *re)
static void render_callback_exec_id(Render *re, Main *bmain, ID *id, eCbEvent evt)
void RE_FreeViewRender(ViewRender *view_render)
static bool check_valid_compositing_camera(Scene *scene, Object *camera_override, ReportList *reports)
static void result_rcti_nothing(void *, RenderResult *, rcti *)
void RE_SetActiveRenderView(Render *re, const char *viewname)
RenderLayer * render_get_single_layer(Render *re, RenderResult *rr)
RenderPass * RE_create_gp_pass(RenderResult *rr, const char *layername, const char *viewname)
void RE_init_threadcount(Render *re)
static bool prepare_viewlayer_nothing(void *, ViewLayer *, Depsgraph *)
static void re_gpu_texture_caches_free(Render *re)
void RE_display_init_cb(Render *re, void *handle, void(*f)(void *handle, RenderResult *rr))
_W64 unsigned int uintptr_t
void SEQ_relations_free_imbuf(Scene *scene, ListBase *seqbase, bool for_render)
struct RenderEngine * engine
ThreadRWMutex resultmutex
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
struct Depsgraph * depsgraph
struct ViewLayer * view_layer
struct ImageFormatData im_format
struct StampData * stamp_data
void * blender_gpu_context
Scene * pipeline_scene_eval
blender::render::RealtimeCompositor * compositor
bool(* prepare_viewlayer_cb)(void *handle, struct ViewLayer *vl, struct Depsgraph *depsgraph)
void display_update(RenderResult *render_result, rcti *rect) override
bool test_break() override
bool result_has_gpu_texture_caches
void * system_gpu_context
void(* current_scene_update_cb)(void *handle, struct Scene *scene)
void(* progress_cb)(void *handle, float i)
void display_init(RenderResult *render_result) override
void(* display_init_cb)(void *handle, RenderResult *rr)
struct Depsgraph * pipeline_depsgraph
void progress(float progress) override
void(* display_clear_cb)(void *handle, RenderResult *rr)
bool(* test_break_cb)(void *handle)
char single_view_layer[MAX_NAME]
void display_clear(RenderResult *render_result) override
void current_scene_update(struct Scene *scene) override
struct ReportList * reports
struct Object * camera_override
void(* draw_lock_cb)(void *handle, bool lock)
void(* display_update_cb)(void *handle, RenderResult *rr, rcti *rect)
void(* stats_draw_cb)(void *handle, RenderStats *ri)
void stats_draw(RenderStats *render_stats) override
struct bNodeTree * nodetree
ColorManagedViewSettings view_settings
ColorManagedDisplaySettings display_settings
struct bNodeTree * nodetree
bool(* append_movie)(void *context_v, RenderData *rd, int start_frame, int frame, const ImBuf *image, const char *suffix, ReportList *reports)
void(* end_movie)(void *context_v)
bool(* start_movie)(void *context_v, const Scene *scene, RenderData *rd, int rectx, int recty, ReportList *reports, bool preview, const char *suffix)
void(* context_free)(void *context_v)
void *(* context_create)()
bNodeTreeRuntimeHandle * runtime
void RE_point_density_fix_linking()
bool WM_jobs_test(const wmWindowManager *wm, const void *owner, int job_type)
void * WM_system_gpu_context_create()
void wm_window_reset_drawable()
void WM_system_gpu_context_dispose(void *context)
void WM_system_gpu_context_activate(void *context)
Scene * WM_window_get_active_scene(const wmWindow *win)
bScreen * WM_window_get_active_screen(const wmWindow *win)