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