Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/freestyle/intern/stroke/Stroke.h')
-rw-r--r--source/blender/freestyle/intern/stroke/Stroke.h1567
1 files changed, 786 insertions, 781 deletions
diff --git a/source/blender/freestyle/intern/stroke/Stroke.h b/source/blender/freestyle/intern/stroke/Stroke.h
index bc335b2252e..3eae5e91b6a 100644
--- a/source/blender/freestyle/intern/stroke/Stroke.h
+++ b/source/blender/freestyle/intern/stroke/Stroke.h
@@ -34,7 +34,7 @@
#include "../system/StringUtils.h"
#ifdef WITH_CXX_GUARDEDALLOC
-#include "MEM_guardedalloc.h"
+# include "MEM_guardedalloc.h"
#endif
extern "C" {
@@ -43,7 +43,7 @@ struct bNodeTree;
}
#ifndef MAX_MTEX
-#define MAX_MTEX 18
+# define MAX_MTEX 18
#endif
namespace Freestyle {
@@ -56,427 +56,428 @@ namespace Freestyle {
/*! Class to define an attribute associated to a Stroke Vertex.
* This attribute stores the color, alpha and thickness values for a Stroke Vertex.
*/
-class StrokeAttribute
-{
-public:
- /*! default constructor */
- StrokeAttribute();
-
- /*! Copy constructor */
- StrokeAttribute(const StrokeAttribute& iBrother);
-
- /*! Builds a stroke vertex attribute from a set of parameters.
- * \param iRColor:
- * The Red Component value.
- * \param iGColor:
- * The Green Component value.
- * \param iBColor:
- * The Blue Component value.
- * \param iAlpha:
- * The transparency value
- * \param iRThickness:
- * The thickness of the stroke on the right
- * \param iLThickness:
- * The Thickness of the stroke on the left
- */
- StrokeAttribute(float iRColor, float iGColor, float iBColor, float iAlpha, float iRThickness, float iLThickness);
-
- /*! Interpolation constructor.
- * Builds a StrokeAttribute from two StrokeAttributes and an interpolation parameter.
- * \param a1:
- * The first Attribute.
- * \param a2:
- * The second parameter.
- * \param t:
- * The interpolation parameter.
- */
- StrokeAttribute(const StrokeAttribute& a1, const StrokeAttribute& a2, float t);
-
- /*! destructor */
- virtual ~StrokeAttribute();
-
- /* operators */
- /*! operator = */
- StrokeAttribute& operator=(const StrokeAttribute& iBrother);
-
- /* accessors */
- /*! Returns the attribute's color.
- * \return The array of 3 floats containing the R,G,B values of the attribute's color.
- */
- inline const float *getColor() const
- {
- return _color;
- }
-
- /*! Returns the R color component. */
- inline const float getColorR() const
- {
- return _color[0];
- }
-
- /*! Returns the G color component. */
- inline const float getColorG() const
- {
- return _color[1];
- }
-
- /*! Returns the B color component. */
- inline const float getColorB() const
- {
- return _color[2];
- }
-
- /*! Returns the RGB color components. */
- inline Vec3f getColorRGB() const
- {
- return Vec3f(_color[0], _color[1], _color[2]);
- }
-
- /*! Returns the alpha color component. */
- inline float getAlpha() const
- {
- return _alpha;
- }
-
- /*! Returns the attribute's thickness.
- * \return an array of 2 floats. the first value is the thickness on the right of the vertex when following
- * the stroke, the second one is the thickness on the left.
- */
- inline const float *getThickness() const
- {
- return _thickness;
- }
-
- /*! Returns the thickness on the right of the vertex when following the stroke. */
- inline const float getThicknessR() const
- {
- return _thickness[0];
- }
-
- /*! Returns the thickness on the left of the vertex when following the stroke. */
- inline const float getThicknessL() const
- {
- return _thickness[1];
- }
-
- /*! Returns the thickness on the right and on the left of the vertex when following the stroke. */
- inline Vec2f getThicknessRL() const
- {
- return Vec2f(_thickness[0], _thickness[1]);
- }
-
- /*! Returns true if the strokevertex is visible, false otherwise */
- inline bool isVisible() const
- {
- return _visible;
- }
-
- /*! Returns an attribute of type real
- * \param iName:
- * The name of the attribute
- */
- float getAttributeReal(const char *iName) const;
-
- /*! Returns an attribute of type Vec2f
- * \param iName:
- * The name of the attribute
- */
- Vec2f getAttributeVec2f(const char *iName) const;
-
- /*! Returns an attribute of type Vec3f
- * \param iName:
- * The name of the attribute
- */
- Vec3f getAttributeVec3f(const char *iName) const;
-
- /*! Checks whether the attribute iName is availbale */
- bool isAttributeAvailableReal(const char *iName) const;
-
- /*! Checks whether the attribute iName is availbale */
- bool isAttributeAvailableVec2f(const char *iName) const;
-
- /*! Checks whether the attribute iName is availbale */
- bool isAttributeAvailableVec3f(const char *iName) const;
-
- /* modifiers */
- /*! sets the attribute's color.
- * \param r:
- * The new R value.
- * \param g:
- * The new G value.
- * \param b:
- * The new B value.
- */
- inline void setColor(float r, float g, float b)
- {
- _color[0] = r;
- _color[1] = g;
- _color[2] = b;
- }
-
- /*! sets the attribute's color.
- * \param iRGB:
- * The new RGB values.
- */
- inline void setColor(const Vec3f& iRGB)
- {
- _color[0] = iRGB[0];
- _color[1] = iRGB[1];
- _color[2] = iRGB[2];
- }
-
- /*! sets the attribute's alpha value.
- * \param alpha:
- * The new alpha value.
- */
- inline void setAlpha(float alpha)
- {
- _alpha = alpha;
- }
-
- /*! sets the attribute's thickness.
- * \param tr:
- * The thickness on the right of the vertex when following the stroke.
- * \param tl:
- * The thickness on the left of the vertex when following the stroke.
- */
- inline void setThickness(float tr, float tl)
- {
- _thickness[0] = tr;
- _thickness[1] = tl;
- }
-
- /*! sets the attribute's thickness.
- * \param tRL:
- * The thickness on the right and on the left of the vertex when following the stroke.
- */
- inline void setThickness(const Vec2f& tRL)
- {
- _thickness[0] = tRL[0];
- _thickness[1] = tRL[1];
- }
-
- /*! sets the visible flag. True means visible. */
- inline void setVisible(bool iVisible)
- {
- _visible = iVisible;
- }
-
- /*! Adds a user defined attribute of type real
- * If there is no attribute of name iName, it is added.
- * Otherwise, the new value replaces the old one.
- * \param iName:
- * The name of the attribute
- * \param att:
- * The attribute's value
- */
- void setAttributeReal(const char *iName, float att);
-
- /*! Adds a user defined attribute of type Vec2f
- * If there is no attribute of name iName, it is added.
- * Otherwise, the new value replaces the old one.
- * \param iName:
- * The name of the attribute
- * \param att:
- * The attribute's value
- */
- void setAttributeVec2f(const char *iName, const Vec2f& att);
-
- /*! Adds a user defined attribute of type Vec3f
- * If there is no attribute of name iName, it is added.
- * Otherwise, the new value replaces the old one.
- * \param iName:
- * The name of the attribute
- * \param att:
- * The attribute's value
- */
- void setAttributeVec3f(const char *iName, const Vec3f& att);
-
-private:
- typedef std::map<const char *, float, StringUtils::ltstr> realMap;
- typedef std::map<const char *, Vec2f, StringUtils::ltstr> Vec2fMap;
- typedef std::map<const char *, Vec3f, StringUtils::ltstr> Vec3fMap;
-
- //! the color
- float _color[3];
- //! alpha
- float _alpha;
- //! the thickness on the right and on the left of the backbone vertex (the stroke is oriented)
- float _thickness[2];
- bool _visible;
- realMap *_userAttributesReal;
- Vec2fMap *_userAttributesVec2f;
- Vec3fMap *_userAttributesVec3f;
+class StrokeAttribute {
+ public:
+ /*! default constructor */
+ StrokeAttribute();
+
+ /*! Copy constructor */
+ StrokeAttribute(const StrokeAttribute &iBrother);
+
+ /*! Builds a stroke vertex attribute from a set of parameters.
+ * \param iRColor:
+ * The Red Component value.
+ * \param iGColor:
+ * The Green Component value.
+ * \param iBColor:
+ * The Blue Component value.
+ * \param iAlpha:
+ * The transparency value
+ * \param iRThickness:
+ * The thickness of the stroke on the right
+ * \param iLThickness:
+ * The Thickness of the stroke on the left
+ */
+ StrokeAttribute(float iRColor,
+ float iGColor,
+ float iBColor,
+ float iAlpha,
+ float iRThickness,
+ float iLThickness);
+
+ /*! Interpolation constructor.
+ * Builds a StrokeAttribute from two StrokeAttributes and an interpolation parameter.
+ * \param a1:
+ * The first Attribute.
+ * \param a2:
+ * The second parameter.
+ * \param t:
+ * The interpolation parameter.
+ */
+ StrokeAttribute(const StrokeAttribute &a1, const StrokeAttribute &a2, float t);
+
+ /*! destructor */
+ virtual ~StrokeAttribute();
+
+ /* operators */
+ /*! operator = */
+ StrokeAttribute &operator=(const StrokeAttribute &iBrother);
+
+ /* accessors */
+ /*! Returns the attribute's color.
+ * \return The array of 3 floats containing the R,G,B values of the attribute's color.
+ */
+ inline const float *getColor() const
+ {
+ return _color;
+ }
+
+ /*! Returns the R color component. */
+ inline const float getColorR() const
+ {
+ return _color[0];
+ }
+
+ /*! Returns the G color component. */
+ inline const float getColorG() const
+ {
+ return _color[1];
+ }
+
+ /*! Returns the B color component. */
+ inline const float getColorB() const
+ {
+ return _color[2];
+ }
+
+ /*! Returns the RGB color components. */
+ inline Vec3f getColorRGB() const
+ {
+ return Vec3f(_color[0], _color[1], _color[2]);
+ }
+
+ /*! Returns the alpha color component. */
+ inline float getAlpha() const
+ {
+ return _alpha;
+ }
+
+ /*! Returns the attribute's thickness.
+ * \return an array of 2 floats. the first value is the thickness on the right of the vertex when following
+ * the stroke, the second one is the thickness on the left.
+ */
+ inline const float *getThickness() const
+ {
+ return _thickness;
+ }
+
+ /*! Returns the thickness on the right of the vertex when following the stroke. */
+ inline const float getThicknessR() const
+ {
+ return _thickness[0];
+ }
+
+ /*! Returns the thickness on the left of the vertex when following the stroke. */
+ inline const float getThicknessL() const
+ {
+ return _thickness[1];
+ }
+
+ /*! Returns the thickness on the right and on the left of the vertex when following the stroke. */
+ inline Vec2f getThicknessRL() const
+ {
+ return Vec2f(_thickness[0], _thickness[1]);
+ }
+
+ /*! Returns true if the strokevertex is visible, false otherwise */
+ inline bool isVisible() const
+ {
+ return _visible;
+ }
+
+ /*! Returns an attribute of type real
+ * \param iName:
+ * The name of the attribute
+ */
+ float getAttributeReal(const char *iName) const;
+
+ /*! Returns an attribute of type Vec2f
+ * \param iName:
+ * The name of the attribute
+ */
+ Vec2f getAttributeVec2f(const char *iName) const;
+
+ /*! Returns an attribute of type Vec3f
+ * \param iName:
+ * The name of the attribute
+ */
+ Vec3f getAttributeVec3f(const char *iName) const;
+
+ /*! Checks whether the attribute iName is availbale */
+ bool isAttributeAvailableReal(const char *iName) const;
+
+ /*! Checks whether the attribute iName is availbale */
+ bool isAttributeAvailableVec2f(const char *iName) const;
+
+ /*! Checks whether the attribute iName is availbale */
+ bool isAttributeAvailableVec3f(const char *iName) const;
+
+ /* modifiers */
+ /*! sets the attribute's color.
+ * \param r:
+ * The new R value.
+ * \param g:
+ * The new G value.
+ * \param b:
+ * The new B value.
+ */
+ inline void setColor(float r, float g, float b)
+ {
+ _color[0] = r;
+ _color[1] = g;
+ _color[2] = b;
+ }
+
+ /*! sets the attribute's color.
+ * \param iRGB:
+ * The new RGB values.
+ */
+ inline void setColor(const Vec3f &iRGB)
+ {
+ _color[0] = iRGB[0];
+ _color[1] = iRGB[1];
+ _color[2] = iRGB[2];
+ }
+
+ /*! sets the attribute's alpha value.
+ * \param alpha:
+ * The new alpha value.
+ */
+ inline void setAlpha(float alpha)
+ {
+ _alpha = alpha;
+ }
+
+ /*! sets the attribute's thickness.
+ * \param tr:
+ * The thickness on the right of the vertex when following the stroke.
+ * \param tl:
+ * The thickness on the left of the vertex when following the stroke.
+ */
+ inline void setThickness(float tr, float tl)
+ {
+ _thickness[0] = tr;
+ _thickness[1] = tl;
+ }
+
+ /*! sets the attribute's thickness.
+ * \param tRL:
+ * The thickness on the right and on the left of the vertex when following the stroke.
+ */
+ inline void setThickness(const Vec2f &tRL)
+ {
+ _thickness[0] = tRL[0];
+ _thickness[1] = tRL[1];
+ }
+
+ /*! sets the visible flag. True means visible. */
+ inline void setVisible(bool iVisible)
+ {
+ _visible = iVisible;
+ }
+
+ /*! Adds a user defined attribute of type real
+ * If there is no attribute of name iName, it is added.
+ * Otherwise, the new value replaces the old one.
+ * \param iName:
+ * The name of the attribute
+ * \param att:
+ * The attribute's value
+ */
+ void setAttributeReal(const char *iName, float att);
+
+ /*! Adds a user defined attribute of type Vec2f
+ * If there is no attribute of name iName, it is added.
+ * Otherwise, the new value replaces the old one.
+ * \param iName:
+ * The name of the attribute
+ * \param att:
+ * The attribute's value
+ */
+ void setAttributeVec2f(const char *iName, const Vec2f &att);
+
+ /*! Adds a user defined attribute of type Vec3f
+ * If there is no attribute of name iName, it is added.
+ * Otherwise, the new value replaces the old one.
+ * \param iName:
+ * The name of the attribute
+ * \param att:
+ * The attribute's value
+ */
+ void setAttributeVec3f(const char *iName, const Vec3f &att);
+
+ private:
+ typedef std::map<const char *, float, StringUtils::ltstr> realMap;
+ typedef std::map<const char *, Vec2f, StringUtils::ltstr> Vec2fMap;
+ typedef std::map<const char *, Vec3f, StringUtils::ltstr> Vec3fMap;
+
+ //! the color
+ float _color[3];
+ //! alpha
+ float _alpha;
+ //! the thickness on the right and on the left of the backbone vertex (the stroke is oriented)
+ float _thickness[2];
+ bool _visible;
+ realMap *_userAttributesReal;
+ Vec2fMap *_userAttributesVec2f;
+ Vec3fMap *_userAttributesVec3f;
#ifdef WITH_CXX_GUARDEDALLOC
- MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:StrokeAttribute")
+ MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:StrokeAttribute")
#endif
};
-
//
// StrokeVertex
//
////////////////////////////////////////////////////////
/*! Class to define a stroke vertex. */
-class StrokeVertex : public CurvePoint
-{
-public: // Implementation of Interface0D
- /*! Returns the string "StrokeVertex" */
- virtual string getExactTypeName() const
- {
- return "StrokeVertex";
- }
-
-private:
- StrokeAttribute _Attribute; //! The attribute associated to the vertex
- float _CurvilignAbscissa; //! the curvilign abscissa
- float _StrokeLength; // stroke length
-
-public:
- /*! default constructor */
- StrokeVertex();
-
- /*! Copy constructor */
- StrokeVertex(const StrokeVertex& iBrother);
-
- /*! Builds a stroke vertex from a SVertex */
- StrokeVertex(SVertex *iSVertex);
-
- /*! Builds a stroke vertex from a CurvePoint */
- StrokeVertex(CurvePoint *iPoint);
-
- /*! Builds Stroke Vertex from 2 stroke vertices and an interpolation parameter*/
- StrokeVertex(StrokeVertex *iA, StrokeVertex *iB, float t3);
-
- /*! Builds a stroke from a view vertex and an attribute */
- StrokeVertex(SVertex *iSVertex, const StrokeAttribute& iAttribute);
-
- /*! destructor */
- virtual ~StrokeVertex();
-
- /* operators */
- /*! operator = */
- StrokeVertex& operator=(const StrokeVertex& iBrother);
-
- /* accessors */
- /*! Returns the 2D point x coordinate */
- inline real x() const
- {
- return _Point2d[0];
- }
-
- /*! Returns the 2D point y coordinate */
- inline real y() const
- {
- return _Point2d[1];
- }
-
- /*! Returns the 2D point coordinates as a Vec2r */
- inline Vec2r getPoint() const
- {
- return getPoint2D();
- }
-
- /*! Returns the ith 2D point coordinate (i=0 or 1)*/
- inline real operator[](const int i) const
- {
- return _Point2d[i];
- }
-
- /*! Returns the StrokeAttribute for this StrokeVertex */
- inline const StrokeAttribute& attribute() const
- {
- return _Attribute;
- }
-
- /*! Returns a non-const reference to the StrokeAttribute of this StrokeVertex */
- inline StrokeAttribute& attribute()
- {
- return _Attribute;
- }
-
- /*! Returns the curvilinear abscissa */
- inline float curvilinearAbscissa() const
- {
- return _CurvilignAbscissa;
- }
-
- /*! Returns the length of the Stroke to which this StrokeVertex belongs */
- inline float strokeLength() const
- {
- return _StrokeLength;
- }
-
- /*! Returns the curvilinear abscissa of this StrokeVertex in the Stroke */
- inline float u() const
- {
- return _CurvilignAbscissa / _StrokeLength;
- }
-
- /* modifiers */
- /*! sets the 2D x value */
- inline void setX(real x)
- {
- _Point2d[0] = x;
- }
-
- /*! sets the 2D y value */
- inline void setY(real y)
- {
- _Point2d[1] = y;
- }
-
- /*! sets the 2D x and y values */
- inline void setPoint(real x, real y)
- {
- _Point2d[0] = x;
- _Point2d[1] = y;
- }
-
- /*! sets the 2D x and y values */
- inline void setPoint(const Vec2r& p)
- {
- _Point2d[0] = p[0];
- _Point2d[1] = p[1];
- }
-
- /*! Returns a reference to the ith 2D point coordinate (i=0 or 1) */
- inline real& operator[](const int i)
- {
- return _Point2d[i];
- }
-
- /*! sets the attribute. */
- inline void setAttribute(const StrokeAttribute& iAttribute)
- {
- _Attribute = iAttribute;
- }
-
- /*! sets the curvilinear abscissa of this StrokeVertex in the Stroke */
- inline void setCurvilinearAbscissa(float iAbscissa)
- {
- _CurvilignAbscissa = iAbscissa;
- }
-
- /*! sets the Stroke's length (it's only a value stored by the Stroke Vertex, it won't change the real
- * Stroke's length.)
- */
- inline void setStrokeLength(float iLength)
- {
- _StrokeLength = iLength;
- }
-
- /* interface definition */
- /* inherited */
+class StrokeVertex : public CurvePoint {
+ public: // Implementation of Interface0D
+ /*! Returns the string "StrokeVertex" */
+ virtual string getExactTypeName() const
+ {
+ return "StrokeVertex";
+ }
+
+ private:
+ StrokeAttribute _Attribute; //! The attribute associated to the vertex
+ float _CurvilignAbscissa; //! the curvilign abscissa
+ float _StrokeLength; // stroke length
+
+ public:
+ /*! default constructor */
+ StrokeVertex();
+
+ /*! Copy constructor */
+ StrokeVertex(const StrokeVertex &iBrother);
+
+ /*! Builds a stroke vertex from a SVertex */
+ StrokeVertex(SVertex *iSVertex);
+
+ /*! Builds a stroke vertex from a CurvePoint */
+ StrokeVertex(CurvePoint *iPoint);
+
+ /*! Builds Stroke Vertex from 2 stroke vertices and an interpolation parameter*/
+ StrokeVertex(StrokeVertex *iA, StrokeVertex *iB, float t3);
+
+ /*! Builds a stroke from a view vertex and an attribute */
+ StrokeVertex(SVertex *iSVertex, const StrokeAttribute &iAttribute);
+
+ /*! destructor */
+ virtual ~StrokeVertex();
+
+ /* operators */
+ /*! operator = */
+ StrokeVertex &operator=(const StrokeVertex &iBrother);
+
+ /* accessors */
+ /*! Returns the 2D point x coordinate */
+ inline real x() const
+ {
+ return _Point2d[0];
+ }
+
+ /*! Returns the 2D point y coordinate */
+ inline real y() const
+ {
+ return _Point2d[1];
+ }
+
+ /*! Returns the 2D point coordinates as a Vec2r */
+ inline Vec2r getPoint() const
+ {
+ return getPoint2D();
+ }
+
+ /*! Returns the ith 2D point coordinate (i=0 or 1)*/
+ inline real operator[](const int i) const
+ {
+ return _Point2d[i];
+ }
+
+ /*! Returns the StrokeAttribute for this StrokeVertex */
+ inline const StrokeAttribute &attribute() const
+ {
+ return _Attribute;
+ }
+
+ /*! Returns a non-const reference to the StrokeAttribute of this StrokeVertex */
+ inline StrokeAttribute &attribute()
+ {
+ return _Attribute;
+ }
+
+ /*! Returns the curvilinear abscissa */
+ inline float curvilinearAbscissa() const
+ {
+ return _CurvilignAbscissa;
+ }
+
+ /*! Returns the length of the Stroke to which this StrokeVertex belongs */
+ inline float strokeLength() const
+ {
+ return _StrokeLength;
+ }
+
+ /*! Returns the curvilinear abscissa of this StrokeVertex in the Stroke */
+ inline float u() const
+ {
+ return _CurvilignAbscissa / _StrokeLength;
+ }
+
+ /* modifiers */
+ /*! sets the 2D x value */
+ inline void setX(real x)
+ {
+ _Point2d[0] = x;
+ }
+
+ /*! sets the 2D y value */
+ inline void setY(real y)
+ {
+ _Point2d[1] = y;
+ }
+
+ /*! sets the 2D x and y values */
+ inline void setPoint(real x, real y)
+ {
+ _Point2d[0] = x;
+ _Point2d[1] = y;
+ }
+
+ /*! sets the 2D x and y values */
+ inline void setPoint(const Vec2r &p)
+ {
+ _Point2d[0] = p[0];
+ _Point2d[1] = p[1];
+ }
+
+ /*! Returns a reference to the ith 2D point coordinate (i=0 or 1) */
+ inline real &operator[](const int i)
+ {
+ return _Point2d[i];
+ }
+
+ /*! sets the attribute. */
+ inline void setAttribute(const StrokeAttribute &iAttribute)
+ {
+ _Attribute = iAttribute;
+ }
+
+ /*! sets the curvilinear abscissa of this StrokeVertex in the Stroke */
+ inline void setCurvilinearAbscissa(float iAbscissa)
+ {
+ _CurvilignAbscissa = iAbscissa;
+ }
+
+ /*! sets the Stroke's length (it's only a value stored by the Stroke Vertex, it won't change the real
+ * Stroke's length.)
+ */
+ inline void setStrokeLength(float iLength)
+ {
+ _StrokeLength = iLength;
+ }
+
+ /* interface definition */
+ /* inherited */
#ifdef WITH_CXX_GUARDEDALLOC
- MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:StrokeVertex")
+ MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:StrokeVertex")
#endif
};
-
//
// Stroke
//
@@ -492,400 +493,404 @@ class vertex_nonconst_traits;
template<class Traits> class vertex_iterator_base;
class StrokeVertexIterator;
-} // end of namespace StrokeInternal
+} // end of namespace StrokeInternal
/*! Class to define a stroke.
* A stroke is made of a set of 2D vertices (StrokeVertex), regularly spaced out.
* This set of vertices defines the stroke's backbone geometry.
* Each of these stroke vertices defines the stroke's shape and appearance at this vertex position.
*/
-class Stroke : public Interface1D
-{
-public: // Implementation of Interface1D
- /*! Returns the string "Stroke" */
- virtual string getExactTypeName() const
- {
- return "Stroke";
- }
-
- // Data access methods
-
- /*! Returns the Id of the Stroke */
- virtual Id getId() const
- {
- return _id;
- }
-
- /*! The different blending modes available to similate the interaction media-medium. */
- typedef enum {
- DRY_MEDIUM, /*!< To simulate a dry medium such as Pencil or Charcoal.*/
- HUMID_MEDIUM, /*!< To simulate ink painting (color subtraction blending).*/
- OPAQUE_MEDIUM, /*!< To simulate an opaque medium (oil, spray...).*/
- } MediumType;
-
-public:
- typedef std::deque<StrokeVertex*> vertex_container; // the vertices container
- typedef std::vector<ViewEdge*> viewedge_container; // the viewedges container
- typedef StrokeInternal::vertex_iterator_base<StrokeInternal::vertex_nonconst_traits > vertex_iterator;
- typedef StrokeInternal::vertex_iterator_base<StrokeInternal::vertex_const_traits> const_vertex_iterator;
-
-public:
- //typedef StrokeVertex vertex_type;
-
-private:
- vertex_container _Vertices; //! The stroke's backbone vertices
- Id _id;
- float _Length; // The stroke length
- viewedge_container _ViewEdges;
- float _sampling;
- float _textureStep;
- // StrokeRenderer *_renderer; // mark implementation OpenGL renderer
- MediumType _mediumType;
- unsigned int _textureId;
- MTex *_mtex[MAX_MTEX];
- bNodeTree *_nodeTree;
- bool _tips;
- StrokeRep *_rep;
- Vec2r _extremityOrientations[2]; // the orientations of the first and last extermity
-
-public:
- /*! default constructor */
- Stroke();
-
- /*! copy constructor */
- Stroke(const Stroke& iBrother);
-
- /*! Builds a stroke from a set of StrokeVertex.
- * This constructor is templated by an iterator type.
- * This iterator type must allow the vertices parsing using the ++ operator.
- * \param iBegin:
- * The iterator pointing to the first vertex.
- * \param iEnd:
- * The iterator pointing to the end of the vertex list.
- */
- template<class InputVertexIterator>
- Stroke(InputVertexIterator iBegin, InputVertexIterator iEnd);
-
- /*! Destructor */
- virtual ~Stroke();
-
- /* operators */
- /*! operator = */
- Stroke& operator=(const Stroke& iBrother);
-
- /*! Compute the sampling needed to get iNVertices vertices.
- * If the specified number of vertices is less than the actual number of vertices, the actual sampling value
- * is returned. (To remove Vertices, use the RemoveVertex() method of this class).
- * \param iNVertices:
- * The number of StrokeVertices we eventually want in our Stroke.
- * \return the sampling that must be used in the Resample(float) method.
- * \see Resample(int)
- * \see Resample(float)
- */
- float ComputeSampling(int iNVertices);
-
- /*! Resampling method.
- * Resamples the curve so that it eventually has iNPoints. That means it is going to add iNPoints-vertices_size,
- * if vertices_size is the number of points we already have.
- * If vertices_size >= iNPoints, no resampling is done.
- * \param iNPoints:
- * The number of vertices we eventually want in our stroke.
- */
- int Resample(int iNPoints);
-
- /*! Resampling method.
- * Resamples the curve with a given sampling.
- * If this sampling is < to the actual sampling value, no resampling is done.
- * \param iSampling:
- * The new sampling value.
- */
- int Resample(float iSampling);
-
- /*! Removes all vertices from the Stroke.
- */
- void RemoveAllVertices();
-
- /*! Removes the stroke vertex iVertex
- * from the stroke.
- * The length and curvilinear abscissa are updated
- * consequently.
- */
- void RemoveVertex(StrokeVertex *iVertex);
-
- /*! Inserts the stroke vertex iVertex in the stroke before next.
- * The length, curvilinear abscissa are updated consequently.
- * \param iVertex:
- * The StrokeVertex to insert in the Stroke.
- * \param next:
- * A StrokeVertexIterator pointing to the StrokeVeretx before which iVertex must be inserted.
- */
- void InsertVertex(StrokeVertex *iVertex, StrokeInternal::StrokeVertexIterator next);
-
- /*! Updates the 2D length of the Stroke */
- void UpdateLength();
-
- /* Render method */
- void ScaleThickness(float iFactor);
- void Render(const StrokeRenderer *iRenderer);
- void RenderBasic(const StrokeRenderer *iRenderer);
-
- /* Iterator definition */
-
- /* accessors */
- /*! Returns the 2D length of the Stroke */
- inline real getLength2D() const
- {
- return _Length;
- }
-
- /*! Returns a reference to the time stamp value of the stroke. */
- /*! Returns the MediumType used for this Stroke. */
- inline MediumType getMediumType() const
- {
- return _mediumType;
- }
-
- /*! Returns the id of the texture used to simulate th marks system for this Stroke */
- inline unsigned int getTextureId() {return _textureId;}
-
- /*! Returns the spacing of texture coordinates along the stroke lenght */
- inline float getTextureStep() {return _textureStep;}
-
- /*! Returns the texture used at given index to simulate the marks system for this Stroke */
- inline MTex *getMTex(int idx) {
- return _mtex[idx];
- }
-
- /*! Return the shader node tree to define textures. */
- inline bNodeTree *getNodeTree()
- {
- return _nodeTree;
- }
-
- /*! Returns true if this Stroke has textures assigned, false otherwise. */
- inline bool hasTex() const
- {
- return (_mtex[0] != NULL) || _nodeTree;
- }
-
- /*! Returns true if this Stroke uses a texture with tips, false otherwise. */
- inline bool hasTips() const
- {
- return _tips;
- }
-
- /* these advanced iterators are used only in C++ */
- inline int vertices_size() const
- {
- return _Vertices.size();
- }
-
- inline viewedge_container::const_iterator viewedges_begin() const
- {
- return _ViewEdges.begin();
- }
-
- inline viewedge_container::iterator viewedges_begin()
- {
- return _ViewEdges.begin();
- }
-
- inline viewedge_container::const_iterator viewedges_end() const
- {
- return _ViewEdges.end();
- }
-
- inline viewedge_container::iterator viewedges_end()
- {
- return _ViewEdges.end();
- }
-
- inline int viewedges_size() const
- {
- return _ViewEdges.size();
- }
-
- inline Vec2r getBeginningOrientation() const
- {
- return _extremityOrientations[0];
- }
-
- inline real getBeginningOrientationX() const
- {
- return _extremityOrientations[0].x();
- }
-
- inline real getBeginningOrientationY() const
- {
- return _extremityOrientations[0].y();
- }
-
- inline Vec2r getEndingOrientation() const
- {
- return _extremityOrientations[1];
- }
-
- inline real getEndingOrientationX() const
- {
- return _extremityOrientations[1].x();
- }
-
- inline real getEndingOrientationY() const
- {
- return _extremityOrientations[1].y();
- }
-
-
- /* modifiers */
- /*! sets the Id of the Stroke. */
- inline void setId(const Id& id)
- {
- _id = id;
- }
-
- /*! sets the 2D length of the Stroke. */
- void setLength(float iLength);
-
- /*! sets the medium type that must be used for this Stroke. */
- inline void setMediumType(MediumType iType)
- {
- _mediumType = iType;
- }
-
- /*! sets the texture id to be used to simulate the marks system for this Stroke. */
- inline void setTextureId(unsigned int id)
- {
- _textureId = id;
- }
-
- /*! sets the spacing of texture coordinates along the stroke lenght. */
- inline void setTextureStep(float step)
- {
- _textureStep = step;
- }
-
- /*! assigns a blender texture to the first available slot. */
- inline int setMTex(MTex *mtex)
- {
- for (int a = 0; a < MAX_MTEX; a++) {
- if (!_mtex[a]) {
- _mtex[a] = mtex;
- return 0;
- }
- }
- return -1; /* no free slots */
- }
-
- /*! assigns a node tree (of new shading nodes) to define textures. */
- inline void setNodeTree(bNodeTree *iNodeTree)
- {
- _nodeTree = iNodeTree;
- }
-
- /*! sets the flag telling whether this stroke is using a texture with tips or not. */
- inline void setTips(bool iTips)
- {
- _tips = iTips;
- }
-
- inline void push_back(StrokeVertex *iVertex)
- {
- _Vertices.push_back(iVertex);
- }
-
- inline void push_front(StrokeVertex *iVertex)
- {
- _Vertices.push_front(iVertex);
- }
-
- inline void AddViewEdge(ViewEdge *iViewEdge)
- {
- _ViewEdges.push_back(iViewEdge);
- }
-
- inline void setBeginningOrientation(const Vec2r& iOrientation)
- {
- _extremityOrientations[0] = iOrientation;
- }
-
- inline void setBeginningOrientation(real x, real y)
- {
- _extremityOrientations[0] = Vec2r(x, y);
- }
-
- inline void setEndingOrientation(const Vec2r& iOrientation)
- {
- _extremityOrientations[1] = iOrientation;
- }
-
- inline void setEndingOrientation(real x, real y)
- {
- _extremityOrientations[1] = Vec2r(x, y);
- }
-
- /* Information access interface */
-
- // embedding vertex iterator
- const_vertex_iterator vertices_begin() const;
- vertex_iterator vertices_begin(float t = 0.0f);
- const_vertex_iterator vertices_end() const;
- vertex_iterator vertices_end();
-
- /*! Returns a StrokeVertexIterator pointing on the first StrokeVertex of the Stroke. One can specify a sampling
- * value to resample the Stroke on the fly if needed.
- * \param t:
- * The resampling value with which we want our Stroke to be resampled.
- * If 0 is specified, no resampling is done.
- */
- StrokeInternal::StrokeVertexIterator strokeVerticesBegin(float t = 0.0f);
-
- /*! Returns a StrokeVertexIterator pointing after the last StrokeVertex of the Stroke. */
- StrokeInternal::StrokeVertexIterator strokeVerticesEnd();
-
- /*! Returns the number of StrokeVertex constituting the Stroke. */
- inline unsigned int strokeVerticesSize() const
- {
- return _Vertices.size();
- }
-
- /*! Returns the i-th StrokeVertex constituting the Stroke. */
- inline StrokeVertex& strokeVerticeAt(unsigned int i)
- {
- return *(_Vertices.at(i));
- }
-
- // Iterator access (Interface1D)
- /*! Returns an Interface0DIterator pointing on the first StrokeVertex of the Stroke. */
- virtual Interface0DIterator verticesBegin();
-
- /*! Returns an Interface0DIterator pointing after the last StrokeVertex of the Stroke. */
- virtual Interface0DIterator verticesEnd();
-
- virtual Interface0DIterator pointsBegin(float t = 0.0f);
- virtual Interface0DIterator pointsEnd(float t = 0.0f);
+class Stroke : public Interface1D {
+ public: // Implementation of Interface1D
+ /*! Returns the string "Stroke" */
+ virtual string getExactTypeName() const
+ {
+ return "Stroke";
+ }
+
+ // Data access methods
+
+ /*! Returns the Id of the Stroke */
+ virtual Id getId() const
+ {
+ return _id;
+ }
+
+ /*! The different blending modes available to similate the interaction media-medium. */
+ typedef enum {
+ DRY_MEDIUM, /*!< To simulate a dry medium such as Pencil or Charcoal.*/
+ HUMID_MEDIUM, /*!< To simulate ink painting (color subtraction blending).*/
+ OPAQUE_MEDIUM, /*!< To simulate an opaque medium (oil, spray...).*/
+ } MediumType;
+
+ public:
+ typedef std::deque<StrokeVertex *> vertex_container; // the vertices container
+ typedef std::vector<ViewEdge *> viewedge_container; // the viewedges container
+ typedef StrokeInternal::vertex_iterator_base<StrokeInternal::vertex_nonconst_traits>
+ vertex_iterator;
+ typedef StrokeInternal::vertex_iterator_base<StrokeInternal::vertex_const_traits>
+ const_vertex_iterator;
+
+ public:
+ //typedef StrokeVertex vertex_type;
+
+ private:
+ vertex_container _Vertices; //! The stroke's backbone vertices
+ Id _id;
+ float _Length; // The stroke length
+ viewedge_container _ViewEdges;
+ float _sampling;
+ float _textureStep;
+ // StrokeRenderer *_renderer; // mark implementation OpenGL renderer
+ MediumType _mediumType;
+ unsigned int _textureId;
+ MTex *_mtex[MAX_MTEX];
+ bNodeTree *_nodeTree;
+ bool _tips;
+ StrokeRep *_rep;
+ Vec2r _extremityOrientations[2]; // the orientations of the first and last extermity
+
+ public:
+ /*! default constructor */
+ Stroke();
+
+ /*! copy constructor */
+ Stroke(const Stroke &iBrother);
+
+ /*! Builds a stroke from a set of StrokeVertex.
+ * This constructor is templated by an iterator type.
+ * This iterator type must allow the vertices parsing using the ++ operator.
+ * \param iBegin:
+ * The iterator pointing to the first vertex.
+ * \param iEnd:
+ * The iterator pointing to the end of the vertex list.
+ */
+ template<class InputVertexIterator> Stroke(InputVertexIterator iBegin, InputVertexIterator iEnd);
+
+ /*! Destructor */
+ virtual ~Stroke();
+
+ /* operators */
+ /*! operator = */
+ Stroke &operator=(const Stroke &iBrother);
+
+ /*! Compute the sampling needed to get iNVertices vertices.
+ * If the specified number of vertices is less than the actual number of vertices, the actual sampling value
+ * is returned. (To remove Vertices, use the RemoveVertex() method of this class).
+ * \param iNVertices:
+ * The number of StrokeVertices we eventually want in our Stroke.
+ * \return the sampling that must be used in the Resample(float) method.
+ * \see Resample(int)
+ * \see Resample(float)
+ */
+ float ComputeSampling(int iNVertices);
+
+ /*! Resampling method.
+ * Resamples the curve so that it eventually has iNPoints. That means it is going to add iNPoints-vertices_size,
+ * if vertices_size is the number of points we already have.
+ * If vertices_size >= iNPoints, no resampling is done.
+ * \param iNPoints:
+ * The number of vertices we eventually want in our stroke.
+ */
+ int Resample(int iNPoints);
+
+ /*! Resampling method.
+ * Resamples the curve with a given sampling.
+ * If this sampling is < to the actual sampling value, no resampling is done.
+ * \param iSampling:
+ * The new sampling value.
+ */
+ int Resample(float iSampling);
+
+ /*! Removes all vertices from the Stroke.
+ */
+ void RemoveAllVertices();
+
+ /*! Removes the stroke vertex iVertex
+ * from the stroke.
+ * The length and curvilinear abscissa are updated
+ * consequently.
+ */
+ void RemoveVertex(StrokeVertex *iVertex);
+
+ /*! Inserts the stroke vertex iVertex in the stroke before next.
+ * The length, curvilinear abscissa are updated consequently.
+ * \param iVertex:
+ * The StrokeVertex to insert in the Stroke.
+ * \param next:
+ * A StrokeVertexIterator pointing to the StrokeVeretx before which iVertex must be inserted.
+ */
+ void InsertVertex(StrokeVertex *iVertex, StrokeInternal::StrokeVertexIterator next);
+
+ /*! Updates the 2D length of the Stroke */
+ void UpdateLength();
+
+ /* Render method */
+ void ScaleThickness(float iFactor);
+ void Render(const StrokeRenderer *iRenderer);
+ void RenderBasic(const StrokeRenderer *iRenderer);
+
+ /* Iterator definition */
+
+ /* accessors */
+ /*! Returns the 2D length of the Stroke */
+ inline real getLength2D() const
+ {
+ return _Length;
+ }
+
+ /*! Returns a reference to the time stamp value of the stroke. */
+ /*! Returns the MediumType used for this Stroke. */
+ inline MediumType getMediumType() const
+ {
+ return _mediumType;
+ }
+
+ /*! Returns the id of the texture used to simulate th marks system for this Stroke */
+ inline unsigned int getTextureId()
+ {
+ return _textureId;
+ }
+
+ /*! Returns the spacing of texture coordinates along the stroke lenght */
+ inline float getTextureStep()
+ {
+ return _textureStep;
+ }
+
+ /*! Returns the texture used at given index to simulate the marks system for this Stroke */
+ inline MTex *getMTex(int idx)
+ {
+ return _mtex[idx];
+ }
+
+ /*! Return the shader node tree to define textures. */
+ inline bNodeTree *getNodeTree()
+ {
+ return _nodeTree;
+ }
+
+ /*! Returns true if this Stroke has textures assigned, false otherwise. */
+ inline bool hasTex() const
+ {
+ return (_mtex[0] != NULL) || _nodeTree;
+ }
+
+ /*! Returns true if this Stroke uses a texture with tips, false otherwise. */
+ inline bool hasTips() const
+ {
+ return _tips;
+ }
+
+ /* these advanced iterators are used only in C++ */
+ inline int vertices_size() const
+ {
+ return _Vertices.size();
+ }
+
+ inline viewedge_container::const_iterator viewedges_begin() const
+ {
+ return _ViewEdges.begin();
+ }
+
+ inline viewedge_container::iterator viewedges_begin()
+ {
+ return _ViewEdges.begin();
+ }
+
+ inline viewedge_container::const_iterator viewedges_end() const
+ {
+ return _ViewEdges.end();
+ }
+
+ inline viewedge_container::iterator viewedges_end()
+ {
+ return _ViewEdges.end();
+ }
+
+ inline int viewedges_size() const
+ {
+ return _ViewEdges.size();
+ }
+
+ inline Vec2r getBeginningOrientation() const
+ {
+ return _extremityOrientations[0];
+ }
+
+ inline real getBeginningOrientationX() const
+ {
+ return _extremityOrientations[0].x();
+ }
+
+ inline real getBeginningOrientationY() const
+ {
+ return _extremityOrientations[0].y();
+ }
+
+ inline Vec2r getEndingOrientation() const
+ {
+ return _extremityOrientations[1];
+ }
+
+ inline real getEndingOrientationX() const
+ {
+ return _extremityOrientations[1].x();
+ }
+
+ inline real getEndingOrientationY() const
+ {
+ return _extremityOrientations[1].y();
+ }
+
+ /* modifiers */
+ /*! sets the Id of the Stroke. */
+ inline void setId(const Id &id)
+ {
+ _id = id;
+ }
+
+ /*! sets the 2D length of the Stroke. */
+ void setLength(float iLength);
+
+ /*! sets the medium type that must be used for this Stroke. */
+ inline void setMediumType(MediumType iType)
+ {
+ _mediumType = iType;
+ }
+
+ /*! sets the texture id to be used to simulate the marks system for this Stroke. */
+ inline void setTextureId(unsigned int id)
+ {
+ _textureId = id;
+ }
+
+ /*! sets the spacing of texture coordinates along the stroke lenght. */
+ inline void setTextureStep(float step)
+ {
+ _textureStep = step;
+ }
+
+ /*! assigns a blender texture to the first available slot. */
+ inline int setMTex(MTex *mtex)
+ {
+ for (int a = 0; a < MAX_MTEX; a++) {
+ if (!_mtex[a]) {
+ _mtex[a] = mtex;
+ return 0;
+ }
+ }
+ return -1; /* no free slots */
+ }
+
+ /*! assigns a node tree (of new shading nodes) to define textures. */
+ inline void setNodeTree(bNodeTree *iNodeTree)
+ {
+ _nodeTree = iNodeTree;
+ }
+
+ /*! sets the flag telling whether this stroke is using a texture with tips or not. */
+ inline void setTips(bool iTips)
+ {
+ _tips = iTips;
+ }
+
+ inline void push_back(StrokeVertex *iVertex)
+ {
+ _Vertices.push_back(iVertex);
+ }
+
+ inline void push_front(StrokeVertex *iVertex)
+ {
+ _Vertices.push_front(iVertex);
+ }
+
+ inline void AddViewEdge(ViewEdge *iViewEdge)
+ {
+ _ViewEdges.push_back(iViewEdge);
+ }
+
+ inline void setBeginningOrientation(const Vec2r &iOrientation)
+ {
+ _extremityOrientations[0] = iOrientation;
+ }
+
+ inline void setBeginningOrientation(real x, real y)
+ {
+ _extremityOrientations[0] = Vec2r(x, y);
+ }
+
+ inline void setEndingOrientation(const Vec2r &iOrientation)
+ {
+ _extremityOrientations[1] = iOrientation;
+ }
+
+ inline void setEndingOrientation(real x, real y)
+ {
+ _extremityOrientations[1] = Vec2r(x, y);
+ }
+
+ /* Information access interface */
+
+ // embedding vertex iterator
+ const_vertex_iterator vertices_begin() const;
+ vertex_iterator vertices_begin(float t = 0.0f);
+ const_vertex_iterator vertices_end() const;
+ vertex_iterator vertices_end();
+
+ /*! Returns a StrokeVertexIterator pointing on the first StrokeVertex of the Stroke. One can specify a sampling
+ * value to resample the Stroke on the fly if needed.
+ * \param t:
+ * The resampling value with which we want our Stroke to be resampled.
+ * If 0 is specified, no resampling is done.
+ */
+ StrokeInternal::StrokeVertexIterator strokeVerticesBegin(float t = 0.0f);
+
+ /*! Returns a StrokeVertexIterator pointing after the last StrokeVertex of the Stroke. */
+ StrokeInternal::StrokeVertexIterator strokeVerticesEnd();
+
+ /*! Returns the number of StrokeVertex constituting the Stroke. */
+ inline unsigned int strokeVerticesSize() const
+ {
+ return _Vertices.size();
+ }
+
+ /*! Returns the i-th StrokeVertex constituting the Stroke. */
+ inline StrokeVertex &strokeVerticeAt(unsigned int i)
+ {
+ return *(_Vertices.at(i));
+ }
+
+ // Iterator access (Interface1D)
+ /*! Returns an Interface0DIterator pointing on the first StrokeVertex of the Stroke. */
+ virtual Interface0DIterator verticesBegin();
+
+ /*! Returns an Interface0DIterator pointing after the last StrokeVertex of the Stroke. */
+ virtual Interface0DIterator verticesEnd();
+
+ virtual Interface0DIterator pointsBegin(float t = 0.0f);
+ virtual Interface0DIterator pointsEnd(float t = 0.0f);
#ifdef WITH_CXX_GUARDEDALLOC
- MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:Stroke")
+ MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:Stroke")
#endif
};
-
//
// Implementation
//
////////////////////////////////////////////////////////
-
template<class InputVertexIterator>
Stroke::Stroke(InputVertexIterator iBegin, InputVertexIterator iEnd)
{
- for (InputVertexIterator v = iBegin, vend = iEnd; v != vend; v++) {
- _Vertices.push_back(*v);
- }
- _Length = 0;
- _id = 0;
+ for (InputVertexIterator v = iBegin, vend = iEnd; v != vend; v++) {
+ _Vertices.push_back(*v);
+ }
+ _Length = 0;
+ _id = 0;
}
} /* namespace Freestyle */
-#endif // __FREESTYLE_STROKE_H__
+#endif // __FREESTYLE_STROKE_H__