Provided by: inventor-doc_2.1.5-10+dfsg-2.1build2_all 

NAME
SoDB — scene graph database class
INHERITS FROM
SoDB
SYNOPSIS
#include <Inventor/SoDB.h>
typedef void SoDBHeaderCB(void *userData, SoInput *in)
Methods from class SoDB:
static void init()
static const char * getVersion()
static SbBool read(SoInput *in, SoNode *&rootNode)
static SbBool read(SoInput *in, SoPath *&path)
static SoSeparator * readAll(SoInput *in)
static SbBool isValidHeader(const char *testString)
static SbBool registerHeader(const SbString &headerString, SbBool isBinary, float ivVersion,
SoDBHeaderCB *preCB, SoDBHeaderCB *postCB, void *userData)
static SbBool getHeaderData(const SbString &headerString, SbBool &isBinary, float &ivVersion,
SoDBHeaderCB *&preCB, SoDBHeaderCB *&postCB, void *&userData, SbBool
substringOK = FALSE)
static int getNumHeaders()
static SbString getHeaderString(int i)
static SoField * createGlobalField(const SbName &name, SoType type)
static SoField * getGlobalField(const SbName &name)
static void renameGlobalField(const SbName &oldName, const SbName &newName)
static void setRealTimeInterval(const SbTime &deltaT)
static const SbTime & getRealTimeInterval()
static void setDelaySensorTimeout(const SbTime &t)
static const SbTime & getDelaySensorTimeout()
static int doSelect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct
timeval *userTimeOut)
DESCRIPTION
The SoDB class holds all scene graphs, each representing a 3D scene used by an application. A scene graph
is a collection of SoNode objects which come in several varieties (see SoNode). Application programs must
initialize the database by calling SoDB::init() before calling any other database routines and before
constructing any nodes, paths, functions, or actions. Note that SoDB::init() is called by
SoInteraction::init(), SoNodeKit::init(), and SoXt::init(), so if you are calling any of these methods,
you do not need to call SoDB::init() directly. All methods on this class are static.
Typical program database initialization and scene reading is as follows:
#include <Inventor/SoDB.h>
#include <Inventor/SoInput.h>
#include <Inventor/nodes/SoSeparator.h>
SoSeparator *rootSep;
SoInput in;
SoDB::init();
rootSep = SoDB::readAll(&in);
if (rootSep == NULL)
printf("Error on read...\n");
...
METHODS
static void init()
Initializes the database. This must be called before calling any other database routines, including
the construction of any nodes, paths, engines, or actions.
static const char * getVersion()
Returns a character string identifying the version of the Inventor library in use.
static SbBool read(SoInput *in, SoNode *&rootNode)
static SbBool read(SoInput *in, SoPath *&path)
Reads a graph from the file specified by the given SoInput, returning a pointer to the resulting root
node in rootNode, or a pointer to the resulting path in path. The programmer is responsible for
determining which routine to use, based on the contents of the input. These routines return FALSE if
any error occurred during reading.
If the passed SoInput was used to open a file and the name of the file contains a directory, SoDB
automatically adds the directory to the end of the current directory search path in the SoInput. This
means that nested files named in SoFile nodes may be found relative to that directory. The directory
is removed from the search path when reading is complete.
static SoSeparator * readAll(SoInput *in)
Reads all graphs and paths from the file specified by the given SoInput. If there is only one graph in
the file and its root is an SoSeparator, a pointer to the root is returned. In all other cases, this
creates an SoSeparator, adds the root nodes of all graphs read as children of it, and returns a
pointer to it. This returns NULL on error. This processes directory paths in the same way as the other
reading routines.
static SbBool isValidHeader(const char *testString)
This returns TRUE if the given character string is one of the valid Inventor file headers, (e.g.
"#Inventor V2.0 binary"), or if the string has been registered as a valid header through the
registerHeader method.
static SbBool registerHeader(const SbString &headerString, SbBool isBinary, float ivVersion,
SoDBHeaderCB *preCB, SoDBHeaderCB *postCB, void *userData)
Registers the given string as a valid header for input files. The string must be 80 characters or
less, and start with the comment character '#'. If the passed isBinary flag is true, any file with
this header will be read as a binary file. Usually, a user-defined header represents a file format
that is a superset of the Inventor file format. The ivVersion number indicates which Inventor file
version this header corresponds to. The user-defined callback functions preCB and postCB are called
before and after a file with this header is read. The userData is passed to both callback functions.
The method returns TRUE if the header is successfully registered. Note, nothing prevents you from
registering the same string multiple times.
static SbBool getHeaderData(const SbString &headerString, SbBool &isBinary, float &ivVersion,
SoDBHeaderCB *&preCB, SoDBHeaderCB *&postCB, void *&userData, SbBool
substringOK = FALSE)
Passes back the data registered with the given header string, including the flag specifying whether
the string is for a binary file, pointers to the callback functions invoked before and after reading
the file, and a pointer to the user data passed to the callback functions. If the given header string
does not match any of the registered headers, and the substringOK flag is TRUE, then the method will
search for a registered header that is a substring of the given string. The method returns TRUE if a
matching registered header, or subheader, was found.
static int getNumHeaders()
Returns the number of valid headers, including standard Inventor headers, and user-registered headers.
static SbString getHeaderString(int i)
Returns the i'th header.
static SoField * createGlobalField(const SbName &name, SoType type)
The database maintains a namespace for global fields, making sure that there is at most one instance
of a global field with any given name in the database. This routine is used to create new global
fields. If there is no global field with the given name, it will create a new global field with the
given name and type. If there is already a global field with the given name and type, it will return
it. If there is already a global field with the given name but a different type, this returns NULL.
All global fields must be derived from SoField; typically the result of this routine is cast into the
appropriate type; for example:
SoSFInt32 *longField =
(SoSFInt32 *) SoDB::createGlobalField("Frame",
SoSFInt32::getClassTypeId());
static SoField * getGlobalField(const SbName &name)
Returns the global field with the given name, or NULL if there is none. The type of the field may be
checked using the SoField::isOfType(), SoField::getClassTypeId(), and SoField::getTypeId() methods.
static void renameGlobalField(const SbName &oldName, const SbName &newName)
Renames the global field named oldName. Renaming a global field to an empty name ("") deletes it. If
there is already a global field with the new name, that field will be deleted (the getGlobalField
method can be used to guard against this).
static void setRealTimeInterval(const SbTime &deltaT)
The database automatically creates one global field when SoDB::init() is called. The realTime global
field, which is of type SoSFTime, can be connected to engines and nodes for real-time animation. The
database will automatically update the realTime global field 12 times per second, using a timer
sensor. Typically, there will be a node sensor on the root of the scene graph which schedules a redraw
whenever the scene graph changes; by updating the realTime global field periodically, scene graphs
that are connected to realTime (and are therefore animating) will be redrawn. The rate at which the
database updates realTime can be controlled with this routine. Passing in a zero time will disable
automatic update of realTime. If there are no enabled connections from the realTime field to any other
field, the sensor is automatically disabled. .p Note that the SoSceneManager class automatically
updates realTime immediately after redrawing, which will result in as high a frame rate as possible if
the scene is continuously animating. The SoDB::setRealTimeInterval method ensures that engines that do
not continuously animate (such as SoTimeCounter) will eventually be scheduled.
static const SbTime & getRealTimeInterval()
Returns how often the database is updating realTime.
static void setDelaySensorTimeout(const SbTime &t)
This sets the timeout value for sensors that are delay queue sensors (one-shot sensors, data sensors).
Delay queue sensors are triggered whenever there is idle time. If a long period of time elapses
without any idle time (as when there are continuous events to process), these sensors may not be
triggered. Setting this timeout value ensures that if the specified length of time elapses without any
idle time, the delay queue sensors will be processed anyway.
static const SbTime & getDelaySensorTimeout()
Returns the current delay queue timeout value.
static int doSelect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct
timeval *userTimeOut)
In order to keep timer and idle sensors running as expected, it is necessary that an Inventor
application not block waiting for input. If the Inventor application uses the Xt utility library, this
can be handled automatically. However, if the application is using its own event loop, this function
is provided as a wrapper around select(2) that will handle Inventor tasks if necessary instead of
blocking.
SEE ALSO
SoBase, SoNode, SoEngine, SoField, SoInput, SoFile, SoPath, SoOneShotSensor, SoDataSensor, SoXt
SoDB(3IV)()