1 /* $Id: ksegsel.c,v 1.2 2004-12-19 14:52:48 btb Exp $ */
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.
17 * Functions for selecting segments
22 static char rcsid[] = "$Id: ksegsel.c,v 1.2 2004-12-19 14:52:48 btb Exp $";
28 #include "editor/editor.h"
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)
39 *newseg_num = curseg_num;
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];
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]);
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)
64 if (IS_CHILD(Segments[curseg_num].children[curside])) {
66 *newseg_num = Segments[curseg_num].children[Curside];
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])];
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]))
77 *newseg_num = curseg_num;
83 // ---------- select current segment ----------
84 int SelectCurrentSegForward()
86 int newseg_num,newside;
88 get_next_segment(Cursegp-Segments,Curside,&newseg_num,&newside);
90 if (newseg_num != Cursegp-Segments) {
91 Cursegp = &Segments[newseg_num];
93 Update_flags |= UF_ED_STATE_CHANGED;
94 if (Lock_view_to_cursegp)
95 set_view_target_from_segment(Cursegp);
97 med_create_new_segment_from_cursegp();
104 // -------------------------------------------------------------------------------------
105 int SelectCurrentSegBackward()
107 int newseg_num,newside;
109 get_previous_segment(Cursegp-Segments,Curside,&newseg_num,&newside);
111 Cursegp = &Segments[newseg_num];
114 if (Lock_view_to_cursegp)
115 set_view_target_from_segment(Cursegp);
116 Update_flags |= UF_ED_STATE_CHANGED;
118 med_create_new_segment_from_cursegp();
124 // ---------- select next/previous side on current segment ----------
127 if (++Curside >= MAX_SIDES_PER_SEGMENT)
129 Update_flags |= UF_ED_STATE_CHANGED;
137 Curside = MAX_SIDES_PER_SEGMENT-1;
138 Update_flags |= UF_ED_STATE_CHANGED;
143 // ---------- Copy current segment and side to marked segment and side ----------
145 int CopySegToMarked()
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;
156 // ---------- select absolute face on segment ----------
161 Update_flags |= UF_ED_STATE_CHANGED;
169 Update_flags |= UF_ED_STATE_CHANGED;
177 Update_flags |= UF_ED_STATE_CHANGED;
185 Update_flags |= UF_ED_STATE_CHANGED;
193 Update_flags |= UF_ED_STATE_CHANGED;
201 Update_flags |= UF_ED_STATE_CHANGED;