100 if (!render_result) {
119 const char *view_name = context.get_view_name().data();
123 if (matched_view == -1) {
138 const char *pass_name)
140 ImageUser image_user_for_pass = *image_user;
143 image_user_for_pass.
view =
get_view_index(context, render_result, image_user_for_pass);
147 image_user_for_pass.
pass =
get_pass_index(render_result, image_user_for_pass, pass_name);
154 return image_user_for_pass;
176 image_buffer->
x, image_buffer->
y, image_buffer->
planes, 0);
177 linear_image_buffer->
flags = image_buffer->
flags;
196 const bool is_suitable_compressed_color_space =
204 return linear_image_buffer;
214 const ImBuf *image_buffer)
216 if (!render_result) {
260 const char *pass_name)
272 if (!initial_image_buffer) {
279 context, image, render_result, image_user, pass_name);
281 this->populate_meta_data(render_result, image_user_for_pass);
295 if (context.use_gpu()) {
298 this->
result.wrap_external(texture_);
315void CachedImage::populate_meta_data(
const RenderResult *render_result,
318 if (!render_result) {
334 const bool is_named_layer = render_layer->
name[0] !=
'\0';
335 const std::string layer_prefix = is_named_layer ? std::string(render_layer->
name) +
"." :
"";
336 const std::string combined_pass_name = layer_prefix + render_pass->
name;
340 struct StampCallbackData {
341 std::string cryptomatte_layer_name;
342 compositor::MetaData *meta_data;
346 StampCallbackData callback_data = {cryptomatte_layer_name, &this->
result.meta_data};
350 [](
void *user_data,
const char *key,
char *value,
int ) {
351 StampCallbackData *data = static_cast<StampCallbackData *>(user_data);
353 const std::string manifest_key = bke::cryptomatte::BKE_cryptomatte_meta_data_key(
354 data->cryptomatte_layer_name,
"manifest");
355 if (key == manifest_key) {
356 data->meta_data->cryptomatte.manifest = value;
360 data->cryptomatte_layer_name,
"hash");
362 data->meta_data->cryptomatte.hash = value;
366 data->cryptomatte_layer_name,
"conversion");
367 if (key == conversion_key) {
368 data->meta_data->cryptomatte.conversion = value;
387 for (
auto &cached_images_for_id : map_.values()) {
388 cached_images_for_id.remove_if([](
auto item) {
return !item.value->needed; });
390 map_.remove_if([](
auto item) {
return item.value.is_empty(); });
391 update_counts_.remove_if([&](
auto item) {
return !map_.contains(item.key); });
395 for (
auto &cached_images_for_id : map_.values()) {
396 for (
auto &value : cached_images_for_id.values()) {
397 value->needed =
false;
405 const char *pass_name)
407 if (!image || !image_user) {
412 ImageUser image_user_for_frame = *image_user;
419 const std::string view_name = image_user->
view == 0 ? std::string(context.get_view_name()) :
420 std::to_string(image_user->
view);
424 const std::string library_key = image->
id.
lib ? image->
id.
lib->
id.
name :
"";
425 const std::string id_key = std::string(image->
id.
name) + library_key;
426 auto &cached_images_for_id = map_.lookup_or_add_default(id_key);
429 if (!cached_images_for_id.is_empty() &&
430 image->
runtime->update_count != update_counts_.lookup(id_key))
432 cached_images_for_id.clear();
435 auto &cached_image = *cached_images_for_id.lookup_or_add_cb(key, [&]() {
436 return std::make_unique<CachedImage>(context, image, &image_user_for_frame, pass_name);
440 update_counts_.add_overwrite(id_key, image->
runtime->update_count);
442 cached_image.needed =
true;
443 return cached_image.result;
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
bool BKE_image_is_multilayer(const Image *ima)
void BKE_image_user_frame_calc(Image *ima, ImageUser *iuser, int cfra)
RenderPass * BKE_image_multilayer_index(RenderResult *rr, ImageUser *iuser)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
void BKE_image_release_renderresult(Scene *scene, Image *ima, RenderResult *render_result)
void BKE_stamp_info_callback(void *data, StampData *stamp_data, StampCallback callback, bool noskip)
RenderResult * BKE_image_acquire_renderresult(Scene *scene, Image *ima)
void BKE_image_multiview_index(const Image *ima, ImageUser *iuser)
#define BLI_assert_unreachable()
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count_at_most(const ListBase *listbase, int count_max) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_findstringindex(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
ID and Library types, which are fundamental for SDNA.
#define GPU_TEXTURE_FREE_SAFE(texture)
void GPU_texture_update_mipmap_chain(GPUTexture *texture)
bool IMB_colormanagement_space_is_scene_linear(const ColorSpace *colorspace)
bool IMB_colormanagement_space_is_data(const ColorSpace *colorspace)
void IMB_assign_dds_data(ImBuf *ibuf, const DDSData &data, ImBufOwnership ownership)
void IMB_assign_float_buffer(ImBuf *ibuf, float *buffer_data, ImBufOwnership ownership)
void IMB_freeImBuf(ImBuf *ibuf)
ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
void IMB_assign_byte_buffer(ImBuf *ibuf, uint8_t *buffer_data, ImBufOwnership ownership)
GPUTexture * IMB_create_gpu_texture(const char *name, ImBuf *ibuf, bool use_high_bitdepth, bool use_premult)
void IMB_float_from_byte(ImBuf *ibuf)
@ IB_DO_NOT_TAKE_OWNERSHIP
BMesh const char void * data
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Result get(Context &context, Image *image, const ImageUser *image_user, const char *pass_name)
CachedImageKey(const int layer_index, const std::string pass_name, const std::string view_name, const int frame)
const std::string view_name
const std::string pass_name
CachedImage(Context &context, Image *image, ImageUser *image_user, const char *pass_name)
static ResultType float_type(const int channels_count)
void wrap_external(GPUTexture *texture)
float4 load_pixel_generic_type(const int2 &texel) const
StringRef BKE_cryptomatte_extract_layer_name(StringRef render_pass_name)
std::string BKE_cryptomatte_meta_data_key(StringRef layer_name, StringRefNull key_name)
bool operator==(const BokehKernelKey &a, const BokehKernelKey &b)
static ImBuf * compute_linear_buffer(ImBuf *image_buffer)
static int get_pass_index(const RenderResult *render_result, const ImageUser &image_user, const char *name)
static RenderPass * get_render_pass(const RenderLayer *render_layer, const ImageUser &image_user)
static int get_view_index(const Context &context, const RenderResult *render_result, const ImageUser &image_user)
static ImageUser compute_image_user_for_pass(const Context &context, const Image *image, const RenderResult *render_result, const ImageUser *image_user, const char *pass_name)
static RenderLayer * get_render_layer(const RenderResult *render_result, const ImageUser &image_user)
static ResultType get_result_type(const RenderResult *render_result, const ImageUser &image_user, const ImBuf *image_buffer)
void parallel_for(const int2 range, const Function &function)
uint64_t get_default_hash(const T &v, const Args &...args)
VecBase< int32_t, 2 > int2
const ColorSpace * colorspace
ImBufFloatBuffer float_buffer
ImbFormatOptions foptions
ImBufByteBuffer byte_buffer
ImageRuntimeHandle * runtime
struct StampData * stamp_data