File size: 2,419 Bytes
7873319 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
/*
* Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved.
*
* NVIDIA CORPORATION and its licensors retain all intellectual property
* and proprietary rights in and to this software, related documentation
* and any modifications thereto. Any use, reproduction, disclosure or
* distribution of this software and related documentation without an express
* license agreement from NVIDIA CORPORATION is strictly prohibited.
*/
/** @file tinyobj_loader_wrapper.cpp
* @author Thomas Müller, NVIDIA
* @brief Wrapper around the tinyobj_loader library, providing a simple
* interface to load OBJ-based meshes.
*/
#include <neural-graphics-primitives/common.h>
#include <neural-graphics-primitives/tinyobj_loader_wrapper.h>
#include <fmt/core.h>
#define TINYOBJLOADER_IMPLEMENTATION
#include <tinyobjloader/tiny_obj_loader.h>
#include <iostream>
#include <vector>
using namespace Eigen;
NGP_NAMESPACE_BEGIN
std::vector<Vector3f> load_obj(const std::string& filename) {
tinyobj::attrib_t attrib;
std::vector<tinyobj::shape_t> shapes;
std::vector<tinyobj::material_t> materials;
std::string warn;
std::string err;
bool ret = tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, filename.c_str());
if (!warn.empty()) {
tlog::warning() << "Obj: " << warn;
}
if (!err.empty()) {
throw std::runtime_error{fmt::format("Error loading obj: {}", err)};
}
std::vector<Vector3f> result;
tlog::success() << "Loaded mesh \"" << filename << "\" file with " << shapes.size() << " shapes.";
// Loop over shapes
for (size_t s = 0; s < shapes.size(); s++) {
// Loop over faces
size_t index_offset = 0;
for (size_t f = 0; f < shapes[s].mesh.num_face_vertices.size(); f++) {
size_t fv = size_t(shapes[s].mesh.num_face_vertices[f]);
if (shapes[s].mesh.num_face_vertices[f] != 3) {
tlog::warning() << "Non-triangle face found in " << filename;
index_offset += fv;
continue;
}
// Loop over vertices in the face.
for (size_t v = 0; v < 3; v++) {
tinyobj::index_t idx = shapes[s].mesh.indices[index_offset + v];
const tinyobj::real_t vx = attrib.vertices[3*idx.vertex_index+0];
const tinyobj::real_t vy = attrib.vertices[3*idx.vertex_index+1];
const tinyobj::real_t vz = attrib.vertices[3*idx.vertex_index+2];
result.emplace_back(vx, vy, vz);
}
index_offset += fv;
}
}
return result;
}
NGP_NAMESPACE_END
|