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/mesh_io.cc')
-rw-r--r--extern/draco/dracoenc/src/draco/io/mesh_io.cc74
1 files changed, 74 insertions, 0 deletions
diff --git a/extern/draco/dracoenc/src/draco/io/mesh_io.cc b/extern/draco/dracoenc/src/draco/io/mesh_io.cc
new file mode 100644
index 00000000000..807dcfbe06b
--- /dev/null
+++ b/extern/draco/dracoenc/src/draco/io/mesh_io.cc
@@ -0,0 +1,74 @@
+// 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/mesh_io.h"
+
+#include <fstream>
+
+#include "draco/io/obj_decoder.h"
+#include "draco/io/parser_utils.h"
+#include "draco/io/ply_decoder.h"
+
+namespace draco {
+
+namespace {
+
+// Returns the file extension in lowercase if present, else ""
+inline std::string LowercaseFileExtension(const std::string &filename) {
+ size_t pos = filename.find_last_of('.');
+ if (pos == std::string::npos || pos >= filename.length() - 1)
+ return "";
+ return parser::ToLower(filename.substr(pos + 1));
+}
+
+} // namespace
+
+StatusOr<std::unique_ptr<Mesh>> ReadMeshFromFile(const std::string &file_name) {
+ return ReadMeshFromFile(file_name, false);
+}
+
+StatusOr<std::unique_ptr<Mesh>> ReadMeshFromFile(const std::string &file_name,
+ bool use_metadata) {
+ std::unique_ptr<Mesh> mesh(new Mesh());
+ // Analyze file extension.
+ const std::string extension = LowercaseFileExtension(file_name);
+ if (extension == "obj") {
+ // Wavefront OBJ file format.
+ ObjDecoder obj_decoder;
+ obj_decoder.set_use_metadata(use_metadata);
+ const Status obj_status = obj_decoder.DecodeFromFile(file_name, mesh.get());
+ if (!obj_status.ok())
+ return obj_status;
+ return std::move(mesh);
+ }
+ if (extension == "ply") {
+ // Wavefront PLY file format.
+ PlyDecoder ply_decoder;
+ if (!ply_decoder.DecodeFromFile(file_name, mesh.get()))
+ return Status(Status::ERROR, "Unknown error.");
+ return std::move(mesh);
+ }
+
+ // Otherwise not an obj file. Assume the file was encoded with one of the
+ // draco encoding methods.
+ std::ifstream is(file_name.c_str(), std::ios::binary);
+ if (!is)
+ return Status(Status::ERROR, "Invalid input stream.");
+ if (!ReadMeshFromStream(&mesh, is).good())
+ return Status(Status::ERROR,
+ "Unknown error."); // Error reading the stream.
+ return std::move(mesh);
+}
+
+} // namespace draco