87#define MAX_SCHEDULED_FRAMES 8
163 if ((rd ==
nullptr) || ((v3d !=
nullptr) && (rv3d ==
nullptr))) {
191 rv = MEM_cnew<RenderView>(
"new opengl render view");
239 rv = MEM_cnew<RenderView>(
"new opengl render view");
247 oglrender->
iuser.
flag &= ~IMA_SHOW_STEREO;
266 int sizex = oglrender->
sizex;
267 int sizey = oglrender->
sizey;
268 ImBuf *ibuf_result =
nullptr;
310 wmOrtho2(0, scene->r.xsch, 0, scene->r.ysch);
315 G.f &= ~G_FLAG_RENDER_VIEWPORT;
317 gp_rect =
static_cast<uchar *
>(
321 for (i = 0; i < sizex * sizey * 4; i += 4) {
333 char err_out[256] =
"unknown";
335 bool draw_sky = (scene->r.alphamode ==
R_ADDSKY);
340 if (v3d !=
nullptr) {
377 camera = scene->camera;
381 ibuf_result = ibuf_view;
384 fprintf(stderr,
"%s: failed to get buffer, %s\n", __func__, err_out);
388 if (ibuf_result !=
nullptr) {
390 float *rectf =
nullptr;
391 uchar *rect =
nullptr;
430 printf(
"OpenGL Render written to '%s'\n", filepath);
433 printf(
"OpenGL Render failed to write '%s'\n", filepath);
442 mul = 1.0f - source[3];
444 dest[0] = (
mul * dest[0]) + source[0];
445 dest[1] = (
mul * dest[1]) + source[1];
446 dest[2] = (
mul * dest[2]) + source[2];
447 dest[3] = (
mul * dest[3]) + source[3];
463 int chanshown = sseq ? sseq->
chanshown : 0;
474 for (view_id = 0; view_id < oglrender->
views_len; view_id++) {
475 context.view_id = view_id;
476 context.gpu_offscreen = oglrender->
ofs;
477 context.gpu_viewport = oglrender->
viewport;
479 &context, scene->r.cfra, chanshown);
509 if (adt ==
nullptr || adt->
action ==
nullptr) {
514 int frame_start =
PSFRA;
515 int frame_end =
PEFRA;
518 if (fcu->driver !=
nullptr || fcu->fpt !=
nullptr) {
527 fcu->bezt, frame_start, fcu->totvert, &found);
528 for (; key_index < fcu->totvert; key_index++) {
536 if (frame_nr > frame_end) {
552 int frame_start =
PSFRA;
553 int frame_end =
PEFRA;
557 if (gp_frame->framenum < frame_start || gp_frame->framenum > frame_end) {
568 if (*id_p ==
nullptr) {
574 const int cb_flag = cb_data->
cb_flag;
661 int frame_start =
PSFRA;
662 int frame_end =
PEFRA;
666 "OGLRender::render_frames");
705 char err_out[256] =
"unknown";
709 op->
reports,
RPT_ERROR,
"Cannot use OpenGL render in background mode (no opengl context)");
719 is_view_context =
false;
725 is_view_context =
false;
728 if (!is_view_context && scene->camera ==
nullptr) {
736 op->
reports,
RPT_ERROR,
"Cannot write a single file with an animation format selected");
762 oglrender = MEM_new<OGLRender>(
"OGLRender");
765 oglrender->
ofs = ofs;
766 oglrender->
sizex = sizex;
767 oglrender->
sizey = sizey;
776 oglrender->
cfrao = scene->r.cfra;
778 oglrender->
write_still = is_write_still && !is_animation;
792 oglrender->
prevsa = prevsa;
793 oglrender->
prevar = prevar;
795 if (is_view_context) {
832 oglrender->
re,
nullptr, &scene->
r, &scene->view_layers,
nullptr, sizex, sizey,
nullptr);
839 oglrender->
win = win;
842 oglrender->
mh =
nullptr;
846 if (is_render_keyed_only) {
910 for (i = 0; i < oglrender->
totvideos; i++) {
921 if (oglrender->
timer) {
923 scene->r.cfra = oglrender->
cfrao;
949 MEM_delete(oglrender);
950 G.is_rendering =
false;
966 scene = oglrender->
scene;
972 size_t width, height;
976 &scene->r, oglrender->
sizex, oglrender->
sizey, &width, &height);
979 if (oglrender->
mh ==
nullptr) {
988 for (i = 0; i < oglrender->
totvideos; i++) {
1008 G.is_rendering =
true;
1009 oglrender->
cfrao = scene->r.cfra;
1011 scene->r.cfra =
PSFRA;
1027 const int cfra = scene->r.cfra;
1068 &scene->r.im_format,
1083 report = report->next)
1116 WriteTaskData *task_data = MEM_cnew<WriteTaskData>(
"write task data");
1136 const bool view_context = (oglrender->
v3d !=
nullptr);
1141 if (scene->r.cfra < oglrender->
nfra) {
1144 while (scene->r.cfra < oglrender->
nfra) {
1156 &scene->r.im_format,
1208 oglrender->
nfra += scene->r.frame_step;
1211 if (scene->r.cfra >=
PEFRA || !ok) {
1225 switch (event->
type) {
1297 if (!is_animation) {
1332 "Render the viewport for the animation range of this scene, but only render keyframes of "
1333 "selected objects");
1336 return TIP_(
"Render the viewport for the animation range of this scene");
1344 ot->
name =
"Viewport Render";
1361 "Render files from the animation range of this scene");
1365 "render_keyed_only",
1367 "Render Keyframes Only",
1368 "Render only those frames where selected objects have a key in their "
1369 "animation data. Only used when rendering animation");
1373 ot->
srna,
"sequencer",
false,
"Sequencer",
"Render using the sequencer's OpenGL display");
1380 "Save the rendered image to the output path (used only when animation is disabled)");
1386 "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)
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, unsigned char *rect, float *rectf, int width, int height)
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
void BKE_library_foreach_ID_link(Main *bmain, ID *id, blender::FunctionRef< LibraryIDLinkCallback > callback, void *user_data, int flag)
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
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)
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)
void BKE_scene_multiview_videos_dimensions_get(const RenderData *rd, size_t width, size_t height, size_t *r_width, size_t *r_height)
int BKE_scene_multiview_num_videos_get(const RenderData *rd)
void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph)
bMovieHandle * BKE_movie_handle_get(char imtype)
#define BLI_BITMAP_NEW(_num, _alloc_string)
#define BLI_BITMAP_ENABLE(_bitmap, _index)
#define BLI_BITMAP_TEST_BOOL(_bitmap, _index)
int BLI_exists(const char *path) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
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_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct 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(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)
void BLI_condition_notify_all(ThreadCondition *cond)
pthread_spinlock_t SpinLock
void BLI_mutex_end(ThreadMutex *mutex)
void BLI_condition_wait(ThreadCondition *cond, ThreadMutex *mutex)
void BLI_mutex_init(ThreadMutex *mutex)
pthread_cond_t ThreadCondition
void BLI_condition_end(ThreadCondition *cond)
void BLI_condition_init(ThreadCondition *cond)
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
void BLI_spin_init(SpinLock *spin)
void BLI_spin_unlock(SpinLock *spin)
void BLI_spin_lock(SpinLock *spin)
pthread_mutex_t ThreadMutex
void BLI_spin_end(SpinLock *spin)
Platform independent time functions.
double BLI_time_now_seconds(void)
#define UNUSED_FUNCTION(x)
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])
GPUOffScreen * GPU_offscreen_create(int width, int height, bool with_depth_buffer, eGPUTextureFormat format, eGPUTextureUsage usage, char err_out[256])
void GPU_offscreen_bind(GPUOffScreen *offscreen, bool save)
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)
void imb_freerectfloatImBuf(ImBuf *ibuf)
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
void IMB_rect_from_float(ImBuf *ibuf)
Contains defines and structs used throughout the imbuf module.
@ IB_DISPLAY_BUFFER_INVALID
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
void ED_annotation_draw_ex(Scene *scene, bGPdata *gpd, int winx, int winy, const int cfra, const char spacetype)
static void mul(btAlignedObjectArray< T > &items, const Q &value)
const Depsgraph * depsgraph
struct ImBuf * IMB_allocImBuf(unsigned int, unsigned int, unsigned char, unsigned int)
void IMB_freeImBuf(ImBuf *)
void RE_SetOverrideCamera(Render *re, Object *cam_ob)
void *(* MEM_mallocN)(size_t len, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
Vector< FCurve * > fcurves_for_assigned_action(AnimData *adt)
void isolate_task(const Function &function)
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)
ScrArea * render_view_open(bContext *C, int mx, int my, ReportList *reports)
static void screen_opengl_render_doit(const bContext *C, OGLRender *oglrender, RenderResult *rr)
static bool schedule_write_result(OGLRender *oglrender, RenderResult *rr)
static bool screen_opengl_render_anim_init(bContext *C, wmOperator *op)
static void UNUSED_FUNCTION addAlphaOverFloat(float dest[4], const float source[4])
static void screen_opengl_render_end(bContext *C, OGLRender *oglrender)
static int screen_opengl_render_exec(bContext *C, wmOperator *op)
static int screen_opengl_render_modal(bContext *C, wmOperator *op, const wmEvent *event)
static std::string screen_opengl_render_get_description(bContext *, wmOperatorType *, PointerRNA *ptr)
static int screen_opengl_render_invoke(bContext *C, wmOperator *op, const wmEvent *event)
#define MAX_SCHEDULED_FRAMES
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 write_result_func(TaskPool *__restrict pool, void *task_data_v)
static void screen_opengl_render_apply(const bContext *C, OGLRender *oglrender)
static void screen_opengl_render_write(OGLRender *oglrender)
static void write_result(TaskPool *__restrict pool, WriteTaskData *task_data)
static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op)
void RENDER_OT_opengl(wmOperatorType *ot)
static bool screen_opengl_is_multiview(OGLRender *oglrender)
static bool screen_opengl_render_init(bContext *C, 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)
static bool is_movie(wmDrag *drag)
void RE_ReleaseResultImage(Render *re)
bool RE_WriteRenderViewsMovie(ReportList *reports, RenderResult *rr, Scene *scene, RenderData *rd, bMovieHandle *mh, void **movie_ctx_arr, const int totvideos, bool preview)
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)
void RE_SetActiveRenderView(Render *re, const char *viewname)
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
BLI_bitmap * render_frames
uint num_scheduled_frames
ThreadCondition task_condition
eImageFormatDepth color_depth
struct OGLRender::@466 seq_data
struct CustomData_MeshMasks customdata_mask
struct CustomData_MeshMasks customdata_mask_modal
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)()
bool(* poll)(bContext *C) ATTR_WARN_UNUSED_RESULT
std::string(* get_description)(bContext *C, wmOperatorType *ot, PointerRNA *ptr)
int(* modal)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* invoke)(bContext *C, wmOperator *op, const wmEvent *event) ATTR_WARN_UNUSED_RESULT
int(* exec)(bContext *C, wmOperator *op) ATTR_WARN_UNUSED_RESULT
void(* cancel)(bContext *C, wmOperator *op)
struct ReportList * reports
void WM_cursor_modal_restore(wmWindow *win)
void WM_cursor_time(wmWindow *win, int nr)
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_kill_all_except(wmWindowManager *wm, const void *owner)
bool WM_jobs_test(const wmWindowManager *wm, const void *owner, int job_type)
void wmOrtho2(float x1, float x2, float y1, float y2)
void WM_event_timer_remove(wmWindowManager *wm, wmWindow *, wmTimer *timer)
wmTimer * WM_event_timer_add(wmWindowManager *wm, wmWindow *win, const int event_type, const double time_step)