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/tools/draco_encoder.cc')
-rw-r--r--extern/draco/dracoenc/src/draco/tools/draco_encoder.cc373
1 files changed, 0 insertions, 373 deletions
diff --git a/extern/draco/dracoenc/src/draco/tools/draco_encoder.cc b/extern/draco/dracoenc/src/draco/tools/draco_encoder.cc
deleted file mode 100644
index e44d0939048..00000000000
--- a/extern/draco/dracoenc/src/draco/tools/draco_encoder.cc
+++ /dev/null
@@ -1,373 +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 <cinttypes>
-#include <cstdlib>
-#include <fstream>
-
-#include "draco/compression/encode.h"
-#include "draco/core/cycle_timer.h"
-#include "draco/io/mesh_io.h"
-#include "draco/io/point_cloud_io.h"
-
-namespace {
-
-struct Options {
- Options();
-
- bool is_point_cloud;
- int pos_quantization_bits;
- int tex_coords_quantization_bits;
- bool tex_coords_deleted;
- int normals_quantization_bits;
- bool normals_deleted;
- int generic_quantization_bits;
- bool generic_deleted;
- int compression_level;
- bool use_metadata;
- std::string input;
- std::string output;
-};
-
-Options::Options()
- : is_point_cloud(false),
- pos_quantization_bits(14),
- tex_coords_quantization_bits(12),
- tex_coords_deleted(false),
- normals_quantization_bits(10),
- normals_deleted(false),
- generic_quantization_bits(8),
- generic_deleted(false),
- compression_level(7),
- use_metadata(false) {}
-
-void Usage() {
- printf("Usage: draco_encoder [options] -i input\n");
- printf("\n");
- printf("Main options:\n");
- printf(" -h | -? show help.\n");
- printf(" -i <input> input file name.\n");
- printf(" -o <output> output file name.\n");
- printf(
- " -point_cloud forces the input to be encoded as a point "
- "cloud.\n");
- printf(
- " -qp <value> quantization bits for the position "
- "attribute, default=14.\n");
- printf(
- " -qt <value> quantization bits for the texture coordinate "
- "attribute, default=12.\n");
- printf(
- " -qn <value> quantization bits for the normal vector "
- "attribute, default=10.\n");
- printf(
- " -qg <value> quantization bits for any generic attribute, "
- "default=8.\n");
- printf(
- " -cl <value> compression level [0-10], most=10, least=0, "
- "default=7.\n");
- printf(
- " --skip ATTRIBUTE_NAME skip a given attribute (NORMAL, TEX_COORD, "
- "GENERIC)\n");
- printf(
- " --metadata use metadata to encode extra information in "
- "mesh files.\n");
- printf(
- "\nUse negative quantization values to skip the specified attribute\n");
-}
-
-int StringToInt(const std::string &s) {
- char *end;
- return strtol(s.c_str(), &end, 10); // NOLINT
-}
-
-void PrintOptions(const draco::PointCloud &pc, const Options &options) {
- printf("Encoder options:\n");
- printf(" Compression level = %d\n", options.compression_level);
- if (options.pos_quantization_bits == 0) {
- printf(" Positions: No quantization\n");
- } else {
- printf(" Positions: Quantization = %d bits\n",
- options.pos_quantization_bits);
- }
-
- if (pc.GetNamedAttributeId(draco::GeometryAttribute::TEX_COORD) >= 0) {
- if (options.tex_coords_quantization_bits == 0) {
- printf(" Texture coordinates: No quantization\n");
- } else {
- printf(" Texture coordinates: Quantization = %d bits\n",
- options.tex_coords_quantization_bits);
- }
- } else if (options.tex_coords_deleted) {
- printf(" Texture coordinates: Skipped\n");
- }
-
- if (pc.GetNamedAttributeId(draco::GeometryAttribute::NORMAL) >= 0) {
- if (options.normals_quantization_bits == 0) {
- printf(" Normals: No quantization\n");
- } else {
- printf(" Normals: Quantization = %d bits\n",
- options.normals_quantization_bits);
- }
- } else if (options.normals_deleted) {
- printf(" Normals: Skipped\n");
- }
-
- if (pc.GetNamedAttributeId(draco::GeometryAttribute::GENERIC) >= 0) {
- if (options.generic_quantization_bits == 0) {
- printf(" Generic: No quantization\n");
- } else {
- printf(" Generic: Quantization = %d bits\n",
- options.generic_quantization_bits);
- }
- } else if (options.generic_deleted) {
- printf(" Generic: Skipped\n");
- }
- printf("\n");
-}
-
-int EncodePointCloudToFile(const draco::PointCloud &pc, const std::string &file,
- draco::Encoder *encoder) {
- draco::CycleTimer timer;
- // Encode the geometry.
- draco::EncoderBuffer buffer;
- timer.Start();
- const draco::Status status = encoder->EncodePointCloudToBuffer(pc, &buffer);
- if (!status.ok()) {
- printf("Failed to encode the point cloud.\n");
- printf("%s\n", status.error_msg());
- return -1;
- }
- timer.Stop();
- // Save the encoded geometry into a file.
- std::ofstream out_file(file, std::ios::binary);
- if (!out_file) {
- printf("Failed to create the output file.\n");
- return -1;
- }
- out_file.write(buffer.data(), buffer.size());
- printf("Encoded point cloud saved to %s (%" PRId64 " ms to encode).\n",
- file.c_str(), timer.GetInMs());
- printf("\nEncoded size = %zu bytes\n\n", buffer.size());
- return 0;
-}
-
-int EncodeMeshToFile(const draco::Mesh &mesh, const std::string &file,
- draco::Encoder *encoder) {
- draco::CycleTimer timer;
- // Encode the geometry.
- draco::EncoderBuffer buffer;
- timer.Start();
- const draco::Status status = encoder->EncodeMeshToBuffer(mesh, &buffer);
- if (!status.ok()) {
- printf("Failed to encode the mesh.\n");
- printf("%s\n", status.error_msg());
- return -1;
- }
- timer.Stop();
- // Save the encoded geometry into a file.
- std::ofstream out_file(file, std::ios::binary);
- if (!out_file) {
- printf("Failed to create the output file.\n");
- return -1;
- }
- out_file.write(buffer.data(), buffer.size());
- printf("Encoded mesh saved to %s (%" PRId64 " ms to encode).\n", file.c_str(),
- timer.GetInMs());
- printf("\nEncoded size = %zu bytes\n\n", buffer.size());
- return 0;
-}
-
-} // anonymous namespace
-
-int main(int argc, char **argv) {
- Options options;
- const int argc_check = argc - 1;
-
- for (int i = 1; i < argc; ++i) {
- if (!strcmp("-h", argv[i]) || !strcmp("-?", argv[i])) {
- Usage();
- return 0;
- } else if (!strcmp("-i", argv[i]) && i < argc_check) {
- options.input = argv[++i];
- } else if (!strcmp("-o", argv[i]) && i < argc_check) {
- options.output = argv[++i];
- } else if (!strcmp("-point_cloud", argv[i])) {
- options.is_point_cloud = true;
- } else if (!strcmp("-qp", argv[i]) && i < argc_check) {
- options.pos_quantization_bits = StringToInt(argv[++i]);
- if (options.pos_quantization_bits > 30) {
- printf(
- "Error: The maximum number of quantization bits for the position "
- "attribute is 30.\n");
- return -1;
- }
- } else if (!strcmp("-qt", argv[i]) && i < argc_check) {
- options.tex_coords_quantization_bits = StringToInt(argv[++i]);
- if (options.tex_coords_quantization_bits > 30) {
- printf(
- "Error: The maximum number of quantization bits for the texture "
- "coordinate attribute is 30.\n");
- return -1;
- }
- } else if (!strcmp("-qn", argv[i]) && i < argc_check) {
- options.normals_quantization_bits = StringToInt(argv[++i]);
- if (options.normals_quantization_bits > 30) {
- printf(
- "Error: The maximum number of quantization bits for the normal "
- "attribute is 30.\n");
- return -1;
- }
- } else if (!strcmp("-qg", argv[i]) && i < argc_check) {
- options.generic_quantization_bits = StringToInt(argv[++i]);
- if (options.generic_quantization_bits > 30) {
- printf(
- "Error: The maximum number of quantization bits for generic "
- "attributes is 30.\n");
- return -1;
- }
- } else if (!strcmp("-cl", argv[i]) && i < argc_check) {
- options.compression_level = StringToInt(argv[++i]);
- } else if (!strcmp("--skip", argv[i]) && i < argc_check) {
- if (!strcmp("NORMAL", argv[i + 1])) {
- options.normals_quantization_bits = -1;
- } else if (!strcmp("TEX_COORD", argv[i + 1])) {
- options.tex_coords_quantization_bits = -1;
- } else if (!strcmp("GENERIC", argv[i + 1])) {
- options.generic_quantization_bits = -1;
- } else {
- printf("Error: Invalid attribute name after --skip\n");
- return -1;
- }
- ++i;
- } else if (!strcmp("--metadata", argv[i])) {
- options.use_metadata = true;
- }
- }
- if (argc < 3 || options.input.empty()) {
- Usage();
- return -1;
- }
-
- std::unique_ptr<draco::PointCloud> pc;
- draco::Mesh *mesh = nullptr;
- if (!options.is_point_cloud) {
- auto maybe_mesh =
- draco::ReadMeshFromFile(options.input, options.use_metadata);
- if (!maybe_mesh.ok()) {
- printf("Failed loading the input mesh: %s.\n",
- maybe_mesh.status().error_msg());
- return -1;
- }
- mesh = maybe_mesh.value().get();
- pc = std::move(maybe_mesh).value();
- } else {
- auto maybe_pc = draco::ReadPointCloudFromFile(options.input);
- if (!maybe_pc.ok()) {
- printf("Failed loading the input point cloud: %s.\n",
- maybe_pc.status().error_msg());
- return -1;
- }
- pc = std::move(maybe_pc).value();
- }
-
- if (options.pos_quantization_bits < 0) {
- printf("Error: Position attribute cannot be skipped.\n");
- return -1;
- }
-
- // Delete attributes if needed. This needs to happen before we set any
- // quantization settings.
- if (options.tex_coords_quantization_bits < 0) {
- if (pc->NumNamedAttributes(draco::GeometryAttribute::TEX_COORD) > 0) {
- options.tex_coords_deleted = true;
- }
- while (pc->NumNamedAttributes(draco::GeometryAttribute::TEX_COORD) > 0) {
- pc->DeleteAttribute(
- pc->GetNamedAttributeId(draco::GeometryAttribute::TEX_COORD, 0));
- }
- }
- if (options.normals_quantization_bits < 0) {
- if (pc->NumNamedAttributes(draco::GeometryAttribute::NORMAL) > 0) {
- options.normals_deleted = true;
- }
- while (pc->NumNamedAttributes(draco::GeometryAttribute::NORMAL) > 0) {
- pc->DeleteAttribute(
- pc->GetNamedAttributeId(draco::GeometryAttribute::NORMAL, 0));
- }
- }
- if (options.generic_quantization_bits < 0) {
- if (pc->NumNamedAttributes(draco::GeometryAttribute::GENERIC) > 0) {
- options.generic_deleted = true;
- }
- while (pc->NumNamedAttributes(draco::GeometryAttribute::GENERIC) > 0) {
- pc->DeleteAttribute(
- pc->GetNamedAttributeId(draco::GeometryAttribute::GENERIC, 0));
- }
- }
-#ifdef DRACO_ATTRIBUTE_INDICES_DEDUPLICATION_SUPPORTED
- // If any attribute has been deleted, run deduplication of point indices again
- // as some points can be possibly combined.
- if (options.tex_coords_deleted || options.normals_deleted ||
- options.generic_deleted) {
- pc->DeduplicatePointIds();
- }
-#endif
-
- // Convert compression level to speed (that 0 = slowest, 10 = fastest).
- const int speed = 10 - options.compression_level;
-
- draco::Encoder encoder;
-
- // Setup encoder options.
- if (options.pos_quantization_bits > 0) {
- encoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION,
- options.pos_quantization_bits);
- }
- if (options.tex_coords_quantization_bits > 0) {
- encoder.SetAttributeQuantization(draco::GeometryAttribute::TEX_COORD,
- options.tex_coords_quantization_bits);
- }
- if (options.normals_quantization_bits > 0) {
- encoder.SetAttributeQuantization(draco::GeometryAttribute::NORMAL,
- options.normals_quantization_bits);
- }
- if (options.generic_quantization_bits > 0) {
- encoder.SetAttributeQuantization(draco::GeometryAttribute::GENERIC,
- options.generic_quantization_bits);
- }
- encoder.SetSpeedOptions(speed, speed);
-
- if (options.output.empty()) {
- // Create a default output file by attaching .drc to the input file name.
- options.output = options.input + ".drc";
- }
-
- PrintOptions(*pc.get(), options);
-
- int ret = -1;
- const bool input_is_mesh = mesh && mesh->num_faces() > 0;
- if (input_is_mesh)
- ret = EncodeMeshToFile(*mesh, options.output, &encoder);
- else
- ret = EncodePointCloudToFile(*pc.get(), options.output, &encoder);
-
- if (ret != -1 && options.compression_level < 10) {
- printf(
- "For better compression, increase the compression level up to '-cl 10' "
- ".\n\n");
- }
-
- return ret;
-}