00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "qbsp.h"
00024 #include "../botlib/aasfile.h"
00025 #include "aas_create.h"
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 int AAS_MeltFaceWinding(tmp_face_t *face1, tmp_face_t *face2)
00036 {
00037 int i, n;
00038 int splits = 0;
00039 winding_t *w2, *neww;
00040 plane_t *plane1;
00041
00042 #ifdef DEBUG
00043 if (!face1->winding) Error("face1 %d without winding", face1->num);
00044 if (!face2->winding) Error("face2 %d without winding", face2->num);
00045 #endif //DEBUG
00046 w2 = face2->winding;
00047 plane1 = &mapplanes[face1->planenum];
00048 for (i = 0; i < w2->numpoints; i++)
00049 {
00050 if (PointOnWinding(face1->winding, plane1->normal, plane1->dist, w2->p[i], &n))
00051 {
00052 neww = AddWindingPoint(face1->winding, w2->p[i], n);
00053 FreeWinding(face1->winding);
00054 face1->winding = neww;
00055
00056 splits++;
00057 }
00058 }
00059 return splits;
00060 }
00061
00062
00063
00064
00065
00066
00067
00068 int AAS_MeltFaceWindingsOfArea(tmp_area_t *tmparea)
00069 {
00070 int side1, side2, num_windingsplits = 0;
00071 tmp_face_t *face1, *face2;
00072
00073 for (face1 = tmparea->tmpfaces; face1; face1 = face1->next[side1])
00074 {
00075 side1 = face1->frontarea != tmparea;
00076 for (face2 = tmparea->tmpfaces; face2; face2 = face2->next[side2])
00077 {
00078 side2 = face2->frontarea != tmparea;
00079 if (face1 == face2) continue;
00080 num_windingsplits += AAS_MeltFaceWinding(face1, face2);
00081 }
00082 }
00083 return num_windingsplits;
00084 }
00085
00086
00087
00088
00089
00090
00091
00092 void AAS_MeltAreaFaceWindings(void)
00093 {
00094 tmp_area_t *tmparea;
00095 int num_windingsplits = 0;
00096
00097 Log_Write("AAS_MeltAreaFaceWindings\r\n");
00098 qprintf("%6d edges melted", num_windingsplits);
00099
00100 for (tmparea = tmpaasworld.areas; tmparea; tmparea = tmparea->l_next)
00101 {
00102 num_windingsplits += AAS_MeltFaceWindingsOfArea(tmparea);
00103 qprintf("\r%6d", num_windingsplits);
00104 }
00105 qprintf("\n");
00106 Log_Write("%6d edges melted\r\n", num_windingsplits);
00107 }
00108