Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1 | pmbaty | 1 | /* |
2 | * Portions of this file are copyright Rebirth contributors and licensed as |
||
3 | * described in COPYING.txt. |
||
4 | * Portions of this file are copyright Parallax Software and licensed |
||
5 | * according to the Parallax license below. |
||
6 | * See COPYING.txt for license details. |
||
7 | |||
8 | THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX |
||
9 | SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO |
||
10 | END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A |
||
11 | ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS |
||
12 | IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS |
||
13 | SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE |
||
14 | FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE |
||
15 | CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS |
||
16 | AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE. |
||
17 | COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. |
||
18 | */ |
||
19 | |||
20 | /* |
||
21 | * |
||
22 | * Texture map key bindings. |
||
23 | * |
||
24 | */ |
||
25 | |||
26 | #include <string.h> |
||
27 | #include "inferno.h" |
||
28 | #include "editor.h" |
||
29 | #include "editor/esegment.h" |
||
30 | #include "kdefs.h" |
||
31 | #include "compiler-range_for.h" |
||
32 | |||
33 | // Assign CurrentTexture to Curside in *Cursegp |
||
34 | int AssignTexture(void) |
||
35 | { |
||
36 | autosave_mine( mine_filename ); |
||
37 | undo_status[Autosave_count] = "Assign Texture UNDONE."; |
||
38 | |||
39 | Cursegp->unique_segment::sides[Curside].tmap_num = CurrentTexture; |
||
40 | |||
41 | New_segment.unique_segment::sides[Curside].tmap_num = CurrentTexture; |
||
42 | |||
43 | // propagate_light_intensity(Cursegp, Curside, CurrentTexture, 0); |
||
44 | |||
45 | Update_flags |= UF_WORLD_CHANGED; |
||
46 | |||
47 | return 1; |
||
48 | } |
||
49 | |||
50 | // Assign CurrentTexture to Curside in *Cursegp |
||
51 | int AssignTexture2(void) |
||
52 | { |
||
53 | int texnum, orient, ctexnum, newtexnum; |
||
54 | |||
55 | autosave_mine( mine_filename ); |
||
56 | undo_status[Autosave_count] = "Assign Texture 2 UNDONE."; |
||
57 | |||
58 | { |
||
59 | const unique_segment &useg = *Cursegp; |
||
60 | auto &uside = useg.sides[Curside]; |
||
61 | const auto tmap_num2 = uside.tmap_num2; |
||
62 | texnum = tmap_num2 & 0x3FFF; |
||
63 | orient = ((tmap_num2 & 0xC000) >> 14) & 3; |
||
64 | } |
||
65 | ctexnum = CurrentTexture; |
||
66 | |||
67 | if ( ctexnum == texnum ) { |
||
68 | orient = (orient+1) & 3; |
||
69 | newtexnum = (orient<<14) | texnum; |
||
70 | } else { |
||
71 | newtexnum = ctexnum; |
||
72 | } |
||
73 | |||
74 | Cursegp->unique_segment::sides[Curside].tmap_num2 = newtexnum; |
||
75 | New_segment.unique_segment::sides[Curside].tmap_num2 = newtexnum; |
||
76 | |||
77 | Update_flags |= UF_WORLD_CHANGED; |
||
78 | |||
79 | return 1; |
||
80 | } |
||
81 | |||
82 | int ClearTexture2(void) |
||
83 | { |
||
84 | autosave_mine( mine_filename ); |
||
85 | undo_status[Autosave_count] = "Clear Texture 2 UNDONE."; |
||
86 | |||
87 | Cursegp->unique_segment::sides[Curside].tmap_num2 = 0; |
||
88 | |||
89 | New_segment.unique_segment::sides[Curside].tmap_num2 = 0; |
||
90 | |||
91 | Update_flags |= UF_WORLD_CHANGED; |
||
92 | |||
93 | return 1; |
||
94 | } |
||
95 | |||
96 | |||
97 | // -------------------------------------------------------------------------------------------------- |
||
98 | // Propagate textures from Cursegp through Curside. |
||
99 | // If uv_flag !0, then only propagate uv coordinates (if 0, then propagate textures as well) |
||
100 | // If move_flag !0, then move forward to new segment after propagation, else don't |
||
101 | static int propagate_textures_common(int uv_flag, int move_flag) |
||
102 | { |
||
103 | autosave_mine( mine_filename ); |
||
104 | undo_status[Autosave_count] = "Propagate Textures UNDONE."; |
||
105 | const auto c = Cursegp->children[Curside]; |
||
106 | if (IS_CHILD(c)) |
||
107 | med_propagate_tmaps_to_segments(Cursegp, vmsegptridx(c), uv_flag); |
||
108 | |||
109 | if (move_flag) |
||
110 | SelectCurrentSegForward(); |
||
111 | |||
112 | Update_flags |= UF_WORLD_CHANGED; |
||
113 | |||
114 | return 1; |
||
115 | } |
||
116 | |||
117 | // Propagate texture maps from current segment, through current side |
||
118 | int PropagateTextures(void) |
||
119 | { |
||
120 | return propagate_textures_common(0, 0); |
||
121 | } |
||
122 | |||
123 | // Propagate texture maps from current segment, through current side |
||
124 | int PropagateTexturesUVs(void) |
||
125 | { |
||
126 | return propagate_textures_common(-1, 0); |
||
127 | } |
||
128 | |||
129 | // Propagate texture maps from current segment, through current side |
||
130 | // And move to that segment. |
||
131 | int PropagateTexturesMove(void) |
||
132 | { |
||
133 | return propagate_textures_common(0, 1); |
||
134 | } |
||
135 | |||
136 | // Propagate uv coordinate from current segment, through current side |
||
137 | // And move to that segment. |
||
138 | int PropagateTexturesMoveUVs(void) |
||
139 | { |
||
140 | return propagate_textures_common(-1, 1); |
||
141 | } |
||
142 | |||
143 | |||
144 | // ------------------------------------------------------------------------------------- |
||
145 | static int is_selected_segment(segnum_t segnum) |
||
146 | { |
||
147 | return Selected_segs.contains(segnum); |
||
148 | } |
||
149 | |||
150 | // ------------------------------------------------------------------------------------- |
||
151 | // Auxiliary function for PropagateTexturesSelected. |
||
152 | // Recursive parse. |
||
153 | static void pts_aux(const vmsegptridx_t sp, visited_segment_bitarray_t &visited) |
||
154 | { |
||
155 | visited[sp] = true; |
||
156 | |||
157 | range_for (const auto c, sp->children) |
||
158 | { |
||
159 | if (IS_CHILD(c)) |
||
160 | { |
||
161 | const auto &&csegp = sp.absolute_sibling(c); |
||
162 | while (!visited[c] && is_selected_segment(c)) |
||
163 | { |
||
164 | med_propagate_tmaps_to_segments(sp, csegp, 0); |
||
165 | pts_aux(csegp, visited); |
||
166 | } |
||
167 | } |
||
168 | } |
||
169 | } |
||
170 | |||
171 | // ------------------------------------------------------------------------------------- |
||
172 | // Propagate texture maps from current segment recursively exploring all children, to all segments in Selected_list |
||
173 | // until a segment not in Selected_list is reached. |
||
174 | int PropagateTexturesSelected(void) |
||
175 | { |
||
176 | autosave_mine( mine_filename ); |
||
177 | undo_status[Autosave_count] = "Propogate Textures Selected UNDONE."; |
||
178 | |||
179 | visited_segment_bitarray_t visited; |
||
180 | visited[Cursegp] = true; |
||
181 | |||
182 | pts_aux(Cursegp, visited); |
||
183 | |||
184 | Update_flags |= UF_WORLD_CHANGED; |
||
185 | |||
186 | return 1; |
||
187 | } |
||
188 |