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.
37 void compute_uv_side_center(uvl *uvcenter, segment *segp, int sidenum);
38 void rotate_uv_points_on_side(segment *segp, int sidenum, fix *rotmat, uvl *uvcenter);
40 // -----------------------------------------------------------
46 compute_uv_side_center(&uvcenter, Cursegp, Curside);
48 // Create a rotation matrix
54 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
56 Update_flags |= UF_WORLD_CHANGED;
61 // -----------------------------------------------------------
67 compute_uv_side_center(&uvcenter, Cursegp, Curside);
69 // Create a rotation matrix
75 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
77 Update_flags |= UF_WORLD_CHANGED;
82 // -----------------------------------------------------------
83 int DoTexSlideLeft(int value)
91 vp = Side_to_verts[Curside];
92 sidep = &Cursegp->sides[Curside];
94 dist = vm_vec_dist(&Vertices[Cursegp->verts[vp[3]]], &Vertices[Cursegp->verts[vp[0]]]);
96 if (dist < F1_0/(64*value))
97 dist = F1_0/(64*value);
99 duvl03.u = fixdiv(sidep->uvls[3].u - sidep->uvls[0].u,dist);
100 duvl03.v = fixdiv(sidep->uvls[3].v - sidep->uvls[0].v,dist);
102 for (v=0; v<4; v++) {
103 sidep->uvls[v].u -= duvl03.u;
104 sidep->uvls[v].v -= duvl03.v;
107 Update_flags |= UF_WORLD_CHANGED;
114 return DoTexSlideLeft(3);
117 int TexSlideLeftBig()
119 return DoTexSlideLeft(1);
122 // -----------------------------------------------------------
123 int DoTexSlideUp(int value)
131 vp = Side_to_verts[Curside];
132 sidep = &Cursegp->sides[Curside];
134 dist = vm_vec_dist(&Vertices[Cursegp->verts[vp[1]]], &Vertices[Cursegp->verts[vp[0]]]);
137 if (dist < F1_0/(64*value))
138 dist = F1_0/(64*value);
140 duvl03.u = fixdiv(sidep->uvls[1].u - sidep->uvls[0].u,dist);
141 duvl03.v = fixdiv(sidep->uvls[1].v - sidep->uvls[0].v,dist);
143 for (v=0; v<4; v++) {
144 sidep->uvls[v].u -= duvl03.u;
145 sidep->uvls[v].v -= duvl03.v;
148 Update_flags |= UF_WORLD_CHANGED;
155 return DoTexSlideUp(3);
160 return DoTexSlideUp(1);
164 // -----------------------------------------------------------
165 int DoTexSlideDown(int value)
173 vp = Side_to_verts[Curside];
174 sidep = &Cursegp->sides[Curside];
176 dist = vm_vec_dist(&Vertices[Cursegp->verts[vp[1]]], &Vertices[Cursegp->verts[vp[0]]]);
178 if (dist < F1_0/(64*value))
179 dist = F1_0/(64*value);
181 duvl03.u = fixdiv(sidep->uvls[1].u - sidep->uvls[0].u,dist);
182 duvl03.v = fixdiv(sidep->uvls[1].v - sidep->uvls[0].v,dist);
184 for (v=0; v<4; v++) {
185 sidep->uvls[v].u += duvl03.u;
186 sidep->uvls[v].v += duvl03.v;
189 Update_flags |= UF_WORLD_CHANGED;
196 return DoTexSlideDown(3);
199 int TexSlideDownBig()
201 return DoTexSlideDown(1);
204 // -----------------------------------------------------------
205 // Compute the center of the side in u,v coordinates.
206 void compute_uv_side_center(uvl *uvcenter, segment *segp, int sidenum)
209 side *sidep = &segp->sides[sidenum];
214 for (v=0; v<4; v++) {
215 uvcenter->u += sidep->uvls[v].u;
216 uvcenter->v += sidep->uvls[v].v;
224 // -----------------------------------------------------------
225 // rotate point *uv by matrix rotmat, return *uvrot
226 void rotate_uv_point(uvl *uvrot, fix *rotmat, uvl *uv, uvl *uvcenter)
228 uvrot->u = fixmul(uv->u - uvcenter->u,rotmat[0]) + fixmul(uv->v - uvcenter->v,rotmat[1]) + uvcenter->u;
229 uvrot->v = fixmul(uv->u - uvcenter->u,rotmat[2]) + fixmul(uv->v - uvcenter->v,rotmat[3]) + uvcenter->v;
232 // -----------------------------------------------------------
233 // Compute the center of the side in u,v coordinates.
234 void rotate_uv_points_on_side(segment *segp, int sidenum, fix *rotmat, uvl *uvcenter)
237 side *sidep = &segp->sides[sidenum];
240 for (v=0; v<4; v++) {
241 rotate_uv_point(&tuv, rotmat, &sidep->uvls[v], uvcenter);
242 sidep->uvls[v] = tuv;
246 // -----------------------------------------------------------
247 // ang is in 0..ffff = 0..359.999 degrees
248 // rotmat is filled in with 4 fixes
249 void create_2d_rotation_matrix(fix *rotmat, fix ang)
253 fix_sincos(ang, &sinang, &cosang);
263 // -----------------------------------------------------------
264 int DoTexRotateLeft(int value)
269 compute_uv_side_center(&uvcenter, Cursegp, Curside);
271 // Create a rotation matrix
272 create_2d_rotation_matrix(rotmat, -F1_0/value);
274 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
276 Update_flags |= UF_WORLD_CHANGED;
283 return DoTexRotateLeft(192);
286 int TexRotateLeftBig()
288 return DoTexRotateLeft(64);
292 // -----------------------------------------------------------
293 int DoTexSlideRight(int value)
301 vp = Side_to_verts[Curside];
302 sidep = &Cursegp->sides[Curside];
304 dist = vm_vec_dist(&Vertices[Cursegp->verts[vp[3]]], &Vertices[Cursegp->verts[vp[0]]]);
306 if (dist < F1_0/(64*value))
307 dist = F1_0/(64*value);
309 duvl03.u = fixdiv(sidep->uvls[3].u - sidep->uvls[0].u,dist);
310 duvl03.v = fixdiv(sidep->uvls[3].v - sidep->uvls[0].v,dist);
312 for (v=0; v<4; v++) {
313 sidep->uvls[v].u += duvl03.u;
314 sidep->uvls[v].v += duvl03.v;
317 Update_flags |= UF_WORLD_CHANGED;
324 return DoTexSlideRight(3);
327 int TexSlideRightBig()
329 return DoTexSlideRight(1);
332 // -----------------------------------------------------------
333 int DoTexRotateRight(int value)
338 compute_uv_side_center(&uvcenter, Cursegp, Curside);
340 // Create a rotation matrix
341 create_2d_rotation_matrix(rotmat, F1_0/value);
343 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
345 Update_flags |= UF_WORLD_CHANGED;
352 return DoTexRotateRight(192);
355 int TexRotateRightBig()
357 return DoTexRotateRight(64);
360 // -----------------------------------------------------------
361 int TexSelectActiveEdge()
366 // -----------------------------------------------------------
367 int TexRotate90Degrees()
372 compute_uv_side_center(&uvcenter, Cursegp, Curside);
374 // Create a rotation matrix
375 create_2d_rotation_matrix(rotmat, F1_0/4);
377 rotate_uv_points_on_side(Cursegp, Curside, rotmat, &uvcenter);
379 Update_flags |= UF_WORLD_CHANGED;
384 // -----------------------------------------------------------
389 Stretch_scale_x = F1_0;
390 Stretch_scale_y = F1_0;
392 assign_default_uvs_to_side(Cursegp,Curside);
394 Update_flags |= UF_GAME_VIEW_CHANGED;
398 // -----------------------------------------------------------
399 int TexIncreaseTiling()
403 assign_default_uvs_to_side(Cursegp, Curside);
404 Update_flags |= UF_GAME_VIEW_CHANGED;
409 // -----------------------------------------------------------
410 int TexDecreaseTiling()
413 if (--Num_tilings < 1)
416 assign_default_uvs_to_side(Cursegp, Curside);
417 Update_flags |= UF_GAME_VIEW_CHANGED;
423 // direction = -1 or 1 depending on direction
424 int TexStretchCommon(int direction)
428 if ((Curedge == 0) || (Curedge == 2))
429 sptr = &Stretch_scale_x;
431 sptr = &Stretch_scale_y;
433 *sptr += direction*F1_0/64;
441 stretch_uvs_from_curedge(Cursegp, Curside);
443 editor_status("Stretch scale = %7.4f, use Set Default to return to 1.0", f2fl(*sptr));
445 Update_flags |= UF_GAME_VIEW_CHANGED;
450 int TexStretchDown(void)
452 return TexStretchCommon(-1);
456 int TexStretchUp(void)
458 return TexStretchCommon(1);