⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gemvipm.cpp

📁 游戏编程精粹2第四章源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:


	return S_OK;
}




//-----------------------------------------------------------------------------
// Name: RestoreDeviceObjects()
// Desc: Initialize scene objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{

	// Let the outside world know what device we're using.
	g_pd3dDevice = m_pd3dDevice;


	m_pFont->RestoreDeviceObjects();


	// Start up DInput.
	HRESULT hr;
	hr = InitDirectInput( m_hWnd );



	// Set the transform matrices
	D3DXVECTOR3 vEyePt    = D3DXVECTOR3( 0.0f, 0.0f, 5.0f );
	D3DXVECTOR3 vLookatPt = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
	D3DXVECTOR3 vUpVec    = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
	D3DXMATRIX  matWorld;

	D3DXMatrixIdentity( &matWorld );
	D3DXMatrixLookAtLH( &m_matView, &vEyePt, &vLookatPt, &vUpVec );

	// Three different projection matrices for different purposes.
	FLOAT fAspect = m_d3dsdBackBuffer.Width / (FLOAT)m_d3dsdBackBuffer.Height;
	// For close-in work editing collapse orders.
	D3DXMatrixPerspectiveFovLH( &m_matProjClose, D3DX_PI/4, fAspect, 0.1f, 50.0f );
	// For close-in work plus a Zbias for the lines.
	D3DXMatrixPerspectiveFovLH( &m_matProjCloseZbias, D3DX_PI/4, fAspect, 0.1f + 0.001f, 50.0f + 0.001f );
	// For more distant viewing.
	D3DXMatrixPerspectiveFovLH( &m_matProjFar, D3DX_PI/4, fAspect, 1.0f, 500.0f );


	m_pd3dDevice->SetTransform( D3DTS_WORLD,      &matWorld );
	m_pd3dDevice->SetTransform( D3DTS_VIEW,       &m_matView );
	m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &m_matProjClose );

	// Set misc render states
	m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
	m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
	m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );


	// Make an example object.
	static BOOL bAlreadyDone = FALSE;
	if ( !bAlreadyDone )
	{
		// Only needs doing once, but annoyingly requires a D3D device to do the init.
		bAlreadyDone = TRUE;
		m_pObject->CreateTestObject(m_pd3dDevice);
		m_pObject->MakeCurrentObjectFromPerm();
	}


	// And make a few lights.
	D3DLIGHT8 light;
	light.Type = D3DLIGHT_DIRECTIONAL;
	D3DXCOLOR col = D3DXCOLOR ( 1.0f, 1.0f, 1.0f, 0.0f );
	light.Diffuse  = D3DXCOLOR ( 1.0f, 1.0f, 1.0f, 0.0f );
	light.Ambient  = D3DXCOLOR ( 0.0f, 0.0f, 0.0f, 0.0f );
	light.Specular = D3DXCOLOR ( 0.0f, 0.0f, 0.0f, 0.0f );
	D3DXVECTOR3 vec ( -1.0f, -1.0f, -1.0f );
	D3DXVec3Normalize ( &vec, &vec );
	light.Direction = vec;
	light.Position = D3DXVECTOR3 ( 0.0f, 0.0f, 0.0f );
	light.Falloff = 1.0f;
	light.Attenuation0 = 0.0f;
	light.Attenuation1 = 1.0f;
	light.Attenuation2 = 0.0f;
	light.Phi = 0.0f;
	light.Theta = 0.0f;

	m_pd3dDevice->SetLight ( 0, &light );
	m_pd3dDevice->LightEnable ( 0, TRUE );

	m_pd3dDevice->SetRenderState ( D3DRS_AMBIENT, 0x00101010 );

	D3DMATERIAL8 mat;
	mat.Ambient = D3DXCOLOR ( 1.0f, 1.0f, 1.0f, 0.0f );
	mat.Diffuse = D3DXCOLOR ( 1.0f, 1.0f, 1.0f, 0.0f );
	mat.Specular = D3DXCOLOR ( 0.5f, 0.5f, 0.5f, 0.0f );
	mat.Emissive= D3DXCOLOR ( 0.0f, 0.0f, 0.0f, 0.0f );
	mat.Power = 20.f;

	m_pd3dDevice->SetMaterial ( &mat );


	return S_OK;
}




