dxx-rebirth/common/3d/matrix.cpp
2014-06-01 19:55:23 +02:00

80 lines
2.3 KiB
C++

/*
* Portions of this file are copyright Rebirth contributors and licensed as
* described in COPYING.txt.
* Portions of this file are copyright Parallax Software and licensed
* according to the Parallax license below.
* See COPYING.txt for license details.
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
*/
/*
*
* Matrix setup & manipulation routines
*
*/
#include "3d.h"
#include "globvars.h"
static void scale_matrix(void);
//set view from x,y,z & p,b,h, zoom. Must call one of g3_set_view_*()
void g3_set_view_angles(const vms_vector *view_pos,const vms_angvec *view_orient,fix zoom)
{
View_zoom = zoom;
View_position = *view_pos;
vm_angles_2_matrix(&View_matrix,view_orient);
scale_matrix();
}
//set view from x,y,z, viewer matrix, and zoom. Must call one of g3_set_view_*()
void g3_set_view_matrix(const vms_vector *view_pos,const vms_matrix *view_matrix,fix zoom)
{
View_zoom = zoom;
View_position = *view_pos;
View_matrix = *view_matrix;
scale_matrix();
}
//performs aspect scaling on global view matrix
static void scale_matrix(void)
{
Unscaled_matrix = View_matrix; //so we can use unscaled if we want
Matrix_scale = Window_scale;
if (View_zoom <= f1_0) //zoom in by scaling z
Matrix_scale.z = fixmul(Matrix_scale.z,View_zoom);
else { //zoom out by scaling x&y
fix s = fixdiv(f1_0,View_zoom);
Matrix_scale.x = fixmul(Matrix_scale.x,s);
Matrix_scale.y = fixmul(Matrix_scale.y,s);
}
//now scale matrix elements
vm_vec_scale(&View_matrix.rvec,Matrix_scale.x);
vm_vec_scale(&View_matrix.uvec,Matrix_scale.y);
vm_vec_scale(&View_matrix.fvec,Matrix_scale.z);
}