/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef __FREESTYLE_STROKE_REP_H__ #define __FREESTYLE_STROKE_REP_H__ /** \file * \ingroup freestyle * \brief Class to define the representation of a stroke (for display purpose) */ #include "Stroke.h" #include "../geometry/Geom.h" #ifdef WITH_CXX_GUARDEDALLOC # include "MEM_guardedalloc.h" #endif #include "DNA_material_types.h" // for MAX_MTEX struct bNodeTree; namespace Freestyle { using namespace Geometry; #if 0 //symbolic constant to call the appropriate renderers and textures # define NO_TEXTURE_WITH_BLEND_STROKE -2 # define NO_TEXTURE_STROKE -1 # define PSEUDO_CHARCOAL_STROKE 0 # define WASH_BRUSH_STROKE 1 # define OIL_STROKE 2 # define NO_BLEND_STROKE 3 # define CHARCOAL_MIN_STROKE 4 # define BRUSH_MIN_STROKE 5 # define OPAQUE_DRY_STROKE 6 # define OPAQUE_STROKE 7 # define DEFAULT_STROKE 0 # define NUMBER_STROKE_RENDERER 8 #endif class StrokeVertexRep { public: StrokeVertexRep() { } StrokeVertexRep(const Vec2r &iPoint2d) { _point2d = iPoint2d; } StrokeVertexRep(const StrokeVertexRep &iBrother); virtual ~StrokeVertexRep() { } inline Vec2r &point2d() { return _point2d; } inline Vec2r &texCoord(bool tips = false) { if (tips) { return _texCoord_w_tips; } else { return _texCoord; } } inline Vec3r &color() { return _color; } inline float alpha() { return _alpha; } inline void setPoint2d(const Vec2r &p) { _point2d = p; } inline void setTexCoord(const Vec2r &p, bool tips = false) { if (tips) { _texCoord_w_tips = p; } else { _texCoord = p; } } inline void setColor(const Vec3r &p) { _color = p; } inline void setAlpha(float a) { _alpha = a; } protected: Vec2r _point2d; Vec2r _texCoord; Vec2r _texCoord_w_tips; Vec3r _color; float _alpha; #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:StrokeVertexRep") #endif }; class Strip { public: typedef std::vector vertex_container; protected: vertex_container _vertices; float _averageThickness; public: Strip(const std::vector &iStrokeVertices, bool hasTex = false, bool tipBegin = false, bool tipEnd = false, float texStep = 1.0); Strip(const Strip &iBrother); virtual ~Strip(); protected: void createStrip(const std::vector &iStrokeVertices); void cleanUpSingularities(const std::vector &iStrokeVertices); void setVertexColor(const std::vector &iStrokeVertices); void computeTexCoord(const std::vector &iStrokeVertices, float texStep); void computeTexCoordWithTips(const std::vector &iStrokeVertices, bool tipBegin, bool tipEnd, float texStep); public: inline int sizeStrip() const { return _vertices.size(); } inline vertex_container &vertices() { return _vertices; } #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:Strip") #endif }; class StrokeRep { protected: Stroke *_stroke; vector _strips; Stroke::MediumType _strokeType; unsigned int _textureId; float _textureStep; MTex *_mtex[MAX_MTEX]; bNodeTree *_nodeTree; Material *_material; bool _hasTex; // float _averageTextureAlpha; public: StrokeRep(); StrokeRep(const StrokeRep &); StrokeRep(Stroke *iStroke); virtual ~StrokeRep(); /*! Creates the strips */ virtual void create(); /*! Renders the stroke using a Renderer */ virtual void Render(const StrokeRenderer *iRenderer); /*! accessors */ inline Stroke::MediumType getMediumType() const { return _strokeType; } inline unsigned getTextureId() const { return _textureId; } inline MTex *getMTex(int idx) const { return _mtex[idx]; } inline Material *getMaterial() const { return _material; } inline bNodeTree *getNodeTree() const { return _nodeTree; } inline bool hasTex() const { return _hasTex; } inline vector &getStrips() { return _strips; } inline unsigned int getNumberOfStrips() const { return _strips.size(); } inline Stroke *getStroke() { return _stroke; } /*! modifiers */ inline void setMediumType(Stroke::MediumType itype) { _strokeType = itype; } inline void setTextureId(unsigned textureId) { _textureId = textureId; } inline void setMaterial(Material *mat) { _material = mat; } #if 0 inline void setMTex(int idx, MTex *mtex_ptr) { _mtex[idx] = mtex_ptr; } #endif #ifdef WITH_CXX_GUARDEDALLOC MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:StrokeRep") #endif }; } /* namespace Freestyle */ #endif // __FREESTYLE_STROKE_REP_H__