diff options
Diffstat (limited to 'extern/draco/dracoenc/src/draco/compression/mesh/mesh_encoder_helpers.h')
-rw-r--r-- | extern/draco/dracoenc/src/draco/compression/mesh/mesh_encoder_helpers.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/extern/draco/dracoenc/src/draco/compression/mesh/mesh_encoder_helpers.h b/extern/draco/dracoenc/src/draco/compression/mesh/mesh_encoder_helpers.h new file mode 100644 index 00000000000..d809a521369 --- /dev/null +++ b/extern/draco/dracoenc/src/draco/compression/mesh/mesh_encoder_helpers.h @@ -0,0 +1,81 @@ +// Copyright 2016 The Draco Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +#ifndef DRACO_COMPRESSION_MESH_MESH_ENCODER_HELPERS_H_ +#define DRACO_COMPRESSION_MESH_MESH_ENCODER_HELPERS_H_ + +#include "draco/compression/mesh/mesh_encoder.h" +#include "draco/mesh/triangle_soup_mesh_builder.h" + +namespace draco { + +// Helper class for encoding data supplied in a stream of single precision +// floating point numbers formatted as XYZ|UV. The stream must contain three +// XYZ|UV values for every face of the mesh. +// The encoded data is written into the output stream "os". +// In case of error, the stream is set to an invalid state (ios_base::bad_bit). +template <typename OStreamT> +OStreamT EncodePos3Tex2DataToStream( + const float *data, int num_faces, CompressionMethod method, + const MeshCompressionOptions &compression_options, + const MeshAttributeCompressionOptions &pos_options, + const MeshAttributeCompressionOptions &tex_options, OStreamT &&os) { + // Build the mesh. + TriangleSoupMeshBuilder mb; + mb.Start(num_faces); + const int pos_att_id = + mb.AddAttribute(GeometryAttribute::POSITION, 3, DT_FLOAT32); + const int tex_att_id = + mb.AddAttribute(GeometryAttribute::TEX_COORD_0, 2, DT_FLOAT32); + constexpr int data_stride = 5; + constexpr int tex_offset = 3; + for (int f = 0; f < num_faces; ++f) { + int offset = 3 * f * data_stride; + // Add position data for the face. + mb.SetAttributeValuesForFace(pos_att_id, f, data + offset, + data + offset + data_stride, + data + offset + 2 * data_stride); + // Add texture data for the face. + offset += tex_offset; + mb.SetAttributeValuesForFace(tex_att_id, f, data + offset, + data + offset + data_stride, + data + offset + 2 * data_stride); + } + std::unique_ptr<Mesh> mesh = mb.Finalize(); + if (mesh == nullptr) { + os.setstate(ios_base::badbit); + return os; + } + + // Set up the encoder. + std::unique_ptr<MeshEncoder> encoder = + MeshEncoder::CreateEncoderForMethod(method); + encoder->SetGlobalOptions(compression_options); + encoder->SetAttributeOptions(GeometryAttribute::POSITION, pos_options); + encoder->SetAttributeOptions(GeometryAttribute::TEX_COORD_0, tex_options); + + if (!encoder->EncodeMesh(mesh.get())) { + os.setstate(ios_base::badbit); + return os; + } + + // Write the encoded data into the stream. + os.write(static_cast<const char *>(encoder->buffer()->data()), + encoder->buffer()->size()); + return os; +} + +} // namespace draco + +#endif // DRACO_COMPRESSION_MESH_MESH_ENCODER_HELPERS_H_ |