35 int motion_blur_samples,
36 float motion_blur_shutter)
38 aspect_ratio(aspect_ratio),
39 use_feather(use_feather),
40 motion_blur_samples(motion_blur_samples),
41 motion_blur_shutter(motion_blur_shutter)
53 return a.size ==
b.size && a.aspect_ratio ==
b.aspect_ratio && a.use_feather ==
b.use_feather &&
54 a.motion_blur_samples ==
b.motion_blur_samples &&
55 a.motion_blur_shutter ==
b.motion_blur_shutter;
66 int motion_blur_samples,
67 float motion_blur_shutter)
77 if (motion_blur_samples == 1) {
80 handles.append(handle);
86 Mask *evaluation_mask =
reinterpret_cast<Mask *
>(
90 const float start_frame = current_frame - motion_blur_shutter;
91 const float frame_step = (motion_blur_shutter * 2.0f) / motion_blur_samples;
92 for (
int i = 0; i < motion_blur_samples; i++) {
96 handle, evaluation_mask, size.x, size.y,
true,
true, use_feather);
97 handles.append(handle);
111 int motion_blur_samples,
112 float motion_blur_shutter)
115 mask, size, frame, use_feather, motion_blur_samples, motion_blur_shutter);
119 for (const int64_t y : sub_y_range) {
120 for (const int64_t x : IndexRange(size.x)) {
123 float2 coordinates = (float2(x, y) + 0.5f) / float2(size);
125 coordinates = (coordinates - float2(0.5)) * float2(1.0, aspect_ratio) + float2(0.5);
127 float mask_value = 0.0f;
128 for (MaskRasterHandle *handle : handles) {
129 mask_value += BKE_maskrasterize_handle_sample(handle, coordinates);
131 evaluated_mask[y * size.x + x] = mask_value / handles.size();
147 evaluated_mask.data());
150CachedMask::~CachedMask()
155GPUTexture *CachedMask::texture()
164void CachedMaskContainer::reset()
167 for (
auto &cached_masks_for_id : map_.values()) {
168 cached_masks_for_id.remove_if([](
auto item) {
return !item.value->needed; });
170 map_.remove_if([](
auto item) {
return item.value.is_empty(); });
174 for (
auto &cached_masks_for_id : map_.values()) {
175 for (
auto &value : cached_masks_for_id.values()) {
176 value->needed =
false;
186 int motion_blur_samples,
187 float motion_blur_shutter)
190 size, aspect_ratio, use_feather, motion_blur_samples, motion_blur_shutter);
192 const std::string library_key = mask->id.lib ? mask->id.lib->id.name :
"";
193 const std::string id_key = std::string(mask->id.name) + library_key;
194 auto &cached_masks_for_id = map_.lookup_or_add_default(id_key);
197 if (context.query_id_recalc_flag(
reinterpret_cast<ID *
>(mask)) &
ID_RECALC_ALL) {
198 cached_masks_for_id.clear();
201 auto &cached_mask = *cached_masks_for_id.lookup_or_add_cb(key, [&]() {
202 return std::make_unique<CachedMask>(context,
205 context.get_frame_number(),
209 motion_blur_shutter);
212 cached_mask.needed =
true;
@ 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)
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.
GPUTexture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, eGPUTextureFormat format, eGPUTextureUsage usage, const float *data)
void GPU_texture_free(GPUTexture *texture)
@ GPU_TEXTURE_USAGE_SHADER_READ
float motion_blur_shutter
CachedMaskKey(int2 size, float aspect_ratio, bool use_feather, int motion_blur_samples, 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)
static eGPUTextureFormat gpu_texture_format(ResultType type, ResultPrecision precision)
local_group_size(16, 16) .push_constant(Type b
bool operator==(const BokehKernelKey &a, const BokehKernelKey &b)
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)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
VecBase< float, 2 > float2
uint64_t get_default_hash(const T &v)
unsigned __int64 uint64_t