| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** 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, see <http://www.gnu.org/licenses/>.
- */
- // W3DView.cpp : Defines the class behaviors for the application.
- //
- #include "stdafx.h"
- #include "w3dview.h"
- #include "mainfrm.h"
- #include "w3dviewdoc.h"
- #include "w3dviewview.h"
- #include "utils.h"
- #include "colorutils.h"
- #include "verchk.h"
- #include "wwmath.h"
- #include "wwaudio.h"
- #include "viewerassetmgr.h"
- #include "globals.h"
- #include "animatedsoundoptionsdialog.h"
- #include "animatedsoundmgr.h"
- #undef STRICT
- #include "ww3d.h"
- #include "AssetMgr.H"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- //
- // Local prototypes
- //
- BOOL CALLBACK fnTopLevelWindowSearch (HWND hwnd, LPARAM lParam);
- /////////////////////////////////////////////////////////////////////////////
- //
- // CW3DViewApp
- //
- BEGIN_MESSAGE_MAP(CW3DViewApp, CWinApp)
- //{{AFX_MSG_MAP(CW3DViewApp)
- ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
- // NOTE - the ClassWizard will add and remove mapping macros here.
- // DO NOT EDIT what you see in these blocks of generated code!
- //}}AFX_MSG_MAP
- // Standard file based document commands
- ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
- ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- //
- // CW3DViewApp construction
- //
- CW3DViewApp::CW3DViewApp (void)
- : m_bInitialized (false)
- {
- // TODO: add construction code here,
- // Place all significant initialization in InitInstance
- }
- /////////////////////////////////////////////////////////////////////////////
- // The one and only CW3DViewApp object
- CW3DViewApp theApp;
- extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow);
- int WINAPI
- WinMain
- (
- HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow
- )
- {
- int retcode = 0;
- #ifndef _DEBUG
- try
- {
- #endif //_DEBUG
- //::AfxWinInit (hInstance, hPrevInstance, lpCmdLine, nCmdShow);
- //::AfxInitialize (FALSE, _MFC_VER);
- AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
- pModuleState->m_bDLL = (BYTE)FALSE;
- #ifdef _MBCS
- // set correct multi-byte code-page for Win32 apps
- _setmbcp(_MB_CP_ANSI);
- #endif //_MBCS
- retcode = ::AfxWinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow);
- #ifndef _DEBUG
- }
- catch (...)
- {
- ::MessageBox (NULL, "Internal Application Error", "Unrecoverable Error", MB_ICONERROR | MB_OK);
- }
- #endif //_DEBUG
- return retcode;
- }
- ///////////////////////////////////////////////////////////////
- //
- // Do_Version_Check
- //
- ////////////////////////////////////////////////////////////
- void
- Do_Version_Check (void)
- {
- char curr_filename[MAX_PATH];
- ::GetModuleFileName (NULL, curr_filename, MAX_PATH);
- CString filename = "\\\\cabal\\mis\\r&d\\w3d\\w3dview\\";
- filename += ::Get_Filename_From_Path (curr_filename);
- //
- // Check the version of the viewer that is out on the network
- // against the version we are running.
- //
- if (Compare_EXE_Version ((int)::AfxGetInstanceHandle (), filename) < 0) {
- ::MessageBox (NULL, "There is a newer version of the W3DViewer, please run W3DUpdate to upgrade your local copy.", "Version Info", MB_ICONEXCLAMATION | MB_OK | MB_SETFOREGROUND | MB_SYSTEMMODAL);
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // InitInstance
- //
- BOOL CW3DViewApp::InitInstance (void)
- {
- // Standard initialization
- // If you are not using these features and wish to reduce the size
- // of your final executable, you should remove from the following
- // the specific initialization routines you do not need.
- #ifdef _AFXDLL
- Enable3dControls(); // Call this when using MFC in a shared DLL
- #else
- Enable3dControlsStatic(); // Call this when linking to MFC statically
- #endif
- Do_Version_Check ();
- RegisterColorPicker (::AfxGetInstanceHandle ());
- RegisterColorBar (::AfxGetInstanceHandle ());
- // Is there already an instance of the viewer running?
- HWND hprev_instance = NULL;
- ::EnumWindows (fnTopLevelWindowSearch, (LPARAM)&hprev_instance);
- if (hprev_instance == NULL) {
- // Change the registry key under which our settings are stored.
- // You should modify this string to be something appropriate
- // such as the name of your company or organization.
- SetRegistryKey(_T("Westwood Studios"));
-
- //
- // Load standard INI file options (including MRU)
- //
- LoadStdProfileSettings (9);
- //
- // Initialize the libraries
- //
- WWMath::Init ();
- AnimatedSoundOptionsDialogClass::Load_Animated_Sound_Settings ();
- //
- // Disable the 3DFX logo
- //
- _putenv ("FX_GLIDE_NO_SPLASH=1");
- // Register the application's document templates. Document templates
- // serve as the connection between documents, frame windows and views.
- CSingleDocTemplate* pDocTemplate;
- pDocTemplate = new CSingleDocTemplate(
- IDR_MAINFRAME,
- RUNTIME_CLASS(CW3DViewDoc),
- RUNTIME_CLASS(CMainFrame), // main SDI frame window
- RUNTIME_CLASS(CW3DViewView));
- AddDocTemplate(pDocTemplate);
- // Enable DDE Execute open
- EnableShellOpen();
- RegisterShellFileTypes(TRUE);
- // Parse command line for standard shell commands, DDE, file open
- CCommandLineInfo cmdInfo;
- ParseCommandLine(cmdInfo);
- //
- // Allocate an asset manager
- //
- _TheAssetMgr = new ViewerAssetMgrClass;
- // Dispatch commands specified on the command line
- if (!ProcessShellCommand(cmdInfo))
- return FALSE;
- // The one and only window has been initialized, so show and update it.
- m_pMainWnd->ShowWindow(SW_SHOW);
- m_pMainWnd->UpdateWindow();
- ::SetProp (*m_pMainWnd, "WW3DVIEWER", (HANDLE)1);
- // Enable drag/drop open
- m_pMainWnd->DragAcceptFiles();
- m_bInitialized = true;
- } else {
- // Make the previous instance in the foreground
- ::ShowWindow (hprev_instance, SW_NORMAL);
- ::BringWindowToTop (hprev_instance);
- ::SetForegroundWindow (hprev_instance);
- }
- return (hprev_instance == NULL);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CAboutDlg dialog used for App About
- class CAboutDlg : public CDialog
- {
- public:
- CAboutDlg();
- // Dialog Data
- //{{AFX_DATA(CAboutDlg)
- enum { IDD = IDD_ABOUTBOX };
- //}}AFX_DATA
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CAboutDlg)
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- //}}AFX_VIRTUAL
- // Implementation
- protected:
- //{{AFX_MSG(CAboutDlg)
- virtual BOOL OnInitDialog();
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
- {
- //{{AFX_DATA_INIT(CAboutDlg)
- //}}AFX_DATA_INIT
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CAboutDlg)
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
- //{{AFX_MSG_MAP(CAboutDlg)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- // App command to run the dialog
- void CW3DViewApp::OnAppAbout()
- {
- CAboutDlg aboutDlg;
- aboutDlg.DoModal();
- }
- /*
- **
- */
- void Debug_Refs(void)
- {
- #ifndef NDEBUG
- TRACE("Detecting Active Refs...\r\n");
- //ODS("At time %s", cMiscUtil::Get_Text_Time());
- RefCountNodeClass * first = RefCountClass::ActiveRefList.First();
- RefCountNodeClass * node = first;
- while (node->Is_Valid())
- {
- RefCountClass * obj = node->Get();
- ActiveRefStruct * ref = &(obj->ActiveRefInfo);
- bool display = true;
- int count = 0;
- RefCountNodeClass * search = first;
- while (search->Is_Valid()) {
- if (search == node) { // if this is not the first one
- if (count != 0) {
- display = false;
- break;
- }
- }
- RefCountClass * search_obj = search->Get();
- ActiveRefStruct * search_ref = &(search_obj->ActiveRefInfo);
- if ( ref->File && search_ref->File &&
- !strcmp(search_ref->File, ref->File) &&
- (search_ref->Line == ref->Line) ) {
- count++;
- } else if ( (ref->File == NULL) && (search_ref->File == NULL) ) {
- count++;
- }
- search = search->Next();
- }
- if ( display ) {
- TRACE ( "%d Active Ref: %s %d %p\n", count, ref->File,ref->Line,obj);
- static int num_printed = 0;
- if (++num_printed > 20) {
- TRACE( "And Many More......\n");
- break;
- }
- }
- node = node->Next();
- }
- TRACE("Done.\r\n");
- //ODS("At time %s", cMiscUtil::Get_Text_Time());
- #endif
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // CW3DViewApp
- //
- int
- CW3DViewApp::ExitInstance()
- {
- //
- // Free any resources the WW3D engine allocated
- //
- if (m_bInitialized) {
- //
- // Shutdown the audio system
- //
- WWAudioClass::Get_Instance ()->Shutdown ();
- //
- // Shutdown W3D
- //
- WW3DAssetManager::Get_Instance()->Free_Assets ();
- WW3D::Shutdown ();
- //
- // Shutdown the libraries
- //
- WWMath::Shutdown ();
- AnimatedSoundMgrClass::Shutdown ();
- //
- // Free the asset manager
- //
- delete _TheAssetMgr;
- _TheAssetMgr = NULL;
- }
- Debug_Refs ();
- return CWinApp::ExitInstance ();
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // fnTopLevelWindowSearch
- //
- BOOL CALLBACK
- fnTopLevelWindowSearch
- (
- HWND hwnd,
- LPARAM lParam
- )
- {
- BOOL bcontinue = TRUE;
- // Is this a viewer window?
- if (::GetProp (hwnd, "WW3DVIEWER") != 0) {
- bcontinue = false;
- (*((HWND *)lParam)) = hwnd;
- }
- // Return the TRUE/FALSE result code
- return bcontinue;
- }
- //////////////////////////////////////////////////////////////////////////////
- //
- // OnInitDialog
- //
- BOOL
- CAboutDlg::OnInitDialog (void)
- {
- // Allow the base class to process this message
- CDialog::OnInitDialog ();
- // Version 1.0 by default
- DWORD version_major = 1;
- DWORD version_minor = 0;
- // Get the name and path of the currently executing application
- TCHAR filename[MAX_PATH];
- ::GetModuleFileName (NULL, filename, sizeof (filename));
- // Get the version information for this file
- DWORD dummy_var = 0;
- DWORD version_size = ::GetFileVersionInfoSize (filename, &dummy_var);
- if (version_size > 0) {
- // Get the file version block
- LPBYTE pblock = new BYTE[version_size];
- if (::GetFileVersionInfo (filename, 0L, version_size, pblock)) {
- // Query the block for the file version information
- UINT version_len = 0;
- VS_FIXEDFILEINFO *pversion_info = NULL;
- if (::VerQueryValue (pblock, "\\", (LPVOID *)&pversion_info, &version_len)) {
- version_major = pversion_info->dwFileVersionMS;
- version_minor = pversion_info->dwFileVersionLS;
- }
- }
- SAFE_DELETE (pblock);
- }
-
- // Put the version string into the dialog
- CString version_string;
- version_string.Format (IDS_VERSION, (version_major >> 16), (version_major & 0xFFFF));
- SetDlgItemText (IDC_VERSION, version_string);
- return TRUE;
- }
|