Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.h81
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_