Merged changes in the trunk up to revision 28600.
[blender.git] / source / blender / freestyle / intern / stroke / StrokeShader.h
1 //
2 //  Filename         : StrokeShader.h
3 //  Author(s)        : Stephane Grabli, Emmanuel Turquin
4 //  Purpose          : Class defining StrokeShader
5 //  Date of creation : 01/07/2003
6 //
7 ///////////////////////////////////////////////////////////////////////////////
8
9
10 //
11 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
12 //   with this source distribution. 
13 //
14 //  This program is free software; you can redistribute it and/or
15 //  modify it under the terms of the GNU General Public License
16 //  as published by the Free Software Foundation; either version 2
17 //  of the License, or (at your option) any later version.
18 //
19 //  This program is distributed in the hope that it will be useful,
20 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
21 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 //  GNU General Public License for more details.
23 //
24 //  You should have received a copy of the GNU General Public License
25 //  along with this program; if not, write to the Free Software
26 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
27 //
28 ///////////////////////////////////////////////////////////////////////////////
29
30 #ifndef  SHADERS_H
31 # define SHADERS_H
32
33 # include <iostream>
34 # include <vector>
35
36 # include  "../python/Director.h"
37
38 //
39 //  StrokeShader base class
40 //
41 //////////////////////////////////////////////////////
42
43 class Stroke;
44 /*! Base class for Stroke Shaders.
45  *  Any Stroke Shader must inherit from
46  *  this class and overload the shade() method.
47  *  A StrokeShader is designed to modify any
48  *  Stroke's attribute such as Thickness, Color,
49  *  Geometry, Texture, Blending mode...
50  *  The basic way to achieve this operation consists
51  *  in iterating over the StrokeVertices of the Stroke
52  *  and to modify each one's StrokeAttribute.
53  *  Here is a python code example of such an iteration:
54  *  \code
55  *  it = ioStroke.strokeVerticesBegin()
56  *  while it.isEnd() == 0:
57  *      att = it.getObject().attribute()
58  *      ## perform here any attribute modification
59  *      it.increment()
60  *  \endcode
61  *  Here is a C++ code example of such an iteration:
62  *  \code
63  *  for(StrokeInternal::StrokeVertexIterator v=ioStroke.strokeVerticesBegin(), vend=ioStroke.strokeVerticesEnd();
64  *      v!=vend;
65  *      ++v){
66  *    StrokeAttribute& att = v->attribute();
67  *    // perform any attribute modification here...
68  *  }
69  *  \endcode
70  */
71 class LIB_STROKE_EXPORT StrokeShader
72 {
73 public:
74         
75         PyObject *py_ss;
76         
77   /*! Default constructor. */
78         StrokeShader() { py_ss = 0; }
79   /*! Destructor. */
80   virtual ~StrokeShader() {}
81   /*! Returns the string corresponding to the
82    *  shader's name.
83    */
84   virtual string getName() const {
85         return "StrokeShader";
86   }
87   /*! The shading method. This method must
88    *  be overloaded by inherited classes.
89    *  The shading method is designed to modify any
90    *  Stroke's attribute such as Thickness, Color,
91    *  Geometry, Texture, Blending mode...
92    *  The basic way to achieve this operation consists
93    *  in iterating over the StrokeVertices of the Stroke
94    *  and to modify each one's StrokeAttribute.
95    *  Here is a python code example of such an iteration:
96    *  \code
97    *  it = ioStroke.strokeVerticesBegin()
98    *  while it.isEnd() == 0:
99    *      att = it.getObject().attribute()
100    *      ## perform here any attribute modification
101    *      it.increment()
102    *  \endcode
103    *  Here is a C++ code example of such an iteration:
104    *  \code
105    *  for(StrokeInternal::StrokeVertexIterator v=ioStroke.strokeVerticesBegin(), vend=ioStroke.strokeVerticesEnd();
106    *    v!=vend;
107    *    ++v){
108    *    StrokeAttribute& att = v->attribute();
109    *    // perform any attribute modification here...
110    *  }
111    *  \endcode
112    *  \param ioStroke
113    *    The stroke we wish to shade. this Stroke
114    *    is modified by the Shader (which typically
115    *    modifies the Stroke's attribute's values such
116    *    as Color, Thickness, Geometry...)
117    */
118   virtual int shade(Stroke& ioStroke) const {
119         return Director_BPy_StrokeShader_shade( const_cast<StrokeShader *>(this), ioStroke );
120   }
121
122 };
123
124 # endif // SHADERS_H