]> icculus.org git repositories - btb/d2x.git/blob - main/editor/medsel.c
imported missing editor files from d1x
[btb/d2x.git] / main / editor / medsel.c
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-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13 /*
14  * $Source: /cvs/cvsroot/d2x/main/editor/medsel.c,v $
15  * $Revision: 1.1 $
16  * $Author: btb $
17  * $Date: 2004-12-19 13:54:27 $
18  * 
19  * Routines stripped from med.c for segment selection
20  * 
21  * $Log: not supported by cvs2svn $
22  * Revision 1.1.1.1  1999/06/14 22:03:57  donut
23  * Import of d1x 1.37 source.
24  *
25  * Revision 2.0  1995/02/27  11:35:20  john
26  * Version 2.0! No anonymous unions, Watcom 10.0, with no need
27  * for bitmaps.tbl.
28  * 
29  * Revision 1.10  1994/08/09  16:05:59  john
30  * Added the ability to place players.  Made old
31  * Player variable be ConsoleObject.
32  * 
33  * Revision 1.9  1994/05/23  14:56:27  mike
34  * make current segment be add segment.
35  * 
36  * Revision 1.8  1994/05/14  18:00:50  matt
37  * Got rid of externs in source (non-header) files
38  * 
39  * Revision 1.7  1994/03/31  12:03:33  matt
40  * Cleaned up includes
41  * 
42  * Revision 1.6  1994/02/17  12:52:13  yuan
43  * Unbackdated
44  * y
45  * 
46  * Revision 1.4  1994/02/17  09:46:53  matt
47  * Removed include of slew.h
48  * 
49  * Revision 1.3  1994/01/05  10:54:23  john
50  * New object code by John
51  * 
52  * Revision 1.2  1993/12/17  12:18:22  john
53  * Moved selection stuff out of med.c
54  * 
55  * Revision 1.1  1993/12/17  09:29:34  john
56  * Initial revision
57  * 
58  * 
59  */
60
61
62 #ifdef RCS
63 static char rcsid[] = "$Id: medsel.c,v 1.1 2004-12-19 13:54:27 btb Exp $";
64 #endif
65
66 #include <stdio.h>
67 #include <stdlib.h>
68 #include <stdarg.h>
69 #include <string.h>
70 #ifdef __MSDOS__
71 #include <process.h>
72 #endif
73
74 #include "gr.h"
75 #include "ui.h"
76 #include "key.h"
77 #include "mono.h"
78 #include "error.h"
79 #include "u_mem.h"
80
81 #include "inferno.h"
82 #include "editor.h"
83 #include "segment.h"
84 #include "object.h"
85
86 typedef struct sort_element {
87         short segnum;
88         fix dist;
89 } sort_element;
90
91 //compare the distance of two segments.  slow, since it computes the
92 //distance each time
93 int segdist_cmp(sort_element *s0,sort_element *s1)
94 {
95         return (s0->dist==s1->dist)?0:((s0->dist<s1->dist)?-1:1);
96
97 }
98
99
100 //find the distance between a segment and a point
101 fix compute_dist(segment *seg,vms_vector *pos)
102 {
103         vms_vector delta;
104
105         compute_segment_center(&delta,seg);
106         vm_vec_sub2(&delta,pos);
107
108         return vm_vec_mag(&delta);
109
110 }
111
112 //sort a list of segments, in order of closeness to pos
113 void sort_seg_list(int n_segs,short *segnumlist,vms_vector *pos)
114 {
115         int i;
116         sort_element *sortlist;
117
118         sortlist = calloc(n_segs,sizeof(*sortlist));
119
120         for (i=0;i<n_segs;i++) {
121                 sortlist[i].segnum = segnumlist[i];
122                 sortlist[i].dist = compute_dist(&Segments[segnumlist[i]],pos);
123         }
124
125         qsort(sortlist,n_segs,sizeof(*sortlist),(int (*)(const void *, const void *))segdist_cmp);
126
127         for (i=0;i<n_segs;i++)
128                 segnumlist[i] = sortlist[i].segnum;
129
130         free(sortlist);
131 }
132
133 int SortSelectedList(void)
134 {
135         sort_seg_list(N_selected_segs,Selected_segs,&ConsoleObject->pos);
136         editor_status("%i element selected list sorted.",N_selected_segs);
137
138         return 1;
139 }
140
141 int SelectNextFoundSeg(void)
142 {
143         if (++Found_seg_index >= N_found_segs)
144                 Found_seg_index = 0;
145
146         Cursegp = &Segments[Found_segs[Found_seg_index]];
147         med_create_new_segment_from_cursegp();
148
149         Update_flags |= UF_WORLD_CHANGED;
150
151         if (Lock_view_to_cursegp)
152                 set_view_target_from_segment(Cursegp);
153
154         editor_status("Curseg assigned to next found segment.");
155
156         return 1;
157 }
158
159 int SelectPreviousFoundSeg(void)
160 {
161         if (Found_seg_index > 0)
162                 Found_seg_index--;
163         else
164                 Found_seg_index = N_found_segs-1;
165
166         Cursegp = &Segments[Found_segs[Found_seg_index]];
167         med_create_new_segment_from_cursegp();
168
169         Update_flags |= UF_WORLD_CHANGED;
170
171         if (Lock_view_to_cursegp)
172                 set_view_target_from_segment(Cursegp);
173
174         editor_status("Curseg assigned to previous found segment.");
175
176         return 1;
177 }
178