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/W3DView/EmitterLinePropPage.cpp

231 lines
7.1 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/>.
*/
// EmitterLinePropPage.cpp : implementation file
//
#include "stdafx.h"
#include "w3dview.h"
#include "EmitterLinePropPage.h"
#include "w3d_file.h"
#include "EmitterInstanceList.h"
#include "Utils.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// EmitterLinePropPageClass property page
IMPLEMENT_DYNCREATE(EmitterLinePropPageClass, CPropertyPage)
EmitterLinePropPageClass::EmitterLinePropPageClass() :
CPropertyPage(EmitterLinePropPageClass::IDD),
m_pEmitterList(NULL),
m_bValid(true),
m_MappingMode(W3D_EMITTER_RENDER_MODE_TRI_PARTICLES),
m_MergeIntersections(false),
m_EndCaps(false),
m_DisableSorting(false),
m_SubdivisionLevel(0),
m_NoiseAmplitude(0.0f),
m_MergeAbortFactor(0.0f),
m_TextureTileFactor(0.0f),
m_UPerSec(0.0f),
m_VPerSec(0.0f)
{
//{{AFX_DATA_INIT(EmitterLinePropPageClass)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
EmitterLinePropPageClass::~EmitterLinePropPageClass()
{
}
void EmitterLinePropPageClass::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(EmitterLinePropPageClass)
DDX_Control(pDX, IDC_MAPMODE_COMBO, m_MapModeCombo);
DDX_Control(pDX, IDC_MERGE_ABORT_FACTOR_SPIN, m_MergeAbortFactorSpin);
DDX_Control(pDX, IDC_VPERSEC_SPIN, m_VPerSecSpin);
DDX_Control(pDX, IDC_UVTILING_SPIN, m_UVTilingSpin);
DDX_Control(pDX, IDC_UPERSEC_SPIN, m_UPerSecSpin);
DDX_Control(pDX, IDC_NOISE_AMPLITUDE_SPIN, m_NoiseAmplitudeSpin);
DDX_Control(pDX, IDC_SUBDIVISION_LEVEL_SPIN, m_SubdivisionLevelSpin);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(EmitterLinePropPageClass, CPropertyPage)
//{{AFX_MSG_MAP(EmitterLinePropPageClass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// EmitterLinePropPageClass message handlers
/////////////////////////////////////////////////////////////
//
// Initialize
//
void
EmitterLinePropPageClass::Initialize (void)
{
if (m_pEmitterList != NULL) {
//
// Read the settings from the emitter
//
m_MappingMode = m_pEmitterList->Get_Line_Texture_Mapping_Mode();
m_MergeIntersections = !!m_pEmitterList->Is_Merge_Intersections();
m_DisableSorting = !!m_pEmitterList->Is_Sorting_Disabled();
m_EndCaps = !!m_pEmitterList->Are_End_Caps_Enabled();
m_SubdivisionLevel = m_pEmitterList->Get_Subdivision_Level();
m_NoiseAmplitude = m_pEmitterList->Get_Noise_Amplitude();
m_MergeAbortFactor = m_pEmitterList->Get_Merge_Abort_Factor();
m_TextureTileFactor = m_pEmitterList->Get_Texture_Tile_Factor();
Vector2 uvrate = m_pEmitterList->Get_UV_Offset_Rate();
m_UPerSec = uvrate.X;
m_VPerSec = uvrate.Y;
}
return ;
}
BOOL EmitterLinePropPageClass::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// Set up the spinner ranges
m_SubdivisionLevelSpin.SetRange(0,8);
m_SubdivisionLevelSpin.SetPos(m_SubdivisionLevel);
::Initialize_Spinner (m_NoiseAmplitudeSpin, m_NoiseAmplitude, -10000, 10000);
::Initialize_Spinner (m_MergeAbortFactorSpin, m_MergeAbortFactor, -10000, 10000);
::Initialize_Spinner (m_UVTilingSpin, m_TextureTileFactor, 0.0f,8.0f);
::Initialize_Spinner (m_UPerSecSpin, m_UPerSec, 0.0f,32.0f);
::Initialize_Spinner (m_VPerSecSpin, m_VPerSec, 0.0f,32.0f);
// Set the combo box
m_MapModeCombo.SetCurSel(m_MappingMode);
// Set the checkboxes
SendDlgItemMessage (IDC_MERGE_INTERSECTIONS_CHECK, BM_SETCHECK, (WPARAM)(m_MergeIntersections != 0));
SendDlgItemMessage (IDC_END_CAPS_CHECK, BM_SETCHECK, (WPARAM)(m_EndCaps != 0));
SendDlgItemMessage (IDC_DISABLE_SORTING_CHECK, BM_SETCHECK, (WPARAM)(m_DisableSorting != 0));
bool enable = (m_pEmitterList->Get_Render_Mode() == W3D_EMITTER_RENDER_MODE_LINE);
::Enable_Dialog_Controls(m_hWnd,enable);
return TRUE;
}
BOOL EmitterLinePropPageClass::OnApply()
{
//
// Get the data from the controls
//
m_SubdivisionLevel = GetDlgItemInt (IDC_SUBDIVISION_LEVEL_EDIT);
m_NoiseAmplitude = ::GetDlgItemFloat (m_hWnd, IDC_NOISE_AMPLITUDE_EDIT);
m_MergeAbortFactor = ::GetDlgItemFloat (m_hWnd, IDC_MERGE_ABORT_FACTOR_EDIT);
m_TextureTileFactor = ::GetDlgItemFloat (m_hWnd, IDC_UVTILING_EDIT);
m_UPerSec = ::GetDlgItemFloat (m_hWnd, IDC_UPERSEC_EDIT);
m_VPerSec = ::GetDlgItemFloat (m_hWnd, IDC_VPERSEC_EDIT);
m_MappingMode = SendDlgItemMessage (IDC_MAPMODE_COMBO, CB_GETCURSEL);
m_MergeIntersections = !!SendDlgItemMessage (IDC_MERGE_INTERSECTIONS_CHECK, BM_GETCHECK);
m_EndCaps = !!SendDlgItemMessage (IDC_END_CAPS_CHECK, BM_GETCHECK);
m_DisableSorting = !!SendDlgItemMessage (IDC_DISABLE_SORTING_CHECK, BM_GETCHECK);
//
// Apply the changes to the emitter
//
m_pEmitterList->Set_Subdivision_Level (m_SubdivisionLevel);
m_pEmitterList->Set_Noise_Amplitude (m_NoiseAmplitude);
m_pEmitterList->Set_Merge_Abort_Factor (m_MergeAbortFactor);
m_pEmitterList->Set_Texture_Tile_Factor (m_TextureTileFactor);
m_pEmitterList->Set_UV_Offset_Rate (Vector2(m_UPerSec,m_VPerSec));
m_pEmitterList->Set_Line_Texture_Mapping_Mode (m_MappingMode);
m_pEmitterList->Set_Merge_Intersections (m_MergeIntersections);
m_pEmitterList->Set_Disable_Sorting(m_DisableSorting);
m_pEmitterList->Set_End_Caps(m_EndCaps);
// Allow the base class to process this message
return CPropertyPage::OnApply();
}
BOOL EmitterLinePropPageClass::OnCommand(WPARAM wParam, LPARAM lParam)
{
switch (LOWORD (wParam))
{
// Check if any of the edit boxes were modified,
case IDC_SUBDIVISION_LEVEL_EDIT:
case IDC_NOISE_AMPLITUDE_EDIT:
case IDC_MERGE_ABORT_FACTOR_EDIT:
case IDC_UVTILING_EDIT:
case IDC_UPERSEC_EDIT:
case IDC_VPERSEC_EDIT:
if (HIWORD (wParam) == EN_CHANGE) {
SetModified ();
}
break;
case IDC_MERGE_INTERSECTIONS_CHECK:
case IDC_END_CAPS_CHECK:
case IDC_DISABLE_SORTING_CHECK:
if (HIWORD (wParam) == BN_CLICKED) {
SetModified ();
}
break;
case IDC_MAPMODE_COMBO:
if (HIWORD (wParam) == CBN_SELCHANGE) {
SetModified ();
}
break;
}
return CPropertyPage::OnCommand(wParam, lParam);
}
BOOL EmitterLinePropPageClass::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
//
// Update the spinner control if necessary
//
NMHDR *pheader = (NMHDR *)lParam;
if ((pheader != NULL) && (pheader->code == UDN_DELTAPOS)) {
LPNMUPDOWN pupdown = (LPNMUPDOWN)lParam;
::Update_Spinner_Buddy (pheader->hwndFrom, pupdown->iDelta);
SetModified ();
}
// Allow the base class to process this message
return CPropertyPage::OnNotify (wParam, lParam, pResult);
}