table of contents
| SoDB(3IV)() | SoDB(3IV)() | 
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