/**************************************************************************\
 *
 *  This file is part of the Coin 3D visualization library.
 *  Copyright (C) by Kongsberg Oil & Gas Technologies.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  ("GPL") version 2 as published by the Free Software Foundation.
 *  See the file LICENSE.GPL at the root directory of this source
 *  distribution for additional information about the GNU GPL.
 *
 *  For using Coin with software that can not be combined with the GNU
 *  GPL, and for taking advantage of the additional benefits of our
 *  support services, please contact Kongsberg Oil & Gas Technologies
 *  about acquiring a Coin Professional Edition License.
 *
 *  See http://www.coin3d.org/ for more information.
 *
 *  Kongsberg Oil & Gas Technologies, Bygdoy Alle 5, 0257 Oslo, NORWAY.
 *  http://www.sim.no/  sales@sim.no  coin-support@coin3d.org
 *
\**************************************************************************/

/*!
  \page macros_nodes

  <h2>Node Macros</h2>

  - \ref SO_NODE_HEADER
  - \ref SO_NODE_ABSTRACT_HEADER
  - \ref SO_NODE_SOURCE
  - \ref SO_NODE_ABSTRACT_SOURCE
  - \ref SO_NODE_INIT_CLASS
  - \ref SO_NODE_INIT_ABSTRACT_CLASS
  - \ref SO_NODE_IS_FIRST_INSTANCE
  - \ref SO_NODE_CONSTRUCTOR
  - \ref SO_NODE_ADD_FIELD
  - \ref SO_NODE_DEFINE_ENUM_VALUE

  \ingroup macros
*/

#define SO_NODE_HEADER(classname)
/*!
  \def SO_NODE_HEADER(classname)

  This macro adds standard declarations needed in Coin nodes for
  object creation and type identification.

  \sa SO_NODE_SOURCE
  \ingroup nodes
*/

#define SO_NODE_ABSTRACT_HEADER(classname)
/*!
  \def SO_NODE_ABSTRACT_HEADER(classname)

  This macro adds standard declarations needed in Coin nodes for
  type identification.  It differs from \ref SO_NODE_HEADER in that
  the object creation part is omitted.

  \sa SO_NODE_ABSTRACT_SOURCE
  \ingroup nodes
*/

#define SO_NODE_INIT_CLASS(classname, parentclass, parentname)
/*!
  \def SO_NODE_INIT_CLASS(classname, parentclass, parentname)

  This macro is used in the initClass-function in a node class. It
  registers the class by name (by creating a new SoType for the
  class), so file reading will be able to create a node of this type
  and fill it with its field values.

  \sa SO_NODE_INIT_ABSTRACT_CLASS
  \ingroup nodes
*/

#define SO_NODE_INIT_ABSTRACT_CLASS(classname, parentclass, parentname)
/*!
  \def SO_NODE_INIT_ABSTRACT_CLASS(classname, parentclass, parentname)

  This macro is used in the initClass-function in abstract node classes.
  It registers the class by name (by creating a new SoType for the
  class) for type identification purposes.

  \sa SO_NODE_INIT_CLASS
  \ingroup nodes
*/

#define SO_NODE_SOURCE(classname)
/*!
  \def SO_NODE_SOURCE(classname)

  This macro sets up the impementation of the declarations in \ref
  SO_NODE_HEADER.  It chould be placed in the implementation file for
  extension nodes.

  \sa SO_NODE_HEADER
  \ingroup nodes
*/

#define SO_NODE_ABSTRACT_SOURCE(classname)
/*!
  \def SO_NODE_ABSTRACT_SOURCE(classname)

  This macro sets up the impementation of the declarations in \ref
  SO_NODE_ABSTRACT_HEADER.  It chould be placed in the implementation
  file for abstract extension nodes.

  \sa SO_NODE_ABSTRACT_HEADER
  \ingroup nodes
*/

#define SO_NODE_CONSTRUCTOR(classname)
/*!
  \def SO_NODE_CONSTRUCTOR(classname)

  Place this in the node constructor.  It sets up the fielddata object
  for the node class.

  \ingroup nodes
*/

#define SO_NODE_IS_FIRST_INSTANCE()
/*!
  \def SO_NODE_IS_FIRST_INSTANCE()

  This macro can be used as a predicate to test if the constructed
  node is the first constructed instance of a node class, in case some
  extra initialization needs to be done that can't be done in the
  initClass() function.

  \ingroup nodes
*/

#define SO_NODE_ADD_FIELD(field, defaultvalue)
/*!
  \def SO_NODE_ADD_FIELD(field, (defaultvalue))

  This registers a field for a node, and sets its value to the default
  value.  For use in the constructor, below the \ref
  SO_NODE_CONSTRUCTOR macro.

  \ingroup nodes
*/

#define SO_NODE_DEFINE_ENUM_VALUE(enumname, enumvalue)
/*!
  \def SO_NODE_DEFINE_ENUM_VALUE(enumname, enumvalue)

  This macro associates enum names with values, used for file
  input/output.

  \ingroup nodes
*/

