111 for (; rr; rr = rrnext) {
114 if (lb && lb->
first) {
139 if (dst ==
nullptr || src ==
nullptr) {
146 rv = MEM_cnew<RenderView>(
"new render view");
151 rv->
ibuf = rview->ibuf;
209 float *buffer_data = MEM_cnew_array<float>(rectsize, rp->
name);
218 for (
int x = rectsize - 1; x >= 0; x--) {
223 for (
int x = rectsize - 1; x >= 0; x--) {
224 buffer_data[
x] = 10e10;
233 const char *viewname,
238 RenderPass *rpass = MEM_cnew<RenderPass>(name);
256 passname,
nullptr, rpass->
name,
nullptr, rpass->
chan_id, a);
276 const char *layername,
277 const char *viewname)
286 if (rectx <= 0 || recty <= 0) {
290 rr = MEM_cnew<RenderResult>(
"new render result");
306 if (layername && layername[0]) {
307 if (!
STREQ(view_layer->name, layername)) {
312 rl = MEM_cnew<RenderLayer>(
"new render layer");
316 rl->
layflag = view_layer->layflag;
318 rl->
passflag = view_layer->passflag;
324 const char *view = rv->name;
326 if (viewname && viewname[0]) {
327 if (!
STREQ(view, viewname)) {
340 rl = MEM_cnew<RenderLayer>(
"new render layer");
347 const char *view = rv->name;
349 if (viewname && viewname[0]) {
350 if (!
STREQ(view, viewname)) {
404 if (viewname && viewname[0] && !
STREQ(main_rp->view, viewname)) {
413 rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id,
false);
423 const char *layername,
424 const char *viewname,
428 if (layername && layername[0] && !
STREQ(rl->name, layername)) {
433 const char *view = rv->name;
435 if (viewname && viewname[0] && !
STREQ(view, viewname)) {
440 bool pass_exists =
false;
442 if (
STREQ(rp->name, name) &&
STREQ(rp->view, view)) {
504 const char *passname,
505 const char *viewname,
510 const char *strings[4];
513 if (layname && layname[0]) {
514 strings[strings_len++] = layname;
516 if (passname && passname[0]) {
517 strings[strings_len++] = passname;
519 if (viewname && viewname[0]) {
520 strings[strings_len++] = viewname;
526 strings[strings_len++] = token;
534 const char delim[] = {
'.',
'\0'};
535 const char *sep, *suf;
538#define CHECK_PASS(NAME) \
539 if (STREQLEN(name, RE_PASSNAME_##NAME, len)) { \
540 return SCE_PASS_##NAME; \
578 RenderLayer *rl = MEM_cnew<RenderLayer>(
"new render layer");
595 RenderPass *rpass = MEM_cnew<RenderPass>(
"loaded pass");
612 if (view[0] !=
'\0') {
624 RenderView *rv = MEM_cnew<RenderView>(
"new render view");
638 if (left_rv ==
nullptr) {
661 if (passtype_b && !passtype_a) {
664 if (passtype_a && !passtype_b) {
668 if (passtype_a && passtype_b) {
669 if (passtype_a > passtype_b) {
672 if (passtype_a < passtype_b) {
708 void *exrhandle,
const char *colorspace,
bool predivide,
int rectx,
int recty)
727 rpass->rectx = rectx;
728 rpass->recty = recty;
750 RenderView *rv = MEM_cnew<RenderView>(
"new render view");
788 copylen = tilex = rrpart->
rectx;
789 tiley = rrpart->
recty;
792 target += pixsize * ofs;
794 copylen *=
sizeof(
float) * pixsize;
796 ofs = pixsize * rr->
rectx;
798 for (y = 0; y < tiley; y++) {
799 memcpy(target,
tile, copylen);
818 if (rpass->ibuf ==
nullptr || rpassp->ibuf ==
nullptr) {
821 if (rpass->ibuf->float_buffer.data ==
nullptr ||
822 rpassp->ibuf->float_buffer.data ==
nullptr)
827 if (!
STREQ(rpassp->fullname, rpass->fullname)) {
834 rpassp->ibuf->float_buffer.data,
838 rpassp = rpassp->next;
863 if (re->
result ==
nullptr) {
864 printf(
"pop render result error; no current result!\n");
902 const char *filepath)
913 const int expected_rectx = (rr) ? rr->
rectx : rl_single->
rectx;
914 const int expected_recty = (rr) ? rr->
recty : rl_single->
recty;
915 bool found_channels =
false;
917 if (rectx != expected_rectx || recty != expected_recty) {
920 "Reading render result: dimensions don't match, expected %dx%d",
928 if (rl_single && rl_single != rl) {
934 const int xstride = rpass->channels;
935 const int ystride = xstride * rectx;
939 for (a = 0; a < xstride; a++) {
941 fullname,
nullptr, rpass->name, rpass->view, rpass->chan_id, a);
948 rpass->ibuf->float_buffer.data + a))
950 found_channels =
true;
952 else if (rl_single) {
958 rpass->ibuf->float_buffer.data + a))
960 found_channels =
true;
965 "Reading render result: expected channel \"%s.%s\" or \"%s\" not found",
974 "Reading render result: expected channel \"%s.%s\" not found",
981 rpass->fullname,
nullptr, rpass->name, rpass->view, rpass->chan_id, -1);
985 if (found_channels) {
994#define FILE_CACHE_MAX (FILE_MAXDIR + FILE_MAXFILE + MAX_ID_NAME + 100)
1003 char path_digest[16] = {0};
1004 char path_hexdigest[33];
1008 if (blendfile_path[0] !=
'\0') {
1021 if (*root ==
'\0') {
1030 SNPRINTF(filename_full,
"cached_RR_%s_%s_%s.exr", filename, sce->
id.
name + 2, path_hexdigest);
1039 const char *root =
U.render_cachedir;
1053 const char *root =
U.render_cachedir;
1056 printf(
"read exr cache file: %s\n", filepath);
1063 printf(
"cannot read: %s\n", filepath);
1152 float *data = MEM_cnew_array<float>(4 * rr->
rectx * rr->
recty,
"render_seq rectf");
1168 uint8_t *data = MEM_cnew_array<uint8_t>(4 * rr->
rectx * rr->
recty,
"render_seq rect");
1186 uint8_t *data = MEM_cnew_array<uint8_t>(4 * rr->
rectx * rr->
recty,
"render_seq rect");
1209 if (
ImBuf *ibuf = rv ? rv->
ibuf :
nullptr) {
1210 if (ibuf->byte_buffer.data) {
1211 memcpy(rect, ibuf->byte_buffer.data,
sizeof(
int) * rr->
rectx * rr->
recty);
1214 if (ibuf->float_buffer.data) {
1216 ibuf->float_buffer.data,
1228 memset(rect, 0,
sizeof(
int) * rectx * recty);
1239 if (result ==
nullptr) {
1244 if (rv ==
nullptr) {
1254 ImBuf *ibuf = rview->ibuf;
1296 RenderPass *new_rpass = MEM_cnew<RenderPass>(
"new render pass", *rpass);
1297 new_rpass->
next = new_rpass->
prev =
nullptr;
1306 RenderLayer *new_rl = MEM_cnew<RenderLayer>(
"new render layer", *rl);
1307 new_rl->
next = new_rl->
prev =
nullptr;
1319 RenderView *new_rview = MEM_cnew<RenderView>(
"new render view", *rview);
1328 RenderResult *new_rr = MEM_cnew<RenderResult>(
"new duplicated render result", *rr);
1329 new_rr->
next = new_rr->
prev =
nullptr;
1349 if (!render_pass->
ibuf) {
1356 return render_pass->
ibuf;
1361 if (!render_view->
ibuf) {
1365 return render_view->
ibuf;
1370 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)
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)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) 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)
int BLI_findstringindex(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
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 STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
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)
const char * IMB_colormanagement_role_colorspace_name_get(int role)
@ COLOR_ROLE_SCENE_LINEAR
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_colormanagement_transform(float *buffer, int width, int height, int channels, const char *from_colorspace, const char *to_colorspace, bool predivide)
void imb_freerectImBuf(ImBuf *ibuf)
void IMB_free_gpu_textures(ImBuf *ibuf)
void imb_freerectfloatImBuf(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_assign_byte_buffer(ImBuf *ibuf, uint8_t *buffer_data, ImBufOwnership ownership)
void IMB_float_from_rect(ImBuf *ibuf)
Contains defines and structs used throughout the imbuf module.
@ 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)
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.
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
local_group_size(16, 16) .push_constant(Type b
additional_info("compositor_sum_float_shared") .push_constant(Type additional_info("compositor_sum_float_shared") .push_constant(Type GPU_RGBA32F
draw_view in_light_buf[] float
struct ImBuf * IMB_allocImBuf(unsigned int, unsigned int, unsigned char, unsigned int)
void IMB_freeImBuf(ImBuf *)
ccl_global const KernelWorkTile * tile
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]