]> icculus.org git repositories - btb/d2x.git/blob - main/editor/ksegsel.c
imported missing editor files from d1x
[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  * $Source: /cvs/cvsroot/d2x/main/editor/ksegsel.c,v $
15  * $Revision: 1.1 $
16  * $Author: btb $
17  * $Date: 2004-12-19 13:54:27 $
18  *
19  * Functions for selecting segments
20  *
21  * $Log: not supported by cvs2svn $
22  * Revision 1.1.1.1  1999/06/14 22:03:30  donut
23  * Import of d1x 1.37 source.
24  *
25  * Revision 2.0  1995/02/27  11:35:33  john
26  * Version 2.0! No anonymous unions, Watcom 10.0, with no need
27  * for bitmaps.tbl.
28  * 
29  * Revision 1.12  1994/08/25  21:57:02  mike
30  * IS_CHILD stuff.
31  * 
32  * Revision 1.11  1994/05/23  14:48:35  mike
33  * make current segment be add segment.
34  * 
35  * Revision 1.10  1993/12/06  19:33:43  yuan
36  * Fixed autosave stuff so that undo restores Cursegp and
37  * Markedsegp
38  * 
39  * Revision 1.9  1993/12/02  12:39:37  matt
40  * Removed extra includes
41  * 
42  * Revision 1.8  1993/11/12  13:08:17  yuan
43  * Fixed warning for concave segment so it appears after any
44  * "less important" diagnostic messages.
45  * 
46  * Revision 1.7  1993/11/05  17:32:49  john
47  * added funcs
48  * .,
49  * 
50  * Revision 1.6  1993/11/01  09:53:18  mike
51  * Write functions get_next_segment and get_previous_segment.
52  * 
53  * Revision 1.5  1993/10/31  18:06:56  mike
54  * Only set_view_target_from_segment if in that mode.
55  * 
56  * Revision 1.4  1993/10/28  15:01:09  matt
57  * Mucked with update flags
58  * 
59  * Revision 1.3  1993/10/14  18:07:47  mike
60  * Change use of CONNECTIVITY to MAX_SIDES_PER_SEGMENT
61  * 
62  * Revision 1.2  1993/10/14  11:47:34  john
63  * *** empty log message ***
64  * 
65  * Revision 1.1  1993/10/13  18:53:39  john
66  * Initial revision
67  * 
68  *
69  */
70
71 #ifdef RCS
72 static char rcsid[] = "$Id: ksegsel.c,v 1.1 2004-12-19 13:54:27 btb Exp $";
73 #endif
74
75 #include <string.h>
76
77 #include "inferno.h"
78 #include "editor/editor.h"
79
80
81 // ---------------------------------------------------------------------------------------
82 // Select previous segment.
83 //      If there is a connection on the side opposite to the current side, then choose that segment.
84 // If there is no connecting segment on the opposite face, try any segment.
85 void get_previous_segment(int curseg_num, int curside,int *newseg_num, int *newside)
86 {
87         int     s;
88
89         *newseg_num = curseg_num;
90
91         if (IS_CHILD(Segments[curseg_num].children[(int)Side_opposite[curside]]))
92                 *newseg_num = Segments[curseg_num].children[(int)Side_opposite[curside]];
93         else        // no segment on opposite face, connect to anything
94                 for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
95                         if ((s != curside) && IS_CHILD(Segments[curseg_num].children[s]))
96                                 *newseg_num = Segments[curseg_num].children[s];
97
98         // Now make Curside point at the segment we just left (unless we couldn't leave it).
99         if (*newseg_num != curseg_num)
100                 *newside = find_connect_side(&Segments[curseg_num],&Segments[*newseg_num]);
101         else
102                 *newside = curside;
103 }
104
105
106 // --------------------------------------------------------------------------------------
107 // Select next segment.
108 //      If there is a connection on the current side, then choose that segment.
109 // If there is no connecting segment on the current side, try any segment.
110 void get_next_segment(int curseg_num, int curside, int *newseg_num, int *newside)
111 {
112         int     s;
113
114         if (IS_CHILD(Segments[curseg_num].children[curside])) {
115
116                 *newseg_num = Segments[curseg_num].children[Curside];
117
118                 // Find out what side we came in through and favor side opposite that
119                 *newside = Side_opposite[find_connect_side(&Segments[curseg_num],&Segments[*newseg_num])];
120
121                 // If there is nothing attached on the side opposite to what we came in (*newside), pick any other side
122                 if (!IS_CHILD(Segments[*newseg_num].children[*newside]))
123                         for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
124                                 if ((Segments[*newseg_num].children[s] != curseg_num) && IS_CHILD(Segments[*newseg_num].children[s]))
125                                         *newside = s;
126         } else {
127                 *newseg_num = curseg_num;
128                 *newside = curside;
129         }
130
131 }
132
133 // ---------- select current segment ----------
134 int SelectCurrentSegForward()
135 {
136         int     newseg_num,newside;
137
138         get_next_segment(Cursegp-Segments,Curside,&newseg_num,&newside);
139
140         if (newseg_num != Cursegp-Segments) {
141                 Cursegp = &Segments[newseg_num];
142                 Curside = newside;
143                 Update_flags |= UF_ED_STATE_CHANGED;
144                 if (Lock_view_to_cursegp)
145                         set_view_target_from_segment(Cursegp);
146
147                 med_create_new_segment_from_cursegp();
148                 mine_changed = 1;
149         }
150
151         return 1;
152 }
153
154 // -------------------------------------------------------------------------------------
155 int SelectCurrentSegBackward()
156 {
157         int     newseg_num,newside;
158
159         get_previous_segment(Cursegp-Segments,Curside,&newseg_num,&newside);
160
161         Cursegp = &Segments[newseg_num];
162         Curside = newside;
163
164         if (Lock_view_to_cursegp)
165                 set_view_target_from_segment(Cursegp);
166         Update_flags |= UF_ED_STATE_CHANGED;
167         mine_changed = 1;
168         med_create_new_segment_from_cursegp();
169
170         return 1;
171 }
172
173
174 // ---------- select next/previous side on current segment ----------
175 int SelectNextSide()
176 {
177         if (++Curside >= MAX_SIDES_PER_SEGMENT)
178                 Curside = 0;
179         Update_flags |= UF_ED_STATE_CHANGED;
180         mine_changed = 1;
181         return 1;
182 }
183
184 int SelectPrevSide()
185 {
186         if (--Curside < 0)
187                 Curside = MAX_SIDES_PER_SEGMENT-1;
188         Update_flags |= UF_ED_STATE_CHANGED;
189         mine_changed = 1;
190         return 1;
191 }
192
193 //  ---------- Copy current segment and side to marked segment and side ----------
194
195 int CopySegToMarked()
196 {
197    autosave_mine(mine_filename);
198    strcpy(undo_status[Autosave_count], "Mark Segment UNDONE.");
199         Markedsegp = Cursegp;
200         Markedside = Curside;
201         Update_flags |= UF_ED_STATE_CHANGED;
202         mine_changed = 1;
203         return 1;
204 }
205
206 // ---------- select absolute face on segment ----------
207
208 int SelectBottom()
209 {
210         Curside = WBOTTOM;
211         Update_flags |= UF_ED_STATE_CHANGED;
212         mine_changed = 1;
213         return 1;
214 }
215
216 int SelectFront()
217 {
218         Curside = WFRONT;
219         Update_flags |= UF_ED_STATE_CHANGED;
220         mine_changed = 1;
221         return 1;
222 }
223
224 int SelectTop()
225 {
226         Curside = WTOP;
227         Update_flags |= UF_ED_STATE_CHANGED;
228         mine_changed = 1;
229         return 1;
230 }
231
232 int SelectBack()
233 {
234         Curside = WBACK;
235         Update_flags |= UF_ED_STATE_CHANGED;
236         mine_changed = 1;
237         return 1;
238 }
239
240 int SelectLeft()
241 {
242         Curside = WLEFT;
243         Update_flags |= UF_ED_STATE_CHANGED;
244         mine_changed = 1;
245         return 1;
246 }
247
248 int SelectRight()
249 {
250         Curside = WRIGHT;
251         Update_flags |= UF_ED_STATE_CHANGED;
252         mine_changed = 1;
253         return 1;
254 }
255