15#ifndef DRACO_COMPRESSION_POINT_CLOUD_ALGORITHMS_DYNAMIC_INTEGER_POINTS_KD_TREE_ENCODER_H_
16#define DRACO_COMPRESSION_POINT_CLOUD_ALGORITHMS_DYNAMIC_INTEGER_POINTS_KD_TREE_ENCODER_H_
38template <
int compression_level_t>
41 compression_level_t - 1> {};
88template <
int compression_level_t>
90 static_assert(compression_level_t >= 0,
"Compression level must in [0..6].");
91 static_assert(compression_level_t <= 6,
"Compression level must in [0..6].");
95 typedef typename Policy::NumbersEncoder NumbersEncoder;
96 typedef typename Policy::AxisEncoder AxisEncoder;
97 typedef typename Policy::HalfEncoder HalfEncoder;
98 typedef typename Policy::RemainingBitsEncoder RemainingBitsEncoder;
99 typedef std::vector<uint32_t> VectorUint32;
113 template <
class RandomAccessIteratorT>
114 bool EncodePoints(RandomAccessIteratorT begin, RandomAccessIteratorT end,
118 template <
class RandomAccessIteratorT>
119 bool EncodePoints(RandomAccessIteratorT begin, RandomAccessIteratorT end,
127 template <
class RandomAccessIteratorT>
128 uint32_t GetAndEncodeAxis(RandomAccessIteratorT begin,
129 RandomAccessIteratorT end,
130 const VectorUint32 &old_base,
131 const VectorUint32 &levels, uint32_t last_axis);
132 template <
class RandomAccessIteratorT>
133 void EncodeInternal(RandomAccessIteratorT begin, RandomAccessIteratorT end);
137 Splitter(uint32_t axis, uint32_t value) : axis_(axis), value_(value) {}
138 template <
class Po
intT>
139 bool operator()(
const PointT &a)
const {
140 return a[axis_] < value_;
144 const uint32_t axis_;
145 const uint32_t value_;
148 void EncodeNumber(
int nbits, uint32_t value) {
149 numbers_encoder_.EncodeLeastSignificantBits32(nbits, value);
152 template <
class RandomAccessIteratorT>
153 struct EncodingStatus {
154 EncodingStatus(RandomAccessIteratorT begin_, RandomAccessIteratorT end_,
155 uint32_t last_axis_, uint32_t stack_pos_)
158 last_axis(last_axis_),
159 stack_pos(stack_pos_) {
160 num_remaining_points =
static_cast<uint32_t
>(end - begin);
163 RandomAccessIteratorT begin;
164 RandomAccessIteratorT end;
166 uint32_t num_remaining_points;
170 uint32_t bit_length_;
171 uint32_t num_points_;
173 NumbersEncoder numbers_encoder_;
174 RemainingBitsEncoder remaining_bits_encoder_;
175 AxisEncoder axis_encoder_;
176 HalfEncoder half_encoder_;
177 VectorUint32 deviations_;
178 VectorUint32 num_remaining_bits_;
180 std::vector<VectorUint32> base_stack_;
181 std::vector<VectorUint32> levels_stack_;
184template <
int compression_level_t>
185template <
class RandomAccessIteratorT>
187 RandomAccessIteratorT begin, RandomAccessIteratorT end,
189 bit_length_ = bit_length;
190 num_points_ =
static_cast<uint32_t
>(end - begin);
192 buffer->
Encode(bit_length_);
193 buffer->
Encode(num_points_);
194 if (num_points_ == 0) {
198 numbers_encoder_.StartEncoding();
199 remaining_bits_encoder_.StartEncoding();
200 axis_encoder_.StartEncoding();
201 half_encoder_.StartEncoding();
203 EncodeInternal(begin, end);
205 numbers_encoder_.EndEncoding(buffer);
206 remaining_bits_encoder_.EndEncoding(buffer);
207 axis_encoder_.EndEncoding(buffer);
208 half_encoder_.EndEncoding(buffer);
212template <
int compression_level_t>
213template <
class RandomAccessIteratorT>
215DynamicIntegerPointsKdTreeEncoder<compression_level_t>::GetAndEncodeAxis(
216 RandomAccessIteratorT begin, RandomAccessIteratorT end,
217 const VectorUint32 &old_base,
const VectorUint32 &levels,
218 uint32_t last_axis) {
219 if (!Policy::select_axis) {
231 uint32_t best_axis = 0;
232 if (end - begin < 64) {
233 for (uint32_t axis = 1; axis < dimension_; ++axis) {
234 if (levels[best_axis] > levels[axis]) {
239 const uint32_t
size =
static_cast<uint32_t
>(
end -
begin);
240 for (uint32_t i = 0; i < dimension_; i++) {
242 num_remaining_bits_[i] = bit_length_ - levels[i];
243 if (num_remaining_bits_[i] > 0) {
244 const uint32_t
split =
245 old_base[i] + (1 << (num_remaining_bits_[i] - 1));
246 for (
auto it = begin; it !=
end; ++it) {
247 deviations_[i] += ((*it)[i] <
split);
249 deviations_[i] = std::max(
size - deviations_[i], deviations_[i]);
253 uint32_t max_value = 0;
255 for (uint32_t i = 0; i < dimension_; i++) {
257 if (num_remaining_bits_[i]) {
259 if (max_value < deviations_[i]) {
260 max_value = deviations_[i];
265 axis_encoder_.EncodeLeastSignificantBits32(4, best_axis);
271template <
int compression_level_t>
272template <
class RandomAccessIteratorT>
273void DynamicIntegerPointsKdTreeEncoder<compression_level_t>::EncodeInternal(
274 RandomAccessIteratorT begin, RandomAccessIteratorT end) {
275 typedef EncodingStatus<RandomAccessIteratorT>
Status;
277 base_stack_[0] = VectorUint32(dimension_, 0);
278 levels_stack_[0] = VectorUint32(dimension_, 0);
279 Status init_status(begin, end, 0, 0);
280 std::stack<Status> status_stack;
281 status_stack.push(init_status);
284 while (!status_stack.empty()) {
285 Status status = status_stack.top();
288 begin = status.begin;
290 const uint32_t last_axis = status.last_axis;
291 const uint32_t stack_pos = status.stack_pos;
292 const VectorUint32 &old_base = base_stack_[stack_pos];
293 const VectorUint32 &levels = levels_stack_[stack_pos];
295 const uint32_t axis =
296 GetAndEncodeAxis(begin, end, old_base, levels, last_axis);
297 const uint32_t level = levels[axis];
298 const uint32_t num_remaining_points =
static_cast<uint32_t
>(
end -
begin);
301 if ((bit_length_ - level) == 0) {
307 if (num_remaining_points <= 2) {
311 for (uint32_t i = 1; i < dimension_; i++) {
314 for (uint32_t i = 0; i < num_remaining_points; ++i) {
315 const auto &p = *(
begin + i);
316 for (uint32_t j = 0; j < dimension_; j++) {
317 const uint32_t num_remaining_bits = bit_length_ - levels[axes_[j]];
318 if (num_remaining_bits) {
319 remaining_bits_encoder_.EncodeLeastSignificantBits32(
320 num_remaining_bits, p[axes_[j]]);
327 const uint32_t num_remaining_bits = bit_length_ - level;
328 const uint32_t modifier = 1 << (num_remaining_bits - 1);
329 base_stack_[stack_pos + 1] = old_base;
330 base_stack_[stack_pos + 1][axis] += modifier;
331 const VectorUint32 &new_base = base_stack_[stack_pos + 1];
333 const RandomAccessIteratorT
split =
334 std::partition(begin, end, Splitter(axis, new_base[axis]));
341 const uint32_t first_half =
static_cast<uint32_t
>(
split -
begin);
342 const uint32_t second_half =
static_cast<uint32_t
>(
end -
split);
343 const bool left = first_half < second_half;
345 if (first_half != second_half) {
346 half_encoder_.EncodeBit(left);
350 EncodeNumber(required_bits, num_remaining_points / 2 - first_half);
352 EncodeNumber(required_bits, num_remaining_points / 2 - second_half);
355 levels_stack_[stack_pos][axis] += 1;
356 levels_stack_[stack_pos + 1] = levels_stack_[stack_pos];
357 if (
split != begin) {
358 status_stack.push(
Status(begin,
split, axis, stack_pos));
361 status_stack.push(
Status(
split, end, axis, stack_pos + 1));
void split(std::vector< FontInterfaceImpl::Bezier2d > &vec, FontInterfaceImpl::Bezier2d orig, float t, bool emit_left, bool emit_right)
Definition FreeType2.cc:134
Definition GraphI.hh:2130
Definition direct_bit_encoder.h:25
Definition dynamic_integer_points_kd_tree_encoder.h:89
const uint32_t dimension() const
Definition dynamic_integer_points_kd_tree_encoder.h:124
bool EncodePoints(RandomAccessIteratorT begin, RandomAccessIteratorT end, EncoderBuffer *buffer)
Definition dynamic_integer_points_kd_tree_encoder.h:119
bool EncodePoints(RandomAccessIteratorT begin, RandomAccessIteratorT end, const uint32_t &bit_length, EncoderBuffer *buffer)
Definition dynamic_integer_points_kd_tree_encoder.h:186
DynamicIntegerPointsKdTreeEncoder(uint32_t dimension)
Definition dynamic_integer_points_kd_tree_encoder.h:102
Definition encoder_buffer.h:29
bool Encode(const T &data)
Definition encoder_buffer.h:60
Definition folded_integer_bit_encoder.h:33
Definition rans_bit_encoder.h:28
#define DRACO_DCHECK_EQ(a, b)
Definition macros.h:81
#define DRACO_INCREMENT_MOD(I, M)
Definition math_utils.h:24
n< br > font size
Definition meshpage.php:3536
Definition attribute_octahedron_transform.cc:21
int MostSignificantBit(uint32_t n)
Definition bit_utils.h:58
DirectBitEncoder AxisEncoder
Definition dynamic_integer_points_kd_tree_encoder.h:46
DirectBitEncoder HalfEncoder
Definition dynamic_integer_points_kd_tree_encoder.h:47
DirectBitEncoder NumbersEncoder
Definition dynamic_integer_points_kd_tree_encoder.h:45
DirectBitEncoder RemainingBitsEncoder
Definition dynamic_integer_points_kd_tree_encoder.h:48
static constexpr bool select_axis
Definition dynamic_integer_points_kd_tree_encoder.h:49
RAnsBitEncoder NumbersEncoder
Definition dynamic_integer_points_kd_tree_encoder.h:55
FoldedBit32Encoder< RAnsBitEncoder > NumbersEncoder
Definition dynamic_integer_points_kd_tree_encoder.h:61
static constexpr bool select_axis
Definition dynamic_integer_points_kd_tree_encoder.h:67
Definition dynamic_integer_points_kd_tree_encoder.h:41