/***************************************************************************
 *   Copyright (C) 2007 by Abderrahman Taha                                *
 *                                                                         *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
 ***************************************************************************/
#include <qgl.h>

#include <qpointarray.h>

#include <qpainter.h>

#include <qbrush.h>

#include <qstring.h>

#include <iostream>

#include <string>

#include <cmath>

#include <vector>

#include <list>

#include "IsoMatrix3D.h"

#include "fparser/fparser.h"

#include <qfile.h>

#include <qtextedit.h>

#include "edit.h"


using std::string;
using std::vector;
using std::list;
/*


                     4.-----------4----------------.5
                     /|                           /|
                    7 |                          5 |
                   /  |                         /  |
                 7.---|-----------6------------.6  |
                  |   |                        |   |
                  |   8                        |   9
                  |   |                        |   |
                  |   ^ j                      |   |
                 11   |                       10   |
                  |   |     i                  |   |
                  |  0.----->-----0------------|---.1
                  |  /                         |  /
                  | 3 k                        | 1
                  |/                           |/
                 3.---------------2------------.2
*/

///************* A new Structure that represents a Voxel *********///
struct  Voxel {
   //double PositionX, PositionY, PositionZ;
    int Edge_Points [12]; //reference to the Edge Points
    int  Signature; // From 0 to 255
    int NbEdgePoint;
    //int Index[4];
    //double Value;   // The value of the implicit function.
                  };

///************* A new Structure that represents a Triangle *********///
struct  IsoTriangle {
   QPointArray * pl;
   double valeur_z;
   double valeur_cos;
   int TypeCND; /// Two types : 1 --> Draw like a normal triangle; 2 --> Draw in Red
                    };

class Iso3D {
public :
   double IsoPointMapOriginal[2*3*5];
   double IsoPointMapTransfrm[3*1];
   double IsoPointMapProjectd[3*1];
/// Conditional data :
   int *     WichPointVeryCond;
   int *     TypeIsoSurfaceTriangleListeCND;
   int *     IsoSurfaceTriangleListe;
   GLfloat * NormVertexTab;
   GLuint *  IndexPolyTab;

   double IsoPointMapOriginalCD[3*1];
   double IsoPointMapProjectdCD[3*1];
   double IsoPointMapTransfrmCD[3*1];

   double IsoNormOriginal[2*3*1];
   double IsoNormTransfrm[3*1];

   double AxeArrayOriginal[3][6];  // 3D Axes X, y and Z with 50 points
   double AxeArrayProjectd[3][6];  // 3D Axes X, y and Z with 50 points
   double AxeArrayTransfrm[3][6];  // 3D Axes X, y and Z with 50 points

   int IsoSurfaceTriangleListeCND[3*1];

   double NormTransfrm[3*1];
   double NormOriginal[2*3*1];
   double FileOutput[1];

   int MaximumNumberPoints, MaximumNumberTriangles;
   int NbPointIsoMap;
   int NbPointIsoMapCND;
   int NbTriangleIsoSurface;
   int NbTriangleIsoSurfaceCND;
   int I, J, IJ, IK, JK, IJK, IPLUSONEJK, IMINUSONEJK,
       IJPLUSONEK, IJMINUSONEK, IPLUSONEJPLUSONEK,  IMINUSONEJMINUSONEK;
   int i,j,k,l;
   FunctionParser ImplicitFunctionParser,
                  XSupParser, XInfParser,
                  YSupParser, YInfParser,
                  ZSupParser, ZInfParser,
                  IsoConditionParser,
                  ExpressionEvaluator,Iso;

   QString ImplicitFunction, IsoCondition,
           XlimitSup, XlimitInf,
           YlimitSup, YlimitInf,
           ZlimitSup, ZlimitInf,
           ImplicitFunction_save,
           XlimitSup_save, XlimitInf_save,
           YlimitSup_save, YlimitInf_save,
           ZlimitSup_save, ZlimitInf_save;

