windows-nt/Source/XPSP1/NT/shell/osshell/control/scrnsave/pipes/view.cpp
2020-09-26 16:20:57 +08:00

145 lines
4 KiB
C++

//-----------------------------------------------------------------------------
// 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;
}