亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? demo8_9.cpp

?? 一本外國人寫的關于3D游戲編程的書的源碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// DEMO8_9.CPP 8-bit general polygon fill demo

// INCLUDES ///////////////////////////////////////////////

#define WIN32_LEAN_AND_MEAN  // just say no to MFC

#define INITGUID

#include <windows.h>   // include important windows stuff
#include <windowsx.h> 
#include <mmsystem.h>
#include <iostream.h> // include important C/C++ stuff
#include <conio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h> 
#include <math.h>
#include <io.h>
#include <fcntl.h>

#include <ddraw.h> // include directdraw

// DEFINES ////////////////////////////////////////////////

// defines for windows 
#define WINDOW_CLASS_NAME "WINCLASS1"

// default screen size
#define SCREEN_WIDTH    640  // size of screen
#define SCREEN_HEIGHT   480
#define SCREEN_BPP      8    // bits per pixel

#define BITMAP_ID            0x4D42 // universal id for a bitmap
#define MAX_COLORS_PALETTE   256

const double PI = 3.1415926535;

// TYPES //////////////////////////////////////////////////////

// basic unsigned types
typedef unsigned short USHORT;
typedef unsigned short WORD;
typedef unsigned char  UCHAR;
typedef unsigned char  BYTE;

// a 2D vertex
typedef struct VERTEX2DI_TYP
        {
        int x,y; // the vertex
        } VERTEX2DI, *VERTEX2DI_PTR;

// a 2D vertex
typedef struct VERTEX2DF_TYP
        {
        float x,y; // the vertex
        } VERTEX2DF, *VERTEX2DF_PTR;


// a 2D polygon
typedef struct POLYGON2D_TYP
        {
        int state;        // state of polygon
        int num_verts;    // number of vertices
        int x0,y0;        // position of center of polygon  
        int xv,yv;        // initial velocity
        DWORD color;      // could be index or PALETTENTRY
        VERTEX2DF *vlist; // pointer to vertex list
 
        } POLYGON2D, *POLYGON2D_PTR;


// PROTOTYPES  //////////////////////////////////////////////

int DDraw_Fill_Surface(LPDIRECTDRAWSURFACE7 lpdds,int color);

void Draw_Filled_Polygon2D(POLYGON2D_PTR poly, UCHAR *vbuffer, int mempitch);

int Translate_Polygon2D(POLYGON2D_PTR poly, int dx, int dy);

int Rotate_Polygon2D(POLYGON2D_PTR poly, int theta);

int Scale_Polygon2D(POLYGON2D_PTR poly, float sx, float sy);

int Set_Palette_Entry(int color_index, LPPALETTEENTRY color);

int Draw_Text_GDI(char *text, int x,int y,int color, LPDIRECTDRAWSURFACE7 lpdds);

// MACROS /////////////////////////////////////////////////

// tests if a key is up or down
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

// initializes a direct draw struct
#define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }

// some math macros
#define DEG_TO_RAD(ang) ((ang)*PI/180)
#define RAD_TO_DEG(rads) ((rads)*180/PI)

// GLOBALS ////////////////////////////////////////////////

HWND      main_window_handle = NULL; // globally track main window
int       window_closed      = 0;    // tracks if window is closed
HINSTANCE hinstance_app      = NULL; // globally track hinstance

// directdraw stuff
LPDIRECTDRAW7         lpdd         = NULL;   // dd object
LPDIRECTDRAWSURFACE7  lpddsprimary = NULL;   // dd primary surface
LPDIRECTDRAWSURFACE7  lpddsback    = NULL;   // dd back surface
LPDIRECTDRAWPALETTE   lpddpal      = NULL;   // a pointer to the created dd palette
LPDIRECTDRAWCLIPPER   lpddclipper  = NULL;   // dd clipper
PALETTEENTRY          palette[256];          // color palette
PALETTEENTRY          save_palette[256];     // used to save palettes
DDSURFACEDESC2        ddsd;                  // a direct draw surface description struct
DDBLTFX               ddbltfx;               // used to fill
DDSCAPS2              ddscaps;               // a direct draw surface capabilities struct
HRESULT               ddrval;                // result back from dd calls
DWORD                 start_clock_count = 0; // used for timing


// global clipping region

int min_clip_x = 0,      // clipping rectangle 
    max_clip_x = SCREEN_WIDTH - 1,
    min_clip_y = 0,
    max_clip_y = SCREEN_HEIGHT - 1;

char buffer[80];                             // general printing buffer

// storage for our lookup tables
float cos_look[360];
float sin_look[360];

POLYGON2D object; // the polygon object

