Differential D9642 Diff 31337 extern/draco/draco/src/draco/attributes/attribute_quantization_transform.cc
Changeset View
Changeset View
Standalone View
Standalone View
extern/draco/draco/src/draco/attributes/attribute_quantization_transform.cc
- This file was moved from extern/draco/dracoenc/src/draco/attributes/attribute_quantization_transform.cc.
| Show All 19 Lines | |||||
| namespace draco { | namespace draco { | ||||
| bool AttributeQuantizationTransform::InitFromAttribute( | bool AttributeQuantizationTransform::InitFromAttribute( | ||||
| const PointAttribute &attribute) { | const PointAttribute &attribute) { | ||||
| const AttributeTransformData *const transform_data = | const AttributeTransformData *const transform_data = | ||||
| attribute.GetAttributeTransformData(); | attribute.GetAttributeTransformData(); | ||||
| if (!transform_data || | if (!transform_data || | ||||
| transform_data->transform_type() != ATTRIBUTE_QUANTIZATION_TRANSFORM) | transform_data->transform_type() != ATTRIBUTE_QUANTIZATION_TRANSFORM) { | ||||
| return false; // Wrong transform type. | return false; // Wrong transform type. | ||||
| } | |||||
| int32_t byte_offset = 0; | int32_t byte_offset = 0; | ||||
| quantization_bits_ = transform_data->GetParameterValue<int32_t>(byte_offset); | quantization_bits_ = transform_data->GetParameterValue<int32_t>(byte_offset); | ||||
| byte_offset += 4; | byte_offset += 4; | ||||
| min_values_.resize(attribute.num_components()); | min_values_.resize(attribute.num_components()); | ||||
| for (int i = 0; i < attribute.num_components(); ++i) { | for (int i = 0; i < attribute.num_components(); ++i) { | ||||
| min_values_[i] = transform_data->GetParameterValue<float>(byte_offset); | min_values_[i] = transform_data->GetParameterValue<float>(byte_offset); | ||||
| byte_offset += 4; | byte_offset += 4; | ||||
| } | } | ||||
| Show All 37 Lines | bool AttributeQuantizationTransform::ComputeParameters( | ||||
| attribute.GetValue(AttributeValueIndex(0), att_val.get()); | attribute.GetValue(AttributeValueIndex(0), att_val.get()); | ||||
| attribute.GetValue(AttributeValueIndex(0), min_values_.data()); | attribute.GetValue(AttributeValueIndex(0), min_values_.data()); | ||||
| attribute.GetValue(AttributeValueIndex(0), max_values.get()); | attribute.GetValue(AttributeValueIndex(0), max_values.get()); | ||||
| for (AttributeValueIndex i(1); i < static_cast<uint32_t>(attribute.size()); | for (AttributeValueIndex i(1); i < static_cast<uint32_t>(attribute.size()); | ||||
| ++i) { | ++i) { | ||||
| attribute.GetValue(i, att_val.get()); | attribute.GetValue(i, att_val.get()); | ||||
| for (int c = 0; c < num_components; ++c) { | for (int c = 0; c < num_components; ++c) { | ||||
| if (min_values_[c] > att_val[c]) | if (min_values_[c] > att_val[c]) { | ||||
| min_values_[c] = att_val[c]; | min_values_[c] = att_val[c]; | ||||
| if (max_values[c] < att_val[c]) | } | ||||
| if (max_values[c] < att_val[c]) { | |||||
| max_values[c] = att_val[c]; | max_values[c] = att_val[c]; | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| for (int c = 0; c < num_components; ++c) { | for (int c = 0; c < num_components; ++c) { | ||||
| if (std::isnan(min_values_[c]) || std::isinf(min_values_[c]) || | |||||
| std::isnan(max_values[c]) || std::isinf(max_values[c])) { | |||||
| return false; | |||||
| } | |||||
| const float dif = max_values[c] - min_values_[c]; | const float dif = max_values[c] - min_values_[c]; | ||||
| if (dif > range_) | if (dif > range_) { | ||||
| range_ = dif; | range_ = dif; | ||||
| } | } | ||||
| } | |||||
| // In case all values are the same, initialize the range to unit length. This | // In case all values are the same, initialize the range to unit length. This | ||||
| // will ensure that all values are quantized properly to the same value. | // will ensure that all values are quantized properly to the same value. | ||||
| if (range_ == 0.f) | if (range_ == 0.f) { | ||||
| range_ = 1.f; | range_ = 1.f; | ||||
| } | |||||
| return true; | return true; | ||||
| } | } | ||||
| bool AttributeQuantizationTransform::EncodeParameters( | bool AttributeQuantizationTransform::EncodeParameters( | ||||
| EncoderBuffer *encoder_buffer) const { | EncoderBuffer *encoder_buffer) const { | ||||
| if (is_initialized()) { | if (is_initialized()) { | ||||
| encoder_buffer->Encode(min_values_.data(), | encoder_buffer->Encode(min_values_.data(), | ||||
| ▲ Show 20 Lines • Show All 72 Lines • Show Last 20 Lines | |||||