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.
16 * Functions for selecting segments
27 #include "editor/editor.h"
30 // ---------------------------------------------------------------------------------------
31 // Select previous segment.
32 // If there is a connection on the side opposite to the current side, then choose that segment.
33 // If there is no connecting segment on the opposite face, try any segment.
34 void get_previous_segment(int curseg_num, int curside,int *newseg_num, int *newside)
38 *newseg_num = curseg_num;
40 if (IS_CHILD(Segments[curseg_num].children[(int)Side_opposite[curside]]))
41 *newseg_num = Segments[curseg_num].children[(int)Side_opposite[curside]];
42 else // no segment on opposite face, connect to anything
43 for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
44 if ((s != curside) && IS_CHILD(Segments[curseg_num].children[s]))
45 *newseg_num = Segments[curseg_num].children[s];
47 // Now make Curside point at the segment we just left (unless we couldn't leave it).
48 if (*newseg_num != curseg_num)
49 *newside = find_connect_side(&Segments[curseg_num],&Segments[*newseg_num]);
55 // --------------------------------------------------------------------------------------
56 // Select next segment.
57 // If there is a connection on the current side, then choose that segment.
58 // If there is no connecting segment on the current side, try any segment.
59 void get_next_segment(int curseg_num, int curside, int *newseg_num, int *newside)
63 if (IS_CHILD(Segments[curseg_num].children[curside])) {
65 *newseg_num = Segments[curseg_num].children[Curside];
67 // Find out what side we came in through and favor side opposite that
68 *newside = Side_opposite[find_connect_side(&Segments[curseg_num],&Segments[*newseg_num])];
70 // If there is nothing attached on the side opposite to what we came in (*newside), pick any other side
71 if (!IS_CHILD(Segments[*newseg_num].children[*newside]))
72 for (s=0; s<MAX_SIDES_PER_SEGMENT; s++)
73 if ((Segments[*newseg_num].children[s] != curseg_num) && IS_CHILD(Segments[*newseg_num].children[s]))
76 *newseg_num = curseg_num;
82 // ---------- select current segment ----------
83 int SelectCurrentSegForward()
85 int newseg_num,newside;
87 get_next_segment(SEGMENT_NUMBER(Cursegp), Curside, &newseg_num, &newside);
89 if (newseg_num != SEGMENT_NUMBER(Cursegp)) {
90 Cursegp = &Segments[newseg_num];
92 Update_flags |= UF_ED_STATE_CHANGED;
93 if (Lock_view_to_cursegp)
94 set_view_target_from_segment(Cursegp);
96 med_create_new_segment_from_cursegp();
103 // -------------------------------------------------------------------------------------
104 int SelectCurrentSegBackward()
106 int newseg_num,newside;
108 get_previous_segment(SEGMENT_NUMBER(Cursegp), Curside, &newseg_num, &newside);
110 Cursegp = &Segments[newseg_num];
113 if (Lock_view_to_cursegp)
114 set_view_target_from_segment(Cursegp);
115 Update_flags |= UF_ED_STATE_CHANGED;
117 med_create_new_segment_from_cursegp();
123 // ---------- select next/previous side on current segment ----------
126 if (++Curside >= MAX_SIDES_PER_SEGMENT)
128 Update_flags |= UF_ED_STATE_CHANGED;
136 Curside = MAX_SIDES_PER_SEGMENT-1;
137 Update_flags |= UF_ED_STATE_CHANGED;
142 // ---------- Copy current segment and side to marked segment and side ----------
144 int CopySegToMarked()
146 autosave_mine(mine_filename);
147 strcpy(undo_status[Autosave_count], "Mark Segment UNDONE.");
148 Markedsegp = Cursegp;
149 Markedside = Curside;
150 Update_flags |= UF_ED_STATE_CHANGED;
155 // ---------- select absolute face on segment ----------
160 Update_flags |= UF_ED_STATE_CHANGED;
168 Update_flags |= UF_ED_STATE_CHANGED;
176 Update_flags |= UF_ED_STATE_CHANGED;
184 Update_flags |= UF_ED_STATE_CHANGED;
192 Update_flags |= UF_ED_STATE_CHANGED;
200 Update_flags |= UF_ED_STATE_CHANGED;