home *** CD-ROM | disk | FTP | other *** search
- #define STRICT
-
- // Includes standard Windows
- #include <windows.h>
- #include <windowsx.h>
- #include <time.h>
- #include <stdlib.h>
- #include <malloc.h>
- #include <memory.h>
- #include <stdio.h>
-
- // Includes D3D
- #define D3D_OVERLOADS
- #include <ddraw.h>
- #include <d3d.h>
- #include <d3dx.h>
-
- // Includes utilitaires D3D
- #include "d3dmath.h"
- #include "d3dutil.h"
- #include "D3DEnum.h"
-
- // Ids Resources
- #include "resource.h"
-
- // Constantes
- #include "const.h"
-
- // Types
- #include "types.h"
-
- // Variables globales projet
- #include "vars.h"
-
- // Prototypes fonctions autres modules
- #include "proto.h"
-
- // Macros
- #include "macros.h"
-
- // Structure d'interface avec le triangulateur Delaunay
- #include "triangulator.h"
-
- void fill(void)
- {
- int iCnt, iVertices, iEdges, iVertex, iEdge, iTriangles, iTriangle, *pTable = NULL;
- struct triangulateio in, out;
-
- vTrace("Triangulation par méthode Voronoi / Delaunay / Shewchuk / Rupert");
-
- // Calculer le nombre de points (touet la sélection : périphérie + trous)
- iVertices = 0;
- for (iVertex = 0 ; iVertex <= iVertLastUsed ; iVertex++)
- if (bIsVertexSelected(iVertex))
- iVertices++;
-
- vTrace(" * Traitement de %d points", iVertices);
-
- // Si on n'a pas au moins 4 sommets on ne peut pas trianguler
- if (iVertices < 4) return;
-
- // Calculer le nombre de segments
- iEdges = 0;
- for (iEdge = 0 ; iEdge <= iEdgeLastUsed ; iEdge++)
- if (bIsEdgeSelected(iEdge))
- iEdges++;
-
- vTrace(" * Traitement de %d arêtes", iEdges);
-
- // Vérifier la cohérence du nombre de segments par rapport au nombre de points...
- if (iVertices != iEdges)
- {
- vTrace("*** E0030 : Incohérence nombre de sommets / nombre d'arêtes : la structure n'est pas fermée");
- return;
- }
-
- // Préparer la structure d'interface triangulateur
- ZeroMemory(&in, sizeof(in));
- ZeroMemory(&out, sizeof(out));
-
- in.numberofpoints = iVertices;
- if (!(in.pointlist = (double *) malloc(in.numberofpoints * 2 * sizeof(double)))) goto _cleanexit;
-
- in.numberofsegments = iEdges;
- if (!(in.segmentlist = (int *) malloc(in.numberofsegments * 2 * sizeof(int)))) goto _cleanexit;
-
- // Cacher les deux fenêtres 2D non actives
- switch(lWActive)
- {
- case XDC_WID_TOP : // X et Z
- ShowWindow(hWndFace, SW_HIDE);
- ShowWindow(hWndRight, SW_HIDE);
- break;
-
- case XDC_WID_FACE : // X et Y
- ShowWindow(hWndTop, SW_HIDE);
- ShowWindow(hWndRight, SW_HIDE);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- ShowWindow(hWndTop, SW_HIDE);
- ShowWindow(hWndFace, SW_HIDE);
- break;
- }
-
- // Acquérir la position des trous (trick WM_USER+1 entre 2dWndProc et HoleDlg)
- DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_HOLES), NULL, bHoleDlgProc, 0);
-
- // Positionner les trous
- in.numberofholes = iHoles = 0;
- in.holelist = dHoles;
-
- // Ecrire les coordonnées des points en mémorisant le mapping indices internes / externes
- iCnt = 0;
- if (!(pTable = (int *) malloc(iVertices * sizeof(int)))) goto _cleanexit;
- for (iVertex = 0 ; iVertex <= iVertLastUsed ; iVertex++)
- if (bIsVertexSelected(iVertex))
- {
- switch(lWActive)
- {
- case XDC_WID_TOP : // X et Z
- in.pointlist[2 * iCnt + 0] = Vertices[iVertex].vPoint.x;
- in.pointlist[2 * iCnt + 1] = Vertices[iVertex].vPoint.z;
- break;
-
- case XDC_WID_FACE : // X et Y
- in.pointlist[2 * iCnt + 0] = Vertices[iVertex].vPoint.x;
- in.pointlist[2 * iCnt + 1] = Vertices[iVertex].vPoint.y;
- break;
-
- case XDC_WID_SIDE : // Z et Y
- in.pointlist[2 * iCnt + 0] = Vertices[iVertex].vPoint.z;
- in.pointlist[2 * iCnt + 1] = Vertices[iVertex].vPoint.y;
- break;
- }
- pTable[iCnt++] = iVertex;
- }
-
- // Ecrire les indices des segments
- iCnt = 0;
- for (iEdge = 0 ; iEdge <= iEdgeLastUsed ; iEdge++)
- if (bIsEdgeSelected(iEdge))
- {
- // Déterminer les indices externes des deux sommets du segment
- int iS0 = -1, iS1 = -1, jCnt = 0;
-
- do
- {
- if (pTable[jCnt] == Edges[iEdge].iSommets[0]) iS0 = jCnt;
- if (pTable[jCnt] == Edges[iEdge].iSommets[1]) iS1 = jCnt;
- jCnt++;
- } while (iS0 == -1 || iS1 == -1);
-
- in.segmentlist[2 * iCnt + 0] = iS0;
- in.segmentlist[2 * iCnt + 1] = iS1;
-
- iCnt++;
- }
-
- // Trianguler les points
- triangulate("pzPN", &in, &out, NULL);
-
- // 1 - nombre de triangles
- iTriangles = out.numberoftriangles;
- vTrace(" * %d triangle(s) produit(s)", iTriangles);
-
- // 2 - définition des triangles
- for (iTriangle = 0 ; iTriangle < iTriangles ; iTriangle++)
- {
- int is1, is2, is3;
-
- is1 = pTable[out.trianglelist[iTriangle * 3 + 0]];
- is2 = pTable[out.trianglelist[iTriangle * 3 + 1]];
- is3 = pTable[out.trianglelist[iTriangle * 3 + 2]];
-
- iMakeTriangle(is1, is2, is3, 3);
- }
-
- // Si on a triangulé et qu'il faut supprimer les arêtes, on les supprime
- if (iTriangles && bFillAndRemoveEdges)
- for (iEdge = 0 ; iEdge <= iEdgeLastUsed ; iEdge++)
- if (bIsEdgeSelected(iEdge))
- bDeleteEdge(iEdge);
-
- // Remontrer les deux fenêtres 2D non actives
- switch(lWActive)
- {
- case XDC_WID_TOP : // X et Z
- ShowWindow(hWndFace, SW_SHOWNA);
- ShowWindow(hWndRight, SW_SHOWNA);
- break;
-
- case XDC_WID_FACE : // X et Y
- ShowWindow(hWndTop, SW_SHOWNA);
- ShowWindow(hWndRight, SW_SHOWNA);
- break;
-
- case XDC_WID_SIDE : // Z et Y
- ShowWindow(hWndTop, SW_SHOWNA);
- ShowWindow(hWndFace, SW_SHOWNA);
- break;
- }
-
- _cleanexit:
- if (pTable) free(pTable);
- if (in.pointlist) free(in.pointlist);
- if (in.segmentlist) free(in.segmentlist);
- if (out.trianglelist) free(out.trianglelist);
- }
-