"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.
For more information about "mathmod.cpp" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
11.0_vs_11.1.
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 }