Enable global structs for mine saving functions
[btb/d2x.git] / main / segment.h
1 /* $Id: segment.h,v 1.5 2004-08-28 23:17:45 schaffner Exp $ */
2 /*
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.
13 */
14
15 /*
16  *
17  * Include file for functions which need to access segment data structure.
18  *
19  */
20
21 #ifndef _SEGMENT_H
22 #define _SEGMENT_H
23
24 #include "pstypes.h"
25 #include "fix.h"
26 #include "vecmat.h"
27 //#include "3d.h"
28 //#include "inferno.h"
29 #include "cfile.h"
30
31 // Version 1 - Initial version
32 // Version 2 - Mike changed some shorts to bytes in segments, so incompatible!
33
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
37
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
42 #define WLEFT                       0
43 #define WTOP                        1
44 #define WRIGHT                      2
45 #define WBOTTOM                     3
46 #define WBACK                       4
47 #define WFRONT                      5
48
49 #if defined(SHAREWARE)
50 # define MAX_SEGMENTS           800
51 # define MAX_SEGMENT_VERTICES   2800
52 #else
53 # define MAX_SEGMENTS           900
54 # define MAX_SEGMENT_VERTICES   3600
55 #endif
56
57 //normal everyday vertices
58
59 #define DEFAULT_LIGHTING        0   // (F1_0/2)
60
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)
65 #else           //No editor
66 # define MAX_VERTICES           (MAX_SEGMENT_VERTICES)
67 #endif
68
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)
72
73 //Structure for storing u,v,light values.
74 //NOTE: this structure should be the same as the one in 3d.h
75 typedef struct uvl {
76         fix u, v, l;
77 } uvl;
78
79 #ifdef COMPACT_SEGS
80 typedef struct side {
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
83         short   wall_num;
84         short   tmap_num;
85         short   tmap_num2;
86         uvl     uvls[4];
87         //vms_vector normals[2];  // 2 normals, if quadrilateral, both the same.
88 } side;
89 #else
90 typedef struct side {
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
93         short   wall_num;
94         short   tmap_num;
95         short   tmap_num2;
96         uvl     uvls[4];
97         vms_vector normals[2];  // 2 normals, if quadrilateral, both the same.
98 } side;
99 #endif
100
101 typedef struct segment {
102 #ifdef EDITOR
103         short   segnum;     // segment number, not sure what it means
104 #endif
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
108 #ifdef EDITOR
109         short   group;      // group number to which the segment belongs.
110         short   objects;    // pointer to objects in this segment
111 #else
112         int     objects;    // pointer to objects in this segment
113 #endif
114
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.
118         //short   value;
119         //fix     static_light; //average static light in segment
120         //#ifndef EDITOR
121         //short   pad;        //make structure longword aligned
122         //#endif
123 } segment;
124
125 #define S2F_AMBIENT_WATER   0x01
126 #define S2F_AMBIENT_LAVA    0x02
127
128 typedef struct segment2 {
129         ubyte   special;
130         sbyte   matcen_num;
131         sbyte   value;
132         ubyte   s2_flags;
133         fix     static_light;
134 } segment2;
135
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
145
146 #ifdef COMPACT_SEGS
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 );
149 #endif
150
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.
155
156 #define SS_REPAIR_CENTER    0x01    // Bitmask for this segment being part of repair center.
157
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;
162
163 typedef struct {
164         int     num_segments;
165         int     num_vertices;
166         short   segments[MAX_SEGMENTS];
167         short   vertices[MAX_VERTICES];
168 } group;
169
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;
176
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.
180
181 #define SEG_PTR_2_NUM(segptr) (Assert((unsigned) (segptr-Segments)<MAX_SEGMENTS),(segptr)-Segments)
182
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
185 typedef struct {
186         short   segnum;
187         sbyte   sidenum;
188         sbyte   dummy;
189         ubyte   vert_light[4];
190 } delta_light;
191
192 // Light at segnum:sidenum casts light on count sides beginning at index (in array Delta_lights)
193 typedef struct {
194         short   segnum;
195         sbyte   sidenum;
196         sbyte   count;
197         short   index;
198 } dl_index;
199
200 #define MAX_DL_INDICES      500
201 #define MAX_DELTA_LIGHTS    10000
202
203 #define DL_SCALE            2048    // Divide light to allow 3 bits integer, 5 bits fraction.
204
205 extern dl_index     Dl_indices[MAX_DL_INDICES];
206 extern delta_light  Delta_lights[MAX_DELTA_LIGHTS];
207 extern int          Num_static_lights;
208
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);
213
214 extern ubyte Light_subtracted[MAX_SEGMENTS];
215
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!
222
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);
226
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);
230
231 // Set *nf = number of faces in segment s.
232 extern void med_get_num_faces(segment *s,int *nf);
233
234 void med_validate_segment_side(segment *sp,int side);
235
236 // Delete segment function added for curves.c
237 extern int med_delete_segment(segment *sp);
238
239 // Delete segment from group
240 extern void delete_segment_from_group(int segment_num, int group_num);
241
242 // Add segment to group
243 extern void add_segment_to_group(int segment_num, int group_num);
244
245 // Verify that all vertices are legal.
246 extern void med_check_all_vertices();
247
248 #ifdef FAST_FILE_IO
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)
252 #else
253 /*
254  * reads a segment2 structure from a CFILE
255  */
256 void segment2_read(segment2 *s2, CFILE *fp);
257
258 /*
259  * reads a delta_light structure from a CFILE
260  */
261 void delta_light_read(delta_light *dl, CFILE *fp);
262
263 /*
264  * reads a dl_index structure from a CFILE
265  */
266 void dl_index_read(dl_index *di, CFILE *fp);
267 #endif
268
269 #endif