]> icculus.org git repositories - btb/d2x.git/blob - 3d/matrix.c
avoid assigments between unsigned and signed char, MPW does not like these
[btb/d2x.git] / 3d / matrix.c
1 /* $Id: matrix.c,v 1.4 2002-07-17 21:55:19 bradleyb Exp $ */
2 /*
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.
13 */
14 /*
15  * 
16  * Matrix setup & manipulation routines
17  * 
18  * Old Log:
19  *
20  * Revision 1.1  1995/05/05  08:52:11  allender
21  * Initial revision
22  *
23  * Revision 1.1  1995/04/17  04:14:34  matt
24  * Initial revision
25  * 
26  * 
27  */
28  
29 #ifdef HAVE_CONFIG_H
30 #include <conf.h>
31 #endif
32
33 #ifdef RCS
34 static char rcsid[] = "$Id: matrix.c,v 1.4 2002-07-17 21:55:19 bradleyb Exp $";
35 #endif
36
37 #include "3d.h"
38 #include "globvars.h"
39
40 void scale_matrix(void);
41
42 //set view from x,y,z & p,b,h, zoom.  Must call one of g3_set_view_*() 
43 void g3_set_view_angles(vms_vector *view_pos,vms_angvec *view_orient,fix zoom)
44 {
45         View_zoom = zoom;
46         View_position = *view_pos;
47
48         vm_angles_2_matrix(&View_matrix,view_orient);
49
50 #ifdef D1XD3D
51         Win32_set_view_matrix ();
52 #endif
53
54         scale_matrix();
55 }
56
57 //set view from x,y,z, viewer matrix, and zoom.  Must call one of g3_set_view_*() 
58 void g3_set_view_matrix(vms_vector *view_pos,vms_matrix *view_matrix,fix zoom)
59 {
60         View_zoom = zoom;
61         View_position = *view_pos;
62
63         View_matrix = *view_matrix;
64
65 #ifdef D1XD3D
66         Win32_set_view_matrix ();
67 #endif
68
69         scale_matrix();
70 }
71
72 //performs aspect scaling on global view matrix
73 void scale_matrix(void)
74 {
75         Unscaled_matrix = View_matrix;          //so we can use unscaled if we want
76
77         Matrix_scale = Window_scale;
78
79         if (View_zoom <= f1_0)          //zoom in by scaling z
80
81                 Matrix_scale.z =  fixmul(Matrix_scale.z,View_zoom);
82
83         else {                  //zoom out by scaling x&y
84
85                 fix s = fixdiv(f1_0,View_zoom);
86
87                 Matrix_scale.x = fixmul(Matrix_scale.x,s);
88                 Matrix_scale.y = fixmul(Matrix_scale.y,s);
89         }
90
91         //now scale matrix elements
92
93         vm_vec_scale(&View_matrix.rvec,Matrix_scale.x);
94         vm_vec_scale(&View_matrix.uvec,Matrix_scale.y);
95         vm_vec_scale(&View_matrix.fvec,Matrix_scale.z);
96
97 }
98