#include <Windows.h>#include "D3DDrv.h"#include "GSpan.h"Go to the source code of this file.
Functions | |
| void DRIVERCC | EdgeOutNoUV (int32 x1, int32 y1, int32 x2, int32 y2) |
| void DRIVERCC | AddSpanNoUV (int32 x1, int32 x2, int32 y) |
| void | ResetSList (void) |
| SLIST * | NewSList (void) |
| void | ResetSpans (int32 Rows) |
Variables | |
| SPAN | SpanLines [MAX_SPAN_LINES] |
| SPAN_MINMAX | SMinMax [MAX_SPAN_LINES] |
| SLIST | ScanHash [MAX_SPANS] |
| BOOL | PolyVisible = FALSE |
| int32 | NumWorldPixels = 0 |
| int32 | NumSpans = 0 |
| int32 | NumSpanPixels [MAX_SPAN_LINES] |
| int32 | PolysRendered = 0 |
| int32 | CurrentSList = 0 |
| const int32 | CEIL_FRACT = ( ( 1 << 16)-1) |
|
||||||||||||||||
|
Definition at line 108 of file D3D8Drv/GSPAN.CPP. References ClientWindow, DRIVERCC, SPAN_MINMAX::First, int32, _SList::Last, _SList::Max, _SList::Min, NewSList(), _SList::Next, NULL, NumSpanPixels, NumWorldPixels, PolysRendered, PolyVisible, SMinMax, DRV_Window::Width, and 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) // Swap all the coordinates so 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 // Check to see if there are spans
00132 // in the list yet...
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; // This line totally hidden...
00145
00146 //if falls before the entire min, max
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 // if falls in the middle (but not touching)
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 // if it falls to the right of all spans
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 //if we have already started crossing spans, and we find out
00188 // that we are in front of a span, then we can bail out...
00189 if (LineStart != NULL)
00190 if (x2 < Current->Min)
00191 goto WasNull;
00192
00193
00194 // We now know that we have not fallen into any empty holes.
00195 // We must now check to see what spans, we've crossed...
00196
00197 // if split by a min/max
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 }
|
|
||||||||||||||||||||
|
Definition at line 48 of file D3D8Drv/GSPAN.CPP. References CEIL_FRACT, DRIVERCC, int32, SpanLines, SPAN::x1, SPAN::x2, and y.
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) // This isn't a horizontal line
00065 {
00066 Dir =0; // Left side
00067
00068 if (Cy2 < Cy1) // Make sure y2 is greater than y1
00069 {
00070 Dir =1; // Right side
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; // Allign on int amounts
00085 m = (((Cx2 - Cx1))<<16) / ydelta; // How much to increase x each iteration
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; // Add our constant to x
00095 }
00096 }
00097 else
00098 {
00099 for (y = Cy1; y <= Cy2; y++, pSpans++)
00100 {
00101 pSpans->x2 = (x>>16);
00102 x += m; // Add our constant to x
00103 }
00104 }
00105 }
00106 }
|
|
|
Definition at line 257 of file D3D8Drv/GSPAN.CPP. References CurrentSList, NULL, NumSpans, and ScanHash.
00258 {
00259
00260 CurrentSList++;
00261 NumSpans++;
00262
00263 return &ScanHash[CurrentSList-1];
00264
00265 return NULL;
00266 }
|
|
|
Definition at line 251 of file D3D8Drv/GSPAN.CPP. References CurrentSList, and NumSpans.
00252 {
00253 CurrentSList = 0;
00254 NumSpans = 0;
00255 }
|
|
|
Definition at line 268 of file D3D8Drv/GSPAN.CPP. References SPAN_MINMAX::First, int32, NULL, NumSpanPixels, NumWorldPixels, ResetSList(), and SMinMax.
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 }
|
|
|
Definition at line 47 of file D3D8Drv/GSPAN.CPP. |
|
|
Definition at line 45 of file D3D8Drv/GSPAN.CPP. |
|
|
Definition at line 42 of file D3D8Drv/GSPAN.CPP. |
|
|
Definition at line 41 of file D3D8Drv/GSPAN.CPP. |
|
|
Definition at line 40 of file D3D8Drv/GSPAN.CPP. |
|
|
Definition at line 43 of file D3D8Drv/GSPAN.CPP. |
|
|
Definition at line 38 of file D3D8Drv/GSPAN.CPP. |
|
|
Definition at line 36 of file D3D8Drv/GSPAN.CPP. |
|
|
Definition at line 35 of file D3D8Drv/GSPAN.CPP. |
|
|
Definition at line 33 of file D3D8Drv/GSPAN.CPP. |
1.3.2