1 /*
2 This file is part of the VRender library.
3 Copyright (C) 2005 Cyril Soler (Cyril.Soler@imag.fr)
4 Version 1.0.0, released on June 27, 2005.
5
6 http://artis.imag.fr/Members/Cyril.Soler/VRender
7
8 VRender is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 VRender is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with VRender; if not, write to the Free Software Foundation, Inc.,
20 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
21 */
22
23 /****************************************************************************
24
25 Copyright (C) 2002-2014 Gilles Debunne. All rights reserved.
26
27 This file is part of the QGLViewer library version 2.6.3.
28
29 http://www.libqglviewer.com - contact@libqglviewer.com
30
31 This file may be used under the terms of the GNU General Public License
32 versions 2.0 or 3.0 as published by the Free Software Foundation and
33 appearing in the LICENSE file included in the packaging of this file.
34 In addition, as a special exception, Gilles Debunne gives you certain
35 additional rights, described in the file GPL_EXCEPTION in this package.
36
37 libQGLViewer uses dual licensing. Commercial/proprietary software must
38 purchase a libQGLViewer Commercial License.
39
40 This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
41 WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
42
43 *****************************************************************************/
44
45 #include "Exporter.h"
46 #include "math.h"
47
48 using namespace vrender ;
49 using namespace std ;
50
FigCoordX(double x) const51 int FIGExporter::FigCoordX(double x) const
52 {
53 float MaxX = 12000 ;
54 float MaxY = MaxX * _sizeY/(float)_sizeX ;
55
56 if(MaxY > 7000)
57 {
58 MaxX *= 7000/(float)MaxY ;
59 MaxY = 7000 ;
60 }
61
62 return int(0.5f + x/_sizeX*MaxX) ;
63 }
64
FigCoordY(double y) const65 int FIGExporter::FigCoordY(double y) const
66 {
67 float MaxX = 12000 ;
68 float MaxY = MaxX * _sizeY/(float)_sizeX ;
69
70 if(MaxY > 7000)
71 {
72 MaxX *= 7000/(float)MaxY ;
73 MaxY = 7000 ;
74 }
75
76 return int(0.5f + (1.0 - y/_sizeY)*MaxY) ;
77 }
78
FigGrayScaleIndex(float red,float green,float blue) const79 int FIGExporter::FigGrayScaleIndex(float red, float green, float blue) const
80 {
81 float intensity = 0.3f*red+0.6f*green+0.1f*blue ;
82
83 return int(intensity * 20.0) ;
84 }
85
FIGExporter()86 FIGExporter::FIGExporter()
87 {
88 }
89
writeHeader(QTextStream & out) const90 void FIGExporter::writeHeader(QTextStream& out) const
91 {
92 out << "#FIG 3.2\nPortrait\nCenter\nInches\nLetter\n100.00\nSingle\n0\n1200 2\n";
93 _depth = 999 ;
94 _sizeX = int(0.5f + _xmax - _xmin) ;
95 _sizeY = int(0.5f + _ymax - _ymin) ;
96 }
97
writeFooter(QTextStream & out) const98 void FIGExporter::writeFooter(QTextStream& out) const
99 {
100 Q_UNUSED(out);
101 }
102
spewPoint(const Point * P,QTextStream & out)103 void FIGExporter::spewPoint(const Point *P, QTextStream& out)
104 {
105 out << "2 1 0 5 0 7 " << (_depth--) << " 0 -1 0.000 0 1 -1 0 0 1\n";
106
107 out << "\t " << FigCoordX(P->vertex(0)[0]) << " " << FigCoordY(P->vertex(0)[1]) << "\n";
108 if(_depth > 0) _depth = 0 ;
109 }
110
spewSegment(const Segment * S,QTextStream & out)111 void FIGExporter::spewSegment(const Segment *S, QTextStream& out)
112 {
113 const Feedback3DColor& P1 = Feedback3DColor(S->sommet3DColor(0)) ;
114 const Feedback3DColor& P2 = Feedback3DColor(S->sommet3DColor(1)) ;
115
116 GLdouble dx, dy;
117 GLfloat dr, dg, db, absR, absG, absB, colormax;
118 int steps;
119 GLdouble xstep, ystep;
120 GLfloat rstep, gstep, bstep;
121 GLdouble xnext, ynext, distance;
122 GLfloat rnext, gnext, bnext;
123
124 dr = P2.red() - P1.red();
125 dg = P2.green() - P1.green();
126 db = P2.blue() - P1.blue();
127
128 if (dr != 0 || dg != 0 || db != 0)
129 {
130 /* Smooth shaded line. */
131
132 dx = P2.x() - P1.x();
133 dy = P2.y() - P1.y();
134
135 distance = sqrt(dx * dx + dy * dy);
136
137 absR = fabs(dr);
138 absG = fabs(dg);
139 absB = fabs(db);
140
141 colormax = max(absR, max(absG, absB));
142 steps = int(0.5f + max(1.0, colormax * distance * EPS_SMOOTH_LINE_FACTOR));
143
144 xstep = dx / steps;
145 ystep = dy / steps;
146
147 rstep = dr / steps;
148 gstep = dg / steps;
149 bstep = db / steps;
150
151 xnext = P1.x();
152 ynext = P1.y();
153 rnext = P1.red();
154 gnext = P1.green();
155 bnext = P1.blue();
156
157 /* Back up half a step; we want the end points to be
158 exactly the their endpoint colors. */
159
160 xnext -= xstep / 2.0;
161 ynext -= ystep / 2.0;
162 rnext -= rstep / 2.0f;
163 gnext -= gstep / 2.0f;
164 bnext -= bstep / 2.0f;
165 }
166 else
167 {
168 /* Single color line. */
169 steps = 0;
170 }
171
172 out << "2 1 0 1 0 7 " << (_depth--) << " 0 -1 0.000 0 0 -1 0 0 2\n";
173 out << "\t " << FigCoordX(P1.x()) << " " << FigCoordY(P1.y());
174
175 out << " " << FigCoordX(P2.x()) << " " << FigCoordY(P2.y())<< "\n";
176 if(_depth > 0) _depth = 0 ;
177 }
178
spewPolygone(const Polygone * P,QTextStream & out)179 void FIGExporter::spewPolygone(const Polygone *P, QTextStream& out)
180 {
181 int nvertices;
182 GLfloat red, green, blue;
183
184 nvertices = P->nbVertices() ;
185
186 Feedback3DColor vertex(P->sommet3DColor(0)) ;
187
188 if (nvertices > 0)
189 {
190 red = 0 ;
191 green = 0 ;
192 blue = 0 ;
193
194 for(int i = 0; i < nvertices; i++)
195 {
196 red += P->sommet3DColor(i).red() ;
197 green += P->sommet3DColor(i).green() ;
198 blue += P->sommet3DColor(i).blue() ;
199 }
200
201 red /= nvertices ;
202 green /= nvertices ;
203 blue /= nvertices ;
204
205 /* Flat shaded polygon; all vertex colors the same. */
206
207 if(_blackAndWhite)
208 out << "2 3 0 0 0 7 " << (_depth--) << " 0 20 0.000 0 0 -1 0 0 " << (nvertices+1) << "\n";
209 else
210 out << "2 3 0 0 0 7 " << (_depth--) << " 0 " << (FigGrayScaleIndex(red,green,blue)) << " 0.000 0 0 -1 0 0 " << (nvertices+1) << "\n";
211
212 /* Draw a filled triangle. */
213
214 out << "\t";
215
216 for (int j = 0; j < nvertices; j++)
217 out << " " << FigCoordX(P->sommet3DColor(j).x()) << " " << FigCoordY(P->sommet3DColor(j).y());
218
219 out << " " << FigCoordX(P->sommet3DColor(0).x()) << " " << FigCoordY(P->sommet3DColor(0).y()) << "\n";
220 }
221
222 if(_depth > 0) _depth = 0 ;
223 }
224
225
226