15#ifndef DRACO_COMPRESSION_ATTRIBUTES_PREDICTION_SCHEMES_MESH_PREDICTION_SCHEME_GEOMETRIC_NORMAL_PREDICTOR_AREA_H_
16#define DRACO_COMPRESSION_ATTRIBUTES_PREDICTION_SCHEMES_MESH_PREDICTION_SCHEME_GEOMETRIC_NORMAL_PREDICTOR_AREA_H_
24template <
typename DataTypeT,
class TransformT,
class MeshDataT>
27 DataTypeT, TransformT, MeshDataT> {
29 DataTypeT, TransformT, MeshDataT>
41 DataTypeT *prediction)
override {
43 typedef typename MeshDataT::CornerTable
CornerTable;
57 c_next = corner_table->
Next(corner_id);
58 c_prev = corner_table->
Previous(corner_id);
74 auto normal_data =
reinterpret_cast<uint64_t *
>(normal.
data());
75 auto cross_data =
reinterpret_cast<const uint64_t *
>(cross.data());
76 normal_data[0] = normal_data[0] + cross_data[0];
77 normal_data[1] = normal_data[1] + cross_data[1];
78 normal_data[2] = normal_data[2] + cross_data[2];
84 constexpr int64_t upper_bound = 1 << 29;
86 const int32_t abs_sum =
static_cast<int32_t
>(normal.
AbsSum());
87 if (abs_sum > upper_bound) {
88 const int64_t quotient = abs_sum / upper_bound;
89 normal = normal / quotient;
92 const int64_t abs_sum = normal.
AbsSum();
93 if (abs_sum > upper_bound) {
94 const int64_t quotient = abs_sum / upper_bound;
95 normal = normal / quotient;
99 prediction[0] =
static_cast<int32_t
>(normal[0]);
100 prediction[1] =
static_cast<int32_t
>(normal[1]);
101 prediction[2] =
static_cast<int32_t
>(normal[2]);
Definition corner_table.h:53
CornerIndex Next(CornerIndex corner) const
Definition corner_table.h:89
CornerIndex Previous(CornerIndex corner) const
Definition corner_table.h:95
MeshPredictionSchemeGeometricNormalPredictorArea(const MeshDataT &md)
Definition mesh_prediction_scheme_geometric_normal_predictor_area.h:33
virtual ~MeshPredictionSchemeGeometricNormalPredictorArea()
Definition mesh_prediction_scheme_geometric_normal_predictor_area.h:37
bool SetNormalPredictionMode(NormalPredictionMode mode) override
Definition mesh_prediction_scheme_geometric_normal_predictor_area.h:103
void ComputePredictedValue(CornerIndex corner_id, DataTypeT *prediction) override
Definition mesh_prediction_scheme_geometric_normal_predictor_area.h:40
MeshDataT mesh_data_
Definition mesh_prediction_scheme_geometric_normal_predictor_base.h:90
VectorD< int64_t, 3 > GetPositionForCorner(CornerIndex ci) const
Definition mesh_prediction_scheme_geometric_normal_predictor_base.h:71
NormalPredictionMode normal_prediction_mode_
Definition mesh_prediction_scheme_geometric_normal_predictor_base.h:91
bool IsInitialized() const
Definition mesh_prediction_scheme_geometric_normal_predictor_base.h:47
MeshPredictionSchemeGeometricNormalPredictorBase(const MeshDataT &md)
Definition mesh_prediction_scheme_geometric_normal_predictor_base.h:34
Scalar AbsSum() const
Definition vector_d.h:237
Scalar * data()
Definition vector_d.h:282
Definition corner_table_iterators.h:210
bool End() const
Definition corner_table_iterators.h:244
CornerIndex Corner() const
Definition corner_table_iterators.h:241
void Next()
Definition corner_table_iterators.h:247
#define DRACO_DCHECK(x)
Definition macros.h:80
#define DRACO_DCHECK_LE(a, b)
Definition macros.h:85
Definition attribute_octahedron_transform.cc:21
NormalPredictionMode
Definition compression_shared.h:138
@ ONE_TRIANGLE
Definition compression_shared.h:139
@ TRIANGLE_AREA
Definition compression_shared.h:140
CornerIndex CornerIndex
Definition mesh_edgebreaker_encoder_impl.cc:35
VectorD< ScalarT, 3 > CrossProduct(const VectorD< ScalarT, 3 > &u, const VectorD< ScalarT, 3 > &v)
Definition vector_d.h:317