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