9#include <condition_variable>
91#define MAX_SCHEDULED_FRAMES 8
162 if ((rd ==
nullptr) || ((v3d !=
nullptr) && (rv3d ==
nullptr))) {
265 int sizex = oglrender->
sizex;
266 int sizey = oglrender->
sizey;
267 ImBuf *ibuf_result =
nullptr;
316 gp_rect =
static_cast<uchar *
>(
320 for (
i = 0;
i < sizex * sizey * 4;
i += 4) {
332 char err_out[256] =
"unknown";
341 if (v3d !=
nullptr) {
382 ibuf_result = ibuf_view;
385 CLOG_ERROR(&
LOG,
"%s: failed to get buffer, %s", __func__, err_out);
389 if (ibuf_result !=
nullptr) {
449 CLOG_ERROR(&
LOG,
"OpenGL Render failed to write '%s'", filepath);
458 mul = 1.0f - source[3];
460 dest[0] = (
mul * dest[0]) + source[0];
461 dest[1] = (
mul * dest[1]) + source[1];
462 dest[2] = (
mul * dest[2]) + source[2];
463 dest[3] = (
mul * dest[3]) + source[3];
479 int chanshown = sseq ? sseq->
chanshown : 0;
490 for (view_id = 0; view_id < oglrender->
views_len; view_id++) {
491 context.view_id = view_id;
492 context.gpu_offscreen = oglrender->
ofs;
493 context.gpu_viewport = oglrender->
viewport;
495 &context, scene->
r.
cfra, chanshown);
525 if (adt ==
nullptr || adt->
action ==
nullptr) {
530 int frame_start =
PSFRA;
531 int frame_end =
PEFRA;
534 if (fcu->driver !=
nullptr || fcu->fpt !=
nullptr) {
543 fcu->bezt, frame_start, fcu->totvert, &found);
544 for (; key_index < fcu->totvert; key_index++) {
552 if (frame_nr > frame_end) {
568 int frame_start =
PSFRA;
569 int frame_end =
PEFRA;
573 if (gp_frame->framenum < frame_start || gp_frame->framenum > frame_end) {
584 if (*id_p ==
nullptr) {
676 int frame_start =
PSFRA;
677 int frame_end =
PEFRA;
681 "OGLRender::render_frames");
724 char err_out[256] =
"unknown";
728 op->
reports,
RPT_ERROR,
"Cannot use OpenGL render in background mode (no opengl context)");
739 op->
reports,
RPT_ERROR,
"Cannot write a single file with an animation format selected");
744 is_view_context =
false;
750 is_view_context =
false;
753 if (!is_view_context && scene->
camera ==
nullptr) {
770 blender::gpu::TextureFormat::SFLOAT_16_16_16_16,
784 oglrender = MEM_new<OGLRender>(
"OGLRender");
787 oglrender->
ofs = ofs;
788 oglrender->
sizex = sizex;
789 oglrender->
sizey = sizey;
792 oglrender->
scene = scene;
801 oglrender->
write_still = is_write_still && !is_animation;
815 if (is_view_context) {
850 oglrender->
re,
nullptr, &scene->
r, &scene->
view_layers,
nullptr, sizex, sizey,
nullptr);
857 oglrender->
win = win;
860 if (is_render_keyed_only) {
881 if (oglrender->
ended) {
924 oglrender->
ofs =
nullptr;
937 else if (oglrender->
win) {
942 G.is_rendering =
false;
943 oglrender->
ended =
true;
956 MEM_delete(oglrender);
973 size_t width, height;
977 &scene->
r, &image_format, oglrender->
sizex, oglrender->
sizey, &width, &height);
991 if (writer ==
nullptr) {
994 MEM_delete(oglrender);
1003 G.is_rendering =
true;
1022 const int cfra = scene->
r.
cfra;
1066 &template_variables,
1090 report = report->
next)
1144 const bool view_context = (oglrender->
v3d !=
nullptr);
1152 while (scene->
r.
cfra < oglrender->
nfra) {
1169 &template_variables,
1191 if (!oglrender->
wm_job && oglrender->
win) {
1254 MEM_delete(oglrender);
1261 MEM_delete(oglrender);
1274 bool canceled =
false;
1275 bool finished =
false;
1277 while (!finished && !canceled) {
1281 if (worker_status->
stop ||
G.is_break) {
1292 if (worker_status->
stop ||
G.is_break) {
1339 "Rendering viewport...",
1343 oglrender->
wm_job = wm_job;
1368 MEM_delete(oglrender);
1384 MEM_delete(oglrender);
1399 "Render the viewport for the animation range of this scene, but only render keyframes of "
1400 "selected objects");
1403 return TIP_(
"Render the viewport for the animation range of this scene");
1411 ot->name =
"Viewport Render";
1412 ot->description =
"Take a snapshot of the active viewport";
1413 ot->idname =
"RENDER_OT_opengl";
1428 "Render files from the animation range of this scene");
1432 "render_keyed_only",
1434 "Render Keyframes Only",
1435 "Render only those frames where selected objects have a key in their "
1436 "animation data. Only used when rendering animation");
1440 ot->srna,
"sequencer",
false,
"Sequencer",
"Render using the sequencer's OpenGL display");
1447 "Save the rendered image to the output path (used only when animation is disabled)");
1453 "Use the current 3D view for rendering, else use scene settings");
Functions for backward compatibility with the legacy Action API.
AnimData * BKE_animdata_from_id(const ID *id)
Camera data-block and utility functions.
struct Object * BKE_camera_multiview_render(const struct Scene *scene, struct Object *camera, const char *viewname)
WorkSpace * CTX_wm_workspace(const bContext *C)
bScreen * CTX_wm_screen(const bContext *C)
#define CTX_DATA_BEGIN(C, Type, instance, member)
Depsgraph * CTX_data_ensure_evaluated_depsgraph(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
wmWindow * CTX_wm_window(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
SpaceSeq * CTX_wm_space_seq(const bContext *C)
Main * CTX_data_main(const bContext *C)
void CTX_wm_area_set(bContext *C, ScrArea *area)
void CTX_wm_region_set(bContext *C, ARegion *region)
ARegion * CTX_wm_region(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)
CustomData interface, see also DNA_customdata_types.h.
void CustomData_MeshMasks_update(CustomData_MeshMasks *mask_dst, const CustomData_MeshMasks *mask_src)
int BKE_fcurve_bezt_binarysearch_index(const BezTriple array[], float frame, int arraylen, bool *r_replace)
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_backup_render(Scene *scene, Image *ima, bool free_current_slot)
void BKE_render_result_stamp_info(Scene *scene, Object *camera, RenderResult *rr, bool allocate_only)
void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
void BKE_image_stamp_buf(Scene *scene, Object *camera, const StampData *stamp_data_template, ImBuf *ibuf)
void BKE_image_partial_update_mark_full_update(Image *image)
Mark the whole image to be updated.
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)
@ IDWALK_RET_STOP_RECURSION
LibraryForeachIDCallbackFlag
void BKE_library_foreach_ID_link(Main *bmain, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, LibraryForeachIDFlag flag)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
void BKE_report_path_template_errors(ReportList *reports, eReportType report_type, blender::StringRef path, blender::Span< blender::bke::path_templates::Error > errors)
void BKE_add_template_variables_for_render_path(blender::bke::path_templates::VariableMap &variables, const Scene &scene)
void BKE_add_template_variables_general(blender::bke::path_templates::VariableMap &variables, const ID *path_owner_id)
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
void BKE_reports_free(ReportList *reports)
void BKE_report(ReportList *reports, eReportType type, const char *message)
void BKE_reports_init(ReportList *reports, int flag)
void BKE_render_resolution(const RenderData *r, const bool use_crop, int *r_width, int *r_height)
void BKE_scene_graph_evaluated_ensure(Depsgraph *depsgraph, Main *bmain)
void BKE_scene_multiview_videos_dimensions_get(const RenderData *rd, const ImageFormatData *imf, size_t width, size_t height, size_t *r_width, size_t *r_height)
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)
bool BKE_scene_camera_switch_update(Scene *scene)
bool BKE_scene_multiview_is_stereo3d(const RenderData *rd)
int BKE_scene_multiview_num_videos_get(const RenderData *rd, const ImageFormatData *imf)
void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph)
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
#define BLI_BITMAP_TEST_BOOL(_bitmap, _index)
File and directory operations.
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define LISTBASE_FOREACH(type, var, list)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE int round_fl_to_int(float a)
MINLINE void blend_color_mix_byte(unsigned char dst[4], const unsigned char src1[4], const unsigned char src2[4])
#define STRNCPY_UTF8(dst, src)
void * BLI_task_pool_user_data(TaskPool *pool)
void BLI_task_pool_work_and_wait(TaskPool *pool)
TaskPool * BLI_task_pool_create_background_serial(void *userdata, eTaskPriority priority)
TaskPool * BLI_task_pool_create(void *userdata, eTaskPriority priority)
void BLI_task_pool_free(TaskPool *pool)
void BLI_task_pool_push(TaskPool *pool, TaskRunFunction run, void *taskdata, bool free_taskdata, TaskFreeFunction freedata)
#define UNUSED_FUNCTION(x)
#define CLOG_ERROR(clg_ref,...)
#define CLOG_INFO_NOCHECK(clg_ref, format,...)
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
Object is a sort of wrapper for general info.
#define V3D_CAMERA_SCENE(scene, v3d)
@ SEQ_PREVIEW_SHOW_GPENCIL
@ V3D_OFSDRAW_SHOW_ANNOTATION
void DRW_gpu_context_disable()
void DRW_gpu_context_enable()
bool ED_operator_screenactive(bContext *C)
void ED_view3d_datamask(const Scene *scene, ViewLayer *view_layer, const View3D *v3d, CustomData_MeshMasks *r_cddata_masks)
bool ED_view3d_context_user_region(bContext *C, View3D **r_v3d, ARegion **r_region)
bool ED_view3d_context_activate(bContext *C)
ImBuf * ED_view3d_draw_offscreen_imbuf(Depsgraph *depsgraph, Scene *scene, eDrawType drawtype, View3D *v3d, ARegion *region, int sizex, int sizey, eImBufFlags imbuf_flag, int alpha_mode, const char *viewname, bool restore_rv3d_mats, GPUOffScreen *ofs, GPUViewport *viewport, char err_out[256])
ImBuf * ED_view3d_draw_offscreen_imbuf_simple(Depsgraph *depsgraph, Scene *scene, View3DShading *shading_override, eDrawType drawtype, Object *camera, int width, int height, eImBufFlags imbuf_flags, eV3DOffscreenDrawFlag draw_flags, int alpha_mode, const char *viewname, GPUOffScreen *ofs, GPUViewport *viewport, char err_out[256])
void GPU_render_step(bool force_resource_release=false)
GPUBackendType GPU_backend_get_type()
void GPU_offscreen_bind(GPUOffScreen *offscreen, bool save)
GPUOffScreen * GPU_offscreen_create(int width, int height, bool with_depth_buffer, blender::gpu::TextureFormat format, eGPUTextureUsage usage, bool clear, char err_out[256])
void GPU_clear_color(float red, float green, float blue, float alpha)
void GPU_offscreen_free(GPUOffScreen *offscreen)
void GPU_clear_depth(float depth)
void GPU_offscreen_read_color(GPUOffScreen *offscreen, eGPUDataFormat data_format, void *r_data)
void GPU_offscreen_unbind(GPUOffScreen *offscreen, bool restore)
void GPU_matrix_translate_2f(float x, float y)
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_HOST_READ
GPUViewport * GPU_viewport_create()
void GPU_viewport_free(GPUViewport *viewport)
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
void IMB_byte_from_float(ImBuf *ibuf)
void IMB_freeImBuf(ImBuf *ibuf)
ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
void IMB_free_float_pixels(ImBuf *ibuf)
@ IB_DISPLAY_BUFFER_INVALID
Read Guarded memory(de)allocation.
void ED_annotation_draw_ex(Scene *scene, bGPdata *gpd, int winx, int winy, const int cfra, const char spacetype)
BPy_StructRNA * depsgraph
static void mul(btAlignedObjectArray< T > &items, const Q &value)
void append(const T &value)
void reserve(const int64_t min_capacity)
void RE_SetOverrideCamera(Render *re, Object *cam_ob)
void * MEM_mallocN(size_t len, const char *str)
void * MEM_callocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void MOV_write_end(MovieWriter *writer)
MovieWriter * MOV_write_begin(const Scene *scene, const RenderData *rd, const ImageFormatData *imf, int rectx, int recty, ReportList *reports, bool preview, const char *suffix)
Vector< FCurve * > fcurves_for_assigned_action(AnimData *adt)
ImBuf * render_give_ibuf(const RenderData *context, float timeline_frame, int chanshown)
void render_new_render_data(Main *bmain, Depsgraph *depsgraph, Scene *scene, int rectx, int recty, eSpaceSeq_Proxy_RenderSize preview_render_size, Render *render, RenderData *r_context)
void isolate_task(const Function &function)
ScrArea * render_view_open(bContext *C, int mx, int my, ReportList *reports)
static bool schedule_write_result(OGLRender *oglrender, RenderResult *rr)
static void UNUSED_FUNCTION addAlphaOverFloat(float dest[4], const float source[4])
static bool screen_opengl_render_anim_step(OGLRender *oglrender)
static wmOperatorStatus screen_opengl_render_invoke(bContext *C, wmOperator *op, const wmEvent *event)
static void screen_opengl_render_apply(OGLRender *oglrender)
static std::string screen_opengl_render_get_description(bContext *, wmOperatorType *, PointerRNA *ptr)
#define MAX_SCHEDULED_FRAMES
static void opengl_render_startjob(void *customdata, wmJobWorkerStatus *worker_status)
static wmOperatorStatus screen_opengl_render_exec(bContext *C, wmOperator *op)
static void screen_opengl_views_setup(OGLRender *oglrender)
static void gather_frames_to_render(bContext *C, OGLRender *oglrender)
static int gather_frames_to_render_for_id(LibraryIDLinkCallbackData *cb_data)
static void gather_frames_to_render_for_adt(const OGLRender *oglrender, const AnimData *adt)
static void opengl_render_freejob(void *customdata)
static void write_result_func(TaskPool *__restrict pool, void *task_data_v)
static void screen_opengl_render_write(OGLRender *oglrender)
static wmOperatorStatus screen_opengl_render_modal(bContext *C, wmOperator *op, const wmEvent *event)
static void screen_opengl_render_end(OGLRender *oglrender)
static void write_result(TaskPool *__restrict pool, WriteTaskData *task_data)
void RENDER_OT_opengl(wmOperatorType *ot)
static bool screen_opengl_is_multiview(OGLRender *oglrender)
static void screen_opengl_render_doit(OGLRender *oglrender, RenderResult *rr)
static bool screen_opengl_render_init(bContext *C, wmOperator *op)
static bool screen_opengl_render_anim_init(wmOperator *op)
static void gather_frames_to_render_for_grease_pencil(const OGLRender *oglrender, const bGPdata *gp)
static void screen_opengl_render_cancel(bContext *C, wmOperator *op)
void RE_render_result_rect_from_ibuf(RenderResult *rr, const ImBuf *ibuf, const int view_id)
RenderResult * RE_DuplicateRenderResult(RenderResult *rr)
void RNA_boolean_set(PointerRNA *ptr, const char *name, bool value)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
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_flag(PropertyRNA *prop, PropertyFlag flag)
void RE_ReleaseResultImage(Render *re)
void RE_InitState(Render *re, Render *source, RenderData *rd, ListBase *, ViewLayer *single_layer, int winx, int winy, const rcti *disprect)
void RE_FreeRenderResult(RenderResult *rr)
RenderResult * RE_AcquireResultWrite(Render *re)
Render * RE_NewSceneRender(const Scene *scene)
RenderResult * RE_AcquireResultRead(Render *re)
void RE_ReleaseResult(Render *re)
const char * RE_GetActiveRenderView(Render *re)
bool RE_WriteRenderViewsMovie(ReportList *reports, RenderResult *rr, Scene *scene, RenderData *rd, MovieWriter **movie_writers, const int totvideos, bool preview)
void RE_SetActiveRenderView(Render *re, const char *viewname)
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
LibraryForeachIDCallbackFlag cb_flag
BLI_bitmap * render_frames
uint num_scheduled_frames
std::condition_variable task_condition
struct OGLRender::@275256070246063345275261234227353024320111056241 seq_data
blender::Mutex reports_mutex
eImageFormatDepth color_depth
blender::Vector< MovieWriter * > movie_writers
struct ImageFormatData im_format
struct CustomData_MeshMasks customdata_mask
struct CustomData_MeshMasks customdata_mask_modal
struct ReportList * reports
void WM_cursor_modal_restore(wmWindow *win)
void WM_cursor_time(wmWindow *win, int nr)
void WM_main_add_notifier(uint type, void *reference)
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
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)
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_job_main_thread_lock_acquire(wmJob *wm_job)
void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void(*free)(void *customdata))
void WM_job_main_thread_lock_release(wmJob *wm_job)
void wmOrtho2(float x1, float x2, float y1, float y2)