Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

aas_facemerging.c File Reference

#include "qbsp.h"
#include "../botlib/aasfile.h"
#include "aas_create.h"

Include dependency graph for aas_facemerging.c:

Include dependency graph

Go to the source code of this file.

Functions

int AAS_CanMergePlaneFaces (tmp_area_t *tmparea, int planenum)
void AAS_MergeAreaFaces (void)
void AAS_MergeAreaPlaneFaces (void)
void AAS_MergePlaneFaces (tmp_area_t *tmparea, int planenum)
int AAS_TryMergeFaces (tmp_face_t *face1, tmp_face_t *face2)


Function Documentation

int AAS_CanMergePlaneFaces tmp_area_t tmparea,
int  planenum
 

Definition at line 216 of file aas_facemerging.c.

References tmp_face_s::backarea, tmp_face_s::faceflags, tmp_face_s::frontarea, tmp_face_s::next, tmp_face_s::planenum, tmp_area_t, tmp_face_t, and tmp_area_s::tmpfaces.

Referenced by AAS_MergeAreaPlaneFaces().

00217 {
00218     tmp_area_t *frontarea, *backarea;
00219     tmp_face_t *face1;
00220     int side1, merge, faceflags;
00221 
00222     frontarea = backarea = NULL;
00223     merge = false;
00224     for (face1 = tmparea->tmpfaces; face1; face1 = face1->next[side1])
00225     {
00226         side1 = face1->frontarea != tmparea;
00227         if ((face1->planenum & ~1) != (planenum & ~1)) continue;
00228         if (!frontarea && !backarea)
00229         {
00230             frontarea = face1->frontarea;
00231             backarea = face1->backarea;
00232             faceflags = face1->faceflags;
00233         } //end if
00234         else
00235         {
00236             if (frontarea != face1->frontarea) return false;
00237             if (backarea != face1->backarea) return false;
00238             if (faceflags != face1->faceflags) return false;
00239             merge = true;
00240         } //end else
00241     } //end for
00242     return merge;
00243 } //end of the function AAS_CanMergePlaneFaces

void AAS_MergeAreaFaces void   ) 
 

Definition at line 129 of file aas_facemerging.c.

References AAS_CheckArea(), AAS_TryMergeFaces(), tmp_aas_s::areas, tmp_face_s::frontarea, tmp_area_s::invalid, tmp_area_s::l_next, Log_Write(), tmp_face_s::next, qprintf(), tmp_area_t, tmp_face_t, tmpaasworld, and tmp_area_s::tmpfaces.

Referenced by AAS_Create().

00130 {
00131     int num_facemerges = 0;
00132     int side1, side2, restart;
00133     tmp_area_t *tmparea, *lasttmparea;
00134     tmp_face_t *face1, *face2;
00135 
00136     Log_Write("AAS_MergeAreaFaces\r\n");
00137     qprintf("%6d face merges", num_facemerges);
00138     //NOTE: first convex area is a dummy
00139     lasttmparea = tmpaasworld.areas;
00140     for (tmparea = tmpaasworld.areas; tmparea; tmparea = tmparea->l_next)
00141     {
00142         restart = false;
00143         //
00144         if (tmparea->invalid) continue;
00145         //
00146         for (face1 = tmparea->tmpfaces; face1; face1 = face1->next[side1])
00147         {
00148             side1 = face1->frontarea != tmparea;
00149             for (face2 = face1->next[side1]; face2; face2 = face2->next[side2])
00150             {
00151                 side2 = face2->frontarea != tmparea;
00152                 //if succesfully merged
00153                 if (AAS_TryMergeFaces(face1, face2))
00154                 {
00155                     //start over again after merging two faces
00156                     restart = true;
00157                     num_facemerges++;
00158                     qprintf("\r%6d", num_facemerges);
00159                     AAS_CheckArea(tmparea);
00160                     break;
00161                 } //end if
00162             } //end for
00163             if (restart)
00164             {
00165                 tmparea = lasttmparea;
00166                 break;
00167             } //end if
00168         } //end for
00169         lasttmparea = tmparea;
00170     } //end for
00171     qprintf("\n");
00172     Log_Write("%6d face merges\r\n", num_facemerges);
00173 } //end of the function AAS_MergeAreaFaces

Here is the call graph for this function:

void AAS_MergeAreaPlaneFaces void   ) 
 

Definition at line 250 of file aas_facemerging.c.

References AAS_CanMergePlaneFaces(), AAS_MergePlaneFaces(), tmp_aas_s::areas, tmp_face_s::frontarea, tmp_area_s::invalid, tmp_area_s::l_next, Log_Write(), tmp_face_s::next, tmp_face_s::planenum, qprintf(), tmp_area_t, tmp_face_t, tmpaasworld, and tmp_area_s::tmpfaces.

Referenced by AAS_Create().

