]> icculus.org git repositories - btb/d2x.git/blob - main/editor/ksegsel.c
remove rcs tags
[btb/d2x.git] / main / editor / ksegsel.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  * Functions for selecting segments
17  *
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include "conf.h"
22 #endif
23
24 #include <string.h>
25
26 #include "inferno.h"
27 #include "editor/editor.h"
28
29
30 // ---------------------------------------------------------------------------------------
31 // Select previous segment.
32 //      If there is a connection on the side opposite to the current side, then choose that segment.
33 // If there is no connecting segment on the opposite face, try any segment.
34 void get_previous_segment(int curseg_num, int curside,int *newseg_num, int *newside)
35 {
36         int     s;
37
38         *newseg_num = curseg_num;
39
40         if (IS_CHILD(Segments[curseg_num].children[(int)Side_opposite[curside]]))
41                 *newseg_num = Segments[curseg_num].children[(int)Side_opposite[curside]];
42         else        // no segment on opposite face, connect to anything
43                 for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
44                         if ((s != curside) && IS_CHILD(Segments[curseg_num].children[s]))
45                                 *newseg_num = Segments[curseg_num].children[s];
46
47         // Now make Curside point at the segment we just left (unless we couldn't leave it).
48         if (*newseg_num != curseg_num)
49                 *newside = find_connect_side(&Segments[curseg_num],&Segments[*newseg_num]);
50         else
51                 *newside = curside;
52 }
53
54
55 // --------------------------------------------------------------------------------------
56 // Select next segment.
57 //      If there is a connection on the current side, then choose that segment.
58 // If there is no connecting segment on the current side, try any segment.
59 void get_next_segment(int curseg_num, int curside, int *newseg_num, int *newside)
60 {
61         int     s;
62
63         if (IS_CHILD(Segments[curseg_num].children[curside])) {
64
65                 *newseg_num = Segments[curseg_num].children[Curside];
66
67                 // Find out what side we came in through and favor side opposite that
68                 *newside = Side_opposite[find_connect_side(&Segments[curseg_num],&Segments[*newseg_num])];
69
70                 // If there is nothing attached on the side opposite to what we came in (*newside), pick any other side
71                 if (!IS_CHILD(Segments[*newseg_num].children[*newside]))
72                         for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
73                                 if ((Segments[*newseg_num].children[s] != curseg_num) && IS_CHILD(Segments[*newseg_num].children[s]))
74                                         *newside = s;
75         } else {
76                 *newseg_num = curseg_num;
77                 *newside = curside;
78         }
79
80 }
81
82 // ---------- select current segment ----------
83 int SelectCurrentSegForward()
84 {
85         int     newseg_num,newside;
86
87         get_next_segment(SEGMENT_NUMBER(Cursegp), Curside, &newseg_num, &newside);
88
89         if (newseg_num != SEGMENT_NUMBER(Cursegp)) {
90                 Cursegp = &Segments[newseg_num];
91                 Curside = newside;
92                 Update_flags |= UF_ED_STATE_CHANGED;
93                 if (Lock_view_to_cursegp)
94                         set_view_target_from_segment(Cursegp);
95
96                 med_create_new_segment_from_cursegp();
97                 mine_changed = 1;
98         }
99
100         return 1;
101 }
102
103 // -------------------------------------------------------------------------------------
104 int SelectCurrentSegBackward()
105 {
106         int     newseg_num,newside;
107
108         get_previous_segment(SEGMENT_NUMBER(Cursegp), Curside, &newseg_num, &newside);
109
110         Cursegp = &Segments[newseg_num];
111         Curside = newside;
112
113         if (Lock_view_to_cursegp)
114                 set_view_target_from_segment(Cursegp);
115         Update_flags |= UF_ED_STATE_CHANGED;
116         mine_changed = 1;
117         med_create_new_segment_from_cursegp();
118
119         return 1;
120 }
121
122
123 // ---------- select next/previous side on current segment ----------
124 int SelectNextSide()
125 {
126         if (++Curside >= MAX_SIDES_PER_SEGMENT)
127                 Curside = 0;
128         Update_flags |= UF_ED_STATE_CHANGED;
129         mine_changed = 1;
130         return 1;
131 }
132
133 int SelectPrevSide()
134 {
135         if (--Curside < 0)
136                 Curside = MAX_SIDES_PER_SEGMENT-1;
137         Update_flags |= UF_ED_STATE_CHANGED;
138         mine_changed = 1;
139         return 1;
140 }
141
142 //  ---------- Copy current segment and side to marked segment and side ----------
143
144 int CopySegToMarked()
145 {
146    autosave_mine(mine_filename);
147    strcpy(undo_status[Autosave_count], "Mark Segment UNDONE.");
148         Markedsegp = Cursegp;
149         Markedside = Curside;
150         Update_flags |= UF_ED_STATE_CHANGED;
151         mine_changed = 1;
152         return 1;
153 }
154
155 // ---------- select absolute face on segment ----------
156
157 int SelectBottom()
158 {
159         Curside = WBOTTOM;
160         Update_flags |= UF_ED_STATE_CHANGED;
161         mine_changed = 1;
162         return 1;
163 }
164
165 int SelectFront()
166 {
167         Curside = WFRONT;
168         Update_flags |= UF_ED_STATE_CHANGED;
169         mine_changed = 1;
170         return 1;
171 }
172
173 int SelectTop()
174 {
175         Curside = WTOP;
176         Update_flags |= UF_ED_STATE_CHANGED;
177         mine_changed = 1;
178         return 1;
179 }
180
181 int SelectBack()
182 {
183         Curside = WBACK;
184         Update_flags |= UF_ED_STATE_CHANGED;
185         mine_changed = 1;
186         return 1;
187 }
188
189 int SelectLeft()
190 {
191         Curside = WLEFT;
192         Update_flags |= UF_ED_STATE_CHANGED;
193         mine_changed = 1;
194         return 1;
195 }
196
197 int SelectRight()
198 {
199         Curside = WRIGHT;
200         Update_flags |= UF_ED_STATE_CHANGED;
201         mine_changed = 1;
202         return 1;
203 }
204