soc-2008-mxcurioni: first version of lib3ds code. It does NOT work yet and has to...
[blender.git] / source / blender / freestyle / intern / stroke / StrokeTesselator.cpp
1
2 //
3 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
4 //   with this source distribution. 
5 //
6 //  This program is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU General Public License
8 //  as published by the Free Software Foundation; either version 2
9 //  of the License, or (at your option) any later version.
10 //
11 //  This program is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 //  GNU General Public License for more details.
15 //
16 //  You should have received a copy of the GNU General Public License
17 //  along with this program; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 //
20 ///////////////////////////////////////////////////////////////////////////////
21
22 #include "../scene_graph/OrientedLineRep.h"
23 #include "../scene_graph/NodeGroup.h"
24 #include "../scene_graph/NodeShape.h"
25 #include "StrokeTesselator.h"
26 #include "StrokeAdvancedIterators.h"
27
28 LineRep* StrokeTesselator::Tesselate(Stroke *iStroke)
29 {
30   if(0 == iStroke)
31     return 0;
32
33   LineRep* line;
34   line = new OrientedLineRep();
35   
36   Stroke::vertex_iterator v,vend;
37   if(2 == iStroke->vertices_size())
38   {
39     line->setStyle(LineRep::LINES);
40     v = iStroke->vertices_begin();
41     StrokeVertex *svA= (*v);
42     v++;
43     StrokeVertex *svB = (*v);
44     Vec3r A((*svA)[0], (*svA)[1], 0);
45     Vec3r B((*svB)[0], (*svB)[1], 0);
46     line->AddVertex(A);
47     line->AddVertex(B);
48   }
49   else
50   {
51     if(_overloadFrsMaterial)
52       line->setFrsMaterial(_FrsMaterial);
53
54     line->setStyle(LineRep::LINE_STRIP);
55
56     for(v=iStroke->vertices_begin(), vend=iStroke->vertices_end();
57     v!=vend;
58     v++)
59     {
60       StrokeVertex *sv= (*v);
61       Vec3r V((*sv)[0], (*sv)[1], 0);
62       line->AddVertex(V);         
63     } 
64   }
65   line->setId(iStroke->getId());
66   line->ComputeBBox();
67
68   return line;
69 }
70
71 template<class StrokeVertexIterator>
72 NodeGroup* StrokeTesselator::Tesselate(StrokeVertexIterator begin, StrokeVertexIterator end) 
73 {
74   NodeGroup *group = new NodeGroup;
75   NodeShape *tshape = new NodeShape;
76   group->AddChild(tshape);
77   //tshape->material().setDiffuse(0.f, 0.f, 0.f, 1.f);
78   tshape->setFrsMaterial(_FrsMaterial);
79
80   for(StrokeVertexIterator c=begin, cend=end;
81   c!=cend;
82   c++)
83   {  
84       tshape->AddRep(Tesselate((*c)));
85   }
86   
87   return group;
88 }