/* * Descent 3 * Copyright (C) 2024 Parallax Software * * 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 . */ // GenericLightDialog.cpp : implementation file // #include "stdafx.h" #include "editor.h" #include "GenericLightDialog.h" #include "objinfo.h" #include "object.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CGenericLightDialog dialog CGenericLightDialog::CGenericLightDialog(light_info *current, CWnd *pParent) : CDialog(CGenericLightDialog::IDD, pParent) { //{{AFX_DATA_INIT(CGenericLightDialog) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_lightinfo = current; } void CGenericLightDialog::DoDataExchange(CDataExchange *pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CGenericLightDialog) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CGenericLightDialog, CDialog) //{{AFX_MSG_MAP(CGenericLightDialog) ON_EN_KILLFOCUS(IDC_GENERIC_LIGHT_DISTANCE, OnKillfocusGenericLightDistance) ON_EN_KILLFOCUS(IDC_GENERIC_BLUE_LIGHT, OnKillfocusGenericBlueLight) ON_EN_KILLFOCUS(IDC_GENERIC_GREEN_LIGHT, OnKillfocusGenericGreenLight) ON_EN_KILLFOCUS(IDC_GENERIC_RED_LIGHT, OnKillfocusGenericRedLight) ON_EN_KILLFOCUS(IDC_GENERIC_PULSE_TIME, OnKillfocusGenericPulseTime) ON_BN_CLICKED(IDC_FLICKER_RADIO, OnFlickerRadio) ON_BN_CLICKED(IDC_USE_TIMEBITS_RADIO, OnUseTimebitsRadio) ON_BN_CLICKED(IDC_PULSE, OnPulse) ON_BN_CLICKED(IDC_ALWAYS_ON_RADIO, OnAlwaysOnRadio) ON_BN_CLICKED(IDC_TIME_CHECK1, OnTimeCheck1) ON_BN_CLICKED(IDC_TIME_CHECK2, OnTimeCheck2) ON_BN_CLICKED(IDC_TIME_CHECK3, OnTimeCheck3) ON_BN_CLICKED(IDC_TIME_CHECK4, OnTimeCheck4) ON_BN_CLICKED(IDC_TIME_CHECK5, OnTimeCheck5) ON_BN_CLICKED(IDC_TIME_CHECK6, OnTimeCheck6) ON_BN_CLICKED(IDC_TIME_CHECK7, OnTimeCheck7) ON_BN_CLICKED(IDC_TIME_CHECK8, OnTimeCheck8) ON_BN_CLICKED(IDC_RENDER_STATIC, OnRenderStatic) ON_BN_CLICKED(IDC_RENDER_GOURAUD, OnRenderGouraud) ON_BN_CLICKED(IDC_RENDER_LIGHTMAPS, OnRenderLightmaps) ON_BN_CLICKED(IDC_PULSE_TO_SECOND, OnPulseToSecond) ON_EN_KILLFOCUS(IDC_GENERIC_RED_LIGHT2, OnKillfocusGenericRedLight2) ON_EN_KILLFOCUS(IDC_GENERIC_GREEN_LIGHT2, OnKillfocusGenericGreenLight2) ON_EN_KILLFOCUS(IDC_GENERIC_BLUE_LIGHT2, OnKillfocusGenericBlueLight2) ON_BN_CLICKED(IDC_FLICKER_SLIGHTLY_CHECK, OnFlickerSlightlyCheck) ON_EN_KILLFOCUS(IDC_FLICKER_SLIGHTLY_EDIT, OnKillfocusFlickerSlightlyEdit) ON_BN_CLICKED(IDC_DIRECTIONAL, OnDirectional) ON_EN_KILLFOCUS(IDC_FOV_EDIT, OnKillfocusFovEdit) ON_BN_CLICKED(IDC_NO_SPECULAR_CHECK, OnNoSpecularCheck) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CGenericLightDialog message handlers void CGenericLightDialog::OnKillfocusGenericLightDistance() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_GENERIC_LIGHT_DISTANCE))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 300) val = 300.0f; m_lightinfo->light_distance = val; UpdateDialog(); } void CGenericLightDialog::OnKillfocusGenericBlueLight() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_GENERIC_BLUE_LIGHT))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 1) val = 1.0f; m_lightinfo->blue_light1 = val; UpdateDialog(); } void CGenericLightDialog::OnKillfocusGenericGreenLight() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_GENERIC_GREEN_LIGHT))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 1) val = 1.0f; m_lightinfo->green_light1 = val; UpdateDialog(); } void CGenericLightDialog::OnKillfocusGenericRedLight() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_GENERIC_RED_LIGHT))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 1) val = 1.0f; m_lightinfo->red_light1 = val; UpdateDialog(); } void CGenericLightDialog::OnKillfocusGenericPulseTime() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_GENERIC_PULSE_TIME))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 300) val = 300.0f; m_lightinfo->time_interval = val; UpdateDialog(); } void CGenericLightDialog::OnFlickerRadio() { int c1 = IsDlgButtonChecked(IDC_FLICKER_RADIO); if (c1) { m_lightinfo->flags |= OLF_FLICKERING; m_lightinfo->flags &= ~OLF_TIMEBITS; } UpdateDialog(); } void CGenericLightDialog::OnUseTimebitsRadio() { // TODO: Add your control notification handler code here int c1 = IsDlgButtonChecked(IDC_USE_TIMEBITS_RADIO); if (c1) { m_lightinfo->flags |= OLF_TIMEBITS; m_lightinfo->flags &= ~OLF_FLICKERING; } UpdateDialog(); } void CGenericLightDialog::OnPulse() { int c1 = IsDlgButtonChecked(IDC_PULSE); if (c1) m_lightinfo->flags |= OLF_PULSE; else m_lightinfo->flags &= ~OLF_PULSE; UpdateDialog(); } void CGenericLightDialog::UpdateDialog() { char txt[255]; CButton *bbox; // Update light stuff sprintf(txt, "%.2f", m_lightinfo->light_distance); ((CEdit *)GetDlgItem(IDC_GENERIC_LIGHT_DISTANCE))->SetWindowText(txt); sprintf(txt, "%.2f", m_lightinfo->red_light1); ((CEdit *)GetDlgItem(IDC_GENERIC_RED_LIGHT))->SetWindowText(txt); sprintf(txt, "%.2f", m_lightinfo->green_light1); ((CEdit *)GetDlgItem(IDC_GENERIC_GREEN_LIGHT))->SetWindowText(txt); sprintf(txt, "%.2f", m_lightinfo->blue_light1); ((CEdit *)GetDlgItem(IDC_GENERIC_BLUE_LIGHT))->SetWindowText(txt); sprintf(txt, "%.2f", m_lightinfo->red_light2); ((CEdit *)GetDlgItem(IDC_GENERIC_RED_LIGHT2))->SetWindowText(txt); sprintf(txt, "%.2f", m_lightinfo->green_light2); ((CEdit *)GetDlgItem(IDC_GENERIC_GREEN_LIGHT2))->SetWindowText(txt); sprintf(txt, "%.2f", m_lightinfo->blue_light2); ((CEdit *)GetDlgItem(IDC_GENERIC_BLUE_LIGHT2))->SetWindowText(txt); sprintf(txt, "%.2f", m_lightinfo->flicker_distance); ((CEdit *)GetDlgItem(IDC_FLICKER_SLIGHTLY_EDIT))->SetWindowText(txt); sprintf(txt, "%.3f", m_lightinfo->directional_dot); ((CEdit *)GetDlgItem(IDC_FOV_EDIT))->SetWindowText(txt); bbox = (CButton *)GetDlgItem(IDC_FLICKER_RADIO); bbox->SetCheck(m_lightinfo->flags & OLF_FLICKERING); bbox = (CButton *)GetDlgItem(IDC_DIRECTIONAL); bbox->SetCheck(m_lightinfo->flags & OLF_DIRECTIONAL); bbox = (CButton *)GetDlgItem(IDC_NO_SPECULAR_CHECK); bbox->SetCheck(m_lightinfo->flags & OLF_NO_SPECULARITY); bbox = (CButton *)GetDlgItem(IDC_USE_TIMEBITS_RADIO); bbox->SetCheck(m_lightinfo->flags & OLF_TIMEBITS); bbox = (CButton *)GetDlgItem(IDC_ALWAYS_ON_RADIO); if (!(m_lightinfo->flags & OLF_FLICKERING) && !(m_lightinfo->flags & OLF_TIMEBITS)) { bbox->SetCheck(1); } else { bbox->SetCheck(0); } bbox = (CButton *)GetDlgItem(IDC_PULSE); bbox->SetCheck(m_lightinfo->flags & OLF_PULSE); bbox = (CButton *)GetDlgItem(IDC_PULSE_TO_SECOND); bbox->SetCheck(m_lightinfo->flags & OLF_PULSE_TO_SECOND); bbox = (CButton *)GetDlgItem(IDC_FLICKER_SLIGHTLY_CHECK); bbox->SetCheck(m_lightinfo->flags & OLF_FLICKER_SLIGHTLY); sprintf(txt, "%.2f", m_lightinfo->time_interval); ((CEdit *)GetDlgItem(IDC_GENERIC_PULSE_TIME))->SetWindowText(txt); CheckDlgButton(IDC_TIME_CHECK1, (m_lightinfo->timebits & (1 << 0)) ? 1 : 0); CheckDlgButton(IDC_TIME_CHECK2, (m_lightinfo->timebits & (1 << 1)) ? 1 : 0); CheckDlgButton(IDC_TIME_CHECK3, (m_lightinfo->timebits & (1 << 2)) ? 1 : 0); CheckDlgButton(IDC_TIME_CHECK4, (m_lightinfo->timebits & (1 << 3)) ? 1 : 0); CheckDlgButton(IDC_TIME_CHECK5, (m_lightinfo->timebits & (1 << 4)) ? 1 : 0); CheckDlgButton(IDC_TIME_CHECK6, (m_lightinfo->timebits & (1 << 5)) ? 1 : 0); CheckDlgButton(IDC_TIME_CHECK7, (m_lightinfo->timebits & (1 << 6)) ? 1 : 0); CheckDlgButton(IDC_TIME_CHECK8, (m_lightinfo->timebits & (1 << 7)) ? 1 : 0); CheckDlgButton(IDC_RENDER_STATIC, m_lightinfo->lighting_render_type == LRT_STATIC); CheckDlgButton(IDC_RENDER_GOURAUD, m_lightinfo->lighting_render_type == LRT_GOURAUD); CheckDlgButton(IDC_RENDER_LIGHTMAPS, m_lightinfo->lighting_render_type == LRT_LIGHTMAPS); } void CGenericLightDialog::OnAlwaysOnRadio() { // TODO: Add your control notification handler code here int c1 = IsDlgButtonChecked(IDC_ALWAYS_ON_RADIO); if (c1) { m_lightinfo->flags &= ~OLF_FLICKERING; m_lightinfo->flags &= ~OLF_TIMEBITS; } UpdateDialog(); } BOOL CGenericLightDialog::OnInitDialog() { CDialog::OnInitDialog(); UpdateDialog(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CGenericLightDialog::OnTimeCheck1() { int c1 = IsDlgButtonChecked(IDC_TIME_CHECK1); if (c1) m_lightinfo->timebits |= (1 << 0); else m_lightinfo->timebits &= ~(1 << 0); UpdateDialog(); } void CGenericLightDialog::OnTimeCheck2() { int c1 = IsDlgButtonChecked(IDC_TIME_CHECK2); if (c1) m_lightinfo->timebits |= (1 << 1); else m_lightinfo->timebits &= ~(1 << 1); UpdateDialog(); } void CGenericLightDialog::OnTimeCheck3() { int c1 = IsDlgButtonChecked(IDC_TIME_CHECK3); if (c1) m_lightinfo->timebits |= (1 << 2); else m_lightinfo->timebits &= ~(1 << 2); UpdateDialog(); } void CGenericLightDialog::OnTimeCheck4() { int c1 = IsDlgButtonChecked(IDC_TIME_CHECK4); if (c1) m_lightinfo->timebits |= (1 << 3); else m_lightinfo->timebits &= ~(1 << 3); UpdateDialog(); } void CGenericLightDialog::OnTimeCheck5() { int c1 = IsDlgButtonChecked(IDC_TIME_CHECK5); if (c1) m_lightinfo->timebits |= (1 << 4); else m_lightinfo->timebits &= ~(1 << 4); UpdateDialog(); } void CGenericLightDialog::OnTimeCheck6() { int c1 = IsDlgButtonChecked(IDC_TIME_CHECK6); if (c1) m_lightinfo->timebits |= (1 << 5); else m_lightinfo->timebits &= ~(1 << 5); UpdateDialog(); } void CGenericLightDialog::OnTimeCheck7() { int c1 = IsDlgButtonChecked(IDC_TIME_CHECK7); if (c1) m_lightinfo->timebits |= (1 << 6); else m_lightinfo->timebits &= ~(1 << 6); UpdateDialog(); } void CGenericLightDialog::OnTimeCheck8() { int c1 = IsDlgButtonChecked(IDC_TIME_CHECK8); if (c1) m_lightinfo->timebits |= (1 << 7); else m_lightinfo->timebits &= ~(1 << 7); UpdateDialog(); } void CGenericLightDialog::OnRenderStatic() { m_lightinfo->lighting_render_type = LRT_STATIC; UpdateDialog(); } void CGenericLightDialog::OnRenderGouraud() { m_lightinfo->lighting_render_type = LRT_GOURAUD; UpdateDialog(); } void CGenericLightDialog::OnRenderLightmaps() { m_lightinfo->lighting_render_type = LRT_LIGHTMAPS; UpdateDialog(); } void CGenericLightDialog::OnPulseToSecond() { int c1 = IsDlgButtonChecked(IDC_PULSE_TO_SECOND); if (c1) m_lightinfo->flags |= OLF_PULSE_TO_SECOND; else m_lightinfo->flags &= ~OLF_PULSE_TO_SECOND; } void CGenericLightDialog::OnKillfocusGenericRedLight2() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_GENERIC_RED_LIGHT2))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 1) val = 1.0f; m_lightinfo->red_light2 = val; UpdateDialog(); } void CGenericLightDialog::OnKillfocusGenericGreenLight2() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_GENERIC_GREEN_LIGHT2))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 1) val = 1.0f; m_lightinfo->green_light2 = val; UpdateDialog(); } void CGenericLightDialog::OnKillfocusGenericBlueLight2() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_GENERIC_BLUE_LIGHT2))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 1) val = 1.0f; m_lightinfo->blue_light2 = val; UpdateDialog(); } void CGenericLightDialog::OnFlickerSlightlyCheck() { // TODO: Add your control notification handler code here int c1 = IsDlgButtonChecked(IDC_FLICKER_SLIGHTLY_CHECK); if (c1) m_lightinfo->flags |= OLF_FLICKER_SLIGHTLY; else m_lightinfo->flags &= ~OLF_FLICKER_SLIGHTLY; UpdateDialog(); } void CGenericLightDialog::OnKillfocusFlickerSlightlyEdit() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_FLICKER_SLIGHTLY_EDIT))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 100) val = 100.0f; m_lightinfo->flicker_distance = val; UpdateDialog(); } void CGenericLightDialog::OnDirectional() { int c1 = IsDlgButtonChecked(IDC_DIRECTIONAL); if (c1) m_lightinfo->flags |= OLF_DIRECTIONAL; else m_lightinfo->flags &= ~OLF_DIRECTIONAL; UpdateDialog(); } void CGenericLightDialog::OnKillfocusFovEdit() { char str[20]; float val; ((CEdit *)GetDlgItem(IDC_FOV_EDIT))->GetWindowText(str, 20); val = atof(str); if (val < 0) val = 0.0f; if (val > 1.0) val = 1.0; m_lightinfo->directional_dot = val; UpdateDialog(); } void CGenericLightDialog::OnNoSpecularCheck() { int c1 = IsDlgButtonChecked(IDC_NO_SPECULAR_CHECK); if (c1) m_lightinfo->flags |= OLF_NO_SPECULARITY; else m_lightinfo->flags &= ~OLF_NO_SPECULARITY; UpdateDialog(); }