An application usually needs just one 3D vision product to be generated by OpenNI (human pose, gestures recognition, etc.). However this generated product is usually produced using a production chain. This means the vision product can be generated in a number of ways - either by different algorithms or the same algorithm using different raw data for processing.
When an application asks OpenNI for a specific generated product, OpenNI returns a list of all currently possible ways of producing it. This depends on installed modules, currently attached devices, and available licenses.
A production chain is represented using an object called Node Info (see Production Node Info for C, or xn::NodeInfo for C++). This object contains information about the current node, such as its vendor, name, version, and most importantly, its type. The node info object can represent either an existing node that was already created, or an option for creating a node. For example, if an application enumerates for a node in the first time with xnEnumerateProductionTrees, it will probably get a node info object which is not connected to an existing node. Once the application chooses to create this node with xnCreateProductionTree, a node will be created, and the node info object will also hold the node handle.
The application can choose a production chain according to some or all nodes in the chain. For example, suppose an application asks for a User Generator. A User Generator requires a Depth Generator to operate, and suppose there are two types of Depth Generators installed on the machine. In this case the application would get two production chains for the User Generator: One for each option of the underlying Depth Generator. The application can then choose the preferred production chain according to its considerations, e.g. choosing a specific vendor, or choosing a depth node that provides certain capabilities.
Each Node Info object holds a list of needed nodes, thus creating a nodes graph. The list of needed nodes is accessed using an object called Node Info List (see Production Node Info List for C, or xn::NodeInfoList for C++).