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.
14 * $Source: /cvs/cvsroot/d2x/main/editor/ksegsel.c,v $
17 * $Date: 2004-12-19 13:54:27 $
19 * Functions for selecting segments
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.
25 * Revision 2.0 1995/02/27 11:35:33 john
26 * Version 2.0! No anonymous unions, Watcom 10.0, with no need
29 * Revision 1.12 1994/08/25 21:57:02 mike
32 * Revision 1.11 1994/05/23 14:48:35 mike
33 * make current segment be add segment.
35 * Revision 1.10 1993/12/06 19:33:43 yuan
36 * Fixed autosave stuff so that undo restores Cursegp and
39 * Revision 1.9 1993/12/02 12:39:37 matt
40 * Removed extra includes
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.
46 * Revision 1.7 1993/11/05 17:32:49 john
50 * Revision 1.6 1993/11/01 09:53:18 mike
51 * Write functions get_next_segment and get_previous_segment.
53 * Revision 1.5 1993/10/31 18:06:56 mike
54 * Only set_view_target_from_segment if in that mode.
56 * Revision 1.4 1993/10/28 15:01:09 matt
57 * Mucked with update flags
59 * Revision 1.3 1993/10/14 18:07:47 mike
60 * Change use of CONNECTIVITY to MAX_SIDES_PER_SEGMENT
62 * Revision 1.2 1993/10/14 11:47:34 john
63 * *** empty log message ***
65 * Revision 1.1 1993/10/13 18:53:39 john
72 static char rcsid[] = "$Id: ksegsel.c,v 1.1 2004-12-19 13:54:27 btb Exp $";
78 #include "editor/editor.h"
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)
89 *newseg_num = curseg_num;
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];
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]);
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)
114 if (IS_CHILD(Segments[curseg_num].children[curside])) {
116 *newseg_num = Segments[curseg_num].children[Curside];
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])];
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]))
127 *newseg_num = curseg_num;
133 // ---------- select current segment ----------
134 int SelectCurrentSegForward()
136 int newseg_num,newside;
138 get_next_segment(Cursegp-Segments,Curside,&newseg_num,&newside);
140 if (newseg_num != Cursegp-Segments) {
141 Cursegp = &Segments[newseg_num];
143 Update_flags |= UF_ED_STATE_CHANGED;
144 if (Lock_view_to_cursegp)
145 set_view_target_from_segment(Cursegp);
147 med_create_new_segment_from_cursegp();
154 // -------------------------------------------------------------------------------------
155 int SelectCurrentSegBackward()
157 int newseg_num,newside;
159 get_previous_segment(Cursegp-Segments,Curside,&newseg_num,&newside);
161 Cursegp = &Segments[newseg_num];
164 if (Lock_view_to_cursegp)
165 set_view_target_from_segment(Cursegp);
166 Update_flags |= UF_ED_STATE_CHANGED;
168 med_create_new_segment_from_cursegp();
174 // ---------- select next/previous side on current segment ----------
177 if (++Curside >= MAX_SIDES_PER_SEGMENT)
179 Update_flags |= UF_ED_STATE_CHANGED;
187 Curside = MAX_SIDES_PER_SEGMENT-1;
188 Update_flags |= UF_ED_STATE_CHANGED;
193 // ---------- Copy current segment and side to marked segment and side ----------
195 int CopySegToMarked()
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;
206 // ---------- select absolute face on segment ----------
211 Update_flags |= UF_ED_STATE_CHANGED;
219 Update_flags |= UF_ED_STATE_CHANGED;
227 Update_flags |= UF_ED_STATE_CHANGED;
235 Update_flags |= UF_ED_STATE_CHANGED;
243 Update_flags |= UF_ED_STATE_CHANGED;
251 Update_flags |= UF_ED_STATE_CHANGED;