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