92 const DataTypeT *
data,
97 const CornerIndex next_corner_id = mesh_data_.corner_table()->Next(corner_id);
99 mesh_data_.corner_table()->Previous(corner_id);
102 int next_data_id, prev_data_id;
104 int next_vert_id, prev_vert_id;
105 next_vert_id = mesh_data_.corner_table()->Vertex(next_corner_id).value();
106 prev_vert_id = mesh_data_.corner_table()->Vertex(prev_corner_id).value();
108 next_data_id = mesh_data_.vertex_to_data_map()->at(next_vert_id);
109 prev_data_id = mesh_data_.vertex_to_data_map()->at(prev_vert_id);
115 if (prev_data_id < data_id && next_data_id < data_id) {
121 predicted_value_[0] = p_uv[0];
122 predicted_value_[1] = p_uv[1];
145 const Vec3 pn = prev_pos - next_pos;
146 const uint64_t pn_norm2_squared = pn.SquaredNorm();
147 if (pn_norm2_squared != 0) {
152 const Vec3 cn = tip_pos - next_pos;
153 const int64_t cn_dot_pn = pn.Dot(cn);
155 const Vec2 pn_uv = p_uv - n_uv;
163 const int64_t n_uv_absmax_element =
164 std::max(std::abs(n_uv[0]), std::abs(n_uv[1]));
165 if (n_uv_absmax_element >
166 std::numeric_limits<int64_t>::max() / pn_norm2_squared) {
170 const int64_t pn_uv_absmax_element =
171 std::max(std::abs(pn_uv[0]), std::abs(pn_uv[1]));
173 std::numeric_limits<int64_t>::max() / pn_uv_absmax_element) {
177 const Vec2 x_uv = n_uv * pn_norm2_squared + (cn_dot_pn * pn_uv);
178 const int64_t pn_absmax_element =
179 std::max(std::max(std::abs(pn[0]), std::abs(pn[1])), std::abs(pn[2]));
180 if (cn_dot_pn > std::numeric_limits<int64_t>::max() / pn_absmax_element) {
186 const Vec3 x_pos = next_pos + (cn_dot_pn * pn) / pn_norm2_squared;
187 const uint64_t cx_norm2_squared = (tip_pos - x_pos).SquaredNorm();
203 Vec2 cx_uv(pn_uv[1], -pn_uv[0]);
205 const uint64_t norm_squared =
206 IntSqrt(cx_norm2_squared * pn_norm2_squared);
208 cx_uv = cx_uv * norm_squared;
218 const Vec2 predicted_uv_0((x_uv + cx_uv) / pn_norm2_squared);
219 const Vec2 predicted_uv_1((x_uv - cx_uv) / pn_norm2_squared);
221 if ((c_uv - predicted_uv_0).SquaredNorm() <
222 (c_uv - predicted_uv_1).SquaredNorm()) {
223 predicted_uv = predicted_uv_0;
224 orientations_.push_back(
true);
226 predicted_uv = predicted_uv_1;
227 orientations_.push_back(
false);
231 if (orientations_.empty()) {
235 orientations_.pop_back();
239 predicted_uv =
Vec2(Vec2u(x_uv) + Vec2u(cx_uv)) / pn_norm2_squared;
241 predicted_uv =
Vec2(Vec2u(x_uv) - Vec2u(cx_uv)) / pn_norm2_squared;
244 predicted_value_[0] =
static_cast<int>(predicted_uv[0]);
245 predicted_value_[1] =
static_cast<int>(predicted_uv[1]);
253 if (prev_data_id < data_id) {
257 if (next_data_id < data_id) {
268 predicted_value_[i] = 0;
274 predicted_value_[i] =
data[data_offset + i];
lazy data
Definition meshpage.php:1583