276 lines
6.3 KiB
C++
276 lines
6.3 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/>.
|
||
|
*/
|
||
|
|
||
|
// PresetGeneralTab.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "leveledit.h"
|
||
|
#include "presetzonetab.h"
|
||
|
#include "definition.h"
|
||
|
#include "preset.h"
|
||
|
#include "utils.h"
|
||
|
#include "zoneeditdialog.h"
|
||
|
#include "objectnode.h"
|
||
|
#include "rendobj.h"
|
||
|
#include "SceneEditor.h"
|
||
|
#include "decophys.h"
|
||
|
#include "CollisionGroups.h"
|
||
|
#include "staticphys.h"
|
||
|
#include "zone.h"
|
||
|
#include "wheelvehicle.h"
|
||
|
#include "cameramgr.h"
|
||
|
#include "hlod.h"
|
||
|
#include "parameter.h"
|
||
|
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// Constants
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
const float DROP_POS = 5.0F;
|
||
|
const float DROP_HEIGHT = 5.0F;
|
||
|
|
||
|
const int COL_NAME = 0;
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// PresetZoneTabClass
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
PresetZoneTabClass::PresetZoneTabClass (PresetClass *preset)
|
||
|
: m_Preset (preset),
|
||
|
m_PhysObj (NULL),
|
||
|
m_ZoneList (NULL),
|
||
|
DockableFormClass(PresetZoneTabClass::IDD)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(PresetZoneTabClass)
|
||
|
// NOTE: the ClassWizard will add member initialization here
|
||
|
//}}AFX_DATA_INIT
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// ~PresetZoneTabClass
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
PresetZoneTabClass::~PresetZoneTabClass (void)
|
||
|
{
|
||
|
MEMBER_RELEASE (m_PhysObj);
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// DoDataExchange
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
PresetZoneTabClass::DoDataExchange (CDataExchange *pDX)
|
||
|
{
|
||
|
DockableFormClass::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(PresetZoneTabClass)
|
||
|
DDX_Control(pDX, IDC_ZONE_LIST, m_ListCtrl);
|
||
|
//}}AFX_DATA_MAP
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(PresetZoneTabClass, DockableFormClass)
|
||
|
//{{AFX_MSG_MAP(PresetZoneTabClass)
|
||
|
ON_NOTIFY(NM_DBLCLK, IDC_ZONE_LIST, OnDblclkZoneList)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
void PresetZoneTabClass::AssertValid() const
|
||
|
{
|
||
|
DockableFormClass::AssertValid();
|
||
|
}
|
||
|
|
||
|
void PresetZoneTabClass::Dump(CDumpContext& dc) const
|
||
|
{
|
||
|
DockableFormClass::Dump(dc);
|
||
|
}
|
||
|
#endif //_DEBUG
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// HandleInitDialog
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
PresetZoneTabClass::HandleInitDialog (void)
|
||
|
{
|
||
|
ASSERT (m_Preset != NULL);
|
||
|
|
||
|
ListView_SetExtendedListViewStyle (m_ListCtrl, LVS_EX_FULLROWSELECT);
|
||
|
m_ListCtrl.InsertColumn (COL_NAME, "Name");
|
||
|
|
||
|
//
|
||
|
// Add the zones to the list ctrl
|
||
|
//
|
||
|
int count = m_ZoneList->Count ();
|
||
|
for (int index = 0; index < count; index ++) {
|
||
|
|
||
|
//
|
||
|
// Insert this zone into the control
|
||
|
//
|
||
|
ZoneParameterClass *parameter = (*m_ZoneList)[index];
|
||
|
if (parameter != NULL) {
|
||
|
m_ListCtrl.InsertItem (index, parameter->Get_Name (), 0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Size the columns
|
||
|
//
|
||
|
CRect rect;
|
||
|
m_ListCtrl.GetWindowRect (&rect);
|
||
|
m_ListCtrl.SetColumnWidth (COL_NAME, (rect.Width ()) - (::GetSystemMetrics (SM_CXVSCROLL) + 1));
|
||
|
m_ListCtrl.SetFocus ();
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Apply_Changes
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
bool
|
||
|
PresetZoneTabClass::Apply_Changes (void)
|
||
|
{
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Modify_Selected_Zone
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
PresetZoneTabClass::Modify_Selected_Zone (void)
|
||
|
{
|
||
|
Create_Phys_Obj ();
|
||
|
if (m_PhysObj != NULL) {
|
||
|
|
||
|
//
|
||
|
// Get the currently selected item
|
||
|
//
|
||
|
int index = m_ListCtrl.GetNextItem (-1, LVNI_ALL | LVNI_SELECTED);
|
||
|
if (index >= 0) {
|
||
|
|
||
|
ZoneParameterClass *parameter = (*m_ZoneList)[index];
|
||
|
if (parameter != NULL) {
|
||
|
|
||
|
//
|
||
|
// Show the zone edit dialog
|
||
|
//
|
||
|
ZoneEditDialogClass dialog (this);
|
||
|
dialog.Set_Phys_Obj (m_PhysObj);
|
||
|
dialog.Set_Zone (parameter->Get_Zone ());
|
||
|
if (dialog.DoModal () == IDOK) {
|
||
|
parameter->Set_Zone (dialog.Get_Zone ());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Create_Phys_Obj
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
PresetZoneTabClass::Create_Phys_Obj (void)
|
||
|
{
|
||
|
CWaitCursor wait_cursor;
|
||
|
|
||
|
if (m_PhysObj == NULL && m_Preset != NULL) {
|
||
|
|
||
|
//
|
||
|
// Instantiate the node
|
||
|
//
|
||
|
NodeClass *node = (NodeClass *)m_Preset->Create ();
|
||
|
ASSERT (node != NULL);
|
||
|
if (node != NULL) {
|
||
|
|
||
|
//
|
||
|
// Initialize the node and get its phys object pointer
|
||
|
//
|
||
|
node->Initialize ();
|
||
|
PhysClass *phys_obj = node->Peek_Physics_Obj ();
|
||
|
ASSERT (phys_obj != NULL);
|
||
|
if (phys_obj != NULL) {
|
||
|
|
||
|
//
|
||
|
// Keep a copy of the physics object for our own uses.
|
||
|
//
|
||
|
m_PhysObj = phys_obj;
|
||
|
m_PhysObj->Add_Ref ();
|
||
|
|
||
|
//
|
||
|
// Force the object to use its highest LOD
|
||
|
//
|
||
|
/*if (m_RenderObj->Class_ID () == RenderObjClass::CLASSID_HLOD) {
|
||
|
HLodClass *lod_obj = (HLodClass *)m_RenderObj;
|
||
|
lod_obj->Set_LOD_Level (lod_obj->Get_LOD_Count () - 1);
|
||
|
}*/
|
||
|
}
|
||
|
|
||
|
MEMBER_RELEASE (node);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// OnDblclkZoneList
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
void
|
||
|
PresetZoneTabClass::OnDblclkZoneList
|
||
|
(
|
||
|
NMHDR * pNMHDR,
|
||
|
LRESULT *pResult
|
||
|
)
|
||
|
{
|
||
|
(*pResult) = 0;
|
||
|
Modify_Selected_Zone ();
|
||
|
return ;
|
||
|
}
|