111 for (; rr; rr = rrnext) {
114 if (lb && lb->
first) {
139 if (dst ==
nullptr || src ==
nullptr) {
151 rv->
ibuf = rview->ibuf;
219 for (
int x = rectsize - 1;
x >= 0;
x--) {
224 for (
int x = rectsize - 1;
x >= 0;
x--) {
225 buffer_data[
x] = 10e10;
234 const char *viewname,
254 for (a = 0; a < channels; a++) {
257 passname,
nullptr, rpass->
name,
nullptr, rpass->
chan_id, a);
277 const char *layername,
278 const char *viewname)
287 if (rectx <= 0 || recty <= 0) {
309 if (layername && layername[0]) {
310 if (!
STREQ(view_layer->name, layername)) {
319 rl->
layflag = view_layer->layflag;
321 rl->
passflag = view_layer->passflag;
327 const char *
view = rv->name;
329 if (viewname && viewname[0]) {
350 const char *
view = rv->name;
352 if (viewname && viewname[0]) {
407 if (viewname && viewname[0] && !
STREQ(main_rp->view, viewname)) {
416 rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id,
false);
426 const char *layername,
427 const char *viewname,
431 if (layername && layername[0] && !
STREQ(rl->name, layername)) {
436 const char *
view = rv->name;
438 if (viewname && viewname[0] && !
STREQ(
view, viewname)) {
443 bool pass_exists =
false;
507 const char *passname,
508 const char *viewname,
513 const char *strings[4];
516 if (layname && layname[0]) {
517 strings[strings_len++] = layname;
519 if (passname && passname[0]) {
520 strings[strings_len++] = passname;
522 if (viewname && viewname[0]) {
523 strings[strings_len++] = viewname;
529 strings[strings_len++] = token;
537 const char delim[] = {
'.',
'\0'};
538 const char *sep, *suf;
541#define CHECK_PASS(NAME) \
542 if (STREQLEN(name, RE_PASSNAME_##NAME, len)) { \
543 return SCE_PASS_##NAME; \
615 if (
view[0] !=
'\0') {
641 if (left_rv ==
nullptr) {
664 if (passtype_b && !passtype_a) {
667 if (passtype_a && !passtype_b) {
671 if (passtype_a && passtype_b) {
672 if (passtype_a > passtype_b) {
675 if (passtype_a < passtype_b) {
711 void *exrhandle,
const char *colorspace,
bool predivide,
int rectx,
int recty)
732 rpass->rectx = rectx;
733 rpass->recty = recty;
795 copylen = tilex = rrpart->
rectx;
796 tiley = rrpart->
recty;
799 target += pixsize * ofs;
801 copylen *=
sizeof(float) * pixsize;
803 ofs = pixsize * rr->
rectx;
805 for (
y = 0;
y < tiley;
y++) {
806 memcpy(target,
tile, copylen);
825 if (rpass->ibuf ==
nullptr || rpassp->ibuf ==
nullptr) {
828 if (rpass->ibuf->float_buffer.data ==
nullptr ||
829 rpassp->ibuf->float_buffer.data ==
nullptr)
834 if (!
STREQ(rpassp->fullname, rpass->fullname)) {
841 rpassp->ibuf->float_buffer.data,
845 rpassp = rpassp->next;
870 if (re->
result ==
nullptr) {
871 printf(
"pop render result error; no current result!\n");
909 const char *filepath)
920 const int expected_rectx = (rr) ? rr->
rectx : rl_single->
rectx;
921 const int expected_recty = (rr) ? rr->
recty : rl_single->
recty;
922 bool found_channels =
false;
924 if (rectx != expected_rectx || recty != expected_recty) {
927 "Reading render result: dimensions don't match, expected %dx%d",
935 if (rl_single && rl_single != rl) {
941 const int xstride = rpass->channels;
942 const int ystride = xstride * rectx;
946 for (a = 0; a < xstride; a++) {
948 fullname,
nullptr, rpass->name, rpass->view, rpass->chan_id, a);
955 rpass->ibuf->float_buffer.data + a))
957 found_channels =
true;
959 else if (rl_single) {
965 rpass->ibuf->float_buffer.data + a))
967 found_channels =
true;
972 "Reading render result: expected channel \"%s.%s\" or \"%s\" not found",
981 "Reading render result: expected channel \"%s.%s\" not found",
988 rpass->fullname,
nullptr, rpass->name, rpass->view, rpass->chan_id, -1);
992 if (found_channels) {
1001#define FILE_CACHE_MAX (FILE_MAXDIR + FILE_MAXFILE + MAX_ID_NAME + 100)
1010 char path_digest[16] = {0};
1011 char path_hexdigest[33];
1015 if (blendfile_path[0] !=
'\0') {
1028 if (*root ==
'\0') {
1037 SNPRINTF(filename_full,
"cached_RR_%s_%s_%s.exr", filename, sce->
id.
name + 2, path_hexdigest);
1046 const char *root =
U.render_cachedir;
1060 const char *root =
U.render_cachedir;
1063 printf(
"read exr cache file: %s\n", filepath);
1070 printf(
"cannot read: %s\n", filepath);
1162 "render_seq float");
1221 if (
ImBuf *ibuf = rv ? rv->
ibuf :
nullptr) {
1222 if (ibuf->byte_buffer.data) {
1223 memcpy(rect, ibuf->byte_buffer.data,
sizeof(
int) * rr->
rectx * rr->
recty);
1226 if (ibuf->float_buffer.data) {
1228 ibuf->float_buffer.data,
1240 memset(rect, 0,
sizeof(
int) * rectx * recty);
1256 if (rv ==
nullptr) {
1266 ImBuf *ibuf = rview->ibuf;
1309 new_rpass->
next = new_rpass->
prev =
nullptr;
1319 new_rl->
next = new_rl->
prev =
nullptr;
1341 new_rr->
next = new_rr->
prev =
nullptr;
1364 if (!render_pass->
ibuf) {
1371 return render_pass->
ibuf;
1376 if (!render_view->
ibuf) {
1380 return render_view->
ibuf;
1385 return STR_ELEM(render_pass->
chan_id,
"RGB",
"RGBA",
"R",
"G",
"B",
"A");
const char * BKE_tempdir_base() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
StampData * BKE_stamp_data_copy(const StampData *stamp_data)
void BKE_stamp_data_free(StampData *stamp_data)
bool BKE_image_render_write_exr(ReportList *reports, const RenderResult *rr, const char *filepath, const ImageFormatData *imf, const bool save_as_render, const char *view, int layer)
const char * BKE_main_blendfile_path_from_global()
void BKE_reportf(ReportList *reports, eReportType type, const char *format,...) ATTR_PRINTF_FORMAT(3
bool BKE_scene_multiview_is_render_view_active(const RenderData *rd, const SceneRenderView *srv)
void BKE_scene_ppm_get(const RenderData *rd, double r_ppm[2])
char * BLI_hash_md5_to_hexdigest(const void *resblock, char r_hex_digest[33])
void * BLI_hash_md5_buffer(const char *buffer, size_t len, void *resblock)
void * BLI_findlink(const ListBase *listbase, int number) 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)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BLI_freelinkN(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_addhead(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findstringindex(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void void BLI_listbase_sort(ListBase *listbase, int(*cmp)(const void *, const void *)) ATTR_NONNULL(1
MINLINE void copy_v2_v2_db(double r[2], const double a[2])
bool BLI_path_abs(char path[FILE_MAX], const char *basepath) ATTR_NONNULL(1
bool bool BLI_path_extension_strip(char *path) ATTR_NONNULL(1)
#define BLI_path_join(...)
void BLI_path_split_dir_file(const char *filepath, char *dir, size_t dir_maxncpy, char *file, size_t file_maxncpy) ATTR_NONNULL(1
bool BLI_path_is_rel(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
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)
int bool bool bool size_t BLI_str_partition(const char *str, const char delim[], const char **sep, const char **suf) ATTR_NONNULL(1
#define SNPRINTF(dst, format,...)
char * STRNCPY(char(&dst)[N], const char *src)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
size_t BLI_string_join_array_by_sep_char(char *result, size_t result_maxncpy, char sep, const char *strings[], uint strings_num) ATTR_NONNULL()
#define ARRAY_SET_ITEMS(...)
const char * dirname(char *path)
#define RE_PASSNAME_COMBINED
#define RE_PASSNAME_VECTOR
@ R_IMF_IMTYPE_MULTILAYER
#define STEREO_RIGHT_NAME
GPUTexture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, eGPUTextureFormat format, eGPUTextureUsage usage, const float *data)
@ GPU_TEXTURE_USAGE_GENERAL
void GPU_texture_update(GPUTexture *texture, eGPUDataFormat data_format, const void *data)
void IMB_colormanagement_assign_float_colorspace(ImBuf *ibuf, const char *name)
void IMB_colormanagement_transform_float(float *buffer, int width, int height, int channels, const char *from_colorspace, const char *to_colorspace, bool predivide)
@ COLOR_ROLE_SCENE_LINEAR
const char * IMB_colormanagement_role_colorspace_name_get(int role)
void IMB_display_buffer_transform_apply(unsigned char *display_buffer, float *linear_buffer, int width, int height, int channels, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, bool predivide)
void IMB_free_gpu_textures(ImBuf *ibuf)
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
void IMB_color_to_bw(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)
void IMB_free_byte_pixels(ImBuf *ibuf)
void IMB_assign_byte_buffer(ImBuf *ibuf, uint8_t *buffer_data, ImBufOwnership ownership)
void IMB_float_from_byte(ImBuf *ibuf)
@ IB_DO_NOT_TAKE_OWNERSHIP
void IMB_exr_close(void *handle)
bool IMB_exr_begin_read(void *handle, const char *filepath, int *width, int *height, bool parse_channels)
bool IMB_exr_get_ppm(void *handle, double ppm[2])
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_read_channels(void *handle)
bool IMB_exr_set_channel(void *handle, const char *layname, const char *passname, int xstride, int ystride, float *rect)
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 * IMB_exr_get_handle()
Read Guarded memory(de)allocation.
BMesh const char void * data
const ccl_global KernelWorkTile * tile
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
static void render_result_exr_file_cache_path(Scene *sce, const char *root, char r_path[FILE_CACHE_MAX])
static int order_render_passes(const void *a, const void *b)
bool render_result_exr_file_read_path(RenderResult *rr, RenderLayer *rl_single, ReportList *reports, const char *filepath)
GPUTexture * RE_pass_ensure_gpu_texture_cache(Render *re, RenderPass *rpass)
static void render_result_views_free(RenderResult *rr)
ImBuf * RE_RenderPassEnsureImBuf(RenderPass *render_pass)
void RE_pass_set_buffer_data(RenderPass *pass, float *data)
RenderView * RE_RenderViewGetByName(RenderResult *rr, const char *viewname)
void render_result_single_layer_end(Render *re)
bool RE_HasCombinedLayer(const RenderResult *result)
void render_result_exr_file_cache_write(Render *re)
void render_result_free_gpu_texture_caches(RenderResult *rr)
ImBuf * RE_RenderViewEnsureImBuf(const RenderResult *render_result, RenderView *render_view)
bool RE_RenderPassIsColor(const RenderPass *render_pass)
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)
bool RE_HasFloatPixels(const RenderResult *result)
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)
static void render_layer_allocate_pass(RenderResult *rr, RenderPass *rp)
static void assign_render_pass_ibuf_colorspace(RenderPass &render_pass)
void render_result_free(RenderResult *rr)
RenderResult * render_result_new_from_exr(void *exrhandle, const char *colorspace, bool predivide, int rectx, int recty)
static RenderLayer * duplicate_render_layer(RenderLayer *rl)
static void * ml_addlayer_cb(void *base, const char *str)
void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname)
void render_result_free_list(ListBase *lb, RenderResult *rr)
void RE_render_result_full_channel_name(char *fullname, const char *layname, const char *passname, const char *viewname, const char *chan_id, const int channel)
RenderView * RE_RenderViewGetById(RenderResult *rr, const int view_id)
RenderResult * RE_DuplicateRenderResult(RenderResult *rr)
static int passtype_from_name(const char *name)
static RenderView * duplicate_render_view(RenderView *rview)
void render_result_single_layer_begin(Render *re)
static void * ml_addview_cb(void *base, const char *str)
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_rect_get_pixels(RenderResult *rr, uint *rect, int rectx, int recty, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const int view_id)
static int get_num_planes_for_pass_ibuf(const RenderPass &render_pass)
RenderResult * render_result_new(Render *re, const rcti *partrct, const char *layername, const char *viewname)
bool RE_RenderResult_is_stereo(const RenderResult *result)
void RE_create_render_pass(RenderResult *rr, const char *name, int channels, const char *chan_id, const char *layername, const char *viewname, const bool allocate)
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_)
void RE_FreeRenderResult(RenderResult *rr)
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
struct RenderLayer * next
struct RenderLayer * prev
struct RenderResult * next
struct RenderResult * prev
struct StampData * stamp_data
bool result_has_gpu_texture_caches
RenderResult * pushedresult
char single_view_layer[MAX_NAME]