1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
/******************************************************************************
* SOFA, Simulation Open-Framework Architecture, version 1.0 beta 4 *
* (c) 2006-2009 MGH, INRIA, USTL, UJF, CNRS *
* *
* This library is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, but WITHOUT *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this library; if not, write to the Free Software Foundation, *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
*******************************************************************************
* SOFA :: Framework *
* *
* Authors: M. Adam, J. Allard, B. Andre, P-J. Bensoussan, S. Cotin, C. Duriez,*
* H. Delingette, F. Falipou, F. Faure, S. Fonteneau, L. Heigeas, C. Mendoza, *
* M. Nesme, P. Neumann, J-P. de la Plata Alcade, F. Poyer and F. Roy *
* *
* Contact information: contact@sofa-framework.org *
******************************************************************************/
#ifndef SOFA_CORE_VISUALMODEL_H
#define SOFA_CORE_VISUALMODEL_H
#include <sofa/core/objectmodel/BaseObject.h>
#include <sofa/defaulttype/Vec.h>
#include <sofa/defaulttype/Quat.h>
namespace sofa
{
namespace core
{
/**
* \brief An interface which all VisualModel inherit.
*
* This Interface is used for the VisualModel, which all visible objects must
* implement.
*
* VisualModels are drawn by calling their draw method. The method update is
* used to recompute some internal data (such as normals) after the simulation
* has computed a new timestep.
*
* Most VisualModel are bound by a Mapping to a BehaviorModel or
* MechanicalState.
*/
class SOFA_CORE_API VisualModel : public virtual objectmodel::BaseObject
{
public:
/// Destructor
virtual ~VisualModel() { }
/**
* \brief Initialize the textures, or other graphical resources.
*
* Called once before the first frame is drawn, and if the graphical
* context has been recreated.
*/
virtual void initVisual() { initTextures(); }
/**
* \brief Initialize the textures, or other graphical resources.
*
* @deprecated Use initVisual() instead.
*/
virtual void initTextures() {}
/// The enumeration used to describe each step of the rendering.
enum Pass { Std, ///< Standard pass
Transparent, ///< Transparent pass
Shadow ///< Shadow pass
};
/**
* \brief Called before objects in the current branch are displayed
*/
virtual void fwdDraw(Pass /*pass*/ = Std) {}
/**
* \brief Called after objects in the current branch are displayed
*/
virtual void bwdDraw(Pass /*pass*/ = Std) {}
/**
* \brief Display the VisualModel object.
*/
virtual void drawVisual() {}
//virtual void drawVisual() = 0;
/**
* \brief Display transparent surfaces.
*
* Transparent objects should use this method to get a correct display order.
*/
virtual void drawTransparent()
{
}
/**
* \brief Display shadow-casting surfaces.
*
* This method default to calling draw(). Object that do not cast any
* shadows, or that use a different LOD for them should reimplement it.
*/
virtual void drawShadow()
{
drawVisual();
}
/**
* \brief used to update the model if necessary.
*/
virtual void updateVisual() { update(); }
/**
* \brief used to update the model if necessary.
*
* @deprecated Use updateVisual() instead.
*/
virtual void update() {}
/**
* \brief used to add the bounding-box of this visual model to the
* given bounding box in order to compute the scene bounding box or
* cull hidden objects.
*
* \return false if the visual model does not define any bounding box,
* which should only be the case for "debug" objects, as this lack of
* information might affect performances and leads to incorrect scene
* bounding box.
*/
virtual bool addBBox(double* /*minBBox*/, double* /*maxBBox*/)
{
return false;
}
/// Translate the positions
///
/// This method is optional, it is used when the user want to interactively change the position of an object
virtual void applyTranslation(const double /*dx*/, const double /*dy*/, const double /*dz*/)
{
}
/// Rotate the positions using Euler Angles in degree
///
/// This method is optional, it is used when the user want to interactively change the position of an object
virtual void applyRotation (const double /*rx*/, const double /*ry*/, const double /*rz*/)
{
}
/// Rotate the positions
///
/// This method is optional, it is used when the user want to interactively change the position of an object
virtual void applyRotation(const defaulttype::Quat /*q*/)
{
}
/// Scale the positions
///
/// This method is optional, it is used when the user want to interactively change the position of an object
virtual void applyScale(const double /*s*/)
{
}
/**
* \brief Append this mesh to an OBJ format stream.
*
* The number of vertices position, normal, and texture coordinates already written is given as parameters.
* This method should update them.
*/
virtual void exportOBJ(std::string /*name*/, std::ostream* /*out*/, std::ostream* /*mtl*/, int& /*vindex*/, int& /*nindex*/, int& /*tindex*/)
{
}
};
} // namespace core
} // namespace sofa
#endif
|