1
enum // block types, order matters!
3
SOLID = 0, // entirely solid cube [only specifies wtex]
4
CORNER, // half full corner of a wall
5
FHF, // floor heightfield using neighbour vdelta values
7
SPACE, // entirely empty cube
8
SEMISOLID, // generated by mipmapping
14
uchar type; // one of the above
15
char floor, ceil; // height, in cubes
16
uchar wtex, ftex, ctex; // wall/floor/ceil texture ids
17
uchar r, g, b; // light value at upper left vertex
18
uchar vdelta; // vertex delta, used for heightfield cubes
19
char defer; // used in mipmapping, when true this cube is not a perfect mip
20
char occluded; // true when occluded
21
uchar utex; // upper wall tex id
22
uchar tag; // used by triggers
26
enum // hardcoded texture numbers
35
#define MAPVERSION 6 // bump if map format changes, see worldio.cpp
37
struct header // map file format header
39
char head[4]; // "CUBE"
40
int version; // any >8bit quantity is little endian
41
int headersize; // sizeof(header)
42
int sfactor; // in bits
45
uchar texlists[3][256];
54
int entcnt[MAXENTTYPES];
65
#define TRANSFORMOLDENTITIES(headr) \
68
if(!e.attr2) e.attr2 = 255; /* needed for MAPVERSION<=2 */ \
69
if(e.attr1>32) e.attr1 = 32; /* 12_03 and below */ \
71
if(headr.version<MAPVERSION && strncmp(headr.head,"CUBE",4)==0) /* only render lights, pl starts and map models on old maps */ \
75
case 1: /* old light */ \
78
case 2: /* old player start */ \
87
case 7: /* old health */ \
90
case 8: /* old boost */ \
94
case 10: /* armor */ \
100
case 14: /* old map model */ \
108
#define SWS(w,x,y,s) (&(w)[((y)<<(s))+(x)])
109
#define SW(w,x,y) SWS(w,x,y,sfactor)
110
#define S(x,y) SW(world,x,y) // convenient lookup of a lowest mip cube
111
#define SMALLEST_FACTOR 6 // determines number of mips there can be
112
#define DEFAULT_FACTOR 8
113
#define LARGEST_FACTOR 11 // 10 is already insane
114
#define MAXENTITIES 65535
115
#define SOLID(x) ((x)->type==SOLID)
116
#define MINBORD 2 // 2 cubes from the edge of the world are always solid
117
#define OUTBORD(x,y) ((x)<MINBORD || (y)<MINBORD || (x)>=ssize-MINBORD || (y)>=ssize-MINBORD)
118
#define OUTBORDRAD(x,y,rad) (int(x-rad)<MINBORD || int(y-rad)<MINBORD || int(x+rad)>=ssize-MINBORD || (y+rad)>=ssize-MINBORD)
120
struct block { int x, y, xs, ys; };
122
// vertex array format
124
struct vertex { float u, v, x, y, z; uchar r, g, b, a; };