Serious-Engine/Sources/EngineGui/DlgCreateNormalTexture.cpp
2016-04-01 14:04:24 -04:00

306 lines
9.2 KiB
C++

/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
// DlgCreateNormalTexture.cpp : implementation file
//
#include "EngineGui/StdH.h"
#include "DlgCreateNormalTexture.h"
#include <Engine/Templates/Stock_CTextureData.h>
#ifdef _DEBUG
#undef new
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static BOOL _bWasForced32 = FALSE;
/////////////////////////////////////////////////////////////////////////////
// CDlgCreateNormalTexture dialog
CDlgCreateNormalTexture::CDlgCreateNormalTexture( CTFileName fnInputFile, CWnd* pParent /*=NULL*/)
: CDialog(CDlgCreateNormalTexture::IDD, pParent)
{
//{{AFX_DATA_INIT(CDlgCreateNormalTexture)
m_strCreatedTextureName = _T("");
m_strSizeInPixels = _T("");
m_bCreateMipmaps = FALSE;
//}}AFX_DATA_INIT
m_bSourcePictureValid = FALSE;
m_bPreviewWindowsCreated = FALSE;
m_ptdCreated = NULL;
CTFileName fnTexFileName = fnInputFile.FileDir() + fnInputFile.FileName() + ".tex";
// remember source and created texture name
m_fnSourceFileName = fnInputFile;
m_fnCreatedFileName = fnTexFileName;
// set initial values for create mip maps flag and size for create texture dialog
m_bCreateMipmaps = AfxGetApp()->GetProfileInt(L"Creating textures", L"Create mipmaps", 1);
m_mexCreatedWidth = AfxGetApp()->GetProfileInt(L"Creating textures", L"Mex width", -1);
_bWasForced32 = FALSE;
try
{
// if can't get picture file information
CImageInfo iiImageInfo;
if (iiImageInfo.GetGfxFileInfo_t( m_fnSourceFileName)==UNSUPPORTED_FILE)
{
// throw error
ThrowF_t("File '%s' has unsupported file format",
(CTString&)(_fnmApplicationPath+m_fnSourceFileName));
}
// get dimensions
m_pixSourceWidth = iiImageInfo.ii_Width;
m_pixSourceHeight = iiImageInfo.ii_Height;
// test if dimensions are at power of 2
if( (((1<<((int)Log2(m_pixSourceWidth))) != m_pixSourceWidth)) ||
(((1<<((int)Log2(m_pixSourceHeight))) != m_pixSourceHeight))) {
ThrowF_t( "Picture %s has wrong dimensions (%d,%d).\n"
"Both width and height must be at power of 2.",
(CTString&)m_fnSourceFileName, m_pixSourceWidth, m_pixSourceHeight);
}
}
catch(char *err_str)
{
AfxMessageBox( CString(err_str));
return;
}
m_bSourcePictureValid = TRUE;
// try to
try
{ // obtain texture with the same name (if already exists)
CTextureData *pTD = _pTextureStock->Obtain_t( fnTexFileName);
pTD->Reload();
// now pick up initial number of mip levels
m_bCreateMipmaps = pTD->td_ctFineMipLevels>1;
// remember existing texture's width in mexels
m_mexCreatedWidth = pTD->GetWidth();
// remember existing texture's flags
_bWasForced32 = pTD->td_ulFlags & TEX_32BIT;
// release texture
_pTextureStock->Release( pTD);
}
// if texture can't be obtained
catch( char *err_str)
{ // never mind
(void) err_str;
}
m_wndViewCreatedTexture.m_bForce32 = FALSE;
if( _bWasForced32) m_wndViewCreatedTexture.m_bForce32 = TRUE;
RefreshCreatedTexture();
// set created texture name
m_strCreatedTextureName = fnTexFileName;
// prepare string telling size of source picture
char strSize[ 64];
sprintf( strSize, "%d x %d", m_pixSourceWidth, m_pixSourceHeight);
m_strSizeInPixels = strSize;
}
CDlgCreateNormalTexture::~CDlgCreateNormalTexture()
{
ReleaseCreatedTexture();
}
void CDlgCreateNormalTexture::RefreshCreatedTexture(void)
{
ReleaseCreatedTexture();
// prepare forced upload quality
_iTexForcedQuality = 16;
if( m_wndViewCreatedTexture.m_bForce32) _iTexForcedQuality = 32;
// create temporary texture to show how texture will look like
try
{
// create temporary texture
CreateTexture_t( m_fnSourceFileName, CTString( "Temp\\Temp.tex"),
m_pixSourceWidth, MAX_MEX_LOG2+1, FALSE);
m_ptdCreated = _pTextureStock->Obtain_t( CTString( "Temp\\Temp.tex"));
m_ptdCreated->Reload();
}
catch(char *err_str)
{
AfxMessageBox( CString(err_str));
return;
}
// set texture data to texture preview window so it could show preview picture
m_wndViewCreatedTexture.m_toTexture.SetData( m_ptdCreated);
}
void CDlgCreateNormalTexture::ReleaseCreatedTexture(void)
{
// if there is texture obtained, release it
if( m_ptdCreated != NULL)
{
// free obtained texture
_pTextureStock->Release( m_ptdCreated);
m_ptdCreated = NULL;
m_wndViewCreatedTexture.m_toTexture.SetData( NULL);
}
// reset forced upload quality
_iTexForcedQuality = 0;
}
void CDlgCreateNormalTexture::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
// if dialog is recieving data
if(pDX->m_bSaveAndValidate == FALSE)
{
}
//{{AFX_DATA_MAP(CDlgCreateNormalTexture)
DDX_Control(pDX, IDC_FORCE32, m_ctrlForce32);
DDX_Control(pDX, IDC_CHEQUERED_ALPHA, m_ctrlCheckButton);
DDX_Control(pDX, IDC_MEX_SIZE, m_ctrlMexSizeCombo);
DDX_Text(pDX, IDC_CREATED_TEXTURE_NAME, m_strCreatedTextureName);
DDX_Text(pDX, IDC_SIZE_IN_PIXELS, m_strSizeInPixels);
DDX_Check(pDX, IDC_CREATE_MIPMAPS, m_bCreateMipmaps);
//}}AFX_DATA_MAP
// if dialog is giving data
if(pDX->m_bSaveAndValidate != FALSE)
{
}
}
BEGIN_MESSAGE_MAP(CDlgCreateNormalTexture, CDialog)
//{{AFX_MSG_MAP(CDlgCreateNormalTexture)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_CHEQUERED_ALPHA, OnChequeredAlpha)
ON_BN_CLICKED(IDC_FORCE32, OnForce32)
ON_BN_CLICKED(ID_CREATE_TEXTURE, OnCreateTexture)
ON_BN_CLICKED(IDC_CREATE_MIPMAPS, OnCreateMipmaps)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgCreateNormalTexture message handlers
void CDlgCreateNormalTexture::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;
}
}
#define MAX_ALLOWED_MEX_SIZE 32*1024*1024
BOOL CDlgCreateNormalTexture::OnInitDialog()
{
CDialog::OnInitDialog();
char strSize[ 64];
// 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;
// obtain all available potentions of source picture's dimensions
INDEX iPotention = 0;
FOREVER
{
MEX mexPotentionWidth = m_pixSourceWidth * (1 << iPotention);
MEX mexPotentionHeight = m_pixSourceHeight * (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_mexCreatedWidth)
{
iInitialSelectedSize = iPotention;
}
// next potention
iPotention ++;
}
// select size
m_ctrlMexSizeCombo.SetCurSel( iInitialSelectedSize);
m_ctrlCheckButton.SetCheck(1);
// determine correct texture quality
if( _bWasForced32) {
m_ctrlForce32.SetCheck(1);
m_wndViewCreatedTexture.m_bForce32 = TRUE;
} else {
m_ctrlForce32.SetCheck(0);
m_wndViewCreatedTexture.m_bForce32 = FALSE;
}
// return TRUE unless you set the focus to a control
return TRUE;
}
void CDlgCreateNormalTexture::OnCreateTexture()
{
MEX mexWidth = m_ctrlMexSizeCombo.GetItemData( m_ctrlMexSizeCombo.GetCurSel());
INDEX iMipMaps = 16;
if( !m_bCreateMipmaps)
{
iMipMaps = 1;
}
// create texture
try {
CreateTexture_t( m_fnSourceFileName, m_fnCreatedFileName, mexWidth, iMipMaps,
m_wndViewCreatedTexture.m_bForce32);
}
catch( char *err_str) {
AfxMessageBox( CString(err_str));
return;
}
AfxGetApp()->WriteProfileInt(L"Creating textures", L"Create mipmaps", m_bCreateMipmaps);
AfxGetApp()->WriteProfileInt(L"Creating textures", L"Mex width", mexWidth);
// end dialog
EndDialog( IDOK);
}
void CDlgCreateNormalTexture::OnChequeredAlpha()
{
// toggle chequered alpha on/off
m_wndViewCreatedTexture.m_bChequeredAlpha = !m_wndViewCreatedTexture.m_bChequeredAlpha;
RefreshCreatedTexture();
}
void CDlgCreateNormalTexture::OnForce32()
{
// toggle force32 on/off
m_wndViewCreatedTexture.m_bForce32 = !m_wndViewCreatedTexture.m_bForce32;
RefreshCreatedTexture();
}
void CDlgCreateNormalTexture::OnCreateMipmaps()
{
m_bCreateMipmaps = !m_bCreateMipmaps;
UpdateData(FALSE);
}