00001
00002
00003
00004
00005 #include <windows.h>
00006 #include "csg.h"
00007 #include "polygon.h"
00008 #include "vector.h"
00009 #include "vertex.h"
00010 #include "brush.h"
00011 #include "collision.h"
00012 #include "bsp.h"
00013 #include "mmgr.h"
00014
00015 extern int numBrushes;
00016 extern POLYGON* brushPolygons;
00017 extern BRUSH* BrushSet;
00018 extern BRUSH* Brush;
00019 extern VERTEX* vertex1;
00020 extern VERTEX* vertex2;
00021 extern VERTEX* vertex3;
00022 extern bool Texturing;
00023 extern bool CSGflag;
00024 extern bool CSGcullface;
00025
00026
00027
00028 POLYGON* CSGClipPolygon (POLYGON* poly, POLYGON* planepoly, int clip)
00029 {
00030
00031 POLYGON* retfrags = NULL;
00032 POLYGON* frontfrag = NULL;
00033 POLYGON* backfrag = NULL;
00034
00035
00036 int result = ClassifyPolygon(poly, *planepoly);
00037
00038 switch (result)
00039 {
00040 case Front:
00041
00042 return poly;
00043 break;
00044
00045 case Back:
00046
00047
00048 if (planepoly->GetNext())
00049 {
00050 retfrags = CSGClipPolygon(poly, planepoly->GetNext(), clip);
00051 return retfrags;
00052 }
00053
00054 else
00055 return NULL;
00056 break;
00057
00058 case PolygonWasSplit:
00059
00060 frontfrag = new POLYGON;
00061 backfrag = new POLYGON;
00062
00063 SplitPolygon(poly, *planepoly, frontfrag, backfrag);
00064
00065
00066
00067 if (planepoly->GetNext())
00068 {
00069 retfrags = CSGClipPolygon(backfrag, planepoly->GetNext(), clip);
00070
00071
00072
00073 if (!(retfrags == backfrag))
00074 {
00075 delete backfrag;
00076 frontfrag->AddPolygon(retfrags);
00077 return frontfrag;
00078 }
00079
00080
00081
00082 else
00083 {
00084 delete frontfrag;
00085 delete backfrag;
00086 return poly;
00087 }
00088 }
00089
00090
00091 else
00092 {
00093 delete backfrag;
00094 return frontfrag;
00095 }
00096 break;
00097
00098 case OnPartition:
00099
00100
00101
00102
00103 if (ClassifyPoint(poly->Vertex[0].normal, planepoly->Vertex[0].coords, planepoly->Vertex[0].normal) == 1)
00104 if (!clip)
00105 return poly;
00106
00107
00108
00109
00110
00111 if (planepoly->GetNext())
00112 retfrags = CSGClipPolygon(poly, planepoly->GetNext(), clip);
00113 else
00114 return NULL;
00115 break;
00116 }
00117
00118
00119 return retfrags;
00120 }
00121
00122
00123
00124 int CSGAddition()
00125 {
00126
00127
00128 int clip;
00129
00130
00131 POLYGON* polylist1 = NULL;
00132 POLYGON* polylist2 = NULL;
00133 POLYGON* polylist3 = NULL;
00134 POLYGON* looppoly = NULL;
00135 POLYGON* frags = NULL;
00136 POLYGON* poly = NULL;
00137 BRUSH* brush1 = NULL;
00138 BRUSH* brush2 = NULL;
00139
00140
00141 for (brush1 = BrushSet; brush1; brush1 = brush1->GetNext())
00142 {
00143
00144 clip = false;
00145
00146
00147 for (int loop = 0; loop < brush1->numPolygons; loop++)
00148 {
00149 POLYGON* newPolygon = new POLYGON;
00150 *newPolygon = brush1->Polygon[loop];
00151 if (polylist1)
00152 polylist1->AddPolygon(newPolygon);
00153 else
00154 polylist1 = newPolygon;
00155 }
00156
00157
00158 for (brush2 = BrushSet; brush2; brush2 = brush2->GetNext())
00159 {
00160
00161
00162
00163 if (brush1 == brush2)
00164 {
00165 clip = true;
00166 continue;
00167 }
00168
00169
00170
00171
00172
00173
00174 for (int loop = 0; loop < brush2->numPolygons; loop++)
00175 {
00176 POLYGON* newPolygon = new POLYGON;
00177 *newPolygon = brush2->Polygon[loop];
00178 if (polylist2)
00179 polylist2->AddPolygon(newPolygon);
00180 else
00181 polylist2 = newPolygon;
00182 }
00183
00184
00185
00186 for (looppoly = polylist1; looppoly; looppoly = looppoly->GetNext())
00187 {
00188
00189 poly = new POLYGON;
00190 *poly = *looppoly;
00191
00192
00193 poly->NextPoly = NULL;
00194
00195
00196 frags = CSGClipPolygon(poly, polylist2, clip);
00197
00198 if (polylist3)
00199 polylist3->AddPolygon(frags);
00200 else
00201 polylist3 = frags;
00202
00203
00204 if (!(frags == poly))
00205 delete poly;
00206 }
00207
00208
00209
00210 DeleteList(polylist1);
00211 polylist1 = polylist3->CopyList();
00212
00213 DeleteList(polylist2);
00214 polylist2 = NULL;
00215 DeleteList(polylist3);
00216 polylist3 = NULL;
00217 }
00218 }
00219
00220 Brush[0].numPolygons = 0;
00221 for (looppoly = polylist1; looppoly; looppoly = looppoly->GetNext())
00222 {
00223 Brush[0].Polygon[Brush[0].numPolygons] = *looppoly;
00224 Brush[0].Polygon[Brush[0].numPolygons++].NextPoly = NULL;
00225 }
00226
00227 DeleteList(polylist1);
00228 polylist1 = NULL;
00229
00230 CSGflag = 0;
00231
00232 return 1;
00233 }