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