ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/diamesh/src/m3d_front.cpp
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (17 years, 11 months ago)
Original Path: magic/lib/diamesh/diamesh/src/m3d_front.cpp
File size: 4039 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 #include <stdio.h>
2     #include "m3d_struct.h"
3     #include "m3d_const.h"
4     #include "m3d_hotes.h"
5     #include "m3d_erreur.h"
6     #include "prototype.h"
7     extern int debug ;
8     extern int recover ;
9     extern GEST_MEM *gest ;
10     void m3d_front(float *coord,FACE *face,FACE **tab_front,int type,int *ierr)
11     {
12     FACE *front, *fin ;
13     NOEUD *n1, *n2 , *n3 ;
14     char mess[255];
15     OBJET *obj, *tete_obj,*sobj ;
16     int num_essai ;
17    
18     n1 = face->n1 ;
19     n2 = face->n2 ;
20     n3 = face->n3 ;
21    
22     switch(type)
23     {
24     case KILL : /* destruction de l'objet */
25     /* face de peau aucun changement */
26     if (face->hist == 0)
27     {
28     face->nb_qua = 0 ;
29     return ;
30     }
31     /* faces actives connectees aux noeuds */
32     (n1->mark)-- ;
33     (n2->mark)-- ;
34     (n3->mark)-- ;
35     break ;
36    
37     case REMOVE : /* on enleve la face active du front et on gere la connectivite */
38     /* faces actives */
39     (n1->mark)-- ;
40     (n2->mark)-- ;
41     (n3->mark)-- ;
42     /* la face reste attachee au noeud */
43    
44     /* aucune face active */
45    
46     if (n1->mark == CARD_NULL) n1->mark = NO_CONNEC ;
47     if (n2->mark == CARD_NULL) n2->mark = NO_CONNEC ;
48     if (n3->mark == CARD_NULL) n3->mark = NO_CONNEC ;
49    
50     break ;
51     case RESTORE :
52     /* la face a ete absorbee : la cardinalite des noeuds a ete decrementee, il faut la restaurer */
53    
54     if (n1->mark == NO_CONNEC) n1->mark = 0;
55     if (n2->mark == NO_CONNEC) n2->mark = 0 ;
56     if (n3->mark == NO_CONNEC) n3->mark = 0 ;
57    
58     (n1->mark)++ ;
59     (n2->mark)++ ;
60     (n3->mark)++ ;
61     break ;
62     default:break ;
63     }
64     num_essai = face->essai ;
65     front = tab_front[2*num_essai] ;
66     fin = tab_front[2*num_essai + 1] ;
67    
68     /* supression de la face et mise a jour du front */
69     /* on isole la face */
70    
71     if (face->mark!=KILLED)
72     switch(type)
73     {
74     case MOVE:case REMOVE:case KILL:
75     SUPPRIMER_LISTE(face,tab_front[2*num_essai],tab_front[2*num_essai+1],face)
76     break ;
77     default :break ;
78     }
79     switch(type)
80     {
81     case KILL :
82     /* destruction de la face */
83     face->mark = DESTROYED ;
84     face->tetra1 = NULL ;
85     face->tetra2= NULL ;
86     face = NULL ;
87     return ;
88    
89     case REMOVE :
90     /* la face est absorbee par le front */
91     face->mark = KILLED ;
92     return ;
93    
94     case MOVE :
95     /* le recherche n'a pas abouti, on passe a l'essai suivant */
96     if ((recover) && (gest->nb_tetra < gest->nb_rec)) face->essai = NUM_LIMITE ;
97     else
98     {
99     if (face->essai==LAST)
100     {
101     face->essai = NUM_ERREUR ;
102     }
103     else
104     {
105     face->essai = (face->essai) + 1 ;
106     }
107     }
108     break ;
109    
110     case CREER :
111     face->essai = ATTENTE ;/* la face est mise en attente pour la couche suivante */
112     break ;
113    
114     case CREER_GEN :
115     /* face issue d'une creation par generation, on cherche a les connecter le plus vite possible */
116     face->essai = NUM_GENE ;
117     break ;
118     case CREER_FACE_GEN :
119     /* face issue d'une creation par generation, on cherche a les connecter le plus vite possible */
120     face->essai = NUM_FACE_GEN ;
121     break ;
122     case RESTORE : /* face restauree */
123     face->essai = NUM_REST ;
124     face->mark = FAUX ;
125     if ( (face->hist!=0) && (face->hist!=FACE_GENEREE))
126     {
127     face->hist = BACK ;
128     }
129     if (face->hist!=0)
130     if ((face->tetra1==NULL) && (face->tetra2==NULL))
131     {
132     if (debug)
133     {
134     sprintf(mess,"%s\n"," Incoherence, face restauree libre (RESTORE) M3D_FRONT") ;
135     //aff_text(mess);
136     }
137     *ierr = VRAI ;
138     m3d_erreur(ERR_SYST) ;
139     return ;
140     }
141     break ;
142     default : break ;
143     }
144     num_essai = face->essai ;
145     front = tab_front[2*num_essai] ;
146     fin = tab_front[2*num_essai + 1] ;
147    
148     switch(type)
149     {
150     /* insertion en queue */
151     case CREER : case MOVE : case CREER_GEN : case CREER_FACE_GEN :
152     INSERER_FIN_LISTE(tab_front[2*num_essai],tab_front[2*num_essai + 1],face)
153     break ;
154    
155     case RESTORE :/* faces restaurees */
156     /* Insertion en tete de liste */
157     INSERER_TETE_LISTE(tab_front[2*num_essai],tab_front[2*num_essai + 1],face)
158     break ;
159     default :
160     *ierr = VRAI ;
161     m3d_erreur(ERR_SYST) ;
162     return ;
163     }
164     return ;
165     }