"Fossies" - the Fresh Open Source Software Archive 
Member "mathmod-11.1/ui_modules/mathmod.cpp" (17 Jun 2021, 78777 Bytes) of package /linux/misc/mathmod-11.1-source.zip:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
1 /***************************************************************************
2 * Copyright (C) 2021 by Abderrahman Taha *
3 * *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
19 ***************************************************************************/
20 #include "mathmod.h"
21
22 void MathMod::CalculateTexturePoints(int type)
23 {
24 double tmp, val[6]={0,0,0,0,0,0};
25 uint Jprime;
26 if (type == 1)
27 {
28 LocalScene.componentsinfos.ThereisRGBA[0] = true;
29 LocalScene.componentsinfos.NoiseParam[0].NoiseType = 1;
30 LocalScene.componentsinfos.NoiseParam[0].RgbtParser =
31 IsoObjet->masterthread->RgbtParser;
32 LocalScene.componentsinfos.NoiseParam[0].NoiseParser =
33 IsoObjet->masterthread->NoiseParser;
34 IsoObjet->masterthread->Noise == ""
35 ? LocalScene.componentsinfos.NoiseParam[0].NoiseShape = 0
36 : LocalScene.componentsinfos.NoiseParam[0].NoiseShape = 1;
37 }
38 if (type == 0)
39 {
40 LocalScene.componentsinfos.ThereisRGBA[0] = true;
41 LocalScene.componentsinfos.NoiseParam[0].NoiseType = 1;
42 LocalScene.componentsinfos.NoiseParam[0].RgbtParser =
43 ParObjet->masterthread->RgbtParser;
44 LocalScene.componentsinfos.NoiseParam[0].NoiseParser =
45 ParObjet->masterthread->NoiseParser;
46 ParObjet->masterthread->Noise == ""
47 ? LocalScene.componentsinfos.NoiseParam[0].NoiseShape = 0
48 : LocalScene.componentsinfos.NoiseParam[0].NoiseShape = 1;
49 }
50 for (uint i = 0; i < LocalScene.VertxNumber; i++)
51 {
52 val[0] = difMaximum *
53 double(LocalScene.ArrayNorVer_localPt[i * 10 + 7]) /
54 hauteur_fenetre -
55 decalage_xo;
56 val[1] = difMaximum *
57 double(LocalScene.ArrayNorVer_localPt[i * 10 + 8]) /
58 hauteur_fenetre -
59 decalage_yo;
60 val[2] = difMaximum *
61 double(LocalScene.ArrayNorVer_localPt[i * 10 + 9]) /
62 hauteur_fenetre -
63 decalage_zo;
64 if (type != 1)
65 {
66 Jprime = (i) % (ParObjet->Vgrid);
67 val[3] = double(Jprime) / double(ParObjet->Vgrid);
68 val[3] = val[3] * ParObjet->masterthread->dif_u[0] +
69 ParObjet->masterthread->u_inf[0];
70 Jprime = (i) / (ParObjet->Ugrid);
71 val[4] = double(Jprime) / double(ParObjet->Ugrid);
72 val[4] = val[4] * ParObjet->masterthread->dif_v[0] +
73 ParObjet->masterthread->v_inf[0];
74 }
75 if (LocalScene.componentsinfos.NoiseParam[0].NoiseShape != 0)
76 {
77 tmp = LocalScene.componentsinfos.NoiseParam[0].NoiseParser->Eval(val);
78 }
79 else
80 {
81 tmp = 1.0;
82 }
83 val[0] *= tmp;
84 val[1] *= tmp;
85 val[2] *= tmp;
86 // val[3] and val[4] uninitialized!
87 val[3] *= tmp;
88 val[4] *= tmp;
89 LocalScene.ArrayNorVer_localPt[i * 10] =
90 float(LocalScene.componentsinfos.NoiseParam[0].RgbtParser[0].Eval(val));
91 LocalScene.ArrayNorVer_localPt[i * 10 + 1] =
92 float(LocalScene.componentsinfos.NoiseParam[0].RgbtParser[1].Eval(val));
93 LocalScene.ArrayNorVer_localPt[i * 10 + 2] =
94 float(LocalScene.componentsinfos.NoiseParam[0].RgbtParser[2].Eval(val));
95 LocalScene.ArrayNorVer_localPt[i * 10 + 3] =
96 float(LocalScene.componentsinfos.NoiseParam[0].RgbtParser[3].Eval(val));
97 }
98 }
99
100 void MathMod::CalculatePigmentPoints(int type)
101 {
102 double tmp, ValCol[100], val[4];
103 if (type == 1)
104 {
105 LocalScene.componentsinfos.ThereisRGBA[0] = true;
106 LocalScene.componentsinfos.NoiseParam[0].NoiseType = 0; // Pigments
107 LocalScene.componentsinfos.NoiseParam[0].VRgbtParser =
108 IsoObjet->masterthread->VRgbtParser;
109 LocalScene.componentsinfos.NoiseParam[0].GradientParser =
110 IsoObjet->masterthread->GradientParser;
111 LocalScene.componentsinfos.NoiseParam[0].Nb_vrgbts =
112 IsoObjet->masterthread->VRgbtSize;
113 LocalScene.componentsinfos.NoiseParam[0].NoiseParser =
114 IsoObjet->masterthread->NoiseParser;
115 IsoObjet->masterthread->Noise == ""
116 ? LocalScene.componentsinfos.NoiseParam[0].NoiseShape = 0
117 : LocalScene.componentsinfos.NoiseParam[0].NoiseShape = 1;
118 }
119 if (type == 0)
120 {
121 LocalScene.componentsinfos.ThereisRGBA[0] = true;
122 LocalScene.componentsinfos.NoiseParam[0].NoiseType = 0; // Pigments
123 LocalScene.componentsinfos.NoiseParam[0].VRgbtParser =
124 ParObjet->masterthread->VRgbtParser;
125 LocalScene.componentsinfos.NoiseParam[0].GradientParser =
126 ParObjet->masterthread->GradientParser;
127 LocalScene.componentsinfos.NoiseParam[0].Nb_vrgbts =
128 ParObjet->masterthread->VRgbtSize;
129 LocalScene.componentsinfos.NoiseParam[0].NoiseParser =
130 ParObjet->masterthread->NoiseParser;
131 ParObjet->masterthread->Noise == ""
132 ? LocalScene.componentsinfos.NoiseParam[0].NoiseShape = 0
133 : LocalScene.componentsinfos.NoiseParam[0].NoiseShape = 1;
134 }
135 for (uint i = 0;
136 i < LocalScene.componentsinfos.NoiseParam[0].Nb_vrgbts && i < 100; i++)
137 {
138 ValCol[i] =
139 LocalScene.componentsinfos.NoiseParam[0].VRgbtParser[i].Eval(val);
140 }
141 for (uint i = 0; i < LocalScene.VertxNumber; i++)
142 {
143 val[0] = difMaximum *
144 double(LocalScene.ArrayNorVer_localPt[i * 10 + 7]) /
145 hauteur_fenetre -
146 decalage_xo;
147 val[1] = difMaximum *
148 double(LocalScene.ArrayNorVer_localPt[i * 10 + 8]) /
149 hauteur_fenetre -
150 decalage_yo;
151 val[2] = difMaximum *
152 double(LocalScene.ArrayNorVer_localPt[i * 10 + 9]) /
153 hauteur_fenetre -
154 decalage_zo;
155 if (LocalScene.componentsinfos.NoiseParam[0].NoiseShape != 0)
156 tmp = LocalScene.componentsinfos.NoiseParam[0].NoiseParser->Eval(val);
157 else
158 tmp = 1.0;
159 val[0] *= tmp;
160 val[1] *= tmp;
161 val[2] *= tmp;
162 tmp = LocalScene.componentsinfos.NoiseParam[0].GradientParser->Eval(val);
163 int c = int(tmp);
164 tmp = std::abs(tmp - double(c));
165 for (uint j = 0;
166 j < LocalScene.componentsinfos.NoiseParam[0].Nb_vrgbts && j < 100;
167 j += 5)
168 if (tmp <= ValCol[j])
169 {
170 LocalScene.ArrayNorVer_localPt[i*10 ] = float(ValCol[j+1]);
171 LocalScene.ArrayNorVer_localPt[i*10+1] = float(ValCol[j+2]);
172 LocalScene.ArrayNorVer_localPt[i*10+2] = float(ValCol[j+3]);
173 LocalScene.ArrayNorVer_localPt[i*10+3] = float(ValCol[j+4]);
174 j = 100;
175 }
176 }
177 }
178
179 int MathMod::memoryallocation(uint nbthreads,
180 uint initparGrid, uint initisoGrid,
181 uint FactX, uint FactY, uint FactZ)
182 {
183 try
184 {
185 IsoObjet = new Iso3D(nbthreads, initisoGrid, FactX, FactY, FactZ);
186 ParObjet = new Par3D(nbthreads, initparGrid);
187 return 1;
188 }
189 catch (std::bad_alloc &)
190 {
191 message.setText("Not enough memory available to complete this operation");
192 message.adjustSize();
193 message.exec();
194 return -1;
195 }
196 }
197
198 void MathMod::SaveSceneAsObjPoly(int type)
199 {
200 int startpl = 0;
201 uint actualpointindice;
202 QString fileName = QFileDialog::getSaveFileName(this, tr("Save OBJ file"), "",
203 tr("OBJ Files (*.obj)"));
204 QFile data(fileName);
205 if (data.open(QFile::ReadWrite | QFile::Truncate))
206 {
207 QTextStream stream(&data);
208 stream.setRealNumberNotation(QTextStream::FixedNotation);
209 stream.setRealNumberPrecision(3);
210 // save vertices:
211 if (type == 1)
212 {
213 for (uint i = 0; i < LocalScene.VertxNumber; i++)
214 {
215 (stream) << "v "
216 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 7]) *
217 (difMaximum*factx/ hauteur_fenetre) - decalage_xo)
218 << " "
219 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 8]) *
220 (difMaximum*facty / hauteur_fenetre) - decalage_yo)
221 << " "
222 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 9]) *
223 (difMaximum*factz / hauteur_fenetre) - decalage_zo)
224 << " " << LocalScene.ArrayNorVer_localPt[10 * i] << " "
225 << LocalScene.ArrayNorVer_localPt[10 * i + 1] << " "
226 << LocalScene.ArrayNorVer_localPt[10 * i + 2] << "\n";
227 }
228 }
229 else
230 {
231 for (uint i = 0; i < LocalScene.VertxNumber; i++)
232 {
233 (stream) << "v "
234 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 7]) *
235 (difMaximum*factx / hauteur_fenetre) - decalage_xo)
236 << " "
237 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 8]) *
238 (difMaximum*facty / hauteur_fenetre) - decalage_yo)
239 << " "
240 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 9]) *
241 (difMaximum*factz / hauteur_fenetre) - decalage_zo)
242 << "\n";
243 }
244 }
245 // save faces:
246 uint paramcomp= LocalScene.componentsinfos.ParametricGrid.size();
247 if(LocalScene.typedrawing == 1)
248 {
249 startpl = LocalScene.PolyNumber;
250 for (uint i = 0; i < LocalScene.NbPolygnNbVertexPtMin; i++)
251 {
252 uint polysize = LocalScene.PolyIndices_localPtMin[i];
253 (stream) << "f";
254 for (uint j = 0; j < polysize; j++)
255 {
256 actualpointindice = LocalScene.PolyIndices_localPt[startpl++]+1;
257 (stream) << " " << actualpointindice;
258 }
259 (stream) << "\n";
260 }
261 }
262 else if(LocalScene.typedrawing == -1)
263 {
264 //**** Parametrics components ***/
265 uint ugrid=0;
266 uint vgrid =0;
267 uint index=0;
268 for (uint p = 0; p < paramcomp; p += 2)
269 {
270 ugrid=LocalScene.componentsinfos.ParametricGrid[p];
271 vgrid=LocalScene.componentsinfos.ParametricGrid[p+1];
272 for (uint i = 0; i < ugrid-1; i ++)
273 for (uint j = 0; j < vgrid-1; j ++)
274 {
275 (stream) << "f "
276 << " " << (i*vgrid + j+index) +1<< " "
277 << ((i+1)*vgrid + j +index) +1<< " "
278 << ((i+1)*vgrid + (j+1)+index) +1<< " "
279 << (i*vgrid + (j+1)+index) +1<< "\n";
280 }
281 index += ugrid*vgrid;
282 }
283 }
284 else
285 {
286 //**** Parametrics components ***/
287
288 uint ugrid=0;
289 uint vgrid =0;
290 uint index=0;
291 for (uint p = 0; p < paramcomp; p += 2)
292 {
293 ugrid=LocalScene.componentsinfos.ParametricGrid[p];
294 vgrid=LocalScene.componentsinfos.ParametricGrid[p+1];
295 for (uint i = 0; i < ugrid-1; i ++)
296 for (uint j = 0; j < vgrid-1; j ++)
297 {
298 (stream) << "f "
299 << " " << (i*vgrid + j+index) +1<< " "
300 << ((i+1)*vgrid + j +index) +1<< " "
301 << ((i+1)*vgrid + (j+1)+index) +1<< " "
302 << (i*vgrid + (j+1)+index) +1<< "\n";
303 }
304 index += ugrid*vgrid;
305 }
306
307 // Isosurfaces components
308 startpl = LocalScene.PolyNumber+LocalScene.componentsinfos.MinParametricMeshLines;
309 uint kl= LocalScene.componentsinfos.NbParametricMeshLines;
310 for (uint i = kl; i < LocalScene.NbPolygnNbVertexPtMin; i++)
311 {
312 uint polysize = LocalScene.PolyIndices_localPtMin[i];
313 (stream) << "f";
314 for (uint j = 0; j < polysize; j++)
315 {
316 actualpointindice = LocalScene.PolyIndices_localPt[startpl++]+1;
317 (stream) << " " << actualpointindice;
318 }
319 (stream) << "\n";
320 }
321
322 }
323 }
324 }
325
326 void MathMod::SaveSceneAsObjTrian(int type)
327 {
328 QString fileName = QFileDialog::getSaveFileName(this, tr("Save OBJ file"), "",
329 tr("OBJ Files (*.obj)"));
330 QFile data(fileName);
331 if (data.open(QFile::ReadWrite | QFile::Truncate))
332 {
333 uint i;
334 QTextStream stream(&data);
335 stream.setRealNumberNotation(QTextStream::FixedNotation);
336 stream.setRealNumberPrecision(3);
337 // save vertices:
338 if (type == 1)
339 {
340 for (i = 0; i < LocalScene.VertxNumber; i++)
341 {
342 (stream) << "v "
343 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 7]) *
344 (difMaximum*factx / hauteur_fenetre) - decalage_xo)
345 << " "
346 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 8]) *
347 (difMaximum*facty / hauteur_fenetre) - decalage_yo)
348 << " "
349 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 9]) *
350 (difMaximum*factz / hauteur_fenetre) - decalage_zo)
351 << " " << LocalScene.ArrayNorVer_localPt[10 * i] << " "
352 << LocalScene.ArrayNorVer_localPt[10 * i + 1] << " "
353 << LocalScene.ArrayNorVer_localPt[10 * i + 2] << "\n";
354 }
355 }
356 else
357 {
358 for (i = 0; i < LocalScene.VertxNumber; i++)
359 {
360 (stream) << "v "
361 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 7]) *
362 (difMaximum*factx / hauteur_fenetre) - decalage_xo)
363 << " "
364 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 8]) *
365 (difMaximum*facty / hauteur_fenetre) - decalage_yo)
366 << " "
367 << float(double(LocalScene.ArrayNorVer_localPt[10 * i + 9]) *
368 (difMaximum*factz / hauteur_fenetre) - decalage_zo)
369 << "\n";
370 }
371 }
372 for (i = 0; i < LocalScene.PolyNumber; i += 3)
373 {
374 (stream) << "f "
375 << " " << LocalScene.PolyIndices_localPt[i] + 1 << " "
376 << LocalScene.PolyIndices_localPt[i + 1] + 1 << " "
377 << LocalScene.PolyIndices_localPt[i + 2] + 1 << "\n";
378 }
379 }
380 }
381
382 MathMod::~MathMod()
383 {
384 delete (timer);
385 delete ParObjet;
386 delete IsoObjet;
387 }
388
389 void MathMod::PutObjectInsideCube()
390 {
391 minx = 999999999.0;
392 miny = 999999999.0;
393 minz = 999999999.0;
394 maxx = -999999999.0;
395 maxy = -999999999.0;
396 maxz = -999999999.0;
397 if ((LocalScene.morph != 1 ||
398 (LocalScene.morph == 1 && FistTimecalibrate == 1)) &&
399 LocalScene.slider != 1)
400 {
401 for (uint i = 0; i < LocalScene.VertxNumber; i++)
402 {
403 if (minx > LocalScene.ArrayNorVer_localPt[10 * i + 3 + 4])
404 minx = LocalScene.ArrayNorVer_localPt[10 * i + 3 + 4];
405 if (miny > LocalScene.ArrayNorVer_localPt[10 * i + 4 + 4])
406 miny = LocalScene.ArrayNorVer_localPt[10 * i + 4 + 4];
407 if (minz > LocalScene.ArrayNorVer_localPt[10 * i + 5 + 4])
408 minz = LocalScene.ArrayNorVer_localPt[10 * i + 5 + 4];
409
410 if (maxx < LocalScene.ArrayNorVer_localPt[10 * i + 3 + 4])
411 maxx = LocalScene.ArrayNorVer_localPt[10 * i + 3 + 4];
412 if (maxy < LocalScene.ArrayNorVer_localPt[10 * i + 4 + 4])
413 maxy = LocalScene.ArrayNorVer_localPt[10 * i + 4 + 4];
414 if (maxz < LocalScene.ArrayNorVer_localPt[10 * i + 5 + 4])
415 maxz = LocalScene.ArrayNorVer_localPt[10 * i + 5 + 4];
416 }
417 FistTimecalibrate = -1;
418 oldminx = minx; oldminy = miny; oldminz=minz;
419 oldmaxx = maxx; oldmaxy = maxy; oldmaxz=maxz;
420 difX = maxx - minx;
421 difY = maxy - miny;
422 difZ = maxz - minz;
423 // Recherche du maximum :
424 difMaximum = double(difX);
425 if (difY > float(difMaximum))
426 {
427 difMaximum = double(difY);
428 }
429 if (difZ > float(difMaximum))
430 {
431 difMaximum = double(difZ);
432 }
433 /// On va inclure cet objet dans un cube de langueur maximum
434 /// egale a "hauteur_fenetre"
435 decalage_xo = -double(minx + maxx) / 2;
436 decalage_yo = -double(miny + maxy) / 2;
437 decalage_zo = -double(minz + maxz) / 2;
438 }
439 for (uint i = 0; i < LocalScene.VertxNumber; i++)
440 {
441 LocalScene.ArrayNorVer_localPt[10 * i + 7] = float(
442 hauteur_fenetre *
443 (double(LocalScene.ArrayNorVer_localPt[10 * i + 7]) + decalage_xo) /
444 difMaximum);
445 LocalScene.ArrayNorVer_localPt[10 * i + 8] = float(
446 hauteur_fenetre *
447 (double(LocalScene.ArrayNorVer_localPt[10 * i + 8]) + decalage_yo) /
448 difMaximum);
449 LocalScene.ArrayNorVer_localPt[10 * i + 9] = float(
450 hauteur_fenetre *
451 (double(LocalScene.ArrayNorVer_localPt[10 * i + 9]) + decalage_zo) /
452 difMaximum);
453 }
454
455 // Cube vertices and indexes
456 float longX = wh * float(difX / float(difMaximum)),
457 longY = wh * (difY / float(difMaximum)),
458 longZ = wh * (difZ / float(difMaximum));
459 uint NbVert = LocalScene.VertxNumber;
460 CubeStartIndex=NbVert;
461 for(uint id=0; id<12; id++)
462 {
463 LocalScene.ArrayNorVer_localPt[10 * (NbVert+id) + 0] = 0.8f;
464 LocalScene.ArrayNorVer_localPt[10 * (NbVert+id) + 1] = 0.8f;
465 LocalScene.ArrayNorVer_localPt[10 * (NbVert+id) + 2] = 0.8f;
466 LocalScene.ArrayNorVer_localPt[10 * (NbVert+id) + 3] = 1.0f;
467 }
468
469 LocalScene.ArrayNorVer_localPt[10 * NbVert + 7] = -longX;
470 LocalScene.ArrayNorVer_localPt[10 * NbVert + 8] = -longY;
471 LocalScene.ArrayNorVer_localPt[10 * NbVert + 9] = -longZ;
472
473 LocalScene.ArrayNorVer_localPt[10 * (NbVert+1) + 7] = longX;
474 LocalScene.ArrayNorVer_localPt[10 * (NbVert+1) + 8] = -longY;
475 LocalScene.ArrayNorVer_localPt[10 * (NbVert+1) + 9] = -longZ;
476
477 LocalScene.ArrayNorVer_localPt[10 * (NbVert+2) + 7] = longX;
478 LocalScene.ArrayNorVer_localPt[10 * (NbVert+2) + 8] = longY;
479 LocalScene.ArrayNorVer_localPt[10 * (NbVert+2) + 9] = -longZ;
480
481 LocalScene.ArrayNorVer_localPt[10 * (NbVert+3) + 7] = -longX;
482 LocalScene.ArrayNorVer_localPt[10 * (NbVert+3) + 8] = longY;
483 LocalScene.ArrayNorVer_localPt[10 * (NbVert+3) + 9] = -longZ;
484
485 LocalScene.ArrayNorVer_localPt[10 * (NbVert+4) + 7] = -longX;
486 LocalScene.ArrayNorVer_localPt[10 * (NbVert+4) + 8] = -longY;
487 LocalScene.ArrayNorVer_localPt[10 * (NbVert+4) + 9] = -longZ;
488
489 LocalScene.ArrayNorVer_localPt[10 * (NbVert+5) + 7] = -longX;
490 LocalScene.ArrayNorVer_localPt[10 * (NbVert+5) + 8] = -longY;
491 LocalScene.ArrayNorVer_localPt[10 * (NbVert+5) + 9] = longZ;
492
493 LocalScene.ArrayNorVer_localPt[10 * (NbVert+6) + 7] = -longX;
494 LocalScene.ArrayNorVer_localPt[10 * (NbVert+6) + 8] = longY;
495 LocalScene.ArrayNorVer_localPt[10 * (NbVert+6) + 9] = longZ;
496
497 LocalScene.ArrayNorVer_localPt[10 * (NbVert+7) + 7] = -longX;
498 LocalScene.ArrayNorVer_localPt[10 * (NbVert+7) + 8] = longY;
499 LocalScene.ArrayNorVer_localPt[10 * (NbVert+7) + 9] = -longZ;
500
501 LocalScene.ArrayNorVer_localPt[10 * (NbVert+8) + 7] = -longX;
502 LocalScene.ArrayNorVer_localPt[10 * (NbVert+8) + 8] = -longY;
503 LocalScene.ArrayNorVer_localPt[10 * (NbVert+8) + 9] = -longZ;
504
505 LocalScene.ArrayNorVer_localPt[10 * (NbVert+9) + 7] = -longX;
506 LocalScene.ArrayNorVer_localPt[10 * (NbVert+9) + 8] = -longY;
507 LocalScene.ArrayNorVer_localPt[10 * (NbVert+9) + 9] = longZ;
508
509 LocalScene.ArrayNorVer_localPt[10 * (NbVert+10) + 7] = longX;
510 LocalScene.ArrayNorVer_localPt[10 * (NbVert+10) + 8] = -longY;
511 LocalScene.ArrayNorVer_localPt[10 * (NbVert+10) + 9] = longZ;
512
513 LocalScene.ArrayNorVer_localPt[10 * (NbVert+11) + 7] = longX;
514 LocalScene.ArrayNorVer_localPt[10 * (NbVert+11) + 8] = -longY;
515 LocalScene.ArrayNorVer_localPt[10 * (NbVert+11) + 9] = -longZ;
516
517 // Plan vertices and indexes
518 PlanStartIndex=NbVert+12;
519 for(uint id=0; id<60; id++)
520 {
521 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+id)+0] = 0.6f;
522 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+id)+1] = 0.6f;
523 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+id)+2] = 0.6f;
524 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+id)+3] = 1.0f;
525 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+id)+7] = PlanArray[3*id ];
526 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+id)+8] = PlanArray[3*id+1];
527 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+id)+9] = PlanArray[3*id+2];
528 }
529
530 // Axes vertices and indexes
531 AxesStartIndex = NbVert+12+60;
532 for(uint id=0; id<6; id++)
533 {
534 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+id)+0] = (id<2)?2.0f:0.0;
535 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+id)+1] = (id>1)&&(id<4)?2.0f:0.0;
536 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+id)+2] = (id>3)?2.0f:0.0;
537 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+id)+3] = 1.0f;
538 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+id)+7] = AxeArray[3*id ];
539 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+id)+8] = AxeArray[3*id+1];
540 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+id)+9] = AxeArray[3*id+2];
541 }
542
543 // Head of the X Axe
544 XStartIndex = NbVert+12+60+6;
545 for(uint id=0; id<6; id++)
546 {
547 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+6+id)+0] = (id<2)?2.0f:0.3;
548 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+6+id)+1] = 0.0;
549 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+6+id)+2] = 0.0;
550 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+6+id)+3] = 1.0f;
551 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+6+id)+7] = AxeArray[3*(id+6) ];
552 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+6+id)+8] = AxeArray[3*(id+6)+1];
553 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+6+id)+9] = AxeArray[3*(id+6)+2];
554 }
555
556 // Head of the Y Axe
557 YStartIndex = NbVert+12+60+12;
558 for(uint id=0; id<6; id++)
559 {
560 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+12+id)+0] = 0.0;
561 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+12+id)+1] = (id<2)?2.0f:0.3;
562 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+12+id)+2] = 0.0;
563 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+12+id)+3] = 1.0f;
564 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+12+id)+7] = AxeArray[3*(id+12) ];
565 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+12+id)+8] = AxeArray[3*(id+12)+1];
566 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+12+id)+9] = AxeArray[3*(id+12)+2];
567 }
568
569 // Head of the Z Axe
570 ZStartIndex = NbVert+12+60+18;
571 for(uint id=0; id<6; id++)
572 {
573 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+18+id)+0] = 0.0;
574 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+18+id)+1] = 0.0;
575 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+18+id)+2] = (id<2)?2.0f:0.3;
576 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+18+id)+3] = 1.0f;
577 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+18+id)+7] = AxeArray[3*(id+18) ];
578 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+18+id)+8] = AxeArray[3*(id+18)+1];
579 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+18+id)+9] = AxeArray[3*(id+18)+2];
580 }
581
582 // Letter X Axe
583 XletterIndex = NbVert+12+60+24;
584 for(uint id=0; id<4; id++)
585 {
586 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+24+id)+0] = 2.0;
587 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+24+id)+1] = 0.0;
588 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+24+id)+2] = 0.0;
589 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+24+id)+3] = 1.0f;
590 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+24+id)+7] = AxeArray[3*(id+24) ];
591 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+24+id)+8] = AxeArray[3*(id+24)+1];
592 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+24+id)+9] = AxeArray[3*(id+24)+2];
593 }
594 // Letter Y Axe
595 YletterIndex = NbVert+12+60+28;
596 for(uint id=0; id<4; id++)
597 {
598 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+28+id)+0] = 0.0;
599 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+28+id)+1] = 2.0;
600 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+28+id)+2] = 0.0;
601 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+28+id)+3] = 1.0f;
602 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+28+id)+7] = AxeArray[3*(id+28) ];
603 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+28+id)+8] = AxeArray[3*(id+28)+1];
604 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+28+id)+9] = AxeArray[3*(id+28)+2];
605 }
606 // Letter Y Axe
607 ZletterIndex = NbVert+12+60+32;
608 for(uint id=0; id<4; id++)
609 {
610 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+32+id)+0] = 0.0;
611 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+32+id)+1] = 0.0;
612 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+32+id)+2] = 2.0;
613 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+32+id)+3] = 1.0f;
614 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+32+id)+7] = AxeArray[3*(id+32) ];
615 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+32+id)+8] = AxeArray[3*(id+32)+1];
616 LocalScene.ArrayNorVer_localPt[10*(NbVert+12+60+32+id)+9] = AxeArray[3*(id+32)+2];
617 }
618 uint polynb=0;
619 if(LocalScene.typedrawing == -1)
620 {
621 uint sz = LocalScene.componentsinfos.ParametricGrid.size();
622 for (uint p = 0; p < sz; p += 2)
623 {
624 polynb += (LocalScene.componentsinfos.ParametricGrid[p]-1) *
625 (LocalScene.componentsinfos.ParametricGrid[p+1]-1);
626 }
627 }
628 else
629 polynb = LocalScene.NbPolygnNbVertexPtMin;
630
631 labelinfos = " \n Grid : ";
632 (LocalScene.typedrawing == 1)
633 ? labelinfos += QString::number(Xgrid - CutX) + "x" +
634 QString::number(Ygrid - CutY) + "x" +
635 QString::number(Zgrid - CutZ) +" \n"
636 : labelinfos += QString::number(Ugrid - CutU) + "x" +
637 QString::number(Vgrid - CutV) +" \n";
638 labelinfos+=" Vertices : "+QString::number(LocalScene.VertxNumber)+" \n"+
639 " Triangles: "+QString::number(LocalScene.PolyNumber/3)+" \n"
640 " Polygons : "+QString::number(polynb)+" \n";
641 if(LocalScene.morph==-1)
642 labelinfos+=" X["+QString::number(minx,'g',3)+","+QString::number(maxx,'g',3)+"]\n\
643 Y["+QString::number(miny,'g',3)+","+QString::number(maxy,'g',3)+"]\n\
644 Z["+QString::number(minz,'g',3)+","+QString::number(maxz,'g',3)+"]\n";
645 else
646 labelinfos+=" X["+QString::number(oldminx,'g',3)+","+QString::number(oldmaxx,'g',3)+"]\n\
647 Y["+QString::number(oldminy,'g',3)+","+QString::number(oldmaxy,'g',3)+"]\n\
648 Z["+QString::number(oldminz,'g',3)+","+QString::number(oldmaxz,'g',3)+"]\n";
649
650 if(LocalScene.morph==1)
651 {
652 if(LocalScene.anim==-1)
653 LabelInfos.setText(labelinfos+" Morph: ON \n");
654 else
655 LabelInfos.setText(labelinfos+" Rotation/Morph: ON \n");
656 }
657 else
658 {
659 if(LocalScene.anim==-1)
660 LabelInfos.setText(labelinfos);
661 else
662 LabelInfos.setText(labelinfos+" Rotation: ON \n");
663 }
664 }
665
666 void MathMod::png()
667 {
668 LocalScene.png_ok *= -1;
669 }
670
671 void MathMod::jpg()
672 {
673 LocalScene.jpg_ok *= -1;
674 }
675
676 void MathMod::bmp()
677 {
678 LocalScene.bmp_ok *= -1;
679 }
680
681 void MathMod::quality(int c)
682 {
683 LocalScene.quality_image = c;
684 }
685
686 void MathMod::colorstype(int c)
687 {
688 LocalScene.colortype = c;
689 }
690
691 void MathMod::colorstypeParIso(int c)
692 {
693 LocalScene.colortype = LocalScene.colortypeParam = c;
694 }
695
696 void MathMod::colorstypeParam(int c)
697 {
698 LocalScene.colortypeParam = c;
699 }
700
701 void MathMod::redSpec(int cl)
702 {
703 lightSpecular[0] = (cl/ 100.0f);
704 LocalScene.ShininessValUpdated=true;
705 update();
706 }
707
708 void MathMod::greenSpec(int cl)
709 {
710 lightSpecular[1] = (cl/ 100.0f);
711 LocalScene.ShininessValUpdated=true;
712 update();
713 }
714
715 void MathMod::blueSpec(int cl)
716 {
717 lightSpecular[2] = (cl/ 100.0f);
718 LocalScene.ShininessValUpdated=true;
719 update();
720 }
721
722 void MathMod::redAmb(int cl)
723 {
724 lightAmbient[0] = (cl/ 100.0f);
725 LocalScene.AmbientValUpdated=true;
726 update();
727 }
728
729 void MathMod::greenAmb(int cl)
730 {
731 lightAmbient[1] = (cl/ 100.0f);
732 LocalScene.AmbientValUpdated=true;
733 update();
734 }
735
736 void MathMod::blueAmb(int cl)
737 {
738 lightAmbient[2] = (cl/100.0f);
739 LocalScene.AmbientValUpdated=true;
740 update();
741 }
742
743 void MathMod::transAmb(int cl)
744 {
745 lightAmbient[3] = (cl/100.0f);
746 LocalScene.AmbientValUpdated=true;
747 update();
748 }
749
750 void MathMod::redDiff(int cl)
751 {
752 lightDiffuse[0] = (cl/100.0f);
753 LocalScene.DiffuseValUpdated=true;
754 update();
755 }
756
757 void MathMod::greenDiff(int cl)
758 {
759 lightDiffuse[1] = (cl/100.0f);
760 LocalScene.DiffuseValUpdated=true;
761 update();
762 }
763
764 void MathMod::blueDiff(int cl)
765 {
766 lightDiffuse[2] = (cl/100.0f);
767 LocalScene.DiffuseValUpdated=true;
768 update();
769 }
770
771 void MathMod::transDiff(int cl)
772 {
773 lightDiffuse[3] = (cl/ 100.0f);
774 LocalScene.DiffuseValUpdated=true;
775 update();
776 }
777
778 void MathMod::glfrontfacesupp(int val)
779 {
780 LocalScene.glFrontFacingSupport = val;
781 LocalScene.FrontSurfValUpdated=true;
782 update();
783 }
784
785 void MathMod::drawCube()
786 {
787 glLineWidth(1.0);
788 glUniform1i(uniformThereisRGBA, 0);
789 glDrawArrays(GL_LINE_STRIP,CubeStartIndex, 12);
790 glUniform1i(uniformThereisRGBA, 1);
791 }
792
793 void MathMod::DrawPariso(ObjectProperties *scene, uint ParisoTypeIndex)
794 {
795 uint idx = 0;
796 for (uint i = 0; i < ParisoTypeIndex; i++)
797 idx += scene->componentsinfos.NbComponentsType[i];
798 int start_triangle = scene->componentsinfos.ParisoTriangle[2 * idx];
799 float frontcl[4], backcl[4];
800 glEnable(GL_POLYGON_OFFSET_FILL);
801 glPolygonOffset(scene->polyfactor, scene->polyunits);
802 if (!scene->componentsinfos.ThereisRGBA[ParisoTypeIndex])
803 {
804 for (uint j = 0; j < 4; j++)
805 {
806 frontcl[j] = scene->frontcols[j];
807 backcl[j] = scene->backcols[j];
808 }
809 glUniform1i(uniformThereisRGBA, 1);
810 glUniform1i(uniformHSVactive, 0);
811 glUniform4fv(uniformFrontColor, 1, frontcl);
812 glUniform4fv(uniformBackColor, 1, backcl);
813 }
814 else
815 {
816 glUniform1i(uniformHSVactive, scene->componentsinfos.hsv[ParisoTypeIndex]?1:0);
817 glUniform1i(uniformThereisRGBA, 0);
818 }
819
820 if (scene->componentsinfos.ThereisCND[ParisoTypeIndex])
821 {
822 size_t Offset0 = start_triangle*sizeof( GL_FLOAT);
823 glDrawElements(
824 GL_TRIANGLES,
825 int(3 * (scene->componentsinfos.NbTrianglesNoCND[ParisoTypeIndex])),
826 GL_UNSIGNED_INT, (void *)(Offset0));
827
828 if (scene->cndoptions[0])
829 {
830 size_t Offset1 = (3 * scene->componentsinfos.NbTrianglesNoCND[ParisoTypeIndex] +start_triangle)*sizeof( GL_FLOAT);
831 glDrawElements(
832 GL_TRIANGLES,
833 int(3 * (scene->componentsinfos.NbTrianglesVerifyCND[ParisoTypeIndex])),
834 GL_UNSIGNED_INT, (void *)(Offset1));
835 }
836
837 if (scene->cndoptions[1])
838 {
839 size_t Offset2 = (3 * scene->componentsinfos.NbTrianglesNoCND[ParisoTypeIndex] +
840 3 * scene->componentsinfos.NbTrianglesVerifyCND[ParisoTypeIndex] +
841 start_triangle)*sizeof( GL_FLOAT);
842 glDrawElements(
843 GL_TRIANGLES,
844 int(3 * (scene->componentsinfos.NbTrianglesNotVerifyCND[ParisoTypeIndex])),
845 GL_UNSIGNED_INT,
846 (void *)(Offset2));
847 }
848 }
849 else
850 {
851 for (uint i = 0; i < scene->componentsinfos.NbComponentsType[ParisoTypeIndex]; i++)
852 {
853 uint cmpIndex = (ParisoTypeIndex==1) ? (scene->componentsinfos.NbComponentsType[0]+i):i;
854 if (scene->componentsinfos.ShowParIsoCmp[cmpIndex])
855 {
856 if (!scene->componentsinfos.ThereisRGBA[ParisoTypeIndex])
857 {
858 for (uint j = 0; j < 4; j++)
859 {
860 frontcl[j] = scene->frontcols[4 * (i % 10) + j];
861 backcl[j] = scene->backcols[4 * (i % 10) + j];
862 }
863 glUniform1i(uniformThereisRGBA, 1);
864 glUniform4fv(uniformFrontColor, 1, frontcl);
865 glUniform4fv(uniformBackColor, 1, backcl);
866 }
867 else
868 {
869 glUniform1i(uniformThereisRGBA, 0);
870 }
871 {
872 size_t Offset = scene->componentsinfos.ParisoTriangle[2*(i+idx)]*sizeof( GL_FLOAT);
873 glDrawElements(
874 GL_TRIANGLES,
875 int(3 * scene->componentsinfos.ParisoTriangle[2 * (i + idx) + 1]),GL_UNSIGNED_INT,(void *)(Offset));
876 }
877 }
878 }
879 }
880 glDisable(GL_POLYGON_OFFSET_FILL);
881 //glUniform1i(uniformThereisRGBA, 0);
882 }
883
884 void MathMod::normOk()
885 {
886 LocalScene.norm *= -1;
887 update();
888 }
889
890 void MathMod::boundingboxOk()
891 {
892 LocalScene.boundingbox *= -1;
893 }
894
895 void MathMod::run() {
896 update();
897 }
898
899 bool MathMod::timeractif()
900 {
901 return (LocalScene.anim == 1);
902 }
903
904 void MathMod::stoptimer()
905 {
906 timer->stop();
907 update();
908 }
909
910 void MathMod::starttimer()
911 {
912 timer->start(latence,this);
913 }
914
915 void MathMod::restarttimer(int newlatence)
916 {
917 latence = newlatence;
918 if (LocalScene.anim == 1)
919 {
920 timer->stop();
921 timer->start(latence, this);
922 }
923 }
924
925 void MathMod::CreateShaderProgram()
926 {
927 int IsCompiled_VS, IsCompiled_FS;
928 GLuint vertexshader, fragmentshader;
929 char *vertexInfoLog;
930 char *fragmentInfoLog;
931 char *shaderProgramInfoLog;
932 int IsLinked;
933 int maxLength;
934 const int MAX_LENGTH = 2048;
935 char log[MAX_LENGTH];
936 int logLength = 0;
937 bool shaderValid;
938
939 shaderprogramId = glCreateProgram();
940
941 //+++++++++++++++++++++++++++++++//
942 //++++++++ Vertex shader ++++++++//
943 //+++++++++++++++++++++++++++++++//
944 vertexshader = glCreateShader(GL_VERTEX_SHADER);
945 shaderValid = glIsShader(vertexshader);
946 if (!shaderValid)
947 {
948 std::cout << "Could not create Vertex Shader!";
949 }
950 static const char *c_str_vertex =
951 R"(
952 // GLSL version
953 //#version 120
954 #ifdef GL_ES
955 precision mediump float;
956 #endif
957 // uniforms
958 uniform mat4 matrixModelView;
959 uniform mat4 matrixNormal;
960 uniform mat4 matrixModelViewProjection;
961 uniform int glFrontFacing_1;
962 // vertex attribs (input)
963 attribute vec3 vertexPosition;
964 attribute vec3 vertexNormal;
965 attribute vec4 vertexColor;
966 // varyings (output)
967 varying vec3 esVertex, esNormal;
968 varying vec4 color;
969 varying vec4 v_position;
970 void main()
971 {
972 esVertex = vec3(matrixModelView * vec4(vertexPosition, 1.0));
973 esNormal = vec3(matrixNormal * vec4(vertexNormal, 1.0));
974 color = vertexColor;
975 if(glFrontFacing_1 == 0)
976 {
977 v_position = -matrixModelView * vec4 (vertexPosition, 1.0);
978 }
979 gl_Position = matrixModelViewProjection * vec4(vertexPosition, 1.0);
980 }
981 )";
982 glShaderSource(vertexshader, 1, &c_str_vertex, NULL);
983 glCompileShader(vertexshader);
984 glGetShaderiv(vertexshader, GL_COMPILE_STATUS, &IsCompiled_VS);
985 if(IsCompiled_VS==GL_FALSE)
986 {
987 QMessageBox msgBox;
988 glGetShaderiv(vertexshader, GL_INFO_LOG_LENGTH, &maxLength);
989 vertexInfoLog = (char *)malloc(maxLength);
990 glGetShaderInfoLog(vertexshader, maxLength, &maxLength, vertexInfoLog);
991 std::string vertexInfoLogString = std::string(vertexInfoLog);
992 msgBox.setText("Error : " +QString::fromStdString(std::string(vertexInfoLog)));
993 msgBox.adjustSize();
994 msgBox.exec();
995 }
996
997 //++++++++++++++++++++++++++//
998 //++++++ Fragment shader +++//
999 //++++++++++++++++++++++++++//
1000 fragmentshader = glCreateShader(GL_FRAGMENT_SHADER);
1001 shaderValid = glIsShader(fragmentshader);
1002 if (!shaderValid)
1003 {
1004 std::cout << "Could not create Fragment Shader!";
1005 }
1006 static const char *c_str_fragment =
1007 R"(
1008 // GLSL version
1009 //#version 120
1010 #ifdef GL_ES
1011 precision mediump float;
1012 #endif
1013 // uniforms
1014 uniform vec4 frontColor;
1015 uniform vec4 backColor;
1016 uniform vec4 gridColor;
1017 uniform vec4 lightPosition;
1018 uniform vec4 lightAmbient;
1019 uniform vec4 lightDiffuse;
1020 uniform vec4 lightSpecular;
1021 uniform int hsvactive;
1022 uniform int thereisRGBA;
1023 uniform int drawgridColor;
1024 uniform float shininess;
1025 uniform int glFrontFacing_2;
1026 // varyings
1027 varying vec3 esVertex, esNormal;
1028 varying vec4 color;
1029 varying vec4 v_position;
1030
1031 // All components are in the range [0…1], including hue.
1032 vec3 hsv2rgb(vec3 c)
1033 {
1034 vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
1035 vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
1036 return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
1037 }
1038
1039 void main()
1040 {
1041 vec4 color1=color;
1042 vec3 normal = normalize(esNormal);
1043 if(glFrontFacing_2 == 1)
1044 {
1045 if(gl_FrontFacing == false)
1046 {
1047 normal *= -1.0;
1048 if(thereisRGBA ==1)
1049 {
1050 color1=backColor;
1051 }
1052
1053 }
1054 else
1055 {
1056 if(thereisRGBA ==1)
1057 {
1058 color1=frontColor;
1059 }
1060 }
1061 }
1062 else
1063 {
1064 if(dot(normal, v_position.xyz) <= 0.0)
1065 {
1066 normal *= -1.0;
1067 if(thereisRGBA ==1)
1068 {
1069 color1=backColor;
1070 }
1071 }
1072 else
1073 {
1074 if(thereisRGBA ==1)
1075 {
1076 color1=frontColor;
1077 }
1078 }
1079 }
1080 if(drawgridColor == 1)
1081 {
1082 color1=gridColor;
1083 }
1084 vec3 light;
1085 if(lightPosition.w == 0.0)
1086 {
1087 light = normalize(lightPosition.xyz);
1088 }
1089 else
1090 {
1091 light = normalize(lightPosition.xyz - esVertex);
1092 }
1093 if(hsvactive == 1)
1094 color1 = vec4(hsv2rgb(color1.xyz), color1.w);
1095 vec3 view = normalize(-esVertex);
1096 vec3 halfv = normalize(light + view);
1097 vec4 fragColor = lightAmbient * color1;
1098 float dotNL = max(dot(normal, light), 0.0);
1099 fragColor += lightDiffuse* color1 * dotNL; // add diffuse
1100 float dotNH = max(dot(normal, halfv), 0.0);
1101 fragColor += (pow(dotNH, shininess) * lightSpecular) * color1; // add specular
1102 // set frag color
1103 //gl_FragColor = (hsvactive == 1)? vec4(hsv2rgb(fragColor.xyz), fragColor.w) : fragColor;
1104 gl_FragColor = fragColor;
1105 }
1106 )";
1107 glShaderSource(fragmentshader, 1, &c_str_fragment, NULL);
1108 glCompileShader(fragmentshader);
1109 glGetShaderiv(fragmentshader, GL_COMPILE_STATUS, &IsCompiled_FS);
1110 if(IsCompiled_FS==GL_FALSE)
1111 {
1112 QMessageBox msgBox;
1113 glGetShaderiv(fragmentshader, GL_INFO_LOG_LENGTH, &maxLength);
1114 fragmentInfoLog = (char *)malloc(maxLength);
1115 glGetShaderInfoLog(fragmentshader, maxLength, &maxLength, fragmentInfoLog);
1116 std::string vertexInfoLogString = std::string(fragmentInfoLog);
1117 msgBox.setText("Error : " +QString::fromStdString(std::string(fragmentInfoLog)));
1118 msgBox.adjustSize();
1119 msgBox.exec();
1120 }
1121
1122 glAttachShader(shaderprogramId, vertexshader);
1123 glAttachShader(shaderprogramId, fragmentshader);
1124 glBindAttribLocation(shaderprogramId, 0, "in_Position");
1125 glBindAttribLocation(shaderprogramId, 1, "in_Color");
1126 glLinkProgram(shaderprogramId);
1127 glGetProgramiv(shaderprogramId, GL_LINK_STATUS, (int *)&IsLinked);
1128 if(!IsLinked)
1129 {
1130 glGetProgramiv(shaderprogramId, GL_INFO_LOG_LENGTH, &maxLength);
1131 shaderProgramInfoLog = (char *)malloc(maxLength);
1132 glGetProgramInfoLog(shaderprogramId, maxLength, &maxLength, shaderProgramInfoLog);
1133 }
1134 glUseProgram(shaderprogramId);
1135 uniformMatrixModelView = glGetUniformLocation(shaderprogramId, "matrixModelView");
1136 uniformMatrixModelViewProjection = glGetUniformLocation(shaderprogramId, "matrixModelViewProjection");
1137 uniformMatrixNormal = glGetUniformLocation(shaderprogramId, "matrixNormal");
1138 uniformLightPosition = glGetUniformLocation(shaderprogramId, "lightPosition");
1139 uniformLightAmbient = glGetUniformLocation(shaderprogramId, "lightAmbient");
1140 uniformLightDiffuse = glGetUniformLocation(shaderprogramId, "lightDiffuse");
1141 uniformLightSpecular = glGetUniformLocation(shaderprogramId, "lightSpecular");
1142 uniformFrontColor = glGetUniformLocation(shaderprogramId, "frontColor");
1143 uniformBackColor = glGetUniformLocation(shaderprogramId, "backColor");
1144 uniformGridColor = glGetUniformLocation(shaderprogramId, "gridColor");
1145 uniformThereisRGBA = glGetUniformLocation(shaderprogramId, "thereisRGBA");
1146 uniformHSVactive = glGetUniformLocation(shaderprogramId, "hsvactive");
1147 uniformShininess = glGetUniformLocation(shaderprogramId, "shininess");
1148 uniformglFrontFacing_1 = glGetUniformLocation(shaderprogramId, "glFrontFacing_1");
1149 uniformglFrontFacing_2 = glGetUniformLocation(shaderprogramId, "glFrontFacing_2");
1150 uniformdrawgridColor = glGetUniformLocation(shaderprogramId, "drawgridColor");
1151 attribVertexPosition = glGetAttribLocation(shaderprogramId, "vertexPosition");
1152 attribVertexNormal = glGetAttribLocation(shaderprogramId, "vertexNormal");
1153 attribVertexColor = glGetAttribLocation(shaderprogramId, "vertexColor");
1154 glUniform4fv(uniformLightPosition, 1, lightPosition);
1155 glUniform4fv(uniformLightAmbient, 1, lightAmbient);
1156 glUniform4fv(uniformLightDiffuse, 1, lightDiffuse);
1157 glUniform4fv(uniformLightSpecular, 1, lightSpecular);
1158 glUniform4fv(uniformFrontColor, 1, frontColor);
1159 glUniform4fv(uniformBackColor, 1, backColor);
1160 glUniform4fv(uniformGridColor, 1, gridcol);
1161 glUniform1f(uniformShininess, shininessVal);
1162 glUniform1i(uniformglFrontFacing_1, LocalScene.glFrontFacingSupport);
1163 glUniform1i(uniformglFrontFacing_2, LocalScene.glFrontFacingSupport);
1164 glUniform1i(uniformThereisRGBA, 0);
1165 glUniform1i(uniformHSVactive, 0);
1166 glUniform1i(uniformdrawgridColor, 0);
1167 int linkStatus;
1168 glGetProgramiv(shaderprogramId, GL_LINK_STATUS, &linkStatus);
1169 if(linkStatus == GL_FALSE)
1170 {
1171 glGetProgramiv(shaderprogramId, GL_INFO_LOG_LENGTH, &logLength);
1172 glGetProgramInfoLog(shaderprogramId, MAX_LENGTH, &logLength, log);
1173 std::cout << "===== GLSL Program Log =====\n" << log << std::endl;
1174 return;
1175 }
1176 else
1177 {
1178 return;
1179 }
1180 }
1181
1182 void MathMod::proj()
1183 {
1184 qreal aspect = qreal(screenWidth) / qreal(screenHeight ? screenHeight : 1);
1185 const qreal zNear = 0.01, zFar = 15, fov = 60.0;
1186 matrixProjectionx.setToIdentity();
1187 matrixProjectionx.perspective(fov, aspect, zNear, zFar);
1188 }
1189
1190 void MathMod::LoadShadersFiles()
1191 {
1192 CreateShaderProgram();
1193 }
1194
1195 void MathMod::initializeGL()
1196 {
1197 initializeOpenGLFunctions();
1198 glEnable(GL_DEPTH_TEST);
1199 glEnable(GL_BLEND);
1200 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1201 glFrontFace(GL_CCW);
1202 glClearColor(0, 0, 0, 0);
1203 proj();
1204 }
1205
1206 void MathMod::resizeGL(int newwidth, int newheight)
1207 {
1208 screenWidth = newwidth;
1209 screenHeight = newheight;
1210 proj();
1211 }
1212
1213 void MathMod::anim()
1214 {
1215 LocalScene.anim *= -1;
1216 if (LocalScene.anim == 1)
1217 {
1218 timer->start(latence, this);
1219 if (LocalScene.morph == -1)
1220 {
1221 LabelInfos.setText(labelinfos+" Rotation: ON \n");
1222 }
1223 }
1224 else
1225 {
1226 oldRotation = rotation;
1227 if (LocalScene.morph == -1)
1228 {
1229 LabelInfos.setText(labelinfos);
1230 stoptimer();
1231 }
1232 }
1233 }
1234
1235 void MathMod::morph()
1236 {
1237 LocalScene.morph *= -1;
1238 FistTimecalibrate *= -1;
1239 if (LocalScene.typedrawing == 1)
1240 {
1241 // Isosurfaces:
1242 IsoObjet->masterthread->activeMorph = LocalScene.morph;
1243 for (uint nbthreads = 0; nbthreads < IsoObjet->WorkerThreadsNumber - 1;
1244 nbthreads++)
1245 IsoObjet->workerthreads[nbthreads].activeMorph = LocalScene.morph;
1246 IsoObjet->IsoMorph();
1247 }
1248 else if (LocalScene.typedrawing == -1)
1249 {
1250 // Parametric surfaces:
1251 ParObjet->masterthread->activeMorph = LocalScene.morph;
1252 for (uint nbthreads = 0; nbthreads < ParObjet->WorkerThreadsNumber - 1;
1253 nbthreads++)
1254 ParObjet->workerthreads[nbthreads].activeMorph = LocalScene.morph;
1255 ParObjet->ParMorph();
1256 }
1257 else // Pariso objects
1258 {
1259 // Parametric surfaces:
1260 ParObjet->masterthread->activeMorph = LocalScene.morph;
1261 for (uint nbthreads = 0; nbthreads < ParObjet->WorkerThreadsNumber - 1;
1262 nbthreads++)
1263 ParObjet->workerthreads[nbthreads].activeMorph = LocalScene.morph;
1264 ParObjet->ParMorph();
1265 // Isosurfaces:
1266 IsoObjet->masterthread->activeMorph = LocalScene.morph;
1267 for (uint nbthreads = 0; nbthreads < IsoObjet->WorkerThreadsNumber - 1;
1268 nbthreads++)
1269 IsoObjet->workerthreads[nbthreads].activeMorph = LocalScene.morph;
1270 IsoObjet->IsoMorph();
1271 }
1272 if (LocalScene.morph == 1)
1273 {
1274 timer->start(latence, this);
1275 }
1276 else
1277 {
1278 if (LocalScene.anim == -1)
1279 {
1280 LabelInfos.setText(labelinfos);
1281 stoptimer();
1282 }
1283 else
1284 {
1285 LabelInfos.setText(labelinfos+" Rotation: ON \n");
1286 }
1287 }
1288 }
1289
1290 void MathMod::keyPressEvent(QKeyEvent *e)
1291 {
1292 int key = e->key();
1293 switch (key)
1294 {
1295 case Qt::CTRL+Qt::Key_A:
1296 anim();
1297 break;
1298 case Qt::CTRL+Qt::Key_P:
1299 morph();
1300 break;
1301 case Qt::Key_C:
1302 Parent->show();
1303 break;
1304 }
1305 update();
1306 }
1307 void MathMod::FillOk()
1308 {
1309 LocalScene.fill *= -1;
1310 update();
1311 }
1312
1313 void MathMod::DrawAxe()
1314 {
1315 glLineWidth(1.0);
1316 glUniform1i(uniformThereisRGBA, 0);
1317 glUniform1i(uniformHSVactive, 0);
1318 // Draw the three axes (lines without head)
1319 glDrawArrays(GL_LINES,AxesStartIndex,6);
1320 // Head of the X Axe:
1321 glDrawArrays(GL_TRIANGLE_FAN,XStartIndex,6);
1322 // Head of the Y Axe:
1323 glDrawArrays(GL_TRIANGLE_FAN,YStartIndex,6);
1324 // Head of the Z Axe:
1325 glDrawArrays(GL_TRIANGLE_FAN,ZStartIndex,6);
1326 glLineWidth(3.0);
1327 // Draw the X axe
1328 glDrawArrays(GL_LINES,XletterIndex,4);
1329 // Draw the Y axe
1330 glDrawArrays(GL_LINES,YletterIndex,4);
1331 // Draw the Z axe
1332 glDrawArrays(GL_LINE_STRIP,ZletterIndex,4);
1333 glUniform1i(uniformThereisRGBA, 1);
1334 }
1335
1336 void MathMod::DrawNormals(ObjectProperties *)
1337 {
1338 }
1339
1340 void MathMod::Winitialize_GL()
1341 {
1342 if (LocalScene.componentsinfos.updateviewer)
1343 {
1344 PutObjectInsideCube();
1345 PutObjectInsideCubeOk=true;
1346 }
1347 }
1348
1349 void MathMod::UpdateGL()
1350 {
1351 if (LocalScene.updategl)
1352 {
1353 Winitialize_GL();
1354 update();
1355 }
1356 else
1357 LocalScene.updategl = true;
1358 }
1359
1360 void MathMod::DrawParisoCND(ObjectProperties *scene, uint compindex)
1361 {
1362 uint idx = 0;
1363 for (uint i = 0; i < compindex; i++)
1364 idx += scene->componentsinfos.NbComponentsType[i];
1365 int start_triangle = scene->componentsinfos.ParisoTriangle[2 * idx];
1366 glUniform1i(uniformThereisRGBA, 0);
1367 glUniform1i(uniformHSVactive, 0);
1368 if (scene->cndoptions[3])
1369 {
1370 size_t Offset0 = (3 * scene->componentsinfos.NbTrianglesNoCND[compindex] + start_triangle)*sizeof( GL_FLOAT);
1371 glLineWidth(0.3);
1372 for (uint i = 0; i < (3 * scene->componentsinfos.NbTrianglesVerifyCND[compindex]); i += 3)
1373 {
1374 glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_INT, (void *)(Offset0));
1375 Offset0+=(3*sizeof( GL_FLOAT));
1376 }
1377 }
1378
1379 if (scene->cndoptions[4])
1380 {
1381 size_t Offset1 = (3 * scene->componentsinfos
1382 .NbTrianglesNoCND[compindex] + 3 * scene->componentsinfos
1383 .NbTrianglesVerifyCND[compindex] +
1384 start_triangle)*sizeof(GL_FLOAT);
1385 glLineWidth(0.3);
1386 for (uint i = 0; i < (3 * scene->componentsinfos.NbTrianglesNotVerifyCND[compindex]); i += 3)
1387 {
1388 glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_INT, (void *)(Offset1));
1389 Offset1+=(3*sizeof( GL_FLOAT));
1390 }
1391 }
1392 if (scene->cndoptions[2])
1393 {
1394 size_t Offset2 = (3*scene->componentsinfos.NbTrianglesNoCND[compindex]+3*(scene->componentsinfos.NbTrianglesVerifyCND[compindex] +
1395 scene->componentsinfos.NbTrianglesNotVerifyCND[compindex])+start_triangle)*sizeof( GL_FLOAT);
1396 glLineWidth(4.0);
1397 for (uint i = 0; i < (3 * scene->componentsinfos.NbTrianglesBorderCND[compindex]); i += 3)
1398 {
1399 glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_INT, (void *)(Offset2));
1400 Offset2+=(3*sizeof( GL_FLOAT));
1401 }
1402 }
1403 glUniform1i(uniformThereisRGBA, 1);
1404 }
1405
1406 void MathMod::DrawTrianglMesh(ObjectProperties *scene)
1407 {
1408 size_t Offset = 0;
1409 uint st = 0;
1410 glUniform4fv(uniformGridColor, 1, scene->gridcol);
1411 glUniform1i(uniformdrawgridColor, 1);
1412 glUniform1i(uniformThereisRGBA, 0);
1413 glUniform1i(uniformHSVactive, 0);
1414 glLineWidth(0.3);
1415 for (uint i = 0; i < scene->PolyNumber; i += 3)
1416 {
1417 Offset = st*sizeof( GL_FLOAT);
1418 glDrawElements(GL_LINE_LOOP, 3, GL_UNSIGNED_INT, (void *)(Offset));
1419 st+=3;
1420 }
1421 glUniform1i(uniformdrawgridColor, 0);
1422 glUniform1i(uniformThereisRGBA, 1);
1423 }
1424
1425 void MathMod::DrawMinimalTopology(ObjectProperties *scene)
1426 {
1427 glUniform4fv(uniformGridColor, 1,scene->gridcol);
1428 glUniform1i(uniformdrawgridColor, 1);
1429 glUniform1i(uniformThereisRGBA, 0);
1430 glUniform1i(uniformHSVactive, 0);
1431 glLineWidth(0.4);
1432 uint st = scene->PolyNumber;
1433 uint polysize=0;
1434 size_t Offset;
1435 if(scene->typedrawing == -1)
1436 for (uint i = 0; i < (scene->NbPolygnNbVertexPtMin); i++)
1437 {
1438 polysize = scene->PolyIndices_localPtMin[i];
1439 Offset = st*sizeof( GL_FLOAT);
1440 glDrawElements(
1441 GL_LINE_STRIP,
1442 polysize,
1443 GL_UNSIGNED_INT,
1444 (void *)(Offset));
1445 st+=(polysize);
1446 }
1447 else
1448 if(scene->typedrawing == 1)
1449 for (uint i = 0; i < (scene->NbPolygnNbVertexPtMin); i++)
1450 {
1451 polysize = scene->PolyIndices_localPtMin[i];
1452 Offset = st*sizeof( GL_FLOAT);
1453 glDrawElements(
1454 GL_LINE_LOOP,
1455 polysize,
1456 GL_UNSIGNED_INT,
1457 (void *)(Offset));
1458 st+=(polysize);
1459 }
1460 else
1461 {
1462 uint kl= scene->componentsinfos.NbParametricMeshLines;
1463 for (uint i = 0; i < (scene->NbPolygnNbVertexPtMin); i++)
1464 {
1465 polysize = scene->PolyIndices_localPtMin[i];
1466 Offset = st*sizeof( GL_FLOAT);
1467 glDrawElements(
1468 (i<kl)? GL_LINE_STRIP:GL_LINE_LOOP,
1469 polysize,
1470 GL_UNSIGNED_INT,
1471 (void *)(Offset));
1472 st+=(polysize);
1473 }
1474 }
1475 glUniform1i(uniformdrawgridColor, 0);
1476 glUniform1i(uniformThereisRGBA, 1);
1477 }
1478
1479 void MathMod::plan()
1480 {
1481 glUniform1i(uniformThereisRGBA, 0);
1482 glUniform1i(uniformHSVactive, 0);
1483 glLineWidth(0.3);
1484 glDrawArrays(GL_LINES,PlanStartIndex,60);
1485 glUniform1i(uniformThereisRGBA, 1);
1486 }
1487
1488 void MathMod::CopyData(ObjectProperties *scene)
1489 {
1490 static int firstaction=0;
1491 static uint previousVertxNumber=0;
1492 static uint previousPolyNumberNbPolygnNbVertexPtMin=0;
1493 if(firstaction==0)
1494 {
1495 vbo[0]=vbo[1]=0;
1496 glGenBuffers(2, vbo);
1497 /* Bind our first VBO as being the active buffer and storing vertex attributes (coordinates) */
1498 glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
1499 glBufferData(GL_ARRAY_BUFFER, sizeof(float)*10*(scene->VertxNumber+(12+60+36)),scene->ArrayNorVer_localPt, GL_STATIC_DRAW);
1500 glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
1501 /* Bind our first VBO as being the active buffer and storing vertex attributes (coordinates) */
1502 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]);
1503 glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(uint)*(scene->PolyNumber + scene->NbPolygnNbVertexPtMinSize), scene->PolyIndices_localPt, GL_STATIC_DRAW);
1504 size_t cOffset = 0;
1505 size_t nOffset = cOffset + 4*sizeof( GL_FLOAT);
1506 size_t vOffset = nOffset + 3*sizeof (GL_FLOAT);
1507 // activate attribs
1508 glEnableVertexAttribArray(attribVertexColor);
1509 glEnableVertexAttribArray(attribVertexNormal);
1510 glEnableVertexAttribArray(attribVertexPosition);
1511 // set attrib arrays using glVertexAttribPointer()
1512 glVertexAttribPointer(attribVertexPosition, 3, GL_FLOAT, false, 10*sizeof( GL_FLOAT), (void*)vOffset);
1513 glVertexAttribPointer(attribVertexNormal, 3, GL_FLOAT, false, 10*sizeof( GL_FLOAT), (void*)nOffset);
1514 glVertexAttribPointer(attribVertexColor,4, GL_FLOAT, false, 10*sizeof( GL_FLOAT), (void*)cOffset);
1515 previousVertxNumber = scene->VertxNumber;
1516 previousPolyNumberNbPolygnNbVertexPtMin = (scene->PolyNumber + scene->NbPolygnNbVertexPtMinSize);
1517 firstaction++;
1518 }
1519 else{
1520 if(scene->VertxNumber>previousVertxNumber)
1521 {
1522 glBufferData(GL_ARRAY_BUFFER, sizeof(float)*10*(scene->VertxNumber+(12+60+36)), scene->ArrayNorVer_localPt, GL_STATIC_DRAW);
1523 previousVertxNumber = scene->VertxNumber;
1524 }
1525 else
1526 {
1527 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*10*(scene->VertxNumber+(12+60+36)), scene->ArrayNorVer_localPt);
1528 previousVertxNumber = scene->VertxNumber;
1529 }
1530 if((scene->PolyNumber + scene->NbPolygnNbVertexPtMinSize)>previousPolyNumberNbPolygnNbVertexPtMin)
1531 {
1532 glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(uint)*(scene->PolyNumber + scene->NbPolygnNbVertexPtMinSize), scene->PolyIndices_localPt, GL_STATIC_DRAW);
1533 previousPolyNumberNbPolygnNbVertexPtMin = (scene->PolyNumber + scene->NbPolygnNbVertexPtMinSize);
1534 }
1535 else
1536 {
1537 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,0, sizeof(uint)*(scene->PolyNumber + scene->NbPolygnNbVertexPtMinSize), scene->PolyIndices_localPt);
1538 previousPolyNumberNbPolygnNbVertexPtMin = (scene->PolyNumber + scene->NbPolygnNbVertexPtMinSize);
1539 }
1540 }
1541 }
1542
1543 void MathMod::draw(ObjectProperties *scene)
1544 {
1545 if(!PutObjectInsideCubeOk)
1546 return;
1547 if (scene->componentsinfos.Interleave)
1548 {
1549 CopyData(scene);
1550 scene->componentsinfos.Interleave = false;
1551 }
1552 // clear buffer
1553 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
1554 // set modelview matrix
1555 matrixViewx.setToIdentity();
1556 matrixViewx.translate(0.0, 0.0, -cameraDistance);
1557 matrixViewx.rotate(rotation);
1558 matrixModelViewProjectionx = matrixProjectionx * matrixViewx;
1559 matrixNormalx=matrixViewx;
1560 matrixNormalx.setColumn(3, QVector4D(0,0,0,1));
1561 glUniformMatrix4fv(uniformMatrixModelView, 1, false, matrixViewx.data());
1562 glUniformMatrix4fv(uniformMatrixModelViewProjection, 1, false, matrixModelViewProjectionx.data());
1563 glUniformMatrix4fv(uniformMatrixNormal, 1, false, matrixNormalx.data());
1564 if(LocalScene.ShininessValUpdated)
1565 {
1566 glUniform1f(uniformShininess, shininessVal);
1567 glUniform4fv(uniformLightSpecular, 1, lightSpecular);
1568 LocalScene.ShininessValUpdated =false;
1569 }
1570 if(LocalScene.AmbientValUpdated)
1571 {
1572 glUniform4fv(uniformLightAmbient, 1, lightAmbient);
1573 LocalScene.AmbientValUpdated =false;
1574 }
1575 if(LocalScene.DiffuseValUpdated)
1576 {
1577 glUniform4fv(uniformLightDiffuse, 1, lightDiffuse);
1578 LocalScene.DiffuseValUpdated =false;
1579 }
1580 if(LocalScene.FrontSurfValUpdated)
1581 {
1582 glUniform1i(uniformglFrontFacing_1 , LocalScene.glFrontFacingSupport);
1583 glUniform1i(uniformglFrontFacing_2 , LocalScene.glFrontFacingSupport);
1584 LocalScene.FrontSurfValUpdated = false;
1585 }
1586 // We draw the Plan first because we don't want it to spin around X,Y and Z axes
1587 if (scene->plan == 1)
1588 plan();
1589 if(LocalScene.animx==1)
1590 matrixViewx.rotate(rotationx);
1591 if(LocalScene.animy==1)
1592 matrixViewx.rotate(rotationy);
1593 if(LocalScene.animz==1)
1594 matrixViewx.rotate(rotationz);
1595 if(LocalScene.animx==1 || LocalScene.animy==1 || LocalScene.animz==1)
1596 {
1597 matrixModelViewProjectionx = matrixProjectionx * matrixViewx;
1598 matrixNormalx=matrixViewx;
1599 matrixNormalx.setColumn(3, QVector4D(0,0,0,1));
1600 glUniformMatrix4fv(uniformMatrixModelView, 1, false, matrixViewx.data());
1601 glUniformMatrix4fv(uniformMatrixModelViewProjection, 1, false, matrixModelViewProjectionx.data());
1602 glUniformMatrix4fv(uniformMatrixNormal, 1, false, matrixNormalx.data());
1603 }
1604 // Blend Effect activation:
1605 if (scene->transparency == 1)
1606 glDepthMask(GL_FALSE);
1607
1608 // Axe :
1609 if (scene->axe == 1)
1610 DrawAxe();
1611
1612 if (scene->fill == 1 && scene->componentsinfos.updateviewer)
1613 for (uint i = 0; i < scene->componentsinfos.NbComponentsType.size(); i++)
1614 DrawPariso(scene, i);
1615
1616 // Draw Mesh Object:
1617 if (scene->triangles == 1 && scene->componentsinfos.updateviewer)
1618 DrawTrianglMesh(scene);
1619
1620 // Bounding Box:
1621 if (scene->boundingbox == 1)
1622 drawCube();
1623
1624 // Draw Minimal topology for isosurfaces:
1625 if (scene->mesh == 1 && scene->componentsinfos.updateviewer)
1626 DrawMinimalTopology(scene);
1627
1628 if (scene->activarecnd && scene->componentsinfos.updateviewer)
1629 for (uint i = 0; i < scene->componentsinfos.NbComponentsType.size(); i++)
1630 if (scene->componentsinfos.ThereisCND[i])
1631 DrawParisoCND(scene, i);
1632
1633 // Draw Normales:
1634 if (scene->norm == 1 && scene->componentsinfos.updateviewer)
1635 DrawNormals(scene);
1636
1637 if (scene->transparency == 1)
1638 glDepthMask(GL_TRUE);
1639 }
1640
1641 void MathMod::paintGL()
1642 {
1643 if (LocalScene.morph == 1)
1644 {
1645 if (LocalScene.typedrawing == -1)
1646 {
1647 ParObjet->ParamBuild(
1648 &(LocalScene.ArrayNorVer_localPt), &(LocalScene.PolyIndices_localPt),
1649 &LocalScene.PolyNumber, &LocalScene.VertxNumber,
1650 &(LocalScene.componentsinfos), &(LocalScene.PolyIndices_localPtMin),
1651 &(LocalScene.NbPolygnNbVertexPtMin),
1652 &(LocalScene.NbPolygnNbVertexPtMinSize));
1653 }
1654 else if (LocalScene.typedrawing == 1)
1655 {
1656 IsoObjet->IsoBuild(
1657 &(LocalScene.ArrayNorVer_localPt), &(LocalScene.PolyIndices_localPt),
1658 &(LocalScene.PolyNumber), &(LocalScene.VertxNumber),
1659 &(LocalScene.PolyIndices_localPtMin),
1660 &(LocalScene.NbPolygnNbVertexPtMin),
1661 &(LocalScene.NbPolygnNbVertexPtMinSize),
1662 &(LocalScene.componentsinfos));
1663 }
1664 else
1665 {
1666 ParObjet->ParamBuild(
1667 &(LocalScene.ArrayNorVer_localPt), &(LocalScene.PolyIndices_localPt),
1668 &LocalScene.PolyNumber, &LocalScene.VertxNumber,
1669 &(LocalScene.componentsinfos), &(LocalScene.PolyIndices_localPtMin),
1670 &(LocalScene.NbPolygnNbVertexPtMin),
1671 &(LocalScene.NbPolygnNbVertexPtMinSize));
1672 IsoObjet->IsoBuild(
1673 &(LocalScene.ArrayNorVer_localPt), &(LocalScene.PolyIndices_localPt),
1674 &(LocalScene.PolyNumber), &(LocalScene.VertxNumber),
1675 &(LocalScene.PolyIndices_localPtMin),
1676 &(LocalScene.NbPolygnNbVertexPtMin),
1677 &(LocalScene.NbPolygnNbVertexPtMinSize),
1678 &(LocalScene.componentsinfos));
1679 }
1680 Winitialize_GL();
1681 }
1682 draw(&LocalScene);
1683 if (LocalScene.morph == 1 && LocalScene.frame == 1)
1684 FramesSave();
1685 }
1686
1687 void MathMod::timerEvent(QTimerEvent *)
1688 {
1689 if(LocalScene.anim == 1)
1690 {
1691 if(LocalScene.animx==1)
1692 {
1693 rotationx = rotationx*QQuaternion::fromAxisAndAngle(QVector3D(1.0,0.0,0.0), LocalScene.animxValueStep);
1694 }
1695 if(LocalScene.animy==1)
1696 {
1697 rotationy = rotationy*QQuaternion::fromAxisAndAngle(QVector3D(0.0,1.0,0.0), LocalScene.animyValueStep);
1698 }
1699 if(LocalScene.animz==1)
1700 {
1701 rotationz = rotationz*QQuaternion::fromAxisAndAngle(QVector3D(0.0,0.0,1.0), LocalScene.animzValueStep);
1702 }
1703 if(LocalScene.animxyz == 1)
1704 rotation = QQuaternion::fromAxisAndAngle(n, acc/10) * rotation;
1705 oldRotation = rotation;
1706 }
1707 update();
1708 }
1709
1710 void MathMod::mouseReleaseEvent(QMouseEvent *)
1711 {
1712 if(LocalScene.anim != 1)
1713 oldRotation = rotation;
1714 }
1715
1716 void MathMod::mousePressEvent(QMouseEvent *e)
1717 {
1718 // Save mouse press position
1719 mousePressPosition = QVector2D(e->localPos());
1720 if(LocalScene.anim != 1)
1721 rotation = oldRotation;
1722 if (e->button() == Qt::LeftButton)
1723 {
1724 btgauche = 1;
1725 mouseLeftDown =true;
1726 }
1727 else
1728 {
1729 btgauche = 0;
1730 mouseLeftDown =false;
1731 }
1732 if (e->button() == Qt::RightButton)
1733 {
1734 btdroit = 1;
1735 mouseRightDown =true;
1736 }
1737 else
1738 {
1739 btdroit = 0;
1740 mouseRightDown =false;
1741 }
1742 if (e->button() == Qt::MidButton)
1743 btmilieu = 1;
1744 else
1745 btmilieu = 0;
1746
1747 mouseY = e->y()/2;
1748 }
1749
1750 void MathMod::mouseMoveEvent(QMouseEvent *e)
1751 {
1752 static int oldx=0, oldy=0;
1753 static QVector3D oldn=QVector3D(0,0,1);
1754 if(mouseLeftDown)
1755 {
1756 QVector2D diff = QVector2D(e->localPos()) - mousePressPosition;
1757 // Rotation axis is perpendicular to the mouse position difference
1758 n = QVector3D(diff.y(), diff.x(), 0.0).normalized();
1759 // Accelerate angular speed relative to the length of the mouse sweep
1760 acc =std::sqrt((diff.y()-oldy)*(diff.y()-oldy)+ float(diff.x()-oldx)*(diff.x()-oldx))/ /*(double)(LocalScene.viewport[2]+1)*/3.0;
1761 // Calculate new rotation axis
1762 rotation = QQuaternion::fromAxisAndAngle(n, acc)*oldRotation;
1763 oldn = n;
1764 }
1765 if(mouseRightDown)
1766 {
1767 cameraDistance -= (e->y()/2 - mouseY) * 0.02f;
1768 mouseY = e->y()/2;
1769 }
1770 update();
1771 }
1772
1773 void MathMod::screenshot()
1774 {
1775 QImage image = QOpenGLWidget::grabFramebuffer();
1776 if (LocalScene.png_ok == 1)
1777 image.save("GLscreenshot.png", "PNG", LocalScene.quality_image);
1778 if (LocalScene.bmp_ok == 1)
1779 image.save("GLscreenshot.bmp", "BMP", LocalScene.quality_image);
1780 }
1781
1782 void MathMod::FramesShot()
1783 {
1784 LocalScene.frame *= -1;
1785 if (LocalScene.frame == 1)
1786 {
1787 FramesDir = QFileDialog::getExistingDirectory(
1788 this, tr("Choose Or Create Directory"), FramesDir,
1789 QFileDialog::DontResolveSymlinks);
1790 if (FramesDir != "" && !FramesDir.endsWith("/"))
1791 FramesDir += "/";
1792 }
1793 }
1794
1795 void MathMod::FramesSave()
1796 {
1797 static int Index = 0;
1798 if (LocalScene.frame == 1)
1799 {
1800 QImage image = QOpenGLWidget::grabFramebuffer(); //:grabFrameBuffer();
1801 QString FileName =
1802 FramesDir + QString("%1").arg(Index, 5, 10, QChar('0')) + ".png";
1803 Index += 1;
1804 image.save(FileName, "PNG", 1);
1805 }
1806 }
1807
1808 QImage MathMod::Copyscreenshot()
1809 {
1810 return (QOpenGLWidget::grabFramebuffer());
1811 }
1812
1813 void MathMod::transparency(int cl, int currentposition)
1814 {
1815 switch (LocalScene.colortype)
1816 {
1817 case 1:
1818 LocalScene.frontcols[(currentposition % 10) * 4 + 3] = (cl / 255.0f);
1819 break;
1820 case 0:
1821 LocalScene.backcols[(currentposition % 10) * 4 + 3] = (cl / 255.0f);
1822 break;
1823 case 2:
1824 LocalScene.gridcol[3] = (cl / 255.0f);
1825 break;
1826 case 3:
1827 LocalScene.groundcol[3] = (cl / 255.0f);
1828 glClearColor(LocalScene.groundcol[0], LocalScene.groundcol[1],
1829 LocalScene.groundcol[2], LocalScene.groundcol[3]);
1830 break;
1831 }
1832 update();
1833 }
1834
1835 void MathMod::red(int cl, int currentposition)
1836 {
1837 switch (LocalScene.colortype)
1838 {
1839 case 1:
1840 LocalScene.frontcols[(currentposition % 10) * 4 + 0] = (cl / 255.0f);
1841 break;
1842 case 0:
1843 LocalScene.backcols[(currentposition % 10) * 4 + 0] = (cl / 255.0f);
1844 break;
1845 case 2:
1846 LocalScene.gridcol[0] = (cl / 255.0f);
1847 break;
1848 case 3:
1849 LocalScene.groundcol[0] = (cl / 255.0f);
1850 glClearColor(LocalScene.groundcol[0], LocalScene.groundcol[1],
1851 LocalScene.groundcol[2], LocalScene.groundcol[3]);
1852 break;
1853 }
1854 update();
1855 }
1856
1857 void MathMod::green(int cl, int currentposition)
1858 {
1859 switch (LocalScene.colortype)
1860 {
1861 case 1:
1862 LocalScene.frontcols[(currentposition % 10) * 4 + 1] = (cl / 255.0f);
1863 break;
1864 case 0:
1865 LocalScene.backcols[(currentposition % 10) * 4 + 1] = (cl / 255.0f);
1866 break;
1867 case 2:
1868 LocalScene.gridcol[1] = (cl / 255.0f);
1869 break;
1870 case 3:
1871 LocalScene.groundcol[1] = (cl / 255.0f);
1872 glClearColor(LocalScene.groundcol[0], LocalScene.groundcol[1],
1873 LocalScene.groundcol[2], LocalScene.groundcol[3]);
1874 break;
1875 }
1876 update();
1877 }
1878
1879 void MathMod::blue(int cl, int currentposition)
1880 {
1881 switch (LocalScene.colortype)
1882 {
1883 case 1:
1884 LocalScene.frontcols[(currentposition % 10) * 4 + 2] = (cl / 255.0f);
1885 break;
1886 case 0:
1887 LocalScene.backcols[(currentposition % 10) * 4 + 2] = (cl / 255.0f);
1888 break;
1889 case 2:
1890 LocalScene.gridcol[2] = (cl / 255.0f);
1891 break;
1892 case 3:
1893 LocalScene.groundcol[2] = (cl / 255.0f);
1894 glClearColor(LocalScene.groundcol[0], LocalScene.groundcol[1],
1895 LocalScene.groundcol[2], LocalScene.groundcol[3]);
1896 break;
1897 }
1898 update();
1899 }
1900
1901 void MathMod::transSpec(int cl)
1902 {
1903 lightSpecular[3] = (cl/ 100.0f);
1904 LocalScene.ShininessValUpdated=true;
1905 update();
1906 }
1907
1908 void MathMod::Shininess(int cl)
1909 {
1910 shininessVal= GLfloat(cl);
1911 LocalScene.ShininessValUpdated=true;
1912 update();
1913 }
1914
1915 void MathMod::InitSpecularParameters()
1916 {
1917 glEnable(GL_DEPTH_TEST);
1918 glFrontFace(GL_CCW);
1919 update();
1920 }
1921
1922 MathMod::MathMod(QWidget *parent, uint nbthreads,
1923 uint initparGrid, uint initisoGrid, uint FactX, uint FactY,
1924 uint FactZ) :QOpenGLWidget(parent)
1925 {
1926 PerlinNoise = new ImprovedNoise(4., 4., 4.);
1927 latence = 10;
1928 Vgrid = Ugrid = 64;
1929 CutV = CutU = 0;
1930 Xgrid = Ygrid = Zgrid = 64;
1931 CutX = CutY = CutZ = 0;
1932 LocalScene.VertxNumber = 0;
1933 LabelInfos.setWindowFlags(Qt::WindowStaysOnTopHint| Qt::FramelessWindowHint);
1934 LabelInfos.setAttribute(Qt::WA_TranslucentBackground);
1935 LabelInfos.setAttribute(Qt::WA_NoSystemBackground);
1936 LabelInfos.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
1937 LabelInfos.setWindowOpacity(0.8);
1938 FramesDir = "/home";
1939 hauteur_fenetre = 2*wh;
1940 timer = new QBasicTimer();
1941 xyzactivated = uvactivated = uvactivated4D = 1;
1942 if (memoryallocation(nbthreads, initparGrid, initisoGrid,
1943 FactX, FactY, FactZ) != 1)
1944 exit(0);
1945 }
1946
1947 void MathMod::attachinfos()
1948 {
1949 if(LocalScene.attachwininfos ==1)
1950 {
1951 QRect r = geometry();
1952 LabelInfos.move(r.left(), r.top());
1953 LabelInfos.setWindowFlags(Qt::WindowStaysOnTopHint| Qt::FramelessWindowHint);
1954 LabelInfos.setAttribute(Qt::WA_TranslucentBackground);
1955 LabelInfos.setAttribute(Qt::WA_NoSystemBackground);
1956 if(LocalScene.infos == 1)
1957 LabelInfos.show();
1958 }
1959 else
1960 {
1961 Qt::WindowFlags flags0 = LabelInfos.windowFlags();
1962 flags0 &= ~Qt::FramelessWindowHint;
1963 LabelInfos.setWindowFlags(flags0);
1964 LabelInfos.setAttribute(Qt::WA_TranslucentBackground, false);
1965 LabelInfos.setAttribute(Qt::WA_NoSystemBackground, false);
1966 LabelInfos.setStyleSheet("QLabel { background-color : black; color : white; }");
1967 LabelInfos.setAutoFillBackground(true);
1968 if(LocalScene.infos == 1)
1969 LabelInfos.show();
1970 }
1971 }
1972
1973 void MathMod::closeEvent(QCloseEvent *)
1974 {
1975 LabelInfos.close();
1976 }
1977
1978 void MathMod::moveEvent(QMoveEvent *)
1979 {
1980 if(LocalScene.attachwininfos ==1)
1981 {
1982 QRect r = geometry();
1983 LabelInfos.move(r.x(), r.y());
1984 }
1985 }
1986
1987 void MathMod::fill()
1988 {
1989 FillOk();
1990 update();
1991 }
1992
1993 void MathMod::iso_infos()
1994 {
1995 LocalScene.infos *= -1;
1996 if(LocalScene.infos == 1)
1997 {
1998 QRect r = geometry();
1999 LabelInfos.move(r.x(), r.y());
2000 LabelInfos.show();
2001 }
2002 else
2003 LabelInfos.hide();
2004 update();
2005 }
2006
2007 void MathMod::updateGL()
2008 {
2009 update();
2010 }
2011
2012 void MathMod::draw_norm_clicked()
2013 {
2014 normOk();
2015 }
2016
2017 void MathMod::frames_clicked()
2018 {
2019 FramesShot();
2020 }
2021
2022 void MathMod::linecolumn_valueupdate(int cl)
2023 {
2024 ParObjet->Vgrid = Vgrid = ParObjet->Ugrid = Ugrid = uint(cl);
2025 ParObjet->masterthread->Ugrid =
2026 ParObjet->masterthread->Vgrid = uint(cl);
2027
2028 for (uint nbthreads = 0;
2029 nbthreads < ParObjet->WorkerThreadsNumber - 1;
2030 nbthreads++)
2031 {
2032 ParObjet->workerthreads[nbthreads].Ugrid =
2033 ParObjet->workerthreads[nbthreads].Vgrid = uint(cl);
2034 }
2035 }
2036
2037 void MathMod::line_valueupdate(int cl)
2038 {
2039 ParObjet->Ugrid = Ugrid = ParObjet->masterthread->Ugrid = uint(cl);
2040 for (uint nbthreads = 0;
2041 nbthreads < ParObjet->WorkerThreadsNumber - 1;
2042 nbthreads++)
2043 {
2044 ParObjet->workerthreads[nbthreads].Ugrid = uint(cl);
2045 }
2046 }
2047
2048 void MathMod::column_valueupdate(int cl)
2049 {
2050 ParObjet->Vgrid = Vgrid = ParObjet->masterthread->Vgrid = uint(cl);
2051
2052 for (uint nbthreads = 0;
2053 nbthreads < ParObjet->WorkerThreadsNumber - 1;
2054 nbthreads++)
2055 {
2056 ParObjet->workerthreads[nbthreads].Vgrid = uint(cl);
2057 }
2058 }
2059
2060 void MathMod::linecolumn_valueChanged(int cl, ModelType type)
2061 {
2062 linecolumn_valueupdate(cl);
2063 if (uvactivated == 1)
2064 (type == PARISO_TYPE) ? ParisoObjectProcess():ParametricSurfaceProcess(1);
2065 else
2066 update();
2067 }
2068
2069 void MathMod::line_valueChanged(int cl)
2070 {
2071 line_valueupdate(cl);
2072 if (uvactivated == 1)
2073 ParametricSurfaceProcess(1);
2074 else
2075 update();
2076 }
2077
2078 void MathMod::column_valueChanged(int cl)
2079 {
2080 column_valueupdate(cl);
2081 if (uvactivated == 1)
2082 ParametricSurfaceProcess(1);
2083 else
2084 update();
2085 }
2086
2087 void MathMod::linecolumn_valueChanged_2(int cl)
2088 {
2089 linecolumn_valueupdate(cl);
2090 if (uvactivated4D == 1)
2091 ParametricSurfaceProcess(3);
2092 else
2093 update();
2094 }
2095
2096 void MathMod::Initparametricpage()
2097 {
2098 LocalScene.typedrawing = -1;
2099 }
2100
2101 void MathMod::xyzg_valueupdate(int cl)
2102 {
2103 IsoObjet->masterthread->XYZgrid = uint(cl);
2104 Xgrid = Ygrid = Zgrid = cl;
2105 }
2106
2107 void MathMod::xyzg_valueChanged(int cl, ModelType type)
2108 {
2109 xyzg_valueupdate(cl);
2110 // process the new surface
2111 if (xyzactivated == 1)
2112 (type == PARISO_TYPE) ? ParisoObjectProcess() : ProcessNewIsoSurface();
2113 }
2114
2115 void MathMod::ShowErrormessage()
2116 {
2117 message.setTextFormat(Qt::RichText);
2118 int before, after;
2119 QString sortie = QString::fromStdString(stError.strError);
2120 if (sortie.length() > (stError.iErrorIndex + 30))
2121 after = 30;
2122 else
2123 after = sortie.length() - stError.iErrorIndex;
2124 sortie.truncate(stError.iErrorIndex + after);
2125 if (stError.iErrorIndex - 30 > 0)
2126 before = 30;
2127 else
2128 before = 0;
2129 sortie = sortie.remove(0, stError.iErrorIndex - before);
2130 sortie.replace("\t", " ");
2131 sortie.replace("\n", " ");
2132 sortie.insert(before, " <font size=14 color=#FF0033>Error => </font>");
2133 message.setText("Error at position: " + QString::number(stError.iErrorIndex) +
2134 "<br><br>" + "..." + sortie + "...");
2135 message.adjustSize();
2136 message.exec();
2137 return;
2138 }
2139
2140 int MathMod::ParsePar()
2141 {
2142 stError = ParObjet->masterthread->parse_expression();
2143 if (stError.iErrorIndex >= 0)
2144 {
2145 ShowErrormessage();
2146 return -1;
2147 }
2148 else
2149 ParObjet->ThreadParsersCopy();
2150 return 1;
2151 }
2152
2153 void MathMod::ParametricSurfaceProcess(int type)
2154 {
2155 if (!ParObjet->isRunning())
2156 {
2157 if (type == 3)
2158 {
2159 ParObjet->masterthread->param4D = 1;
2160 ParObjet->param4D = 1;
2161 ParObjet->masterthread->param3d_C = false;
2162 }
2163 else
2164 {
2165 ParObjet->masterthread->param4D = -1;
2166 ParObjet->param4D = -1;
2167 ParObjet->masterthread->param4d_C = false;
2168 }
2169 int result = ParsePar();
2170 if (result == -1)
2171 return;
2172 LocalScene.typedrawing = -1;
2173 ParObjet->localScene = &(LocalScene);
2174 ParObjet->start(QThread::LowPriority);
2175 }
2176 }
2177
2178 void MathMod::ParisoObjectProcess()
2179 {
2180 LocalScene.typedrawing = 0;
2181 LocalScene.updategl = false;
2182 LocalScene.componentsinfos.pariso = true;
2183
2184 if (!ParObjet->isRunning())
2185 {
2186 ParObjet->masterthread->param4D =
2187 ParObjet->param4D = -1;
2188 ParObjet->masterthread->param4d_C =
2189 ParObjet->masterthread->param3d_C = false;
2190 int result = ParsePar();
2191 if (result == -1)
2192 return;
2193 ParObjet->localScene = &(LocalScene);
2194 ParObjet->start(QThread::LowPriority);
2195 ParObjet->wait();
2196 }
2197 if (!IsoObjet->isRunning())
2198 {
2199 int result = ParseIso();
2200 if (result == -1)
2201 return;
2202 IsoObjet->localScene = &(LocalScene);
2203 IsoObjet->start(QThread::LowPriority);
2204 }
2205 }
2206
2207 int MathMod::ParseIso()
2208 {
2209 stError = IsoObjet->masterthread->ParserIso();
2210 if (stError.iErrorIndex >= 0)
2211 {
2212 ShowErrormessage();
2213 return -1;
2214 }
2215 else
2216 IsoObjet->ThreadParsersCopy();
2217 return 1;
2218 }
2219
2220 void MathMod::ProcessNewIsoSurface()
2221 {
2222 if (!IsoObjet->isRunning())
2223 {
2224 int result = ParseIso();
2225 if (result == -1)
2226 return;
2227 LocalScene.typedrawing = 1;
2228 IsoObjet->localScene = &(LocalScene);
2229 IsoObjet->start(QThread::LowPriority);
2230 }
2231 }
2232
2233 void MathMod::slot_checkBox73_clicked(ModelType type)
2234 {
2235 xyzactivated *= -1;
2236 // process the new surface
2237 if (xyzactivated == 1)
2238 (type == PARISO_TYPE) ? ParisoObjectProcess() : ProcessNewIsoSurface();
2239 }
2240
2241 void MathMod::slot_uv_clicked(ModelType type)
2242 {
2243 uvactivated *= -1;
2244 // process the new surface
2245 if (uvactivated == 1)
2246 (type == PARISO_TYPE) ? ParisoObjectProcess() : ParametricSurfaceProcess(1);
2247 }
2248
2249 void MathMod::slot_uv4D_clicked()
2250 {
2251 uvactivated4D *= -1;
2252 // process the new surface
2253 if (uvactivated4D == 1)
2254 ParametricSurfaceProcess(3);
2255 }
2256
2257 void MathMod::slot_triangles_clicked()
2258 {
2259 LocalScene.triangles *= -1;
2260 update();
2261 }
2262
2263 void MathMod::Mesh()
2264 {
2265 LocalScene.mesh *= -1;
2266 update();
2267 }