2 * Copyright (C) 2003 Robert Kooima
4 * NEVERBALL is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published
6 * by the Free Software Foundation; either version 2 of the License,
7 * or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
19 #include "base_config.h"
22 * Some might be taken aback at the terseness of the names of the
23 * structure members and the variables used by the functions that
24 * access them. Yes, yes, I know: readability. I contend that once
25 * the naming convention is embraced, the names become more readable
26 * than any verbose alternative, and their brevity and uniformity do
27 * more to augment readability than longVariableNames ever could.
29 * Members and variables are named XY. X determines the type of
30 * structure to which the variable refers. Y determines the usage of
33 * The Xs are as documented by struct s_file:
35 * f File (struct s_file)
36 * m Material (struct s_mtrl)
37 * v Vertex (struct s_vert)
38 * e Edge (struct s_edge)
39 * s Side (struct s_side)
40 * t Texture coord (struct s_texc)
41 * g Geometry (struct s_geom)
42 * l Lump (struct s_lump)
43 * n Node (struct s_node)
44 * p Path (struct s_path)
45 * b Body (struct s_body)
46 * h Item (struct s_item)
47 * z Goal (struct s_goal)
48 * j Jump (struct s_jump)
49 * x Switch (struct s_swch)
50 * r Billboard (struct s_bill)
51 * u User (struct s_ball)
52 * w Viewpoint (struct s_view)
53 * d Dictionary (struct s_dict)
57 * The Ys are as follows:
62 * 0 Index of the first
67 * Thus "up" is a pointer to a user structure. "lc" is the number of
68 * lumps. "ei" and "ej" are edge indices into some "ev" edge vector.
69 * An edge is defined by two vertices, so an edge structure consists
70 * of "vi" and "vj". And so on.
72 * Those members that do not conform to this convention are explicitly
73 * documented with a comment.
75 * These prefixes are still available: c k o q y.
78 /*---------------------------------------------------------------------------*/
80 /* Material type flags */
83 #define M_TRANSPARENT 2
84 #define M_REFLECTIVE 4
85 #define M_ENVIRONMENT 8
89 #define M_TWO_SIDED 128
90 #define M_SHADOWED 256
92 /* Billboard types. */
108 #define ITEM_SHRINK 3
114 /*---------------------------------------------------------------------------*/
118 float d[4]; /* diffuse color */
119 float a[4]; /* ambient color */
120 float s[4]; /* specular color */
121 float e[4]; /* emission color */
122 float h[1]; /* specular exponent */
125 int fl; /* material flags */
127 GLuint o; /* OpenGL texture object */
128 char f[PATHMAX]; /* texture file name */
133 float p[3]; /* vertex position */
144 float n[3]; /* plane normal vector */
145 float d; /* distance from origin */
150 float u[2]; /* texture coordinate */
163 int fl; /* lump flags */
181 float p[3]; /* starting position */
182 float e[4]; /* orientation (quaternion) */
183 float t; /* travel time */
184 int tm; /* milliseconds */
187 int f; /* enable flag */
188 int s; /* smooth flag */
192 /* TODO: merge enable and smooth into flags. */
197 float t; /* time on current path */
198 int tm; /* milliseconds */
200 GLuint ol; /* opaque geometry list */
201 GLuint tl; /* transparent geometry list */
202 GLuint rl; /* reflective geometry list */
203 GLuint sl; /* shadowed geometry list */
215 float p[3]; /* position */
222 float p[3]; /* position */
223 float r; /* radius */
228 float p[3]; /* position */
229 float r; /* radius */
230 int pi; /* the linked path */
232 float t0; /* default timer */
233 int t0m; /* milliseconds */
234 float t; /* current timer */
235 int tm; /* milliseconds */
236 int f0; /* default state */
237 int f; /* current state */
238 int i; /* is invisible? */
239 int e; /* is a ball inside it? */
246 float t; /* repeat time interval */
247 float d; /* distance */
249 float w[3]; /* width coefficients */
250 float h[3]; /* height coefficients */
252 float rx[3]; /* X rotation coefficients */
253 float ry[3]; /* Y rotation coefficients */
254 float rz[3]; /* Z rotation coefficients */
261 float p[3]; /* position */
262 float q[3]; /* target position */
263 float r; /* radius */
268 float e[3][3]; /* basis of orientation */
269 float p[3]; /* position vector */
270 float v[3]; /* velocity vector */
271 float w[3]; /* angular velocity vector */
272 float E[3][3]; /* basis of pendulum */
273 float W[3]; /* angular pendulum velocity */
274 float r; /* radius */
334 /*---------------------------------------------------------------------------*/
336 int sol_load_only_file(struct s_file *, const char *);
337 int sol_load_only_head(struct s_file *, const char *);
338 int sol_stor(struct s_file *, const char *);
339 void sol_free(struct s_file *);
341 /*---------------------------------------------------------------------------*/