soc-2008-mxcurioni: first version of lib3ds code. It does NOT work yet and has to...
[blender.git] / source / blender / freestyle / intern / scene_graph / LineRep.h
1 //
2 //  Filename         : LineRep.h
3 //  Author(s)        : Stephane Grabli
4 //  Purpose          : Class to define the representation of 3D Line.
5 //  Date of creation : 26/03/2002
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  LINEREP_H
31 # define LINEREP_H
32
33 # include <vector>
34 # include <list>
35 # include "Rep.h"
36 # include "../system/FreestyleConfig.h"
37
38 using namespace std;
39
40 /*! Base class for all lines objects */
41 class LIB_SCENE_GRAPH_EXPORT LineRep : public Rep
42 {
43 public:
44   
45   /*! Line description style */
46   enum LINES_STYLE{LINES, LINE_STRIP, LINE_LOOP};
47   inline LineRep() : Rep() {_width = 0.f;}
48
49   /*! Builds a single line from 2 vertices
50    *  v1
51    *    first vertex
52    *  v2
53    *    second vertex
54    */
55   inline LineRep(const Vec3r& v1, const Vec3r& v2)
56     : Rep()
57   {
58     setStyle(LINES);
59     AddVertex(v1);
60     AddVertex(v2);
61     _width = 0.f;
62   }
63
64   /*! Builds a line rep from a vertex chain */
65   inline LineRep(const vector<Vec3r>& vertices)
66     : Rep()
67   {
68     _vertices = vertices;
69     setStyle(LINE_STRIP);
70     _width = 0.f;
71   }
72
73   /*! Builds a line rep from a vertex chain */
74   inline LineRep(const list<Vec3r>& vertices)
75     : Rep()
76   {
77     for(list<Vec3r>::const_iterator v=vertices.begin(), end=vertices.end();
78     v!=end;
79     v++)
80     {
81       _vertices.push_back(*v);
82     }
83     setStyle(LINE_STRIP);
84     _width = 0.f;
85   }
86
87   virtual ~LineRep() 
88   {
89   _vertices.clear();
90   } 
91
92   /*! accessors */
93   inline const LINES_STYLE style() const {return _Style;}
94   inline const vector<Vec3r>& vertices() const {return _vertices;}
95   inline float width() const {return _width;}
96
97   /*! modifiers */
98   inline void setStyle(const LINES_STYLE iStyle) {_Style = iStyle;}
99   inline void AddVertex(const Vec3r& iVertex) {_vertices.push_back(iVertex);}
100   inline void setVertices(const vector<Vec3r>& iVertices)
101   {
102     if(0 != _vertices.size())
103     {
104       _vertices.clear();
105     }
106     for(vector<Vec3r>::const_iterator v=iVertices.begin(), end=iVertices.end();
107         v!=end;
108         v++)
109         {
110           _vertices.push_back(*v);
111         }
112   }
113   inline void setWidth(float iWidth) {_width=iWidth;}
114
115   /*! Accept the corresponding visitor */
116   virtual void accept(SceneVisitor& v) {
117     Rep::accept(v);
118     v.visitLineRep(*this);
119   }
120
121   /*! Computes the line bounding box.*/
122   virtual void ComputeBBox();
123
124 private:
125   LINES_STYLE _Style;
126   vector<Vec3r> _vertices;
127   float _width;
128 };
129
130 #endif // LINEREP_H