#include <Inventor/SoType.h>
Public Types | |
typedef void *(* | instantiationMethod )(void) |
Public Member Functions | |
SbName | getName (void) const |
const SoType | getParent (void) const |
SbBool | isDerivedFrom (const SoType type) const |
SbBool | canCreateInstance (void) const |
void * | createInstance (void) const |
uint16_t | getData (void) const |
int16_t | getKey (void) const |
SbBool | operator== (const SoType type) const |
SbBool | operator!= (const SoType type) const |
SbBool | operator< (const SoType type) const |
SbBool | operator<= (const SoType type) const |
SbBool | operator>= (const SoType type) const |
SbBool | operator> (const SoType type) const |
SbBool | isBad (void) const |
void | makeInternal (void) |
SbBool | isInternal (void) const |
Static Public Member Functions | |
SoType | fromName (const SbName name) |
int | getAllDerivedFrom (const SoType type, SoTypeList &list) |
const SoType | createType (const SoType parent, const SbName name, const instantiationMethod method=(instantiationMethod) NULL, const uint16_t data=0) |
const SoType | overrideType (const SoType originalType, const instantiationMethod method=(instantiationMethod) NULL) |
void | init (void) |
SoType | fromKey (uint16_t key) |
SoType | badType (void) |
int | getNumTypes (void) |
Many of the classes in the Coin library must have their type information registered before any instances are created (including, but not limited to: engines, nodes, fields, actions, nodekits and manipulators). The use of SoType to store this information provides lots of various functionality for working with class hierarchies, comparing class types, instantiating objects from classnames, etc etc.
It is for instance possible to do things like this:
void cleanLens(SoNode * anode) { assert(anode->getTypeId().isDerivedFrom(SoCamera::getClassTypeId())); if (anode->getTypeId() == SoPerspectiveCamera::getClassTypeId()) { // do something.. } else if (anode->getTypeId() == SoOrthographicCamera::getClassTypeId()) { // do something.. } else { SoDebugError::postWarning("cleanLens", "Unknown camera type %s!\n", anode->getTypeId().getName()); } }
A notable feature of the SoType class is that it is only 16 bits long and therefore should be passed around by value for efficiency reasons.
One important note about the use of SoType to register class information: super classes must be registered before any of their derived classes are.
|
This is a convenience typedef for the function signature of a typed class' instantiation method. It is an extension on the original Inventor API. Mostly only useful for internal purposes. An instantation method will take no arguments and returns a void-pointer to a newly allocated and initialized object of the class type. |
|
This static method returns the SoType object associated with name name. If no known type matches the given name, SoType::badType() is returned. |
|
This method returns the name of the SoBase-derived class type the SoType object is configured for. |
|
This method returns the SoType type for the parent class of the SoBase-derived class the SoType object is configured for. |
|
This method returns |
|
This method appends all the class types derived from type to list, and returns the number of types added to the list. Internal types are not included in the list, nor are they counted. type itself is also added to the list, as a type is seen as a derivation of its own type. NB: do not write code which depends in any way on the order of the elements returned in list. |
|
This method returns |
|
This method instantiates an object of the current type.
For types that can not be instantiated, Note that if the Coin library has been built as a DLL under Microsoft Windows and you use this method from application code, you must make sure that both the Coin DLL and the application executable is using the same instance of a C Run-Time (CRT) library. Otherwise, you will get memory heap corruption upon deallocating the returned instances, eventually leading to mysterious crashes. This is not harmful if you only call SoType::createInstance() on types for reference counted class-types, though. These include all nodes, engines, paths, nodekits, draggers and manipulators. |
|
This method returns a type specific data variable. |
|
This method returns the type's index in the internal typelist. |
|
Check type equality. |
|
Check type inequality. |
|
Comparison operator for sorting type data according to some internal criterion. |
|
Comparison operator for sorting type data according to some internal criterion. |
|
Comparison operator for sorting type data according to some internal criterion. |
|
Comparison operator for sorting type data according to some internal criterion. |
|
This method creates and registers a new class type.
Classes that do not inherit any other class should use SoType::badType() for the first argument. Abstract classes should use The value passed in for the data parameter can be retrieved with SoType::getData(). |
|
This method makes a new class's instantiation method override the instantiation method of an existing class. The new type should be a C++ subclass of the original class type, but this won't be checked though.
If Here's a complete code examples which shows how to fully override a built-in Coin node class, so that a) your application-specific extension class gets instantiated instead of the built-in class upon scenegraph import, and b) it gets written out properly upon export:
|
|
This static method initializes the type system. |
|
Find and return a type from the given key ID. |
|
This method returns an illegal type, useful for returning errors.
|
|
This method returns TRUE if the SoType object represents an illegal class type. |
|
This method turns the specific type into an internal type. |
|
This function returns TRUE if the type is an internal type. |
|
This function returns the number of types registered in the run-time type system. |