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