Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

602 lines
16 KiB
C++

// TextureView.cpp : implementation file
//
#include "stdafx.h"
#include "Multitron.h"
#include "TextureView.h"
#include "TextureDoc.h"
#include "MainFrm.h"
#include <GameOs\TooLOS.hpp>
#include <imagelib\image.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTextureView
IMPLEMENT_DYNCREATE(CTextureView, CView)
CTextureView::CTextureView()
{
}
CTextureView::~CTextureView()
{
}
BEGIN_MESSAGE_MAP(CTextureView, CView)
//{{AFX_MSG_MAP(CTextureView)
ON_WM_CREATE()
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_DELETE, OnDelete)
ON_LBN_SELCHANGE(IDC_LIST_PAGE, OnSelchangeListPage)
ON_CBN_SELENDOK(IDC_COMBO_VALUE, OnSelendokComboValue)
ON_BN_CLICKED(IDC_APPLY, OnApply)
ON_BN_CLICKED(IDC_APPLY_ALIAS, OnApplyAlias)
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(ID_ADD_MIPMAP,ID_ADD_RESOURCIFY,OnAddMenuItems)
ON_UPDATE_COMMAND_UI(IDC_APPLY, OnUpdateUI)
ON_UPDATE_COMMAND_UI(IDC_APPLY_ALIAS, OnUpdateUI)
ON_UPDATE_COMMAND_UI(IDC_EDIT_PAGENAME, OnUpdateUI)
ON_UPDATE_COMMAND_UI(IDC_EDIT_ALIASNAME, OnUpdateUI)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTextureView drawing
void CTextureView::OnDraw(CDC* pDC)
{
}
/////////////////////////////////////////////////////////////////////////////
// CTextureView diagnostics
#ifdef _DEBUG
void CTextureView::AssertValid() const
{
CView::AssertValid();
}
void CTextureView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTextureView message handlers
BOOL CTextureView::PreCreateWindow(CREATESTRUCT& cs)
{
return CView::PreCreateWindow(cs);
}
int CTextureView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
CWnd *pFrame = GetParent();
if (!m_wndDlgBar.Create(pFrame,IDD_TEXTURE_PROPERTIES,CBRS_LEFT|CBRS_TOOLTIPS|CBRS_FLYBY,0))
{
return false;
}
return 0;
}
void CTextureView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
}
/*******************************************************************************
/* function name: OnInitialUpdate
/* description: Called when window is displayed for the first time,
/* set up window size and position
/*******************************************************************************/
void CTextureView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CRect rc;
m_wndDlgBar.GetClientRect(&rc);
rc.left +=470;
rc.right +=490;
rc.bottom =580;
CWnd *pWnd = GetParent();
pWnd->MoveWindow(rc);
}
/*******************************************************************************
/* function name: OnUpdate
/* description: Called when hosted documents are updated
/*******************************************************************************/
void CTextureView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CTextureDoc* pDoc = (CTextureDoc *)GetDocument();
Stuff::Page *pPage = NULL;
Image *pImage = NULL;
// If we only have one item then select it
if (pDoc->GetCount() == 1)
{
pPage = pDoc->GetPage(0);
pImage = pDoc->GetImage(0);
}
CEdit *pAliasEdit = (CEdit *)m_wndDlgBar.GetDlgItem(IDC_EDIT_ALIASNAME);
pAliasEdit->SetWindowText("");
CEdit *pEdit = (CEdit *)m_wndDlgBar.GetDlgItem(IDC_EDIT_PAGENAME);
pEdit->SetWindowText("");
CListBox *pList = (CListBox *)m_wndDlgBar.GetDlgItem(IDC_LIST_PAGE);
pList->ResetContent();
//Fill in the page properties list
if (pPage)
{
CString pagename = pPage->GetName();
pEdit->SetWindowText(pagename);
CString str;
Stuff::Page::NoteIterator *notes = pPage->MakeNoteIterator();
Stuff::Note *note;
while (NULL != (note = notes->ReadAndNext()))
{
const char *entry;
CString name = note->GetName();
note->GetEntry(&entry);
str.Format("%s=%s",name,entry);
int index = pList->AddString(str);
pList->SetItemData(index,(DWORD)note);
if (0==stricmp(name,"alias"))
{
pAliasEdit->SetWindowText(entry);
}
}
delete notes;
if (NULL == pHint)
pList->SetCurSel(0);
else {
CPtrList* list = (CPtrList*)pHint;
Stuff::Note* note = (Stuff::Note*)list->GetHead();
CString name = note->GetName();
name.MakeLower();
int index = pList->FindString(0, name);
pList->SetCurSel(index);
}
}
else
{
// Display comparison of all pages
CMapStringToString map;
CMapStringToString mapRef;
for (int x=0;x<pDoc->GetCount();x++)
{
Stuff::Page *page = pDoc->GetPage(x);
Stuff::Page::NoteIterator *notes = page->MakeNoteIterator();
Stuff::Note *note;
while (NULL != (note = notes->ReadAndNext()))
{
const char *entry;
CString name = note->GetName();
note->GetEntry(&entry);
name.MakeLower();
CString value;
if (map.Lookup(name,value))
{
mapRef[name] = "yes";
if (value.CompareNoCase(entry)==0)
{
// Use this value
}
else
{
map[name] = "";
}
}
else
{
if (x==0)
map[name] = entry;
}
}
delete notes;
}
POSITION pos = map.GetStartPosition();
while (pos)
{
CString key,value;
map.GetNextAssoc(pos,key,value);
if (mapRef[key] == "yes") {
CString str;
str.Format("%s=%s",key,value);
pList->AddString(str);
}
}
}
OnSelchangeListPage();
}
/*******************************************************************************
/* function name: OnAdd
/* description: Pop up a list of possible entries to added to the hint page
/*******************************************************************************/
void CTextureView::OnAdd()
{
CMenu *pMenu = AfxGetMainWnd()->GetMenu();
CMenu *pSubMenu = pMenu->GetSubMenu(3);
pSubMenu = pSubMenu->GetSubMenu(0);
CRect rc;
m_wndDlgBar.GetDlgItem(IDC_ADD)->GetWindowRect(&rc);
CPoint point;
point.x = rc.right;
point.y = rc.top;
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,point.x, point.y, this, NULL);
}
/*******************************************************************************
/* function name: OnDelete
/* description: Delete seleted entries from the hint page
/*******************************************************************************/
void CTextureView::OnDelete()
{
CListBox *pList = (CListBox *)m_wndDlgBar.GetDlgItem(IDC_LIST_PAGE);
int index = pList->GetCurSel();
if (index < 0)
return;
CString str;
pList->GetText(index, str);
str = str.Left(str.Find("="));
pList->DeleteString(index);
CTextureDoc* pDoc = (CTextureDoc *)GetDocument();
int count = pDoc->GetCount();
for (int x=0;x<count;x++)
{
Stuff::Page *page = pDoc->GetPage(x);
CString str1 = str;
str1.MakeLower();
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
CString value;
if (pApp->m_mapHintParams.Lookup(str1,value))
{
if (value.GetLength())
{
page->DeleteNote(str);
pDoc->UpdateAllViews(NULL);
}
}
}
}
/*******************************************************************************
/* function name: OnSelchangeListPage
/* description: Highlight in the entry list has changed, update the list of
/* possible entry values
/*******************************************************************************/
void CTextureView::OnSelchangeListPage()
{
CComboBox *pCombo = (CComboBox *)m_wndDlgBar.GetDlgItem(IDC_COMBO_VALUE);
pCombo->ResetContent();
CListBox *pList = (CListBox *)m_wndDlgBar.GetDlgItem(IDC_LIST_PAGE);
int index = pList->GetCurSel();
if (index>=0)
{
CString notename;
CString entry;
Stuff::Note *note = (Stuff::Note *)pList->GetItemData(index);
if (note)
{
Check_Object(note);
notename = note->GetName();
notename.MakeLower();
const char *e;
note->GetEntry(&e);
entry = e;
}
else
{
pList->GetText(index,notename);
int i = notename.Find('=');
if (i>=0)
{
entry = notename;
entry.Delete(0,i+1);
notename = notename.Left(i);
}
}
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
CString value;
if (pApp->m_mapHintParams.Lookup(notename,value))
{
while (value.GetLength())
{
CString addstr;
int i = value.Find('|');
if (i>=0)
{
addstr = value.Left(i);
value.Delete(0,i+1);
}
else
{
addstr = value;
value.Empty();
}
int index = pCombo->AddString(addstr);
if (0==stricmp(entry,addstr))
{
pCombo->SetCurSel(index);
}
}
}
}
}
/*******************************************************************************
/* function name: OnSelendokComboValue
/* description: User selects a value for the highlight entry
/*******************************************************************************/
void CTextureView::OnSelendokComboValue()
{
CTextureDoc* pDoc = (CTextureDoc *)GetDocument();
CListBox *pList = (CListBox *)m_wndDlgBar.GetDlgItem(IDC_LIST_PAGE);
int index = pList->GetCurSel();
Stuff::Note *note = (Stuff::Note *)pList->GetItemData(index);
CComboBox *pCombo = (CComboBox *)m_wndDlgBar.GetDlgItem(IDC_COMBO_VALUE);
index = pCombo->GetCurSel();
if (CB_ERR != index)
{
CString str;
CString selname;
pCombo->GetLBText(index,str);
if (note)
{
note->SetEntry(str);
selname = note->GetName();
}
else
{
CListBox *pList = (CListBox *)m_wndDlgBar.GetDlgItem(IDC_LIST_PAGE);
int x = pList->GetCurSel();
CString name;
pList->GetText(x,name);
x = name.Find('=');
if (x>=0)
{
name = name.Left(x);
}
selname = name;
for (x=0;x<pDoc->GetCount();x++)
{
Stuff::Page *page = pDoc->GetPage(x);
page->SetEntry(name,str);
}
}
pDoc->UpdateAllViews(NULL);
CListBox *pList = (CListBox *)m_wndDlgBar.GetDlgItem(IDC_LIST_PAGE);
for (int x=0;x<pList->GetCount();x++)
{
pList->GetText(x,str);
int i = str.Find('=');
if (i>0)
{
str = str.Left(i);
}
if (str.CompareNoCase(selname)==0) {
pList->SetCurSel(x);
OnSelchangeListPage();
}
}
}
}
/*******************************************************************************
/* function name: OnAddMenuItems
/* description: Add seleted entry to the hint page with default value set
/*******************************************************************************/
void CTextureView::OnAddMenuItems(UINT nID)
{
CMenu *pMenu = AfxGetMainWnd()->GetMenu();
CMenu *pSubMenu = pMenu->GetSubMenu(3);
pSubMenu = pSubMenu->GetSubMenu(0);
CString str;
pSubMenu->GetMenuString(nID,str,MF_BYCOMMAND);
CTextureDoc* pDoc = (CTextureDoc *)GetDocument();
int count = pDoc->GetCount();
for (int x=0;x<count;x++)
{
Stuff::Page *page = pDoc->GetPage(x);
CStringList list;
Stuff::Page::NoteIterator *notes = page->MakeNoteIterator();
Stuff::Note *note;
while ((note = notes->ReadAndNext()) != NULL)
{
CString name = note->GetName();
name.MakeLower();
list.AddTail(name);
}
delete notes;
CString str1 = str;
str1.MakeLower();
if (list.Find(str1))
continue;
// We now have a valid entry called str that we want to add
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
// Get the default value (first in list)
CString value = pApp->m_mapHintParams[str1];
int index = value.Find('|');
// Add to the file
if (index>=0)
{
value = value.Left(index);
note = page->AddNote(str);
note->SetEntry(value);
CPtrList list;
list.AddHead((LPVOID)note);
pDoc->UpdateAllViews(NULL,0,&list);
}
}
}
/*******************************************************************************
/* function name: OnApply
/* description: Change the hint page name, and rename the texture file name
/*******************************************************************************/
void CTextureView::OnApply()
{
CEdit *pEdit = (CEdit *)m_wndDlgBar.GetDlgItem(IDC_EDIT_PAGENAME);
CTextureDoc* pDoc = (CTextureDoc *)GetDocument();
// Only doable if only one hint it selected
if (pDoc->GetCount() == 1)
{
Stuff::Page* page = pDoc->GetPage(0);
if (page)
{
Stuff::NotationFile *pFile = page->GetNotationFile();
CString newname;
pEdit->GetWindowText(newname);
Stuff::Page *newpage = pFile->FindPage(newname);
if (NULL != newpage)
{
CString str;
str.Format("%s Already Exists",newname);
MessageBox(str,"Rename",MB_OK);
return;
}
newpage = pFile->AddPage(newname);
Stuff::Page::NoteIterator *notes = page->MakeNoteIterator();
Stuff::Note *note;
while (NULL != (note = notes->ReadAndNext()))
{
const char *entry;
CString name = note->GetName();
note->GetEntry(&entry);
newpage->AppendEntry(name,entry);
}
delete notes;
// Rename the texture file
if (::gos_DoesFileExist(CString("content\\textures\\")+page->GetName()+".png"))
if (IDYES == MessageBox("Do you want to rename the texture file?",newpage->GetName(),MB_YESNO))
::gos_RenameFile(CString("content\\textures\\")+page->GetName()+".png",
CString("content\\textures\\")+newpage->GetName()+".png");
else if (::gos_DoesFileExist(CString("content\\textures\\")+page->GetName()+".tga"))
if (IDYES == MessageBox("Do you want to rename the texture file?",newpage->GetName(),MB_YESNO))
::gos_RenameFile(CString("content\\textures\\")+page->GetName()+".tga",
CString("content\\textures\\")+newpage->GetName()+".tga");
pFile->DeletePage(page->GetName());
pDoc->ReplacePage(page,newpage);
pDoc->UpdateAllViews(NULL);
// Refresh all the build files views
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
pApp->RefreshFiles();
}
}
}
extern bool g_bWarnDuplicateAlias;
/*******************************************************************************
/* function name: OnApplyAlias
/* description: Change the alias name
/*******************************************************************************/
void CTextureView::OnApplyAlias()
{
CEdit *pEdit = (CEdit *)m_wndDlgBar.GetDlgItem(IDC_EDIT_ALIASNAME);
CTextureDoc* pDoc = (CTextureDoc *)GetDocument();
// Only doable if only one hint it selected
if (pDoc->GetCount() == 1)
{
Stuff::Page* page = pDoc->GetPage(0);
if (page)
{
CString str;
pEdit->GetWindowText(str);
if (str.GetLength())
{
page->SetEntry("Alias",str);
page->SetEntry("Resourcify","false");
Stuff::NotationFile *pFile = page->GetNotationFile();
Check_Object(pFile);
Stuff::Page *aliasPage = pFile->FindPage(str);
if (!aliasPage)
{
if (IDYES == MessageBox("Do you want to create the alias hint page?",str,MB_YESNO))
{
aliasPage = pFile->SetPage(str);
}
}
// Reload the texture image
if (pDoc->GetCount() == 1)
{
pDoc->SetImage(pDoc->LoadTexture(page), 0);
}
}
else
{
page->DeleteNote("Alias");
page->SetEntry("Resourcify","true");
}
pDoc->UpdateAllViews(NULL);
// Refresh all the build files views
g_bWarnDuplicateAlias = true;
CMultitronApp *pApp = (CMultitronApp *)AfxGetApp();
pApp->RefreshFiles();
}
}
}
/*******************************************************************************
/* function name: OnUpdateUI
/* description:
/*******************************************************************************/
void CTextureView::OnUpdateUI(CCmdUI* pCmdUI)
{
CTextureDoc* pDoc = (CTextureDoc *)GetDocument();
pCmdUI->Enable(pDoc->GetCount() == 1);
}