123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- /* Copyright (c) 2002-2012 Croteam Ltd.
- This program is free software; you can redistribute it and/or modify
- it under the terms of version 2 of the GNU General Public License as published by
- the Free Software Foundation
- 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, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
- // DlgGenerateFBM.cpp : implementation file
- //
- #include "stdafx.h"
- #include "WorldEditor.h"
- #include "DlgGenerateFBM.h"
- #ifdef _DEBUG
- #undef new
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CDlgGenerateFBM dialog
- INDEX _iFBMOctaves;
- FLOAT _fFBMHighFrequencyStep;
- FLOAT _fFBMStepFactor;
- FLOAT _fFBMMaxAmplitude;
- FLOAT _fFBMfAmplitudeDecreaser;
- BOOL _bFBMAddNegativeValues;
- BOOL _bFBMRandomOffset;
- CDlgGenerateFBM::CDlgGenerateFBM(CWnd* pParent /*=NULL*/)
- : CDialog(CDlgGenerateFBM::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CDlgGenerateFBM)
- m_fMaxAltitude = 0.0f;
- m_fOctaveAmplitudeDecreaser = 0.0f;
- m_fOctaveAmplitudeStep = 0.0f;
- m_fHighFrequencyStep = 0.0f;
- m_ctOctaves = 0;
- m_bAddNegativeValues = FALSE;
- m_bRandomOffset = FALSE;
- //}}AFX_DATA_INIT
- m_bCustomWindowCreated = FALSE;
- m_pdp=NULL;
- m_pvp=NULL;
- _iFBMOctaves=theApp.m_iFBMOctaves;
- _fFBMHighFrequencyStep=theApp.m_fFBMHighFrequencyStep;
- _fFBMStepFactor=theApp.m_fFBMStepFactor;
- _fFBMMaxAmplitude=theApp.m_fFBMMaxAmplitude;
- _fFBMfAmplitudeDecreaser=theApp.m_fFBMfAmplitudeDecreaser;
- _bFBMAddNegativeValues=theApp.m_bFBMAddNegativeValues;
- _bFBMRandomOffset=theApp.m_bFBMRandomOffset;
- }
- void CDlgGenerateFBM::DoDataExchange(CDataExchange* pDX)
- {
- // if dialog is recieving data
- if(pDX->m_bSaveAndValidate == FALSE)
- {
- m_ctOctaves=_iFBMOctaves;
- m_fHighFrequencyStep=_fFBMHighFrequencyStep;
- m_fOctaveAmplitudeStep=_fFBMStepFactor;
- m_fMaxAltitude=_fFBMMaxAmplitude;
- m_fOctaveAmplitudeDecreaser=_fFBMfAmplitudeDecreaser;
- m_bAddNegativeValues=_bFBMAddNegativeValues;
- m_bRandomOffset=_bFBMRandomOffset;
- }
- else if( !::IsWindow(m_ctrlCtOctavesSpin.m_hWnd)) return;
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CDlgGenerateFBM)
- DDX_Control(pDX, IDC_CT_OCTAVES_SPIN, m_ctrlCtOctavesSpin);
- DDX_Text(pDX, IDC_FBM_MAX_ALTITUDE, m_fMaxAltitude);
- DDV_MinMaxFloat(pDX, m_fMaxAltitude, 0.f, 65535.f);
- DDX_Text(pDX, IDC_FBM_OCTAVE_AMPLITUDE_DECREASE, m_fOctaveAmplitudeDecreaser);
- DDV_MinMaxFloat(pDX, m_fOctaveAmplitudeDecreaser, 0.f, 16.f);
- DDX_Text(pDX, IDC_FBM_OCTAVE_STEP, m_fOctaveAmplitudeStep);
- DDV_MinMaxFloat(pDX, m_fOctaveAmplitudeStep, 0.f, 128.f);
- DDX_Text(pDX, IDC_FBM_HIGH_FREQUENCY_STEP, m_fHighFrequencyStep);
- DDV_MinMaxFloat(pDX, m_fHighFrequencyStep, 0.f, 16.f);
- DDX_Text(pDX, IDC_FBM_OCTAVES, m_ctOctaves);
- DDV_MinMaxInt(pDX, m_ctOctaves, 0, 16);
- DDX_Check(pDX, IDC_ADD_NEGATIVE_VALUES, m_bAddNegativeValues);
- DDX_Check(pDX, IDC_RANDOM_OFFSET, m_bRandomOffset);
- //}}AFX_DATA_MAP
- // if dialog is giving data
- if(pDX->m_bSaveAndValidate != FALSE)
- {
- _iFBMOctaves=m_ctOctaves;
- _fFBMHighFrequencyStep=m_fHighFrequencyStep;
- _fFBMStepFactor=m_fOctaveAmplitudeStep;
- _fFBMMaxAmplitude=m_fMaxAltitude;
- _fFBMfAmplitudeDecreaser=m_fOctaveAmplitudeDecreaser;
- }
- }
- BEGIN_MESSAGE_MAP(CDlgGenerateFBM, CDialog)
- //{{AFX_MSG_MAP(CDlgGenerateFBM)
- ON_WM_PAINT()
- ON_BN_CLICKED(IDC_FBM_RANDOMIZE, OnFbmRandomize)
- ON_EN_CHANGE(IDC_FBM_HIGH_FREQUENCY_STEP, OnChangeFbmHighFrequencyStep)
- ON_EN_CHANGE(IDC_FBM_MAX_ALTITUDE, OnChangeFbmMaxAltitude)
- ON_EN_CHANGE(IDC_FBM_OCTAVE_AMPLITUDE_DECREASE, OnChangeFbmOctaveAmplitudeDecrease)
- ON_EN_CHANGE(IDC_FBM_OCTAVE_STEP, OnChangeFbmOctaveStep)
- ON_EN_CHANGE(IDC_FBM_OCTAVES, OnChangeFbmOctaves)
- ON_BN_CLICKED(IDC_ADD_NEGATIVE_VALUES, OnAddNegativeValues)
- ON_BN_CLICKED(IDC_FBM_EXPORT, OnFbmExport)
- ON_BN_CLICKED(IDC_RANDOM_OFFSET, OnRandomOffset)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDlgGenerateFBM message handlers
- BOOL CreateFBMTexture(PIX pixW, PIX pixH, CTFileName fnFBMFile)
- {
- FLOAT fMin, fMax;
- FLOAT *pafFBM=GenerateTerrain_FBMBuffer( pixW, pixH, _iFBMOctaves,
- _fFBMHighFrequencyStep, _fFBMStepFactor, _fFBMMaxAmplitude,
- _fFBMfAmplitudeDecreaser, _bFBMAddNegativeValues, _bFBMRandomOffset, fMin, fMax);
- CImageInfo ii;
- ii.ii_Width=pixW;
- ii.ii_Height=pixH;
- ii.ii_BitsPerPixel=32;
- ii.ii_Picture=(UBYTE*) AllocMemory(ii.ii_Width*ii.ii_Height*sizeof(COLOR));
- COLOR *pcol=(COLOR *)ii.ii_Picture;
- // convert buffer to equalized color map
- FLOAT fConvertFactor=MAX_UBYTE/(fMax-fMin);
- // pixelate preview area
- for(INDEX y=0; y<pixH; y++)
- {
- for(INDEX x=0; x<pixW; x++)
- {
- INDEX iOffset=y*pixW+x;
- FLOAT fValue=pafFBM[iOffset];
- UBYTE ub=(fValue-fMin)*fConvertFactor;
- COLOR col=RGBToColor(ub,ub,ub)|CT_OPAQUE;
- *pcol=ByteSwap(col);
- pcol++;
- }
- }
- CTextureData tdFBM;
- try
- {
- tdFBM.Create_t( &ii, pixW, 16, TRUE);
- tdFBM.Save_t( fnFBMFile);
- }
- catch( char *strError)
- {
- (void) strError;
- WarningMessage("Unable to create FBM preview texture!");
- FreeMemory( pafFBM);
- return FALSE;
- }
- FreeMemory( pafFBM);
- return TRUE;
- }
- void CDlgGenerateFBM::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
- if( !m_bCustomWindowCreated)
- {
- // obtain window position
- CWnd *pwndTexture = GetDlgItem(IDC_FBM_PREVIEW_FRAME);
- ASSERT(pwndTexture!= NULL);
- CRect rect;
- pwndTexture->GetWindowRect(&rect);
- ScreenToClient(&rect);
- m_wndTexture.Create( NULL, NULL, WS_BORDER|WS_VISIBLE, rect, this, IDW_FBM_PREVIEW);
- // mark that custom window is created
- m_bCustomWindowCreated = TRUE;
- }
- // ******** Render preview texture
- if (m_pdp==NULL)
- {
- _pGfx->CreateWindowCanvas( m_wndTexture.m_hWnd, &m_pvp, &m_pdp);
- }
- if( (m_pdp!=NULL) && (m_pdp->Lock()) )
- {
- PIX pixW=256;
- PIX pixH=256;
-
- CTFileName fnFBMFile=CTString("Textures\\Editor\\FMPPreview.tex");
- if(CreateFBMTexture(pixW, pixH, fnFBMFile))
- {
- try
- {
- CTextureObject to;
- to.SetData_t(fnFBMFile);
- CTextureData *ptd=(CTextureData *)to.GetData();
- ptd->Reload();
- m_pdp->PutTexture( &to, PIXaabbox2D(PIX2D(0,0),PIX2D(m_pdp->GetWidth(),m_pdp->GetHeight())));
- }
- catch( char *strError)
- {
- (void) strError;
- WarningMessage("Unable to create FBM preview texture!");
- }
- m_pdp->Unlock();
- }
- }
- if (m_pvp!=NULL)
- {
- m_pvp->SwapBuffers();
- }
- }
- void CDlgGenerateFBM::OnFbmRandomize()
- {
- RandomizeWhiteNoise();
- Invalidate(FALSE);
- }
- void CDlgGenerateFBM::OnChangeFbmHighFrequencyStep()
- {
- UpdateData(TRUE);
- Invalidate(FALSE);
- }
- void CDlgGenerateFBM::OnChangeFbmMaxAltitude()
- {
- UpdateData(TRUE);
- Invalidate(FALSE);
- }
- void CDlgGenerateFBM::OnChangeFbmOctaveAmplitudeDecrease()
- {
- UpdateData(TRUE);
- Invalidate(FALSE);
- }
- void CDlgGenerateFBM::OnChangeFbmOctaveStep()
- {
- UpdateData(TRUE);
- Invalidate(FALSE);
- }
- void CDlgGenerateFBM::OnChangeFbmOctaves()
- {
- UpdateData(TRUE);
- Invalidate(FALSE);
- }
- void CDlgGenerateFBM::OnOK()
- {
- theApp.m_iFBMOctaves=_iFBMOctaves;
- theApp.m_fFBMHighFrequencyStep=_fFBMHighFrequencyStep;
- theApp.m_fFBMStepFactor=_fFBMStepFactor;
- theApp.m_fFBMMaxAmplitude=_fFBMMaxAmplitude;
- theApp.m_fFBMfAmplitudeDecreaser=_fFBMfAmplitudeDecreaser;
- theApp.m_bFBMAddNegativeValues=_bFBMAddNegativeValues;
- theApp.m_bFBMRandomOffset=_bFBMRandomOffset;
- CDialog::OnOK();
- }
- BOOL CDlgGenerateFBM::OnInitDialog()
- {
- CDialog::OnInitDialog();
-
- m_ctrlCtOctavesSpin.SetRange(0,16);
- m_ctrlCtOctavesSpin.SetPos(_iFBMOctaves);
- return TRUE;
- }
- void CDlgGenerateFBM::OnAddNegativeValues()
- {
- _bFBMAddNegativeValues=!_bFBMAddNegativeValues;
- UpdateData(TRUE);
- Invalidate(FALSE);
- }
- void CDlgGenerateFBM::OnRandomOffset()
- {
- _bFBMRandomOffset=!_bFBMRandomOffset;
- UpdateData(TRUE);
- Invalidate(FALSE);
- }
- void CDlgGenerateFBM::OnFbmExport()
- {
- CTFileName fnFBM=_EngineGUI.FileRequester(
- "Export FBM texture", FILTER_TEX FILTER_PCX FILTER_ALL FILTER_END,
- "Layer mask directory", "Textures\\");
- if( fnFBM=="") return;
- CDlgEditFloat dlg;
- dlg.m_fEditFloat=256.0f;
- dlg.m_strVarName = "Width (pixels)";
- dlg.m_strTitle = "Texture size";
- if(dlg.DoModal()!=IDOK) return;
- PIX pixW=dlg.m_fEditFloat;
-
- if(pixW!=1<<((INDEX)Log2( (FLOAT)pixW)))
- {
- WarningMessage("Size must be power of 2!");
- }
- else
- {
- CreateFBMTexture(pixW, pixW, fnFBM);
- }
- }
|