/**************************************************************************\ * * 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; }