00251 {
00252     int num_facemerges = 0;
00253     int side1;
00254     tmp_area_t *tmparea, *nexttmparea;
00255     tmp_face_t *face1;
00256 
00257     Log_Write("AAS_MergePlaneFaces\r\n");
00258     qprintf("%6d plane face merges", num_facemerges);
00259     //NOTE: first convex area is a dummy
00260     for (tmparea = tmpaasworld.areas; tmparea; tmparea = nexttmparea)
00261     {
00262         nexttmparea = tmparea->l_next;
00263         //
00264         if (tmparea->invalid) continue;
00265         //
00266         for (face1 = tmparea->tmpfaces; face1; face1 = face1->next[side1])
00267         {
00268             side1 = face1->frontarea != tmparea;
00269             //
00270             if (AAS_CanMergePlaneFaces(tmparea, face1->planenum))
00271             {
00272                 AAS_MergePlaneFaces(tmparea, face1->planenum);
00273                 nexttmparea = tmparea;
00274                 num_facemerges++;
00275                 qprintf("\r%6d", num_facemerges);
00276                 break;
00277             } //end if
00278         } //end for
00279     } //end for
00280     qprintf("\n");
00281     Log_Write("%6d plane face merges\r\n", num_facemerges);
00282 } //end of the function AAS_MergeAreaPlaneFaces

Here is the call graph for this function:

void AAS_MergePlaneFaces tmp_area_t tmparea,
int  planenum
 

Definition at line 180 of file aas_facemerging.c.

References AAS_FreeTmpFace(), AAS_RemoveFaceFromArea(), tmp_face_s::backarea, FreeWinding(), tmp_face_s::frontarea, mapplanes, MergeWindings(), tmp_face_s::next, tmp_face_s::planenum, tmp_area_t, tmp_face_t, tmp_area_s::tmpfaces, and tmp_face_s::winding.

Referenced by AAS_MergeAreaPlaneFaces().

00181 {
00182     tmp_face_t *face1, *face2, *nextface2;
00183     winding_t *neww;
00184     int side1, side2;
00185 
00186     for (face1 = tmparea->tmpfaces; face1; face1 = face1->next[side1])
00187     {
00188         side1 = face1->frontarea != tmparea;
00189         if (face1->planenum != planenum) continue;
00190         //
00191         for (face2 = face1->next[side1]; face2; face2 = nextface2)
00192         {
00193             side2 = face2->frontarea != tmparea;
00194             nextface2 = face2->next[side2];
00195             //
00196             if ((face2->planenum & ~1) != (planenum & ~1)) continue;
00197             //
00198             neww = MergeWindings(face1->winding, face2->winding,
00199                                 mapplanes[face1->planenum].normal);
00200             FreeWinding(face1->winding);
00201             face1->winding = neww;
00202             if (face2->frontarea) AAS_RemoveFaceFromArea(face2, face2->frontarea);
00203             if (face2->backarea) AAS_RemoveFaceFromArea(face2, face2->backarea);
00204             AAS_FreeTmpFace(face2);
00205             //
00206             nextface2 = face1->next[side1];
00207         } //end for
00208     } //end for
00209 } //end of the function AAS_MergePlaneFaces

Here is the call graph for this function:

int AAS_TryMergeFaces tmp_face_t face1,
tmp_face_t face2
 

Definition at line 33 of file aas_facemerging.c.

References AAS_FreeTmpFace(), AAS_RemoveFaceFromArea(), tmp_face_s::backarea, Error(), tmp_face_s::faceflags, FreeWinding(), tmp_face_s::frontarea, Log_Write(), mapplanes, MergeWindings(), tmp_face_s::num, tmp_face_s::planenum, tmp_face_t, TryMergeWinding(), and tmp_face_s::winding.

Referenced by AAS_MergeAreaFaces().

00034 {
00035     winding_t *neww;
00036 
00037 #ifdef DEBUG
00038     if (!face1->winding) Error("face1 %d without winding", face1->num);
00039     if (!face2->winding) Error("face2 %d without winding", face2->num);
00040 #endif //DEBUG
00041     //
00042     if (face1->faceflags != face2->faceflags) return false;
00043     //NOTE: if the front or back area is zero this doesn't mean there's
00044     //a real area. It means there's solid at that side of the face
00045     //if both faces have the same front area
00046     if (face1->frontarea == face2->frontarea)
00047     {
00048         //if both faces have the same back area
00049         if (face1->backarea == face2->backarea)
00050         {
00051             //if the faces are in the same plane
00052             if (face1->planenum == face2->planenum)
00053             {
00054                 //if they have both a front and a back area (no solid on either side)
00055                 if (face1->frontarea && face1->backarea)
00056                 {
00057                     neww = MergeWindings(face1->winding, face2->winding,
00058                                 mapplanes[face1->planenum].normal);
00059                 } //end if
00060                 else
00061                 {
00062                     //this function is to be found in l_poly.c
00063                     neww = TryMergeWinding(face1->winding, face2->winding,
00064                                     mapplanes[face1->planenum].normal);
00065                 } //end else
00066                 if (neww)
00067                 {
00068                     FreeWinding(face1->winding);
00069                     face1->winding = neww;
00070                     if (face2->frontarea) AAS_RemoveFaceFromArea(face2, face2->frontarea);
00071                     if (face2->backarea) AAS_RemoveFaceFromArea(face2, face2->backarea);
00072                     AAS_FreeTmpFace(face2);
00073                     return true;
00074                 } //end if
00075             } //end if
00076             else if ((face1->planenum & ~1) == (face2->planenum & ~1))
00077             {
00078                 Log_Write("face %d and %d, same front and back area but flipped planes\r\n",
00079                             face1->num, face2->num);
00080             } //end if
00081         } //end if
00082     } //end if
00083     return false;
00084 } //end of the function AAS_TryMergeFaces

Here is the call graph for this function:


Generated on Thu Aug 25 12:46:10 2005 for Quake III Arena by  doxygen 1.3.9.1