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
|
//
// Filename : StrokeShader.h
// Author(s) : Stephane Grabli, Emmanuel Turquin
// Purpose : Class defining StrokeShader
// Date of creation : 01/07/2003
//
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) : Please refer to the COPYRIGHT file distributed
// with this source distribution.
//
// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef SHADERS_H
# define SHADERS_H
# include <iostream>
# include <vector>
//
// StrokeShader base class
//
//////////////////////////////////////////////////////
class Stroke;
/*! Base class for Stroke Shaders.
* Any Stroke Shader must inherit from
* this class and overload the shade() method.
* A StrokeShader is designed to modify any
* Stroke's attribute such as Thickness, Color,
* Geometry, Texture, Blending mode...
* The basic way to achieve this operation consists
* in iterating over the StrokeVertices of the Stroke
* and to modify each one's StrokeAttribute.
* Here is a python code example of such an iteration:
* \code
* it = ioStroke.strokeVerticesBegin()
* while it.isEnd() == 0:
* att = it.getObject().attribute()
* ## perform here any attribute modification
* it.increment()
* \endcode
* Here is a C++ code example of such an iteration:
* \code
* for(StrokeInternal::StrokeVertexIterator v=ioStroke.strokeVerticesBegin(), vend=ioStroke.strokeVerticesEnd();
* v!=vend;
* ++v){
* StrokeAttribute& att = v->attribute();
* // perform any attribute modification here...
* }
* \endcode
*/
class LIB_STROKE_EXPORT StrokeShader
{
public:
/*! Default constructor. */
StrokeShader() {}
/*! Destructor. */
virtual ~StrokeShader() {}
/*! Returns the string corresponding to the
* shader's name.
*/
virtual string getName() const {
return "StrokeShader";
}
/*! The shading method. This method must
* be overloaded by inherited classes.
* The shading method is designed to modify any
* Stroke's attribute such as Thickness, Color,
* Geometry, Texture, Blending mode...
* The basic way to achieve this operation consists
* in iterating over the StrokeVertices of the Stroke
* and to modify each one's StrokeAttribute.
* Here is a python code example of such an iteration:
* \code
* it = ioStroke.strokeVerticesBegin()
* while it.isEnd() == 0:
* att = it.getObject().attribute()
* ## perform here any attribute modification
* it.increment()
* \endcode
* Here is a C++ code example of such an iteration:
* \code
* for(StrokeInternal::StrokeVertexIterator v=ioStroke.strokeVerticesBegin(), vend=ioStroke.strokeVerticesEnd();
* v!=vend;
* ++v){
* StrokeAttribute& att = v->attribute();
* // perform any attribute modification here...
* }
* \endcode
* \param ioStroke
* The stroke we wish to shade. this Stroke
* is modified by the Shader (which typically
* modifies the Stroke's attribute's values such
* as Color, Thickness, Geometry...)
*/
virtual void shade(Stroke& ioStroke) const {
cerr << "Warning: method shade() not implemented" << endl;
}
};
# endif // SHADERS_H
|