2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
16 * Include file for functions which need to access segment data structure.
27 //#include "inferno.h"
30 // Version 1 - Initial version
31 // Version 2 - Mike changed some shorts to bytes in segments, so incompatible!
33 #define SIDE_IS_QUAD 1 // render side as quadrilateral
34 #define SIDE_IS_TRI_02 2 // render side as two triangles, triangulated along edge from 0 to 2
35 #define SIDE_IS_TRI_13 3 // render side as two triangles, triangulated along edge from 1 to 3
37 // Set maximum values for segment and face data structures.
38 #define MAX_VERTICES_PER_SEGMENT 8
39 #define MAX_SIDES_PER_SEGMENT 6
40 #define MAX_VERTICES_PER_POLY 4
48 #if defined(SHAREWARE)
49 # define MAX_SEGMENTS 800
50 # define MAX_SEGMENT_VERTICES 2800
52 # define MAX_SEGMENTS 900
53 # define MAX_SEGMENT_VERTICES 3600
56 //normal everyday vertices
58 #define DEFAULT_LIGHTING 0 // (F1_0/2)
60 #ifdef EDITOR //verts for the new segment
61 # define NUM_NEW_SEG_VERTICES 8
62 # define NEW_SEGMENT_VERTICES (MAX_SEGMENT_VERTICES)
63 # define MAX_VERTICES (MAX_SEGMENT_VERTICES+NUM_NEW_SEG_VERTICES)
65 # define MAX_VERTICES (MAX_SEGMENT_VERTICES)
68 // Returns true if segnum references a child, else returns false.
69 // Note that -1 means no connection, -2 means a connection to the outside world.
70 #define IS_CHILD(segnum) (segnum > -1)
72 //Structure for storing u,v,light values.
73 //NOTE: this structure should be the same as the one in 3d.h
80 sbyte type; // replaces num_faces and tri_edge, 1 = quad, 2 = 0:2 triangulation, 3 = 1:3 triangulation
81 ubyte pad; //keep us longword alligned
86 //vms_vector normals[2]; // 2 normals, if quadrilateral, both the same.
90 sbyte type; // replaces num_faces and tri_edge, 1 = quad, 2 = 0:2 triangulation, 3 = 1:3 triangulation
91 ubyte pad; //keep us longword alligned
96 vms_vector normals[2]; // 2 normals, if quadrilateral, both the same.
100 typedef struct segment {
102 short segnum; // segment number, not sure what it means
104 side sides[MAX_SIDES_PER_SEGMENT]; // 6 sides
105 short children[MAX_SIDES_PER_SEGMENT]; // indices of 6 children segments, front, left, top, right, bottom, back
106 short verts[MAX_VERTICES_PER_SEGMENT]; // vertex ids of 4 front and 4 back vertices
108 short group; // group number to which the segment belongs.
109 short objects; // pointer to objects in this segment
111 int objects; // pointer to objects in this segment
114 // -- Moved to segment2 to make this struct 512 bytes long --
115 //ubyte special; // what type of center this is
116 //sbyte matcen_num; // which center segment is associated with.
118 //fix static_light; //average static light in segment
120 //short pad; //make structure longword aligned
124 #define S2F_AMBIENT_WATER 0x01
125 #define S2F_AMBIENT_LAVA 0x02
127 typedef struct segment2 {
135 //values for special field
136 #define SEGMENT_IS_NOTHING 0
137 #define SEGMENT_IS_FUELCEN 1
138 #define SEGMENT_IS_REPAIRCEN 2
139 #define SEGMENT_IS_CONTROLCEN 3
140 #define SEGMENT_IS_ROBOTMAKER 4
141 #define SEGMENT_IS_GOAL_BLUE 5
142 #define SEGMENT_IS_GOAL_RED 6
143 #define MAX_CENTER_TYPES 7
146 extern void get_side_normal(segment *sp, int sidenum, int normal_num, vms_vector * vm );
147 extern void get_side_normals(segment *sp, int sidenum, vms_vector * vm1, vms_vector *vm2 );
150 // Local segment data.
151 // This is stuff specific to a segment that does not need to get
152 // written to disk. This is a handy separation because we can add to
153 // this structure without obsoleting existing data on disk.
155 #define SS_REPAIR_CENTER 0x01 // Bitmask for this segment being part of repair center.
157 //--repair-- typedef struct {
158 //--repair-- int special_type;
159 //--repair-- short special_segment; // if special_type indicates repair center, this is the base of the repair center
160 //--repair-- } lsegment;
165 short segments[MAX_SEGMENTS];
166 short vertices[MAX_VERTICES];
169 // Globals from mglobal.c
170 extern vms_vector Vertices[];
171 extern segment Segments[];
172 extern segment2 Segment2s[];
173 extern int Num_segments;
174 extern int Num_vertices;
175 #define SEGMENT_NUMBER(seg) ((int)((seg) - Segments))
177 // Get pointer to the segment2 for the given segment pointer
178 #define s2s2(segp) (&Segment2s[SEGMENT_NUMBER(segp)])
180 extern sbyte Side_to_verts[MAX_SIDES_PER_SEGMENT][4]; // Side_to_verts[my_side] is list of vertices forming side my_side.
181 extern int Side_to_verts_int[MAX_SIDES_PER_SEGMENT][4]; // Side_to_verts[my_side] is list of vertices forming side my_side.
182 extern char Side_opposite[]; // Side_opposite[my_side] returns side opposite cube from my_side.
184 #define SEG_PTR_2_NUM(segptr) (Assert( (unsigned)SEGMENT_NUMBER(segptr) < MAX_SEGMENTS ), SEGMENT_NUMBER(segptr))
186 // New stuff, 10/14/95: For shooting out lights and monitors.
187 // Light cast upon vert_light vertices in segnum:sidenum by some light
195 // Light at segnum:sidenum casts light on count sides beginning at index (in array Delta_lights)
203 #define MAX_DL_INDICES 500
204 #define MAX_DELTA_LIGHTS 10000
206 #define DL_SCALE 2048 // Divide light to allow 3 bits integer, 5 bits fraction.
208 extern dl_index Dl_indices[MAX_DL_INDICES];
209 extern delta_light Delta_lights[MAX_DELTA_LIGHTS];
210 extern int Num_static_lights;
212 extern int subtract_light(int segnum, int sidenum);
213 extern int add_light(int segnum, int sidenum);
214 extern void restore_all_lights_in_mine(void);
215 extern void clear_light_subtracted(void);
217 extern ubyte Light_subtracted[MAX_SEGMENTS];
219 // ----------------------------------------------------------------------------
220 // --------------------- Segment interrogation functions ----------------------
221 // Do NOT read the segment data structure directly. Use these
222 // functions instead. The segment data structure is GUARANTEED to
223 // change MANY TIMES. If you read the segment data structure
224 // directly, your code will break, I PROMISE IT!
226 // Return a pointer to the list of vertex indices for the current
227 // segment in vp and the number of vertices in *nv.
228 extern void med_get_vertex_list(segment *s,int *nv,short **vp);
230 // Return a pointer to the list of vertex indices for face facenum in
231 // vp and the number of vertices in *nv.
232 extern void med_get_face_vertex_list(segment *s,int side, int facenum,int *nv,short **vp);
234 // Set *nf = number of faces in segment s.
235 extern void med_get_num_faces(segment *s,int *nf);
237 void med_validate_segment_side(segment *sp,int side);
239 // Delete segment function added for curves.c
240 extern int med_delete_segment(segment *sp);
242 // Delete segment from group
243 extern void delete_segment_from_group(int segment_num, int group_num);
245 // Add segment to group
246 extern void add_segment_to_group(int segment_num, int group_num);
248 // Verify that all vertices are legal.
249 extern void med_check_all_vertices(void);
252 #define segment2_read(s2, fp) cfread(s2, sizeof(segment2), 1, fp)
253 #define delta_light_read(dl, fp) cfread(dl, sizeof(delta_light), 1, fp)
254 #define dl_index_read(di, fp) cfread(di, sizeof(dl_index), 1, fp)
257 * reads a segment2 structure from a CFILE
259 void segment2_read(segment2 *s2, CFILE *fp);
262 * reads a delta_light structure from a CFILE
264 void delta_light_read(delta_light *dl, CFILE *fp);
267 * reads a dl_index structure from a CFILE
269 void dl_index_read(dl_index *di, CFILE *fp);
272 void segment2_write(segment2 *s2, PHYSFS_file *fp);
273 void delta_light_write(delta_light *dl, PHYSFS_file *fp);
274 void dl_index_write(dl_index *di, PHYSFS_file *fp);