134 for (; rr; rr = rrnext) {
137 if (lb && lb->
first) {
183 static char *
set_pass_name(
char *outname,
const char *name,
int channel,
const char *chan_id)
185 const char *strings[2];
187 strings[strings_len++] = name;
191 strings[strings_len++] = token;
198 char *fullname,
const char *name,
int channel,
const char *
view,
const char *chan_id)
200 const char *strings[3];
202 strings[strings_len++] = name;
204 strings[strings_len++] =
view;
209 strings[strings_len++] = token;
220 const char *viewname,
225 size_t rectsize = ((size_t)rr->
rectx) * rr->
recty * channels;
239 for (
a = 0;
a < channels;
a++) {
267 for (
x = rectsize - 1;
x >= 0;
x--) {
273 for (
x = rectsize - 1;
x >= 0;
x--) {
289 Render *re,
rcti *partrct,
int savebuffers,
const char *layername,
const char *viewname)
299 if (rectx <= 0 || recty <= 0) {
323 if (layername && layername[0]) {
324 if (!
STREQ(view_layer->name, layername)) {
333 rl->
layflag = view_layer->layflag;
336 rl->
passflag = view_layer->passflag;
348 if (viewname && viewname[0]) {
358 #define RENDER_LAYER_ADD_PASS_SAFE(rr, rl, channels, name, viewname, chan_id) \
360 if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id) == NULL) { \
361 render_result_free(rr); \
441 #undef RENDER_LAYER_ADD_PASS_SAFE
462 if (viewname && viewname[0]) {
503 for (main_rp = main_rl->
passes.
first; main_rp; main_rp = main_rp->
next) {
504 if (viewname && viewname[0] && !
STREQ(main_rp->
view, viewname)) {
523 const char *layername,
524 const char *viewname)
531 if (layername && layername[0] && !
STREQ(rl->
name, layername)) {
538 if (viewname && viewname[0] && !
STREQ(
view, viewname)) {
562 const char delim[] = {
'.',
'\0'};
563 const char *sep, *suf;
566 #define CHECK_PASS(NAME) \
567 if (STREQLEN(name, RE_PASSNAME_##NAME, len)) { \
568 return SCE_PASS_##NAME; \
639 if (
view[0] !=
'\0') {
665 if (left_rv ==
NULL) {
688 if (passtype_b && !passtype_a) {
691 if (passtype_a && !passtype_b) {
695 if (passtype_a && passtype_b) {
696 if (passtype_a > passtype_b) {
699 if (passtype_a < passtype_b) {
739 void *exrhandle,
const char *colorspace,
bool predivide,
int rectx,
int recty)
759 rpass->
rectx = rectx;
760 rpass->
recty = recty;
810 return (rv && (rv->
next || rv->
name[0]));
821 copylen = tilex = rrpart->
rectx;
822 tiley = rrpart->
recty;
825 target += pixsize * ofs;
827 copylen *=
sizeof(
float) * pixsize;
829 ofs = pixsize * rr->
rectx;
831 for (
y = 0;
y < tiley;
y++) {
832 memcpy(target, tile, copylen);
851 rpass = rpass->
next) {
864 rpassp = rpassp->
next;
874 const char *filename,
885 if (!multi_layer && layer == -1) {
905 const char *viewname = rview->name;
915 if (!multi_layer && layer != 0) {
919 for (
int a = 0;
a < 4;
a++) {
922 const char *chan_id =
"RGBA";
926 BLI_strncpy(layname,
"Composite",
sizeof(layname));
929 passname[0] = chan_id[
a];
944 if (write_z && rview->rectz) {
945 const char *layname = (multi_layer) ?
"Composite" :
"";
955 if (!multi_layer && nr != layer) {
967 const char *viewname = rp->view;
978 bool pass_half_float = half_float &&
979 (
STR_ELEM(rp->chan_id,
"RGB",
"RGBA",
"R",
"G",
"B",
"A"));
981 for (
int a = 0;
a < rp->channels;
a++) {
991 passname[0] = rp->chan_id[
a];
1001 rp->channels * rr->
rectx,
1012 int compress = (imf ? imf->
exr_codec : 0);
1021 reports,
RPT_ERROR,
"Error writing render result, %s (see console)", strerror(errno));
1050 printf(
"pop render result error; no current result!\n");
1068 view_layer = view_layer->
next, nr++) {
1107 const int xstride = rpassp->
channels;
1111 for (
a = 0;
a < xstride;
a++) {
1118 xstride * rrpart->
rectx,
1168 const char *chan_id,
1215 re->
result, pass->name, pass->channels, pass->chan_id, rl->name,
NULL);
1223 printf(
"write exr tmp file, %dx%d, %s\n", rr->rectx, rr->recty,
str);
1240 rl->exrhandle =
NULL;
1243 rr->do_exr_tile =
false;
1270 printf(
"read exr tmp file: %s\n",
str);
1273 printf(
"cannot read: %s\n",
str);
1282 for (; rr && rrpart; rr = rr->
next, rrpart = rrpart->
next) {
1309 const char *filepath)
1317 printf(
"failed being read %s\n", filepath);
1324 printf(
"error in reading render result: dimensions don't match\n");
1327 printf(
"error in reading render result: NULL result pointer\n");
1334 if (rl_single && rl_single != rl) {
1340 const int xstride = rpass->
channels;
1344 for (
a = 0;
a < xstride;
a++) {
1347 exrhandle, rl->
name, fullname, xstride, xstride * rectx, rpass->
rect +
a);
1363 char path_digest[16] = {0};
1364 char path_hexdigest[33];
1368 if (blendfile_path[0] !=
'\0') {
1375 BLI_strncpy(filename,
"UNSAVED",
sizeof(filename));
1380 if (*root ==
'\0') {
1385 sizeof(filename_full),
1386 "cached_RR_%s_%s_%s.exr",
1397 char *root =
U.render_cachedir;
1400 printf(
"Caching exr file, %dx%d, %s\n", rr->
rectx, rr->
recty,
str);
1409 char *root =
U.render_cachedir;
1417 printf(
"read exr cache file: %s\n",
str);
1419 printf(
"cannot read: %s\n",
str);
1492 else if (ibuf->
rect) {
1534 else if (rv && rv->
rectf) {
1546 memset(rect, 0,
sizeof(
int) * rectx * recty);
1611 *new_rpass = *rpass;
1636 *new_rview = *rview;
typedef float(TangentPoint)[2]
const char * BKE_tempdir_base(void)
Camera data-block and utility functions.
void BKE_stamp_data_free(struct StampData *stamp_data)
char BKE_imtype_valid_depths(const char imtype)
struct StampData * BKE_stamp_data_copy(const struct StampData *stamp_data)
const char * BKE_main_blendfile_path_from_global(void)
void BKE_reportf(ReportList *reports, ReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
bool BKE_scene_multiview_is_render_view_active(const struct RenderData *rd, const struct SceneRenderView *srv)
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
#define GHASH_ITER(gh_iter_, ghash_)
void * BLI_hash_md5_buffer(const char *buffer, size_t len, void *resblock)
char * BLI_hash_md5_to_hexdigest(void *resblock, char r_hex_digest[33])
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
int BLI_listbase_count_at_most(const struct ListBase *listbase, const int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void * BLI_findstring(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_listbase_sort(struct ListBase *listbase, int(*cmp)(const void *, const void *)) ATTR_NONNULL(1
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_findstringindex(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
const char * BLI_path_basename(const char *path) ATTR_NONNULL() ATTR_WARN_UNUSED_RESULT
bool BLI_make_existing_file(const char *name)
void BLI_make_file_string(const char *relabase, char *string, const char *dir, const char *file)
void BLI_join_dirfile(char *__restrict dst, const size_t maxlen, const char *__restrict dir, const char *__restrict file) ATTR_NONNULL()
bool BLI_path_extension_replace(char *path, size_t maxlen, const char *ext) ATTR_NONNULL()
bool BLI_filename_make_safe(char *fname) ATTR_NONNULL(1)
void BLI_split_dirfile(const char *string, char *dir, char *file, const size_t dirlen, const size_t filelen)
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
BLI_INLINE int BLI_rcti_cent_y(const struct rcti *rct)
BLI_INLINE int BLI_rcti_cent_x(const struct rcti *rct)
size_t BLI_str_partition(const char *str, const char delim[], const char **sep, const char **suf) ATTR_NONNULL()
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
char * BLI_string_join_array_by_sep_char(char *result, size_t result_len, char sep, const char *strings[], uint strings_len) ATTR_NONNULL()
void BLI_thread_unlock(int type)
void BLI_thread_lock(int type)
#define THREAD_LOCK_WRITE
void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode)
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
#define ARRAY_SET_ITEMS(...)
const char * dirname(char *path)
#define RE_PASSNAME_COMBINED
#define RE_PASSNAME_DIFFUSE_INDIRECT
#define RE_PASSNAME_INDEXMA
#define RE_PASSNAME_SUBSURFACE_DIRECT
#define RE_PASSNAME_NORMAL
#define RE_PASSNAME_TRANSM_DIRECT
#define RE_PASSNAME_VECTOR
#define RE_PASSNAME_TRANSM_COLOR
#define RE_PASSNAME_SUBSURFACE_INDIRECT
#define RE_PASSNAME_GLOSSY_COLOR
#define RE_PASSNAME_SUBSURFACE_COLOR
#define RE_PASSNAME_TRANSM_INDIRECT
#define RE_PASSNAME_GLOSSY_DIRECT
#define RE_PASSNAME_SHADOW
#define RE_PASSNAME_ENVIRONMENT
#define RE_PASSNAME_DIFFUSE_COLOR
#define RE_PASSNAME_GLOSSY_INDIRECT
#define STEREO_RIGHT_NAME
#define RE_PASSNAME_RAYHITS
#define RE_PASSNAME_DIFFUSE_DIRECT
#define R_IMF_IMTYPE_OPENEXR
#define RE_PASSNAME_INDEXOB
@ SCE_PASS_SUBSURFACE_INDIRECT
@ SCE_PASS_SUBSURFACE_COLOR
@ SCE_PASS_DIFFUSE_DIRECT
@ SCE_PASS_GLOSSY_INDIRECT
@ SCE_PASS_TRANSM_INDIRECT
@ SCE_PASS_DIFFUSE_INDIRECT
@ SCE_PASS_SUBSURFACE_DIRECT
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
void IMB_display_buffer_transform_apply(unsigned char *display_buffer, float *linear_buffer, int width, int height, int channels, const struct ColorManagedViewSettings *view_settings, const struct ColorManagedDisplaySettings *display_settings, bool predivide)
const char * IMB_colormanagement_role_colorspace_name_get(int role)
@ COLOR_ROLE_SCENE_LINEAR
void IMB_colormanagement_transform(float *buffer, int width, int height, int channels, const char *from_colorspace, const char *to_colorspace, bool predivide)
void IMB_float_from_rect(struct ImBuf *ibuf)
void IMB_color_to_bw(struct ImBuf *ibuf)
struct ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
struct ImBuf * IMB_dupImBuf(const struct ImBuf *ibuf1)
void IMB_freeImBuf(struct ImBuf *ibuf)
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
void RE_engine_update_render_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer, update_render_passes_cb_t callback, void *callback_data)
void * BKE_tempdir_session
void(* MEM_freeN)(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
void *(* MEM_mallocN)(size_t len, const char *str)
static void sample(SocketReader *reader, int x, int y, float color[4])
void IMB_exr_add_view(void *handle, const char *name)
void IMB_exr_close(void *handle)
void IMB_exrtile_begin_write(void *handle, const char *filename, int mipmap, int width, int height, int tilex, int tiley)
void IMB_exr_add_channel(void *handle, const char *layname, const char *passname, const char *viewname, int xstride, int ystride, float *rect, bool use_half_float)
void IMB_exr_write_channels(void *handle)
int IMB_exr_begin_write(void *handle, const char *filename, int width, int height, int compress, const StampData *stamp)
void IMB_exr_read_channels(void *handle)
void IMB_exrtile_write_channels(void *handle, int partx, int party, int level, const char *viewname, bool empty)
void IMB_exr_set_channel(void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect)
void * IMB_exr_get_handle(void)
int IMB_exr_begin_read(void *handle, const char *filename, int *width, int *height)
void IMB_exr_multilayer_convert(void *handle, void *base, void *(*addview)(void *base, const char *str), void *(*addlayer)(void *base, const char *str), void(*addpass)(void *base, void *lay, const char *str, float *rect, int totchan, const char *chan_id, const char *view))
void RE_FreeRenderResult(RenderResult *rr)
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
static int order_render_passes(const void *a, const void *b)
static void render_result_views_free(RenderResult *rr)
static void render_result_get_pass_templates(RenderEngine *engine, Render *re, RenderLayer *rl, ListBase *templates)
bool RE_WriteRenderResult(ReportList *reports, RenderResult *rr, const char *filename, ImageFormatData *imf, const char *view, int layer)
void render_result_single_layer_end(Render *re)
bool RE_HasCombinedLayer(RenderResult *rr)
void render_result_exr_file_cache_write(Render *re)
static void set_pass_full_name(char *fullname, const char *name, int channel, const char *view, const char *chan_id)
RenderView * RE_RenderViewGetById(RenderResult *rr, const int view_id)
void render_result_exr_file_end(Render *re, RenderEngine *engine)
static void * ml_addview_cb(void *base, const char *str)
void render_result_exr_file_path(Scene *scene, const char *layname, int sample, char *filepath)
bool render_result_exr_file_cache_read(Render *re)
void render_result_rect_fill_zero(RenderResult *rr, const int view_id)
void RE_create_render_pass(RenderResult *rr, const char *name, int channels, const char *chan_id, const char *layername, const char *viewname)
void render_result_views_shallowdelete(RenderResult *rr)
void render_result_views_new(RenderResult *rr, const RenderData *rd)
static void * ml_addlayer_cb(void *base, const char *str)
void render_result_merge(RenderResult *rr, RenderResult *rrpart)
int render_result_exr_file_read_path(RenderResult *rr, RenderLayer *rl_single, const char *filepath)
void render_result_view_new(RenderResult *rr, const char *viewname)
bool RE_RenderResult_is_stereo(RenderResult *rr)
RenderResult * render_result_new_from_exr(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
void render_result_free(RenderResult *rr)
void render_result_rect_get_pixels(RenderResult *rr, unsigned int *rect, int rectx, int recty, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const int view_id)
RenderPass * render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, const char *name, const char *viewname, const char *chan_id)
bool RE_HasFloatPixels(RenderResult *rr)
ImBuf * render_result_rect_to_ibuf(RenderResult *rr, const RenderData *rd, const int view_id)
static void templates_register_pass_cb(void *userdata, Scene *UNUSED(scene), ViewLayer *UNUSED(view_layer), const char *name, int channels, const char *chan_id, eNodeSocketDatatype UNUSED(type))
void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname)
static char * set_pass_name(char *outname, const char *name, int channel, const char *chan_id)
void render_result_exr_file_begin(Render *re, RenderEngine *engine)
RenderView * RE_RenderViewGetByName(RenderResult *rr, const char *viewname)
void render_result_free_list(ListBase *lb, RenderResult *rr)
static void save_render_result_tile(RenderResult *rr, RenderResult *rrpart, const char *viewname)
RenderResult * render_result_new(Render *re, rcti *partrct, int savebuffers, const char *layername, const char *viewname)
bool render_result_has_views(RenderResult *rr)
void render_result_exr_file_merge(RenderResult *rr, RenderResult *rrpart, const char *viewname)
static int passtype_from_name(const char *name)
void render_result_single_layer_begin(Render *re)
static void ml_addpass_cb(void *base, void *lay, const char *name, float *rect, int totchan, const char *chan_id, const char *view)
static RenderPass * duplicate_render_pass(RenderPass *rpass)
void render_result_save_empty_result_tiles(Render *re)
void RE_render_result_rect_from_ibuf(RenderResult *rr, RenderData *UNUSED(rd), ImBuf *ibuf, const int view_id)
static RenderLayer * duplicate_render_layer(RenderLayer *rl)
static RenderView * duplicate_render_view(RenderView *rview)
#define RENDER_LAYER_ADD_PASS_SAFE(rr, rl, channels, name, viewname, chan_id)
RenderResult * RE_DuplicateRenderResult(RenderResult *rr)
static void render_result_exr_file_cache_path(Scene *sce, const char *root, char *r_path)
static void do_merge_tile(RenderResult *rr, RenderResult *rrpart, float *target, float *tile, int pixsize)
void render_result_views_shallowcopy(RenderResult *dst, RenderResult *src)
#define FOREACH_VIEW_LAYER_TO_RENDER_END
#define FOREACH_VIEW_LAYER_TO_RENDER_BEGIN(re_, iter_)
struct ImageFormatData im_format
void(* update_render_passes)(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
struct RenderLayer * next
struct RenderLayer * prev
struct RenderResult * next
struct RenderResult * prev
struct StampData * stamp_data
RenderResult * pushedresult
ThreadRWMutex resultmutex
struct SceneRenderView * next