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

游戏

开发平台:

Visual C++

  1. // T3DLIB6.H - header file for T3DLIB6.H
  2. // watch for multiple inclusions
  3. #ifndef T3DLIB6
  4. #define T3DLIB6
  5. // DEFINES //////////////////////////////////////////////////////////////////
  6. #define VERTEX_FLAGS_INVERT_X               0x0001   // inverts the Z-coordinates
  7. #define VERTEX_FLAGS_INVERT_Y               0x0002   // inverts the Z-coordinates
  8. #define VERTEX_FLAGS_INVERT_Z               0x0004   // inverts the Z-coordinates
  9. #define VERTEX_FLAGS_SWAP_YZ                0x0008   // transforms a RHS model to a LHS model
  10. #define VERTEX_FLAGS_SWAP_XZ                0x0010   
  11. #define VERTEX_FLAGS_SWAP_XY                0x0020
  12. #define VERTEX_FLAGS_INVERT_WINDING_ORDER   0x0040   // invert winding order from cw to ccw or ccw to cc
  13. #define VERTEX_FLAGS_TRANSFORM_LOCAL        0x0200   // if file format has local transform then do it!
  14. #define VERTEX_FLAGS_TRANSFORM_LOCAL_WORLD  0x0400  // if file format has local to world then do it!
  15. // defines for materials, follow our polygon attributes as much as possible
  16. #define MATV1_ATTR_2SIDED                 0x0001
  17. #define MATV1_ATTR_TRANSPARENT            0x0002
  18. #define MATV1_ATTR_8BITCOLOR              0x0004
  19. #define MATV1_ATTR_RGB16                  0x0008
  20. #define MATV1_ATTR_RGB24                  0x0010
  21. #define MATV1_ATTR_SHADE_MODE_CONSTANT    0x0020
  22. #define MATV1_ATTR_SHADE_MODE_EMMISIVE    0x0020 // alias
  23. #define MATV1_ATTR_SHADE_MODE_FLAT        0x0040
  24. #define MATV1_ATTR_SHADE_MODE_GOURAUD     0x0080
  25. #define MATV1_ATTR_SHADE_MODE_FASTPHONG   0x0100
  26. #define MATV1_ATTR_SHADE_MODE_TEXTURE     0x0200
  27. // defines for material system
  28. #define MAX_MATERIALS                     256
  29. // states of materials
  30. #define MATV1_STATE_ACTIVE                0x0001
  31. #define MATV1_STATE_INACTIVE              0x0001
  32. // defines for light types
  33. #define LIGHTV1_ATTR_AMBIENT      0x0001    // basic ambient light
  34. #define LIGHTV1_ATTR_INFINITE     0x0002    // infinite light source
  35. #define LIGHTV1_ATTR_DIRECTIONAL  0x0002    // infinite light source (alias)
  36. #define LIGHTV1_ATTR_POINT        0x0004    // point light source
  37. #define LIGHTV1_ATTR_SPOTLIGHT1   0x0008    // spotlight type 1 (simple)
  38. #define LIGHTV1_ATTR_SPOTLIGHT2   0x0010    // spotlight type 2 (complex)
  39. #define LIGHTV1_STATE_ON          1         // light on
  40. #define LIGHTV1_STATE_OFF         0         // light off
  41. #define MAX_LIGHTS                8         // good luck with 1!
  42. // polygon sorting, and painters algorithm defines
  43. // flags for sorting algorithm
  44. #define SORT_POLYLIST_AVGZ  0  // sorts on average of all vertices
  45. #define SORT_POLYLIST_NEARZ 1  // sorts on closest z vertex of each poly
  46. #define SORT_POLYLIST_FARZ  2  // sorts on farthest z vertex of each poly
  47. #define PARSER_DEBUG_OFF // enables/disables conditional compilation 
  48. #define PARSER_STRIP_EMPTY_LINES        1   // strips all blank lines
  49. #define PARSER_LEAVE_EMPTY_LINES        2   // leaves empty lines
  50. #define PARSER_STRIP_WS_ENDS            4   // strips ws space at ends of line
  51. #define PARSER_LEAVE_WS_ENDS            8   // leaves it
  52. #define PARSER_STRIP_COMMENTS           16  // strips comments out
  53. #define PARSER_LEAVE_COMMENTS           32  // leaves comments in
  54. #define PARSER_BUFFER_SIZE              256 // size of parser line buffer
  55. #define PARSER_MAX_COMMENT              16  // maximum size of comment delimeter string
  56. #define PARSER_DEFAULT_COMMENT          "#"  // default comment string for parser
  57. // pattern language
  58. #define PATTERN_TOKEN_FLOAT   'f'
  59. #define PATTERN_TOKEN_INT     'i'
  60. #define PATTERN_TOKEN_STRING  's'
  61. #define PATTERN_TOKEN_LITERAL '''
  62. // state machine defines for pattern matching
  63. #define PATTERN_STATE_INIT       0
  64. #define PATTERN_STATE_RESTART    1
  65. #define PATTERN_STATE_FLOAT      2
  66. #define PATTERN_STATE_INT        3 
  67. #define PATTERN_STATE_LITERAL    4
  68. #define PATTERN_STATE_STRING     5
  69. #define PATTERN_STATE_NEXT       6
  70. #define PATTERN_STATE_MATCH      7
  71. #define PATTERN_STATE_END        8
  72. #define PATTERN_MAX_ARGS         16
  73. #define PATTERN_BUFFER_SIZE      80
  74. // TYPES ///////////////////////////////////////////////////////////////////
  75. // RGB+alpha color
  76. typedef struct RGBAV1_TYP
  77. {
  78. union 
  79.     {
  80.     int rgba;                    // compressed format
  81.     UCHAR rgba_M[4];             // array format
  82.     struct {  UCHAR a,b,g,r;  }; // explict name format
  83.     }; // end union
  84.     
  85. } RGBAV1, *RGBAV1_PTR;
  86. // a first version of a "material"
  87. typedef struct MATV1_TYP
  88. {
  89. int state;           // state of material
  90. int id;              // id of this material, index into material array
  91. char name[64];       // name of material
  92. int  attr;           // attributes, the modes for shading, constant, flat, 
  93.                      // gouraud, fast phong, environment, textured etc.
  94.                      // and other special flags...
  95. RGBAV1 color;            // color of material
  96. float ka, kd, ks, power; // ambient, diffuse, specular, 
  97.                          // coefficients, note they are 
  98.                          // separate and scalars since many 
  99.                          // modelers use this format
  100.                          // along with specular power
  101. RGBAV1 ra, rd, rs;       // the reflectivities/colors pre-
  102.                          // multiplied, to more match our 
  103.                          // definitions, each is basically
  104.                          // computed by multiplying the 
  105.                          // color by the k's, eg:
  106.                          // rd = color*kd etc.
  107. char texture_file[80];   // file location of texture
  108. BITMAP_IMAGE texture;    // actual texture map (if any)
  109. int   iaux1, iaux2;      // auxiliary vars for future expansion
  110. float faux1, faux2;
  111. void *ptr;
  112. } MATV1, *MATV1_PTR;
  113. // first light structure
  114. typedef struct LIGHTV1_TYP
  115. {
  116. int state; // state of light
  117. int id;    // id of light
  118. int attr;  // type of light, and extra qualifiers
  119. RGBAV1 c_ambient;   // ambient light intensity
  120. RGBAV1 c_diffuse;   // diffuse light intensity
  121. RGBAV1 c_specular;  // specular light intensity
  122. POINT4D  pos;       // position of light
  123. VECTOR4D dir;       // direction of light
  124. float kc, kl, kq;   // attenuation factors
  125. float spot_inner;   // inner angle for spot light
  126. float spot_outer;   // outer angle for spot light
  127. float pf;           // power factor/falloff for spot lights
  128. int   iaux1, iaux2; // auxiliary vars for future expansion
  129. float faux1, faux2;
  130. void *ptr;
  131. } LIGHTV1, *LIGHTV1_PTR;
  132. // pcx file header
  133. typedef struct PCX_HEADER_TYP 
  134. {
  135. UCHAR  manufacturer;    // always 0x0A
  136. UCHAR  version;         // version 0x05 for version 3.0 and later
  137. UCHAR  encoding;        // always 1
  138. UCHAR  bits_per_pixel;  // bits per pixel 1,2,4,8
  139. USHORT xmin, ymin;      // coordinates of upper left corner
  140. USHORT xmax, ymax;      // coordinates of lower right corner
  141. USHORT hres;            // horizontal resolution of image in dpi 75/100 typ
  142. USHORT yres;            // vertical resolution of image in dpi 75/100
  143. UCHAR  EGAcolors[48];   // ega palette, not used for 256 color images
  144. UCHAR  reserved;        // reserved for future use, video mode?
  145. UCHAR  color_planes;    // number of color planes 3 for 24-bit imagery
  146. USHORT bytes_per_line;  // bytes per line, always even!
  147. USHORT palette_type;    // 1 for gray scale, 2 for color palette
  148. USHORT scrnw;           // width of screen image taken from
  149. USHORT scrnh;           // height of screen image taken from     
  150. UCHAR  filler[54];      // filler bytes
  151. } PCX_HEADER, *PCX_HEADER_PTR;
  152. // CLASSES /////////////////////////////////////////////////////////////////
  153. // parser class ///////////////////////////////////////////////
  154. class CPARSERV1
  155. {
  156. public:
  157.     // constructor /////////////////////////////////////////////////
  158.     CPARSERV1();
  159.     // destructor ///////////////////////////////////////////////////
  160.     ~CPARSERV1() ;
  161.     // reset file system ////////////////////////////////////////////
  162.     int Reset();
  163.     // open file /////////////////////////////////////////////////////
  164.     int Open(char *filename);
  165.     // close file ////////////////////////////////////////////////////
  166.     int Close();
  167.     
  168.     // get line //////////////////////////////////////////////////////
  169.     char *Getline(int mode);
  170.     // sets the comment string ///////////////////////////////////////
  171.     int SetComment(char *string);
  172.     // find pattern in line //////////////////////////////////////////
  173.     int Pattern_Match(char *string, char *pattern, ...);
  174. // VARIABLE DECLARATIONS /////////////////////////////////////////
  175. public: 
  176.     FILE *fstream;                    // file pointer
  177.     char buffer[PARSER_BUFFER_SIZE];  // line buffer
  178.     int  length;                      // length of current line
  179.     int  num_lines;                   // number of lines processed
  180.     char comment[PARSER_MAX_COMMENT]; // single line comment string
  181. // pattern matching parameter storage, easier that variable arguments
  182. // anything matched will be stored here on exit from the call to pattern()
  183.     char  pstrings[PATTERN_MAX_ARGS][PATTERN_BUFFER_SIZE]; // any strings
  184.     int   num_pstrings;
  185.     float pfloats[PATTERN_MAX_ARGS];                       // any floats
  186.     int   num_pfloats;
  187.     int   pints[PATTERN_MAX_ARGS];                         // any ints
  188.     int   num_pints;
  189. }; // end CLASS CPARSERV1 //////////////////////////////////////////////
  190. typedef CPARSERV1 *CPARSERV1_PTR;
  191. // MACROS ///////////////////////////////////////////////////////////////////
  192. #define SIGN(x) ((x) > 0 ? (1) : (-1))
  193. // this builds a 32 bit color value in 8.8.8.a format (8-bit alpha mode)
  194. #define _RGBA32BIT(r,g,b,a) ((a) + ((b) << 8) + ((g) << 16) + ((r) << 24))
  195. // this builds extract the RGB components of a 16 bit color value in 5.5.5 format (1-bit alpha mode)
  196. #define _RGB555FROM16BIT(RGB, r,g,b) { *r = ( ((RGB) >> 10) & 0x1f); *g = (((RGB) >> 5) & 0x1f); *b = ( (RGB) & 0x1f); }
  197. // this extracts the RGB components of a 16 bit color value in 5.6.5 format (green dominate mode)
  198. #define _RGB565FROM16BIT(RGB, r,g,b) { *r = ( ((RGB) >> 11) & 0x1f); *g = (((RGB) >> 5) & 0x3f); *b = ((RGB) & 0x1f); }
  199. // TYPES ///////////////////////////////////////////////////////////////////
  200. // PROTOTYPES //////////////////////////////////////////////////////////////
  201. void Draw_OBJECT4DV1_Solid(OBJECT4DV1_PTR obj, UCHAR *video_buffer, int lpitch);
  202. void Draw_RENDERLIST4DV1_Solid(RENDERLIST4DV1_PTR rend_list, UCHAR *video_buffer, int lpitch);
  203. void Draw_OBJECT4DV1_Solid16(OBJECT4DV1_PTR obj, UCHAR *video_buffer, int lpitch);
  204. void Draw_RENDERLIST4DV1_Solid16(RENDERLIST4DV1_PTR rend_list, UCHAR *video_buffer, int lpitch);
  205. int Convert_Bitmap_8_16(BITMAP_FILE_PTR bitmap);
  206. int StripChars(char *string_in, char *string_out, char *strip_chars, int case_on=1);
  207. int ReplaceChars(char *string_in, char *string_out, char *replace_chars, char rep_char, int case_on=1);
  208. char *StringLtrim(char *string);
  209. char *StringRtrim(char *string);
  210. float IsFloat(char *fstring);
  211. int   IsInt(char *istring);
  212. int Load_OBJECT4DV1_3DSASC(OBJECT4DV1_PTR obj, char *filename,  
  213.                            VECTOR4D_PTR scale, VECTOR4D_PTR pos, VECTOR4D_PTR rot, 
  214.                            int vertex_flags=0);
  215. int Load_OBJECT4DV1_COB(OBJECT4DV1_PTR obj,   // pointer to object
  216.                         char *filename,       // filename of Caligari COB file
  217.                         VECTOR4D_PTR scale,   // initial scaling factors
  218.                         VECTOR4D_PTR pos,     // initial position
  219.                         VECTOR4D_PTR rot,     // initial rotations
  220.                         int vertex_flags=0);  // flags to re-order vertices 
  221.                                               // and perform transforms
  222. int RGBto8BitIndex(UCHAR r, UCHAR g, UCHAR b, LPPALETTEENTRY palette, int flush_cache);
  223. int RGB_16_8_Indexed_Intensity_Table_Builder(LPPALETTEENTRY src_palette,  // source palette
  224.                                              UCHAR rgbilookup[256][256],  // lookup table
  225.                                              int intensity_normalization=1);
  226. int RGB_16_8_IndexedRGB_Table_Builder(int rgb_format,             // format we want to build table for
  227.                                       LPPALETTEENTRY src_palette, // source palette
  228.                                       UCHAR *rgblookup);          // lookup table
  229. // lighting system
  230. int Init_Light_LIGHTV1(int           index,      // index of light to create (0..MAX_LIGHTS-1)
  231.                        int          _state,      // state of light
  232.                        int          _attr,       // type of light, and extra qualifiers
  233.                        RGBAV1       _c_ambient,  // ambient light intensity
  234.                        RGBAV1       _c_diffuse,  // diffuse light intensity
  235.                        RGBAV1       _c_specular, // specular light intensity
  236.                        POINT4D_PTR  _pos,        // position of light
  237.                        VECTOR4D_PTR _dir,        // direction of light
  238.                        float        _kc,         // attenuation factors
  239.                        float        _kl, 
  240.                        float        _kq, 
  241.                        float        _spot_inner, // inner angle for spot light
  242.                        float        _spot_outer, // outer angle for spot light
  243.                        float        _pf);        // power factor/falloff for spot lights
  244. int Reset_Lights_LIGHTV1(void);
  245. // material system
  246. int Reset_Materials_MATV1(void);
  247. // inserts an object into renderlist with shaded color override             
  248. int Insert_OBJECT4DV1_RENDERLIST4DV12(RENDERLIST4DV1_PTR rend_list, 
  249.                                       OBJECT4DV1_PTR obj,
  250.                                       int insert_local=0,
  251.                                       int lighting_on=0);
  252. // light an object
  253. int Light_OBJECT4DV1_World16(OBJECT4DV1_PTR obj,  // object to process
  254.                              CAM4DV1_PTR cam,     // camera position
  255.                              LIGHTV1_PTR lights,  // light list (might have more than one)
  256.                              int max_lights);     // maximum lights in list
  257. int Light_OBJECT4DV1_World(OBJECT4DV1_PTR obj,  // object to process
  258.                            CAM4DV1_PTR cam,     // camera position
  259.                            LIGHTV1_PTR lights,  // light list (might have more than one)
  260.                            int max_lights);      // maximum lights in list
  261. // light the entire rendering list
  262. int Light_RENDERLIST4DV1_World(RENDERLIST4DV1_PTR rend_list,  // list to process
  263.                                  CAM4DV1_PTR cam,     // camera position
  264.                                  LIGHTV1_PTR lights,  // light list (might have more than one)
  265.                                  int max_lights);     // maximum lights in list
  266. // light the entire rendering list
  267. int Light_RENDERLIST4DV1_World16(RENDERLIST4DV1_PTR rend_list,  // list to process
  268.                                  CAM4DV1_PTR cam,     // camera position
  269.                                  LIGHTV1_PTR lights,  // light list (might have more than one)
  270.                                  int max_lights);     // maximum lights in list
  271. // z-sort algorithm (simple painters algorithm)
  272. void Sort_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, int sort_method=SORT_POLYLIST_AVGZ);
  273. // avg z-compare
  274. int Compare_AvgZ_POLYF4DV1(const void *arg1, const void *arg2);
  275. // near z-compare
  276. int Compare_NearZ_POLYF4DV1(const void *arg1, const void *arg2);
  277. // far z-compare
  278. int Compare_FarZ_POLYF4DV1(const void *arg1, const void *arg2);
  279. // GLOBALS ///////////////////////////////////////////////////////////////////
  280. extern MATV1 materials[MAX_MATERIALS]; // materials in system
  281. extern int num_materials;              // current number of materials
  282. extern LIGHTV1 lights[MAX_LIGHTS];  // lights in system
  283. extern int num_lights;              // current number of lights
  284. // these look up tables are used by the 8-bit lighting engine
  285. // the first one holds a color translation table in the form of each
  286. // row is a color 0..255, and each row consists of 256 shades of that color
  287. // the data in each row is the color/intensity indices and the resulting value
  288. // is an 8-bit index into the real color lookup that should be used as the color
  289. // the second table works by each index being a compressed 16bit RGB value
  290. // the data indexed by that RGB value IS the index 0..255 of the real
  291. // color lookup that matches the desired color the closest
  292. extern UCHAR rgbilookup[256][256];         // intensity RGB 8-bit lookup storage
  293. extern UCHAR rgblookup[65536];             // RGB 8-bit color lookup
  294. //////////////////////////////////////////////////////////////////////////////
  295. #endif
  296.