65 int motion_blur_samples,
66 float motion_blur_shutter)
76 if (motion_blur_samples == 1) {
85 Mask *evaluation_mask =
reinterpret_cast<Mask *
>(
89 const float start_frame = current_frame - motion_blur_shutter;
90 const float frame_step = (motion_blur_shutter * 2.0f) / motion_blur_samples;
91 for (
int i = 0;
i < motion_blur_samples;
i++) {
95 handle, evaluation_mask,
size.x,
size.y,
true,
true, use_feather);
110 int motion_blur_samples,
111 float motion_blur_shutter)
115 mask,
size, frame, use_feather, motion_blur_samples, motion_blur_shutter);
125 float mask_value = 0.0f;
129 evaluated_mask_[texel.y *
size.x + texel.x] = mask_value /
handles.size();
136 if (context.use_gpu()) {
144 this->
result.wrap_external(evaluated_mask_.data(),
size);
160 for (
auto &cached_masks_for_id : map_.values()) {
161 cached_masks_for_id.remove_if([](
auto item) {
return !item.value->needed; });
163 map_.remove_if([](
auto item) {
return item.value.is_empty(); });
164 update_counts_.remove_if([&](
auto item) {
return !map_.contains(item.key); });
168 for (
auto &cached_masks_for_id : map_.values()) {
169 for (
auto &value : cached_masks_for_id.values()) {
170 value->needed =
false;
180 int motion_blur_samples,
181 float motion_blur_shutter)
184 size, aspect_ratio, use_feather, motion_blur_samples, motion_blur_shutter);
186 const std::string library_key =
mask->id.lib ?
mask->id.lib->id.name :
"";
187 const std::string id_key = std::string(
mask->id.name) + library_key;
188 auto &cached_masks_for_id = map_.lookup_or_add_default(id_key);
191 if (!cached_masks_for_id.is_empty() &&
192 mask->runtime.last_update != update_counts_.lookup(id_key))
194 cached_masks_for_id.clear();
197 auto &cached_mask = *cached_masks_for_id.lookup_or_add_cb(key, [&]() {
198 return std::make_unique<CachedMask>(context,
201 context.get_frame_number(),
205 motion_blur_shutter);
209 update_counts_.add_overwrite(id_key,
mask->runtime.last_update);
211 cached_mask.needed =
true;
212 return cached_mask.result;
@ LIB_ID_COPY_NO_ANIMDATA
void BKE_id_free(Main *bmain, void *idv)
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
void BKE_maskrasterize_handle_free(MaskRasterHandle *mr_handle)
float BKE_maskrasterize_handle_sample(MaskRasterHandle *mr_handle, const float xy[2])
MaskRasterHandle * BKE_maskrasterize_handle_new(void)
void BKE_mask_evaluate(struct Mask *mask, float ctime, bool do_newframe)
void BKE_maskrasterize_handle_init(MaskRasterHandle *mr_handle, struct Mask *mask, int width, int height, bool do_aspect_correct, bool do_mask_aa, bool do_feather)
ID and Library types, which are fundamental for SDNA.
void GPU_texture_update(GPUTexture *texture, eGPUDataFormat data_format, const void *data)
unsigned long long int uint64_t
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Result & get(Context &context, Mask *mask, int2 size, float aspect_ratio, bool use_feather, int motion_blur_samples, float motion_blur_shutter)
CachedMaskKey(int2 size, float aspect_ratio, bool use_feather, int motion_blur_samples, float motion_blur_shutter)
float motion_blur_shutter
CachedMask(Context &context, Mask *mask, int2 size, int frame, float aspect_ratio, bool use_feather, int motion_blur_samples, float motion_blur_shutter)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
bool operator==(const BokehKernelKey &a, const BokehKernelKey &b)
void parallel_for(const int2 range, const Function &function)
static Vector< MaskRasterHandle * > get_mask_raster_handles(Mask *mask, int2 size, int current_frame, bool use_feather, int motion_blur_samples, float motion_blur_shutter)
uint64_t get_default_hash(const T &v, const Args &...args)
VecBase< int32_t, 2 > int2
VecBase< float, 2 > float2