62 int motion_blur_samples,
63 float motion_blur_shutter)
73 if (motion_blur_samples == 1) {
82 Mask *evaluation_mask =
reinterpret_cast<Mask *
>(
86 const float start_frame = current_frame - motion_blur_shutter;
87 const float frame_step = (motion_blur_shutter * 2.0f) / motion_blur_samples;
88 for (
int i = 0;
i < motion_blur_samples;
i++) {
92 handle, evaluation_mask,
size.x,
size.y,
true,
true, use_feather);
107 int motion_blur_samples,
108 float motion_blur_shutter)
112 mask,
size, frame, use_feather, motion_blur_samples, motion_blur_shutter);
122 float mask_value = 0.0f;
126 this->
result.store_pixel(texel, mask_value /
handles.size());
133 if (context.use_gpu()) {
134 const Result gpu_result = this->
result.upload_to_gpu(
false);
136 this->
result = gpu_result;
152 for (
auto &cached_masks_for_id : map_.values()) {
153 cached_masks_for_id.remove_if([](
auto item) {
return !item.value->needed; });
155 map_.remove_if([](
auto item) {
return item.value.is_empty(); });
156 update_counts_.remove_if([&](
auto item) {
return !map_.contains(item.key); });
160 for (
auto &cached_masks_for_id : map_.values()) {
161 for (
auto &value : cached_masks_for_id.values()) {
162 value->needed =
false;
172 int motion_blur_samples,
173 float motion_blur_shutter)
176 size, aspect_ratio, use_feather, motion_blur_samples, motion_blur_shutter);
178 const std::string library_key =
mask->id.lib ?
mask->id.lib->id.name :
"";
179 const std::string id_key = std::string(
mask->id.name) + library_key;
180 auto &cached_masks_for_id = map_.lookup_or_add_default(id_key);
183 if (!cached_masks_for_id.is_empty() &&
184 mask->runtime.last_update != update_counts_.lookup(id_key))
186 cached_masks_for_id.clear();
189 auto &cached_mask = *cached_masks_for_id.lookup_or_add_cb(key, [&]() {
190 return std::make_unique<CachedMask>(context,
193 context.get_frame_number(),
197 motion_blur_shutter);
201 update_counts_.add_overwrite(id_key,
mask->runtime.last_update);
203 cached_mask.needed =
true;
204 return cached_mask.result;
void BKE_id_free(Main *bmain, void *idv)
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
@ LIB_ID_COPY_NO_ANIMDATA
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.
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