8b2dc08ec3 | ||
---|---|---|
.. | ||
images | ||
README.md | ||
config.json | ||
gltf-loader.cc | ||
gltf-loader.h | ||
main.cc | ||
material.h | ||
matrix.cc | ||
mesh.h | ||
nanort.cc | ||
nanort.h | ||
nanosg.h | ||
obj-loader.cc | ||
obj-loader.h | ||
premake5.lua | ||
render-config.cc | ||
render-config.h | ||
render.cc | ||
render.h | ||
stbi-impl.cc | ||
viwewer.make |
README.md
NanoSG
Simple, minimal and header-only scene graph library for NanoRT.
NanoSG itself shoud be compiled with C++-03 compiler, but demo code uses C++11 features.
Build
Linux or macOS
premake5 gmake
make
Windows
premake5 vs2015
Data structure
Node
Node represents scene graph node. Tansformation node or Mesh(shape) node.
Node is interpreted as transformation node when passing nullptr
to Node class constructure.
Node can contain multiple children.
Scene
Scene contains root nodes and provides the method to find an intersection of nodes.
User defined data structure
Following are required in user application.
Mesh class
Current example code assumes mesh is all composed of triangle meshes.
Following method must be implemented for Scene::Traversal
.
///
/// Get the geometric normal and the shading normal at `face_idx' th face.
///
template<typename T>
void GetNormal(T Ng[3], T Ns[3], const unsigned int face_idx, const T u, const T v) const;
Intersection class
Represents intersection(hit) information.
Transform
Transformation is done in the following procedure.
M' = parent_xform x local_xform x local_pivot
Memory management
Scene
and Node
does not create a copy of asset data(e.g. vertices, indices). Thus user must care about memory management of scene assets in user side.
API
API is still subject to change.
Node
void Node::SetName(const std::string &name);
Set (unique) name for the node.
void Node::AddChild(const type &child);
Add node as child node.
void Node::SetLocalXform(const T xform[4][4]) {
Set local transformation matrix. Default is identity matrix.
Scene
bool Scene::AddNode(const Node<T, M> &node);
Add a node to the scene.
bool Scene::Commit() {
Commit the scene. After adding nodes to the scene or changed transformation matrix, call this Commit
before tracing rays.
Commit
triggers BVH build in each nodes and updates node's transformation matrix.
template<class H>
bool Scene::Traverse(nanort::Ray<T> &ray, H *isect, const bool cull_back_face = false) const;
Trace ray into the scene and find an intersection.
Returns true
when there is an intersection and hit information is stored in isect
.
TODO
- Compute pivot point of each node(mesh).
Third party libraries and its icenses
- picojson : BSD license.
- bt3gui : zlib license.
- glew : BSD/MIT license.
- tinyobjloader : MIT license.
- glm : The Happy Bunny License (Modified MIT License). Copyright (c) 2005 - 2017 G-Truc Creation
- ImGui : The MIT License (MIT). Copyright (c) 2014-2015 Omar Cornut and ImGui contributors
- ImGuizmo : The MIT License (MIT). Copyright (c) 2016 Cedric Guillemet