@@ -57,12 +57,9 @@ calc_delta(const Param ¶m, Input &input, const std::array<std::uint32_t, 2>
5757}
5858
5959static std::array<int , 4 >
60- calc_size (Delta &delta, float amt, const Input &input, bool enable ) noexcept {
60+ calc_size (Delta &delta, float amt, const Input &input) noexcept {
6161 std::array<int , 4 > margin{};
6262
63- if (!enable)
64- return margin;
65-
6663 auto htm = delta.calc_htm (amt);
6764 auto c_prev = Vec3<float >(delta.get_center (), 1 .0f );
6865 auto pos = (htm * c_prev).to_vec2 () + input.pivot ;
@@ -72,10 +69,10 @@ calc_size(Delta &delta, float amt, const Input &input, bool enable) noexcept {
7269 auto upper_left = static_cast <Vec2<int >>((diff - pos).ceil ());
7370 auto lower_right = static_cast <Vec2<int >>((diff + pos).ceil ());
7471
75- margin[0 ] = std::max (margin[ 0 ], upper_left.get_y ());
76- margin[1 ] = std::max (margin[ 1 ], lower_right.get_y ());
77- margin[2 ] = std::max (margin[ 2 ], upper_left.get_x ());
78- margin[3 ] = std::max (margin[ 3 ], lower_right.get_x ());
72+ margin[0 ] = std::max (upper_left.get_y (), 0 );
73+ margin[1 ] = std::max (lower_right.get_y (), 0 );
74+ margin[2 ] = std::max (upper_left.get_x (), 0 );
75+ margin[3 ] = std::max (lower_right.get_x (), 0 );
7976
8077 return margin;
8178}
@@ -124,24 +121,33 @@ process_motion_blur(const CParam *c_param, const CInput *c_input, COutput *c_out
124121 if (flag) {
125122 const float amt = param.shutter_angle / 360 .0f ;
126123
124+ std::array<int , 4 > margin{};
125+ std::uint32_t req_smp = 0u ;
126+ std::uint32_t smp = 0u ;
127+
127128 if (param.geo_cache && !input.frame )
128129 set_init_geo (param.ext , k);
129130
130131 auto delta = calc_delta (param, input, {k, (param.geo_cache == 2u && input.frame ) ? 7u : input.frame });
131- std::uint32_t smp = std::clamp (delta.calc_req_smp (amt, input.res ), 0u , param.smp_lim - 1u );
132+
133+ if (delta.is_moved ()) {
134+ margin = calc_size (delta, amt, input);
135+ req_smp = static_cast <std::uint32_t >(Vec2<int >(margin[2 ] + margin[3 ], margin[0 ] + margin[1 ]).norm (2 ));
136+ smp = std::min (req_smp, param.smp_lim - 1u );
137+ }
132138
133139 if (smp) {
134140 auto init_htm = delta.calc_htm (amt, smp, true );
135141 auto drift = delta.calc_drift (amt, smp);
136- auto margin = calc_size (delta, amt, input, param.resize );
137142
138- *c_output = COutput (margin, init_htm, drift, smp);
143+ *c_output = COutput (margin, init_htm, drift, smp, req_smp );
139144 } else {
140145 flag = false ;
141146 *c_output = COutput ();
142147 }
143- } else
148+ } else {
144149 *c_output = COutput ();
150+ }
145151
146152 if (param.geo_cache == 2u )
147153 if (auto geo = geo_map.read ({k, 7u }); !geo || !geo->is_cached (input.frame ))
0 commit comments