/* Copyright (c) 2002-2012 Croteam Ltd. This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ // MainFrm.cpp : implementation of the CMainFrame class // #include "stdafx.h" #include #ifdef _DEBUG #undef new #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ENGINE_API extern INDEX snd_iFormat; ///////////////////////////////////////////////////////////////////////////// // CMainFrame extern UINT APIENTRY ModelerFileRequesterHook( HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam); IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd) BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_WM_CLOSE() ON_COMMAND(ID_VIEW_ANIMCONTROL, OnViewAnimControl) ON_UPDATE_COMMAND_UI(ID_VIEW_ANIMCONTROL, OnUpdateViewAnimControl) ON_UPDATE_COMMAND_UI(ID_VIEW_INFO, OnUpdateShowInfo) ON_COMMAND(ID_VIEW_INFO, OnViewInfo) ON_COMMAND(ID_VIEW_COLOR_PALETTE, OnViewColorPalette) ON_UPDATE_COMMAND_UI(ID_VIEW_COLOR_PALETTE, OnUpdateViewColorPalette) ON_COMMAND(ID_FILE_CREATE_TEXTURE, OnFileCreateTexture) ON_COMMAND(ID_VIEW_TEXTURECONTROL, OnViewTexturecontrol) ON_UPDATE_COMMAND_UI(ID_VIEW_TEXTURECONTROL, OnUpdateViewTexturecontrol) ON_COMMAND(ID_VIEW_MIPLIGHTCONTROL, OnViewMiplightcontrol) ON_UPDATE_COMMAND_UI(ID_VIEW_MIPLIGHTCONTROL, OnUpdateViewMiplightcontrol) ON_COMMAND(ID_VIEW_SCRIPTCONTROL, OnViewScriptcontrol) ON_UPDATE_COMMAND_UI(ID_VIEW_SCRIPTCONTROL, OnUpdateViewScriptcontrol) ON_COMMAND(ID_VIEW_RENDERCONTROL, OnViewRendercontrol) ON_UPDATE_COMMAND_UI(ID_VIEW_RENDERCONTROL, OnUpdateViewRendercontrol) ON_WM_CANCELMODE() ON_WM_INITMENU() ON_COMMAND(ID_VIEW_STAINSCONTROL, OnViewStainscontrol) ON_UPDATE_COMMAND_UI(ID_VIEW_STAINSCONTROL, OnUpdateViewStainscontrol) ON_COMMAND(ID_STAINS_ADD, OnStainsAdd) ON_COMMAND(ID_STAINS_REMOVE, OnStainsRemove) ON_COMMAND(ID_VIEW_PATCHES_PALETTE, OnViewPatchesPalette) ON_UPDATE_COMMAND_UI(ID_STAINS_REMOVE, OnUpdateStainsRemove) ON_COMMAND(ID_VIEW_ROTATE, OnViewRotate) ON_UPDATE_COMMAND_UI(ID_VIEW_ROTATE, OnUpdateViewRotate) ON_COMMAND(ID_TOGGLE_ALL_BARS, OnToggleAllBars) ON_COMMAND(ID_VIEW_MAPPING, OnViewMapping) ON_UPDATE_COMMAND_UI(ID_VIEW_MAPPING, OnUpdateViewMapping) ON_WM_ACTIVATEAPP() ON_COMMAND(ID_EDIT_SPECULAR, OnEditSpecular) ON_COMMAND(ID_CREATE_REFLECTION_TEXTURE, OnCreateReflectionTexture) ON_COMMAND(ID_HELP_FINDER, OnHelpFinder) ON_COMMAND(ID_VIEW_FXCONTROL, OnViewFxcontrol) ON_UPDATE_COMMAND_UI(ID_VIEW_FXCONTROL, OnUpdateViewFxcontrol) ON_COMMAND(ID_WINDOW_TOGGLEMAX, OnWindowTogglemax) ON_COMMAND(ID_TESSELLATE_LESS, OnTessellateLess) ON_COMMAND(ID_TESSELLATE_MORE, OnTessellateMore) //}}AFX_MSG_MAP // Global help commands - modified to use html-help //ON_COMMAND(ID_HELP_FINDER, CMDIFrameWnd::OnHelpFinder) ON_COMMAND(ID_DEFAULT_HELP, OnHelpFinder) ON_COMMAND(ID_HELP, OnHelpFinder) ON_COMMAND(ID_CONTEXT_HELP, CMDIFrameWnd::OnContextHelp) END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // sets message for modeler's "new progress dialog" void SetProgressMessage( char *strMessage) { CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd()); pMainFrame->m_NewProgress.m_strNewMessage = CTString( strMessage); pMainFrame->m_NewProgress.UpdateData( FALSE); } // sets range of modeler's "new progress dialog" void SetProgressRange( INDEX iProgresSteps) { CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd()); pMainFrame->m_NewProgress.m_NewProgressLine.SetRange( 0, (short)iProgresSteps); } // sets current modeler's "new progress dialog" state void SetProgressState( INDEX iCurrentStep) { CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd()); pMainFrame->m_NewProgress.m_NewProgressLine.SetPos( iCurrentStep); } ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { m_pInfoFrame = NULL; m_dlgPaletteDialog = NULL; m_dlgPatchesPalette = NULL; ProgresRoutines.SetProgressMessage = SetProgressMessage; ProgresRoutines.SetProgressRange = SetProgressRange; ProgresRoutines.SetProgressState = SetProgressState; } CMainFrame::~CMainFrame() { // if exists, destroy palette dialog if( m_dlgPaletteDialog != NULL) delete( m_dlgPaletteDialog); if( m_dlgPatchesPalette != NULL) delete m_dlgPatchesPalette; } int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { const int nDropHeight = 100; // set same styles for use with all toolbars DWORD dwToolBarStyles = WS_CHILD | WS_VISIBLE | CBRS_SIZE_DYNAMIC | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_GRIPPER; CRect rectDummy(0,0,0,0); if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if( (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_MAIN)) || (!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) ) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create main tool bar } if( (!m_wndStatusBar.Create(this, WS_CHILD|WS_VISIBLE|CBRS_BOTTOM, IDW_STATUS_BAR)) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)) ) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } if( (!m_AnimToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_ANIMATION)) || (!m_AnimToolBar.LoadToolBar(IDR_ANIMCONTROL)) ) { TRACE0("Failed to create animation toolbar\n"); return -1; // fail to create animation tool bar } if( (!m_TextureToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_TEXTURE)) || (!m_TextureToolBar.LoadToolBar(IDR_TEXTURECONTROL)) ) { TRACE0("Failed to create texture toolbar\n"); return -1; // fail to create texture tool bar } if( (!m_FXToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_FX)) || (!m_FXToolBar.LoadToolBar(IDR_FX_CONTROL)) ) { TRACE0("Failed to create FX toolbar\n"); return -1; // fail to create fx tool bar } if( (!m_StainsToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_STAINS)) || (!m_StainsToolBar.LoadToolBar(IDR_STAINSCONTROL)) ) { TRACE0("Failed to create stains toolbar\n"); return -1; // fail to create stains tool bar } if( (!m_ScriptToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_SCRIPT)) || (!m_ScriptToolBar.LoadToolBar(IDR_SCRIPTCONTROL)) ) { TRACE0("Failed to create script toolbar\n"); return -1; // fail to create script tool bar } if( (!m_MipAndLightToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_MIP_AND_LIGHT)) || (!m_MipAndLightToolBar.LoadToolBar(IDR_MIPANDLIGHT)) ) { TRACE0("Failed to create mip and light toolbar\n"); return -1; // fail to create mip and light tool bar } if( (!m_RenderControlBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_RENDER)) || (!m_RenderControlBar.LoadToolBar(IDR_RENDERCONTROL)) ) { TRACE0("Failed to create render control toolbar\n"); return -1; // fail to create render control tool bar } static UINT aidRenderControlBar[15] = { ID_REND_BBOX_FRAME, ID_REND_BBOX_ALL, ID_REND_WIRE_ONOFF, ID_REND_HIDDEN_LINES, ID_REND_FLOOR, ID_REND_NO_TEXTURE, ID_REND_WHITE_TEXTURE, ID_REND_SURFACE_COLORS, ID_REND_ON_COLORS, ID_REND_OFF_COLORS, ID_REND_USE_TEXTURE, ID_SHADOW_WORSE, ID_SHADOW_BETTER, ID_TOGGLE_MEASURE_VTX, ID_VIEW_AXIS, }; m_RenderControlBar.SetButtons( aidRenderControlBar, 15); if( (!m_RotateToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_ROTATION)) || (!m_RotateToolBar.LoadToolBar(IDR_ROTATE)) ) { TRACE0("Failed to create rotate surface control toolbar\n"); return -1; // fail to create rotate control tool bar } if( (!m_MappingToolBar.CreateEx(this, TBSTYLE_FLAT, dwToolBarStyles, rectDummy, IDW_TOOLBAR_MAPPING)) || (!m_MappingToolBar.LoadToolBar(IDR_MAPPING)) ) { TRACE0("Failed to create mapping control toolbar\n"); return -1; // fail to create mapping control tool bar } // Set z-speed edit ctrl m_AnimToolBar.SetButtonInfo(0, ID_Z_SPEED, TBBS_SEPARATOR, 40); CRect rectEditSpeed; m_AnimToolBar.GetItemRect(0, &rectEditSpeed); rectEditSpeed.top = 2; rectEditSpeed.right -= 2; rectEditSpeed.bottom = rectEditSpeed.top + 18; if (!m_ctrlZSpeed.Create( WS_VISIBLE|WS_BORDER, rectEditSpeed, &m_AnimToolBar, ID_Z_SPEED) ) { TRACE0("Failed to create model speed edit control\n"); return FALSE; } m_ctrlZSpeed.SetWindowText(L"0"); // Set z-loop edit ctrl m_AnimToolBar.SetButtonInfo(1, ID_Z_LOOP_TIMES, TBBS_SEPARATOR, 25); CRect rectEditLoop; m_AnimToolBar.GetItemRect(1, &rectEditLoop); rectEditLoop.top = 2; rectEditLoop.bottom = rectEditLoop.top + 18; if (!m_ctrlZLoop.Create( WS_VISIBLE|WS_BORDER, rectEditLoop, &m_AnimToolBar, ID_Z_LOOP_TIMES) ) { TRACE0("Failed to create model loop edit control\n"); return FALSE; } m_ctrlZLoop.SetWindowText(L"4"); m_AnimToolBar.SetButtonInfo(6, ID_ANIM_CHOOSE, TBBS_SEPARATOR, 150); m_TextureToolBar.SetButtonInfo(2, ID_TEXTURE_CHOOSE, TBBS_SEPARATOR, 150); m_StainsToolBar.SetButtonInfo(3, ID_STAINS_CHOOSE, TBBS_SEPARATOR, 150); CRect rect; m_AnimToolBar.GetItemRect(6, &rect); rect.top = 2; rect.bottom = rect.top + nDropHeight; if (!m_AnimComboBox.Create( CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL, rect, &m_AnimToolBar, ID_ANIM_CHOOSE)) { TRACE0("Failed to create animation combo-box\n"); return FALSE; } m_TextureToolBar.GetItemRect(2, &rect); rect.top = 2; rect.bottom = rect.top + nDropHeight; if (!m_SkinComboBox.Create( CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL, rect, &m_TextureToolBar, ID_TEXTURE_CHOOSE)) { TRACE0("Failed to create texture combo-box\n"); return FALSE; } m_StainsToolBar.GetItemRect(3, &rect); rect.top = 2; rect.bottom = rect.top + nDropHeight; if (!m_StainsComboBox.Create( CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL, rect, &m_StainsToolBar, ID_STAINS_CHOOSE)) { TRACE0("Failed to create stains combo-box\n"); return FALSE; } m_AnimComboBox.AddString( L"None available"); m_AnimComboBox.SetCurSel( 0); m_SkinComboBox.AddString( L"None available"); m_SkinComboBox.SetCurSel( 0); m_StainsComboBox.AddString( L"None available"); m_StainsComboBox.SetCurSel( 0); // Create a font for the comboboxes LOGFONT logFont; memset(&logFont, 0, sizeof(logFont)); if (!::GetSystemMetrics(SM_DBCSENABLED)) { logFont.lfHeight = -11; logFont.lfWeight = FW_REGULAR; logFont.lfPitchAndFamily = FF_ROMAN; logFont.lfOrientation = 10; logFont.lfQuality = PROOF_QUALITY; logFont.lfItalic = TRUE; CString strDefaultFont; strDefaultFont.LoadString(IDS_DEFAULT_ARIAL); lstrcpy(logFont.lfFaceName, strDefaultFont); if( !m_Font.CreateFontIndirect(&logFont)) TRACE0("Could Not create font for combo\n"); else { m_ctrlZSpeed.SetFont(&m_Font); m_ctrlZLoop.SetFont(&m_Font); m_AnimComboBox.SetFont(&m_Font); m_SkinComboBox.SetFont(&m_Font); m_StainsComboBox.SetFont(&m_Font); } } else { m_Font.Attach(::GetStockObject(SYSTEM_FONT)); m_ctrlZSpeed.SetFont(&m_Font); m_ctrlZLoop.SetFont(&m_Font); m_AnimComboBox.SetFont(&m_Font); m_SkinComboBox.SetFont(&m_Font); m_StainsComboBox.SetFont(&m_Font); } // create pane for closest surface UINT nID; UINT nStyle; int cxWidth; m_wndStatusBar.GetPaneInfo( CLOSEST_SURFACE_PANE, nID, nStyle, cxWidth); cxWidth = 160; m_wndStatusBar.SetPaneInfo( CLOSEST_SURFACE_PANE, nID, nStyle, cxWidth); EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_AnimToolBar.SetBarStyle(m_AnimToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_AnimToolBar.EnableDocking(CBRS_ALIGN_ANY); m_TextureToolBar.SetBarStyle(m_TextureToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_TextureToolBar.EnableDocking(CBRS_ALIGN_ANY); m_FXToolBar.SetBarStyle(m_FXToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_FXToolBar.EnableDocking(CBRS_ALIGN_ANY); m_StainsToolBar.SetBarStyle(m_StainsToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_StainsToolBar.EnableDocking(CBRS_ALIGN_ANY); m_ScriptToolBar.SetBarStyle(m_ScriptToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_ScriptToolBar.EnableDocking(CBRS_ALIGN_ANY); m_MipAndLightToolBar.SetBarStyle(m_MipAndLightToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_MipAndLightToolBar.EnableDocking(CBRS_ALIGN_ANY); m_RenderControlBar.SetBarStyle(m_RenderControlBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_RenderControlBar.EnableDocking(CBRS_ALIGN_ANY); m_RotateToolBar.SetBarStyle(m_RotateToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_RotateToolBar.EnableDocking(CBRS_ALIGN_ANY); m_MappingToolBar.SetBarStyle(m_MappingToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); m_MappingToolBar.EnableDocking(CBRS_ALIGN_ANY); RecalcLayout(); DockControlBar(&m_wndToolBar, AFX_IDW_DOCKBAR_TOP); DockControlBarRelativeTo(&m_AnimToolBar, &m_wndToolBar, 1, 0); DockControlBarRelativeTo(&m_TextureToolBar,&m_FXToolBar, 1, 0); DockControlBarRelativeTo(&m_FXToolBar,&m_AnimToolBar, 1, 0); DockControlBarRelativeTo(&m_ScriptToolBar,&m_wndToolBar, 0, 15); DockControlBarRelativeTo(&m_MipAndLightToolBar,&m_ScriptToolBar, 1, 0); DockControlBarRelativeTo(&m_RotateToolBar, &m_MipAndLightToolBar, 1, 0); DockControlBarRelativeTo(&m_MappingToolBar, &m_RotateToolBar, 1, 0); DockControlBarRelativeTo(&m_StainsToolBar,&m_MappingToolBar, 1, 0); DockControlBar(&m_RenderControlBar, AFX_IDW_DOCKBAR_LEFT); DockControlBarRelativeTo(&m_MappingToolBar, &m_RenderControlBar, 0, 1); LoadBarState(_T("General")); return 0; } BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE | WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_MAXIMIZE; //cs.style |= WS_MAXIMIZE; return CMDIFrameWnd::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CMDIFrameWnd::AssertValid(); } void CMainFrame::Dump(CDumpContext& dc) const { CMDIFrameWnd::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers void CMainFrame::OnClose() { SaveBarState(_T("General")); CMDIFrameWnd::OnClose(); } void CMainFrame::OnViewAnimControl() { BOOL bVisible = ((m_AnimToolBar.GetStyle() & WS_VISIBLE) != 0); ShowControlBar(&m_AnimToolBar, !bVisible, FALSE); RecalcLayout(); } void CMainFrame::OnUpdateViewAnimControl(CCmdUI* pCmdUI) { BOOL bVisible = ((m_AnimToolBar.GetStyle() & WS_VISIBLE) != 0); pCmdUI->SetCheck(bVisible); } void CMainFrame::OnWindowTogglemax() { BOOL bIfMaximized; CChildFrame *pActiveWnd = (CChildFrame *) MDIGetActive( &bIfMaximized); if( bIfMaximized) { MDIRestore( pActiveWnd); if( !pActiveWnd->m_bAllreadyUnmaximized) { pActiveWnd->MoveWindow( 0, 0, 256, 256); RECT rectClient; pActiveWnd->GetClientRect( &rectClient); PIX pixRightWidth = 256+256-rectClient.right+4; PIX pixRightHeight = 256+256-rectClient.bottom+4; pActiveWnd->MoveWindow( 0, 0, pixRightWidth, pixRightHeight); pActiveWnd->m_bAllreadyUnmaximized = TRUE; } } else { MDIMaximize( pActiveWnd); } theApp.m_chGlobal.MarkChanged(); } void CMainFrame::HideModelessInfoSheet() { ASSERT(m_pInfoFrame != NULL); m_pInfoFrame->ShowWindow(SW_HIDE); } void CMainFrame::OnUpdateShowInfo(CCmdUI* pCmdUI) { pCmdUI->Enable( TRUE); pCmdUI->SetCheck(!(m_pInfoFrame == NULL || !m_pInfoFrame->IsWindowVisible())); } void CMainFrame::OnViewInfo() { ToggleInfoWindow(); } void CMainFrame::OnViewColorPalette() { if( m_dlgPaletteDialog == NULL) // if doesn't exist, call create { m_dlgPaletteDialog = new CPaletteDialog(); ASSERT( m_dlgPaletteDialog != NULL); if( !m_dlgPaletteDialog->Create(IDD_COLORS_PALETTE)) return; CRect rectMainFrame, rectPalPos, rectNewPos; m_dlgPaletteDialog->GetWindowRect( rectPalPos); GetClientRect( rectMainFrame); rectNewPos.left = rectMainFrame.right - rectPalPos.Width() - 3; rectNewPos.right = rectNewPos.left + rectPalPos.Width(); if( m_pInfoFrame == NULL) { rectNewPos.top = TOOLS_INIT_TOP; } else { CRect rectInfo; m_pInfoFrame->GetWindowRect( rectInfo); rectNewPos.top = TOOLS_INIT_TOP + rectInfo.Height() + 1; } rectNewPos.bottom = rectNewPos.top + rectPalPos.Height(); m_dlgPaletteDialog->MoveWindow( rectNewPos, TRUE); } BOOL bVisible = ((m_dlgPaletteDialog->GetStyle() & WS_VISIBLE) != 0); if( !bVisible) // if dialog isn't visible, show it { m_dlgPaletteDialog->ShowWindow(SW_SHOW); } else // otherwise, hide it { m_dlgPaletteDialog->ShowWindow(SW_HIDE); } } void CMainFrame::OnUpdateViewColorPalette(CCmdUI* pCmdUI) { BOOL bVisible; if( m_dlgPaletteDialog == NULL) { bVisible = FALSE; } else { bVisible = (m_dlgPaletteDialog->GetStyle() & WS_VISIBLE) != 0; } pCmdUI->SetCheck( bVisible); } BOOL CMainFrame::OnIdle(LONG lCount) { // Call OnIdle for animation combo box m_AnimComboBox.OnIdle( lCount); // Call OnIdle for texture combo box m_SkinComboBox.OnIdle( lCount); // Call OnIdle for color palette dialog if( m_dlgPaletteDialog != NULL) { m_dlgPaletteDialog->OnIdle( lCount); } // Call OnIdle for info property sheet if( m_pInfoFrame != NULL) { m_pInfoFrame->m_pInfoSheet->OnIdle( lCount); } // Call OnIdle for patches dialog if( m_dlgPatchesPalette != NULL) { m_dlgPatchesPalette->OnIdle( lCount); } return TRUE; } void CMainFrame::OnFileCreateTexture() { CModelerView *pView = (CModelerView *) CModelerView::GetActiveView(); CModelerDoc *pDoc = NULL; if( pView != NULL) { pDoc = pView->GetDocument(); // setup create texture directory theApp.WriteProfileString(L"Scape", CString(KEY_NAME_CREATE_TEXTURE_DIR), CString(_fnmApplicationPath+pDoc->GetModelDirectory())); } // call create texture dialog CTFileName fnCreated = _EngineGUI.CreateTexture(); if( (fnCreated != "") && pDoc != NULL) { CTextureDataInfo *pNewTDI; try { pNewTDI = pDoc->m_emEditModel.AddTexture_t( fnCreated, pDoc->m_emEditModel.GetWidth(), pDoc->m_emEditModel.GetHeight() ); } catch( char *err_str) { AfxMessageBox( CString(err_str)); pNewTDI = NULL; } if( pNewTDI != NULL) { pDoc->SetModifiedFlag(); pView->m_ptdiTextureDataInfo = pNewTDI; // switch to texture mode pView->OnRendUseTexture(); } } } void CMainFrame::DockControlBarRelativeTo(CToolBar* Bar,CToolBar* LeftOf, int dx, int dy) { CRect rect; DWORD dw; UINT n; // get MFC to adjust the dimensions of all docked ToolBars // so that GetWindowRect will be accurate RecalcLayout(); LeftOf->GetWindowRect(&rect); rect.OffsetRect(dx, dy); dw=LeftOf->GetBarStyle(); n = 0; n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n; n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n; n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n; n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n; // When we take the default parameters on rect, DockControlBar will dock // each Toolbar on a seperate line. By calculating a rectangle, we in effect // are simulating a Toolbar being dragged to that location and docked. DockControlBar(Bar,n,&rect); } void CMainFrame::OnViewTexturecontrol() { BOOL bVisible = ((m_TextureToolBar.GetStyle() & WS_VISIBLE) != 0); ShowControlBar(&m_TextureToolBar, !bVisible, FALSE); RecalcLayout(); } void CMainFrame::OnUpdateViewTexturecontrol(CCmdUI* pCmdUI) { BOOL bVisible = ((m_TextureToolBar.GetStyle() & WS_VISIBLE) != 0); pCmdUI->SetCheck(bVisible); } void CMainFrame::OnViewFxcontrol() { BOOL bVisible = ((m_FXToolBar.GetStyle() & WS_VISIBLE) != 0); ShowControlBar(&m_FXToolBar, !bVisible, FALSE); RecalcLayout(); } void CMainFrame::OnUpdateViewFxcontrol(CCmdUI* pCmdUI) { BOOL bVisible = ((m_FXToolBar.GetStyle() & WS_VISIBLE) != 0); pCmdUI->SetCheck(bVisible); } void CMainFrame::OnViewStainscontrol() { BOOL bVisible = ((m_StainsToolBar.GetStyle() & WS_VISIBLE) != 0); ShowControlBar(&m_StainsToolBar, !bVisible, FALSE); RecalcLayout(); } void CMainFrame::OnUpdateViewStainscontrol(CCmdUI* pCmdUI) { BOOL bVisible = ((m_StainsToolBar.GetStyle() & WS_VISIBLE) != 0); pCmdUI->SetCheck(bVisible); } void CMainFrame::OnViewMiplightcontrol() { BOOL bVisible = ((m_MipAndLightToolBar.GetStyle() & WS_VISIBLE) != 0); ShowControlBar(&m_MipAndLightToolBar, !bVisible, FALSE); RecalcLayout(); } void CMainFrame::OnUpdateViewMiplightcontrol(CCmdUI* pCmdUI) { BOOL bVisible = ((m_MipAndLightToolBar.GetStyle() & WS_VISIBLE) != 0); pCmdUI->SetCheck(bVisible); } void CMainFrame::OnViewScriptcontrol() { BOOL bVisible = ((m_ScriptToolBar.GetStyle() & WS_VISIBLE) != 0); ShowControlBar(&m_ScriptToolBar, !bVisible, FALSE); RecalcLayout(); } void CMainFrame::OnUpdateViewScriptcontrol(CCmdUI* pCmdUI) { { BOOL bVisible = ((m_ScriptToolBar.GetStyle() & WS_VISIBLE) != 0); pCmdUI->SetCheck(bVisible); } } void CMainFrame::OnViewRendercontrol() { BOOL bVisible = ((m_RenderControlBar.GetStyle() & WS_VISIBLE) != 0); ShowControlBar(&m_RenderControlBar, !bVisible, FALSE); RecalcLayout(); } void CMainFrame::OnUpdateViewRendercontrol(CCmdUI* pCmdUI) { BOOL bVisible = ((m_RenderControlBar.GetStyle() & WS_VISIBLE) != 0); pCmdUI->SetCheck(bVisible); } static BOOL _bSoundEnabled = FALSE; void CMainFrame::EnableSound(void) { if( _bSoundEnabled || !theApp.m_Preferences.ap_bAllowSoundLock) return; _bSoundEnabled = TRUE; snd_iFormat = Clamp( snd_iFormat, (INDEX)CSoundLibrary::SF_NONE, (INDEX)CSoundLibrary::SF_44100_16); _pSound->SetFormat( (enum CSoundLibrary::SoundFormat)snd_iFormat); } void CMainFrame::DisableSound(void) { //if( !_bSoundEnabled) return; _bSoundEnabled = FALSE; _pSound->SetFormat( CSoundLibrary::SF_NONE); } void CMainFrame::OnCancelMode() { DisableSound(); CMDIFrameWnd::OnCancelMode(); } void CMainFrame::OnInitMenu(CMenu* pMenu) { CMDIFrameWnd::OnInitMenu(pMenu); } void CMainFrame::OnStainsAdd() { // call file requester for opening documents CDynamicArray afnWorkingStains; _EngineGUI.FileRequester( "Choose textures to add", FILTER_TEX FILTER_END, "Working textures directory", "Textures\\", "", &afnWorkingStains); // insert selected textures FOREACHINDYNAMICARRAY( afnWorkingStains, CTFileName, itStain) { // add new working texture theApp.AddModelerWorkingPatch( itStain.Current()); } m_StainsComboBox.Refresh(); } void CMainFrame::OnStainsRemove() { CWorkingPatch *pWP = NULL; int iSelected = m_StainsComboBox.GetCurSel(); if( iSelected != CB_ERR) { INDEX iCt = 0; FOREACHINLIST( CWorkingPatch, wp_ListNode, theApp.m_WorkingPatches, it) { if( iCt == iSelected) { pWP = &it.Current(); } iCt ++; } } ASSERT(pWP != NULL); pWP->wp_ListNode.Remove(); _pTextureStock->Release( pWP->wp_TextureData); delete pWP; m_StainsComboBox.Refresh(); } void CMainFrame::OnUpdateStainsRemove(CCmdUI* pCmdUI) { pCmdUI->Enable( !theApp.m_WorkingPatches.IsEmpty()); } void CMainFrame::OnViewPatchesPalette() { if( m_dlgPatchesPalette == NULL) // if doesn't exist, call create { m_dlgPatchesPalette = new CPatchPalette(); ASSERT( m_dlgPatchesPalette != NULL); if( !m_dlgPatchesPalette->Create(IDD_PATCH_PALETTE)) return; CRect rectMainFrame, rectPalPos, rectNewPos; m_dlgPatchesPalette->GetWindowRect( rectPalPos); GetClientRect( rectMainFrame); rectNewPos.left = rectMainFrame.right - rectPalPos.Width() - 3; rectNewPos.right = rectNewPos.left + rectPalPos.Width(); rectNewPos.top = TOOLS_INIT_TOP; if( m_pInfoFrame != NULL) { CRect rectInfo; m_pInfoFrame->GetWindowRect( rectInfo); rectNewPos.top += rectInfo.Height() + 1; } if( m_dlgPaletteDialog != NULL) { CRect rectInfo; m_dlgPaletteDialog->GetWindowRect( rectInfo); rectNewPos.top += rectInfo.Height() + 1; } rectNewPos.bottom = rectNewPos.top + rectPalPos.Height(); m_dlgPatchesPalette->MoveWindow( rectNewPos, TRUE); } BOOL bVisible = ((m_dlgPatchesPalette->GetStyle() & WS_VISIBLE) != 0); if( !bVisible) // if dialog isn't visible, show it { m_dlgPatchesPalette->ShowWindow(SW_SHOW); } else // otherwise, hide it { m_dlgPatchesPalette->ShowWindow(SW_HIDE); } } void CMainFrame::OnViewRotate() { BOOL bVisible = ((m_RotateToolBar.GetStyle() & WS_VISIBLE) != 0); ShowControlBar(&m_RotateToolBar, !bVisible, FALSE); RecalcLayout(); } void CMainFrame::OnUpdateViewRotate(CCmdUI* pCmdUI) { BOOL bVisible = ((m_RotateToolBar.GetStyle() & WS_VISIBLE) != 0); pCmdUI->SetCheck(bVisible); } void CMainFrame::OnToggleAllBars() { ShowControlBar(&m_wndStatusBar, (m_wndStatusBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_wndToolBar, (m_wndToolBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_AnimToolBar, (m_AnimToolBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_TextureToolBar, (m_TextureToolBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_StainsToolBar, (m_StainsToolBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_ScriptToolBar, (m_ScriptToolBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_MipAndLightToolBar, (m_MipAndLightToolBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_RenderControlBar, (m_RenderControlBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_RotateToolBar, (m_RotateToolBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_MappingToolBar, (m_MappingToolBar.GetStyle() & WS_VISIBLE) == 0, FALSE); ShowControlBar(&m_FXToolBar, (m_FXToolBar.GetStyle() & WS_VISIBLE) == 0, FALSE); } void CMainFrame::OnViewMapping() { BOOL bVisible = ((m_MappingToolBar.GetStyle() & WS_VISIBLE) != 0); ShowControlBar(&m_MappingToolBar, !bVisible, FALSE); RecalcLayout(); } void CMainFrame::OnUpdateViewMapping(CCmdUI* pCmdUI) { BOOL bVisible = ((m_MappingToolBar.GetStyle() & WS_VISIBLE) != 0); pCmdUI->SetCheck(bVisible); } BOOL _bApplicationActive = TRUE; void CMainFrame::OnActivateApp(BOOL bActive, DWORD hTask) { _bApplicationActive = bActive; CMDIFrameWnd::OnActivateApp(bActive, hTask); if (!bActive) { DisableSound(); } } BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { BOOL bAltPressed = (GetKeyState( VK_MENU)&0x8000) != 0; // alt is pressed BOOL bAlt = FALSE; if( pMsg->message==WM_LBUTTONDOWN) { BOOL bHasDocument = FALSE; // check for models POSITION posMdl = theApp.m_pdtModelDocTemplate->GetFirstDocPosition(); while (posMdl!=NULL) { CModelerDoc *pdocCurrent = (CModelerDoc *)theApp.m_pdtModelDocTemplate->GetNextDoc(posMdl); bHasDocument = pdocCurrent!=NULL; } if( !bHasDocument) { // check for scripts POSITION posScr = theApp.m_pdtScriptTemplate->GetFirstDocPosition(); while (posScr!=NULL) { CModelerDoc *pdocCurrent = (CModelerDoc *)theApp.m_pdtScriptTemplate->GetNextDoc(posScr); bHasDocument = pdocCurrent!=NULL; } } BOOL bMainFrameHasFocus = (this == CWnd::GetForegroundWindow()); if( !bHasDocument && bMainFrameHasFocus) { static CTimerValue tvLast; static CPoint ptLast; CPoint ptNow; GetCursorPos( &ptNow); CTimerValue tvNow = _pTimer->GetHighPrecisionTimer(); FLOAT tmDelta = (tvNow-tvLast).GetSeconds(); if( tmDelta<0.5f && abs(ptNow.x-ptLast.x)<5 && abs(ptNow.y-ptLast.y)<5) { theApp.OnFileOpen(); } tvLast=tvNow; ptLast = ptNow; } } // if we caught alt key message if( pMsg->message==WM_SYSKEYDOWN) { // get key data int lKeyData = pMsg->lParam; // test if it is ghost Alt-F4 situation if( lKeyData & (1L<<29)) { // Alt key was really pressed bAlt = TRUE; } } if( (pMsg->message==WM_KEYDOWN) || bAlt) { int iVirtKey = (int) pMsg->wParam; int lKeyData = pMsg->lParam; if( DYNAMIC_DOWNCAST(CScriptView, GetActiveFrame()->GetActiveView())==NULL) { if( (iVirtKey == 'Q') && !bAltPressed) { ToggleInfoWindow(); } } } return CMDIFrameWnd::PreTranslateMessage(pMsg); } void CMainFrame::ToggleInfoWindow(void) { if( m_pInfoFrame == NULL) { // create frame for holding info sheet m_pInfoFrame = new CDlgInfoFrame; // set initial size of rect window CRect rectInfoWindow(0, 0, 0, 0); if( !m_pInfoFrame->Create( NULL, L"Tools info", MFS_SYNCACTIVE|WS_POPUP|WS_CAPTION|WS_SYSMENU, rectInfoWindow, this)) { TRACE0("Failed to create Tools info window!\n"); return; } } if (m_pInfoFrame != NULL) { if (!m_pInfoFrame->IsWindowVisible()) { m_pInfoFrame->ShowWindow(SW_SHOW); m_pInfoFrame->m_pInfoSheet->SetFocus(); CModelerView *pModelerView = CModelerView::GetActiveView(); if( (pModelerView != NULL) && (pModelerView->m_bCollisionMode) ) { m_pInfoFrame->m_pInfoSheet->CustomSetActivePage( &m_pInfoFrame->m_pInfoSheet->m_PgInfoCollision); } } else { m_pInfoFrame->ShowWindow(SW_HIDE); } } } void CMainFrame::OnEditSpecular() { CDlgCreateSpecularTexture dlgEditSpecular; dlgEditSpecular.DoModal(); } void CMainFrame::OnCreateReflectionTexture() { CDlgCreateReflectionTexture dlgEditReflection; dlgEditReflection.DoModal(); } LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { if( message==WM_SYSCOMMAND) { switch( wParam & ~0x0F) { case SC_SCREENSAVE: case SC_MONITORPOWER: return 0; } } return CMDIFrameWnd::DefWindowProc(message, wParam, lParam); } void CMainFrame::OnHelpFinder() { HtmlHelp(NULL); // Hmmm... /*HtmlHelp(NULL, _fnmApplicationPath+"Help\\ToolsHelp.chm::/SeriousModeler/Overview.htm", HH_DISPLAY_TOPIC, NULL);*/ } void CMainFrame::OnTessellateLess() { _pShell->SetINDEX( "gap_bForceTruform", 1); // make sure truform is enabled for all models INDEX iTruform = _pShell->GetINDEX( "gap_iTruformLevel"); iTruform = Clamp( iTruform-1L, 0L, _pGfx->gl_iMaxTessellationLevel); _pShell->SetINDEX( "gap_iTruformLevel", iTruform); CTString strVar; strVar.PrintF( "Tessellation level = %d", iTruform); m_wndStatusBar.SetPaneText( STATUS_LINE_PANE, CString(strVar)); } void CMainFrame::OnTessellateMore() { _pShell->SetINDEX( "gap_bForceTruform", 1); // make sure truform is enabled for all models INDEX iTruform = _pShell->GetINDEX( "gap_iTruformLevel"); iTruform = Clamp( iTruform+1L, 0L, _pGfx->gl_iMaxTessellationLevel); _pShell->SetINDEX( "gap_iTruformLevel", iTruform); CTString strVar; strVar.PrintF( "Tessellation level = %d", iTruform); m_wndStatusBar.SetPaneText( STATUS_LINE_PANE, CString(strVar)); }