/**************************************************************************\ * * 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 SoScale SoScale.h Inventor/nodes/SoScale.h \brief The SoScale class is a node type for scaling scene graph geometry. \ingroup nodes Use nodes of this type to apply scaling operations during scenegraph traversals for e.g. rendering. Scale values are specified in a triple-value vector, with one scale factor for each of the 3 principal axes. FILE FORMAT/DEFAULTS: \code Scale { scaleFactor 1 1 1 } \endcode */ // ************************************************************************* #include #include #include #include #include // ************************************************************************* /*! \var SoSFVec3f SoScale::scaleFactor Specifies scaling along the 3 axes. To get a uniform scale applied to the affected shapes, set the scaleFactor field to a vector with the same value for all components. A common error when doing non-uniform scaling in a single direction is to set the value for the other two components of the scaleFactor vector to 0. This is obviously wrong, they should be set to 1 to \e not scale the shape(s) in the other two directions. Be careful with setting scaleFactor component values to 0 or to negative values. Most shapes should handle those cases somehow, but the results are undefined unless otherwise specified. The default value of this vector field is [1.0, 1.0, 1.0]. */ // ************************************************************************* SO_NODE_SOURCE(SoScale); // ************************************************************************* /*! Constructor. */ SoScale::SoScale(void) { SO_NODE_INTERNAL_CONSTRUCTOR(SoScale); SO_NODE_ADD_FIELD(scaleFactor, (1.0f, 1.0f, 1.0f)); } /*! Destructor. */ SoScale::~SoScale() { } // Doc in superclass. void SoScale::initClass(void) { SO_NODE_INTERNAL_INIT_CLASS(SoScale, SO_FROM_INVENTOR_1|SoNode::VRML1); } // Doc in superclass. void SoScale::doAction(SoAction * action) { SoModelMatrixElement::scaleBy(action->getState(), this, this->scaleFactor.getValue()); } // Doc in superclass. void SoScale::GLRender(SoGLRenderAction * action) { SoScale::doAction((SoAction *)action); } // Doc in superclass. void SoScale::getBoundingBox(SoGetBoundingBoxAction * action) { SoScale::doAction((SoAction *)action); } // Doc in superclass. void SoScale::callback(SoCallbackAction *action) { SoScale::doAction((SoAction*)action); } // Doc in superclass. void SoScale::getMatrix(SoGetMatrixAction * action) { SbVec3f scalevec = this->scaleFactor.getValue(); SbMatrix m; m.setScale(scalevec); action->getMatrix().multLeft(m); m.setScale(SbVec3f(1.0f / scalevec[0], 1.0f / scalevec[1], 1.0f / scalevec[2])); action->getInverse().multRight(m); } // Doc in superclass. void SoScale::pick(SoPickAction *action) { SoScale::doAction((SoAction*)action); } // Doc in superclass. Overrides the traversal method in this class for // the SoGetPrimitiveCountAction because the number of primitives can // be different depending on scene location (and thereby distance to // camera) if there are e.g. SoLOD nodes in the scene. void SoScale::getPrimitiveCount(SoGetPrimitiveCountAction *action) { SoScale::doAction((SoAction*)action); }