Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

GSPAN.CPP File Reference

#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)
SLISTNewSList (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)


Function Documentation

void DRIVERCC AddSpanNoUV int32  x1,
int32  x2,
int32  y
 

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 }       

void DRIVERCC EdgeOutNoUV int32  x1,
int32  y1,
int32  x2,
int32  y2
 

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 }

SLIST* NewSList void   ) 
 

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 }

void ResetSList void   ) 
 

Definition at line 251 of file D3D8Drv/GSPAN.CPP.

References CurrentSList, and NumSpans.

00252 {
00253         CurrentSList = 0;
00254         NumSpans = 0;
00255 }

void ResetSpans int32  Rows  ) 
 

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 }


Variable Documentation

const int32 CEIL_FRACT = ( ( 1 << 16)-1)
 

Definition at line 47 of file D3D8Drv/GSPAN.CPP.

int32 CurrentSList = 0
 

Definition at line 45 of file D3D8Drv/GSPAN.CPP.

int32 NumSpanPixels[MAX_SPAN_LINES]
 

Definition at line 42 of file D3D8Drv/GSPAN.CPP.

int32 NumSpans = 0
 

Definition at line 41 of file D3D8Drv/GSPAN.CPP.

int32 NumWorldPixels = 0
 

Definition at line 40 of file D3D8Drv/GSPAN.CPP.

int32 PolysRendered = 0
 

Definition at line 43 of file D3D8Drv/GSPAN.CPP.

BOOL PolyVisible = FALSE
 

Definition at line 38 of file D3D8Drv/GSPAN.CPP.

SLIST ScanHash[MAX_SPANS]
 

Definition at line 36 of file D3D8Drv/GSPAN.CPP.

SPAN_MINMAX SMinMax[MAX_SPAN_LINES]
 

Definition at line 35 of file D3D8Drv/GSPAN.CPP.

SPAN SpanLines[MAX_SPAN_LINES]
 

Definition at line 33 of file D3D8Drv/GSPAN.CPP.


Generated on Tue Sep 30 12:37:42 2003 for GTestAndEngine by doxygen 1.3.2