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

565 lines
13 KiB
C++

// FeatureLibDiag.cpp : implementation file
//
#include "stdafx.h"
#include "ImageGrinder.h"
#include "FeatureLibDiag.h"
#include "FeatureLibView.h"
#include "ImageGrinderDoc.h"
#include "FeatureProps.h"
#include "BackGroundProps.h"
#include <Compost\FeaturePool.hpp>
/////////////////////////////////////////////////////////////////////////////
// CFeatureLibDiag dialog
#define SPACEING 5
CFeatureLibDiag::CFeatureLibDiag(CWnd* pParent /*=NULL*/)
: CDialog(CFeatureLibDiag::IDD, pParent)
{
//{{AFX_DATA_INIT(CFeatureLibDiag)
//}}AFX_DATA_INIT
OwnerView=NULL;
CurSel=-1;
}
void CFeatureLibDiag::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFeatureLibDiag)
DDX_Control(pDX, IDC_BACKGROUND, m_BgdProps);
DDX_Control(pDX, IDC_DELETE, m_delbut);
DDX_Control(pDX, IDC_ADD, m_addbut);
DDX_Control(pDX, IDC_FEATURELIST, m_FeatureList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFeatureLibDiag, CDialog)
//{{AFX_MSG_MAP(CFeatureLibDiag)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_NOTIFY(NM_DBLCLK, IDC_FEATURELIST, OnDblclkFeaturelist)
ON_NOTIFY(NM_RCLICK, IDC_FEATURELIST, OnRclickFeaturelist)
ON_NOTIFY(NM_CLICK, IDC_FEATURELIST, OnLclickFeaturelist)
ON_NOTIFY(LVN_BEGINDRAG, IDC_FEATURELIST, OnBegindragFeaturelist)
ON_WM_MOUSEMOVE()
ON_LBN_SELCHANGE(IDC_FEATURELIST, OnSelchangeFeaturelist)
ON_LBN_KILLFOCUS(IDC_FEATURELIST, OnKillfocusFeaturelist)
ON_LBN_SETFOCUS(IDC_FEATURELIST, OnSetfocusFeaturelist)
ON_BN_CLICKED(IDC_BACKGROUND, OnBackground)
ON_LBN_DBLCLK(IDC_FEATURELIST, OnDblclkFeaturelist)
ON_BN_CLICKED(IDC_DELETE, OnDelete)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFeatureLibDiag message handlers
void CFeatureLibDiag::OnOK()
{
// TODO: Add extra validation here
// CDialog::OnOK();
}
void CFeatureLibDiag::OnCancel()
{
// TODO: Add extra cleanup here
// CDialog::OnCancel();
}
void CFeatureLibDiag::OnAdd()
{
CFeatureProps dlg;
Compost::Tool_Feature *TmpFet=new Compost::Tool_Feature;
Register_Pointer(TmpFet);
TmpFet->SetName((LPCSTR)MakeDefaultName());
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
if(dlg.DoModal(TmpFet,pDoc->FGrid->GetColumns()*pDoc->FGrid->GetGridSize(),pDoc->FGrid->GetRows()*pDoc->FGrid->GetGridSize())==IDOK)
{
pDoc->FPool->Add(TmpFet);
RefreshList();
}
else
{
Unregister_Pointer(TmpFet);
delete TmpFet;
}
}
int CFeatureLibDiag::DoModal()
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::DoModal();
}
CString CFeatureLibDiag::MakeDefaultName()
{
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
CString tmp("UnNamed");
return pDoc->MakeNameUnique(tmp);
}
void CFeatureLibDiag::OnDblclkFeaturelist(NMHDR* pNMHDR, LRESULT* pResult)
{
if(OwnerView==NULL) return;
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
int curSel = m_FeatureList.GetCurSel();
if(curSel>=0)
{
Compost::Tool_Feature *CurFet;
CurFet=(Compost::Tool_Feature *)m_FeatureList.GetItemData(curSel);
pDoc->AddFeature(CurFet);
pDoc->UpdateAllViews(OwnerView);
*pResult = 0;
}
}
void CFeatureLibDiag::RefreshList()
{
if(OwnerView==NULL) return;
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->FPool==NULL || pDoc->FGrid==NULL) return;
Compost::Tool_Feature *FTexture;
Compost::Feature *Fet;
m_FeatureList.ResetContent();
int itmtot=pDoc->FPool->GetNumberOfFeatures();
for(int i=1;i<itmtot;i++)
{
Fet=pDoc->FPool->GetFeatureNumber(i);
CString feature_name((char *)(*(Fet->GetName())));
if(feature_name.GetLength()>0)
{
// feature_name=pDoc->MakeNameUnique(feature_name);
FTexture=(Compost::Tool_Feature *)Fet;
FTexture->SetName((const char *)(LPCSTR)feature_name);
int pos;
pos=m_FeatureList.AddString((LPCSTR)feature_name);
m_FeatureList.SetItemDataPtr(pos,FTexture);
}
}
SetSelection();
UpdateHLList();
// pDoc->FPool->SaveIndex();
}
void CFeatureLibDiag::SetView(CFeatureLibView *vwe)
{
OwnerView=vwe;
RefreshList();
}
void CFeatureLibDiag::ResizeVert(int cy)
{
CRect sze,brct,crct;
GetWindowRect(&sze);
SetWindowPos(NULL,0,0,sze.Width(),cy,SWP_NOMOVE|SWP_NOZORDER);
int bottom;
GetWindowRect(&sze);
bottom=sze.Height();
m_delbut.GetWindowRect(&brct);
ScreenToClient(brct);
bottom-=brct.Height()+SPACEING;
m_delbut.SetWindowPos(NULL,brct.left,bottom,0,0,SWP_NOSIZE|SWP_NOZORDER);
m_addbut.GetWindowRect(&brct);
ScreenToClient(brct);
bottom-=brct.Height()+SPACEING;
m_addbut.SetWindowPos(NULL,brct.left,bottom,0,0,SWP_NOSIZE|SWP_NOZORDER);
m_BgdProps.GetWindowRect(&crct);
ScreenToClient(crct);
m_FeatureList.GetWindowRect(&brct);
ScreenToClient(brct);
brct.top=SPACEING*2+crct.Height();
brct.bottom=bottom-SPACEING;
m_FeatureList.SetWindowPos(NULL,brct.left,brct.top,brct.Width(),brct.Height(),SWP_NOZORDER);
int thgt=crct.Height();
crct.top=SPACEING;
crct.bottom=crct.top+thgt;
m_BgdProps.SetWindowPos(NULL,crct.left,crct.top,crct.Width(),crct.Height(),SWP_NOZORDER);
}
void CFeatureLibDiag::ResizeHor(int cx)
{
CRect sze,brct;
GetWindowRect(&sze);
SetWindowPos(NULL,0,0,cx,sze.Height(),SWP_NOMOVE|SWP_NOZORDER);
GetClientRect(&sze);
m_delbut.GetWindowRect(&brct);
ScreenToClient(brct);
m_delbut.SetWindowPos(NULL,(sze.Width()-brct.Width())/2,brct.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
m_addbut.GetWindowRect(&brct);
ScreenToClient(brct);
m_addbut.SetWindowPos(NULL,(sze.Width()-brct.Width())/2,brct.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
m_BgdProps.GetWindowRect(&brct);
ScreenToClient(brct);
m_BgdProps.SetWindowPos(NULL,(sze.Width()-brct.Width())/2,brct.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
m_FeatureList.GetWindowRect(&brct);
ScreenToClient(brct);
m_FeatureList.SetWindowPos(NULL,SPACEING,brct.top,sze.Width()-(SPACEING*2),brct.Height(),SWP_NOZORDER);
}
void CFeatureLibDiag::OnRclickFeaturelist(NMHDR* pNMHDR, LRESULT* pResult)
{
int nItem = m_FeatureList.RCPos;
m_FeatureList.SetCurSel(m_FeatureList.RCPos);
if(nItem==-1) return;
CFeatureProps dlg;
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
Compost::Tool_Feature *Fet=(Compost::Tool_Feature *)m_FeatureList.GetItemData(nItem);
if(dlg.DoModal(Fet,pDoc->FGrid->GetColumns()*pDoc->FGrid->GetGridSize(),pDoc->FGrid->GetRows()*pDoc->FGrid->GetGridSize())==IDOK)
{
Fet->SetName((LPCSTR)CString(*Fet->GetName()));
RefreshList();
if(OwnerView==NULL) return;
pDoc->FGrid->RedoFeaturePosition();
pDoc->SetDrawFlags();
pDoc->UpdateAllViews(OwnerView);
}
*pResult = 0;
}
void CFeatureLibDiag::OnLclickFeaturelist(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = 0;
}
void CFeatureLibDiag::OnBegindragFeaturelist(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
*pResult = 0;
}
void CFeatureLibDiag::OnMouseMove(UINT nFlags, CPoint point)
{
if(nFlags&MK_LBUTTON)
{
}
CDialog::OnMouseMove(nFlags, point);
}
void CFeatureLibDiag::OnSelchangeFeaturelist()
{
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
UpdateHLList();
int curSel = m_FeatureList.GetCurSel();
if(curSel>=0)
{
pDoc->CurSelFet=(Compost::Tool_Feature *)m_FeatureList.GetItemData(curSel);
}
else
{
pDoc->CurSelFet=NULL;
}
if(m_FeatureList.Reordered)
{
pDoc->FPool->Move(m_FeatureList.OldPos+1, m_FeatureList.NewPos+1);
pDoc->FGrid->RedoFeaturePosition();
pDoc->SetDrawFlags();
}
pDoc->UpdateAllViews(OwnerView);
}
void CFeatureLibDiag::OnKillfocusFeaturelist()
{
}
void CFeatureLibDiag::OnSetfocusFeaturelist()
{
}
BOOL CFeatureLibDiag::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
return CDialog::OnNotify(wParam, lParam, pResult);
}
void CFeatureLibDiag::OnBackground()
{
if(OwnerView==NULL) return;
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
CBackGroundProps dlg;
Compost::Tool_Feature *TmpFet = ((Compost::Tool_Feature *)pDoc->FPool->GetFeatureNumber(0));
if(dlg.DoModal((Compost::Tool_Feature *)pDoc->FPool->GetFeatureNumber(0))==IDOK)
{
if(OwnerView==NULL) return;
if(dlg.m_stretch)
{
TmpFet->SetBlendMode(Compost::Feature::Blend_Mode::StretchPaste);
TmpFet->SetFeatureMask0(TmpFet->GetFeatureTexture());
}
else
TmpFet->SetBlendMode(Compost::Feature::Blend_Mode::Paste);
pDoc->SetDrawFlags();
pDoc->UpdateAllViews(OwnerView);
}
}
void CFeatureLibDiag::InitBackGround()
{
if(OwnerView==NULL) return;
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
CBackGroundProps dlg;
Compost::Tool_Feature *TmpFet = new Compost::Tool_Feature;
Register_Pointer(TmpFet);
TmpFet->SetName((LPCSTR)"BackGround");
TmpFet->SetFeatureHeight(pDoc->FGrid->GetRows()*pDoc->FGrid->GetGridSize());
TmpFet->SetFeatureWidth(pDoc->FGrid->GetColumns()*pDoc->FGrid->GetGridSize());
dlg.DoModal(TmpFet);
if(dlg.m_stretch)
{
TmpFet->SetBlendMode(Compost::Feature::Blend_Mode::StretchPaste);
TmpFet->SetFeatureMask0(TmpFet->GetFeatureTexture());
}
else
{
TmpFet->SetBlendMode(Compost::Feature::Blend_Mode::Paste);
}
pDoc->FPool->Insert(TmpFet,0);
pDoc->SetDrawFlags();
pDoc->UpdateAllViews(OwnerView);
RefreshList();
}
void CFeatureLibDiag::SetSelection()
{
int j;
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
Compost::Tool_Feature *curfet;
for(j=0;j<m_FeatureList.GetCount();j++)
{
curfet=(Compost::Tool_Feature *)m_FeatureList.GetItemDataPtr(j);
if(pDoc->IsSelected(curfet))
{
m_FeatureList.SetSel(j,TRUE);
}
}
UpdateHLList();
}
void CFeatureLibDiag::UpdateHLList()
{
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
int *itm=new int[m_FeatureList.GetSelCount()];
m_FeatureList.GetSelItems(m_FeatureList.GetSelCount(),itm);
pDoc->ClearHL();
for(int i=0;i<m_FeatureList.GetSelCount();i++)
{
pDoc->AddHLFeature((Compost::Tool_Feature *)m_FeatureList.GetItemDataPtr(itm[i]));
}
delete itm;
}
void CFeatureLibDiag::OnDelete()
{
int i,selcount,*sel;
selcount=m_FeatureList.GetSelCount();
sel=new int[selcount];
m_FeatureList.GetSelItems(selcount,sel);
Compost::Tool_Feature *fet;
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
for(i=0;i<selcount;i++)
{
fet=(Compost::Tool_Feature *)m_FeatureList.GetItemDataPtr(sel[i]);
pDoc->RemoveFeature(fet);
}
delete sel;
pDoc->UpdateAllViews(NULL);
}
void CFeatureLibDiag::LoadFeatures(CString fname)
{
Stuff::FileStream fstream;
fstream.Open((char *)(LPCSTR)fname,Stuff::FileStream::ReadOnly);
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
int selcount,ver;
fstream>>ver;
fstream>>selcount;
for(int i=0;i<selcount;i++)
{
pDoc->FPool->Add(pDoc->FPool->LoadFeature(&fstream,ver));
}
// fstream.Close();
RefreshList();
}
void CFeatureLibDiag::SaveSelectedFeatures(CString str)
{
Stuff::FileStream fstream;
fstream.Open((char *)(LPCSTR)str,Stuff::FileStream::WriteOnly);
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
int selcount=m_FeatureList.GetSelCount(),ver=Compost::Current_Compost_Version;
fstream<<ver;
fstream<<selcount;
int *itm=new int[selcount];
m_FeatureList.GetSelItems(selcount,itm);
pDoc->ClearHL();
Stuff::MString *name = NULL;
for(int i=0;i<selcount;i++)
{
name = ((Compost::Tool_Feature *)m_FeatureList.GetItemDataPtr(itm[i]))->GetName();
if(name==NULL)
{
fstream << 0;
}
else
{
fstream << 1;
fstream << *name;
}
pDoc->FPool->SaveFeature(&fstream,((Compost::Tool_Feature *)m_FeatureList.GetItemDataPtr(itm[i])));
}
delete itm;
fstream.Close();
}
void CFeatureLibDiag::SelectUnsed()
{
int j;
CImageGrinderDoc* pDoc = (CImageGrinderDoc*)OwnerView->GetDocument();
ASSERT_VALID(pDoc);
Compost::Tool_Feature *curfet;
for(j=0;j<m_FeatureList.GetCount();j++)
{
curfet=(Compost::Tool_Feature *)m_FeatureList.GetItemDataPtr(j);
const Stuff::DynamicArrayOf<Compost::FeatureInstance*> *FList;
int count;
int CurFet;
Compost::Tool_Feature *feature = NULL;
Compost::Feature_Texture *fTexture = NULL;
curfet->StatFlags|=FIF_SELECTED;
m_FeatureList.SetSel(j,TRUE);
FList=pDoc->FGrid->GetUniqueFeatureInstances(count);
for(CurFet=0;CurFet<count;CurFet++)
{
if((*FList)[CurFet]->feature==curfet)
{
curfet->StatFlags&=~FIF_SELECTED;
m_FeatureList.SetSel(j,FALSE);
}
}
}
//UpdateHLList();
}