| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** 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, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : LevelEdit *
- * *
- * $Archive:: /Commando/Code/Tools/W3DView/TextureSettingsDialog.cpp $Modtime:: $*
- * *
- * $Revision:: 6 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "StdAfx.H"
- #include "Texture.H"
- #include "W3DView.H"
- #include "TextureSettingsDialog.H"
- #include "Utils.H"
- #include "AssetMgr.H"
- /*#ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif*/
- /////////////////////////////////////////////////////////////////////////////
- //
- // Local data types
- //
- typedef enum
- {
- TYPE_LOOP = 0,
- TYPE_ONCE,
- TYPE_PING_PONG,
- TYPE_MANUAL,
- TYPE_COUNT
- } ANIM_TYPES;
- #ifdef WW3D_DX8
- /////////////////////////////////////////////////////////////////////////////
- //
- // TextureSettingsDialogClass
- //
- TextureSettingsDialogClass::TextureSettingsDialogClass
- (
- IndirectTextureClass *ptexture,
- IndirectTextureClass *poriginal_texture,
- CWnd *pParent
- )
- : m_pTexture (NULL),
- m_pOriginalTexture (NULL),
- m_pStartingTexture (NULL),
- m_hThumbnail (NULL),
- m_bWereSettingsModified (false),
- CDialog(TextureSettingsDialogClass::IDD, pParent)
- {
- //{{AFX_DATA_INIT(TextureSettingsDialogClass)
- //}}AFX_DATA_INIT
- MEMBER_ADD (m_pTexture, ptexture);
- MEMBER_ADD (m_pOriginalTexture, poriginal_texture);
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // ~TextureSettingsDialogClass
- //
- TextureSettingsDialogClass::~TextureSettingsDialogClass (void)
- {
- SR_RELEASE (m_pTexture);
- SR_RELEASE (m_pOriginalTexture);
- SR_RELEASE (m_pStartingTexture);
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // DoDataExchange
- //
- void
- TextureSettingsDialogClass::DoDataExchange (CDataExchange *pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(TextureSettingsDialogClass)
- DDX_Control(pDX, IDC_TYPE_COMBO, m_TypeCombo);
- DDX_Control(pDX, IDC_FPS_SPIN, m_FrameRateSpin);
- DDX_Control(pDX, IDC_FRAME_COUNT_SPIN, m_FrameCountSpin);
- //}}AFX_DATA_MAP
- return ;
- }
- BEGIN_MESSAGE_MAP(TextureSettingsDialogClass, CDialog)
- //{{AFX_MSG_MAP(TextureSettingsDialogClass)
- ON_BN_CLICKED(IDC_ANIMATION_CHECK, OnAnimationCheck)
- ON_WM_DESTROY()
- ON_BN_CLICKED(IDC_BROWSE_BUTTON, OnBrowseButton)
- ON_BN_CLICKED(IDC_RESTORE, OnRestore)
- ON_BN_CLICKED(IDC_APPLY, OnApply)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnInitDialog
- //
- BOOL
- TextureSettingsDialogClass::OnInitDialog (void)
- {
- // Allow the base class to process this message
- CDialog::OnInitDialog ();
- ASSERT (m_pTexture != NULL);
- ASSERT (m_pTexture->getClassID () == ID_INDIRECT_TEXTURE_CLASS);
-
- // Determine what the starting texture was so we can restore on cancel (if necessary)
- m_pStartingTexture = m_pTexture->Get_Texture ();
- //m_pStartingTexture->addReference ();
- // Set the range of the spin controls
- m_FrameCountSpin.SetRange (1, 10000);
- m_FrameRateSpin.SetRange (1, 10000);
- // Remove the border from around our child window
- HWND hchild_wnd = ::GetDlgItem (m_hWnd, IDC_TEXTURE_THUMBNAIL);
- LONG style = ::GetWindowLong (hchild_wnd, GWL_STYLE);
- ::SetWindowLong (hchild_wnd, GWL_STYLE, style & (~WS_BORDER));
- // Enable or disable the 'restore' button based on whether or not we
- // have an original texture to switch to...
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_RESTORE), (m_pOriginalTexture != NULL));
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_APPLY), FALSE);
- // Fill the dialog controls with data from the texture
- Load_Texture_Settings ();
- return TRUE;
- }
- ////////////////////////////////////////////////////////////////////////////
- //
- // Load_Texture_Settings
- //
- void
- TextureSettingsDialogClass::Load_Texture_Settings (void)
- {
- // Free the old thumbnail (if there was one)
- if (m_hThumbnail != NULL) {
- DeleteObject (m_hThumbnail);
- m_hThumbnail = NULL;
- }
- // Get the actual texture...
- TextureClass *ptexture = m_pTexture->Get_Texture ();
- // Refresh the preview window
- m_hThumbnail = Make_Bitmap_From_Texture (*ptexture, 96, 96);
- Paint_Thumbnail ();
- // Fill the controls using the texture pointer
- Fill_Controls (ptexture);
- Fill_Animation_Controls (ptexture);
- OnAnimationCheck ();
- // Release our hold on the texture
- SR_RELEASE (ptexture);
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Fill_Controls
- //
- void
- TextureSettingsDialogClass::Fill_Controls (TextureClass *ptexture)
- {
- srTexture *psource = NULL;
- // What type of texture is this?
- switch (ptexture->getClassID ())
- {
- case srClass::ID_TEXTURE_FILE:
- psource = (srTextureFile *)ptexture;
- SetDlgItemText (IDC_FILENAME_EDIT, ptexture->getName ());
- break;
- case ID_MANUAL_ANIM_TEXTURE_INSTANCE_CLASS:
- case ID_TIME_ANIM_TEXTURE_INSTANCE_CLASS:
- case ID_RESIZEABLE_TEXTURE_INSTANCE_CLASS:
- SendDlgItemMessage (IDC_RESIZEABLE_CHECK, BM_SETCHECK, (WPARAM)TRUE);
- psource = ((ResizeableTextureInstanceClass *)ptexture)->Peek_Source();
- // Fill the 'filename' edit control
- if (psource != NULL && (psource->getClassID () == ID_FILE_LIST_TEXTURE_CLASS)) {
- FileListTextureClass *pfile_list = static_cast<FileListTextureClass *>(psource);
- SetDlgItemText (IDC_FILENAME_EDIT, pfile_list->Get_Filename (0));
- }
-
- break;
- default:
- ASSERT (0);
- break;
- }
-
- // Set the checkboxes
- ASSERT (psource != NULL);
- if (psource != NULL) {
- SendDlgItemMessage (IDC_MIPMAP_OFF_CHECK, BM_SETCHECK, (WPARAM)(psource->getMipmap () == srTextureIFace::MIPMAP_NONE));
- SendDlgItemMessage (IDC_ALPHA_CHECK, BM_SETCHECK, (WPARAM)(psource->isHintEnabled(srTextureIFace::HINT_ALPHA_BITMASK)));
- SendDlgItemMessage (IDC_CLAMPU_CHECK, BM_SETCHECK, (WPARAM)(psource->Get_U_Addr_Mode() == TextureClass::TEXTURE_ADDRESS_CLAMP));
- SendDlgItemMessage (IDC_CLAMPV_CHECK, BM_SETCHECK, (WPARAM)(psource->Get_V_Addr_Mode() == TextureClass::TEXTURE_ADDRESS_CLAMP));
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Fill_Animation_Controls
- //
- void
- TextureSettingsDialogClass::Fill_Animation_Controls (TextureClass *ptexture)
- {
- bool banimated = false;
- int frame_count = 0;
- float frames_per_sec = 0;
- ANIM_TYPES type = TYPE_ONCE;
- // What type is the texture?
- switch (ptexture->getClassID ())
- {
- case ID_MANUAL_ANIM_TEXTURE_INSTANCE_CLASS:
- {
- ManualAnimTextureInstanceClass *anim_texture = (ManualAnimTextureInstanceClass *)ptexture;
- frame_count = anim_texture->Get_Num_Frames ();
- frames_per_sec = 15.0F;
- type = TYPE_MANUAL;
- banimated = true;
- }
- break;
-
- case ID_TIME_ANIM_TEXTURE_INSTANCE_CLASS:
- {
- // What mode is this animated texture using
- TimeAnimTextureInstanceClass *anim_texture = (TimeAnimTextureInstanceClass *)ptexture;
- switch (anim_texture->Get_Mode ())
- {
- case TimeAnimTextureInstanceClass::ONE_TIME:
- type = TYPE_ONCE;
- break;
- case TimeAnimTextureInstanceClass::LOOP:
- type = TYPE_LOOP;
- break;
- case TimeAnimTextureInstanceClass::PINGPONG:
- type = TYPE_PING_PONG;
- break;
- };
- // Get the texture's frame rate and count
- frame_count = anim_texture->Get_Num_Frames ();
- frames_per_sec = anim_texture->Get_Frame_Rate ();
- banimated = true;
- }
- break;
- }
- // Check or uncheck the animation box depending on if it was an animated texture
- SendDlgItemMessage (IDC_ANIMATION_CHECK, BM_SETCHECK, (WPARAM)banimated);
-
- // Was this an animated texture?
- if (banimated == true) {
-
- // Pass the frame count onto the control
- frame_count = (frame_count > 0) ? frame_count : 1;
- SetDlgItemInt (IDC_FRAME_COUNT_EDIT, frame_count);
- m_FrameCountSpin.SetPos (frame_count);
-
- // Pass the frame rate onto the control
- frames_per_sec = (frames_per_sec > 0) ? frames_per_sec : 1;
- SetDlgItemInt (IDC_FPS_EDIT, (int)frames_per_sec);
- m_FrameRateSpin.SetPos (frames_per_sec);
- // Select the type in the combobox
- m_TypeCombo.SetCurSel ((int)type);
- } else {
- m_TypeCombo.SetCurSel (0);
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnOK
- //
- void
- TextureSettingsDialogClass::OnOK (void)
- {
- // Force the new settings to take effect
- OnApply ();
- // Allow the base class to process this message
- CDialog::OnOK ();
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnCancel
- //
- void
- TextureSettingsDialogClass::OnCancel (void)
- {
- // Reuse the starting texture
- m_pTexture->Set_Texture (m_pStartingTexture);
- // Allow the base class to process this message
- CDialog::OnCancel ();
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnAnimationCheck
- //
- void
- TextureSettingsDialogClass::OnAnimationCheck (void)
- {
- bool benable = (SendDlgItemMessage (IDC_ANIMATION_CHECK, BM_GETCHECK) == 1);
- // Enable or disable the controls based on the animation checkbox-state
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_FRAME_COUNT_EDIT), benable);
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_FPS_EDIT), benable);
- ::EnableWindow (m_TypeCombo, benable);
- ::EnableWindow (m_FrameRateSpin, benable);
- ::EnableWindow (m_FrameCountSpin, benable);
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // WindowProc
- //
- LRESULT
- TextureSettingsDialogClass::WindowProc
- (
- UINT message,
- WPARAM wParam,
- LPARAM lParam
- )
- {
- if (message == WM_PAINT) {
- Paint_Thumbnail ();
- } else if (message == WM_COMMAND) {
-
- // What control sent us this notification?
- switch (LOWORD (wParam))
- {
- case IDC_FRAME_COUNT_EDIT:
- case IDC_FPS_EDIT:
- case IDC_FILENAME_EDIT:
- if ((HIWORD (wParam) == EN_UPDATE) ||
- (HIWORD (wParam) == EN_CHANGE)) {
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_APPLY), TRUE);
- }
- break;
- case IDC_MIPMAP_OFF_CHECK:
- case IDC_CLAMPU_CHECK:
- case IDC_CLAMPV_CHECK:
- case IDC_ALPHA_CHECK:
- case IDC_RESIZEABLE_CHECK:
- case IDC_ANIMATION_CHECK:
- if (HIWORD (wParam) == BN_CLICKED) {
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_APPLY), TRUE);
- }
- break;
- case IDC_TYPE_COMBO:
- if (HIWORD (wParam) == CBN_SELCHANGE) {
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_APPLY), TRUE);
- }
- break;
- }
- }
-
- // Allow the base class to process this message
- return CDialog::WindowProc (message, wParam, lParam);
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnDestroy
- //
- void
- TextureSettingsDialogClass::OnDestroy (void)
- {
- if (m_hThumbnail != NULL) {
- ::DeleteObject (m_hThumbnail);
- m_hThumbnail = NULL;
- }
- // Allow the base class to process this message
- CDialog::OnDestroy ();
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnBrowseButton
- //
- void
- TextureSettingsDialogClass::OnBrowseButton (void)
- {
- // Get the current filename to display
- CString filename;
- GetDlgItemText (IDC_FILENAME_EDIT, filename);
- CFileDialog dialog (TRUE,
- ".tga",
- filename,
- OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_EXPLORER,
- "Targa files (*.tga)|*.tga||",
- this);
- // Ask the user what Targa file they wish to load
- if (dialog.DoModal () == IDOK) {
- WW3D::Add_Search_Path (::Strip_Filename_From_Path (dialog.GetFileName ()));
- // Set the text of the filename combobox control
- SetDlgItemText (IDC_FILENAME_EDIT, dialog.GetFileName ());
- SendDlgItemMessage (IDC_FILENAME_EDIT, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
- // Enable the apply button
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_APPLY), TRUE);
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Paint_Thumbnail
- //
- void
- TextureSettingsDialogClass::Paint_Thumbnail (void)
- {
- // Paint the thumbnail
- if (m_hThumbnail != NULL) {
-
- // Get the misc crap windows requries before we can
- // paint to the screen
- HWND hchild_wnd = ::GetDlgItem (m_hWnd, IDC_TEXTURE_THUMBNAIL);
- HDC hdc = ::GetDC (hchild_wnd);
- HDC hmem_dc = ::CreateCompatibleDC (NULL);
- HBITMAP hold_bmp = (HBITMAP)::SelectObject (hmem_dc, m_hThumbnail);
- // Paint the thumbnail onto the dialog
- CRect rect;
- ::GetClientRect (hchild_wnd, &rect);
- ::BitBlt (hdc,
- rect.left + (rect.Width () >> 1) - 48,
- rect.top + (rect.Height () >> 1) - 48,
- 96,
- 96,
- hmem_dc,
- 0,
- 0,
- SRCCOPY);
- // Release the misc windows crap
- ::SelectObject (hmem_dc, hold_bmp);
- ::ReleaseDC (hchild_wnd, hmem_dc);
- ::DeleteDC (hmem_dc);
- ::ValidateRect (hchild_wnd, NULL);
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnRestore
- //
- void
- TextureSettingsDialogClass::OnRestore (void)
- {
- if (m_pOriginalTexture != NULL) {
- // Get the original texture
- TextureClass *pnew_texture = m_pOriginalTexture->Get_Texture ();
- m_pTexture->Set_Texture (pnew_texture);
- MEMBER_RELEASE (pnew_texture);
- // Reload the dialog control settings
- Load_Texture_Settings ();
- // Disable the apply button because we just did...
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_APPLY), FALSE);
- }
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnApply
- //
- void
- TextureSettingsDialogClass::OnApply (void)
- {
- // Get the current texture name from the edit control
- CString texture_name;
- GetDlgItemText (IDC_FILENAME_EDIT, texture_name);
- // Determine some of the texture settings
- TextureClass *pnew_texture = new TimeAnimTextureInstanceClass;
- bool resizeable = (SendDlgItemMessage (IDC_RESIZEABLE_CHECK, BM_GETCHECK) == TRUE);
- int frame_count = GetDlgItemInt (IDC_FRAME_COUNT_EDIT);
- int frame_rate = GetDlgItemInt (IDC_FPS_EDIT);
- // Does the user want this to be an animated texture?
- if (SendDlgItemMessage (IDC_ANIMATION_CHECK, BM_GETCHECK) == 1) {
-
- // What type of animated texture is this?
- switch ((ANIM_TYPES)m_TypeCombo.GetCurSel ())
- {
- case TYPE_LOOP:
- pnew_texture = new TimeAnimTextureInstanceClass (*(WW3DAssetManager::Get_Instance ()),
- texture_name,
- frame_count,
- (float)frame_rate,
- TimeAnimTextureInstanceClass::LOOP,
- TimeAnimTextureInstanceClass::FORWARD);
- break;
- case TYPE_ONCE:
- pnew_texture = new TimeAnimTextureInstanceClass (*(WW3DAssetManager::Get_Instance ()),
- texture_name,
- frame_count,
- (float)frame_rate,
- TimeAnimTextureInstanceClass::ONE_TIME,
- TimeAnimTextureInstanceClass::FORWARD);
- break;
- case TYPE_PING_PONG:
- pnew_texture = new TimeAnimTextureInstanceClass (*(WW3DAssetManager::Get_Instance ()),
- texture_name,
- frame_count,
- (float)frame_rate,
- TimeAnimTextureInstanceClass::PINGPONG,
- TimeAnimTextureInstanceClass::FORWARD);
- break;
- case TYPE_MANUAL:
- pnew_texture = new ManualAnimTextureInstanceClass (*(WW3DAssetManager::Get_Instance ()),
- texture_name,
- frame_count);
- break;
- }
- } else {
- // Should we allocate a resizeable texture or a normal one?
- /*if (resizeable) {
- pnew_texture = new ResizeableTextureInstanceClass (*(WW3DAssetManager::Get_Instance ()), texture_name);
- } else {*/
- // Normal texture, simply load it from file
- pnew_texture = WW3DAssetManager::Get_Instance ()->Get_Texture (texture_name);
- //}
- }
- ASSERT (pnew_texture != NULL);
- if (pnew_texture != NULL) {
-
- // Turn mipmapping off if necessary
- if (SendDlgItemMessage (IDC_MIPMAP_OFF_CHECK, BM_GETCHECK) == 1) {
- ::MipMapping_Off (pnew_texture);
- }
- // Compress the alpha channel to 1 bit if necessary
- if (SendDlgItemMessage (IDC_ALPHA_CHECK, BM_GETCHECK) == 1) {
- ::Set_Alpha_Bitmap (pnew_texture);
- }
-
- // Clamp the UVs if necessary
- ::Set_Clamping (pnew_texture,
- (SendDlgItemMessage (IDC_CLAMPU_CHECK, BM_GETCHECK) == 1),
- (SendDlgItemMessage (IDC_CLAMPV_CHECK, BM_GETCHECK) == 1));
-
- // Pass the new texture on, and free the old texture
- m_pTexture->Set_Texture (pnew_texture);
- // We now have a new starting texture... (used for cancel operations)
- SR_RELEASE (m_pStartingTexture);
- m_pStartingTexture = pnew_texture;
- // Reload any controls we might need to display changes...
- Load_Texture_Settings ();
- m_bWereSettingsModified = true;
- } else {
- MessageBox ("Unable to create the requested texture.", "Texture Error", MB_ICONERROR | MB_OK);
- }
- // Disable the apply button because we just did...
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_APPLY), FALSE);
- return ;
- }
- #endif //WW3D_DX8
|