Update version to 1.2.3

This fixes #300
This commit is contained in:
Frank Galligan 2017-11-25 12:55:27 -08:00
parent 441d5e05f7
commit ff89a1142c
12 changed files with 104 additions and 80 deletions

View File

@ -5,6 +5,9 @@
News News
======= =======
### Version 1.2.3 release
* Fixed Visual Studio building issue
### Version 1.2.2 release ### Version 1.2.2 release
The latest version of Draco brings a number of small bug fixes The latest version of Draco brings a number of small bug fixes
* Fixed issues when parsing ill-formatted .obj files * Fixed issues when parsing ill-formatted .obj files

View File

@ -77,6 +77,7 @@ class MeshPredictionSchemeConstrainedMultiParallelogramEncoder
// the edges are processed. For better compression, the flags are stored in // the edges are processed. For better compression, the flags are stored in
// in separate contexts based on the number of available parallelograms at a // in separate contexts based on the number of available parallelograms at a
// given vertex. // given vertex.
// TODO(scottgodfrey) reconsider std::vector<bool> (performance/space).
std::vector<bool> is_crease_edge_[kMaxNumParallelograms]; std::vector<bool> is_crease_edge_[kMaxNumParallelograms];
Mode selected_mode_; Mode selected_mode_;
}; };
@ -190,6 +191,7 @@ bool MeshPredictionSchemeConstrainedMultiParallelogramEncoder<
// Mark all parallelograms as excluded. // Mark all parallelograms as excluded.
std::fill(exluded_parallelograms, std::fill(exluded_parallelograms,
exluded_parallelograms + num_parallelograms, true); exluded_parallelograms + num_parallelograms, true);
// TODO(scottgodfrey) maybe this should be another std::fill.
// Mark the first |num_used_parallelograms| as not excluded. // Mark the first |num_used_parallelograms| as not excluded.
for (int j = 0; j < num_used_parallelograms; ++j) { for (int j = 0; j < num_used_parallelograms; ++j) {
exluded_parallelograms[j] = false; exluded_parallelograms[j] = false;

View File

@ -22,6 +22,8 @@
namespace draco { namespace draco {
// TODO(scottgodfrey) consolidate Vertex/next/previous queries to one call
// (performance).
template <class CornerTableT> template <class CornerTableT>
inline void GetParallelogramEntries( inline void GetParallelogramEntries(
const CornerIndex ci, const CornerTableT *table, const CornerIndex ci, const CornerTableT *table,

View File

@ -40,78 +40,100 @@ struct MeshPredictionSchemeDecoderFactory {
// for all mesh prediction schemes. The specialization is done in compile time // for all mesh prediction schemes. The specialization is done in compile time
// to prevent instantiations of unneeded combinations of prediction schemes + // to prevent instantiations of unneeded combinations of prediction schemes +
// prediction transforms. // prediction transforms.
template < template <class TransformT, class MeshDataT,
class TransformT, class MeshDataT, PredictionSchemeTransformType Method>
typename std::enable_if< struct DispatchFunctor {
TransformT::GetType() == PREDICTION_TRANSFORM_WRAP, int>::type = 0> std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>> operator()(
std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>> operator()( PredictionSchemeMethod method, const PointAttribute *attribute,
PredictionSchemeMethod method, const PointAttribute *attribute, const TransformT &transform, const MeshDataT &mesh_data,
const TransformT &transform, const MeshDataT &mesh_data, uint16_t bitstream_version) {
uint16_t bitstream_version) { if (method == MESH_PREDICTION_PARALLELOGRAM) {
if (method == MESH_PREDICTION_PARALLELOGRAM) { return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>( new MeshPredictionSchemeParallelogramDecoder<DataTypeT, TransformT,
new MeshPredictionSchemeParallelogramDecoder<DataTypeT, TransformT,
MeshDataT>(
attribute, transform, mesh_data));
}
#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
else if (method == MESH_PREDICTION_MULTI_PARALLELOGRAM) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeMultiParallelogramDecoder<
DataTypeT, TransformT, MeshDataT>(attribute, transform,
mesh_data));
}
#endif
else if (method == MESH_PREDICTION_CONSTRAINED_MULTI_PARALLELOGRAM) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeConstrainedMultiParallelogramDecoder<
DataTypeT, TransformT, MeshDataT>(attribute, transform,
mesh_data));
}
#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
else if (method == MESH_PREDICTION_TEX_COORDS) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeTexCoordsDecoder<DataTypeT, TransformT,
MeshDataT>(
attribute, transform, mesh_data, bitstream_version));
}
#endif
else if (method == MESH_PREDICTION_TEX_COORDS_PORTABLE) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeTexCoordsPortableDecoder<
DataTypeT, TransformT, MeshDataT>(attribute, transform,
mesh_data));
} else if (method == MESH_PREDICTION_GEOMETRIC_NORMAL) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeGeometricNormalDecoder<DataTypeT, TransformT,
MeshDataT>( MeshDataT>(
attribute, transform, mesh_data)); attribute, transform, mesh_data));
}
#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
else if (method == MESH_PREDICTION_MULTI_PARALLELOGRAM) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeMultiParallelogramDecoder<
DataTypeT, TransformT, MeshDataT>(attribute, transform,
mesh_data));
}
#endif
else if (method == MESH_PREDICTION_CONSTRAINED_MULTI_PARALLELOGRAM) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeConstrainedMultiParallelogramDecoder<
DataTypeT, TransformT, MeshDataT>(attribute, transform,
mesh_data));
}
#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED
else if (method == MESH_PREDICTION_TEX_COORDS) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeTexCoordsDecoder<DataTypeT, TransformT,
MeshDataT>(
attribute, transform, mesh_data, bitstream_version));
}
#endif
else if (method == MESH_PREDICTION_TEX_COORDS_PORTABLE) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeTexCoordsPortableDecoder<
DataTypeT, TransformT, MeshDataT>(attribute, transform,
mesh_data));
} else if (method == MESH_PREDICTION_GEOMETRIC_NORMAL) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeGeometricNormalDecoder<
DataTypeT, TransformT, MeshDataT>(attribute, transform,
mesh_data));
}
return nullptr;
} }
return nullptr; };
}
// Operator () specialized for normal octahedron transforms. These transforms // Operator () specialized for normal octahedron transforms. These transforms
// are currently used only by the geometric normal prediction scheme (the // are currently used only by the geometric normal prediction scheme (the
// transform is also used by delta coding, but delta predictor is not // transform is also used by delta coding, but delta predictor is not
// constructed in this function). // constructed in this function).
template < template <class TransformT, class MeshDataT>
class TransformT, class MeshDataT, struct DispatchFunctor<TransformT, MeshDataT,
typename std::enable_if< PREDICTION_TRANSFORM_NORMAL_OCTAHEDRON_CANONICALIZED> {
TransformT::GetType() == std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>> operator()(
PREDICTION_TRANSFORM_NORMAL_OCTAHEDRON_CANONICALIZED || PredictionSchemeMethod method, const PointAttribute *attribute,
TransformT::GetType() == PREDICTION_TRANSFORM_NORMAL_OCTAHEDRON, const TransformT &transform, const MeshDataT &mesh_data,
int>::type = 0> uint16_t bitstream_version) {
if (method == MESH_PREDICTION_GEOMETRIC_NORMAL) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeGeometricNormalDecoder<
DataTypeT, TransformT, MeshDataT>(attribute, transform,
mesh_data));
}
return nullptr;
}
};
template <class TransformT, class MeshDataT>
struct DispatchFunctor<TransformT, MeshDataT,
PREDICTION_TRANSFORM_NORMAL_OCTAHEDRON> {
std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>> operator()(
PredictionSchemeMethod method, const PointAttribute *attribute,
const TransformT &transform, const MeshDataT &mesh_data,
uint16_t bitstream_version) {
if (method == MESH_PREDICTION_GEOMETRIC_NORMAL) {
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>(
new MeshPredictionSchemeGeometricNormalDecoder<
DataTypeT, TransformT, MeshDataT>(attribute, transform,
mesh_data));
}
return nullptr;
}
};
template <class TransformT, class MeshDataT>
std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>> operator()( std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>> operator()(
PredictionSchemeMethod method, const PointAttribute *attribute, PredictionSchemeMethod method, const PointAttribute *attribute,
const TransformT &transform, const MeshDataT &mesh_data, const TransformT &transform, const MeshDataT &mesh_data,
uint16_t bitstream_version) { uint16_t bitstream_version) {
if (method == MESH_PREDICTION_GEOMETRIC_NORMAL) { return DispatchFunctor<TransformT, MeshDataT, TransformT::GetType()>()(
return std::unique_ptr<PredictionSchemeDecoder<DataTypeT, TransformT>>( method, attribute, transform, mesh_data, bitstream_version);
new MeshPredictionSchemeGeometricNormalDecoder<DataTypeT, TransformT,
MeshDataT>(
attribute, transform, mesh_data));
}
return nullptr;
} }
}; };

