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