]> icculus.org git repositories - btb/d2x.git/blob - main/editor/medsel.c
remove rcs tags
[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 /*
15  *
16  * Routines stripped from med.c for segment selection
17  *
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include "conf.h"
22 #endif
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <stdarg.h>
27 #include <string.h>
28 #ifdef __MSDOS__
29 #include <process.h>
30 #endif
31
32 #include "gr.h"
33 #include "ui.h"
34 #include "key.h"
35 #include "mono.h"
36 #include "error.h"
37 #include "u_mem.h"
38
39 #include "inferno.h"
40 #include "editor.h"
41 #include "segment.h"
42 #include "object.h"
43
44 typedef struct sort_element {
45         short segnum;
46         fix dist;
47 } sort_element;
48
49 //compare the distance of two segments.  slow, since it computes the
50 //distance each time
51 int segdist_cmp(sort_element *s0,sort_element *s1)
52 {
53         return (s0->dist==s1->dist)?0:((s0->dist<s1->dist)?-1:1);
54
55 }
56
57
58 //find the distance between a segment and a point
59 fix compute_dist(segment *seg,vms_vector *pos)
60 {
61         vms_vector delta;
62
63         compute_segment_center(&delta,seg);
64         vm_vec_sub2(&delta,pos);
65
66         return vm_vec_mag(&delta);
67
68 }
69
70 //sort a list of segments, in order of closeness to pos
71 void sort_seg_list(int n_segs,short *segnumlist,vms_vector *pos)
72 {
73         int i;
74         sort_element *sortlist;
75
76         sortlist = d_calloc(n_segs, sizeof(*sortlist));
77
78         for (i=0;i<n_segs;i++) {
79                 sortlist[i].segnum = segnumlist[i];
80                 sortlist[i].dist = compute_dist(&Segments[segnumlist[i]],pos);
81         }
82
83         qsort(sortlist,n_segs,sizeof(*sortlist),(int (*)(const void *, const void *))segdist_cmp);
84
85         for (i=0;i<n_segs;i++)
86                 segnumlist[i] = sortlist[i].segnum;
87
88         d_free(sortlist);
89 }
90
91 int SortSelectedList(void)
92 {
93         sort_seg_list(N_selected_segs,Selected_segs,&ConsoleObject->pos);
94         editor_status("%i element selected list sorted.",N_selected_segs);
95
96         return 1;
97 }
98
99 int SelectNextFoundSeg(void)
100 {
101         if (++Found_seg_index >= N_found_segs)
102                 Found_seg_index = 0;
103
104         Cursegp = &Segments[Found_segs[Found_seg_index]];
105         med_create_new_segment_from_cursegp();
106
107         Update_flags |= UF_WORLD_CHANGED;
108
109         if (Lock_view_to_cursegp)
110                 set_view_target_from_segment(Cursegp);
111
112         editor_status("Curseg assigned to next found segment.");
113
114         return 1;
115 }
116
117 int SelectPreviousFoundSeg(void)
118 {
119         if (Found_seg_index > 0)
120                 Found_seg_index--;
121         else
122                 Found_seg_index = N_found_segs-1;
123
124         Cursegp = &Segments[Found_segs[Found_seg_index]];
125         med_create_new_segment_from_cursegp();
126
127         Update_flags |= UF_WORLD_CHANGED;
128
129         if (Lock_view_to_cursegp)
130                 set_view_target_from_segment(Cursegp);
131
132         editor_status("Curseg assigned to previous found segment.");
133
134         return 1;
135 }
136