Files
FC1/Editor/SkyDialog.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

241 lines
6.5 KiB
C++

// SkyDialog.cpp : implementation file
//
#include "stdafx.h"
#include "SkyDialog.h"
#include "CryEditDoc.h"
#include "PropertiesDialog.h"
#include "GenerationParam.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSkyDialog dialog
CSkyDialog::CSkyDialog(CWnd* pParent /*=NULL*/)
: CToolbarDialog(CSkyDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CSkyDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_PD = PDNorth;
}
void CSkyDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSkyDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSkyDialog, CToolbarDialog)
//{{AFX_MSG_MAP(CSkyDialog)
ON_COMMAND(ID_SKY_NORTH, OnSkyNorth)
ON_COMMAND(ID_SKY_SOUTH, OnSkySouth)
ON_COMMAND(ID_SKY_WEST, OnSkyWest)
ON_COMMAND(ID_SKY_EAST, OnSkyEast)
ON_WM_PAINT()
ON_COMMAND(ID_SKY_CLOUDS, OnSkyClouds)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSkyDialog message handlers
BOOL CSkyDialog::OnInitDialog()
{
////////////////////////////////////////////////////////////////////////
// Create and setup the toolbar and other controls
////////////////////////////////////////////////////////////////////////
RECT rcClient;
TBBUTTONINFO tbbiInfo;
CLogFile::WriteLine("Loading sky dialog...");
// We call this function of the base class here because our direct
// base class' OnInitDialog() needs to be called after we created the tool bar
CDialog::OnInitDialog();
// Create the toolbar
if (!m_cDlgToolBar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_WRAPABLE, WS_CHILD |
WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_cDlgToolBar.LoadToolBar(IDR_SKY))
{
ASSERT(0);
return -1; // fail to create
}
// Resize the toolbar
GetClientRect(&rcClient);
m_cDlgToolBar.SetWindowPos(NULL, 0, 0, rcClient.right, 70, SWP_NOZORDER);
// TODO: Remove this if you don't want tool tips or a resizeable toolbar
m_cDlgToolBar.SetBarStyle(m_cDlgToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY);
// Direction buttons are checkbuttons
m_cDlgToolBar.SetButtonStyle(4, TBBS_CHECKGROUP);
m_cDlgToolBar.SetButtonStyle(5, TBBS_CHECKGROUP);
m_cDlgToolBar.SetButtonStyle(6, TBBS_CHECKGROUP);
m_cDlgToolBar.SetButtonStyle(7, TBBS_CHECKGROUP);
// Disable unimplemented features
tbbiInfo.cbSize = sizeof(TBBUTTONINFO);
tbbiInfo.dwMask = TBIF_STATE;
tbbiInfo.fsState = NULL;
m_cDlgToolBar.GetToolBarCtrl().SetButtonInfo(ID_SKY_WEATHER, &tbbiInfo);
m_cDlgToolBar.GetToolBarCtrl().SetButtonInfo(ID_SKY_NORTH, &tbbiInfo);
m_cDlgToolBar.GetToolBarCtrl().SetButtonInfo(ID_SKY_EAST, &tbbiInfo);
m_cDlgToolBar.GetToolBarCtrl().SetButtonInfo(ID_SKY_SOUTH, &tbbiInfo);
m_cDlgToolBar.GetToolBarCtrl().SetButtonInfo(ID_SKY_WEST, &tbbiInfo);
// Check the default buttons
tbbiInfo.cbSize = sizeof(TBBUTTONINFO);
tbbiInfo.dwMask = TBIF_STATE;
tbbiInfo.fsState = TBSTATE_CHECKED | TBSTATE_ENABLED;
m_cDlgToolBar.GetToolBarCtrl().SetButtonInfo(ID_SKY_NORTH, &tbbiInfo);
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
CRect rc;
GetDlgItem(IDC_PROPERTIES)->GetWindowRect( rc );
GetDlgItem(IDC_PROPERTIES)->ShowWindow( SW_HIDE );
ScreenToClient( rc );
m_propWnd.Create( WS_CHILD|WS_VISIBLE,rc,this );
XmlNodeRef &templ = GetIEditor()->GetDocument()->GetFogTemplate();
if (templ)
{
XmlNodeRef rootNode = GetIEditor()->GetDocument()->GetEnvironmentTemplate();
m_propWnd.CreateItems( rootNode );
m_propWnd.ExpandAll();
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// The base class is responsible for moving the controls and placing the toolbar. This
// does not call CDialog::OnInitDialog()
VERIFY(CToolbarDialog::OnInitDialog());
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CSkyDialog::OnPaint()
{
////////////////////////////////////////////////////////////////////////
// Draw the cloud and sky preview
////////////////////////////////////////////////////////////////////////
CPaintDC dc(this); // device context for painting
RECT rcDest;
SetRect(&rcDest, 19, 54, 256, 256);
// Paint the clouds
GetIEditor()->GetDocument()->m_cClouds.DrawClouds(&dc, &rcDest);
// Do not call CToolbarDialog::OnPaint() for painting messages
}
void CSkyDialog::OnSkyClouds()
{
////////////////////////////////////////////////////////////////////////
// Generate new clouds
////////////////////////////////////////////////////////////////////////
SNoiseParams sParams;
CGenerationParam cDialog;
if (GetIEditor()->GetDocument()->m_cClouds.GetLastParam()->bValid)
{
// Use last parameters
cDialog.LoadParam(GetIEditor()->GetDocument()->m_cClouds.GetLastParam());
}
else
{
// Set default parameters for the dialog
cDialog.m_sldCover = 50;
cDialog.m_sldFade = (int) (0.8f * 10);
cDialog.m_sldFrequency = (int) (3.0f * 10);
cDialog.m_sldFrequencyStep = (int) (2.0f * 10);
cDialog.m_sldPasses = 8;
cDialog.m_sldRandomBase = 1;
cDialog.m_sldSharpness = (int) (0.999f * 1000);
cDialog.m_sldBlur = 0;
}
// Show the generation parameter dialog
if (cDialog.DoModal() == IDCANCEL)
return;
CLogFile::WriteLine("Generating cloud layer...");
// Fill the parameter structure for the cloud generation
cDialog.FillParam(&sParams);
sParams.iWidth = 512;
sParams.iHeight = 512;
sParams.bBlueSky = true;
BeginWaitCursor();
// Call the generator function
GetIEditor()->GetDocument()->m_cClouds.GenerateClouds(&sParams, GetDlgItem(IDC_GEN_STATUS));
// Update the window
RedrawWindow();
// Remove the status indicator
GetDlgItem(IDC_GEN_STATUS)->SetWindowText("");
// We modified the document
GetIEditor()->GetDocument()->SetModifiedFlag();
EndWaitCursor();
if (m_propWnd.m_hWnd)
m_propWnd.Invalidate();
}
/////////////////////////////////////////////////////////////////////////////
// CSkyDialog direction buttons
void CSkyDialog::OnSkyNorth()
{
m_PD = PDNorth;
}
void CSkyDialog::OnSkySouth()
{
m_PD = PDSouth;
}
void CSkyDialog::OnSkyWest()
{
m_PD = PDWest;
}
void CSkyDialog::OnSkyEast()
{
m_PD = PDEast;
}
void CSkyDialog::OnDestroy()
{
CToolbarDialog::OnDestroy();
}