cleanup and refactoring
This commit is contained in:
parent
2302158928
commit
76f6bf62a4
1285 changed files with 757994 additions and 8 deletions
165
raytracer/nvpro_core/third_party/tinyobjloader/CMakeLists.txt
vendored
Normal file
165
raytracer/nvpro_core/third_party/tinyobjloader/CMakeLists.txt
vendored
Normal file
|
|
@ -0,0 +1,165 @@
|
|||
#Tiny Object Loader Cmake configuration file.
|
||||
#This configures the Cmake system with multiple properties, depending
|
||||
#on the platform and configuration it is set to build in.
|
||||
cmake_minimum_required(VERSION 3.2)
|
||||
project(tinyobjloader)
|
||||
set(TINYOBJLOADER_SOVERSION 2)
|
||||
set(TINYOBJLOADER_VERSION 2.0.0-rc.10)
|
||||
|
||||
#optional double precision support
|
||||
option(TINYOBJLOADER_USE_DOUBLE "Build library with double precision instead of single (float)" OFF)
|
||||
|
||||
if(TINYOBJLOADER_USE_DOUBLE)
|
||||
set(LIBRARY_NAME ${PROJECT_NAME}_double)
|
||||
else()
|
||||
set(LIBRARY_NAME ${PROJECT_NAME})
|
||||
endif()
|
||||
|
||||
|
||||
#Folder Shortcuts
|
||||
set(TINYOBJLOADEREXAMPLES_DIR ${CMAKE_CURRENT_SOURCE_DIR}/examples)
|
||||
|
||||
set(tinyobjloader-Source
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/tiny_obj_loader.h
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/tiny_obj_loader.cc
|
||||
)
|
||||
|
||||
set(tinyobjloader-Example-Source
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/loader_example.cc
|
||||
)
|
||||
|
||||
set(tinyobjloader-examples-objsticher
|
||||
${TINYOBJLOADEREXAMPLES_DIR}/obj_sticher/obj_writer.h
|
||||
${TINYOBJLOADEREXAMPLES_DIR}/obj_sticher/obj_writer.cc
|
||||
${TINYOBJLOADEREXAMPLES_DIR}/obj_sticher/obj_sticher.cc
|
||||
)
|
||||
|
||||
#Install destinations
|
||||
include(GNUInstallDirs)
|
||||
|
||||
set(TINYOBJLOADER_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}/cmake)
|
||||
set(TINYOBJLOADER_DOC_DIR ${CMAKE_INSTALL_DOCDIR})
|
||||
set(TINYOBJLOADER_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
|
||||
set(TINYOBJLOADER_LIBRARY_DIR ${CMAKE_INSTALL_LIBDIR})
|
||||
set(TINYOBJLOADER_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
||||
set(TINYOBJLOADER_RUNTIME_DIR ${CMAKE_INSTALL_BINDIR})
|
||||
|
||||
option(TINYOBJLOADER_BUILD_TEST_LOADER "Build Example Loader Application" OFF)
|
||||
|
||||
add_library(${LIBRARY_NAME} ${tinyobjloader-Source})
|
||||
|
||||
if(BUILD_SHARED_LIBS)
|
||||
set_target_properties(${LIBRARY_NAME} PROPERTIES
|
||||
SOVERSION ${TINYOBJLOADER_SOVERSION}
|
||||
WINDOWS_EXPORT_ALL_SYMBOLS ON
|
||||
)
|
||||
endif()
|
||||
|
||||
if(TINYOBJLOADER_USE_DOUBLE)
|
||||
target_compile_definitions(${LIBRARY_NAME} PUBLIC TINYOBJLOADER_USE_DOUBLE)
|
||||
endif()
|
||||
|
||||
set_target_properties(${LIBRARY_NAME} PROPERTIES VERSION ${TINYOBJLOADER_VERSION})
|
||||
|
||||
target_include_directories(${LIBRARY_NAME} INTERFACE
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
||||
$<INSTALL_INTERFACE:${TINYOBJLOADER_INCLUDE_DIR}>
|
||||
)
|
||||
|
||||
export(TARGETS ${LIBRARY_NAME} FILE ${PROJECT_NAME}-targets.cmake)
|
||||
|
||||
if(TINYOBJLOADER_BUILD_TEST_LOADER)
|
||||
add_executable(test_loader ${tinyobjloader-Example-Source})
|
||||
target_link_libraries(test_loader ${LIBRARY_NAME})
|
||||
endif()
|
||||
|
||||
option(TINYOBJLOADER_BUILD_OBJ_STICHER "Build OBJ Sticher Application" OFF)
|
||||
if(TINYOBJLOADER_BUILD_OBJ_STICHER)
|
||||
add_executable(obj_sticher ${tinyobjloader-examples-objsticher})
|
||||
target_link_libraries(obj_sticher ${LIBRARY_NAME})
|
||||
|
||||
install(TARGETS
|
||||
obj_sticher
|
||||
DESTINATION
|
||||
${TINYOBJLOADER_RUNTIME_DIR}
|
||||
)
|
||||
endif()
|
||||
|
||||
#Write CMake package config files
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
configure_package_config_file(
|
||||
${PROJECT_NAME}-config.cmake.in
|
||||
${PROJECT_NAME}-config.cmake
|
||||
INSTALL_DESTINATION
|
||||
${TINYOBJLOADER_CMAKE_DIR}
|
||||
PATH_VARS
|
||||
TINYOBJLOADER_INCLUDE_DIR
|
||||
TINYOBJLOADER_LIBRARY_DIR
|
||||
NO_CHECK_REQUIRED_COMPONENTS_MACRO
|
||||
)
|
||||
|
||||
write_basic_package_version_file(${PROJECT_NAME}-config-version.cmake
|
||||
VERSION
|
||||
${TINYOBJLOADER_VERSION}
|
||||
COMPATIBILITY
|
||||
SameMajorVersion
|
||||
)
|
||||
|
||||
#pkg-config file
|
||||
configure_file(${PROJECT_NAME}.pc.in ${LIBRARY_NAME}.pc @ONLY)
|
||||
|
||||
if(DEFINED ENV{LIB_FUZZING_ENGINE})
|
||||
add_executable(fuzz_ParseFromString fuzzer/fuzz_ParseFromString.cc)
|
||||
target_link_libraries(fuzz_ParseFromString ${LIBRARY_NAME} $ENV{LIB_FUZZING_ENGINE})
|
||||
endif()
|
||||
|
||||
#Installation
|
||||
install(TARGETS
|
||||
${LIBRARY_NAME}
|
||||
EXPORT ${PROJECT_NAME}-targets
|
||||
DESTINATION
|
||||
${TINYOBJLOADER_LIBRARY_DIR}
|
||||
PUBLIC_HEADER DESTINATION
|
||||
${TINYOBJLOADER_INCLUDE_DIR}
|
||||
RUNTIME DESTINATION
|
||||
${TINYOBJLOADER_RUNTIME_DIR}
|
||||
)
|
||||
install(EXPORT
|
||||
${PROJECT_NAME}-targets
|
||||
NAMESPACE
|
||||
tinyobjloader::
|
||||
DESTINATION
|
||||
${TINYOBJLOADER_CMAKE_DIR}
|
||||
)
|
||||
install(FILES
|
||||
tiny_obj_loader.h
|
||||
DESTINATION
|
||||
${TINYOBJLOADER_INCLUDE_DIR}
|
||||
)
|
||||
install(FILES
|
||||
LICENSE
|
||||
DESTINATION
|
||||
${TINYOBJLOADER_DOC_DIR}
|
||||
)
|
||||
install(FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake"
|
||||
DESTINATION
|
||||
${TINYOBJLOADER_CMAKE_DIR}
|
||||
)
|
||||
install(FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${LIBRARY_NAME}.pc"
|
||||
DESTINATION
|
||||
${TINYOBJLOADER_PKGCONFIG_DIR}
|
||||
)
|
||||
|
||||
if(NOT TARGET uninstall)
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in
|
||||
${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake IMMEDIATE @ONLY)
|
||||
|
||||
add_custom_target(
|
||||
uninstall COMMAND ${CMAKE_COMMAND} -P
|
||||
${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
|
||||
endif()
|
||||
42
raytracer/nvpro_core/third_party/tinyobjloader/LICENSE
vendored
Normal file
42
raytracer/nvpro_core/third_party/tinyobjloader/LICENSE
vendored
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2012-2019 Syoyo Fujita and many contributors.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
----------------------------------
|
||||
|
||||
mapbox/earcut.hpp
|
||||
|
||||
ISC License
|
||||
|
||||
Copyright (c) 2015, Mapbox
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any purpose
|
||||
with or without fee is hereby granted, provided that the above copyright notice
|
||||
and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||
THIS SOFTWARE.
|
||||
|
||||
435
raytracer/nvpro_core/third_party/tinyobjloader/README.md
vendored
Normal file
435
raytracer/nvpro_core/third_party/tinyobjloader/README.md
vendored
Normal file
|
|
@ -0,0 +1,435 @@
|
|||
# tinyobjloader
|
||||
|
||||
[](https://travis-ci.org/tinyobjloader/tinyobjloader)
|
||||
|
||||
[](https://dev.azure.com/tinyobjloader/tinyobjloader/_build/latest?definitionId=1&branchName=master)
|
||||
|
||||
[](https://ci.appveyor.com/project/syoyo/tinyobjloader-6e4qf/branch/master)
|
||||
|
||||
[](https://coveralls.io/github/syoyo/tinyobjloader?branch=master)
|
||||
|
||||
[](https://aur.archlinux.org/packages/tinyobjloader)
|
||||
|
||||
Tiny but powerful single file wavefront obj loader written in C++03. No dependency except for C++ STL. It can parse over 10M polygons with moderate memory and time.
|
||||
|
||||
`tinyobjloader` is good for embedding .obj loader to your (global illumination) renderer ;-)
|
||||
|
||||
If you are looking for C89 version, please see https://github.com/syoyo/tinyobjloader-c .
|
||||
|
||||
Version notice
|
||||
--------------
|
||||
|
||||
We recommend to use `master`(`main`) branch. Its v2.0 release candidate. Most features are now nearly robust and stable(Remaining task for release v2.0 is polishing C++ and Python API, and fix built-in triangulation code).
|
||||
|
||||
We have released new version v1.0.0 on 20 Aug, 2016.
|
||||
Old version is available as `v0.9.x` branch https://github.com/syoyo/tinyobjloader/tree/v0.9.x
|
||||
|
||||
## What's new
|
||||
|
||||
* 29 Jul, 2021 : Added Mapbox's earcut for robust triangulation. Also fixes triangulation bug(still there is some issue in built-in triangulation algorithm: https://github.com/tinyobjloader/tinyobjloader/issues/319).
|
||||
* 19 Feb, 2020 : The repository has been moved to https://github.com/tinyobjloader/tinyobjloader !
|
||||
* 18 May, 2019 : Python binding!(See `python` folder. Also see https://pypi.org/project/tinyobjloader/)
|
||||
* 14 Apr, 2019 : Bump version v2.0.0 rc0. New C++ API and python bindings!(1.x API still exists for backward compatibility)
|
||||
* 20 Aug, 2016 : Bump version v1.0.0. New data structure and API!
|
||||
|
||||
## Requirements
|
||||
|
||||
* C++03 compiler
|
||||
|
||||
### Old version
|
||||
|
||||
Previous old version is available in `v0.9.x` branch.
|
||||
|
||||
## Example
|
||||
|
||||

|
||||
|
||||
tinyobjloader can successfully load 6M triangles Rungholt scene.
|
||||
http://casual-effects.com/data/index.html
|
||||
|
||||

|
||||
|
||||
* [examples/viewer/](examples/viewer) OpenGL .obj viewer
|
||||
* [examples/callback_api/](examples/callback_api/) Callback API example
|
||||
* [examples/voxelize/](examples/voxelize/) Voxelizer example
|
||||
|
||||
## Use case
|
||||
|
||||
TinyObjLoader is successfully used in ...
|
||||
|
||||
### New version(v1.0.x)
|
||||
|
||||
* Double precision support through `TINYOBJLOADER_USE_DOUBLE` thanks to noma
|
||||
* Loading models in Vulkan Tutorial https://vulkan-tutorial.com/Loading_models
|
||||
* .obj viewer with Metal https://github.com/middlefeng/NuoModelViewer/tree/master
|
||||
* Vulkan Cookbook https://github.com/PacktPublishing/Vulkan-Cookbook
|
||||
* cudabox: CUDA Solid Voxelizer Engine https://github.com/gaspardzoss/cudavox
|
||||
* Drake: A planning, control, and analysis toolbox for nonlinear dynamical systems https://github.com/RobotLocomotion/drake
|
||||
* VFPR - a Vulkan Forward Plus Renderer : https://github.com/WindyDarian/Vulkan-Forward-Plus-Renderer
|
||||
* glslViewer: https://github.com/patriciogonzalezvivo/glslViewer
|
||||
* Lighthouse2: https://github.com/jbikker/lighthouse2
|
||||
* rayrender(an open source R package for raytracing scenes in created in R): https://github.com/tylermorganwall/rayrender
|
||||
* liblava - A modern C++ and easy-to-use framework for the Vulkan API. [MIT]: https://github.com/liblava/liblava
|
||||
* rtxON - Simple Vulkan raytracing tutorials https://github.com/iOrange/rtxON
|
||||
* metal-ray-tracer - Writing ray-tracer using Metal Performance Shaders https://github.com/sergeyreznik/metal-ray-tracer https://sergeyreznik.github.io/metal-ray-tracer/index.html
|
||||
* Supernova Engine - 2D and 3D projects with Lua or C++ in data oriented design: https://github.com/supernovaengine/supernova
|
||||
* AGE (Arc Game Engine) - An open-source engine for building 2D & 3D real-time rendering and interactive contents: https://github.com/MohitSethi99/ArcGameEngine
|
||||
* [Wicked Engine<img src="https://github.com/turanszkij/WickedEngine/blob/master/Content/logo_small.png" width="28px" align="center"/>](https://github.com/turanszkij/WickedEngine) - 3D engine with modern graphics
|
||||
* Your project here! (Letting us know via github issue is welcome!)
|
||||
|
||||
### Old version(v0.9.x)
|
||||
|
||||
* bullet3 https://github.com/erwincoumans/bullet3
|
||||
* pbrt-v2 https://github.com/mmp/pbrt-v2
|
||||
* OpenGL game engine development http://swarminglogic.com/jotting/2013_10_gamedev01
|
||||
* mallie https://lighttransport.github.io/mallie
|
||||
* IBLBaker (Image Based Lighting Baker). http://www.derkreature.com/iblbaker/
|
||||
* Stanford CS148 http://web.stanford.edu/class/cs148/assignments/assignment3.pdf
|
||||
* Awesome Bump http://awesomebump.besaba.com/about/
|
||||
* sdlgl3-wavefront OpenGL .obj viewer https://github.com/chrisliebert/sdlgl3-wavefront
|
||||
* pbrt-v3 https://github.com/mmp/pbrt-v3
|
||||
* cocos2d-x https://github.com/cocos2d/cocos2d-x/
|
||||
* Android Vulkan demo https://github.com/SaschaWillems/Vulkan
|
||||
* voxelizer https://github.com/karimnaaji/voxelizer
|
||||
* Probulator https://github.com/kayru/Probulator
|
||||
* OptiX Prime baking https://github.com/nvpro-samples/optix_prime_baking
|
||||
* FireRays SDK https://github.com/GPUOpen-LibrariesAndSDKs/FireRays_SDK
|
||||
* parg, tiny C library of various graphics utilities and GL demos https://github.com/prideout/parg
|
||||
* Opengl unit of ChronoEngine https://github.com/projectchrono/chrono-opengl
|
||||
* Point Based Global Illumination on modern GPU https://pbgi.wordpress.com/code-source/
|
||||
* Fast OBJ file importing and parsing in CUDA http://researchonline.jcu.edu.au/42515/1/2015.CVM.OBJCUDA.pdf
|
||||
* Sorted Shading for Uni-Directional Pathtracing by Joshua Bainbridge https://nccastaff.bournemouth.ac.uk/jmacey/MastersProjects/MSc15/02Josh/joshua_bainbridge_thesis.pdf
|
||||
* GeeXLab http://www.geeks3d.com/hacklab/20160531/geexlab-0-12-0-0-released-for-windows/
|
||||
|
||||
|
||||
## Features
|
||||
|
||||
* Group(parse multiple group name)
|
||||
* Vertex
|
||||
* Vertex color(as an extension: https://blender.stackexchange.com/questions/31997/how-can-i-get-vertex-painted-obj-files-to-import-into-blender)
|
||||
* Texcoord
|
||||
* Normal
|
||||
* Crease tag('t'). This is OpenSubdiv specific(not in wavefront .obj specification)
|
||||
* Callback API for custom loading.
|
||||
* Double precision support(for HPC application).
|
||||
* Smoothing group
|
||||
* Python binding : See `python` folder.
|
||||
* Precompiled binary(manylinux1-x86_64 only) is hosted at pypi https://pypi.org/project/tinyobjloader/)
|
||||
|
||||
### Primitives
|
||||
|
||||
* [x] face(`f`)
|
||||
* [x] lines(`l`)
|
||||
* [ ] points(`p`)
|
||||
* [ ] curve
|
||||
* [ ] 2D curve
|
||||
* [ ] surface.
|
||||
* [ ] Free form curve/surfaces
|
||||
|
||||
### Material
|
||||
|
||||
* PBR material extension for .MTL. Please see [pbr-mtl.md](pbr-mtl.md) for details.
|
||||
* Texture options
|
||||
* Unknown material attributes are returned as key-value(value is string) map.
|
||||
|
||||
## TODO
|
||||
|
||||
* [ ] Fix obj_sticker example.
|
||||
* [ ] More unit test codes.
|
||||
|
||||
## License
|
||||
|
||||
TinyObjLoader is licensed under MIT license.
|
||||
|
||||
### Third party licenses.
|
||||
|
||||
* pybind11 : BSD-style license.
|
||||
* mapbox earcut.hpp: ISC License.
|
||||
|
||||
## Usage
|
||||
|
||||
### Installation
|
||||
|
||||
One option is to simply copy the header file into your project and to make sure that `TINYOBJLOADER_IMPLEMENTATION` is defined exactly once.
|
||||
|
||||
### Building tinyobjloader - Using vcpkg(not recommended though)
|
||||
|
||||
Although it is not a recommended way, you can download and install tinyobjloader using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:
|
||||
|
||||
git clone https://github.com/Microsoft/vcpkg.git
|
||||
cd vcpkg
|
||||
./bootstrap-vcpkg.sh
|
||||
./vcpkg integrate install
|
||||
./vcpkg install tinyobjloader
|
||||
|
||||
The tinyobjloader port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.
|
||||
|
||||
### Data format
|
||||
|
||||
`attrib_t` contains single and linear array of vertex data(position, normal and texcoord).
|
||||
|
||||
```
|
||||
attrib_t::vertices => 3 floats per vertex
|
||||
|
||||
v[0] v[1] v[2] v[3] v[n-1]
|
||||
+-----------+-----------+-----------+-----------+ +-----------+
|
||||
| x | y | z | x | y | z | x | y | z | x | y | z | .... | x | y | z |
|
||||
+-----------+-----------+-----------+-----------+ +-----------+
|
||||
|
||||
attrib_t::normals => 3 floats per vertex
|
||||
|
||||
n[0] n[1] n[2] n[3] n[n-1]
|
||||
+-----------+-----------+-----------+-----------+ +-----------+
|
||||
| x | y | z | x | y | z | x | y | z | x | y | z | .... | x | y | z |
|
||||
+-----------+-----------+-----------+-----------+ +-----------+
|
||||
|
||||
attrib_t::texcoords => 2 floats per vertex
|
||||
|
||||
t[0] t[1] t[2] t[3] t[n-1]
|
||||
+-----------+-----------+-----------+-----------+ +-----------+
|
||||
| u | v | u | v | u | v | u | v | .... | u | v |
|
||||
+-----------+-----------+-----------+-----------+ +-----------+
|
||||
|
||||
attrib_t::colors => 3 floats per vertex(vertex color. optional)
|
||||
|
||||
c[0] c[1] c[2] c[3] c[n-1]
|
||||
+-----------+-----------+-----------+-----------+ +-----------+
|
||||
| x | y | z | x | y | z | x | y | z | x | y | z | .... | x | y | z |
|
||||
+-----------+-----------+-----------+-----------+ +-----------+
|
||||
|
||||
```
|
||||
|
||||
Each `shape_t::mesh_t` does not contain vertex data but contains array index to `attrib_t`.
|
||||
See `loader_example.cc` for more details.
|
||||
|
||||
|
||||
```
|
||||
|
||||
mesh_t::indices => array of vertex indices.
|
||||
|
||||
+----+----+----+----+----+----+----+----+----+----+ +--------+
|
||||
| i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 | ... | i(n-1) |
|
||||
+----+----+----+----+----+----+----+----+----+----+ +--------+
|
||||
|
||||
Each index has an array index to attrib_t::vertices, attrib_t::normals and attrib_t::texcoords.
|
||||
|
||||
mesh_t::num_face_vertices => array of the number of vertices per face(e.g. 3 = triangle, 4 = quad , 5 or more = N-gons).
|
||||
|
||||
|
||||
+---+---+---+ +---+
|
||||
| 3 | 4 | 3 | ...... | 3 |
|
||||
+---+---+---+ +---+
|
||||
| | | |
|
||||
| | | +-----------------------------------------+
|
||||
| | | |
|
||||
| | +------------------------------+ |
|
||||
| | | |
|
||||
| +------------------+ | |
|
||||
| | | |
|
||||
|/ |/ |/ |/
|
||||
|
||||
mesh_t::indices
|
||||
|
||||
| face[0] | face[1] | face[2] | | face[n-1] |
|
||||
+----+----+----+----+----+----+----+----+----+----+ +--------+--------+--------+
|
||||
| i0 | i1 | i2 | i3 | i4 | i5 | i6 | i7 | i8 | i9 | ... | i(n-3) | i(n-2) | i(n-1) |
|
||||
+----+----+----+----+----+----+----+----+----+----+ +--------+--------+--------+
|
||||
|
||||
```
|
||||
|
||||
Note that when `triangulate` flag is true in `tinyobj::LoadObj()` argument, `num_face_vertices` are all filled with 3(triangle).
|
||||
|
||||
### float data type
|
||||
|
||||
TinyObjLoader now use `real_t` for floating point data type.
|
||||
Default is `float(32bit)`.
|
||||
You can enable `double(64bit)` precision by using `TINYOBJLOADER_USE_DOUBLE` define.
|
||||
|
||||
### Robust triangulation
|
||||
|
||||
When you enable `triangulation`(default is enabled),
|
||||
TinyObjLoader triangulate polygons(faces with 4 or more vertices).
|
||||
|
||||
Built-in trinagulation code may not work well in some polygon shape.
|
||||
|
||||
You can define `TINYOBJLOADER_USE_MAPBOX_EARCUT` for robust triangulation using `mapbox/earcut.hpp`.
|
||||
This requires C++11 compiler though. And you need to copy `mapbox/earcut.hpp` to your project.
|
||||
If you have your own `mapbox/earcut.hpp` file incuded in your project, you can define `TINYOBJLOADER_DONOT_INCLUDE_MAPBOX_EARCUT` so that `mapbox/earcut.hpp` is not included inside of `tiny_obj_loader.h`.
|
||||
|
||||
#### Example code (Deprecated API)
|
||||
|
||||
```c++
|
||||
#define TINYOBJLOADER_IMPLEMENTATION // define this in only *one* .cc
|
||||
// Optional. define TINYOBJLOADER_USE_MAPBOX_EARCUT gives robust trinagulation. Requires C++11
|
||||
//#define TINYOBJLOADER_USE_MAPBOX_EARCUT
|
||||
#include "tiny_obj_loader.h"
|
||||
|
||||
std::string inputfile = "cornell_box.obj";
|
||||
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, inputfile.c_str());
|
||||
|
||||
if (!warn.empty()) {
|
||||
std::cout << warn << std::endl;
|
||||
}
|
||||
|
||||
if (!err.empty()) {
|
||||
std::cerr << err << std::endl;
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// Loop over shapes
|
||||
for (size_t s = 0; s < shapes.size(); s++) {
|
||||
// Loop over faces(polygon)
|
||||
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]);
|
||||
|
||||
// Loop over vertices in the face.
|
||||
for (size_t v = 0; v < fv; v++) {
|
||||
// access to vertex
|
||||
tinyobj::index_t idx = shapes[s].mesh.indices[index_offset + v];
|
||||
|
||||
tinyobj::real_t vx = attrib.vertices[3*size_t(idx.vertex_index)+0];
|
||||
tinyobj::real_t vy = attrib.vertices[3*size_t(idx.vertex_index)+1];
|
||||
tinyobj::real_t vz = attrib.vertices[3*size_t(idx.vertex_index)+2];
|
||||
|
||||
// Check if `normal_index` is zero or positive. negative = no normal data
|
||||
if (idx.normal_index >= 0) {
|
||||
tinyobj::real_t nx = attrib.normals[3*size_t(idx.normal_index)+0];
|
||||
tinyobj::real_t ny = attrib.normals[3*size_t(idx.normal_index)+1];
|
||||
tinyobj::real_t nz = attrib.normals[3*size_t(idx.normal_index)+2];
|
||||
}
|
||||
|
||||
// Check if `texcoord_index` is zero or positive. negative = no texcoord data
|
||||
if (idx.texcoord_index >= 0) {
|
||||
tinyobj::real_t tx = attrib.texcoords[2*size_t(idx.texcoord_index)+0];
|
||||
tinyobj::real_t ty = attrib.texcoords[2*size_t(idx.texcoord_index)+1];
|
||||
}
|
||||
// Optional: vertex colors
|
||||
// tinyobj::real_t red = attrib.colors[3*size_t(idx.vertex_index)+0];
|
||||
// tinyobj::real_t green = attrib.colors[3*size_t(idx.vertex_index)+1];
|
||||
// tinyobj::real_t blue = attrib.colors[3*size_t(idx.vertex_index)+2];
|
||||
}
|
||||
index_offset += fv;
|
||||
|
||||
// per-face material
|
||||
shapes[s].mesh.material_ids[f];
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
#### Example code (New Object Oriented API)
|
||||
|
||||
```c++
|
||||
#define TINYOBJLOADER_IMPLEMENTATION // define this in only *one* .cc
|
||||
// Optional. define TINYOBJLOADER_USE_MAPBOX_EARCUT gives robust trinagulation. Requires C++11
|
||||
//#define TINYOBJLOADER_USE_MAPBOX_EARCUT
|
||||
#include "tiny_obj_loader.h"
|
||||
|
||||
|
||||
std::string inputfile = "cornell_box.obj";
|
||||
tinyobj::ObjReaderConfig reader_config;
|
||||
reader_config.mtl_search_path = "./"; // Path to material files
|
||||
|
||||
tinyobj::ObjReader reader;
|
||||
|
||||
if (!reader.ParseFromFile(inputfile, reader_config)) {
|
||||
if (!reader.Error().empty()) {
|
||||
std::cerr << "TinyObjReader: " << reader.Error();
|
||||
}
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!reader.Warning().empty()) {
|
||||
std::cout << "TinyObjReader: " << reader.Warning();
|
||||
}
|
||||
|
||||
auto& attrib = reader.GetAttrib();
|
||||
auto& shapes = reader.GetShapes();
|
||||
auto& materials = reader.GetMaterials();
|
||||
|
||||
// Loop over shapes
|
||||
for (size_t s = 0; s < shapes.size(); s++) {
|
||||
// Loop over faces(polygon)
|
||||
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]);
|
||||
|
||||
// Loop over vertices in the face.
|
||||
for (size_t v = 0; v < fv; v++) {
|
||||
// access to vertex
|
||||
tinyobj::index_t idx = shapes[s].mesh.indices[index_offset + v];
|
||||
tinyobj::real_t vx = attrib.vertices[3*size_t(idx.vertex_index)+0];
|
||||
tinyobj::real_t vy = attrib.vertices[3*size_t(idx.vertex_index)+1];
|
||||
tinyobj::real_t vz = attrib.vertices[3*size_t(idx.vertex_index)+2];
|
||||
|
||||
// Check if `normal_index` is zero or positive. negative = no normal data
|
||||
if (idx.normal_index >= 0) {
|
||||
tinyobj::real_t nx = attrib.normals[3*size_t(idx.normal_index)+0];
|
||||
tinyobj::real_t ny = attrib.normals[3*size_t(idx.normal_index)+1];
|
||||
tinyobj::real_t nz = attrib.normals[3*size_t(idx.normal_index)+2];
|
||||
}
|
||||
|
||||
// Check if `texcoord_index` is zero or positive. negative = no texcoord data
|
||||
if (idx.texcoord_index >= 0) {
|
||||
tinyobj::real_t tx = attrib.texcoords[2*size_t(idx.texcoord_index)+0];
|
||||
tinyobj::real_t ty = attrib.texcoords[2*size_t(idx.texcoord_index)+1];
|
||||
}
|
||||
|
||||
// Optional: vertex colors
|
||||
// tinyobj::real_t red = attrib.colors[3*size_t(idx.vertex_index)+0];
|
||||
// tinyobj::real_t green = attrib.colors[3*size_t(idx.vertex_index)+1];
|
||||
// tinyobj::real_t blue = attrib.colors[3*size_t(idx.vertex_index)+2];
|
||||
}
|
||||
index_offset += fv;
|
||||
|
||||
// per-face material
|
||||
shapes[s].mesh.material_ids[f];
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Optimized loader
|
||||
|
||||
Optimized multi-threaded .obj loader is available at `experimental/` directory.
|
||||
If you want absolute performance to load .obj data, this optimized loader will fit your purpose.
|
||||
Note that the optimized loader uses C++11 thread and it does less error checks but may work most .obj data.
|
||||
|
||||
Here is some benchmark result. Time are measured on MacBook 12(Early 2016, Core m5 1.2GHz).
|
||||
|
||||
* Rungholt scene(6M triangles)
|
||||
* old version(v0.9.x): 15500 msecs.
|
||||
* baseline(v1.0.x): 6800 msecs(2.3x faster than old version)
|
||||
* optimised: 1500 msecs(10x faster than old version, 4.5x faster than baseline)
|
||||
|
||||
## Python binding
|
||||
|
||||
### CI + PyPI upload
|
||||
|
||||
cibuildwheels + twine upload for each git tagging event is handled in Azure Pipeline.
|
||||
|
||||
#### How to bump version(For developer)
|
||||
|
||||
* Bump version in CMakeLists.txt
|
||||
* Update version in `setup.py`
|
||||
* Commit and push `master`. Confirm C.I. build is OK.
|
||||
* Create tag starting with `v`(e.g. `v2.1.0`)
|
||||
* `git push --tags`
|
||||
* cibuildwheels + pypi upload(through twine) will be automatically triggered in Azure Pipeline.
|
||||
|
||||
## Tests
|
||||
|
||||
Unit tests are provided in `tests` directory. See `tests/README.md` for details.
|
||||
21
raytracer/nvpro_core/third_party/tinyobjloader/cmake_uninstall.cmake.in
vendored
Normal file
21
raytracer/nvpro_core/third_party/tinyobjloader/cmake_uninstall.cmake.in
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||
message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||
endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
|
||||
|
||||
file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
|
||||
string(REGEX REPLACE "\n" ";" files "${files}")
|
||||
foreach(file ${files})
|
||||
message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
|
||||
if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
||||
exec_program(
|
||||
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
||||
OUTPUT_VARIABLE rm_out
|
||||
RETURN_VALUE rm_retval
|
||||
)
|
||||
if(NOT "${rm_retval}" STREQUAL 0)
|
||||
message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
|
||||
endif(NOT "${rm_retval}" STREQUAL 0)
|
||||
else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
||||
message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
|
||||
endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
||||
endforeach(file)
|
||||
29
raytracer/nvpro_core/third_party/tinyobjloader/pbr-mtl.md
vendored
Normal file
29
raytracer/nvpro_core/third_party/tinyobjloader/pbr-mtl.md
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
## PBR material extension.
|
||||
|
||||
The spec can be found in either
|
||||
|
||||
https://benhouston3d.com/blog/extended-wavefront-obj-mtl-for-pbr/
|
||||
|
||||
or Internet Archive: https://web.archive.org/web/20230210121526/http://exocortex.com/blog/extending_wavefront_mtl_to_support_pbr
|
||||
|
||||
* Kd/map_Kd (base/diffuse) // reuse
|
||||
* Ks/map_Ks (specular) // reuse
|
||||
* d or Tr (opacity) // reuse
|
||||
* map_d/map_Tr (opacitymap) // reuse
|
||||
* Tf (translucency) // reuse
|
||||
* bump/-bm (bump map) // reuse
|
||||
* disp (displacement map) // reuse
|
||||
|
||||
PBR material parameters as defined by the Disney PBR.
|
||||
|
||||
* Pr/map_Pr (roughness) // new
|
||||
* Pm/map_Pm (metallic) // new
|
||||
* Ps/map_Ps (sheen) // new
|
||||
* Pc (clearcoat thickness) // new
|
||||
* Pcr (clearcoat roughness) // new
|
||||
* Ke/map_Ke (emissive) // new
|
||||
* aniso (anisotropy) // new
|
||||
* anisor (anisotropy rotation) // new
|
||||
* norm (normal map) // new
|
||||
|
||||
EoL.
|
||||
2
raytracer/nvpro_core/third_party/tinyobjloader/tiny_obj_loader.cc
vendored
Normal file
2
raytracer/nvpro_core/third_party/tinyobjloader/tiny_obj_loader.cc
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
#define TINYOBJLOADER_IMPLEMENTATION
|
||||
#include "tiny_obj_loader.h"
|
||||
3459
raytracer/nvpro_core/third_party/tinyobjloader/tiny_obj_loader.h
vendored
Normal file
3459
raytracer/nvpro_core/third_party/tinyobjloader/tiny_obj_loader.h
vendored
Normal file
File diff suppressed because it is too large
Load diff
9
raytracer/nvpro_core/third_party/tinyobjloader/tinyobjloader-config.cmake.in
vendored
Normal file
9
raytracer/nvpro_core/third_party/tinyobjloader/tinyobjloader-config.cmake.in
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
@PACKAGE_INIT@
|
||||
|
||||
set(TINYOBJLOADER_VERSION "@TINYOBJLOADER_VERSION@")
|
||||
|
||||
set_and_check(TINYOBJLOADER_INCLUDE_DIRS "@PACKAGE_TINYOBJLOADER_INCLUDE_DIR@")
|
||||
set_and_check(TINYOBJLOADER_LIBRARY_DIRS "@PACKAGE_TINYOBJLOADER_LIBRARY_DIR@")
|
||||
set(TINYOBJLOADER_LIBRARIES @LIBRARY_NAME@)
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake")
|
||||
15
raytracer/nvpro_core/third_party/tinyobjloader/tinyobjloader.pc.in
vendored
Normal file
15
raytracer/nvpro_core/third_party/tinyobjloader/tinyobjloader.pc.in
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
# Generated by CMake @CMAKE_VERSION@ for @PROJECT_NAME@. Any changes to this
|
||||
# file will be overwritten by the next CMake run. The input file was
|
||||
# tinyobjloader.pc.in.
|
||||
|
||||
prefix=@CMAKE_INSTALL_PREFIX@
|
||||
exec_prefix=${prefix}
|
||||
libdir=${prefix}/@TINYOBJLOADER_LIBRARY_DIR@
|
||||
includedir=${prefix}/@TINYOBJLOADER_INCLUDE_DIR@
|
||||
|
||||
Name: @PROJECT_NAME@
|
||||
Description: Tiny but powerful single file wavefront obj loader
|
||||
URL: https://syoyo.github.io/tinyobjloader/
|
||||
Version: @TINYOBJLOADER_VERSION@
|
||||
Libs: -L${libdir} -l@LIBRARY_NAME@
|
||||
Cflags: -I${includedir}
|
||||
Loading…
Add table
Add a link
Reference in a new issue