@@ -47,14 +47,26 @@ struct BoxSampler
47
47
case ETC_REPEAT:
48
48
{
49
49
const uint32_t flooredMod = rightFlIdx % linearSize;
50
- const uint32_t ceiledMod = rightClIdx % linearSize;
51
50
const T last = prefixSumAccessor.template get<T, uint32_t>(lastIdx);
52
- const T periodicOffset = (T (rightFlIdx) / linearSize) * last;
53
51
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
+
58
70
break ;
59
71
}
60
72
case ETC_CLAMP_TO_BORDER:
@@ -121,14 +133,26 @@ struct BoxSampler
121
133
case ETC_REPEAT:
122
134
{
123
135
const uint32_t flooredMod = (linearSize + leftFlIdx) % linearSize;
124
- const uint32_t ceiledMod = (linearSize + leftClIdx) % linearSize;
125
136
const T last = prefixSumAccessor.template get<T, uint32_t>(lastIdx);
126
- const T periodicOffset = (T (linearSize + leftClIdx) / T (linearSize)) * last;
127
137
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
+
132
156
break ;
133
157
}
134
158
case ETC_CLAMP_TO_BORDER:
0 commit comments