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