56 bool use_color_management,
69 for (const int64_t y : sub_y_range) {
70 for (const int64_t x : IndexRange(size.x)) {
73 const float2 pixel_coordinates = ((float2(x, y) + 0.5f) / float2(size)) * 2.0f - 1.0f;
75 const float3 coordinates = (float3(pixel_coordinates, 0.0f) + offset) * scale;
77 TexResult texture_result;
78 const int result_type = multitex_ext_safe(
79 texture, coordinates, &texture_result, image_pool, use_color_management, false);
81 float4 color = float4(texture_result.trgba);
82 color.w = texture_result.talpha ? color.w : texture_result.tin;
83 if (!(result_type & TEX_RGB)) {
84 copy_v3_fl(color, color.w);
87 color_pixels_[y * size.x + x] = color;
88 value_pixels_[y * size.x + x] = color.w;
95 if (context.use_gpu()) {
96 this->color_result.allocate_texture(
Domain(
size),
false);
97 this->value_result.allocate_texture(
Domain(
size),
false);
106 this->color_result.wrap_external(&color_pixels_.data()[0].x,
size);
107 this->value_result.wrap_external(value_pixels_.data(),
size);
124 for (
auto &cached_textures_for_id : map_.values()) {
125 cached_textures_for_id.remove_if([](
auto item) {
return !item.value->needed; });
127 map_.remove_if([](
auto item) {
return item.value.is_empty(); });
128 update_counts_.remove_if([&](
auto item) {
return !map_.contains(item.key); });
132 for (
auto &cached_textures_for_id : map_.values()) {
133 for (
auto &value : cached_textures_for_id.values()) {
134 value->needed =
false;
141 bool use_color_management,
148 const std::string library_key =
texture->id.lib ?
texture->id.lib->id.name :
"";
149 const std::string id_key = std::string(
texture->id.name) + library_key;
150 auto &cached_textures_for_id = map_.lookup_or_add_default(id_key);
153 if (!cached_textures_for_id.is_empty() &&
154 texture->runtime.last_update != update_counts_.lookup(id_key))
156 cached_textures_for_id.clear();
159 auto &cached_texture = *cached_textures_for_id.lookup_or_add_cb(key, [&]() {
160 return std::make_unique<CachedTexture>(
161 context,
texture, use_color_management,
size, offset, scale);
165 update_counts_.add_overwrite(id_key,
texture->runtime.last_update);
167 cached_texture.needed =
true;
168 return cached_texture;
void BKE_texture_fetch_images_for_pool(struct Tex *texture, struct ImagePool *pool)
void GPU_texture_update(GPUTexture *texture, eGPUDataFormat data_format, const void *data)
CachedTexture & get(Context &context, Tex *texture, bool use_color_management, int2 size, float3 offset, float3 scale)
CachedTextureKey(int2 size, float3 offset, float3 scale)
CachedTexture(Context &context, Tex *texture, bool use_color_management, int2 size, float3 offset, float3 scale)