Leaked source code of windows server 2003
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.
|
|
//-----------------------------------------------------------------------------
// 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; }
|