117 const char *view_name = context.get_view_name().data();
121 if (matched_view == -1) {
136 const char *pass_name)
138 ImageUser image_user_for_pass = *image_user;
141 image_user_for_pass.
view =
get_view_index(context, render_result, image_user_for_pass);
145 image_user_for_pass.
pass =
get_pass_index(render_result, image_user_for_pass, pass_name);
152 return image_user_for_pass;
174 image_buffer->
x, image_buffer->
y, image_buffer->
planes, 0);
175 linear_image_buffer->
flags = image_buffer->
flags;
194 const bool is_suitable_compressed_color_space =
202 return linear_image_buffer;
212 const ImBuf *image_buffer)
214 if (!render_result) {
258 const char *pass_name)
270 if (!initial_image_buffer) {
277 context, image, render_result, image_user, pass_name);
279 this->populate_meta_data(render_result, image_user_for_pass);
293 if (context.use_gpu()) {
296 this->
result.wrap_external(texture_);
313void CachedImage::populate_meta_data(
const RenderResult *render_result,
316 if (!render_result) {
332 const bool is_named_layer = render_layer->
name[0] !=
'\0';
333 const std::string layer_prefix = is_named_layer ? std::string(render_layer->
name) +
"." :
"";
334 const std::string combined_pass_name = layer_prefix + render_pass->
name;
338 struct StampCallbackData {
339 std::string cryptomatte_layer_name;
340 compositor::MetaData *meta_data;
344 StampCallbackData callback_data = {cryptomatte_layer_name, &this->
result.meta_data};
348 [](
void *user_data,
const char *key,
char *value,
int ) {
349 StampCallbackData *data = static_cast<StampCallbackData *>(user_data);
351 const std::string manifest_key = bke::cryptomatte::BKE_cryptomatte_meta_data_key(
352 data->cryptomatte_layer_name,
"manifest");
353 if (key == manifest_key) {
354 data->meta_data->cryptomatte.manifest = value;
358 data->cryptomatte_layer_name,
"hash");
360 data->meta_data->cryptomatte.hash = value;
364 data->cryptomatte_layer_name,
"conversion");
365 if (key == conversion_key) {
366 data->meta_data->cryptomatte.conversion = value;
385 for (
auto &cached_images_for_id : map_.values()) {
386 cached_images_for_id.remove_if([](
auto item) {
return !item.value->needed; });
388 map_.remove_if([](
auto item) {
return item.value.is_empty(); });
389 update_counts_.remove_if([&](
auto item) {
return !map_.contains(item.key); });
393 for (
auto &cached_images_for_id : map_.values()) {
394 for (
auto &value : cached_images_for_id.values()) {
395 value->needed =
false;
403 const char *pass_name)
405 if (!image || !image_user) {
410 ImageUser image_user_for_frame = *image_user;
415 const std::string library_key = image->
id.
lib ? image->
id.
lib->
id.
name :
"";
416 const std::string id_key = std::string(image->
id.
name) + library_key;
417 auto &cached_images_for_id = map_.lookup_or_add_default(id_key);
420 if (!cached_images_for_id.is_empty() &&
421 image->
runtime->update_count != update_counts_.lookup(id_key))
423 cached_images_for_id.clear();
426 auto &cached_image = *cached_images_for_id.lookup_or_add_cb(key, [&]() {
427 return std::make_unique<CachedImage>(context, image, &image_user_for_frame, pass_name);
431 update_counts_.add_overwrite(id_key, image->
runtime->update_count);
433 cached_image.needed =
true;
434 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.
void GPU_texture_update_mipmap_chain(blender::gpu::Texture *texture)
#define GPU_TEXTURE_FREE_SAFE(texture)
bool IMB_colormanagement_space_is_scene_linear(const ColorSpace *colorspace)
bool IMB_colormanagement_space_is_data(const ColorSpace *colorspace)
blender::gpu::Texture * IMB_create_gpu_texture(const char *name, ImBuf *ibuf, bool use_high_bitdepth, bool use_premult)
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)
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(ImageUser image_user, std::string pass_name)
CachedImage(Context &context, Image *image, ImageUser *image_user, const char *pass_name)
void wrap_external(blender::gpu::Texture *texture)
static ResultType float_type(const int channels_count)
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