mirror of
https://git.mirrors.martin98.com/https://github.com/google/draco
synced 2025-06-04 11:25:44 +08:00
parent
441d5e05f7
commit
ff89a1142c
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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))
|
||||||
|
@ -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))
|
||||||
|
@ -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; }
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user