// FUNCTIONS ////////////////////////////////////////////////

int Draw_Text_GDI(char *text, int x,int y,int color, LPDIRECTDRAWSURFACE7 lpdds)
{
// this function draws the sent text on the sent surface 
// using color index as the color in the palette

HDC xdc; // the working dc

// get the dc from surface
if (FAILED(lpdds->GetDC(&xdc)))
   return(0);

// set the colors for the text up
SetTextColor(xdc,RGB(palette[color].peRed,palette[color].peGreen,palette[color].peBlue) );

// set background mode to transparent so black isn't copied
SetBkMode(xdc, TRANSPARENT);

// draw the text a
TextOut(xdc,x,y,text,strlen(text));

// release the dc
lpdds->ReleaseDC(xdc);

// return success
return(1);
} // end Draw_Text_GDI

///////////////////////////////////////////////////////////////////


int Set_Palette_Entry(int color_index, LPPALETTEENTRY color)
{
// this function sets a palette color in the palette
lpddpal->SetEntries(0,color_index,1,color);

// set data in shadow palette
memcpy(&palette[color_index],color,sizeof(PALETTEENTRY));

// return success
return(1);
} // end Set_Palette_Entry

///////////////////////////////////////////////////////////


void Draw_Filled_Polygon2D(POLYGON2D_PTR poly, UCHAR *vbuffer, int mempitch)
{
// this function draws a general n sided polygon 

int ydiff1, ydiff2,         // difference between starting x and ending x
	xdiff1, xdiff2,         // difference between starting y and ending y
    start,                  // starting offset of line between edges
	length,                 // distance from edge 1 to edge 2
	errorterm1, errorterm2, // error terms for edges 1 & 2
    offset1, offset2,       // offset of current pixel in edges 1 & 2
	count1, count2,         // increment count for edges 1 & 2
    xunit1, xunit2;         // unit to advance x offset for edges 1 & 2

// initialize count of number of edges drawn:
int edgecount = poly->num_verts-1;

// determine which vertex is at top of polygon:

int firstvert=0;         // start by assuming vertex 0 is at top

int min_y=poly->vlist[0].y; // find y coordinate of vertex 0

for (int index=1; index < poly->num_verts; index++) 
    {  
    // Search thru vertices
 	if ((poly->vlist[index].y) < min_y) 
        {  
        // is another vertex higher?
		firstvert=index;                   
		min_y=poly->vlist[index].y;
		} // end if

	} // end for index

// finding starting and ending vertices of first two edges:
int startvert1=firstvert;      // get starting vertex of edge 1
int startvert2=firstvert;      // get starting vertex of edge 2
int xstart1=poly->vlist[startvert1].x+poly->x0;
int ystart1=poly->vlist[startvert1].y+poly->y0;
int xstart2=poly->vlist[startvert2].x+poly->x0;
int ystart2=poly->vlist[startvert2].y+poly->y0;
int endvert1=startvert1-1;           // get ending vertex of edge 1

if (endvert1 < 0) 
   endvert1=poly->num_verts-1;    // check for wrap

int xend1=poly->vlist[endvert1].x+poly->x0;      // get x & y coordinates
int yend1=poly->vlist[endvert1].y+poly->y0;      // of ending vertices
int endvert2=startvert2+1;           // get ending vertex of edge 2

if (endvert2==(poly->num_verts)) 
    endvert2=0;  // Check for wrap

int xend2=poly->vlist[endvert2].x+poly->x0;      // get x & y coordinates
int yend2=poly->vlist[endvert2].y+poly->y0;      // of ending vertices

// draw the polygon:

while (edgecount>0) 
      {    
      // continue drawing until all edges drawn
	  offset1=mempitch*ystart1+xstart1;  // offset of edge 1
	  offset2=mempitch*ystart2+xstart2;  // offset of edge 2
	  
      // initialize error terms
      // for edges 1 & 2
      errorterm1=0;        
	  errorterm2=0;           

      // get absolute value of
   	  if ((ydiff1=yend1-ystart1) < 0) 
         ydiff1=-ydiff1;

      // x & y lengths of edges
	  if ((ydiff2=yend2-ystart2) < 0) 
         ydiff2=-ydiff2; 

  	  if ((xdiff1=xend1-xstart1) < 0) 
         {               
         // get value of length
		 xunit1=-1;                    // calculate X increment
		 xdiff1=-xdiff1;
		 } // end if
	  else 
         {
		 xunit1=1;
		 } // end else

   	  if ((xdiff2=xend2-xstart2) < 0) 
         {
         // Get value of length
  		 xunit2=-1;                   // calculate X increment
		 xdiff2=-xdiff2;
		 } // end else
	  else 
         {
		 xunit2=1;
		 } // end else

	  // choose which of four routines to use
	  if (xdiff1 > ydiff1) 
         {    
         // if x length of edge 1 is greater than y length
		 if (xdiff2 > ydiff2) 
            {  
            // if X length of edge 2 is greater than y length

			// increment edge 1 on X and edge 2 on X:
			count1=xdiff1;    // count for x increment on edge 1
			count2=xdiff2;    // count for x increment on edge 2

			while (count1 && count2) 
                  {  
                  // continue drawing until one edge is done
    			  // calculate edge 1:
  				  while ((errorterm1 < xdiff1) && (count1 > 0)) 
                        { 
                        // finished w/edge 1?
						if (count1--) 
                           {     
                           // count down on edge 1
						   offset1+=xunit1;  // increment pixel offset
						   xstart1+=xunit1;
						   } // end if

  				        errorterm1+=ydiff1; // increment error term

 				        if (errorterm1 < xdiff1) 
                           {  // if not more than XDIFF
					       vbuffer[offset1]=(UCHAR)poly->color; // ...plot a pixel
					       } // end if

					     } // end while
					
                  errorterm1-=xdiff1; // if time to increment X, restore error term

			      // calculate edge 2:

				  while ((errorterm2 < xdiff2) && (count2 > 0)) 
                        {  
                        // finished w/edge 2?
						if (count2--) 
                           {     
                           // count down on edge 2
						   offset2+=xunit2;  // increment pixel offset
						   xstart2+=xunit2;
						   } // end if

  						  errorterm2+=ydiff2; // increment error term

						  if (errorterm2 < xdiff2) 
                             {  // if not more than XDIFF
							 vbuffer[offset2]=(UCHAR)poly->color;  // ...plot a pixel
						     } // end if

  					       } // end while

					errorterm2-=xdiff2; // if time to increment X, restore error term

			        // draw line from edge 1 to edge 2:

					length=offset2-offset1; // determine length of horizontal line

					if (length < 0) 
                       { // if negative...
					   length=-length;       // make it positive
					   start=offset2;        // and set START to edge 2
  				       } // end if
					else 
                       start=offset1;     // else set START to edge 1
			 
              for (int index=start; index < start+length+1; index++)
                  {  // From edge to edge...
    			  vbuffer[index]=(UCHAR)poly->color;         // ...draw the line
                  } // end for index

				offset1+=mempitch;           // advance edge 1 offset to next line
  			    ystart1++;
				offset2+=mempitch;           // advance edge 2 offset to next line

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲精品aa| 久久九九全国免费| 91在线观看一区二区| 国产乱码精品一区二区三区av| 午夜精品久久久久久久99水蜜桃| 亚洲精品乱码久久久久久| 一区二区在线看| 亚洲精品日日夜夜| 亚洲国产人成综合网站| 日韩精品五月天| 久久精品国产在热久久| 狠狠色伊人亚洲综合成人| 国产精品亚洲成人| 懂色中文一区二区在线播放| 成人av第一页| 欧美日韩小视频| 精品国产成人系列| 亚洲国产精品黑人久久久| ...av二区三区久久精品| 亚洲精品成a人| 日本sm残虐另类| 国产成人精品免费视频网站| 成人h动漫精品一区二| 色综合久久99| 日韩美女在线视频| 中文字幕av一区二区三区| 中文字幕一区二区不卡| 亚洲午夜在线视频| 精品一区二区三区在线观看| 成人影视亚洲图片在线| 欧美日韩午夜在线视频| 久久―日本道色综合久久| 亚洲精品成人精品456| 精东粉嫩av免费一区二区三区| 国产成人aaa| 欧美三级在线视频| 久久久噜噜噜久久中文字幕色伊伊| 亚洲欧洲精品一区二区精品久久久| 亚洲444eee在线观看| 国产一区二区福利| 欧美三级电影在线看| 欧美精品一区二区三区在线| 亚洲一区二区影院| 粉嫩av一区二区三区在线播放| 欧美男同性恋视频网站| 亚洲色图另类专区| 高清久久久久久| 日韩欧美不卡在线观看视频| 中文字幕一区二区日韩精品绯色| 日韩电影在线一区二区三区| 成人av网在线| 久久精品男人天堂av| 日本一区中文字幕| 在线免费视频一区二区| 国产精品久久久久久久浪潮网站 | 亚洲精品一区二区三区四区高清| 亚洲日本成人在线观看| 国产精品99精品久久免费| 91精品国产91热久久久做人人 | 色成人在线视频| 国产亚洲一本大道中文在线| 天天色天天操综合| 欧美在线观看视频一区二区| 日韩美女精品在线| av电影在线观看不卡| 国产精品女同一区二区三区| 国产激情视频一区二区在线观看 | 欧美xxxxxxxx| 日本成人在线视频网站| 7777精品伊人久久久大香线蕉经典版下载 | 久久亚洲综合色| 老司机精品视频线观看86| 欧美精品久久天天躁| 天堂久久久久va久久久久| 欧美老女人第四色| 日日夜夜免费精品| 欧美一区二区视频在线观看| 日本伊人色综合网| 精品乱人伦小说| 色综合网站在线| 中文av一区特黄| 成人黄色一级视频| 国产精品久久三| 91蝌蚪porny| 一区二区三区四区在线播放| 色哟哟日韩精品| 亚洲成人在线免费| 欧美sm极限捆绑bd| 国产成人午夜精品5599| 最新国产の精品合集bt伙计| 色婷婷精品久久二区二区蜜臀av| 亚洲综合一区二区| 日韩一区二区三区免费看| 国产一区二区三区在线观看免费视频 | 国产在线精品一区二区夜色| 久久综合国产精品| 成人av网址在线观看| 亚洲欧美福利一区二区| 欧美性猛片xxxx免费看久爱| 亚洲国产日韩一级| 亚洲精品一卡二卡| 欧美日韩一级片网站| 久久99精品网久久| 成人免费在线播放视频| 欧美色综合天天久久综合精品| 人人精品人人爱| 中文字幕欧美三区| 欧美怡红院视频| 久久精品国产秦先生| 中文字幕一区二区三区乱码在线| 欧美日韩一区不卡| 大陆成人av片| 丝袜亚洲另类丝袜在线| 国产三级精品视频| 欧美精品自拍偷拍| 国产不卡免费视频| 日本vs亚洲vs韩国一区三区| 国产精品国产自产拍在线| 日韩一区二区在线播放| 成人动漫精品一区二区| 久久精品理论片| 一区二区三区在线视频播放| 久久精品一区二区三区四区| 在线视频欧美区| 成人丝袜18视频在线观看| 亚洲成av人片在www色猫咪| 国产人伦精品一区二区| 欧美精品粉嫩高潮一区二区| av电影天堂一区二区在线| 久久成人av少妇免费| 亚洲综合激情小说| 国产精品理论片在线观看| 欧美电视剧在线观看完整版| 精品视频一区二区不卡| 91在线免费看| 国产不卡高清在线观看视频| 裸体健美xxxx欧美裸体表演| 亚洲一区二区三区精品在线| 国产精品污www在线观看| 日韩区在线观看| 91精品国产综合久久蜜臀| 欧美视频精品在线| 欧美在线观看视频在线| 91色九色蝌蚪| 97久久久精品综合88久久| 成人av免费网站| av电影天堂一区二区在线| 国产一区在线观看视频| 伦理电影国产精品| 日韩精品乱码免费| 日韩精品电影一区亚洲| 丝袜美腿高跟呻吟高潮一区| 夜夜爽夜夜爽精品视频| 1000精品久久久久久久久| 亚洲色图色小说| 一区二区三区欧美| 亚洲国产日韩精品| 日本不卡视频在线| 麻豆精品一区二区| 国产一区二区三区免费看| 久久国产精品区| 国产精品羞羞答答xxdd| 国产精品伊人色| 国产成人啪免费观看软件 | k8久久久一区二区三区| 精品一区二区在线视频| 激情图片小说一区| 国产乱码一区二区三区| 成人免费高清在线观看| 91极品视觉盛宴| 欧美日韩在线三级| 精品国产sm最大网站| 欧美韩日一区二区三区四区| 国产精品色噜噜| 亚洲成人第一页| 狠狠色丁香婷婷综合久久片| 国产成人在线观看| 成年人午夜久久久| 欧美猛男男办公室激情| 精品国产sm最大网站| 亚洲视频免费看| 亚洲大片精品永久免费| 国产在线看一区| 91丝袜美腿高跟国产极品老师 | 日本一区二区免费在线| 亚洲三级在线免费观看| 石原莉奈在线亚洲二区| 国产成人av一区二区三区在线 | 日韩av高清在线观看| 国产成人免费网站| 欧美人妇做爰xxxⅹ性高电影| 亚洲一区视频在线| 国产美女一区二区| 91久久国产最好的精华液| 欧美刺激午夜性久久久久久久| 国产精品久久久久久久久免费樱桃| 亚洲电影在线播放| 成人爱爱电影网址| 日韩一区二区三区三四区视频在线观看 | 精品一区二区三区久久|