@@ -47,14 +47,26 @@ struct BoxSampler
4747 case ETC_REPEAT:
4848 {
4949 const uint32_t flooredMod = rightFlIdx % linearSize;
50- const uint32_t ceiledMod = rightClIdx % linearSize;
5150 const T last = prefixSumAccessor.template get<T, uint32_t>(lastIdx);
52- const T periodicOffset = (T (rightFlIdx) / linearSize) * last;
5351 const T floored = prefixSumAccessor.template get<T, uint32_t>(flooredMod);
54- T ceiled = prefixSumAccessor.template get<T, uint32_t>(ceiledMod);
55- if (flooredMod == lastIdx && ceiledMod == 0 )
56- ceiled += last;
57- result += lerp (floored, ceiled, alpha) + periodicOffset;
52+
53+ result += (T (rightFlIdx) / linearSize) * last;
54+
55+ if (rightFlIdx == rightClIdx) // no flooring occurred
56+ {
57+ result += floored;
58+ }
59+ else if (flooredMod == lastIdx)
60+ {
61+ const T ceiled = prefixSumAccessor.template get<T, uint32_t>(0 ) + last;
62+ result += lerp (floored, ceiled, alpha);
63+ }
64+ else
65+ {
66+ const T ceiled = prefixSumAccessor.template get<T, uint32_t>(rightFlIdx + 1 );
67+ result += lerp (floored, ceiled, alpha);
68+ }
69+
5870 break ;
5971 }
6072 case ETC_CLAMP_TO_BORDER:
@@ -121,14 +133,26 @@ struct BoxSampler
121133 case ETC_REPEAT:
122134 {
123135 const uint32_t flooredMod = (linearSize + leftFlIdx) % linearSize;
124- const uint32_t ceiledMod = (linearSize + leftClIdx) % linearSize;
125136 const T last = prefixSumAccessor.template get<T, uint32_t>(lastIdx);
126- const T periodicOffset = (T (linearSize + leftClIdx) / T (linearSize)) * last;
127137 const T floored = prefixSumAccessor.template get<T, uint32_t>(flooredMod);
128- T ceiled = prefixSumAccessor.template get<T, uint32_t>(ceiledMod);
129- if (flooredMod == lastIdx && ceiledMod == 0 )
130- ceiled += last;
131- result -= lerp (floored, ceiled, alpha) - periodicOffset;
138+
139+ result += (T (linearSize - leftClIdx) / T (linearSize)) * last;
140+
141+ if (rightFlIdx == rightClIdx) // no flooring occurred
142+ {
143+ result -= floored;
144+ }
145+ else if (flooredMod == lastIdx)
146+ {
147+ const T ceiled = prefixSumAccessor.template get<T, uint32_t>(0 ) + last;
148+ result -= lerp (floored, ceiled, alpha);
149+ }
150+ else
151+ {
152+ const T ceiled = prefixSumAccessor.template get<T, uint32_t>(rightFlIdx + 1 );
153+ result -= lerp (floored, ceiled, alpha);
154+ }
155+
132156 break ;
133157 }
134158 case ETC_CLAMP_TO_BORDER:
0 commit comments