]> icculus.org git repositories - btb/d2x.git/blob - main/editor/editor.h
use the orientation parameter of g3_draw_bitmap
[btb/d2x.git] / main / editor / editor.h
1 /*
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.
12 */
13
14 /*
15  *
16  * FIXME: put description here
17  *
18  */
19
20 #ifndef _EDITOR_H
21 #define _EDITOR_H
22
23 #include "maths.h"
24 #include "inferno.h"
25 #include "gr.h"
26 #include "ui.h"
27
28 /*
29  * Constants
30  *
31  */
32
33 #define ORTHO_VIEWS 0                   // set to 1 to enable 3 orthogonal views
34 #define ED_SCREEN_W     800             //width of editor screen
35 #define ED_SCREEN_H     600             //height of editor screen
36
37 #define MENUBAR_H               16
38
39 #define GAMEVIEW_X      1               //where the 320x200 game window goes
40 #define GAMEVIEW_Y      1+MENUBAR_H
41 #define GAMEVIEW_W      320
42 #define GAMEVIEW_H      200
43
44 #define STATUS_X        0
45 #define STATUS_H        18
46 #define STATUS_Y        (ED_SCREEN_H-STATUS_H)
47 #define STATUS_W        ED_SCREEN_W
48
49 #define LVIEW_X 1                       //large view
50 #define LVIEW_Y (GAMEVIEW_Y+GAMEVIEW_H+2)
51 #define LVIEW_W 447
52 #define LVIEW_H (STATUS_Y-LVIEW_Y-2)
53
54 #define TMAPBOX_X       (LVIEW_X+LVIEW_W+4)     //location of first one
55 #define TMAPBOX_Y       (LVIEW_Y+2)
56 #define TMAPBOX_W       64
57 #define TMAPBOX_H       64
58
59 #define TMAPCURBOX_X (TMAPBOX_X + 4*(TMAPBOX_W + 3))
60 #define TMAPCURBOX_Y (TMAPBOX_Y + TMAPBOX_H)
61
62 #define OBJCURBOX_X (TMAPCURBOX_X)
63 #define OBJCURBOX_Y (TMAPCURBOX_Y + 3*(TMAPBOX_H + 2) -40)
64
65 #define PAD_X (GAMEVIEW_X + GAMEVIEW_W + 16)
66 #define PAD_Y (GAMEVIEW_Y + 4)
67
68 #define SMALLVIEW_W     173             //width of small view windows
69 #define SMALLVIEW_H     148             //height of small view windows
70
71 #define TVIEW_X (LVIEW_X+LVIEW_W+2)             //top view
72 #define TVIEW_Y LVIEW_Y
73 #define TVIEW_W SMALLVIEW_W
74 #define TVIEW_H SMALLVIEW_H
75
76 #define FVIEW_X TVIEW_X                                         //front view
77 #define FVIEW_Y (TVIEW_Y+SMALLVIEW_H+2)
78 #define FVIEW_W SMALLVIEW_W
79 #define FVIEW_H SMALLVIEW_H
80
81 #define RVIEW_X (TVIEW_X+SMALLVIEW_W+2) //right view
82 #define RVIEW_Y FVIEW_Y 
83 #define RVIEW_W SMALLVIEW_W
84 #define RVIEW_H SMALLVIEW_H
85
86 #define GVIEW_X RVIEW_X                                         //group view
87 #define GVIEW_Y TVIEW_Y 
88 #define GVIEW_W SMALLVIEW_W
89 #define GVIEW_H SMALLVIEW_H
90
91 //there were color constants here, but I moved them to meddraw.c - Matt
92
93 #define SEGMOVE_PAD_ID          0
94 #define SEGSIZE_PAD_ID          1
95 #define CURVE_PAD_ID            2       
96 #define TEXTURE_PAD_ID          3
97 #define OBJECT_PAD_ID           4
98 #define OBJMOV_PAD_ID           5
99 #define GROUP_PAD_ID            6
100 #define LIGHTING_PAD_ID 7
101 #define TEST_PAD_ID                     8
102 #define MAX_PAD_ID                      8
103
104 /*
105  * Strucures
106  * 
107  */
108
109 #define VF_ANGLES 0
110 #define VF_MATRIX 1
111
112 // Default size of a segment
113 #define DEFAULT_X_SIZE          F1_0*20
114 #define DEFAULT_Y_SIZE          F1_0*20
115 #define DEFAULT_Z_SIZE          F1_0*20
116
117 //      Scale factor from 3d units (integer portion) to uv coordinates (integer portion)
118 #define VMAG    (F1_0 / (DEFAULT_X_SIZE/F1_0))
119 #define UMAG    VMAG            // unused
120
121 //      Number of segments which can be found (size of Found_segs[])
122 #define MAX_FOUND_SEGS          200
123 #define MAX_SELECTED_SEGS       (MAX_SEGMENTS)
124 #define MAX_WARNING_SEGS        (MAX_SEGMENTS)
125
126 #define MAX_GROUPS                      10
127 #define ROT_GROUP                       MAX_GROUPS
128
129 //      Modes for segment sizing
130 #define SEGSIZEMODE_FREE                1
131 #define SEGSIZEMODE_ALL                 2
132 #define SEGSIZEMODE_CURSIDE     3
133 #define SEGSIZEMODE_EDGE                4
134 #define SEGSIZEMODE_VERTEX              5
135
136 #define SEGSIZEMODE_MIN                 SEGSIZEMODE_FREE
137 #define SEGSIZEMODE_MAX                 SEGSIZEMODE_VERTEX
138
139 //defines a view for an editor window
140 typedef struct editor_view {
141         short ev_num;                           //each view has it's own number
142         short ev_changed;                       //set to true if view changed
143         grs_canvas *ev_canv;            //points to this window's canvas
144         fix ev_dist;                            //the distance from the view point
145         vms_matrix ev_matrix;   //the view matrix
146         fix ev_zoom;                            //zoom for this window
147 } editor_view;
148
149
150 #include "centers.h"
151 #include "ehostage.h"
152 #include "eobject.h"
153 #include "eswitch.h"
154 #include "info.h"
155 #include "kdefs.h"
156 #include "kfuncs.h"
157 #include "macro.h"
158 #include "meddraw.h"
159 #ifdef INCLUDE_XLISP
160 #include "medlisp.h"
161 #endif
162 #include "medmisc.h"
163 #include "medrobot.h"
164 #include "medsel.h"
165 #include "medwall.h"
166 #include "objpage.h"
167 #include "seguvs.h"
168 #include "texpage.h"
169
170
171 /*
172  * Global variables
173  * 
174  */
175
176 extern editor_view *Views[];
177 extern int N_views;
178 extern grs_canvas *canv_offscreen;              //for off-screen rendering
179 extern int Large_view_index;
180 extern UI_GADGET_USERBOX * LargeViewBox;
181 extern int Found_seg_index;                             // Index in Found_segs corresponding to Cursegp
182 extern int gamestate_not_restored;
183
184
185 extern  segment  *Cursegp;                              // Pointer to current segment in the mine, the one to which things happen.
186 #define Curseg2p s2s2(Cursegp)          // Pointer to segment2 for Cursegp
187
188 extern  vms_vector Ed_view_target;              // what editor is looking at
189
190 // -- extern    segment  New_segment;                   // The segment which can be added to the mine.
191 #define New_segment     (Segments[MAX_SEGMENTS-1])
192
193 extern  int             Curside;                                        // Side index in 0..MAX_SIDES_PER_SEGMENT of active side.
194 extern  int             Curedge;                                        //      Current edge on current side, in 0..3
195 extern  int             Curvert;                                        //      Current vertex on current side, in 0..3
196 extern  int             AttachSide;                             //      Side on segment to attach
197 extern  int             Draw_all_segments;      // Set to 1 means draw_world draws all segments in Segments, else draw only connected segments
198 extern  segment *Markedsegp;                    // Marked segment, used in conjunction with *Cursegp to form joints.
199 extern  int             Markedside;                             // Marked side on Markedsegp.
200 extern  sbyte   Vertex_active[MAX_VERTICES]; // !0 means vertex is in use, 0 means not in use.
201
202 extern  grs_canvas *Pad_text_canvas;            // Keypad text
203
204 // The extra group in the following arrays is used for group rotation.
205 extern  group           GroupList[MAX_GROUPS+1];
206 extern  segment  *Groupsegp[MAX_GROUPS+1];
207 extern  int             Groupside[MAX_GROUPS+1];
208 extern  int             current_group;
209 extern  int             num_groups; 
210 extern  int             Current_group;
211
212 extern  short           Found_segs[];                   // List of segment numbers "found" under cursor click
213 extern  int             N_found_segs;                   // Number of segments found at Found_segs
214
215 extern  int             N_selected_segs;                // Number of segments found at Selected_segs
216 extern  short           Selected_segs[];                // List of segment numbers currently selected
217
218 extern  int             N_warning_segs;         // Number of segments warning-worthy, such as a concave segment
219 extern  short           Warning_segs[];         // List of warning-worthy segments
220
221 extern  int             Show_axes_flag;         // 0 = don't show, !0 = do show coordinate axes in *Cursegp orientation
222
223 extern   int            Autosave_count;         // Current counter for which autosave mine we are "on"
224 extern  int             Autosave_flag;                  // Whether or not Autosave is on.
225 extern  struct tm Editor_time_of_day;
226
227 extern  int             SegSizeMode;                    // Mode = 0/1 = not/is legal to move bound vertices, 
228
229 void init_editor(void);
230 void editor(void);
231 void close_editor(void);
232 void init_editor_screen(void);
233
234 //      Returns true if vertex vi is contained in exactly one segment, else returns false.
235 extern int is_free_vertex(int vi);
236
237 //      Set existing vertex vnum to value *vp.
238 extern  int med_set_vertex(int vnum,vms_vector *vp);
239
240 extern void med_combine_duplicate_vertices(sbyte *vlp);
241
242 // Attach side newside of newseg to side destside of destseg.
243 // Copies *newseg into global array Segments, increments Num_segments.
244 // Forms a weld between the two segments by making the new segment fit to the old segment.
245 // Updates number of faces per side if necessitated by new vertex coordinates.
246 // Return value:
247 //  0 = successful attach
248 //  1 = No room in Segments[].
249 //  2 = No room in Vertices[].
250 extern  int med_attach_segment(segment *destseg, segment *newseg, int destside, int newside);
251
252 // Delete a segment.
253 // Deletes a segment from the global array Segments.
254 // Updates Cursegp to be the segment to which the deleted segment was connected.  If there is
255 //      more than one connected segment, the new Cursegp will be the segment with the highest index
256 //      of connection in the deleted segment (highest index = front)
257 // Return value:
258 //  0 = successful deletion
259 //  1 = unable to delete
260 extern  int med_delete_segment(segment *sp);
261
262 // Rotate the segment *seg by the pitch, bank, heading defined by *rot, destructively
263 // modifying its four free vertices in the global array Vertices.
264 // It is illegal to rotate a segment which has MAX_SIDES_PER_SEGMENT != 1.
265 // Pitch, bank, heading are about the point which is the average of the four points
266 // forming the side of connection.
267 // Return value:
268 //  0 = successful rotation
269 //  1 = MAX_SIDES_PER_SEGMENT makes rotation illegal (connected to 0 or 2+ segments)
270 //  2 = Rotation causes degeneracy, such as self-intersecting segment.
271 extern  int med_rotate_segment(segment *seg, vms_matrix *rotmat);
272 extern  int med_rotate_segment_ang(segment *seg, vms_angvec *ang);
273
274 // Scales a segment, destructively modifying vertex coordinates in global Vertices[].
275 //      Uses scale factor in sp->scale.
276 //      Modifies only free vertices (those which are not part of a segment other than *sp).
277 // The vector *svp contains the x,y,z scale factors.  The x,y,z directions are relative
278 // to the segment.  x scales in the dimension of the right vector, y of the up vector, z of the forward vector.
279 // The dimension of the vectors is determined by averaging appropriate sets of 4 of the 8 points.
280 extern void med_scale_segment(segment *sp);
281
282 // Loads mine *name from disk, updating global variables:
283 //    Segments, Vertices
284 //    Num_segments,Num_vertices
285 //    Cursegp = pointer to active segment.  Written as an index in med_save_mine, converted to a pointer
286 //              at load time.
287 // Returns:
288 //  0 = successfully loaded.
289 //  1 = unable to load.
290 extern  int med_load_mine(char *name);
291
292 // Loads game *name from disk.
293 // This function automatically loads mine with name.MIN 
294 extern  int med_load_game(char *name);
295
296
297 // Loads a previous generation mine.  Needs to be updated in code. 
298 extern  int med_load_pmine(char *name);
299
300 // Saves mine contained in Segments[] and Vertices[].
301 // Num_segments = number of segments in mine.
302 // Num_vertices = number of vertices in mine.
303 // Cursegp = current segment.
304 // Saves Num_segments, and index of current segment (which is Cursegp - Segments), which will be converted to a pointer
305 // and written to Cursegp in med_load_mine.
306 // Returns:
307 //  0 = successfully saved.
308 //  1 = unable to save.
309 extern  int med_save_mine(char *name);
310
311 // Loads group *filename from disk.
312 //      Adds group to global Segments and Vertices array.
313 //      Returns:
314 //       0 = successfully loaded.
315 //       1 = unable to load.
316 extern  int med_load_group( char *filename, short *vertex_ids, short *segment_ids, int *num_vertices, int *num_segments);
317
318 // Saves group *filename from disk.
319 //      Saves group defined by vertex_ids and segment_ids to disk. 
320 //      Returns:
321 //       0 = successfully saved.
322 //       1 = unable to save.
323 extern  int med_save_group( char *filename, short *vertex_ids, short *segment_ids, int num_vertices, int num_segments);
324
325 // Updates the screen... (I put the prototype here for curves.c)
326 extern  int medlisp_update_screen(void);
327
328 // Returns 0 if no error, 1 if error, whatever that might be.
329 // Sets globals:
330 //    Num_segments
331 //    Num_vertices
332 //    Cursegp = pointer to only segment.
333 extern  int create_new_mine(void);
334
335 // extern       void med_create_segment(segment *sp, vms_vector *scale);
336 extern  void old_med_attach_segment(segment *sp,int main_side,int branch_side,fix cx, fix cy, fix cz, fix length, fix width, fix height, vms_matrix *mp);
337
338 // Copy a segment from *ssp to *dsp.  Do not simply copy the struct.  Use *dsp's vertices, copying in
339 //      just the values, not the indices.
340 extern  void med_copy_segment(segment *dsp,segment *ssp);
341
342 //      Create a default segment.
343 //      Useful for when user creates a garbage segment.
344 extern  void med_create_default_segment(segment *sp);
345
346 //      Create New_segment with sizes found in *scale.
347 extern  void med_create_new_segment(vms_vector *scale);
348
349 //      Create New_segment with sizes found in Cursegp.
350 extern void med_create_new_segment_from_cursegp(void);
351
352 //      Update New_segment using scale factors.
353 extern  void med_update_new_segment(void);
354
355 //      Replace *sp with New_segment.
356 extern  void med_update_segment(segment *sp);
357
358 //      Create a new segment and use it to form a bridge between two existing segments.
359 //      Specify two segment:side pairs.  If either segment:side is not open (ie, segment->children[side] != -1)
360 //      then it is not legal to form the brider.
361 //      Return:
362 //              0       bridge segment formed
363 //              1       unable to form bridge because one (or both) of the sides is not open.
364 //      Note that no new vertices are created by this process.
365 extern  int med_form_bridge_segment(segment *seg1, int side1, segment *seg2, int side2);
366
367 //      Compress mine at Segments and Vertices by squeezing out all holes.
368 //      If no holes (ie, an unused segment followed by a used segment), then no action.
369 //      If Cursegp or Markedsegp is a segment which gets moved to fill in a hole, then
370 //      they are properly updated.
371 extern  void med_compress_mine(void);
372
373 //      Extract the forward vector from segment *sp, return in *vp.
374 //      The forward vector is defined to be the vector from the the center of the front face of the segment
375 // to the center of the back face of the segment.
376 extern  void med_extract_forward_vector_from_segment(segment *sp,vms_vector *vp);
377
378 //      Extract the right vector from segment *sp, return in *vp.
379 //      The forward vector is defined to be the vector from the the center of the left face of the segment
380 // to the center of the right face of the segment.
381 extern  void med_extract_right_vector_from_segment(segment *sp,vms_vector *vp);
382
383 //      Extract the up vector from segment *sp, return in *vp.
384 //      The forward vector is defined to be the vector from the the center of the bottom face of the segment
385 // to the center of the top face of the segment.
386 extern  void med_extract_up_vector_from_segment(segment *sp,vms_vector *vp);
387
388 // Compute the center point of a side of a segment.
389 //      The center point is defined to be the average of the 4 points defining the side.
390 extern  void med_compute_center_point_on_side(vms_vector *vp,segment *sp,int side);
391
392 extern void     set_matrix_based_on_side(vms_matrix *rotmat,int destside);
393
394 // Given a forward vector, compute and return an angvec triple.
395 //      [ THIS SHOULD BE MOVED TO THE VECTOR MATRIX LIBRARY ]
396 extern  vms_angvec *vm_vec_to_angles(vms_angvec *result, vms_vector *forvec);
397
398
399 // Curves stuff.
400
401 #define ACCURACY 0.1*F1_0
402
403 typedef struct vms_equation {
404     union {
405             struct {fix x3, x2, x1, x0, y3, y2, y1, y0, z3, z2, z1, z0;} n;
406             fix xyz[3][4];
407     };
408 } vms_equation;
409
410 extern void create_curve(vms_vector *p1, vms_vector *p4, vms_vector *r1, vms_vector *r4, vms_equation *coeffs);
411 // Q(t) = (2t^3 - 3t^2 + 1) p1 + (-2t^3 + 3t^2) p4 + (t^3 - 2t^2 + t) r1 + (t^3 - t^2 ) r4
412
413 extern vms_vector evaluate_curve(vms_equation *coeffs, int degree, fix t);
414
415 extern fix curve_dist(vms_equation *coeffs, int degree, fix t0, vms_vector *p0, fix dist);
416
417 extern void curve_dir(vms_equation *coeffs, int degree, fix t0, vms_vector *dir);
418
419 extern void plot_parametric(vms_equation *coeffs, fix min_t, fix max_t, fix del_t);
420
421 // Curve generation routine.
422 // Returns 1 if curve is generated.
423 // Returns 0 if no curve.
424 extern int generate_curve( fix r1scale, fix r4scale );
425
426 // Deletes existing curve generated in generate_curve().
427 extern void delete_curve(void);
428
429 // --- // -- Temporary function, identical to med_rotate_segment, but it takes a vector instead of an angvec
430 // --- extern   int med_rotate_segment_vec(segment *seg, vms_vector *vec);
431
432 extern  void med_extract_matrix_from_segment(segment *sp,vms_matrix *rotmat);
433
434 //      Assign default u,v coordinates to all sides of a segment.
435 //      This routine should only be used for segments which are not connected to anything else,
436 //      ie the segment created at mine creation.
437 extern  void assign_default_uvs_to_segment(segment *segp);
438 extern  void assign_default_uvs_to_side(segment *segp, int side);
439
440 extern  void assign_default_uvs_to_side(segment *segp,int side);
441
442 //      Assign u,v coordinates to con_seg, con_common_side from base_seg, base_common_side
443 //      They are connected at the edge defined by the vertices abs_id1, abs_id2.
444 extern  void med_assign_uvs_to_side(segment *con_seg, int con_common_side, segment *base_seg, int base_common_side, int abs_id1, int abs_id2);
445
446 // Debug -- show a matrix.
447 //      type: 0 --> mprintf, 1 --> printf
448 //      *s = string to display
449 //      *mp = matrix to display
450 extern  void show_matrix(char *s,vms_matrix *mp,int type);
451
452 //      Create coordinate axes in orientation of specified segment, stores vertices at *vp.
453 extern  void create_coordinate_axes_from_segment(segment *sp,short *vertnums);
454
455 //      Scale a segment.  Then, if it is connected to something, rotate it.
456 extern  int med_scale_and_rotate_segment(segment *seg, vms_angvec *rot);
457
458 //      Set Vertex_active to number of occurrences of each vertex.
459 //      Set Num_vertices.
460 extern  void set_vertex_counts(void);
461
462 //      Modify seg2 to share side2 with seg1:side1.  This forms a connection between
463 //      two segments without creating a new segment.  It modifies seg2 by sharing
464 //      vertices from seg1.  seg1 is not modified.  Four vertices from seg2 are
465 //      deleted.
466 //      If the four vertices forming side2 in seg2 are not free, the joint is not formed.
467 //      Return code:
468 //              0                       joint formed
469 //              1                       unable to form joint because one or more vertices of side2 is not free
470 //              2                       unable to form joint because side1 is already used
471 extern  int med_form_joint(segment *seg1, int side1, segment *seg2, int side2);
472
473 // The current texture... use by saying something=bm_lock_bitmap(CurrentTexture)
474 extern int CurrentTexture;
475
476 extern void compute_segment_center(vms_vector *vp,segment *sp);
477
478 extern void med_propagate_tmaps_to_segments(segment *base_seg,segment *con_seg, int uv_only_flag);
479
480 extern void med_propagate_tmaps_to_back_side(segment *base_seg, int back_side, int uv_only_flag);
481
482 extern void med_propagate_tmaps_to_any_side(segment *base_seg, int back_side, int tmap_num, int uv_only_flag);
483
484 //      Find segment adjacent to sp:side.
485 //      Adjacent means a segment which shares all four vertices.
486 //      Return true if segment found and fill in segment in adj_sp and side in adj_side.
487 //      Return false if unable to find, in which case adj_sp and adj_side are undefined.
488 extern int med_find_adjacent_segment_side(segment *sp, int side, segment **adj_sp, int *adj_side);
489
490 // Finds the closest segment and side to sp:side.
491 extern int med_find_closest_threshold_segment_side(segment *sp, int side, segment **adj_sp, int *adj_side, fix threshold);
492
493 //      Given two segments, return the side index in the connecting segment which connects to the base segment
494 extern int find_connect_side(segment *base_seg, segment *con_seg);
495
496 // Select previous segment.
497 //      If there is a connection on the side opposite to the current side, then choose that segment.
498 // If there is no connecting segment on the opposite face, try any segment.
499 extern void get_previous_segment(int curseg_num, int curside,int *newseg_num, int *newside);
500
501 // Select next segment.
502 //      If there is a connection on the current side, then choose that segment.
503 // If there is no connecting segment on the current side, try any segment.
504 extern void get_next_segment(int curseg_num, int curside, int *newseg_num, int *newside);
505
506 //      Copy texture maps in newseg to nsp.
507 extern void copy_uvs_seg_to_seg(segment *nsp,segment *newseg);
508
509 //      Return true if segment is concave.
510 extern int check_seg_concavity(segment *s);
511
512 //      Return N_found_segs = number of concave segments in mine.
513 //      Segment ids stored at Found_segs
514 extern void find_concave_segs(void);
515
516 //      High level call.  Check for concave segments, print warning message (using editor_status)
517 //      if any concave segments.
518 //      Calls find_concave_segs, therefore N_found_segs gets set, and Found_segs filled in.
519 extern void warn_if_concave_segments(void);
520
521 //      Warn if segment s is concave.
522 extern void warn_if_concave_segment(segment *s);
523
524 //      Add a vertex to the vertex list.
525 extern int med_add_vertex(vms_vector *vp);
526
527 //      Add a vertex to the vertex list which may be identical to another vertex (in terms of coordinates).
528 //      Don't scan list, looking for presence of a vertex with same coords, add this one.
529 extern int med_create_duplicate_vertex(vms_vector *vp);
530
531 //      Create a new segment, duplicating exactly, including vertex ids and children, the passed segment.
532 extern int med_create_duplicate_segment(segment *sp);
533
534 //      Returns the index of a free segment.
535 //      Scans the Segments array.
536 extern int get_free_segment_number(void);
537
538 //      Diagnostic message.
539 extern void diagnostic_message(const char *format, ... );
540
541 //      Status Icon.
542 extern void print_status_icon( char icon[1], int position );
543 extern void clear_status_icon( char icon[1], int position );
544
545 //      Editor status message.
546 extern void editor_status(const char *format, ... );
547
548 // Variables in editor.c that the k*.c files need
549
550 #define UF_NONE             0x000       //nothing has changed
551 #define UF_WORLD_CHANGED    0x001       //something added or deleted
552 #define UF_VIEWPOINT_MOVED  0x002       //what we're watching has moved
553
554 #define UF_GAME_VIEW_CHANGED 0x004              //the game window changed    
555 #define UF_ED_STATE_CHANGED  0x008              //something like curside,curseg changed
556
557 #define UF_ALL                                  0xffffffff  //all flags
558
559 extern uint        Update_flags;
560 extern int         Funky_chase_mode;
561 extern vms_angvec  Seg_orientation;
562 extern vms_vector  Seg_scale;
563 extern int         mine_changed;
564 extern int         ModeFlag;
565 extern editor_view *current_view;
566
567 //the view for the different windows
568 extern editor_view LargeView;
569 extern editor_view TopView;
570 extern editor_view FrontView;
571 extern editor_view RightView;
572
573 extern void set_view_target_from_segment(segment *sp);
574 extern int SafetyCheck(void);
575
576 extern void editor_status( const char *format, ...);
577
578 extern int MacroNumEvents;
579 extern int MacroStatus;
580
581 //extern        int     Highest_vertex_index;                   // Highest index in Vertices and Vertex_active, an efficiency hack
582 //extern        int     Highest_segment_index;                  // Highest index in Segments, an efficiency hack
583 extern  int     Lock_view_to_cursegp;                   // !0 means whenever cursegp changes, view it
584
585 //      eglobal.c
586 extern  int     Num_tilings;                                            // number of tilings/wall
587 extern  int     Degenerate_segment_found;
588
589 extern  sbyte Been_visited[];                   // List of segments visited in a recursive search, if element n set, segment n done been visited
590
591 // Initializes autosave system.
592 // Sets global Autosave_count to 0.
593 extern void init_autosave(void);
594
595 // Closes autosave system.
596 // Deletes all autosaved files.
597 extern void close_autosave(void);
598
599 // Saves current mine to name.miX where name = suffix of mine name and X = Autosave_count.
600 // For example, if name = "cookie.min", and Autosave_count = 3, then writes "cookie.mi3".
601 // Increments Autosave_count, wrapping from 9 to 0.
602 // (If there is no current mine name, assume "temp.min")
603 // Call med_save_mine to save the mine.
604 extern void autosave_mine(char *name);
605
606 // Timed autosave
607 extern void TimedAutosave(char *name);
608 extern void set_editor_time_of_day(void);
609
610 // Undo function
611 extern int undo(void);
612 extern char mine_filename[PATH_MAX];
613 extern char undo_status[10][100];
614
615 //      group.c
616 int AttachSegmentNewAng(vms_angvec *pbh);
617 int RotateSegmentNew(vms_angvec *pbh);
618 int rotate_segment_new(vms_angvec *pbh);
619
620 //get & free vertices
621 int alloc_vert(void);
622 void free_vert(int vert_num);
623
624 // The current object type and id declared in eglobal.c
625 extern short Cur_object_type;
626 extern short Cur_object_id;
627
628 //      From med.c
629 extern int DisplayCurrentRobotType(void);
630 extern short                    Cur_object_index;
631
632 extern int render_3d_in_big_window;
633 extern void move_object_to_mouse_click(void);
634
635 //these are instances of canvases, pointed to by variables below
636 extern grs_canvas _canv_editor_game;            //the game on the editor screen
637
638 //these are pointers to our canvases
639 extern grs_canvas *Canv_editor;                 //the editor screen
640 extern grs_canvas *Canv_editor_game; //the game on the editor screen
641
642 extern grs_canvas *canv_offscreen;              //for off-screen rendering
643 extern grs_canvas *Pad_text_canvas;             // Keypad text
644
645 //where the editor is looking
646 extern vms_vector Ed_view_target;
647
648 extern int gamestate_not_restored;
649
650 extern UI_WINDOW * EditorWindow;
651
652 extern int     Large_view_index;
653
654 extern UI_GADGET_USERBOX * GameViewBox;
655 extern UI_GADGET_USERBOX * LargeViewBox;
656 extern UI_GADGET_USERBOX * GroupViewBox;
657
658 extern void med_point_2_vec(grs_canvas *canv,vms_vector *v,short sx,short sy);
659
660 //shutdown ui on the editor screen
661 void close_editor_screen(void);
662
663 // from ksegsize.c
664 extern void med_extract_up_vector_from_segment_side(segment *sp, int sidenum, vms_vector *vp);
665 extern void med_extract_right_vector_from_segment_side(segment *sp, int sidenum, vms_vector *vp);
666 extern void med_extract_forward_vector_from_segment_side(segment *sp, int sidenum, vms_vector *vp);
667
668 //      In medmisc.c
669 extern void draw_world_from_game(void);
670
671 //      In medrobot.c
672 extern void close_all_windows(void);
673
674 //      In seguvs.c
675
676 //      Amount to stretch a texture map by.
677 //      The two different ones are for the two dimensions of a texture map.
678 extern fix Stretch_scale_x, Stretch_scale_y;
679
680 #endif
681