mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.0 KiB
144 lines
4.0 KiB
//-----------------------------------------------------------------------------
|
|
// File: view.cpp
|
|
//
|
|
// Desc:
|
|
//
|
|
// Copyright (c) 2000 Microsoft Corporation. All rights reserved.
|
|
//-----------------------------------------------------------------------------
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name:
|
|
// Desc: VIEW constructor
|
|
//-----------------------------------------------------------------------------
|
|
VIEW::VIEW()
|
|
{
|
|
m_bProjMode = TRUE;
|
|
|
|
// set some initial viewing and size params
|
|
m_zTrans = -75.0f;
|
|
m_viewDist = -m_zTrans;
|
|
|
|
m_numDiv = NUM_DIV;
|
|
assert( m_numDiv >= 2 && "VIEW constructor: not enough divisions\n" );
|
|
// Because number of nodes in a dimension is derived from (numDiv-1), and
|
|
// can't be 0
|
|
|
|
m_divSize = 7.0f;
|
|
|
|
m_persp.viewAngle = D3DX_PI / 2.0f; //90.0f;
|
|
m_persp.zNear = 1.0f;
|
|
|
|
m_yRot = 0.0f;
|
|
|
|
m_winSize.width = m_winSize.height = 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: SetProjMatrix
|
|
// Desc: Set Projection matrix
|
|
//-----------------------------------------------------------------------------
|
|
void VIEW::SetProjMatrix( IDirect3DDevice8* pd3dDevice )
|
|
{
|
|
// Rotate the camera about the y-axis
|
|
D3DXVECTOR3 vFromPt = D3DXVECTOR3( 0.0f, 0.0f, -m_zTrans );
|
|
D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
|
|
D3DXVECTOR3 vUpVec = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
|
|
|
|
D3DXMATRIX matView;
|
|
D3DXMatrixLookAtLH( &matView, &vFromPt, &vLookatPt, &vUpVec );
|
|
pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
|
|
|
|
// Set the projection matrix
|
|
D3DXMATRIX matProj;
|
|
D3DXMatrixPerspectiveFovLH( &matProj, m_persp.viewAngle, m_aspectRatio, m_persp.zNear, m_persp.zFar );
|
|
pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: CalcNodeArraySize
|
|
// Desc: Based on the viewing width and height, and numDiv, calculate the x,y,z array
|
|
// node dimensions.
|
|
//-----------------------------------------------------------------------------
|
|
void VIEW::CalcNodeArraySize( IPOINT3D *pNodeDim )
|
|
{
|
|
// mf: !!! if aspect ratio deviates too much from 1, then nodes will get
|
|
// clipped as view rotates
|
|
if( m_winSize.width >= m_winSize.height )
|
|
{
|
|
pNodeDim->x = m_numDiv - 1;
|
|
pNodeDim->y = (int) (pNodeDim->x / m_aspectRatio) ;
|
|
if( pNodeDim->y < 1 )
|
|
pNodeDim->y = 1;
|
|
pNodeDim->z = pNodeDim->x;
|
|
}
|
|
else
|
|
{
|
|
pNodeDim->y = m_numDiv - 1;
|
|
pNodeDim->x = (int) (m_aspectRatio * pNodeDim->y);
|
|
if( pNodeDim->x < 1 )
|
|
pNodeDim->x = 1;
|
|
pNodeDim->z = pNodeDim->y;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: SetWinSize
|
|
// Desc: Set the window size for the view, derive other view params.
|
|
// Return FALSE if new size same as old.
|
|
//-----------------------------------------------------------------------------
|
|
BOOL VIEW::SetWinSize( int width, int height )
|
|
{
|
|
if( (width == m_winSize.width) &&
|
|
(height == m_winSize.height) )
|
|
return FALSE;
|
|
|
|
m_winSize.width = width;
|
|
m_winSize.height = height;
|
|
|
|
m_aspectRatio = m_winSize.height == 0 ? 1.0f : (float)m_winSize.width/m_winSize.height;
|
|
|
|
if( m_winSize.width >= m_winSize.height )
|
|
{
|
|
m_world.x = m_numDiv * m_divSize;
|
|
m_world.y = m_world.x / m_aspectRatio;
|
|
m_world.z = m_world.x;
|
|
}
|
|
else
|
|
{
|
|
m_world.y = m_numDiv * m_divSize;
|
|
m_world.x = m_world.y * m_aspectRatio;
|
|
m_world.z = m_world.y;
|
|
}
|
|
|
|
m_persp.zFar = m_viewDist + m_world.z*2;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: SetSceneRotation
|
|
// Desc:
|
|
//-----------------------------------------------------------------------------
|
|
void VIEW::IncrementSceneRotation()
|
|
{
|
|
m_yRot += 9.73156f;
|
|
if( m_yRot >= 360.0f )
|
|
// prevent overflow
|
|
m_yRot -= 360.0f;
|
|
}
|