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