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 * Texture map assignment.
40 void compute_uv_side_center(uvl *uvcenter, segment *segp, int sidenum);
41 void rotate_uv_points_on_side(segment *segp, int sidenum, fix *rotmat, uvl *uvcenter);
43 // -----------------------------------------------------------
49 compute_uv_side_center(&uvcenter, Cursegp, Curside);
51 // Create a rotation matrix
57 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
59 Update_flags |= UF_WORLD_CHANGED;
64 // -----------------------------------------------------------
70 compute_uv_side_center(&uvcenter, Cursegp, Curside);
72 // Create a rotation matrix
78 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
80 Update_flags |= UF_WORLD_CHANGED;
85 // -----------------------------------------------------------
86 int DoTexSlideLeft(int value)
94 vp = Side_to_verts[Curside];
95 sidep = &Cursegp->sides[Curside];
97 dist = vm_vec_dist(&Vertices[Cursegp->verts[vp[3]]], &Vertices[Cursegp->verts[vp[0]]]);
99 if (dist < F1_0/(64*value))
100 dist = F1_0/(64*value);
102 duvl03.u = fixdiv(sidep->uvls[3].u - sidep->uvls[0].u,dist);
103 duvl03.v = fixdiv(sidep->uvls[3].v - sidep->uvls[0].v,dist);
105 for (v=0; v<4; v++) {
106 sidep->uvls[v].u -= duvl03.u;
107 sidep->uvls[v].v -= duvl03.v;
110 Update_flags |= UF_WORLD_CHANGED;
117 return DoTexSlideLeft(3);
120 int TexSlideLeftBig()
122 return DoTexSlideLeft(1);
125 // -----------------------------------------------------------
126 int DoTexSlideUp(int value)
134 vp = Side_to_verts[Curside];
135 sidep = &Cursegp->sides[Curside];
137 dist = vm_vec_dist(&Vertices[Cursegp->verts[vp[1]]], &Vertices[Cursegp->verts[vp[0]]]);
140 if (dist < F1_0/(64*value))
141 dist = F1_0/(64*value);
143 duvl03.u = fixdiv(sidep->uvls[1].u - sidep->uvls[0].u,dist);
144 duvl03.v = fixdiv(sidep->uvls[1].v - sidep->uvls[0].v,dist);
146 for (v=0; v<4; v++) {
147 sidep->uvls[v].u -= duvl03.u;
148 sidep->uvls[v].v -= duvl03.v;
151 Update_flags |= UF_WORLD_CHANGED;
158 return DoTexSlideUp(3);
163 return DoTexSlideUp(1);
167 // -----------------------------------------------------------
168 int DoTexSlideDown(int value)
176 vp = Side_to_verts[Curside];
177 sidep = &Cursegp->sides[Curside];
179 dist = vm_vec_dist(&Vertices[Cursegp->verts[vp[1]]], &Vertices[Cursegp->verts[vp[0]]]);
181 if (dist < F1_0/(64*value))
182 dist = F1_0/(64*value);
184 duvl03.u = fixdiv(sidep->uvls[1].u - sidep->uvls[0].u,dist);
185 duvl03.v = fixdiv(sidep->uvls[1].v - sidep->uvls[0].v,dist);
187 for (v=0; v<4; v++) {
188 sidep->uvls[v].u += duvl03.u;
189 sidep->uvls[v].v += duvl03.v;
192 Update_flags |= UF_WORLD_CHANGED;
199 return DoTexSlideDown(3);
202 int TexSlideDownBig()
204 return DoTexSlideDown(1);
207 // -----------------------------------------------------------
208 // Compute the center of the side in u,v coordinates.
209 void compute_uv_side_center(uvl *uvcenter, segment *segp, int sidenum)
212 side *sidep = &segp->sides[sidenum];
217 for (v=0; v<4; v++) {
218 uvcenter->u += sidep->uvls[v].u;
219 uvcenter->v += sidep->uvls[v].v;
227 // -----------------------------------------------------------
228 // rotate point *uv by matrix rotmat, return *uvrot
229 void rotate_uv_point(uvl *uvrot, fix *rotmat, uvl *uv, uvl *uvcenter)
231 uvrot->u = fixmul(uv->u - uvcenter->u,rotmat[0]) + fixmul(uv->v - uvcenter->v,rotmat[1]) + uvcenter->u;
232 uvrot->v = fixmul(uv->u - uvcenter->u,rotmat[2]) + fixmul(uv->v - uvcenter->v,rotmat[3]) + uvcenter->v;
235 // -----------------------------------------------------------
236 // Compute the center of the side in u,v coordinates.
237 void rotate_uv_points_on_side(segment *segp, int sidenum, fix *rotmat, uvl *uvcenter)
240 side *sidep = &segp->sides[sidenum];
243 for (v=0; v<4; v++) {
244 rotate_uv_point(&tuv, rotmat, &sidep->uvls[v], uvcenter);
245 sidep->uvls[v] = tuv;
249 // -----------------------------------------------------------
250 // ang is in 0..ffff = 0..359.999 degrees
251 // rotmat is filled in with 4 fixes
252 void create_2d_rotation_matrix(fix *rotmat, fix ang)
256 fix_sincos(ang, &sinang, &cosang);
266 // -----------------------------------------------------------
267 int DoTexRotateLeft(int value)
272 compute_uv_side_center(&uvcenter, Cursegp, Curside);
274 // Create a rotation matrix
275 create_2d_rotation_matrix(rotmat, -F1_0/value);
277 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
279 Update_flags |= UF_WORLD_CHANGED;
286 return DoTexRotateLeft(192);
289 int TexRotateLeftBig()
291 return DoTexRotateLeft(64);
295 // -----------------------------------------------------------
296 int DoTexSlideRight(int value)
304 vp = Side_to_verts[Curside];
305 sidep = &Cursegp->sides[Curside];
307 dist = vm_vec_dist(&Vertices[Cursegp->verts[vp[3]]], &Vertices[Cursegp->verts[vp[0]]]);
309 if (dist < F1_0/(64*value))
310 dist = F1_0/(64*value);
312 duvl03.u = fixdiv(sidep->uvls[3].u - sidep->uvls[0].u,dist);
313 duvl03.v = fixdiv(sidep->uvls[3].v - sidep->uvls[0].v,dist);
315 for (v=0; v<4; v++) {
316 sidep->uvls[v].u += duvl03.u;
317 sidep->uvls[v].v += duvl03.v;
320 Update_flags |= UF_WORLD_CHANGED;
327 return DoTexSlideRight(3);
330 int TexSlideRightBig()
332 return DoTexSlideRight(1);
335 // -----------------------------------------------------------
336 int DoTexRotateRight(int value)
341 compute_uv_side_center(&uvcenter, Cursegp, Curside);
343 // Create a rotation matrix
344 create_2d_rotation_matrix(rotmat, F1_0/value);
346 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
348 Update_flags |= UF_WORLD_CHANGED;
355 return DoTexRotateRight(192);
358 int TexRotateRightBig()
360 return DoTexRotateRight(64);
363 // -----------------------------------------------------------
364 int TexSelectActiveEdge()
369 // -----------------------------------------------------------
370 int TexRotate90Degrees()
375 compute_uv_side_center(&uvcenter, Cursegp, Curside);
377 // Create a rotation matrix
378 create_2d_rotation_matrix(rotmat, F1_0/4);
380 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
382 Update_flags |= UF_WORLD_CHANGED;
387 // -----------------------------------------------------------
392 Stretch_scale_x = F1_0;
393 Stretch_scale_y = F1_0;
395 assign_default_uvs_to_side(Cursegp,Curside);
397 Update_flags |= UF_GAME_VIEW_CHANGED;
401 // -----------------------------------------------------------
402 int TexIncreaseTiling()
406 assign_default_uvs_to_side(Cursegp, Curside);
407 Update_flags |= UF_GAME_VIEW_CHANGED;
412 // -----------------------------------------------------------
413 int TexDecreaseTiling()
416 if (--Num_tilings < 1)
419 assign_default_uvs_to_side(Cursegp, Curside);
420 Update_flags |= UF_GAME_VIEW_CHANGED;
426 // direction = -1 or 1 depending on direction
427 int TexStretchCommon(int direction)
431 if ((Curedge == 0) || (Curedge == 2))
432 sptr = &Stretch_scale_x;
434 sptr = &Stretch_scale_y;
436 *sptr += direction*F1_0/64;
444 stretch_uvs_from_curedge(Cursegp, Curside);
446 editor_status("Stretch scale = %7.4f, use Set Default to return to 1.0", f2fl(*sptr));
448 Update_flags |= UF_GAME_VIEW_CHANGED;
453 int TexStretchDown(void)
455 return TexStretchCommon(-1);
459 int TexStretchUp(void)
461 return TexStretchCommon(1);