1 /* $Id: segment.h,v 1.5 2004-08-28 23:17:45 schaffner Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
17 * Include file for functions which need to access segment data structure.
28 //#include "inferno.h"
31 // Version 1 - Initial version
32 // Version 2 - Mike changed some shorts to bytes in segments, so incompatible!
34 #define SIDE_IS_QUAD 1 // render side as quadrilateral
35 #define SIDE_IS_TRI_02 2 // render side as two triangles, triangulated along edge from 0 to 2
36 #define SIDE_IS_TRI_13 3 // render side as two triangles, triangulated along edge from 1 to 3
38 // Set maximum values for segment and face data structures.
39 #define MAX_VERTICES_PER_SEGMENT 8
40 #define MAX_SIDES_PER_SEGMENT 6
41 #define MAX_VERTICES_PER_POLY 4
49 #if defined(SHAREWARE)
50 # define MAX_SEGMENTS 800
51 # define MAX_SEGMENT_VERTICES 2800
53 # define MAX_SEGMENTS 900
54 # define MAX_SEGMENT_VERTICES 3600
57 //normal everyday vertices
59 #define DEFAULT_LIGHTING 0 // (F1_0/2)
61 #ifdef EDITOR //verts for the new segment
62 # define NUM_NEW_SEG_VERTICES 8
63 # define NEW_SEGMENT_VERTICES (MAX_SEGMENT_VERTICES)
64 # define MAX_VERTICES (MAX_SEGMENT_VERTICES+NUM_NEW_SEG_VERTICES)
66 # define MAX_VERTICES (MAX_SEGMENT_VERTICES)
69 // Returns true if segnum references a child, else returns false.
70 // Note that -1 means no connection, -2 means a connection to the outside world.
71 #define IS_CHILD(segnum) (segnum > -1)
73 //Structure for storing u,v,light values.
74 //NOTE: this structure should be the same as the one in 3d.h
81 sbyte type; // replaces num_faces and tri_edge, 1 = quad, 2 = 0:2 triangulation, 3 = 1:3 triangulation
82 ubyte pad; //keep us longword alligned
87 //vms_vector normals[2]; // 2 normals, if quadrilateral, both the same.
91 sbyte type; // replaces num_faces and tri_edge, 1 = quad, 2 = 0:2 triangulation, 3 = 1:3 triangulation
92 ubyte pad; //keep us longword alligned
97 vms_vector normals[2]; // 2 normals, if quadrilateral, both the same.
101 typedef struct segment {
103 short segnum; // segment number, not sure what it means
105 side sides[MAX_SIDES_PER_SEGMENT]; // 6 sides
106 short children[MAX_SIDES_PER_SEGMENT]; // indices of 6 children segments, front, left, top, right, bottom, back
107 short verts[MAX_VERTICES_PER_SEGMENT]; // vertex ids of 4 front and 4 back vertices
109 short group; // group number to which the segment belongs.
110 short objects; // pointer to objects in this segment
112 int objects; // pointer to objects in this segment
115 // -- Moved to segment2 to make this struct 512 bytes long --
116 //ubyte special; // what type of center this is
117 //sbyte matcen_num; // which center segment is associated with.
119 //fix static_light; //average static light in segment
121 //short pad; //make structure longword aligned
125 #define S2F_AMBIENT_WATER 0x01
126 #define S2F_AMBIENT_LAVA 0x02
128 typedef struct segment2 {
136 //values for special field
137 #define SEGMENT_IS_NOTHING 0
138 #define SEGMENT_IS_FUELCEN 1
139 #define SEGMENT_IS_REPAIRCEN 2
140 #define SEGMENT_IS_CONTROLCEN 3
141 #define SEGMENT_IS_ROBOTMAKER 4
142 #define SEGMENT_IS_GOAL_BLUE 5
143 #define SEGMENT_IS_GOAL_RED 6
144 #define MAX_CENTER_TYPES 7
147 extern void get_side_normal(segment *sp, int sidenum, int normal_num, vms_vector * vm );
148 extern void get_side_normals(segment *sp, int sidenum, vms_vector * vm1, vms_vector *vm2 );
151 // Local segment data.
152 // This is stuff specific to a segment that does not need to get
153 // written to disk. This is a handy separation because we can add to
154 // this structure without obsoleting existing data on disk.
156 #define SS_REPAIR_CENTER 0x01 // Bitmask for this segment being part of repair center.
158 //--repair-- typedef struct {
159 //--repair-- int special_type;
160 //--repair-- short special_segment; // if special_type indicates repair center, this is the base of the repair center
161 //--repair-- } lsegment;
166 short segments[MAX_SEGMENTS];
167 short vertices[MAX_VERTICES];
170 // Globals from mglobal.c
171 extern vms_vector Vertices[];
172 extern segment Segments[];
173 extern segment2 Segment2s[];
174 extern int Num_segments;
175 extern int Num_vertices;
177 extern sbyte Side_to_verts[MAX_SIDES_PER_SEGMENT][4]; // Side_to_verts[my_side] is list of vertices forming side my_side.
178 extern int Side_to_verts_int[MAX_SIDES_PER_SEGMENT][4]; // Side_to_verts[my_side] is list of vertices forming side my_side.
179 extern char Side_opposite[]; // Side_opposite[my_side] returns side opposite cube from my_side.
181 #define SEG_PTR_2_NUM(segptr) (Assert((unsigned) (segptr-Segments)<MAX_SEGMENTS),(segptr)-Segments)
183 // New stuff, 10/14/95: For shooting out lights and monitors.
184 // Light cast upon vert_light vertices in segnum:sidenum by some light
192 // Light at segnum:sidenum casts light on count sides beginning at index (in array Delta_lights)
200 #define MAX_DL_INDICES 500
201 #define MAX_DELTA_LIGHTS 10000
203 #define DL_SCALE 2048 // Divide light to allow 3 bits integer, 5 bits fraction.
205 extern dl_index Dl_indices[MAX_DL_INDICES];
206 extern delta_light Delta_lights[MAX_DELTA_LIGHTS];
207 extern int Num_static_lights;
209 extern int subtract_light(int segnum, int sidenum);
210 extern int add_light(int segnum, int sidenum);
211 extern void restore_all_lights_in_mine(void);
212 extern void clear_light_subtracted(void);
214 extern ubyte Light_subtracted[MAX_SEGMENTS];
216 // ----------------------------------------------------------------------------
217 // --------------------- Segment interrogation functions ----------------------
218 // Do NOT read the segment data structure directly. Use these
219 // functions instead. The segment data structure is GUARANTEED to
220 // change MANY TIMES. If you read the segment data structure
221 // directly, your code will break, I PROMISE IT!
223 // Return a pointer to the list of vertex indices for the current
224 // segment in vp and the number of vertices in *nv.
225 extern void med_get_vertex_list(segment *s,int *nv,short **vp);
227 // Return a pointer to the list of vertex indices for face facenum in
228 // vp and the number of vertices in *nv.
229 extern void med_get_face_vertex_list(segment *s,int side, int facenum,int *nv,short **vp);
231 // Set *nf = number of faces in segment s.
232 extern void med_get_num_faces(segment *s,int *nf);
234 void med_validate_segment_side(segment *sp,int side);
236 // Delete segment function added for curves.c
237 extern int med_delete_segment(segment *sp);
239 // Delete segment from group
240 extern void delete_segment_from_group(int segment_num, int group_num);
242 // Add segment to group
243 extern void add_segment_to_group(int segment_num, int group_num);
245 // Verify that all vertices are legal.
246 extern void med_check_all_vertices();
249 #define segment2_read(s2, fp) cfread(s2, sizeof(segment2), 1, fp)
250 #define delta_light_read(dl, fp) cfread(dl, sizeof(delta_light), 1, fp)
251 #define dl_index_read(di, fp) cfread(di, sizeof(dl_index), 1, fp)
254 * reads a segment2 structure from a CFILE
256 void segment2_read(segment2 *s2, CFILE *fp);
259 * reads a delta_light structure from a CFILE
261 void delta_light_read(delta_light *dl, CFILE *fp);
264 * reads a dl_index structure from a CFILE
266 void dl_index_read(dl_index *di, CFILE *fp);