77
88static auto geo_map = GeoMap<8 >();
99
10- inline static constexpr std::uint32_t
11- make_key (std::uint32_t obj_id, std::uint32_t obj_idx) noexcept {
12- std::uint32_t id_t = (obj_idx & 0x3FFFFu ) << 14 ;
13- std::uint32_t id_b = obj_id & 0x3FFFu ;
14- std::uint32_t id = id_t | id_b;
15- return id;
16- }
17-
1810static void
19- set_init_geo (std::uint32_t ext, std::uint32_t k) noexcept {
20- const std::array<std::uint32_t , 2 > key{k, 0u };
21-
11+ set_init_geo (std::uint32_t ext, const Input input) noexcept {
2212 int flag = 1 ;
2313 std::array<Geo, 3 > geos{};
2414
25- for (std::uint32_t i = 0u ; i <= ext; ++i) {
26- if (auto g = geo_map.read ({k, i + 1u } ))
15+ for (std::size_t i = 0 ; i <= ext; ++i) {
16+ if (auto g = geo_map.read (input. obj_id , input. obj_idx , i + 1 ))
2717 geos[i] = *g;
2818 else
2919 flag = 0 ;
@@ -34,21 +24,21 @@ set_init_geo(std::uint32_t ext, std::uint32_t k) noexcept {
3424
3525 switch (ext) {
3626 case 1u :
37- geo_map.write (key , geos[0 ] * 2.0 - geos[1 ]);
27+ geo_map.write (input. obj_id , input. obj_idx , 0 , geos[0 ] * 2.0 - geos[1 ]);
3828 return ;
3929 case 2u :
40- geo_map.write (key , geos[0 ] * 3.0 - geos[1 ] * 3.0 + geos[2 ]);
30+ geo_map.write (input. obj_id , input. obj_idx , 0 , geos[0 ] * 3.0 - geos[1 ] * 3.0 + geos[2 ]);
4131 return ;
4232 default :
4333 return ;
4434 }
4535}
4636
4737static Delta
48- calc_delta (const Param ¶m, Input &input, const std::array<std:: uint32_t , 2 > &key ) noexcept {
38+ calc_delta (const Param ¶m, Input &input, std::size_t pos ) noexcept {
4939 input.tf_curr .set_geo (input.geo_curr );
5040
51- if (auto geo = param.geo_cache ? geo_map.read (key ) : nullptr )
41+ if (auto geo = param.geo_cache ? geo_map.read (input. obj_id , input. obj_idx , pos ) : nullptr )
5242 input.tf_prev .set_geo (*geo);
5343 else
5444 input.tf_prev .set_geo (input.geo_curr );
@@ -79,28 +69,22 @@ calc_size(Delta &delta, float amt, const Input &input) noexcept {
7969
8070static void
8171cleanup_geo (const Param ¶m, const Input &input) {
82- constexpr std::uint32_t mask = 0x3FFFu ;
83-
8472 if (!input.is_last [0 ])
8573 return ;
8674
87- if (param.geo_cache ) {
88- switch (param.geo_ctrl ) {
89- case 1 :
90- if (input.is_last [1 ])
91- geo_map.clear (input.obj_id , mask);
92- break ;
93- case 2 :
94- geo_map.clear ();
95- break ;
96- case 3 :
97- geo_map.clear (input.obj_id , mask);
98- break ;
99- default :
100- break ;
101- }
102- } else if (geo_map.has_key0 (input.obj_id )) {
103- geo_map.clear (input.obj_id , mask);
75+ switch (param.geo_ctrl ) {
76+ case 1 :
77+ if (input.is_last [1 ])
78+ geo_map.clear (input.obj_id );
79+ break ;
80+ case 2 :
81+ geo_map.clear ();
82+ break ;
83+ case 3 :
84+ geo_map.clear (input.obj_id );
85+ break ;
86+ default :
87+ break ;
10488 }
10589}
10690
@@ -112,11 +96,12 @@ process_motion_blur(const CParam *c_param, const CInput *c_input, COutput *c_out
11296 const auto param = Param (*c_param);
11397 auto input = Input (*c_input);
11498
115- std::uint32_t k = make_key (input.obj_id , input.obj_idx );
11699 bool flag = param.is_valid && (param.ext || input.frame );
117100
101+ geo_map.resize (input.obj_id , input.obj_idx , input.obj_num , param.geo_cache );
102+
118103 if (param.geo_cache == 1u || (param.geo_cache == 2u && param.ext && input.frame <= param.ext ))
119- geo_map.write ({k , input.frame + 1u } , input.geo_curr );
104+ geo_map.write (input. obj_id , input.obj_idx , input. frame + 1 , input.geo_curr );
120105
121106 if (flag) {
122107 const float amt = param.shutter_angle / 360 .0f ;
@@ -126,9 +111,9 @@ process_motion_blur(const CParam *c_param, const CInput *c_input, COutput *c_out
126111 std::uint32_t smp = 0u ;
127112
128113 if (param.geo_cache && !input.frame )
129- set_init_geo (param.ext , k );
114+ set_init_geo (param.ext , input );
130115
131- auto delta = calc_delta (param, input, {k, (param.geo_cache == 2u && input.frame ) ? 7u : input.frame } );
116+ auto delta = calc_delta (param, input, (param.geo_cache == 2u && input.frame ) ? 7 : input.frame );
132117
133118 if (delta.is_moved ()) {
134119 margin = calc_size (delta, amt, input);
@@ -149,9 +134,10 @@ process_motion_blur(const CParam *c_param, const CInput *c_input, COutput *c_out
149134 *c_output = COutput ();
150135 }
151136
152- if (param.geo_cache == 2u )
153- if (auto geo = geo_map.read ({k, 7u }); !geo || !geo->is_cached (input.frame ))
154- geo_map.write ({k, 7u }, input.geo_curr );
137+ if (param.geo_cache == 2u ) {
138+ if (auto geo = geo_map.read (input.obj_id , input.obj_idx , 7 ); !geo || !geo->is_cached (input.frame ))
139+ geo_map.write (input.obj_id , input.obj_idx , 7 , input.geo_curr );
140+ }
155141
156142 cleanup_geo (param, input);
157143
0 commit comments