This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/LevelEdit/GeneratingManualVisDialog.cpp

297 lines
7.6 KiB
C++

/*
** 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/>.
*/
// GeneratingManualVisDialog.cpp : implementation file
//
#include "stdafx.h"
#include "leveledit.h"
#include "generatingmanualvisdialog.h"
#include "utils.h"
#include "leveleditview.h"
#include "vismgr.h"
#include "sceneeditor.h"
#include "nodemgr.h"
#include "vispointnode.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//
// GeneratingManualVisDialogClass
//
/////////////////////////////////////////////////////////////////////////////
GeneratingManualVisDialogClass::GeneratingManualVisDialogClass(CWnd* pParent /*=NULL*/)
: m_FarmMode (false),
m_Stop (false),
m_TotalPoints (0),
m_TotalTime (0),
m_CurrentPoint (0),
m_StartTime (0),
m_TotalProcessors (0),
m_ProcessorIndex (0),
CDialog(GeneratingManualVisDialogClass::IDD, pParent)
{
//{{AFX_DATA_INIT(GeneratingManualVisDialogClass)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
//
// Determine the section of the status file
//
DWORD process_id = ::GetCurrentProcessId ();
m_StatusSection.Format ("%d", process_id);
//
// Get the installation directory of this application
//
TCHAR exe_path[MAX_PATH] = { 0 };
::GetModuleFileName (::AfxGetInstanceHandle (), exe_path, sizeof (exe_path));
CString path = ::Strip_Filename_From_Path (exe_path);
if (path[::lstrlen(path)-1] != '\\') {
path += "\\";
}
m_StatusFilename = path + "status.vis";
::WritePrivateProfileString ("Status", m_StatusSection, "Manual Vis Render", m_StatusFilename);
return ;
}
/////////////////////////////////////////////////////////////////////////////
//
// DoDataExchange
//
/////////////////////////////////////////////////////////////////////////////
void
GeneratingManualVisDialogClass::DoDataExchange (CDataExchange *pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(GeneratingManualVisDialogClass)
DDX_Control(pDX, IDC_PROGRESS_CTRL, m_ProgressCtrl);
//}}AFX_DATA_MAP
return ;
}
BEGIN_MESSAGE_MAP(GeneratingManualVisDialogClass, CDialog)
//{{AFX_MSG_MAP(GeneratingManualVisDialogClass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// OnInitDialog
//
/////////////////////////////////////////////////////////////////////////////
BOOL
GeneratingManualVisDialogClass::OnInitDialog (void)
{
CDialog::OnInitDialog ();
m_ProgressCtrl.SetRange (0, 100);
m_ProgressCtrl.SetPos (0);
ShowWindow (SW_SHOW);
PostMessage (WM_USER + 101);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
//
// WindowProc
//
/////////////////////////////////////////////////////////////////////////////
LRESULT
GeneratingManualVisDialogClass::WindowProc
(
UINT message,
WPARAM wParam,
LPARAM lParam
)
{
if (message == WM_USER + 101) {
::Get_Main_View ()->Allow_Repaint (false);
//
// Set-up the render statistics variables
//
m_TotalPoints = Get_Manual_Point_Count ();
m_CurrentPoint = 0;
m_StartTime = ::GetTickCount();
//
// Render the manual vis points
//
VisMgrClass::Render_Manual_Vis_Points (m_FarmMode, m_ProcessorIndex, m_TotalProcessors, ManualVisPointCallback, (DWORD)this);
::Get_Main_View ()->Allow_Repaint (true);
EndDialog (IDOK);
}
return CDialog::WindowProc (message, wParam, lParam);
}
//////////////////////////////////////////////////////////////////////////////
//
// On_Manual_Vis_Point_Render
//
//////////////////////////////////////////////////////////////////////////////
bool
GeneratingManualVisDialogClass::On_Manual_Vis_Point_Render (DWORD milliseconds)
{
//
// Update our stats
//
m_CurrentPoint ++;
m_TotalTime += milliseconds;
Update_Time ();
//
// Process window's messages once a second
//
static DWORD last_message_pump = 0;
if (::GetTickCount () - last_message_pump > 1000) {
General_Pump_Messages ();
last_message_pump = ::GetTickCount ();
//
// Output our current status to the status file
//
if (m_FarmMode) {
CString status;
status.Format ("Manual Points: %d%%", int(((m_CurrentPoint + 1) * 100) / m_TotalPoints));
::WritePrivateProfileString ("Status", m_StatusSection, status, m_StatusFilename);
}
}
return !m_Stop;
}
//////////////////////////////////////////////////////////////////////////////
//
// Get_Manual_Point_Count
//
//////////////////////////////////////////////////////////////////////////////
int
GeneratingManualVisDialogClass::Get_Manual_Point_Count (void)
{
int total = 0;
//
// Count up the total number of manual points in the level
//
VisPointNodeClass *vis_point = NULL;
for ( vis_point = (VisPointNodeClass *)NodeMgrClass::Get_First (NODE_TYPE_VIS_POINT);
vis_point != NULL && !m_Stop;
vis_point = (VisPointNodeClass *)NodeMgrClass::Get_Next (vis_point, NODE_TYPE_VIS_POINT))
{
total ++;
}
return total;
}
//////////////////////////////////////////////////////////////////////////////
//
// ManualVisPointCallback
//
//////////////////////////////////////////////////////////////////////////////
bool
GeneratingManualVisDialogClass::ManualVisPointCallback (DWORD milliseconds, DWORD param)
{
bool retval = true;
//
// Hand this notification onto the dialog
//
if (param != 0) {
retval = ((GeneratingManualVisDialogClass *)param)->On_Manual_Vis_Point_Render (milliseconds);
}
return retval;
}
//////////////////////////////////////////////////////////////////////////////
//
// Update_Time
//
//////////////////////////////////////////////////////////////////////////////
void
GeneratingManualVisDialogClass::Update_Time (void)
{
//
// Compute the elapsed and estimated remaining time
//
DWORD cur_ticks = ::GetTickCount();
DWORD elapsed_ticks;
if (cur_ticks > m_StartTime) {
elapsed_ticks = cur_ticks - m_StartTime;
} else {
elapsed_ticks = 0xFFFFFFFF - m_StartTime + cur_ticks;
}
DWORD avg_ticks = elapsed_ticks / m_CurrentPoint;
DWORD remaining_ticks = (m_TotalPoints - m_CurrentPoint) * avg_ticks;
float elapsed_minutes = (float)elapsed_ticks / 60000.0f;
float remaining_minutes = (float)remaining_ticks / 60000.0f;
//
// Update the UI
//
CString status_text;
status_text.Format ("Rendering %d of %d points.", m_CurrentPoint + 1, m_TotalPoints);
SetDlgItemText (IDC_STATUS_TEXT, status_text);
CString elapsed_time_text;
elapsed_time_text.Format ("Elapsed: %.1f min. Remaining: %.1f min.",elapsed_minutes,remaining_minutes);
SetDlgItemText (IDC_ELAPSED_TIME_TEXT, elapsed_time_text);
m_ProgressCtrl.SetPos (((m_CurrentPoint + 1) * 100) / m_TotalPoints);
General_Pump_Messages ();
return ;
}
//////////////////////////////////////////////////////////////////////////////
//
// OnCancel
//
//////////////////////////////////////////////////////////////////////////////
void
GeneratingManualVisDialogClass::OnCancel (void)
{
m_Stop = true;
::EnableWindow (::GetDlgItem (m_hWnd, IDCANCEL), false);
CDialog::OnCancel ();
return ;
}