00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <Windows.h>
00023
00024 #include "D3DDrv.h"
00025 #include "GSpan.h"
00026
00027
00028
00029
00030
00031
00032
00033 SPAN SpanLines[MAX_SPAN_LINES];
00034
00035 SPAN_MINMAX SMinMax[MAX_SPAN_LINES];
00036 SLIST ScanHash[MAX_SPANS];
00037
00038 BOOL PolyVisible = FALSE;
00039
00040 int32 NumWorldPixels = 0;
00041 int32 NumSpans = 0;
00042 int32 NumSpanPixels[MAX_SPAN_LINES];
00043 int32 PolysRendered = 0;
00044
00045 int32 CurrentSList = 0;
00046
00047 const int32 CEIL_FRACT = ( ( 1 << 16)-1);
00048 void DRIVERCC EdgeOutNoUV (int32 x1, int32 y1, int32 x2, int32 y2)
00049 {
00050 int32 Ctmp;
00051 int32 y;
00052 int32 x,m;
00053
00054 int32 ydelta;
00055 int32 Dir;
00056 int32 Cx1, Cx2, Cy1, Cy2;
00057 SPAN *pSpans;
00058
00059 Cx1 = x1;
00060 Cx2 = x2;
00061 Cy1 = y1;
00062 Cy2 = y2;
00063
00064 if (Cy2 != Cy1)
00065 {
00066 Dir =0;
00067
00068 if (Cy2 < Cy1)
00069 {
00070 Dir =1;
00071
00072 Ctmp = Cx1;
00073 Cx1 = Cx2;
00074 Cx2 = Ctmp;
00075
00076 Ctmp = Cy1;
00077 Cy1 = Cy2;
00078 Cy2 = Ctmp;
00079
00080 }
00081
00082 ydelta = (Cy2 - Cy1);
00083
00084 x = (Cx1 << 16) + CEIL_FRACT;
00085 m = (((Cx2 - Cx1))<<16) / ydelta;
00086
00087 pSpans = &SpanLines[Cy1];
00088
00089 if (!Dir)
00090 {
00091 for (y = Cy1; y <= Cy2; y++, pSpans++)
00092 {
00093 pSpans->x1 = (x>>16);
00094 x += m;
00095 }
00096 }
00097 else
00098 {
00099 for (y = Cy1; y <= Cy2; y++, pSpans++)
00100 {
00101 pSpans->x2 = (x>>16);
00102 x += m;
00103 }
00104 }
00105 }
00106 }
00107
00108 void DRIVERCC AddSpanNoUV(int32 x1, int32 x2, int32 y)
00109 {
00110 int32 i, xx2;
00111 SLIST *LineStart;
00112 SLIST *Current;
00113 SPAN_MINMAX *pSList;
00114
00115 if (NumSpanPixels[y] >= ClientWindow.Width)
00116 return;
00117
00118 if (x1 > x2)
00119 {
00120 i = x1;
00121 x1 = x2;
00122 x2 = i;
00123 }
00124
00125 Current = SMinMax[y].First;
00126
00127 LineStart = NULL;
00128
00129 pSList = &SMinMax[y];
00130
00131
00132
00133 if (!pSList->First)
00134 {
00135 pSList->First = NewSList();
00136 pSList->First->Last = NULL;
00137 pSList->First->Next = NULL;
00138 pSList->First->Min = x1;
00139 pSList->First->Max = x2;
00140 }
00141 else while (Current != NULL)
00142 {
00143 if (x1 >= Current->Min && x2 <= Current->Max)
00144 return;
00145
00146
00147 if (LineStart == NULL)
00148 {
00149 if (Current == pSList->First)
00150 if (x2 < Current->Min)
00151 {
00152 SLIST *NewMinMax = NewSList();
00153 NewMinMax->Next = Current;
00154 NewMinMax->Last = NULL;
00155 Current->Last = NewMinMax;
00156 pSList->First = NewMinMax;
00157 NewMinMax->Min = x1;
00158 NewMinMax->Max = x2;
00159 goto WasNull;
00160 }
00161
00162 if (Current->Next != NULL)
00163 if (x1 > Current->Max && x2 < (Current->Next)->Min)
00164 {
00165 SLIST *NewMinMax = NewSList();
00166 NewMinMax->Next = Current->Next;
00167 NewMinMax->Last = Current;
00168 Current->Next->Last = NewMinMax;
00169 Current->Next = NewMinMax;
00170 NewMinMax->Min = x1;
00171 NewMinMax->Max = x2;
00172 goto WasNull;
00173 }
00174
00175 if (Current->Next == NULL)
00176 if (x1 > Current->Max)
00177 {
00178 SLIST *NewMinMax = NewSList();
00179 Current->Next = NewMinMax;
00180 NewMinMax->Next = NULL;
00181 NewMinMax->Last = Current;
00182 NewMinMax->Min = x1;
00183 NewMinMax->Max = x2;
00184 goto WasNull;
00185 }
00186 }
00187
00188
00189 if (LineStart != NULL)
00190 if (x2 < Current->Min)
00191 goto WasNull;
00192
00193
00194
00195
00196
00197
00198 if (x1 < Current->Min && x2 > Current->Max)
00199 {
00200 xx2 = Current->Min-1;
00201 Current->Min = x1;
00202
00203 NumWorldPixels += xx2 - x1 + 1;
00204 NumSpanPixels[y] += xx2 - x1 + 1;
00205
00206 if (!PolyVisible)
00207 {
00208 PolysRendered++;
00209 PolyVisible = 1;
00210 }
00211
00212 x1 = Current->Max+1;
00213 Current->Max = x2;
00214 if (LineStart!=NULL)
00215 LineStart->Max = x2;
00216 else
00217 LineStart = Current;
00218 goto next;
00219 }
00220
00221 if (x1 <= Current->Max && x2 > Current->Max)
00222 {
00223 x1 = Current->Max+1;
00224 Current->Max = x2;
00225 LineStart = Current;
00226 goto next;
00227 }
00228 if (x1 < Current->Min && x2 >= Current->Min)
00229 {
00230 x2 = Current->Min-1;
00231 Current->Min = x1;
00232 if (LineStart!=NULL)
00233 LineStart->Max = Current->Max;
00234 goto WasNull;
00235 }
00236 next:;
00237 Current = Current->Next;
00238 }
00239 WasNull:;
00240
00241 if (!PolyVisible)
00242 {
00243 PolysRendered++;
00244 PolyVisible = 1;
00245 }
00246
00247 NumWorldPixels += x2 - x1 + 1;
00248 NumSpanPixels[y] += x2 - x1 + 1;
00249 }
00250
00251 void ResetSList(void)
00252 {
00253 CurrentSList = 0;
00254 NumSpans = 0;
00255 }
00256
00257 SLIST *NewSList(void)
00258 {
00259
00260 CurrentSList++;
00261 NumSpans++;
00262
00263 return &ScanHash[CurrentSList-1];
00264
00265 return NULL;
00266 }
00267
00268 void ResetSpans(int32 Rows)
00269 {
00270 int32 i;
00271
00272 for (i=0; i<Rows; i++)
00273 {
00274 SMinMax[i].First = NULL;
00275 NumSpanPixels[i] = 0;
00276 }
00277 ResetSList();
00278 NumWorldPixels = 0;
00279 }