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.
24 * Some might be taken aback at the terseness of the names of the
25 * structure members and the variables used by the functions that
26 * access them. Yes, yes, I know: readability. I contend that once
27 * the naming convention is embraced, the names become more readable
28 * than any verbose alternative, and their brevity and uniformity do
29 * more to augment readability than longVariableNames ever could.
31 * Members and variables are named XY. X determines the type of
32 * structure to which the variable refers. Y determines the usage of
35 * The Xs are as documented by struct s_file:
37 * f File (struct s_file)
38 * m Material (struct s_mtrl)
39 * v Vertex (struct s_vert)
40 * e Edge (struct s_edge)
41 * s Side (struct s_side)
42 * t Texture coord (struct s_texc)
43 * g Geometry (struct s_geom)
44 * l Lump (struct s_lump)
45 * n Node (struct s_node)
46 * p Path (struct s_path)
47 * b Body (struct s_body)
48 * c Coin (struct s_coin)
49 * z Goal (struct s_goal)
50 * j Jump (struct s_jump)
51 * x Switch (struct s_swch)
52 * r Billboard (struct s_bill)
53 * u User (struct s_ball)
54 * w Viewpoint (struct s_view)
55 * d Dictionary (struct s_dict)
59 * The Ys are as follows:
64 * 0 Index of the first
69 * Thus "up" is a pointer to a user structure. "lc" is the number of
70 * lumps. "ei" and "ej" are edge indices into some "ev" edge vector.
71 * An edge is defined by two vertices, so an edge structure consists
72 * of "vi" and "vj". And so on.
74 * Those members that do not conform to this convention are explicitly
75 * documented with a comment.
77 * These prefixes are still available: h k o q y.
80 /*---------------------------------------------------------------------------*/
82 /* Material type flags */
85 #define M_TRANSPARENT 2
86 #define M_REFLECTIVE 4
87 #define M_ENVIRONMENT 8
90 #define M_SHADOWED (M_OPAQUE | M_REFLECTIVE | M_ENVIRONMENT)
92 /* Billboard types. */
102 /*---------------------------------------------------------------------------*/
106 float a[4]; /* ambient color */
107 float d[4]; /* diffuse color */
108 float s[4]; /* specular color */
109 float e[4]; /* emission color */
110 float h[1]; /* specular exponent */
112 int fl; /* material flags */
114 GLuint o; /* OpenGL texture object */
115 char f[PATHMAX]; /* texture file name */
120 float p[3]; /* vertex position */
131 float n[3]; /* plane normal vector */
132 float d; /* distance from origin */
137 float u[2]; /* texture coordinate */
150 int fl; /* lump flags */
168 float p[3]; /* starting position */
169 float t; /* travel time */
172 int f; /* enable flag */
177 float t; /* time on current path */
179 GLuint ol; /* opaque geometry list */
180 GLuint tl; /* transparent geometry list */
181 GLuint rl; /* reflective geometry list */
182 GLuint sl; /* shadowed geometry list */
194 float p[3]; /* position */
200 float p[3]; /* position */
201 float r; /* radius */
206 float p[3]; /* position */
207 float r; /* radius */
210 float t0; /* default timer */
211 float t; /* current timer */
212 int f0; /* default state */
213 int f; /* current state */
220 float t; /* repeat time interval */
221 float d; /* distance */
223 float w[3]; /* width coefficients */
224 float h[3]; /* height coefficients */
226 float rx[3]; /* X rotation coefficients */
227 float ry[3]; /* Y rotation coefficients */
228 float rz[3]; /* Z rotation coefficients */
233 float p[3]; /* position */
234 float q[3]; /* target position */
235 float r; /* radius */
240 float e[3][3]; /* basis of orientation */
241 float p[3]; /* position vector */
242 float v[3]; /* velocity vector */
243 float w[3]; /* angular velocity vector */
244 float r; /* radius */
303 /*---------------------------------------------------------------------------*/
305 int sol_load(struct s_file *, const char *, int, int);
306 int sol_stor(struct s_file *, const char *);
307 void sol_free(struct s_file *);
309 void sol_back(const struct s_file *, float, float, float);
310 void sol_refl(const struct s_file *);
311 void sol_draw(const struct s_file *);
312 void sol_shad(const struct s_file *);
314 float sol_step(struct s_file *, const float *, float, int, int *);
316 int sol_coin_test(struct s_file *, float *, float);
317 int sol_goal_test(struct s_file *, float *, int);
318 int sol_jump_test(struct s_file *, float *, int);
319 int sol_swch_test(struct s_file *, int, int);
321 /*---------------------------------------------------------------------------*/
323 void put_file_state(FILE *, struct s_file *);
324 void get_file_state(FILE *, struct s_file *);
326 /*---------------------------------------------------------------------------*/