View File

@ -33,6 +33,7 @@ static constexpr uint16_t kDracoBitstreamVersion = DRACO_BITSTREAM_VERSION(
kDracoBitstreamVersionMajor, kDracoBitstreamVersionMinor); kDracoBitstreamVersionMajor, kDracoBitstreamVersionMinor);
// Currently, we support point cloud and triangular mesh encoding. // Currently, we support point cloud and triangular mesh encoding.
// TODO(scottgodfrey) convert enum to enum class (safety, not performance).
enum EncodedGeometryType { enum EncodedGeometryType {
INVALID_GEOMETRY_TYPE = -1, INVALID_GEOMETRY_TYPE = -1,
POINT_CLOUD = 0, POINT_CLOUD = 0,

View File

@ -356,16 +356,9 @@ bool MeshEdgeBreakerDecoderImpl<TraversalDecoder>::DecodeConnectivity() {
} }
traversal_decoder_.Init(this); traversal_decoder_.Init(this);
#ifdef DRACO_BACKWARDS_COMPATIBILITY_SUPPORTED // Add one extra vertex for each split symbol.
if (decoder_->bitstream_version() < DRACO_BITSTREAM_VERSION(2, 2)) { traversal_decoder_.SetNumEncodedVertices(num_encoded_vertices_ +
traversal_decoder_.SetNumEncodedVertices(num_encoded_vertices_); num_encoded_split_symbols);
} else
#endif
{
// Add one extra vertex for each split symbol.
traversal_decoder_.SetNumEncodedVertices(num_encoded_vertices_ +
num_encoded_split_symbols);
}
traversal_decoder_.SetNumAttributeData(num_attribute_data); traversal_decoder_.SetNumAttributeData(num_attribute_data);
DecoderBuffer traversal_end_buffer; DecoderBuffer traversal_end_buffer;

View File

@ -28,7 +28,7 @@
#include "draco/mesh/prediction_degree_traverser.h" #include "draco/mesh/prediction_degree_traverser.h"
namespace draco { namespace draco {
// TODO(scottgodfrey) consider converting 'typedef' to 'using' and deduplicate.
typedef CornerIndex CornerIndex; typedef CornerIndex CornerIndex;
typedef FaceIndex FaceIndex; typedef FaceIndex FaceIndex;
typedef VertexIndex VertexIndex; typedef VertexIndex VertexIndex;

View File

@ -44,8 +44,8 @@ class MeshEdgeBreakerTraversalPredictiveDecoder
int32_t num_split_symbols; int32_t num_split_symbols;
if (!out_buffer->Decode(&num_split_symbols) || num_split_symbols < 0) if (!out_buffer->Decode(&num_split_symbols) || num_split_symbols < 0)
return false; return false;
// Add one vertex for each split symbol. if (num_split_symbols >= num_vertices_)
num_vertices_ += num_split_symbols; return false;
// Set the valences of all initial vertices to 0. // Set the valences of all initial vertices to 0.
vertex_valences_.resize(num_vertices_, 0); vertex_valences_.resize(num_vertices_, 0);
if (!prediction_decoder_.StartDecoding(out_buffer)) if (!prediction_decoder_.StartDecoding(out_buffer))

View File

@ -64,8 +64,8 @@ class MeshEdgeBreakerTraversalValenceDecoder
if (!DecodeVarint(&num_split_symbols, out_buffer)) if (!DecodeVarint(&num_split_symbols, out_buffer))
return false; return false;
} }
// Add one extra vertex for each split symbol. if (num_split_symbols >= num_vertices_)
num_vertices_ += num_split_symbols; return false;
int8_t mode; int8_t mode;
if (!out_buffer->Decode(&mode)) if (!out_buffer->Decode(&mode))

View File

@ -18,7 +18,7 @@
namespace draco { namespace draco {
// Draco version is comprised of <major>.<minor>.<revision>. // Draco version is comprised of <major>.<minor>.<revision>.
static const char kDracoVersion[] = "1.2.2"; static const char kDracoVersion[] = "1.2.3";
const char *Version() { return kDracoVersion; } const char *Version() { return kDracoVersion; }

View File

@ -623,8 +623,8 @@ bool ObjDecoder::ParseMaterialFile(const std::string &file_name, bool *error) {
buffer_.Init(&data[0], file_size); buffer_.Init(&data[0], file_size);
num_materials_ = 0; num_materials_ = 0;
while (ParseMaterialFileDefinition(error)) while (ParseMaterialFileDefinition(error)) {
; }
// Restore the original buffer. // Restore the original buffer.
buffer_ = old_buffer; buffer_ = old_buffer;

View File

@ -49,7 +49,8 @@ Options::Options()
normals_deleted(false), normals_deleted(false),
generic_quantization_bits(8), generic_quantization_bits(8),
generic_deleted(false), generic_deleted(false),
compression_level(7) {} compression_level(7),
use_metadata(false) {}
void Usage() { void Usage() {
printf("Usage: draco_encoder [options] -i input\n"); printf("Usage: draco_encoder [options] -i input\n");