66 int motion_blur_samples,
67 float motion_blur_shutter)
77 if (motion_blur_samples == 1) {
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);
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());
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);
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;
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)
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
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
CachedMask & get(Context &context, Mask *mask, int2 size, float aspect_ratio, bool use_feather, int motion_blur_samples, float motion_blur_shutter)
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
ccl_device_inline float4 mask(const int4 mask, const float4 a)
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< int32_t, 2 > int2
VecBase< float, 2 > float2
uint64_t get_default_hash(const T &v)
unsigned __int64 uint64_t