"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 }