   double newcoeffx, newcoeffy, newcoeffz;
   double X_Start, X_End, X_Step,
          Y_Start, Y_End, Y_Step,
          Z_Start, Z_End, Z_Step;
    int nb_ligne, nb_colon, nb_depth,
        clipping, CutLigne, CutColon, CutDepth,
        IsoConditionRequired;
    double D;
    double Oprime[3], Obser[3];
    double MINX,MINY,MINZ,MINW,MINT,MINS,
           MAXX,MAXY,MAXZ,MAXW,MAXT,MAXS,
           DIFX,DIFY,DIFZ,DIFW,DIFT,DIFS,
           DIFMAXIMUM, decalage_xo, decalage_yo, decalage_zo,
           IsoValue, anglex, angley, ancienx, ancieny, ScalCoeff,
           morph_param, step, axe_size,
           newscalex, newscaley, newscalez;
    int    demi_hauteur, demi_largeur, hauteur_fenetre;
    IsoMatrix3D MatGen, MatRot, MatRotSave, MatSca, MatInv;
    int  frontsurfr, frontsurfg, frontsurfb,
         backsurfr,  backsurfg,  backsurfb,
         CNDsurfr,  CNDsurfg,  CNDsurfb,
         gridr, gridg, gridb, gridtransparent,
         PovActivate, fronttrans, backtrans, CNDtrans;
    QPointArray *tableaureferences[1];
    IsoTriangle * tableau;
    QPointArray  isotriangle;
    vector<IsoTriangle *> VectorIsoTriangle;
    QBrush palette_front_face[256], palette_back_face[256], palette_CND[256];
    QColor palette_grid[256];
    int IsoMesh, IsoInfos, NbTriangleUsed,
        axe_width, axe_center, DrawAxe_Ok, CNDMesh,
        CNDDraw, BorderDraw, Borderlimite;

   /// Data Set:
   FunctionParser  u1, u2, u3, b1, b2, b3;
   QString  UnaryU1, UnaryU2, UnaryU3,
            BinaryB1, BinaryB2, BinaryB3;

   double XLocal[2000], YLocal[2000], ZLocal[2000];
   double Dxy[300*300],Dxz[300*300],Dyz[300*300],Dyx[300*300],Dzx[300*300],Dzy[300*300];
   double Exy[300*300],Exz[300*300],Eyz[300*300],Eyx[300*300],Ezx[300*300],Ezy[300*300];
   double Fxy[300*300],Fxz[300*300],Fyz[300*300],Fyx[300*300],Fzx[300*300],Fzy[300*300];
   double *DataTable[40];
   int     DataActive[40];
   int U1, U2, U3, B1, B2, B3;

   int NbPolygonImposedLimit ;
   int NbVertex;
   GLuint NbPolygn;
   GLuint NbPolygnNbVertex[2*50];
   int CurrentStep; /// To hold the current step in the Morph process
   int ActivateHeightSpeedCalculations;

public :
   Iso3D();
   ~Iso3D();
inline   void VoxelEvaluation ();
inline   void PointEdgeComputation();
   void DrawIsoSurface();
inline   void InitParser();
inline   void InitParameter();
inline   void SignatureComputation();
inline   void ConstructIsoSurface();
inline   void ConstructIsoNormale();
         void ProjectIsoMap();
         void RotateIsoMap();
         void TranslateIsoMap();
         void ScaleIsoMap();
         void BoxIsoMap();
         void ApplicateTransform();
         void ApplicateProjection();
         void DrawIsoMap(QPainter &);
         void Rotate();
         void AnimMorph();
         void Scale();
         void PaletteInit();
         void ComputeIsoMap();
         void ChangeMaxResolution(int, int);
inline   void ParseExpression();
         void CutIsoSurface();
         void SaveIsoMap();
         void SaveIsoMapUnifColor();

         void scalex(int);
         void scaley(int);
         void scalez(int);

         void twistex(double, double);
         void twistey(double, double);
         void twistez(double, double);
         void MinimalMeshObjFile();
/// FOR GL Window :
         void SpecialAnim_1();
         void SpecialAnim_2(GLfloat *, GLuint *);
         void SpecialAnim_3(GLfloat *, GLuint *);
         void SpecialMorph_1();
         void SpecialMorph_2(GLfloat *, GLuint *, GLuint *, int *, int *, int);
         void SpecialMorph_2(GLfloat *, GLuint *, GLuint *, int *, int *, int,
                     GLuint * a=NULL, int *b=NULL, int c=0);
 void SpecialMorph_3(GLfloat *, GLuint *, GLuint *, int *, int *, int);
 void SaveIsoGLMap();
 int setmaxgridto(int);
 void SetMinimuMmeshSize(double);
 void SetMinimuMmeshStruct();
 void SetMiniMmeshStructStream(QString, int);
 void RunPovScript();
 void stopcalculations();
 int Parse(QString);
};


syntax highlighted by Code2HTML, v. 0.9.1