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/io/ply_encoder.cc')
-rw-r--r--extern/draco/dracoenc/src/draco/io/ply_encoder.cc201
1 files changed, 0 insertions, 201 deletions
diff --git a/extern/draco/dracoenc/src/draco/io/ply_encoder.cc b/extern/draco/dracoenc/src/draco/io/ply_encoder.cc
deleted file mode 100644
index cb25b21d4f8..00000000000
--- a/extern/draco/dracoenc/src/draco/io/ply_encoder.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-// 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.
-//
-#include "draco/io/ply_encoder.h"
-
-#include <fstream>
-#include <sstream>
-
-namespace draco {
-
-PlyEncoder::PlyEncoder()
- : out_buffer_(nullptr), in_point_cloud_(nullptr), in_mesh_(nullptr) {}
-
-bool PlyEncoder::EncodeToFile(const PointCloud &pc,
- const std::string &file_name) {
- std::ofstream file(file_name, std::ios::binary);
- if (!file)
- return false; // File couldn't be opened.
- // Encode the mesh into a buffer.
- EncoderBuffer buffer;
- if (!EncodeToBuffer(pc, &buffer))
- return false;
- // Write the buffer into the file.
- file.write(buffer.data(), buffer.size());
- return true;
-}
-
-bool PlyEncoder::EncodeToFile(const Mesh &mesh, const std::string &file_name) {
- in_mesh_ = &mesh;
- return EncodeToFile(static_cast<const PointCloud &>(mesh), file_name);
-}
-
-bool PlyEncoder::EncodeToBuffer(const PointCloud &pc,
- EncoderBuffer *out_buffer) {
- in_point_cloud_ = &pc;
- out_buffer_ = out_buffer;
- if (!EncodeInternal())
- return ExitAndCleanup(false);
- return ExitAndCleanup(true);
-}
-
-bool PlyEncoder::EncodeToBuffer(const Mesh &mesh, EncoderBuffer *out_buffer) {
- in_mesh_ = &mesh;
- return EncodeToBuffer(static_cast<const PointCloud &>(mesh), out_buffer);
-}
-bool PlyEncoder::EncodeInternal() {
- // Write PLY header.
- // TODO(ostava): Currently works only for xyz positions and rgb(a) colors.
- std::stringstream out;
- out << "ply" << std::endl;
- out << "format binary_little_endian 1.0" << std::endl;
- out << "element vertex " << in_point_cloud_->num_points() << std::endl;
-
- const int pos_att_id =
- in_point_cloud_->GetNamedAttributeId(GeometryAttribute::POSITION);
- int normal_att_id =
- in_point_cloud_->GetNamedAttributeId(GeometryAttribute::NORMAL);
- int tex_coord_att_id =
- in_point_cloud_->GetNamedAttributeId(GeometryAttribute::TEX_COORD);
- const int color_att_id =
- in_point_cloud_->GetNamedAttributeId(GeometryAttribute::COLOR);
-
- if (pos_att_id < 0)
- return false;
-
- // Ensure normals are 3 component. Don't encode them otherwise.
- if (normal_att_id >= 0 &&
- in_point_cloud_->attribute(normal_att_id)->num_components() != 3)
- normal_att_id = -1;
-
- // Ensure texture coordinates have only 2 components. Don't encode them
- // otherwise. TODO(ostava): Add support for 3 component normals (uvw).
- if (tex_coord_att_id >= 0 &&
- in_point_cloud_->attribute(tex_coord_att_id)->num_components() != 2)
- tex_coord_att_id = -1;
-
- out << "property " << GetAttributeDataType(pos_att_id) << " x" << std::endl;
- out << "property " << GetAttributeDataType(pos_att_id) << " y" << std::endl;
- out << "property " << GetAttributeDataType(pos_att_id) << " z" << std::endl;
- if (normal_att_id >= 0) {
- out << "property " << GetAttributeDataType(normal_att_id) << " nx"
- << std::endl;
- out << "property " << GetAttributeDataType(normal_att_id) << " ny"
- << std::endl;
- out << "property " << GetAttributeDataType(normal_att_id) << " nz"
- << std::endl;
- }
- if (color_att_id >= 0) {
- const auto *const attribute = in_point_cloud_->attribute(color_att_id);
- if (attribute->num_components() > 0) {
- out << "property " << GetAttributeDataType(color_att_id) << " red"
- << std::endl;
- }
- if (attribute->num_components() > 1) {
- out << "property " << GetAttributeDataType(color_att_id) << " green"
- << std::endl;
- }
- if (attribute->num_components() > 2) {
- out << "property " << GetAttributeDataType(color_att_id) << " blue"
- << std::endl;
- }
- if (attribute->num_components() > 3) {
- out << "property " << GetAttributeDataType(color_att_id) << " alpha"
- << std::endl;
- }
- }
- if (in_mesh_) {
- out << "element face " << in_mesh_->num_faces() << std::endl;
- out << "property list uchar int vertex_indices" << std::endl;
- if (tex_coord_att_id >= 0) {
- // Texture coordinates are usually encoded in the property list (one value
- // per corner).
- out << "property list uchar " << GetAttributeDataType(tex_coord_att_id)
- << " texcoord" << std::endl;
- }
- }
- out << "end_header" << std::endl;
-
- // Not very efficient but the header should be small so just copy the stream
- // to a string.
- const std::string header_str = out.str();
- buffer()->Encode(header_str.data(), header_str.length());
-
- // Store point attributes.
- for (PointIndex v(0); v < in_point_cloud_->num_points(); ++v) {
- const auto *const pos_att = in_point_cloud_->attribute(pos_att_id);
- buffer()->Encode(pos_att->GetAddress(pos_att->mapped_index(v)),
- pos_att->byte_stride());
- if (normal_att_id >= 0) {
- const auto *const normal_att = in_point_cloud_->attribute(normal_att_id);
- buffer()->Encode(normal_att->GetAddress(normal_att->mapped_index(v)),
- normal_att->byte_stride());
- }
- if (color_att_id >= 0) {
- const auto *const color_att = in_point_cloud_->attribute(color_att_id);
- buffer()->Encode(color_att->GetAddress(color_att->mapped_index(v)),
- color_att->byte_stride());
- }
- }
-
- if (in_mesh_) {
- // Write face data.
- for (FaceIndex i(0); i < in_mesh_->num_faces(); ++i) {
- // Write the number of face indices (always 3).
- buffer()->Encode(static_cast<uint8_t>(3));
-
- const auto &f = in_mesh_->face(i);
- buffer()->Encode(f[0]);
- buffer()->Encode(f[1]);
- buffer()->Encode(f[2]);
-
- if (tex_coord_att_id >= 0) {
- // Two coordinates for every corner -> 6.
- buffer()->Encode(static_cast<uint8_t>(6));
-
- const auto *const tex_att =
- in_point_cloud_->attribute(tex_coord_att_id);
- for (int c = 0; c < 3; ++c) {
- buffer()->Encode(tex_att->GetAddress(tex_att->mapped_index(f[c])),
- tex_att->byte_stride());
- }
- }
- }
- }
- return true;
-}
-
-bool PlyEncoder::ExitAndCleanup(bool return_value) {
- in_mesh_ = nullptr;
- in_point_cloud_ = nullptr;
- out_buffer_ = nullptr;
- return return_value;
-}
-
-const char *PlyEncoder::GetAttributeDataType(int attribute) {
- // TODO(ostava): Add support for more types.
- switch (in_point_cloud_->attribute(attribute)->data_type()) {
- case DT_FLOAT32:
- return "float";
- case DT_UINT8:
- return "uchar";
- case DT_INT32:
- return "int";
- default:
- break;
- }
- return nullptr;
-}
-
-} // namespace draco