📄 gemvipm.cpp
字号:
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 + -