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

游戏

开发平台:

Visual C++

  1. // T3DLIB5.H - Header file for T3DLIB5.CPP game engine library
  2. // watch for multiple inclusions
  3. #ifndef T3DLIB5
  4. #define T3DLIB5
  5. // DEFINES ////////////////////////////////////////////////////
  6. // defines for enhanced PLG file format -> PLX
  7. // the surface descriptor is still 16-bit now in the following format
  8. // d15                      d0
  9. //   CSSD | RRRR| GGGG | BBBB
  10. // C is the RGB/indexed color flag
  11. // SS are two bits that define the shading mode
  12. // D is the double sided flag
  13. // and RRRR, GGGG, BBBB are the red, green, blue bits for RGB mode
  14. // or GGGGBBBB is the 8-bit color index for 8-bit mode
  15. // bit masks to simplify testing????
  16. #define PLX_RGB_MASK          0x8000   // mask to extract RGB or indexed color
  17. #define PLX_SHADE_MODE_MASK   0x6000   // mask to extract shading mode
  18. #define PLX_2SIDED_MASK       0x1000   // mask for double sided
  19. #define PLX_COLOR_MASK        0x0fff   // xxxxrrrrggggbbbb, 4-bits per channel RGB
  20.                                        // xxxxxxxxiiiiiiii, indexed mode 8-bit index
  21. // these are the comparision flags after masking
  22. // color mode of polygon
  23. #define PLX_COLOR_MODE_RGB_FLAG     0x8000   // this poly uses RGB color
  24. #define PLX_COLOR_MODE_INDEXED_FLAG 0x0000   // this poly uses an indexed 8-bit color 
  25. // double sided flag
  26. #define PLX_2SIDED_FLAG              0x1000   // this poly is double sided
  27. #define PLX_1SIDED_FLAG              0x0000   // this poly is single sided
  28. // shading mode of polygon
  29. #define PLX_SHADE_MODE_PURE_FLAG      0x0000  // this poly is a constant color
  30. #define PLX_SHADE_MODE_CONSTANT_FLAG  0x0000  // alias
  31. #define PLX_SHADE_MODE_FLAT_FLAG      0x2000  // this poly uses flat shading
  32. #define PLX_SHADE_MODE_GOURAUD_FLAG   0x4000  // this poly used gouraud shading
  33. #define PLX_SHADE_MODE_PHONG_FLAG     0x6000  // this poly uses phong shading
  34. #define PLX_SHADE_MODE_FASTPHONG_FLAG 0x6000  // this poly uses phong shading (alias)
  35. // defines for polygons and faces version 1
  36. // attributes of polygons and polygon faces
  37. #define POLY4DV1_ATTR_2SIDED              0x0001
  38. #define POLY4DV1_ATTR_TRANSPARENT         0x0002
  39. #define POLY4DV1_ATTR_8BITCOLOR           0x0004
  40. #define POLY4DV1_ATTR_RGB16               0x0008
  41. #define POLY4DV1_ATTR_RGB24               0x0010
  42. #define POLY4DV1_ATTR_SHADE_MODE_PURE       0x0020
  43. #define POLY4DV1_ATTR_SHADE_MODE_CONSTANT   0x0020 // (alias)
  44. #define POLY4DV1_ATTR_SHADE_MODE_FLAT       0x0040
  45. #define POLY4DV1_ATTR_SHADE_MODE_GOURAUD    0x0080
  46. #define POLY4DV1_ATTR_SHADE_MODE_PHONG      0x0100
  47. #define POLY4DV1_ATTR_SHADE_MODE_FASTPHONG  0x0100 // (alias)
  48. #define POLY4DV1_ATTR_SHADE_MODE_TEXTURE    0x0200 
  49. // states of polygons and faces
  50. #define POLY4DV1_STATE_ACTIVE             0x0001
  51. #define POLY4DV1_STATE_CLIPPED            0x0002
  52. #define POLY4DV1_STATE_BACKFACE           0x0004
  53. // defines for objects version 1
  54. #define OBJECT4DV1_MAX_VERTICES           1024  // 64
  55. #define OBJECT4DV1_MAX_POLYS              1024 // 128
  56. // states for objects
  57. #define OBJECT4DV1_STATE_ACTIVE           0x0001
  58. #define OBJECT4DV1_STATE_VISIBLE          0x0002 
  59. #define OBJECT4DV1_STATE_CULLED           0x0004
  60. // attributes for objects
  61. // render list defines
  62. #define RENDERLIST4DV1_MAX_POLYS          32768// 16384
  63. // transformation control flags
  64. #define TRANSFORM_LOCAL_ONLY       0  // perform the transformation in place on the
  65.                                       // local/world vertex list 
  66. #define TRANSFORM_TRANS_ONLY       1  // perfrom the transformation in place on the 
  67.                                       // "transformed" vertex list
  68. #define TRANSFORM_LOCAL_TO_TRANS   2  // perform the transformation to the local
  69.                                       // vertex list, but store the results in the
  70.                                       // transformed vertex list
  71. // general culling flags
  72. #define CULL_OBJECT_X_PLANE           0x0001 // cull on the x clipping planes
  73. #define CULL_OBJECT_Y_PLANE           0x0002 // cull on the y clipping planes
  74. #define CULL_OBJECT_Z_PLANE           0x0004 // cull on the z clipping planes
  75. #define CULL_OBJECT_XYZ_PLANES        (CULL_OBJECT_X_PLANE | CULL_OBJECT_Y_PLANE | CULL_OBJECT_Z_PLANE)
  76. // defines for camera rotation sequences
  77. #define CAM_ROT_SEQ_XYZ  0
  78. #define CAM_ROT_SEQ_YXZ  1
  79. #define CAM_ROT_SEQ_XZY  2
  80. #define CAM_ROT_SEQ_YZX  3
  81. #define CAM_ROT_SEQ_ZYX  4
  82. #define CAM_ROT_SEQ_ZXY  5
  83. // defines for special types of camera projections
  84. #define CAM_PROJ_NORMALIZED        0x0001
  85. #define CAM_PROJ_SCREEN            0x0002
  86. #define CAM_PROJ_FOV90             0x0004
  87. #define CAM_MODEL_EULER            0x0008
  88. #define CAM_MODEL_UVN              0x0010
  89. #define UVN_MODE_SIMPLE            0 
  90. #define UVN_MODE_SPHERICAL         1
  91. // TYPES //////////////////////////////////////////////////////
  92. // a polygon based on an external vertex list
  93. typedef struct POLY4DV1_TYP
  94. {
  95. int state;    // state information
  96. int attr;     // physical attributes of polygon
  97. int color;    // color of polygon
  98. POINT4D_PTR vlist; // the vertex list itself
  99. int vert[3];       // the indices into the vertex list
  100. } POLY4DV1, *POLY4DV1_PTR;
  101. // a self contained polygon used for the render list
  102. typedef struct POLYF4DV1_TYP
  103. {
  104. int state;    // state information
  105. int attr;     // physical attributes of polygon
  106. int color;    // color of polygon
  107. POINT4D vlist[3];  // the vertices of this triangle
  108. POINT4D tvlist[3]; // the vertices after transformation if needed
  109. POLYF4DV1_TYP *next; // pointer to next polygon in list??
  110. POLYF4DV1_TYP *prev; // pointer to previous polygon in list??
  111. } POLYF4DV1, *POLYF4DV1_PTR;
  112. // an object based on a vertex list and list of polygons
  113. typedef struct OBJECT4DV1_TYP
  114. {
  115. int  id;           // numeric id of this object
  116. char name[64];     // ASCII name of object just for kicks
  117. int  state;        // state of object
  118. int  attr;         // attributes of object
  119. float avg_radius;  // average radius of object used for collision detection
  120. float max_radius;  // maximum radius of object
  121. POINT4D world_pos;  // position of object in world
  122. VECTOR4D dir;       // rotation angles of object in local
  123.                     // cords or unit direction vector user defined???
  124. VECTOR4D ux,uy,uz;  // local axes to track full orientation
  125.                     // this is updated automatically during
  126.                     // rotation calls
  127. int num_vertices;   // number of vertices of this object
  128. POINT4D vlist_local[OBJECT4DV1_MAX_VERTICES]; // array of local vertices
  129. POINT4D vlist_trans[OBJECT4DV1_MAX_VERTICES]; // array of transformed vertices
  130. int num_polys;        // number of polygons in object mesh
  131. POLY4DV1 plist[OBJECT4DV1_MAX_POLYS];  // array of polygons
  132. } OBJECT4DV1, *OBJECT4DV1_PTR;
  133. // camera version 1
  134. typedef struct CAM4DV1_TYP
  135. {
  136. int state;      // state of camera
  137. int attr;       // camera attributes
  138. POINT4D pos;    // world position of camera used by both camera models
  139. VECTOR4D dir;   // angles or look at direction of camera for simple 
  140.                 // euler camera models, elevation and heading for
  141.                 // uvn model
  142. VECTOR4D u;     // extra vectors to track the camera orientation
  143. VECTOR4D v;     // for more complex UVN camera model
  144. VECTOR4D n;        
  145. VECTOR4D target; // look at target
  146. float view_dist;  // focal length 
  147. float fov;          // field of view for both horizontal and vertical axes
  148. // 3d clipping planes
  149. // if view volume is NOT 90 degree then general 3d clipping
  150. // must be employed
  151. float near_clip_z;     // near z=constant clipping plane
  152. float far_clip_z;      // far z=constant clipping plane
  153. PLANE3D rt_clip_plane;  // the right clipping plane
  154. PLANE3D lt_clip_plane;  // the left clipping plane
  155. PLANE3D tp_clip_plane;  // the top clipping plane
  156. PLANE3D bt_clip_plane;  // the bottom clipping plane                        
  157. float viewplane_width;     // width and height of view plane to project onto
  158. float viewplane_height;    // usually 2x2 for normalized projection or 
  159.                            // the exact same size as the viewport or screen window
  160. // remember screen and viewport are synonomous 
  161. float viewport_width;     // size of screen/viewport
  162. float viewport_height;
  163. float viewport_center_x;  // center of view port (final image destination)
  164. float viewport_center_y;
  165. // aspect ratio
  166. float aspect_ratio;
  167. // these matrices are not necessarily needed based on the method of
  168. // transformation, for example, a manual perspective or screen transform
  169. // and or a concatenated perspective/screen, however, having these 
  170. // matrices give us more flexibility         
  171. MATRIX4X4 mcam;   // storage for the world to camera transform matrix
  172. MATRIX4X4 mper;   // storage for the camera to perspective transform matrix
  173. MATRIX4X4 mscr;   // storage for the perspective to screen transform matrix
  174. } CAM4DV1, *CAM4DV1_PTR;
  175. // object to hold the render list, this way we can have more
  176. // than one render list at a time
  177. typedef struct RENDERLIST4DV1_TYP
  178. {
  179. int state; // state of renderlist ???
  180. int attr;  // attributes of renderlist ???
  181. // the render list is an array of pointers each pointing to 
  182. // a self contained "renderable" polygon face POLYF4DV1
  183. POLYF4DV1_PTR poly_ptrs[RENDERLIST4DV1_MAX_POLYS];
  184. // additionally to cut down on allocatation, de-allocation
  185. // of polygons each frame, here's where the actual polygon
  186. // faces will be stored
  187. POLYF4DV1 poly_data[RENDERLIST4DV1_MAX_POLYS];
  188. int num_polys; // number of polys in render list
  189. } RENDERLIST4DV1, *RENDERLIST4DV1_PTR;
  190. // CLASSES ////////////////////////////////////////////////////
  191. // PROTOTYPES /////////////////////////////////////////////////
  192. char *Get_Line_PLG(char *buffer, int maxlength, FILE *fp);
  193. float Compute_OBJECT4DV1_Radius(OBJECT4DV1_PTR obj);
  194. int Load_OBJECT4DV1_PLG(OBJECT4DV1_PTR obj, char *filename, VECTOR4D_PTR scale,    
  195.                     VECTOR4D_PTR pos,  VECTOR4D_PTR rot);
  196. void Translate_OBJECT4DV1(OBJECT4DV1_PTR obj, VECTOR4D_PTR vt);
  197. void Scale_OBJECT4DV1(OBJECT4DV1_PTR obj, VECTOR4D_PTR vs);
  198. void Build_XYZ_Rotation_MATRIX4X4(float theta_x, float theta_y, float theta_z,
  199.                                      MATRIX4X4_PTR mrot);
  200. void Transform_OBJECT4DV1(OBJECT4DV1_PTR obj, MATRIX4X4_PTR mt,   
  201.                           int coord_select, int transform_basis);
  202.                                                
  203. void Rotate_XYZ_OBJECT4DV1(OBJECT4DV1_PTR obj, 
  204.                           float theta_x,     
  205.                           float theta_y, 
  206.                           float theta_z);
  207. void Model_To_World_OBJECT4DV1(OBJECT4DV1_PTR obj, int coord_select=TRANSFORM_LOCAL_TO_TRANS);
  208. int Cull_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam, int cull_flags);
  209. void Remove_Backfaces_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
  210. void Remove_Backfaces_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, CAM4DV1_PTR cam);
  211. void World_To_Camera_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
  212. void Camera_To_Perspective_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
  213. void Camera_To_Perspective_Screen_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
  214. void Perspective_To_Screen_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
  215. void Transform_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, MATRIX4X4_PTR mt,  
  216.                               int coord_select);
  217. void Model_To_World_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, POINT4D_PTR world_pos, 
  218.                                    int coord_select=TRANSFORM_LOCAL_TO_TRANS);
  219. void World_To_Camera_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, CAM4DV1_PTR cam);
  220. void Camera_To_Perspective_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, 
  221.                                                CAM4DV1_PTR cam);
  222. void Perspective_To_Screen_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, 
  223.                                                CAM4DV1_PTR cam);
  224. void Camera_To_Perspective_Screen_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, 
  225.                                                  CAM4DV1_PTR cam);
  226. void Reset_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list);
  227. void Reset_OBJECT4DV1(OBJECT4DV1_PTR obj);
  228. int Insert_POLY4DV1_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list,POLY4DV1_PTR poly);
  229. int Insert_POLYF4DV1_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, POLYF4DV1_PTR poly);
  230. int Insert_OBJECT4DV1_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, OBJECT4DV1_PTR obj,
  231.                                       int insert_local=0);
  232. void Draw_OBJECT4DV1_Wire(OBJECT4DV1_PTR obj, UCHAR *video_buffer, int lpitch);
  233. void Draw_RENDERLIST4DV1_Wire(RENDERLIST4DV1_PTR rend_list, UCHAR *video_buffer, int lpitch);
  234. void Draw_OBJECT4DV1_Wire16(OBJECT4DV1_PTR obj, UCHAR *video_buffer, int lpitch);
  235. void Draw_RENDERLIST4DV1_Wire16(RENDERLIST4DV1_PTR rend_list, UCHAR *video_buffer, int lpitch);
  236. void Build_Model_To_World_MATRIX4X4(VECTOR4D_PTR vpos, MATRIX4X4_PTR m);
  237. void Build_Camera_To_Perspective_MATRIX4X4(CAM4DV1_PTR cam, MATRIX4X4_PTR m);
  238. void Build_Perspective_To_Screen_4D_MATRIX4X4(CAM4DV1_PTR cam, MATRIX4X4_PTR m);
  239. void Build_Perspective_To_Screen_MATRIX4X4(CAM4DV1_PTR cam, MATRIX4X4_PTR m);
  240. void Build_Camera_To_Screen_MATRIX4X4(CAM4DV1_PTR cam, MATRIX4X4_PTR m);
  241. void Convert_From_Homogeneous4D_OBJECT4DV1(OBJECT4DV1_PTR obj);
  242. void Convert_From_Homogeneous4D_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list);
  243. void Build_CAM4DV1_Matrix_Euler(CAM4DV1_PTR cam, int cam_rot_seq);
  244. void Build_CAM4DV1_Matrix_UVN(CAM4DV1_PTR cam, int mode);
  245. void Init_CAM4DV1(CAM4DV1_PTR cam, int attr, POINT4D_PTR cam_pos, 
  246.                   VECTOR4D_PTR cam_dir, VECTOR4D_PTR cam_target,
  247.                   float near_clip_z, float far_clip_z, float fov, 
  248.                   float viewport_width,  float viewport_height);
  249. // GLOBALS ////////////////////////////////////////////////////
  250. #endif