t3dlib5.h
资源名称:Source.rar [点击查看]
上传用户:husern
上传日期:2018-01-20
资源大小:42486k
文件大小:14k
源码类别:
游戏
开发平台:
Visual C++
- // T3DLIB5.H - Header file for T3DLIB5.CPP game engine library
- // watch for multiple inclusions
- #ifndef T3DLIB5
- #define T3DLIB5
- // DEFINES ////////////////////////////////////////////////////
- // defines for enhanced PLG file format -> PLX
- // the surface descriptor is still 16-bit now in the following format
- // d15 d0
- // CSSD | RRRR| GGGG | BBBB
- // C is the RGB/indexed color flag
- // SS are two bits that define the shading mode
- // D is the double sided flag
- // and RRRR, GGGG, BBBB are the red, green, blue bits for RGB mode
- // or GGGGBBBB is the 8-bit color index for 8-bit mode
- // bit masks to simplify testing????
- #define PLX_RGB_MASK 0x8000 // mask to extract RGB or indexed color
- #define PLX_SHADE_MODE_MASK 0x6000 // mask to extract shading mode
- #define PLX_2SIDED_MASK 0x1000 // mask for double sided
- #define PLX_COLOR_MASK 0x0fff // xxxxrrrrggggbbbb, 4-bits per channel RGB
- // xxxxxxxxiiiiiiii, indexed mode 8-bit index
- // these are the comparision flags after masking
- // color mode of polygon
- #define PLX_COLOR_MODE_RGB_FLAG 0x8000 // this poly uses RGB color
- #define PLX_COLOR_MODE_INDEXED_FLAG 0x0000 // this poly uses an indexed 8-bit color
- // double sided flag
- #define PLX_2SIDED_FLAG 0x1000 // this poly is double sided
- #define PLX_1SIDED_FLAG 0x0000 // this poly is single sided
- // shading mode of polygon
- #define PLX_SHADE_MODE_PURE_FLAG 0x0000 // this poly is a constant color
- #define PLX_SHADE_MODE_CONSTANT_FLAG 0x0000 // alias
- #define PLX_SHADE_MODE_FLAT_FLAG 0x2000 // this poly uses flat shading
- #define PLX_SHADE_MODE_GOURAUD_FLAG 0x4000 // this poly used gouraud shading
- #define PLX_SHADE_MODE_PHONG_FLAG 0x6000 // this poly uses phong shading
- #define PLX_SHADE_MODE_FASTPHONG_FLAG 0x6000 // this poly uses phong shading (alias)
- // defines for polygons and faces version 1
- // attributes of polygons and polygon faces
- #define POLY4DV1_ATTR_2SIDED 0x0001
- #define POLY4DV1_ATTR_TRANSPARENT 0x0002
- #define POLY4DV1_ATTR_8BITCOLOR 0x0004
- #define POLY4DV1_ATTR_RGB16 0x0008
- #define POLY4DV1_ATTR_RGB24 0x0010
- #define POLY4DV1_ATTR_SHADE_MODE_PURE 0x0020
- #define POLY4DV1_ATTR_SHADE_MODE_CONSTANT 0x0020 // (alias)
- #define POLY4DV1_ATTR_SHADE_MODE_FLAT 0x0040
- #define POLY4DV1_ATTR_SHADE_MODE_GOURAUD 0x0080
- #define POLY4DV1_ATTR_SHADE_MODE_PHONG 0x0100
- #define POLY4DV1_ATTR_SHADE_MODE_FASTPHONG 0x0100 // (alias)
- #define POLY4DV1_ATTR_SHADE_MODE_TEXTURE 0x0200
- // states of polygons and faces
- #define POLY4DV1_STATE_ACTIVE 0x0001
- #define POLY4DV1_STATE_CLIPPED 0x0002
- #define POLY4DV1_STATE_BACKFACE 0x0004
- // defines for objects version 1
- #define OBJECT4DV1_MAX_VERTICES 1024 // 64
- #define OBJECT4DV1_MAX_POLYS 1024 // 128
- // states for objects
- #define OBJECT4DV1_STATE_ACTIVE 0x0001
- #define OBJECT4DV1_STATE_VISIBLE 0x0002
- #define OBJECT4DV1_STATE_CULLED 0x0004
- // attributes for objects
- // render list defines
- #define RENDERLIST4DV1_MAX_POLYS 32768// 16384
- // transformation control flags
- #define TRANSFORM_LOCAL_ONLY 0 // perform the transformation in place on the
- // local/world vertex list
- #define TRANSFORM_TRANS_ONLY 1 // perfrom the transformation in place on the
- // "transformed" vertex list
- #define TRANSFORM_LOCAL_TO_TRANS 2 // perform the transformation to the local
- // vertex list, but store the results in the
- // transformed vertex list
- // general culling flags
- #define CULL_OBJECT_X_PLANE 0x0001 // cull on the x clipping planes
- #define CULL_OBJECT_Y_PLANE 0x0002 // cull on the y clipping planes
- #define CULL_OBJECT_Z_PLANE 0x0004 // cull on the z clipping planes
- #define CULL_OBJECT_XYZ_PLANES (CULL_OBJECT_X_PLANE | CULL_OBJECT_Y_PLANE | CULL_OBJECT_Z_PLANE)
- // defines for camera rotation sequences
- #define CAM_ROT_SEQ_XYZ 0
- #define CAM_ROT_SEQ_YXZ 1
- #define CAM_ROT_SEQ_XZY 2
- #define CAM_ROT_SEQ_YZX 3
- #define CAM_ROT_SEQ_ZYX 4
- #define CAM_ROT_SEQ_ZXY 5
- // defines for special types of camera projections
- #define CAM_PROJ_NORMALIZED 0x0001
- #define CAM_PROJ_SCREEN 0x0002
- #define CAM_PROJ_FOV90 0x0004
- #define CAM_MODEL_EULER 0x0008
- #define CAM_MODEL_UVN 0x0010
- #define UVN_MODE_SIMPLE 0
- #define UVN_MODE_SPHERICAL 1
- // TYPES //////////////////////////////////////////////////////
- // a polygon based on an external vertex list
- typedef struct POLY4DV1_TYP
- {
- int state; // state information
- int attr; // physical attributes of polygon
- int color; // color of polygon
- POINT4D_PTR vlist; // the vertex list itself
- int vert[3]; // the indices into the vertex list
- } POLY4DV1, *POLY4DV1_PTR;
- // a self contained polygon used for the render list
- typedef struct POLYF4DV1_TYP
- {
- int state; // state information
- int attr; // physical attributes of polygon
- int color; // color of polygon
- POINT4D vlist[3]; // the vertices of this triangle
- POINT4D tvlist[3]; // the vertices after transformation if needed
- POLYF4DV1_TYP *next; // pointer to next polygon in list??
- POLYF4DV1_TYP *prev; // pointer to previous polygon in list??
- } POLYF4DV1, *POLYF4DV1_PTR;
- // an object based on a vertex list and list of polygons
- typedef struct OBJECT4DV1_TYP
- {
- int id; // numeric id of this object
- char name[64]; // ASCII name of object just for kicks
- int state; // state of object
- int attr; // attributes of object
- float avg_radius; // average radius of object used for collision detection
- float max_radius; // maximum radius of object
- POINT4D world_pos; // position of object in world
- VECTOR4D dir; // rotation angles of object in local
- // cords or unit direction vector user defined???
- VECTOR4D ux,uy,uz; // local axes to track full orientation
- // this is updated automatically during
- // rotation calls
- int num_vertices; // number of vertices of this object
- POINT4D vlist_local[OBJECT4DV1_MAX_VERTICES]; // array of local vertices
- POINT4D vlist_trans[OBJECT4DV1_MAX_VERTICES]; // array of transformed vertices
- int num_polys; // number of polygons in object mesh
- POLY4DV1 plist[OBJECT4DV1_MAX_POLYS]; // array of polygons
- } OBJECT4DV1, *OBJECT4DV1_PTR;
- // camera version 1
- typedef struct CAM4DV1_TYP
- {
- int state; // state of camera
- int attr; // camera attributes
- POINT4D pos; // world position of camera used by both camera models
- VECTOR4D dir; // angles or look at direction of camera for simple
- // euler camera models, elevation and heading for
- // uvn model
- VECTOR4D u; // extra vectors to track the camera orientation
- VECTOR4D v; // for more complex UVN camera model
- VECTOR4D n;
- VECTOR4D target; // look at target
- float view_dist; // focal length
- float fov; // field of view for both horizontal and vertical axes
- // 3d clipping planes
- // if view volume is NOT 90 degree then general 3d clipping
- // must be employed
- float near_clip_z; // near z=constant clipping plane
- float far_clip_z; // far z=constant clipping plane
- PLANE3D rt_clip_plane; // the right clipping plane
- PLANE3D lt_clip_plane; // the left clipping plane
- PLANE3D tp_clip_plane; // the top clipping plane
- PLANE3D bt_clip_plane; // the bottom clipping plane
- float viewplane_width; // width and height of view plane to project onto
- float viewplane_height; // usually 2x2 for normalized projection or
- // the exact same size as the viewport or screen window
- // remember screen and viewport are synonomous
- float viewport_width; // size of screen/viewport
- float viewport_height;
- float viewport_center_x; // center of view port (final image destination)
- float viewport_center_y;
- // aspect ratio
- float aspect_ratio;
- // these matrices are not necessarily needed based on the method of
- // transformation, for example, a manual perspective or screen transform
- // and or a concatenated perspective/screen, however, having these
- // matrices give us more flexibility
- MATRIX4X4 mcam; // storage for the world to camera transform matrix
- MATRIX4X4 mper; // storage for the camera to perspective transform matrix
- MATRIX4X4 mscr; // storage for the perspective to screen transform matrix
- } CAM4DV1, *CAM4DV1_PTR;
- // object to hold the render list, this way we can have more
- // than one render list at a time
- typedef struct RENDERLIST4DV1_TYP
- {
- int state; // state of renderlist ???
- int attr; // attributes of renderlist ???
- // the render list is an array of pointers each pointing to
- // a self contained "renderable" polygon face POLYF4DV1
- POLYF4DV1_PTR poly_ptrs[RENDERLIST4DV1_MAX_POLYS];
- // additionally to cut down on allocatation, de-allocation
- // of polygons each frame, here's where the actual polygon
- // faces will be stored
- POLYF4DV1 poly_data[RENDERLIST4DV1_MAX_POLYS];
- int num_polys; // number of polys in render list
- } RENDERLIST4DV1, *RENDERLIST4DV1_PTR;
- // CLASSES ////////////////////////////////////////////////////
- // PROTOTYPES /////////////////////////////////////////////////
- char *Get_Line_PLG(char *buffer, int maxlength, FILE *fp);
- float Compute_OBJECT4DV1_Radius(OBJECT4DV1_PTR obj);
- int Load_OBJECT4DV1_PLG(OBJECT4DV1_PTR obj, char *filename, VECTOR4D_PTR scale,
- VECTOR4D_PTR pos, VECTOR4D_PTR rot);
- void Translate_OBJECT4DV1(OBJECT4DV1_PTR obj, VECTOR4D_PTR vt);
- void Scale_OBJECT4DV1(OBJECT4DV1_PTR obj, VECTOR4D_PTR vs);
- void Build_XYZ_Rotation_MATRIX4X4(float theta_x, float theta_y, float theta_z,
- MATRIX4X4_PTR mrot);
- void Transform_OBJECT4DV1(OBJECT4DV1_PTR obj, MATRIX4X4_PTR mt,
- int coord_select, int transform_basis);
- void Rotate_XYZ_OBJECT4DV1(OBJECT4DV1_PTR obj,
- float theta_x,
- float theta_y,
- float theta_z);
- void Model_To_World_OBJECT4DV1(OBJECT4DV1_PTR obj, int coord_select=TRANSFORM_LOCAL_TO_TRANS);
- int Cull_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam, int cull_flags);
- void Remove_Backfaces_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
- void Remove_Backfaces_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, CAM4DV1_PTR cam);
- void World_To_Camera_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
- void Camera_To_Perspective_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
- void Camera_To_Perspective_Screen_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
- void Perspective_To_Screen_OBJECT4DV1(OBJECT4DV1_PTR obj, CAM4DV1_PTR cam);
- void Transform_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, MATRIX4X4_PTR mt,
- int coord_select);
- void Model_To_World_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, POINT4D_PTR world_pos,
- int coord_select=TRANSFORM_LOCAL_TO_TRANS);
- void World_To_Camera_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, CAM4DV1_PTR cam);
- void Camera_To_Perspective_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list,
- CAM4DV1_PTR cam);
- void Perspective_To_Screen_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list,
- CAM4DV1_PTR cam);
- void Camera_To_Perspective_Screen_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list,
- CAM4DV1_PTR cam);
- void Reset_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list);
- void Reset_OBJECT4DV1(OBJECT4DV1_PTR obj);
- int Insert_POLY4DV1_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list,POLY4DV1_PTR poly);
- int Insert_POLYF4DV1_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, POLYF4DV1_PTR poly);
- int Insert_OBJECT4DV1_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list, OBJECT4DV1_PTR obj,
- int insert_local=0);
- void Draw_OBJECT4DV1_Wire(OBJECT4DV1_PTR obj, UCHAR *video_buffer, int lpitch);
- void Draw_RENDERLIST4DV1_Wire(RENDERLIST4DV1_PTR rend_list, UCHAR *video_buffer, int lpitch);
- void Draw_OBJECT4DV1_Wire16(OBJECT4DV1_PTR obj, UCHAR *video_buffer, int lpitch);
- void Draw_RENDERLIST4DV1_Wire16(RENDERLIST4DV1_PTR rend_list, UCHAR *video_buffer, int lpitch);
- void Build_Model_To_World_MATRIX4X4(VECTOR4D_PTR vpos, MATRIX4X4_PTR m);
- void Build_Camera_To_Perspective_MATRIX4X4(CAM4DV1_PTR cam, MATRIX4X4_PTR m);
- void Build_Perspective_To_Screen_4D_MATRIX4X4(CAM4DV1_PTR cam, MATRIX4X4_PTR m);
- void Build_Perspective_To_Screen_MATRIX4X4(CAM4DV1_PTR cam, MATRIX4X4_PTR m);
- void Build_Camera_To_Screen_MATRIX4X4(CAM4DV1_PTR cam, MATRIX4X4_PTR m);
- void Convert_From_Homogeneous4D_OBJECT4DV1(OBJECT4DV1_PTR obj);
- void Convert_From_Homogeneous4D_RENDERLIST4DV1(RENDERLIST4DV1_PTR rend_list);
- void Build_CAM4DV1_Matrix_Euler(CAM4DV1_PTR cam, int cam_rot_seq);
- void Build_CAM4DV1_Matrix_UVN(CAM4DV1_PTR cam, int mode);
- void Init_CAM4DV1(CAM4DV1_PTR cam, int attr, POINT4D_PTR cam_pos,
- VECTOR4D_PTR cam_dir, VECTOR4D_PTR cam_target,
- float near_clip_z, float far_clip_z, float fov,
- float viewport_width, float viewport_height);
- // GLOBALS ////////////////////////////////////////////////////
- #endif