123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537 |
- /* 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. */
- // DlgCreateEffectTexture.cpp : implementation file
- //
- #include "StdH.h"
- #include "DlgCreateEffectTexture.h"
- #include <Engine/Graphics/TextureEffects.h>
- #include <Engine/Templates/Stock_CTextureData.h>
- #ifdef _DEBUG
- #undef new
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CDlgCreateEffectTexture dialog
- #define MAX_ALLOWED_MEX_SIZE 1024*1024
- static CDlgCreateEffectTexture *pDialog;
- static PIX pixStartU;
- static PIX pixStartV;
- // called when user pressed LMB on preview effect window
- void _OnLeftMouseDown( PIX pixU, PIX pixV)
- {
- // store starting point
- pixStartU = pixU;
- pixStartV = pixV;
- }
- // called when user released LMB on preview effect window
- void _OnLeftMouseUp( PIX pixU, PIX pixV)
- {
- // obtain currently selected effect source type
- ULONG ulEffectSourceType = pDialog->m_ctrlEffectTypeCombo.GetCurSel();
- // add new effect source
- pDialog->m_tdCreated.td_ptegEffect->AddEffectSource( ulEffectSourceType, pixStartU, pixStartV, pixU, pixV);
- }
- // called when user pressed RMB on preview effect window
- void _OnRightMouseDown( PIX pixU, PIX pixV)
- {
- // obtain currently selected effect source type
- ULONG ulEffectSourceType = pDialog->m_ctrlEffectTypeCombo.GetCurSel();
- // add new effect source
- pDialog->m_tdCreated.td_ptegEffect->AddEffectSource( ulEffectSourceType, pixU, pixV, pixU, pixV);
- }
- // called when user pressed RMB and move mouse on preview effect window
- void _OnRightMouseMove( PIX pixU, PIX pixV)
- {
- // obtain currently selected effect source type
- ULONG ulEffectSourceType = pDialog->m_ctrlEffectTypeCombo.GetCurSel();
- // add new effect source
- pDialog->m_tdCreated.td_ptegEffect->AddEffectSource( ulEffectSourceType, pixU, pixV, pixU, pixV);
- }
- CDlgCreateEffectTexture::CDlgCreateEffectTexture(CTFileName fnInputFile/*=""*/, CWnd* pParent /*=NULL*/)
- : CDialog(CDlgCreateEffectTexture::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CDlgCreateEffectTexture)
- m_strCreatedTextureName = _T("");
- m_strBaseTextureName = _T("");
- m_strRendSpeed = _T("");
- //}}AFX_DATA_INIT
- // set dialog ptr
- pDialog = this;
- // register left mouse button call back function
- m_wndViewCreatedTexture.SetLeftMouseButtonClicked( _OnLeftMouseDown);
- // register left mouse release button call back function
- m_wndViewCreatedTexture.SetLeftMouseButtonReleased( _OnLeftMouseUp);
- // register right mouse button call back function
- m_wndViewCreatedTexture.SetRightMouseButtonClicked( _OnRightMouseDown);
- // register right mouse button move call back function
- m_wndViewCreatedTexture.SetRightMouseButtonMoved( _OnRightMouseMove);
- // set invalid initial mip level and size for created texture
- m_mexInitialCreatedWidth = 2048;
- m_pixInitialCreatedWidth = 256;
- m_pixInitialCreatedHeight = 256;
- BOOL bCreateNew = TRUE;
- if( fnInputFile != "")
- {
- m_fnCreatedTextureName = fnInputFile;
- try
- {
- // load texture with the same name (if allready exists)
- m_tdCreated.Load_t( m_fnCreatedTextureName);
- // remember existing texture's width in mexels
- m_mexInitialCreatedWidth = m_tdCreated.GetWidth();
- m_pixInitialCreatedWidth = m_tdCreated.GetPixWidth();
- m_pixInitialCreatedHeight = m_tdCreated.GetPixHeight();
- bCreateNew = FALSE;
- }
- // if texture can't be obtained
- catch( char *err_str)
- {
- // never mind
- (void) err_str;
- }
- }
- else
- {
- // set texture name to unnamed
- m_fnCreatedTextureName = CTString("Unnamed");
- }
-
- // if we should create a new texture
- if( bCreateNew)
- {
- CTextureData *pBaseTexture;
- try
- {
- // obtain default texture as base
- pBaseTexture = _pTextureStock->Obtain_t( CTFILENAME("Textures\\Editor\\Default.tex"));
- }
- // if texture can't be obtained
- catch( char *err_str)
- {
- // stop executing program
- FatalError( "%s", err_str);
- }
- // create empty effect texture
- m_tdCreated.CreateEffectTexture(m_pixInitialCreatedWidth, m_pixInitialCreatedHeight,
- m_mexInitialCreatedWidth, pBaseTexture, 0);
- // release default texture
- _pTextureStock->Release(pBaseTexture);
- }
- m_wndViewCreatedTexture.m_toTexture.SetData( &m_tdCreated);
- // copy texture name to text control
- m_strCreatedTextureName = m_fnCreatedTextureName;
- m_bPreviewWindowsCreated = FALSE;
- }
- CDlgCreateEffectTexture::~CDlgCreateEffectTexture()
- {
- m_tdCreated.MarkUsed();
- m_wndViewCreatedTexture.m_toTexture.SetData( NULL);
- m_tdCreated.MarkUnused();
- }
- void CDlgCreateEffectTexture::SetNewBaseTexture( CTFileName fnNewBase)
- {
- if( fnNewBase != "")
- {
- // try to
- try
- {
- // obtain texture with the same name (if allready exists)
- CTextureData *pTD = _pTextureStock->Obtain_t( fnNewBase);
- pTD->Reload();
- if( pTD->td_ptegEffect != NULL)
- {
- _pTextureStock->Release( pTD);
- ThrowF_t( "Texture '%s' is an effect texture.", (CTString&)fnNewBase);
- }
- // if there is base texture obtained, release it
- if( m_tdCreated.td_ptdBaseTexture!= NULL)
- {
- _pTextureStock->Release( m_tdCreated.td_ptdBaseTexture);
- // reset base texture ptr
- m_tdCreated.td_ptdBaseTexture = NULL;
- }
- // set new base texture ptr
- m_tdCreated.td_ptdBaseTexture = pTD;
- m_pixInitialCreatedWidth = pTD->GetPixWidth();
- m_pixInitialCreatedHeight = pTD->GetPixHeight();
- UpdateData( FALSE);
- SelectPixSizeCombo();
- }
- catch(char *err_str)
- {
- AfxMessageBox( CString(err_str));
- return;
- }
- }
- }
- void CDlgCreateEffectTexture::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- // if dialog is receiving data
- if(pDX->m_bSaveAndValidate == FALSE)
- {
- m_strBaseTextureName = "None";
- CTFileName fnNewBase;
- // if there is base texture obtained, get name
- if( m_tdCreated.td_ptdBaseTexture != NULL)
- {
- PIX pixBaseTextureWidth = m_tdCreated.td_ptdBaseTexture->GetPixWidth();
- PIX pixBaseTextureHeight = m_tdCreated.td_ptdBaseTexture->GetPixHeight();
- char achrBaseTextureName[ 256];
- sprintf( achrBaseTextureName, "%s (%d x %d)",
- (CTString&)m_tdCreated.td_ptdBaseTexture->GetName(),
- pixBaseTextureWidth, pixBaseTextureHeight);
- m_strBaseTextureName = achrBaseTextureName;
- }
- }
- //{{AFX_DATA_MAP(CDlgCreateEffectTexture)
- DDX_Control(pDX, IDC_CHEQUERED_ALPHA, m_ctrlCheckButton);
- DDX_Control(pDX, IDC_MEX_SIZE, m_ctrlMexSizeCombo);
- DDX_Control(pDX, IDC_PIX_WIDTH, m_ctrlPixWidthCombo);
- DDX_Control(pDX, IDC_PIX_HEIGHT, m_ctrlPixHeightCombo);
- DDX_Control(pDX, IDC_EFFECT_CLASS, m_ctrlEffectClassCombo);
- DDX_Control(pDX, IDC_EFFECT_TYPE, m_ctrlEffectTypeCombo);
- DDX_Text(pDX, IDC_CREATED_TEXTURE_NAME, m_strCreatedTextureName);
- DDX_Text(pDX, IDC_BASE_TEXTURE_NAME, m_strBaseTextureName);
- DDX_Text(pDX, IDC_REND_SPEED, m_strRendSpeed);
- //}}AFX_DATA_MAP
-
- // if dialog is giving data
- if(pDX->m_bSaveAndValidate != FALSE)
- {
- }
- }
- BEGIN_MESSAGE_MAP(CDlgCreateEffectTexture, CDialog)
- //{{AFX_MSG_MAP(CDlgCreateEffectTexture)
- ON_WM_PAINT()
- ON_BN_CLICKED(IDC_CHEQUERED_ALPHA, OnChequeredAlpha)
- ON_BN_CLICKED(ID_BROWSE_BASE, OnBrowseBase)
- ON_BN_CLICKED(ID_CREATE_AS, OnCreateAs)
- ON_BN_CLICKED(ID_REMOVE_ALL_EFFECTS, OnRemoveAllEffects)
- ON_CBN_SELCHANGE(IDC_PIX_HEIGHT, OnSelchangePixHeight)
- ON_CBN_SELCHANGE(IDC_PIX_WIDTH, OnSelchangePixWidth)
- ON_CBN_SELCHANGE(IDC_MEX_SIZE, OnSelchangeMexSize)
- ON_BN_CLICKED(ID_CREATE, OnCreate)
- ON_CBN_SELCHANGE(IDC_EFFECT_CLASS, OnSelchangeEffectClass)
- ON_CBN_SELCHANGE(IDC_EFFECT_TYPE, OnSelchangeEffectType)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDlgCreateEffectTexture message handlers
- void CDlgCreateEffectTexture::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
- // if texture preview windows are not yet created
- if( !m_bPreviewWindowsCreated)
- {
- // ---------------- Create custom window that will show how created texture will look like
- CWnd *pWndCreatedTexturePreview = GetDlgItem(IDC_TEXTURE_PREVIEW_WINDOW);
- ASSERT(pWndCreatedTexturePreview != NULL);
- CRect rectPreviewCreatedTextureWnd;
- // get rectangle occupied by preview texture window
- pWndCreatedTexturePreview->GetWindowRect( &rectPreviewCreatedTextureWnd);
- ScreenToClient( &rectPreviewCreatedTextureWnd);
- // create window for for showing created texture
- m_wndViewCreatedTexture.Create( NULL, NULL, WS_BORDER|WS_VISIBLE, rectPreviewCreatedTextureWnd,
- this, IDW_VIEW_CREATED_TEXTURE);
- // mark that custom windows are created
- m_bPreviewWindowsCreated = TRUE;
- }
- }
- void CDlgCreateEffectTexture::OnChequeredAlpha()
- {
- // toggle chequered alpha on/off
- m_wndViewCreatedTexture.m_bChequeredAlpha = !m_wndViewCreatedTexture.m_bChequeredAlpha;
- }
- void CDlgCreateEffectTexture::InitializeSizeCombo(void)
- {
- // clear combo box
- m_ctrlMexSizeCombo.ResetContent();
- INDEX iSelectedWidth = m_ctrlPixWidthCombo.GetCurSel();
- INDEX iSelectedHeight = m_ctrlPixHeightCombo.GetCurSel();
- // obtain selected size in pixels
- m_pixInitialCreatedWidth = 1<<iSelectedWidth;
- m_pixInitialCreatedHeight = 1<<iSelectedHeight;
- // obtain all available potentions of source picture's dimensions
- INDEX iPotention = 0;
- // set default created texture's size
- INDEX iInitialSelectedSize = 0;
- FOREVER
- {
- char strSize[ 64];
- MEX mexPotentionWidth = m_pixInitialCreatedWidth * (1 << iPotention);
- MEX mexPotentionHeight = m_pixInitialCreatedHeight * (1 << iPotention);
- if( (mexPotentionWidth > MAX_ALLOWED_MEX_SIZE) ||
- (mexPotentionHeight > MAX_ALLOWED_MEX_SIZE))
- break;
- sprintf( strSize, "%.2f x %.2f",
- METERS_MEX( mexPotentionWidth), METERS_MEX( mexPotentionHeight));
- INDEX iAddedAs = m_ctrlMexSizeCombo.AddString( CString(strSize));
- // connect item and represented mex value
- m_ctrlMexSizeCombo.SetItemData( iAddedAs, mexPotentionWidth);
- // try to select consistent size
- if( mexPotentionWidth == m_mexInitialCreatedWidth)
- {
- iInitialSelectedSize = iPotention;
- }
- // next potention
- iPotention ++;
- }
- // select size
- m_ctrlMexSizeCombo.SetCurSel( iInitialSelectedSize);
- }
- void CDlgCreateEffectTexture::InitializeEffectTypeCombo( void)
- {
- // get selected effect class
- INDEX iClass = m_ctrlEffectClassCombo.GetCurSel();
- // obtain effect source table for current effect class
- struct TextureEffectSourceType *patestSourceEffectTypes =
- _ategtTextureEffectGlobalPresets[ iClass].tet_atestEffectSourceTypes;
- INDEX ctSourceEffectTypes = _ategtTextureEffectGlobalPresets[ iClass].tet_ctEffectSourceTypes;
- // initialize effect groups combo
- m_ctrlEffectTypeCombo.ResetContent();
- for( INDEX iEffectType=0; iEffectType<ctSourceEffectTypes; iEffectType++)
- {
- m_ctrlEffectTypeCombo.AddString(
- CString(patestSourceEffectTypes[ iEffectType].test_strName));
- }
- m_ctrlEffectTypeCombo.SetCurSel( 0);
- }
- void CDlgCreateEffectTexture::SelectPixSizeCombo(void)
- {
- m_ctrlPixWidthCombo.SetCurSel( 0);
- m_ctrlPixHeightCombo.SetCurSel( 0);
- for( INDEX iWidthItem=0; iWidthItem<m_ctrlPixWidthCombo.GetCount(); iWidthItem++)
- {
- if( (1<<iWidthItem) == m_pixInitialCreatedWidth)
- {
- m_ctrlPixWidthCombo.SetCurSel( iWidthItem);
- }
- }
- for( INDEX iHeightItem=0; iHeightItem<m_ctrlPixWidthCombo.GetCount(); iHeightItem++)
- {
- if( (1<<iHeightItem) == m_pixInitialCreatedHeight)
- {
- m_ctrlPixHeightCombo.SetCurSel( iHeightItem);
- }
- }
- InitializeSizeCombo();
- }
- BOOL CDlgCreateEffectTexture::OnInitDialog()
- {
- CDialog::OnInitDialog();
-
- // set default created texture's size
- INDEX iInitialSelectedSize = 0;
- // first combo entry is selected by default (requesting maximum mip maps to be created)
- INDEX iInitialSelectedMipMapCombo = 0;
- // fill width combo
- m_ctrlPixWidthCombo.ResetContent();
- m_ctrlPixWidthCombo.AddString(L"1");
- m_ctrlPixWidthCombo.AddString(L"2");
- m_ctrlPixWidthCombo.AddString(L"4");
- m_ctrlPixWidthCombo.AddString(L"8");
- m_ctrlPixWidthCombo.AddString(L"16");
- m_ctrlPixWidthCombo.AddString(L"32");
- m_ctrlPixWidthCombo.AddString(L"64");
- m_ctrlPixWidthCombo.AddString(L"128");
- m_ctrlPixWidthCombo.AddString(L"256");
- // fill height combo
- m_ctrlPixHeightCombo.ResetContent();
- m_ctrlPixHeightCombo.AddString(L"1");
- m_ctrlPixHeightCombo.AddString(L"2");
- m_ctrlPixHeightCombo.AddString(L"4");
- m_ctrlPixHeightCombo.AddString(L"8");
- m_ctrlPixHeightCombo.AddString(L"16");
- m_ctrlPixHeightCombo.AddString(L"32");
- m_ctrlPixHeightCombo.AddString(L"64");
- m_ctrlPixHeightCombo.AddString(L"128");
- m_ctrlPixHeightCombo.AddString(L"256");
-
- // initialize effect groups combo
- m_ctrlEffectClassCombo.ResetContent();
- for( INDEX iEffectClass=0; iEffectClass<_ctTextureEffectGlobalPresets; iEffectClass++)
- {
- m_ctrlEffectClassCombo.AddString(
- CString(_ategtTextureEffectGlobalPresets[ iEffectClass].tegt_strName));
- }
- INDEX iSelectedEffectClass = m_tdCreated.td_ptegEffect->teg_ulEffectType;
- m_ctrlEffectClassCombo.SetCurSel( iSelectedEffectClass);
- // initialize sub effects
- InitializeEffectTypeCombo();
- m_ctrlCheckButton.SetCheck( 1);
-
- SelectPixSizeCombo();
- return TRUE;
- }
- void CDlgCreateEffectTexture::OnBrowseBase()
- {
- CTFileName fnNewBase;
- // if there is base texture obtained, release it
- if( m_tdCreated.td_ptdBaseTexture != NULL)
- {
- fnNewBase = _EngineGUI.BrowseTexture( m_tdCreated.td_ptdBaseTexture->GetName(),
- KEY_NAME_BASE_TEXTURE_DIR, "Browse base texture");
- }
- else
- {
- fnNewBase = _EngineGUI.BrowseTexture( CTString(""), KEY_NAME_BASE_TEXTURE_DIR,
- "Browse base texture");
- }
- SetNewBaseTexture( fnNewBase);
- CreateTexture();
- }
- void CDlgCreateEffectTexture::OnRemoveAllEffects()
- {
- CreateTexture();
- }
- void CDlgCreateEffectTexture::OnSelchangeMexSize()
- {
- CreateTexture();
- }
- void CDlgCreateEffectTexture::OnSelchangePixHeight()
- {
- INDEX iSelectedWidth = m_ctrlPixWidthCombo.GetCurSel();
- INDEX iSelectedHeight = m_ctrlPixHeightCombo.GetCurSel();
- InitializeSizeCombo();
- CreateTexture();
- }
- void CDlgCreateEffectTexture::OnSelchangePixWidth()
- {
- INDEX iSelectedWidth = m_ctrlPixWidthCombo.GetCurSel();
- INDEX iSelectedHeight = m_ctrlPixHeightCombo.GetCurSel();
- InitializeSizeCombo();
- CreateTexture();
- }
- void CDlgCreateEffectTexture::CreateTexture( void)
- {
- // obtain selected sizes
- m_pixInitialCreatedWidth = 1<<m_ctrlPixWidthCombo.GetCurSel();
- m_pixInitialCreatedHeight = 1<<m_ctrlPixHeightCombo.GetCurSel();
- m_mexInitialCreatedWidth = m_ctrlMexSizeCombo.GetItemData( m_ctrlMexSizeCombo.GetCurSel());
- // get selected effect class
- INDEX iClass = m_ctrlEffectClassCombo.GetCurSel();
- // create empty effect texture
- m_tdCreated.CreateEffectTexture( m_pixInitialCreatedWidth, m_pixInitialCreatedHeight,
- m_mexInitialCreatedWidth, m_tdCreated.td_ptdBaseTexture, iClass);
- }
- void CDlgCreateEffectTexture::OnCreateAs()
- {
- // call save texture file requester
- CTFileName fnNewTexName = _EngineGUI.BrowseTexture( CTString(CStringA(m_strCreatedTextureName)),
- KEY_NAME_CREATE_TEXTURE_DIR, "Create texture as", FALSE);
- // if picked valid name
- if( fnNewTexName != "")
- {
- // save as final texture
- try
- {
- m_tdCreated.Save_t( fnNewTexName);
- }
- catch(char *err_str)
- {
- AfxMessageBox( CString(err_str));
- return;
- }
- // remember new name
- m_strCreatedTextureName = fnNewTexName;
- m_fnCreatedTextureName = fnNewTexName;
- // show the change
- UpdateData( FALSE);
- }
- }
- void CDlgCreateEffectTexture::OnCreate()
- {
- if( m_strCreatedTextureName == "Unnamed")
- {
- OnCreateAs();
- }
- else
- {
- // save as final texture
- try
- {
- m_fnCreatedTextureName = CTString( CStringA(m_strCreatedTextureName));
- m_tdCreated.Save_t( m_fnCreatedTextureName);
- }
- catch(char *err_str)
- {
- AfxMessageBox( CString(err_str));
- return;
- }
- }
- if( m_strCreatedTextureName != "Unnamed")
- {
- EndDialog( IDOK);
- }
- }
- void CDlgCreateEffectTexture::OnSelchangeEffectClass()
- {
- // initialize sub effects
- InitializeEffectTypeCombo();
- CreateTexture();
- }
- void CDlgCreateEffectTexture::OnSelchangeEffectType()
- {
- }
|