/**************************************************************************\
*
* This file is part of the Coin 3D visualization library.
* Copyright (C) 1998-2007 by Systems in Motion. All rights reserved.
*
* 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 Systems in Motion about acquiring
* a Coin Professional Edition License.
*
* See http://www.coin3d.org/ for more information.
*
* Systems in Motion, Postboks 1283, Pirsenteret, 7462 Trondheim, NORWAY.
* http://www.sim.no/ sales@sim.no coin-support@coin3d.org
*
\**************************************************************************/
/*!
\class SoNormalBinding SoNormalBinding.h Inventor/nodes/SoNormalBinding.h
\brief The SoNormalBinding class is a node for specifying normal vector bindings.
\ingroup nodes
Use nodes of this type to specify how to map normal vectors from
SoNormal nodes in the scene graph to shape nodes.
FILE FORMAT/DEFAULTS:
\code
NormalBinding {
value PER_VERTEX_INDEXED
}
\endcode
*/
// *************************************************************************
#include
#include
#include
#include
#include
#include
#include
// *************************************************************************
/*!
\enum SoNormalBinding::Binding
Enumeration of available types of mappings. See documentation of
SoMaterialBinding node for explanation of the different values.
Note that SoNormalBinding::DEFAULT and SoNormalBinding::NONE has
been obsoleted and are both mapped to
SoNormalBinding::PER_VERTEX_INDEXED.
*/
/*!
\var SoSFEnum SoNormalBinding::value
The normal binding to use for subsequent shape nodes in the scene
graph.
*/
// *************************************************************************
SO_NODE_SOURCE(SoNormalBinding);
/*!
Constructor.
*/
SoNormalBinding::SoNormalBinding(void)
{
SO_NODE_INTERNAL_CONSTRUCTOR(SoNormalBinding);
SO_NODE_ADD_FIELD(value, (DEFAULT));
SO_NODE_DEFINE_ENUM_VALUE(Binding, OVERALL);
SO_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART);
SO_NODE_DEFINE_ENUM_VALUE(Binding, PER_PART_INDEXED);
SO_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE);
SO_NODE_DEFINE_ENUM_VALUE(Binding, PER_FACE_INDEXED);
SO_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX);
SO_NODE_DEFINE_ENUM_VALUE(Binding, PER_VERTEX_INDEXED);
SO_NODE_DEFINE_ENUM_VALUE(Binding, DEFAULT);
SO_NODE_DEFINE_ENUM_VALUE(Binding, NONE);
SO_NODE_SET_SF_ENUM_TYPE(value, Binding);
}
/*!
Destructor.
*/
SoNormalBinding::~SoNormalBinding()
{
}
// Doc from superclass.
void
SoNormalBinding::initClass(void)
{
SO_NODE_INTERNAL_INIT_CLASS(SoNormalBinding, SO_FROM_INVENTOR_1|SoNode::VRML1);
SO_ENABLE(SoGLRenderAction, SoNormalBindingElement);
SO_ENABLE(SoPickAction, SoNormalBindingElement);
SO_ENABLE(SoCallbackAction, SoNormalBindingElement);
SO_ENABLE(SoGetPrimitiveCountAction, SoNormalBindingElement);
}
// Doc from superclass.
void
SoNormalBinding::GLRender(SoGLRenderAction * action)
{
SoNormalBinding::doAction(action);
}
// Doc from superclass.
void
SoNormalBinding::doAction(SoAction * action)
{
SoState * state = action->getState();
if (!this->value.isIgnored() && !SoOverrideElement::getNormalBindingOverride(state)) {
SoNormalBindingElement::set(state, this,
(SoNormalBindingElement::Binding)
this->value.getValue());
if (this->isOverride()) {
SoOverrideElement::setNormalBindingOverride(state, this, TRUE);
}
}
}
// Doc from superclass.
void
SoNormalBinding::callback(SoCallbackAction * action)
{
SoNormalBinding::doAction(action);
}
// Doc from superclass.
void
SoNormalBinding::pick(SoPickAction * action)
{
SoNormalBinding::doAction(action);
}
// Doc from superclass.
void
SoNormalBinding::getPrimitiveCount(SoGetPrimitiveCountAction * action)
{
SoNormalBinding::doAction(action);
}
SbBool
SoNormalBinding::readInstance(SoInput * in, unsigned short flags)
{
SbBool ret = inherited::readInstance(in, flags);
if (this->value.getValue() < 2) {
// old OIV files might use obsolete bindings. Change to
// PER_VERTEX_INDEXED
this->value = PER_VERTEX_INDEXED;
}
return ret;
}