mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-23 02:40:26 +01:00
306 lines
9.2 KiB
C++
306 lines
9.2 KiB
C++
|
/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
|
||
|
|
||
|
// DlgCreateNormalTexture.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "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);
|
||
|
}
|