summaryrefslogtreecommitdiff
path: root/gfx/include/gfx/scene/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/include/gfx/scene/README.md')
-rw-r--r--gfx/include/gfx/scene/README.md75
1 files changed, 0 insertions, 75 deletions
diff --git a/gfx/include/gfx/scene/README.md b/gfx/include/gfx/scene/README.md
deleted file mode 100644
index c8cdadb..0000000
--- a/gfx/include/gfx/scene/README.md
+++ /dev/null
@@ -1,75 +0,0 @@
1# Scene Graph
2
3A scene graph implementation that includes:
4
5- Camera
6- Light
7- Material
8- Mesh
9- Node
10- Object
11- Scene
12
13## Hierarchy and Parenting
14
15Scene graphs typically expose functions on nodes to add/remove objects, cameras,
16lights, etc. This implementation forces the hierarchy to be a strict tree and
17not a more general DAG. Given this, and to avoid confusion, we instead expose
18functions to set the parent node of an object/camera/light. If we exposed the
19former, the API could create the illusion that the hierarchy can be a DAG.
20
21The strict tree hierarchy should not be that restrictive in practice. Even the
22glTF 2.0 spec [enforces this](https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#nodes-and-hierarchy):
23
24> *For Version 2.0 conformance, the glTF node hierarchy is not a directed
25> acyclic graph (DAG) or scene graph, but a disjoint union of strict trees. That
26> is, no node may be a direct descendant of more than one node. This restriction
27> is meant to simplify implementation and facilitate conformance.*
28
29## Instancing
30
31Two use cases for instancing seem to be:
32
331. Creating N identical clones, but each with a unique transform. (Ex: N
34animated characters animated in unison but located in different locations.)
352. Creating N copies of a sub-tree, each now being their own unique tree. (Ex:
36The same N animated characters, but each of them now being animated separately.)
37
38Some scene graphs
39([Panda3D](https://docs.panda3d.org/1.10/python/programming/scene-graph/instancing))
40allow two or more nodes to point to the same child, or, in other words, a node
41to have multiple parents. This turns the scene graph into a DAG and adds a
42number of complications for us:
43
441. Shared ownership of children. We would now need some sort of ref counting or
45deferred GC to delete nodes and their subtrees.
462. Nodes no longer have a unique parent.
473. Given a node, we can no longer determine its location (which parent link do
48you follow?), or any attribute that is derived from its parent(s).
49
50In our case, we stick to strict tree hierarchies.
51
52Use case (1), N identical clones with unique transforms, is not a problem for
53us. This is because the bulk of the data -- geometry buffers, etc. -- is stored
54in the render backend anyway. So creating a full copy of the node does not
55present a significant overhead since we need a unique transform for each of the
56clones anyway.
57
58Use case (2) does present a bit more overhead and we currently do not handle it.
59This could be handled in the future by special-casing a node such as
60`InstanceNode` that has one child subtree and N transforms (or other
61attributes), one for each unique instance of that child subtree.
62
63Therefore, to visit the use cases again:
64
651. N character clones animated in unison in different locations -> future
66 `InstanceNode`.
672. N unique character copies animated on their own -> copy the character subtree
68 (N unique skeletons; shared mesh data and textures stored in the render
69 backend.)
70
71## Reading
72
73[Panda3D Scene Graph](https://docs.panda3d.org/1.10/python/programming/scene-graph/index)
74
75[Pixar's USD](https://graphics.pixar.com/usd/release/intro.html)