/***************************************************************************
 *
 * 3dtypes.h
 *
 ***************************************************************************
 *
 * 3d type definitions
 *
 ***************************************************************************/


#ifndef THREEDTYPES_H_INCLUDED
#define THREEDTYPES_H_INCLUDED

/*
 * includes
 */

#include "utypes.h"

/*
 * defines
 */

#define BB_CHECK			0
#define BB_2D_ONLY			1
#define BB_NO_CHECK			2

#define SHAPE_FLAGS_LIGHTSOURCED        2
#define SHAPE_FLAGS_DEPTHSORT           4
#define SHAPE_FLAGS_CONVEX              8
#define SHAPE_FLAGS_TC_LOCKED		16

#define SHAPE_FLAGS_VERSION_MASK	0xFFFF0000
#define SHAPE_FLAGS_CURRENT_VERSION	0x00010000

#define POLY_MASK_FLAGS                 0xF00F
#define POLY_FLAGS_STATIC               0x0001
#define POLY_FLAGS_TILED		0x0002
#define POLY_FLAGS_TC_PRESENT		0x0004
#define POLY_FLAGS_TRANSLUCENT		0x0008
#define POLY_FLAGS_SHADOW		0x1000
#define POLY_FLAGS_VTEX			0x2000
#define POLY_FLAGS_QUAD			0x4000

#define POLY_MASK_LIGHTING              0x00F0
#define POLY_LIGHTING_NONE              0x0000
#define POLY_LIGHTING_FLAT              0x0010
#define POLY_LIGHTING_GOURAUD           0x0020
#define POLY_LIGHTING_ENV               0x0030

#define POLY_MASK_SURFACE               0x0F00
#define POLY_SURFACE_FLAT               0x0000
#define POLY_SURFACE_TEXTURE            0x0100
#define POLY_SURFACE_ENV                0x0200

#define ENV_TYPE_INTENSITY              1
#define ENV_TYPE_INTENSITY_TEMPLATE     2
#define ENV_TYPE_IMAGE                  3


/*
 * typedefs
 */

/*
 * structures
 */

typedef struct _vector
{
        int32 x,y,z;
} vector;

typedef struct _vector16
{
	int16 x,y,z,w;
}vector16;

typedef struct _Quat
{
	short int w;
	short int x;
	short int y;
	short int z;
}Quat;


typedef struct _planeDef
{
        int32 normalId;
        int32 d;
} planeDef;

typedef struct _matrix
{
        int32 xX,xY,xZ;
        int32 yX,yY,yZ;
        int32 zX,zY,zZ;
} matrix;

typedef struct _bspNode
{
        struct _bspNode *v,*i;
        int16 planeId;
        int16 numPolys;
        int16 polys[1];
} bspNode;

typedef struct _poly
{
        uint32 flags;
        int16  vertices[3];
        int16  normalId;
        int16  textureData[1];
} poly;

typedef struct _shape
{
        uint32 flags;
	int32 numTotalVertices;
        int32 numVertices;
        int32 numPolys;
        int32 numPlaneNormals;
        int32 numPlaneDefs;
        int32 numVertexNormals;
        int32 numColours;
	int32 numVertexGroups;

        int32 xMin,yMin,zMin;
        int32 xMax,yMax,zMax;

        byte  *vertexRefCounts;
        int16 *vNormalConstructors;

        vector *vertices;
        poly *polys;
        poly **polyPtrs;
        vector *planeNormals;
        planeDef *planeDefs;
        vector *vertexNormals;
        bspNode *bspTree;
        byte *palette;

	int16 **vertexGroupPtrs;

} shape;


#ifdef PC
/*
 * Old structures from wig3d
 * Included to enable compilation under VC
 * to get browse info
 */
#include "texture.h"

typedef struct _projectionDef
{
        vector  v;
        matrix  m;
        matrix  im;
        texture **textureHandle;
} projectionDef;

typedef struct _envDef
{
        int32 numProjections;
        int32 type;

        int32 numShades;
        byte  palette[768];

        byte  *gouraudShadeTable;
        byte  *shadeTable;

        projectionDef proj[1];
} envDef;

typedef struct _cacheMat
{
        uint32 stamp;
        matrix m;
} cacheMat;

typedef struct _env
{
        envDef  *def;
        matrix  mat;
        matrix  imat;
        int32   numShades;
        byte  *gouraudShadeTable;
        byte  *shadeTable;
        cacheMat shapeToLight;
        cacheMat cacheMats[1];
} env;

#endif



/*
 * globals
 */

/*
 * function prototypes
 */

#endif