//-----------------------------------------------------------------------------
// Name: InvalidateDeviceObjects()
// Desc: Called when the app is exiting, or the device is being changed,
//       this function deletes any device dependent objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InvalidateDeviceObjects()
{
    m_pFont->InvalidateDeviceObjects();


    FreeDirectInput();

	// Warn things that D3D is leaving now.
	for ( ObjectInstance *pOI = m_ObjectInstRoot.ListNext(); pOI != NULL; pOI = pOI->ListNext() )
	{
		pOI->AboutToChangeDevice();
	}

	// Let the outside world know.
	g_pd3dDevice = NULL;


    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: DeleteDeviceObjects()
// Desc: Called when the app is exiting, or the device is being changed,
//       this function deletes any device dependent objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::DeleteDeviceObjects()
{
    m_pFont->DeleteDeviceObjects();

    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: FinalCleanup()
// Desc: Called before the app exits, this function gives the app the chance
//       to cleanup after itself.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::FinalCleanup()
{

	ObjectInstance *pInst = m_ObjectInstRoot.ListNext();
	while ( pInst != NULL )
	{
		delete pInst;
		pInst = m_ObjectInstRoot.ListNext();
	}
	if ( m_pObject != NULL )
	{
		delete m_pObject;
		m_pObject = NULL;
	}

    SAFE_DELETE( m_pFont );
    return S_OK;
}




//-----------------------------------------------------------------------------
// Name: ConfirmDevice()
// Desc: Called during device intialization, this code checks the device
//       for some minimum set of capabilities
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::ConfirmDevice( D3DCAPS8* pCaps, DWORD dwBehavior, 
                                          D3DFORMAT Format )
{
	// Whatever - no special properties required.
	return S_OK;
}




//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: Message proc function to handle key and menu input
//-----------------------------------------------------------------------------
LRESULT CMyD3DApplication::MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam,
                                    LPARAM lParam )
{

	if( WM_ACTIVATE == uMsg )
	{
		// Free the mouse.
		SetExclusiveMode ( FALSE, hWnd );

		// sent when window changes active state
		if ( WA_INACTIVE == wParam )
		{
			g_bActive = FALSE;
		}
		else
		{
			g_bActive = TRUE;
		}

		// Set exclusive mode access to the mouse based on active state
		SetAcquire( hWnd );

		return TRUE;
	}
	else if ( ( WM_KEYDOWN == uMsg ) || ( WM_KEYUP == uMsg ) ||
			  ( WM_SYSKEYDOWN == uMsg ) || ( WM_SYSKEYUP == uMsg ) )
	{
		// Top bit (bit31) is current key status.
		if ( wParam == VK_CONTROL )
		{
			g_bKeyDownCtrl = ( ( lParam & 0x80000000 ) == 0 );
		}
		else if ( wParam == VK_SHIFT )
		{
			g_bKeyDownShift = ( ( lParam & 0x80000000 ) == 0 );
		}
	}
    if( uMsg == WM_COMMAND )
    {
        switch( LOWORD(wParam) )
        {
		case IDM_IGNORE_BACKFACING:
			m_bIgnoreBackFaced = !m_bIgnoreBackFaced;
			break;
		case IDM_VIPM_COLLAPSE_NEXT:
			m_iCreateThisManyCollapses = 0;
			if ( m_bCreateCollapseMode )
			{
				m_iFindBestErrorCountdown = 1;
				m_pObject->DoCollapse();
			}
			else
			{
				if ( m_bTargetErrorAutoGen )
				{
					m_fTargetErrorFactor *= 1.1f;
				}
				else
				{
					m_iTargetNumCollapses++;
				}
			}
			break;
		case IDM_VIPM_COLLAPSE_PREV:
			m_iCreateThisManyCollapses = 0;
			if ( m_bCreateCollapseMode )
			{
				m_iFindBestErrorCountdown = 1;
				m_pObject->UndoCollapse();
			}
			else
			{
				if ( m_bTargetErrorAutoGen )
				{
					m_fTargetErrorFactor /= 1.1f;
				}
				else
				{
					m_iTargetNumCollapses--;
					if ( m_iTargetNumCollapses < 0 )
					{
						m_iTargetNumCollapses = 0;
					}
				}
			}
			break;
		case IDM_VIPM_COLLAPSE_NEXT_10:
			m_iCreateThisManyCollapses = 0;
			if ( m_bCreateCollapseMode )
			{
				for ( int i = 10; i > 0; i-- )
				{
					m_pObject->DoCollapse();
				}
				m_iFindBestErrorCountdown = 1;
			}
			else
			{
				if ( m_bTargetErrorAutoGen )
				{
					m_fTargetErrorFactor *= 2.0f;
				}
				else
				{
					m_iTargetNumCollapses += 10;
				}
			}
			break;
		case IDM_VIPM_COLLAPSE_PREV_10:
			m_iCreateThisManyCollapses = 0;
			if ( m_bCreateCollapseMode )
			{
				for ( int i = 10; i > 0; i-- )
				{
					m_pObject->UndoCollapse();
				}
				m_iFindBestErrorCountdown = 1;
			}
			else
			{
				if ( m_bTargetErrorAutoGen )
				{
					m_fTargetErrorFactor /= 2.0f;
				}
				else
				{
					m_iTargetNumCollapses -= 10;
					if ( m_iTargetNumCollapses < 0 )
					{
						m_iTargetNumCollapses = 0;
					}
				}
			}
			break;
		case IDM_VIPM_COLLAPSE_ALL:
			m_iCreateThisManyCollapses = 0;
			if ( m_bCreateCollapseMode )
			{
				while ( m_pObject->DoCollapse() ){}
			}
			else
			{
				if ( m_bTargetErrorAutoGen )
				{
					// No equivalent - reset to standard.
					m_fTargetErrorFactor = 1.0f;
				}
				else
				{
					// No equivalent.
				}
			}
			break;
		case IDM_VIPM_COLLAPSE_NONE:
			m_iCreateThisManyCollapses = 0;
			if ( m_bCreateCollapseMode )
			{
				while ( m_pObject->UndoCollapse() ){}
			}
			else
			{
				if ( m_bTargetErrorAutoGen )
				{
					// No equivalent - reset to standard.
					m_fTargetErrorFactor = 1.0f;
				}
				else
				{
					m_iTargetNumCollapses = 0;
				}
			}
			break;
		case IDM_VIPM_COLLAPSE_DEL:
			m_iCreateThisManyCollapses = 0;
			if ( m_bCreateCollapseMode )
			{
				m_bCreateCollapseMode = TRUE;
				// Do all collapses.
				while ( m_pObject->DoCollapse() ){}
				// Delete the last collapse.
				m_pObject->BinEdgeCollapse();
				m_iFindBestErrorCountdown = 1;
			}
			break;

		case IDM_VIPM_COLLAPSE_DO_BEST:
			if ( m_bCreateCollapseMode )
			{
				if ( m_iCreateThisManyCollapses == 0 )
				{
					// Do a collapse.
					m_iCreateThisManyCollapses = 1;
				}
				else
				{
					// Already doing collapses - stop doing them.
					m_iCreateThisManyCollapses = 0;
				}
			}
			break;
		case IDM_VIPM_COLLAPSE_DO_BEST_ALL:
			if ( m_bCreateCollapseMode )
			{
				if ( m_iCreateThisManyCollapses == 0 )
				{
					// Do all the collapses you can (will automatically stop).
					m_iCreateThisManyCollapses = 1 << 30;
				}
				else
				{
					// Already doing collapses - stop doing them.
					m_iCreateThisManyCollapses = 0;
				}
			}
			break;

		case IDM_SLIDING_WINDOW_SHOW:
			m_bShowSlidingWindowInfo = !m_bShowSlidingWindowInfo;
			break;
		case IDM_CREATE_COLLAPSE_MODE:
			m_bCreateCollapseMode = !m_bCreateCollapseMode;
			// Stop doing any collapses.
			m_iCreateThisManyCollapses = 0;
			break;
		case IDM_SLIDING_WINDOW_INC:
			m_fSlidingWindowErrorTolerance *= 1.1f;
			break;
		case IDM_SLIDING_WINDOW_DEC:
			m_fSlidingWindowErrorTolerance /= 1.1f;
			break;

		case IDM_VIPM_TYPE_NEXT:
			{
				m_vteCurrentDisplayStyle = (VIPMTypeEnum)( ((int)m_vteCurrentDisplayStyle) + 1 );
				if ( m_vteCurrentDisplayStyle == VIPMType_Last )
				{
					m_vteCurrentDisplayStyle = VIPMType_Vanilla;
				}

				for ( ObjectInstance *pOI = m_ObjectInstRoot.ListNext(); pOI != NULL; pOI = pOI->ListNext() )
				{
					pOI->iRenderMethod = m_vteCurrentDisplayStyle;
				}
			}

			break;


		case IDM_TARGET_AUTO_TOGGLE:
			m_bTargetErrorAutoGen = !m_bTargetErrorAutoGen;
			break;

		case IDM_SHOW_VIPM_INFO:
			if ( !m_bCreateCollapseMode )
			{
				// Toggle info on and off.
				g_bShowVIPMInfo = !g_bShowVIPMInfo;
				// And we need to dirty everything.
				for ( ObjectInstance *pOI = m_ObjectInstRoot.ListNext(); pOI != NULL; pOI = pOI->ListNext() )
				{
					pOI->pObj->MarkAsDirty();
				}
			}
			break;

		case IDM_WIREFRAME:
			m_bWireframe = !m_bWireframe;
			break;


		case IDM_CACHE_DISPLAY_ENABLE:
			g_iMaxNumTrisDrawn = -g_iMaxNumTrisDrawn;
			break;

		case IDM_CACHE_OPTIMISE_CHEAP:
			g_bUseFastButBadOptimise = !g_bUseFastButBadOptimise;
			break;

		case IDM_CACHE_DISPLAY_INC:
			if ( g_iMaxNumTrisDrawn > 0 )
			{
				g_iMaxNumTrisDrawn++;
			}
			break;
		case IDM_CACHE_DISPLAY_DEC:
			if ( g_iMaxNumTrisDrawn > 1 )
			{
				g_iMaxNumTrisDrawn--;
			}
			break;
		case IDM_CACHE_DISPLAY_INC_10:
			if ( g_iMaxNumTrisDrawn > 0 )
			{
				g_iMaxNumTrisDrawn += 10;
			}
			break;
		case IDM_CACHE_DISPLAY_DEC_10:
			if ( g_iMaxNumTrisDrawn > 1 )
			{
				g_iMaxNumTrisDrawn -= 10;
				if ( g_iMaxNumTrisDrawn < 1 )
				{
					g_iMaxNumTrisDrawn = 1;
				}
			}
			break;

		case IDM_CACHE_OPTIMISE:
			g_bOptimiseVertexOrder = !g_bOptimiseVertexOrder;
			break;

        }

		SetMenuItems();

    }


	switch ( uMsg )
	{
	case WM_MOUSELEAVE:
	case WM_MOUSEMOVE:
	case WM_MOUSEHOVER:
	case WM_KEYDOWN:
	case WM_KEYUP:
#if 0
	case WM_MOUSELEFTDOWN:
	case WM_MOUSERIGHTDOWN:
	case WM_MOUSELEFTUP:
	case WM_MOUSERIGHTUP:
	case WM_MOUSEWHEEL:
#endif
	case WM_LBUTTONDOWN  :
	case WM_LBUTTONUP    :
	case WM_LBUTTONDBLCLK:
	case WM_RBUTTONDOWN  :
	case WM_RBUTTONUP    :
	case WM_RBUTTONDBLCLK:
	case WM_MBUTTONDOWN  :
	case WM_MBUTTONUP    :
	case WM_MBUTTONDBLCLK:
	case WM_NCHITTEST:
	case WM_CONTEXTMENU:
	case WM_SETCURSOR:
		// Don't free the mouse - these happen when moving.
		break;
	default:
		// Free the mouse, just in case.
		SetExclusiveMode ( FALSE, hWnd );
		break;
	}


    return CD3DApplication::MsgProc( hWnd, uMsg, wParam, lParam );
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -