t3dlib1.h
上传用户:husern
上传日期:2018-01-20
资源大小:42486k
文件大小:25k
源码类别:

游戏

开发平台:

Visual C++

  1. // T3DLIB1.H - Header file for T3DLIB1.CPP game engine library
  2. // watch for multiple inclusions
  3. #ifndef T3DLIB1
  4. #define T3DLIB1
  5. // DEFINES ////////////////////////////////////////////////
  6. // default screen values, these are all overriden by the 
  7. // call to DDraw_Init() and are just here to have something
  8. // to set the globals to instead of constant values
  9. #define SCREEN_WIDTH        640  // size of screen
  10. #define SCREEN_HEIGHT       480
  11. #define SCREEN_BPP          8    // bits per pixel
  12. #define MAX_COLORS_PALETTE  256
  13. #define DEFAULT_PALETTE_FILE "PALDATA2.PAL"
  14. // used for selecting full screen/windowed mode
  15. #define SCREEN_FULLSCREEN    0
  16. #define SCREEN_WINDOWED      1
  17. // bitmap defines
  18. #define BITMAP_ID            0x4D42 // universal id for a bitmap
  19. #define BITMAP_STATE_DEAD    0
  20. #define BITMAP_STATE_ALIVE   1
  21. #define BITMAP_STATE_DYING   2 
  22. #define BITMAP_ATTR_LOADED   128
  23. #define BITMAP_EXTRACT_MODE_CELL  0
  24. #define BITMAP_EXTRACT_MODE_ABS   1
  25. // directdraw pixel format defines, used to help
  26. // bitmap loader put data in proper format
  27. #define DD_PIXEL_FORMAT8        8
  28. #define DD_PIXEL_FORMAT555      15
  29. #define DD_PIXEL_FORMAT565      16
  30. #define DD_PIXEL_FORMAT888      24
  31. #define DD_PIXEL_FORMATALPHA888 32 
  32. // defines for BOBs
  33. #define BOB_STATE_DEAD         0    // this is a dead bob
  34. #define BOB_STATE_ALIVE        1    // this is a live bob
  35. #define BOB_STATE_DYING        2    // this bob is dying
  36. #define BOB_STATE_ANIM_DONE    1    // done animation state
  37. #define MAX_BOB_FRAMES         64   // maximum number of bob frames
  38. #define MAX_BOB_ANIMATIONS     16   // maximum number of animation sequeces
  39. #define BOB_ATTR_SINGLE_FRAME   1   // bob has single frame
  40. #define BOB_ATTR_MULTI_FRAME    2   // bob has multiple frames
  41. #define BOB_ATTR_MULTI_ANIM     4   // bob has multiple animations
  42. #define BOB_ATTR_ANIM_ONE_SHOT  8   // bob will perform the animation once
  43. #define BOB_ATTR_VISIBLE        16  // bob is visible
  44. #define BOB_ATTR_BOUNCE         32  // bob bounces off edges
  45. #define BOB_ATTR_WRAPAROUND     64  // bob wraps around edges
  46. #define BOB_ATTR_LOADED         128 // the bob has been loaded
  47. #define BOB_ATTR_CLONE          256 // the bob is a clone
  48. // screen transition commands
  49. #define SCREEN_DARKNESS  0         // fade to black
  50. #define SCREEN_WHITENESS 1         // fade to white
  51. #define SCREEN_SWIPE_X   2         // do a horizontal swipe
  52. #define SCREEN_SWIPE_Y   3         // do a vertical swipe
  53. #define SCREEN_DISOLVE   4         // a pixel disolve
  54. #define SCREEN_SCRUNCH   5         // a square compression
  55. #define SCREEN_BLUENESS  6         // fade to blue
  56. #define SCREEN_REDNESS   7         // fade to red
  57. #define SCREEN_GREENNESS 8         // fade to green
  58. // defines for Blink_Colors
  59. #define BLINKER_ADD           0    // add a light to database  
  60. #define BLINKER_DELETE        1    // delete a light from database
  61. #define BLINKER_UPDATE        2    // update a light
  62. #define BLINKER_RUN           3    // run normal
  63. // pi defines
  64. #define PI         ((float)3.141592654f)
  65. #define PI2        ((float)6.283185307f)
  66. #define PI_DIV_2   ((float)1.570796327f)
  67. #define PI_DIV_4   ((float)0.785398163f) 
  68. #define PI_INV     ((float)0.318309886f) 
  69. // fixed point mathematics constants
  70. #define FIXP16_SHIFT     16
  71. #define FIXP16_MAG       65536
  72. #define FIXP16_DP_MASK   0x0000ffff
  73. #define FIXP16_WP_MASK   0xffff0000
  74. #define FIXP16_ROUND_UP  0x00008000
  75. // MACROS /////////////////////////////////////////////////
  76. // these read the keyboard asynchronously
  77. #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
  78. #define KEY_UP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
  79. // this builds a 16 bit color value in 5.5.5 format (1-bit alpha mode)
  80. #define _RGB16BIT555(r,g,b) ((b & 31) + ((g & 31) << 5) + ((r & 31) << 10))
  81. // this builds a 16 bit color value in 5.6.5 format (green dominate mode)
  82. #define _RGB16BIT565(r,g,b) ((b & 31) + ((g & 63) << 5) + ((r & 31) << 11))
  83. // this builds a 24 bit color value in 8.8.8 format 
  84. #define _RGB24BIT(a,r,g,b) ((b) + ((g) << 8) + ((r) << 16) )
  85. // this builds a 32 bit color value in A.8.8.8 format (8-bit alpha mode)
  86. #define _RGB32BIT(a,r,g,b) ((b) + ((g) << 8) + ((r) << 16) + ((a) << 24))
  87. // bit manipulation macros
  88. #define SET_BIT(word,bit_flag)   ((word)=((word) | (bit_flag)))
  89. #define RESET_BIT(word,bit_flag) ((word)=((word) & (~bit_flag)))
  90. // initializes a direct draw struct, basically zeros it and sets the dwSize field
  91. #define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }
  92. // used to compute the min and max of two expresions
  93. #define MIN(a, b)  (((a) < (b)) ? (a) : (b)) 
  94. #define MAX(a, b)  (((a) > (b)) ? (a) : (b)) 
  95. // used for swapping algorithm
  96. #define SWAP(a,b,t) {t=a; a=b; b=t;}
  97. // some math macros
  98. #define DEG_TO_RAD(ang) ((ang)*PI/180.0)
  99. #define RAD_TO_DEG(rads) ((rads)*180.0/PI)
  100. #define RAND_RANGE(x,y) ( (x) + (rand()%((y)-(x)+1)))
  101. // TYPES //////////////////////////////////////////////////
  102. // basic unsigned types
  103. typedef unsigned short USHORT;
  104. typedef unsigned short WORD;
  105. typedef unsigned char  UCHAR;
  106. typedef unsigned char  BYTE;
  107. typedef unsigned int   QUAD;
  108. typedef unsigned int   UINT;
  109. // container structure for bitmaps .BMP file
  110. typedef struct BITMAP_FILE_TAG
  111.         {
  112.         BITMAPFILEHEADER bitmapfileheader;  // this contains the bitmapfile header
  113.         BITMAPINFOHEADER bitmapinfoheader;  // this is all the info including the palette
  114.         PALETTEENTRY     palette[256];      // we will store the palette here
  115.         UCHAR            *buffer;           // this is a pointer to the data
  116.         } BITMAP_FILE, *BITMAP_FILE_PTR;
  117. // the blitter object structure BOB
  118. typedef struct BOB_TYP
  119.         {
  120.         int state;          // the state of the object (general)
  121.         int anim_state;     // an animation state variable, up to you
  122.         int attr;           // attributes pertaining to the object (general)
  123.         float x,y;            // position bitmap will be displayed at
  124.         float xv,yv;          // velocity of object
  125.         int width, height;  // the width and height of the bob
  126.         int width_fill;     // internal, used to force 8*x wide surfaces
  127.         int bpp;            // bits per pixel
  128.         int counter_1;      // general counters
  129.         int counter_2;
  130.         int max_count_1;    // general threshold values;
  131.         int max_count_2;
  132.         int varsI[16];      // stack of 16 integers
  133.         float varsF[16];    // stack of 16 floats
  134.         int curr_frame;     // current animation frame
  135.         int num_frames;     // total number of animation frames
  136.         int curr_animation; // index of current animation
  137.         int anim_counter;   // used to time animation transitions
  138.         int anim_index;     // animation element index
  139.         int anim_count_max; // number of cycles before animation
  140.         int *animations[MAX_BOB_ANIMATIONS]; // animation sequences
  141.         LPDIRECTDRAWSURFACE7 images[MAX_BOB_FRAMES]; // the bitmap images DD surfaces
  142.  
  143.         } BOB, *BOB_PTR;
  144. // the simple bitmap image
  145. typedef struct BITMAP_IMAGE_TYP
  146.         {
  147.         int state;          // state of bitmap
  148.         int attr;           // attributes of bitmap
  149.         int x,y;            // position of bitmap
  150.         int width, height;  // size of bitmap
  151.         int num_bytes;      // total bytes of bitmap
  152.         int bpp;            // bits per pixel
  153.         UCHAR *buffer;      // pixels of bitmap
  154.         } BITMAP_IMAGE, *BITMAP_IMAGE_PTR;
  155. // blinking light structure
  156. typedef struct BLINKER_TYP
  157.                {
  158.                // user sets these
  159.                int color_index;         // index of color to blink
  160.                PALETTEENTRY on_color;   // RGB value of "on" color
  161.                PALETTEENTRY off_color;  // RGB value of "off" color
  162.                int on_time;             // number of frames to keep "on" 
  163.                int off_time;            // number of frames to keep "off"
  164.                // internal member
  165.                int counter;             // counter for state transitions
  166.                int state;               // state of light, -1 off, 1 on, 0 dead
  167.                } BLINKER, *BLINKER_PTR;
  168. // a 2D vertex
  169. typedef struct VERTEX2DI_TYP
  170.         {
  171.         int x,y; // the vertex
  172.         } VERTEX2DI, *VERTEX2DI_PTR;
  173. // a 2D vertex
  174. typedef struct VERTEX2DF_TYP
  175.         {
  176.         float x,y; // the vertex
  177.         } VERTEX2DF, *VERTEX2DF_PTR;
  178. // a 2D polygon
  179. typedef struct POLYGON2D_TYP
  180.         {
  181.         int state;        // state of polygon
  182.         int num_verts;    // number of vertices
  183.         int x0,y0;        // position of center of polygon  
  184.         int xv,yv;        // initial velocity
  185.         DWORD color;      // could be index or PALETTENTRY
  186.         VERTEX2DF *vlist; // pointer to vertex list
  187.  
  188.         } POLYGON2D, *POLYGON2D_PTR;
  189. // matrix defines
  190. // 3x3 matrix /////////////////////////////////////////////
  191. typedef struct MATRIX3X3_TYP
  192.         {
  193.         union
  194.         {
  195.         float M[3][3]; // array indexed data storage
  196.         // storage in row major form with explicit names
  197.         struct
  198.              {
  199.              float M00, M01, M02;
  200.              float M10, M11, M12;
  201.              float M20, M21, M22;
  202.              }; // end explicit names
  203.         }; // end union
  204.         } MATRIX3X3, *MATRIX3X3_PTR;
  205. // 1x3 matrix /////////////////////////////////////////////
  206. typedef struct MATRIX1X3_TYP
  207.         {
  208.         union
  209.         {
  210.         float M[3]; // array indexed data storage
  211.         // storage in row major form with explicit names
  212.         struct
  213.              {
  214.              float M00, M01, M02;
  215.              }; // end explicit names
  216.         }; // end union
  217.         } MATRIX1X3, *MATRIX1X3_PTR;
  218. // 3x2 matrix /////////////////////////////////////////////
  219. typedef struct MATRIX3X2_TYP
  220.         {
  221.         union
  222.         {
  223.         float M[3][2]; // array indexed data storage
  224.         // storage in row major form with explicit names
  225.         struct
  226.              {
  227.              float M00, M01;
  228.              float M10, M11;
  229.              float M20, M21;
  230.              }; // end explicit names
  231.         }; // end union
  232.         } MATRIX3X2, *MATRIX3X2_PTR;
  233. // 1x2 matrix /////////////////////////////////////////////
  234. typedef struct MATRIX1X2_TYP
  235.         {
  236.         union
  237.         {
  238.         float M[2]; // array indexed data storage
  239.         // storage in row major form with explicit names
  240.         struct
  241.              {
  242.              float M00, M01;
  243.              }; // end explicit names
  244.         }; // end union
  245.         } MATRIX1X2, *MATRIX1X2_PTR;
  246. // PROTOTYPES /////////////////////////////////////////////
  247. // DirectDraw functions
  248. int DDraw_Init(int width, int height, int bpp, int windowed=0);
  249. int DDraw_Shutdown(void);
  250. LPDIRECTDRAWCLIPPER DDraw_Attach_Clipper(LPDIRECTDRAWSURFACE7 lpdds, int num_rects, LPRECT clip_list);
  251. LPDIRECTDRAWSURFACE7 DDraw_Create_Surface(int width, int height, int mem_flags=0, USHORT color_key_value=0);
  252. int DDraw_Flip(void);
  253. int DDraw_Wait_For_Vsync(void);
  254. int DDraw_Fill_Surface(LPDIRECTDRAWSURFACE7 lpdds, USHORT color, RECT *client=NULL);
  255. UCHAR *DDraw_Lock_Surface(LPDIRECTDRAWSURFACE7 lpdds,int *lpitch);
  256. int DDraw_Unlock_Surface(LPDIRECTDRAWSURFACE7 lpdds);
  257. UCHAR *DDraw_Lock_Primary_Surface(void);
  258. int DDraw_Unlock_Primary_Surface(void);
  259. UCHAR *DDraw_Lock_Back_Surface(void);
  260. int DDraw_Unlock_Back_Surface(void);
  261. // BOB functions
  262. int Create_BOB(BOB_PTR bob,int x, int y,int width, int height,int num_frames,int attr,
  263.                int mem_flags=0, USHORT color_key_value=0, int bpp=8);              
  264. int Clone_BOB(BOB_PTR source, BOB_PTR dest);
  265. int Destroy_BOB(BOB_PTR bob);
  266. int Draw_BOB(BOB_PTR bob, LPDIRECTDRAWSURFACE7 dest);
  267. int Draw_Scaled_BOB(BOB_PTR bob, int swidth, int sheight,LPDIRECTDRAWSURFACE7 dest);
  268. int Draw_BOB16(BOB_PTR bob, LPDIRECTDRAWSURFACE7 dest);
  269. int Draw_Scaled_BOB16(BOB_PTR bob, int swidth, int sheight,LPDIRECTDRAWSURFACE7 dest);
  270. int Load_Frame_BOB(BOB_PTR bob, BITMAP_FILE_PTR bitmap, int frame, int cx,int cy,int mode);              
  271. int Load_Frame_BOB16(BOB_PTR bob, BITMAP_FILE_PTR bitmap, int frame, int cx,int cy,int mode);  
  272. int Animate_BOB(BOB_PTR bob);
  273. int Move_BOB(BOB_PTR bob);
  274. int Load_Animation_BOB(BOB_PTR bob, int anim_index, int num_frames, int *sequence);
  275. int Set_Pos_BOB(BOB_PTR bob, int x, int y);
  276. int Set_Vel_BOB(BOB_PTR bob,int xv, int yv);
  277. int Set_Anim_Speed_BOB(BOB_PTR bob,int speed);
  278. int Set_Animation_BOB(BOB_PTR bob, int anim_index);
  279. int Hide_BOB(BOB_PTR bob);
  280. int Show_BOB(BOB_PTR bob);
  281. int Collision_BOBS(BOB_PTR bob1, BOB_PTR bob2);
  282. // general utility functions
  283. DWORD Get_Clock(void);
  284. DWORD Start_Clock(void);
  285. DWORD Wait_Clock(DWORD count);
  286. int Collision_Test(int x1, int y1, int w1, int h1, 
  287.                    int x2, int y2, int w2, int h2); 
  288. int Color_Scan(int x1, int y1, int x2, int y2, 
  289.                UCHAR scan_start, UCHAR scan_end, 
  290.                UCHAR *scan_buffer, int scan_lpitch);
  291. int Color_Scan16(int x1, int y1, int x2, int y2, 
  292.                   USHORT scan_start, USHORT scan_end, 
  293.                   UCHAR *scan_buffer, int scan_lpitch);
  294. // graphics functions
  295. int Draw_Clip_Line(int x0,int y0, int x1, int y1, int color,UCHAR *dest_buffer, int lpitch);
  296. int Draw_Clip_Line16(int x0,int y0, int x1, int y1, int color,UCHAR *dest_buffer, int lpitch);
  297. int Clip_Line(int &x1,int &y1,int &x2, int &y2);
  298. int Draw_Line(int xo, int yo, int x1,int y1, int color,UCHAR *vb_start,int lpitch);
  299. int Draw_Line16(int xo, int yo, int x1,int y1, int color,UCHAR *vb_start,int lpitch);
  300. int Draw_Pixel(int x, int y,int color,UCHAR *video_buffer, int lpitch);
  301. int Draw_Rectangle(int x1, int y1, int x2, int y2, int color,LPDIRECTDRAWSURFACE7 lpdds);
  302. void HLine(int x1,int x2,int y,int color, UCHAR *vbuffer, int lpitch);
  303. void VLine(int y1,int y2,int x,int color, UCHAR *vbuffer, int lpitch);
  304. void HLine16(int x1,int x2,int y,int color, UCHAR *vbuffer, int lpitch);
  305. void VLine16(int y1,int y2,int x,int color, UCHAR *vbuffer, int lpitch);
  306. void Screen_Transitions(int effect, UCHAR *vbuffer, int lpitch);
  307. int Draw_Pixel(int x, int y,int color,UCHAR *video_buffer, int lpitch);
  308. int Draw_Pixel16(int x, int y,int color,UCHAR *video_buffer, int lpitch);
  309. // palette functions
  310. int Set_Palette_Entry(int color_index, LPPALETTEENTRY color);
  311. int Get_Palette_Entry(int color_index, LPPALETTEENTRY color);
  312. int Load_Palette_From_File(char *filename, LPPALETTEENTRY palette);
  313. int Save_Palette_To_File(char *filename, LPPALETTEENTRY palette);
  314. int Save_Palette(LPPALETTEENTRY sav_palette);
  315. int Set_Palette(LPPALETTEENTRY set_palette);
  316. int Rotate_Colors(int start_index, int end_index);
  317. int Blink_Colors(int command, BLINKER_PTR new_light, int id);
  318. // simple bitmap image functions
  319. int Create_Bitmap(BITMAP_IMAGE_PTR image, int x, int y, int width, int height, int bpp=8);
  320. int Destroy_Bitmap(BITMAP_IMAGE_PTR image);
  321. int Draw_Bitmap(BITMAP_IMAGE_PTR source_bitmap,UCHAR *dest_buffer, int lpitch, int transparent);
  322. int Draw_Bitmap16(BITMAP_IMAGE_PTR source_bitmap,UCHAR *dest_buffer, int lpitch, int transparent);
  323. int Load_Image_Bitmap(BITMAP_IMAGE_PTR image,BITMAP_FILE_PTR bitmap,int cx,int cy,int mode);  
  324. int Load_Image_Bitmap16(BITMAP_IMAGE_PTR image,BITMAP_FILE_PTR bitmap,int cx,int cy,int mode);               
  325. int Scroll_Bitmap(BITMAP_IMAGE_PTR image, int dx, int dy=0);
  326. int Copy_Bitmap(BITMAP_IMAGE_PTR dest_bitmap, int dest_x, int dest_y, 
  327.                 BITMAP_IMAGE_PTR source_bitmap, int source_x, int source_y, 
  328.                 int width, int height);
  329. int Flip_Bitmap(UCHAR *image, int bytes_per_line, int height);
  330. // bitmap file functions
  331. int Load_Bitmap_File(BITMAP_FILE_PTR bitmap, char *filename);
  332. int Unload_Bitmap_File(BITMAP_FILE_PTR bitmap);
  333. // gdi functions
  334. int Draw_Text_GDI(char *text, int x,int y,COLORREF color, LPDIRECTDRAWSURFACE7 lpdds);
  335. int Draw_Text_GDI(char *text, int x,int y,int color, LPDIRECTDRAWSURFACE7 lpdds);
  336. // error functions
  337. int Open_Error_File(char *filename, FILE *fp_override=NULL);
  338. int Close_Error_File(void);
  339. int Write_Error(char *string, ...);
  340. // 2d 8-bit, 16-bit triangle rendering
  341. void Draw_Top_Tri(int x1,int y1,int x2,int y2, int x3,int y3,int color,UCHAR *dest_buffer, int mempitch);
  342. void Draw_Bottom_Tri(int x1,int y1, int x2,int y2, int x3,int y3,int color,UCHAR *dest_buffer, int mempitch);
  343. void Draw_Top_Tri16(int x1,int y1,int x2,int y2, int x3,int y3,int color,UCHAR *dest_buffer, int mempitch);
  344. void Draw_Bottom_Tri16(int x1,int y1, int x2,int y2, int x3,int y3,int color,UCHAR *dest_buffer, int mempitch);
  345. void Draw_Top_TriFP(int x1,int y1,int x2,int y2, int x3,int y3,int color,UCHAR *dest_buffer, int mempitch);
  346. void Draw_Bottom_TriFP(int x1,int y1, int x2,int y2, int x3,int y3,int color,UCHAR *dest_buffer, int mempitch);
  347. void Draw_Triangle_2D(int x1,int y1,int x2,int y2,int x3,int y3,
  348.                       int color,UCHAR *dest_buffer, int mempitch);
  349. void Draw_Triangle_2D16(int x1,int y1,int x2,int y2,int x3,int y3,
  350.                         int color,UCHAR *dest_buffer, int mempitch);
  351. void Draw_TriangleFP_2D(int x1,int y1,int x2,int y2,int x3,int y3,
  352.                         int color,UCHAR *dest_buffer, int mempitch);
  353. inline void Draw_QuadFP_2D(int x0,int y0,int x1,int y1,
  354.                            int x2,int y2,int x3, int y3,
  355.                            int color,UCHAR *dest_buffer, int mempitch);
  356. // general 2D 8-bit, 16-bit polygon rendering and transforming functions
  357. void Draw_Filled_Polygon2D(POLYGON2D_PTR poly, UCHAR *vbuffer, int mempitch);
  358. void Draw_Filled_Polygon2D16(POLYGON2D_PTR poly, UCHAR *vbuffer, int mempitch);
  359. int Translate_Polygon2D(POLYGON2D_PTR poly, int dx, int dy);
  360. int Rotate_Polygon2D(POLYGON2D_PTR poly, int theta);
  361. int Scale_Polygon2D(POLYGON2D_PTR poly, float sx, float sy);
  362. void Build_Sin_Cos_Tables(void);
  363. int Translate_Polygon2D_Mat(POLYGON2D_PTR poly, int dx, int dy);
  364. int Rotate_Polygon2D_Mat(POLYGON2D_PTR poly, int theta);
  365. int Scale_Polygon2D_Mat(POLYGON2D_PTR poly, float sx, float sy);
  366. int Draw_Polygon2D(POLYGON2D_PTR poly, UCHAR *vbuffer, int lpitch);
  367. int Draw_Polygon2D16(POLYGON2D_PTR poly, UCHAR *vbuffer, int lpitch);
  368. // math functions
  369. int Fast_Distance_2D(int x, int y);
  370. float Fast_Distance_3D(float x, float y, float z);
  371. // collision detection functions
  372. int Find_Bounding_Box_Poly2D(POLYGON2D_PTR poly, 
  373.                              float &min_x, float &max_x, 
  374.                              float &min_y, float &max_y);
  375. int Mat_Mul_1X2_3X2(MATRIX1X2_PTR ma, 
  376.                    MATRIX3X2_PTR mb,
  377.                    MATRIX1X2_PTR mprod);
  378. int Mat_Mul_1X3_3X3(MATRIX1X3_PTR ma, 
  379.                    MATRIX3X3_PTR mb,
  380.                    MATRIX1X3_PTR mprod);
  381. int Mat_Mul_3X3(MATRIX3X3_PTR ma, 
  382.                MATRIX3X3_PTR mb,
  383.                MATRIX3X3_PTR mprod);
  384. inline int Mat_Init_3X2(MATRIX3X2_PTR ma, 
  385.                         float m00, float m01,
  386.                         float m10, float m11,
  387.                         float m20, float m21);
  388. // memory manipulation functions
  389. inline void Mem_Set_WORD(void *dest, USHORT data, int count);
  390. inline void Mem_Set_QUAD(void *dest, UINT   data, int count);
  391. // INLINE FUNCTIONS //////////////////////////////////////////
  392. inline void Mem_Set_WORD(void *dest, USHORT data, int count)
  393. {
  394. // this function fills or sets unsigned 16-bit aligned memory
  395. // count is number of words
  396. //Write_Error("{");
  397. _asm 
  398.     { 
  399.     mov edi, dest   ; edi points to destination memory
  400.     mov ecx, count  ; number of 16-bit words to move
  401.     mov ax,  data   ; 16-bit data
  402.     rep stosw       ; move data
  403.     } // end asm
  404. //Write_Error("}");
  405. } // end Mem_Set_WORD
  406. ///////////////////////////////////////////////////////////
  407. inline void Mem_Set_QUAD(void *dest, UINT data, int count)
  408. {
  409. // this function fills or sets unsigned 32-bit aligned memory
  410. // count is number of quads
  411. _asm 
  412.     { 
  413.     mov edi, dest   ; edi points to destination memory
  414.     mov ecx, count  ; number of 32-bit words to move
  415.     mov eax, data   ; 32-bit data
  416.     rep stosd       ; move data
  417.     } // end asm
  418. } // end Mem_Set_QUAD
  419. //////////////////////////////////////////////////////////
  420. inline void Draw_QuadFP_2D(int x0,int y0,
  421.                     int x1,int y1,
  422.                     int x2,int y2,
  423.                     int x3, int y3,
  424.                     int color,
  425.                     UCHAR *dest_buffer, int mempitch)
  426. {
  427. // this function draws a 2D quadrilateral
  428. // simply call the triangle function 2x, let it do all the work
  429. Draw_TriangleFP_2D(x0,y0,x1,y1,x3,y3,color,dest_buffer,mempitch);
  430. Draw_TriangleFP_2D(x1,y1,x2,y2,x3,y3,color,dest_buffer,mempitch);
  431. } // end Draw_QuadFP_2D
  432. ////////////////////////////////////////////////////////////
  433. inline int Mat_Init_3X2(MATRIX3X2_PTR ma, 
  434.                         float m00, float m01,
  435.                         float m10, float m11,
  436.                         float m20, float m21)
  437. {
  438. // this function fills a 3x2 matrix with the sent data in row major form
  439. ma->M[0][0] = m00; ma->M[0][1] = m01; 
  440. ma->M[1][0] = m10; ma->M[1][1] = m11; 
  441. ma->M[2][0] = m20; ma->M[2][1] = m21; 
  442. // return success
  443. return(1);
  444. } // end Mat_Init_3X2
  445. // GLOBALS ////////////////////////////////////////////////
  446. extern FILE *fp_error;                           // general error file
  447. extern char error_filename[80];                  // error file name
  448. // notice that interface 4.0 is used on a number of interfaces
  449. extern LPDIRECTDRAW7        lpdd;                 // dd object
  450. extern LPDIRECTDRAWSURFACE7 lpddsprimary;         // dd primary surface
  451. extern LPDIRECTDRAWSURFACE7 lpddsback;            // dd back surface
  452. extern LPDIRECTDRAWPALETTE  lpddpal;              // a pointer to the created dd palette
  453. extern LPDIRECTDRAWCLIPPER  lpddclipper;          // dd clipper for back surface
  454. extern LPDIRECTDRAWCLIPPER  lpddclipperwin;       // dd clipper for window
  455. extern PALETTEENTRY         palette[256];         // color palette
  456. extern PALETTEENTRY         save_palette[256];    // used to save palettes
  457. extern DDSURFACEDESC2       ddsd;                 // a direct draw surface description struct
  458. extern DDBLTFX              ddbltfx;              // used to fill
  459. extern DDSCAPS2             ddscaps;              // a direct draw surface capabilities struct
  460. extern HRESULT              ddrval;               // result back from dd calls
  461. extern UCHAR                *primary_buffer;      // primary video buffer
  462. extern UCHAR                *back_buffer;         // secondary back buffer
  463. extern int                  primary_lpitch;       // memory line pitch
  464. extern int                  back_lpitch;          // memory line pitch
  465. extern BITMAP_FILE          bitmap8bit;           // a 8 bit bitmap file
  466. extern BITMAP_FILE          bitmap16bit;          // a 16 bit bitmap file
  467. extern BITMAP_FILE          bitmap24bit;          // a 24 bit bitmap file
  468. extern DWORD                start_clock_count;    // used for timing
  469. extern int                  windowed_mode;        // tracks if dd is windowed or not
  470. // these defined the general clipping rectangle for software clipping
  471. extern int min_clip_x,                             // clipping rectangle 
  472.            max_clip_x,                  
  473.            min_clip_y,     
  474.            max_clip_y;                  
  475. // these are overwritten globally by DD_Init()
  476. extern int screen_width,                            // width of screen
  477.            screen_height,                           // height of screen
  478.            screen_bpp,                              // bits per pixel 
  479.            screen_windowed;                         // is this a windowed app?   
  480. extern int dd_pixel_format;                         // default pixel format
  481. extern int window_client_x0;   // used to track the starting (x,y) client area for
  482. extern int window_client_y0;   // for windowed mode directdraw operations
  483. // storage for our lookup tables
  484. extern float cos_look[361]; // 1 extra so we can store 0-360 inclusive
  485. extern float sin_look[361]; // 1 extra so we can store 0-360 inclusive
  486. // function ptr to RGB16 builder
  487. extern USHORT (*RGB16Bit)(int r, int g, int b);
  488. // root functions
  489. extern USHORT RGB16Bit565(int r, int g, int b);
  490. extern USHORT RGB16Bit555(int r, int g, int b);
  491. // conditionally compilation for engine stats
  492. extern int debug_total_polys_per_frame;
  493. extern int debug_polys_lit_per_frame;
  494. extern int debug_polys_clipped_per_frame;
  495. extern int debug_polys_rendered_per_frame;
  496. extern int debug_backfaces_removed_per_frame;
  497. extern int debug_objects_removed_per_frame;
  498. extern int debug_total_transformations_per_frame;
  499. #endif