107 int tile_y, tile_height, tile_x, tile_width;
118 tile_x = renrect->
xmin;
119 tile_width = renrect->
xmax - tile_x;
120 if (tile_width < 2) {
124 tile_y = renrect->
ymin;
125 tile_height = renrect->
ymax - tile_y;
126 if (tile_height < 2) {
133 tile_width = rr->
rectx;
134 tile_height = rr->
recty;
139 if (offset_x >= ibuf->
x) {
143 if (offset_y >= ibuf->
y) {
147 if (offset_x + tile_width > ibuf->
x) {
148 tile_width = ibuf->
x - offset_x;
150 if (offset_y + tile_height > ibuf->
y) {
151 tile_height = ibuf->
y - offset_y;
154 if (tile_width < 1 || tile_height < 1) {
158 r_ibuf_rect->
xmax = tile_x + tile_width;
159 r_ibuf_rect->
ymax = tile_y + tile_height;
160 r_ibuf_rect->
xmin = tile_x;
161 r_ibuf_rect->
ymin = tile_y;
162 *r_offset_x = offset_x;
163 *r_offset_y = offset_y;
171 const rcti *tile_rect,
174 const char *viewname)
177 const float *rectf =
nullptr;
178 int linear_stride, linear_offset_x, linear_offset_y;
200 if (iuser->
pass == 0) {
204 if (rv->
ibuf ==
nullptr) {
221 if (rr->
renlay ==
nullptr) {
226 if (rectf ==
nullptr) {
230 rectf += 4 * (rr->
rectx * tile_rect->
ymin + tile_rect->
xmin);
231 linear_stride = rr->
rectx;
232 linear_offset_x = offset_x;
233 linear_offset_y = offset_y;
237 linear_stride = ibuf->
x;
277 scn->
r.
cfra = (*scene)->r.cfra;
295 else if (((*scene)->r.scemode &
R_SINGLE_LAYER) && active_layer) {
296 *single_layer = active_layer;
315 frame_start = scene->
r.
sfra;
322 frame_end = scene->
r.
efra;
346 if (re_type->
render ==
nullptr) {
360 int frame_start, frame_end;
362 if (is_animation && frame_start > frame_end) {
372 op->
reports,
RPT_ERROR,
"Cannot write a single file with an animation format selected");
418 const bool cancelled =
G.is_break;
422 if (rr && rr->
error) {
452 const bool v3d_override,
456 const char *info_space =
" ";
457 const char *info_sep =
"| ";
460 char time_elapsed[32];
465 const char *ret_array[32];
472 const int megs_peak_memory =
ceilf(peak_memory / (1024.0 * 1024.0));
476 ret_array[
i++] =
RPT_(
"3D Local View ");
477 ret_array[
i++] = info_sep;
479 else if (v3d_override) {
480 ret_array[
i++] =
RPT_(
"3D View ");
481 ret_array[
i++] = info_sep;
486 ret_array[
i++] =
RPT_(
"Frame:");
487 ret_array[
i++] = info_buffers.frame;
490 const char *info_time = info_buffers.time_last;
492 info_buffers.time_last,
sizeof(info_buffers.time_last), rs->
lastframetime);
494 ret_array[
i++] = info_sep;
497 ret_array[
i++] =
"Last:";
498 ret_array[
i++] = info_buffers.time_last;
499 ret_array[
i++] = info_space;
502 info_time = info_buffers.time_elapsed;
504 sizeof(info_buffers.time_elapsed),
508 ret_array[
i++] =
RPT_(
"Time:");
509 ret_array[
i++] = info_time;
510 ret_array[
i++] = info_space;
514 const char *info_statistics =
nullptr;
523 RPT_(
"Mem:%dM, Peak: %dM"),
531 info_statistics = info_buffers.statistics;
534 if (info_statistics) {
535 ret_array[
i++] = info_sep;
536 ret_array[
i++] = info_statistics;
537 ret_array[
i++] = info_space;
543 const char *info_extra =
nullptr;
552 ret_array[
i++] = info_sep;
553 ret_array[
i++] = info_extra;
554 ret_array[
i++] = info_space;
560 printf(
"WARNING! renderwin text beyond limit\n");
564 BLI_assert(
i <
int(BOUNDED_ARRAY_TYPE_SIZE<
decltype(ret_array)>()));
577 if (rr->
text ==
nullptr) {
609 ScrArea *first_area =
nullptr, *matched_area =
nullptr;
615 wm && matched_area ==
nullptr;
619 for (win =
static_cast<wmWindow *
>(wm->windows.first); win && matched_area ==
nullptr;
628 if (sima !=
nullptr && sima->
image == rj->
image) {
629 if (first_area ==
nullptr) {
632 if (area == rj->
area) {
642 if (matched_area ==
nullptr) {
643 matched_area = first_area;
787 if (area == rj->
area) {
862 G.is_rendering =
false;
1036 if (re_type->
render ==
nullptr) {
1050 int frame_start, frame_end;
1052 if (is_animation && frame_start > frame_end) {
1071 op->
reports,
RPT_ERROR,
"Cannot write a single file with an animation format selected");
1108 rj = MEM_new<RenderJob>(
"render job");
1115 rj->
anim = is_animation;
1116 rj->
write_still = is_write_still && !is_animation;
1135 if (camera_override && camera_override != scene->
camera) {
1161 name =
RPT_(
"Rendering sequence...");
1214 G.is_rendering =
true;
1227 if (use_sequencer_scene) {
1228 return TIP_(
"Render active sequencer scene");
1230 return TIP_(
"Render active scene");
1238 ot->name =
"Render";
1239 ot->idname =
"RENDER_OT_render";
1257 "Render files from the animation range of this scene");
1264 "Save the rendered image to the output path (used only when animation is disabled)");
1269 "When inside a 3D viewport, use layers and camera of the viewport");
1272 "use_sequencer_scene",
1274 "Use Sequencer Scene",
1275 "Render the sequencer scene instead of the active scene");
1282 "Single render layer to re-render (used only when animation is disabled)");
1289 "Scene to render, current scene if not specified");
1298 "Frame to start rendering animation at. If not specified, the scene start frame will be "
1299 "assumed. This should only be specified if doing an animation render",
1310 "Frame to end rendering animation at. If not specified, the scene end frame will be "
1311 "assumed. This should only be specified if doing an animation render",
1327 if (rj ==
nullptr) {
1338 return rj ? rj->
scene :
nullptr;
1357 mblur_shutter_curve->
preset = preset;
1359 &mblur_shutter_curve->
clipr,
1360 mblur_shutter_curve->
preset,
1377 {0,
nullptr, 0,
nullptr,
nullptr},
1380 ot->name =
"Shutter Curve Preset";
1381 ot->description =
"Set shutter curve";
1382 ot->idname =
"RENDER_OT_shutter_curve_preset";
int ED_draw_imbuf_method(const ImBuf *ibuf)
bScreen * CTX_wm_screen(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
wmWindowManager * CTX_wm_manager(const bContext *C)
Scene * CTX_data_sequencer_scene(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
Image * BKE_image_ensure_viewer(Main *bmain, int type, const char *name)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
void BKE_image_update_gputexture_delayed(Image *ima, ImageTile *image_tile, ImBuf *ibuf, int x, int y, int w, int h)
void BKE_image_backup_render(Scene *scene, Image *ima, bool free_current_slot)
void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
void BKE_image_partial_update_mark_full_update(Image *image)
Mark the whole image to be updated.
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
ViewLayer * BKE_view_layer_default_render(const Scene *scene)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
void BKE_main_id_tag_listbase(ListBase *lb, int tag, bool value)
void BKE_main_free(Main *bmain)
void BKE_ntree_update(Main &bmain, std::optional< blender::Span< bNodeTree * > > modified_trees=std::nullopt, const NodeTreeUpdateExtraParams ¶ms={})
void BKE_ntree_update_tag_id_changed(Main *bmain, ID *id)
General operations, lookup, etc. for blender objects.
void BKE_object_free_derived_caches(Object *ob)
void BKE_report(ReportList *reports, eReportType type, const char *message)
#define SETLOOPER_SET_ONLY(_sce_basis, _sce_iter, _base)
bool BKE_scene_camera_switch_update(Scene *scene)
int BKE_scene_multiview_view_id_get(const RenderData *rd, const char *viewname)
Depsgraph * BKE_scene_get_depsgraph(const Scene *scene, const ViewLayer *view_layer)
void BKE_spacedata_draw_locks(ARegionDrawLockFlags lock_flags)
@ REGION_DRAW_LOCK_RENDER
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_findstringindex(const 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)
#define SNPRINTF_UTF8(dst, format,...)
size_t BLI_string_join_array(char *result, size_t result_maxncpy, const char *strings[], uint strings_num) ATTR_NONNULL()
void size_t BLI_string_len_array(const char *strings[], uint strings_num) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
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 SET_FLAG_FROM_TEST(value, test, flag)
#define BLT_I18NCONTEXT_ID_CURVE_LEGACY
void DEG_tag_on_visible_update(Main *bmain, bool do_time)
@ CUMA_EXTEND_EXTRAPOLATE
#define IMA_MAX_RENDER_TEXT_SIZE
@ IMA_SHOW_SEQUENCER_SCENE
@ BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT
Object is a sort of wrapper for general info.
#define RE_PASSNAME_COMBINED
#define V3D_CAMERA_LOCAL(v3d)
wmOperatorStatus ED_screen_animation_play(bContext *C, int sync, int mode)
bool ED_operator_screenactive(bContext *C)
bScreen * ED_screen_animation_playing(const wmWindowManager *wm)
void ED_update_for_newframe(Main *bmain, Depsgraph *depsgraph)
bool ED_editors_flush_edits_ex(Main *bmain, bool for_render, bool check_needs_flush)
void IMB_partial_display_buffer_update(ImBuf *ibuf, const float *linear_buffer, const unsigned char *byte_buffer, int stride, int offset_x, int offset_y, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, int xmin, int ymin, int xmax, int ymax)
@ IB_DISPLAY_BUFFER_INVALID
Read Guarded memory(de)allocation.
BPy_StructRNA * depsgraph
RenderEngineType * RE_engines_find(const char *idname)
size_t(* MEM_get_peak_memory)(void)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
size_t(* MEM_get_memory_in_use)(void)
static void error(const char *str)
void cache_cleanup(Scene *scene)
bool relations_check_scene_recursion(Scene *scene, ReportList *reports)
void ntreeCompositClearTags(bNodeTree *ntree)
ScrArea * render_view_open(bContext *C, int mx, int my, ReportList *reports)
static void render_endjob(void *rjv)
static void current_scene_update(void *rjv, Scene *scene)
static void render_image_restore_scene_and_layer(RenderJob *rj)
static void image_rect_update(void *rjv, RenderResult *rr, rcti *renrect)
static RenderJobBase * render_job_get(const bContext *C)
static void image_renderinfo_cb(void *rjv, RenderStats *rs)
void RENDER_OT_render(wmOperatorType *ot)
static void image_buffer_rect_update(RenderJob *rj, RenderResult *rr, ImBuf *ibuf, ImageUser *iuser, const rcti *tile_rect, int offset_x, int offset_y, const char *viewname)
static void make_renderinfo_string(const RenderStats *rs, const Scene *scene, const bool v3d_override, const char *error, char ret[IMA_MAX_RENDER_TEXT_SIZE])
Scene * ED_render_job_get_scene(const bContext *C)
static void screen_render_single_layer_set(wmOperator *op, Main *mainp, ViewLayer *active_layer, Scene **scene, ViewLayer **single_layer)
static void render_drawlock(void *rjv, bool lock)
static wmOperatorStatus screen_render_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void get_render_operator_frame_range(wmOperator *render_operator, const Scene *scene, int &frame_start, int &frame_end)
void RENDER_OT_shutter_curve_preset(wmOperatorType *ot)
static bool render_break(void *rjv)
static wmOperatorStatus render_shutter_curve_preset_exec(bContext *C, wmOperator *op)
static void clean_viewport_memory(Main *bmain, Scene *scene)
Scene * ED_render_job_get_current_scene(const bContext *C)
static bool render_breakjob(void *rjv)
static void render_image_update_pass_and_layer(RenderJob *rj, RenderResult *rr, ImageUser *iuser)
static void render_progress_update(void *rjv, float progress)
static void clean_viewport_memory_base(Base *base)
static void screen_render_cancel(bContext *C, wmOperator *op)
static wmOperatorStatus screen_render_exec(bContext *C, wmOperator *op)
static wmOperatorStatus screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void render_freejob(void *rjv)
static bool image_buffer_calc_tile_rect(const RenderResult *rr, const ImBuf *ibuf, rcti *renrect, rcti *r_ibuf_rect, int *r_offset_x, int *r_offset_y)
static bool render_operator_has_custom_frame_range(wmOperator *render_operator)
static void render_startjob(void *rjv, wmJobWorkerStatus *worker_status)
static std::string screen_render_get_description(bContext *, wmOperatorType *, PointerRNA *ptr)
bool RE_HasCombinedLayer(const RenderResult *result)
RenderView * RE_RenderViewGetById(RenderResult *rr, const int view_id)
int RNA_int_get(PointerRNA *ptr, const char *name)
std::string RNA_string_get(PointerRNA *ptr, const char *name)
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
bool RE_HasSingleLayer(Render *re)
void RE_stats_draw_cb(Render *re, void *handle, void(*f)(void *handle, RenderStats *rs))
void RE_progress_cb(Render *re, void *handle, void(*f)(void *handle, float))
void RE_test_break_cb(Render *re, void *handle, bool(*f)(void *handle))
void RE_current_scene_update_cb(Render *re, void *handle, void(*f)(void *handle, Scene *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)
void RE_display_free(Render *re)
Render * RE_NewSceneRender(const Scene *scene)
void RE_display_ensure_gpu_context(Render *re)
bool RE_seq_render_active(Scene *scene, RenderData *rd)
RenderResult * RE_AcquireResultRead(Render *re)
void RE_display_init(Render *re)
void RE_ReleaseResult(Render *re)
const char * RE_GetActiveRenderView(Render *re)
void RE_RenderAnim(Render *re, Main *bmain, Scene *scene, ViewLayer *single_layer, Object *camera_override, int sfra, int efra, int tfra)
bool RE_allow_render_generic_object(Object *ob)
void RE_display_update_cb(Render *re, void *handle, void(*f)(void *handle, RenderResult *rr, rcti *rect))
bool RE_is_rendering_allowed(Scene *scene, ViewLayer *single_layer, Object *camera_override, ReportList *reports)
void RE_draw_lock_cb(Render *re, void *handle, void(*f)(void *handle, bool lock))
void RE_SetReports(Render *re, ReportList *reports)
float * RE_RenderLayerGetPass(RenderLayer *rl, const char *name, const char *viewname)
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
struct CurveMapping mblur_shutter_curve
struct ImageFormatData im_format
void(* render)(struct RenderEngine *engine, struct Depsgraph *depsgraph)
ColorManagedViewSettings view_settings
ColorManagedDisplaySettings display_settings
ColorManagedViewSettings view_settings
struct bNodeTree * compositing_node_group
ColorManagedDisplaySettings display_settings
struct ReportList * reports
void * BKE_image_free_buffers
void * BKE_image_get_tile
void WM_cursor_wait(bool val)
void WM_locked_interface_set(wmWindowManager *wm, bool lock)
void WM_locked_interface_set_with_flags(wmWindowManager *wm, short lock_flags)
void WM_main_add_notifier(uint type, void *reference)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
void WM_jobs_timer(wmJob *wm_job, double time_step, uint note, uint endnote)
void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job)
void WM_jobs_kill_type(wmWindowManager *wm, const void *owner, int job_type)
void WM_jobs_delay_start(wmJob *wm_job, double delay_time)
wmJob * WM_jobs_get(wmWindowManager *wm, wmWindow *win, const void *owner, const char *name, const eWM_JobFlag flag, const eWM_JobType job_type)
void WM_jobs_callbacks(wmJob *wm_job, wm_jobs_start_callback startjob, void(*initjob)(void *), void(*update)(void *), void(*endjob)(void *))
void WM_jobs_kill_all_except(wmWindowManager *wm, const void *owner)
bool WM_jobs_test(const wmWindowManager *wm, const void *owner, int job_type)
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *customdata))
void * WM_jobs_customdata_from_type(wmWindowManager *wm, const void *owner, int job_type)
ViewLayer * WM_window_get_active_view_layer(const wmWindow *win)
bScreen * WM_window_get_active_screen(const wmWindow *win)