blob: a35eee611917ee202b146e84bb95c75c34f91410 [file] [log] [blame]
/*! \page node_ownership Memory Handling and Ownership of Scene Graph Nodes
@ingroup api_notes
To avoid as many issues with memory allocatoin/deallocation as
possible, I propose to use -- at least for the scene graph -- some
pretty basic but automatic memory deallocation that automatically
deallocates everything that's no longer used. As a scene graph does
not allow cyclic references, anyway (you're f***ed if you have them,
anyway...), this should be pretty straightforward.
To make that happen, I will follow the following rules
<ul>
<li> every "node" in the scene graph track its list of "parents"
(yes, you can have an unlimited number of parents, this is a liberal
society ....)
<li> as soon as a node is destroyed, it tells so to all its
dependents, and (recursively) kills all dependents who have no
parents left (not too liberal: kids without parents starve
immediately). In other words, every node must have at least one
parent. \n
To facilitate that "every node needs an owner", I will force the
app to pass a "parent" for every call that creates a new node. In
some cases (like rtNewDataArray) this has to be done explicitly,
in many calls, though, it is implicit and not visible (i.e.,
rtVertexArray3f() needs to get a reference to a mesh, anyway,
which is automatically the parent).
<li> the only exception to above rule of having at least one parent
are "root" nodes (rtNewRoot), which are somewhat similar to openrt's
"objects", in that they contain an entire object with an entire
scene graph. Note, however, that it is _still_ possible (note: this
may be subject to discussion) to cross-reference from one such
"object" to another, and to also directly reference some node(s)
somewhere deep within another root node's subtree.
<li>as a consequence of above, rtDestroy makes most sense for root
nodes, though I will currently allow it for internal nodes, too, but
this is subject to discussion/change (e.g.,: what actually happens
when deleting a vertex array node that is still referenced by a mesh
!?)
</ul>
note: having parent links in all nodes facilitates some lazy
bottom-to-top notifications (for lazy update/rebuild schemes), too.
*/