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

553 lines
13 KiB
C++

// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "PixelWhipPro.h"
#include "MainFrm.h"
#include "PixelWhipPro.h"
#include "View3DChildWindow.h"
#include "EffectListWin.h"
#include "PP2KEffectLibrary.hpp"
#include "ScaleOpt.h"
#include <MFCPlatform\MFCPlatform.hpp>
#include <MLR\MLRHeaders.hpp>
#include <GosFx\GosFx.hpp>
#include <ElementRenderer\ElementRenderer.hpp>
#include "EffectEditWin.h"
#include "CurveEditorFrame.h"
extern CPixelWhipProApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_CLOSE()
ON_WM_SIZE()
ON_WM_MOVE()
ON_COMMAND(ID_FILE_LOADEFFECT, OnFileLoadeffect)
ON_COMMAND(ID_FILE_SAVEEFFECT, OnFileSaveeffect)
ON_COMMAND(ID_FILE_QUICKSAVE, OnFileQuicksave)
ON_UPDATE_COMMAND_UI(ID_FILE_QUICKSAVE, OnUpdateFileQuicksave)
ON_COMMAND(ID_EDIT_NEWEFFECT_CARDCLOUD, OnEditNeweffectCardcloud)
ON_COMMAND(ID_EDIT_NEWEFFECT_PERTCLOUD, OnEditNeweffectPertcloud)
ON_COMMAND(ID_EDIT_NEWEFFECT_POINTCLOUD, OnEditNeweffectPointcloud)
ON_COMMAND(ID_EDIT_NEWEFFECT_SHAPECLOUD, OnEditNeweffectShapecloud)
ON_COMMAND(ID_EDIT_NEWEFFECT_SHARDCLOUD, OnEditNeweffectShardcloud)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_UPDATE_COMMAND_UI(ID_FILE_NEW, OnUpdateFileNew)
ON_COMMAND(ID_EDIT_DELETEEFFECT, OnEditDeleteeffect)
ON_COMMAND(ID_EDIT_NEWEFFECT_SINGLETON_CARD, OnEditNeweffectSingletonCard)
ON_COMMAND(ID_EDIT_NEWEFFECT_SINGLETON_SHAPE, OnEditNeweffectSingletonShape)
ON_COMMAND(ID_EDIT_NEWEFFECT_EFFECTCLOUD, OnEditNeweffectEffectcloud)
ON_COMMAND(ID_FILE_LOADLASTLIBRARY, OnFileLoadlastlibrary)
ON_COMMAND(ID_EDIT_NEWEFFECT_NULLEFFECT, OnEditNeweffectNulleffect)
ON_COMMAND(ID_EDIT_NEWEFFECT_TUBE, OnEditNeweffectTube)
ON_COMMAND(ID_EDIT_NEWEFFECT_DEBRISCLOUD, OnEditNeweffectDebriscloud)
ON_COMMAND(ID_EDIT_NEWEFFECT_POINTLIGHT, OnEditNeweffectPointlight)
ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
ON_COMMAND(ID_EDIT_NEWEFFECT_BEAM, OnEditNeweffectBeam)
ON_COMMAND(ID_EDIT_NEWEFFECT_SINGLETON_FLARE, OnEditNeweffectSingletonFlare)
ON_COMMAND(ID_EDIT_NEWEFFECT_CLOUDS_SPRITECLOUD, OnEditNeweffectCloudsSpritecloud)
ON_WM_TIMER()
ON_COMMAND(ID_FILE_EXPORTCURRENTEFFECT, OnFileExportcurrenteffect)
ON_COMMAND(ID_EDIT_SCALEEFFECT, OnEditScaleeffect)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
theApp.DocTitle="Untitled.effects";
theApp.DocPath="";
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
SetTimer(1,500,NULL);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CMDIFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CMDIFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnClose()
{
int res=IDYES;
if(theApp.Modified)
{
res=MessageBox("Unsaved Data... Do you really want to Quit?","Quit Confirmation",MB_YESNO);
}
if(res==IDYES)
{
theApp.SaveWindowStates();
theApp.GOSCleanUp();
PostQuitMessage(0);
// CMDIFrameWnd::OnClose();
}
}
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CMDIFrameWnd::OnSize(nType, cx, cy);
if(theApp.GOSActive)
theApp.Window3D->Fix3DView();
}
void CMainFrame::OnMove(int x, int y)
{
CMDIFrameWnd::OnMove(x, y);
if(theApp.GOSActive)
theApp.Window3D->Fix3DView();
}
void CMainFrame::OnFileLoadeffect()
{
int res=IDYES;
if(theApp.Modified)
{
res=MessageBox("Unsaved Data... Do you really want to Load?","Quit Confirmation",MB_YESNO);
}
if(res!=IDYES) return;
CFileDialog dlg1(TRUE,"effects",NULL,NULL,"Effects (*.effects)|*.effects||",this);
if(dlg1.DoModal()==IDOK)
{
LoadEffect(dlg1.GetPathName());
}
}
void CMainFrame::OnFileSaveeffect()
{
CFileDialog dlg1(FALSE,"effects",theApp.DocTitle,NULL,"Effects (*.effects)|*.effects||",this);
if(dlg1.DoModal()==IDOK)
{
theApp.DocPath=dlg1.GetPathName();
theApp.DocTitle=dlg1.GetFileName();
theApp.WriteProfileString("PixelPro2000","LastLib",theApp.DocPath);
OnFileQuicksave();
}
}
void CMainFrame::OnFileQuicksave()
{
theApp.EListWin->m_EffectList.MakeAllNamesUnique();
Stuff::FileStream gfx_file(theApp.DocPath, Stuff::FileStream::WriteOnly);
/*
if (!gosFX::EffectLibrary::Instance->SortSpecifications())
{
// >>> *** one or more events lost due to circular reference *** <<<
}
*/
theApp.Modified=false;
gosFX::EffectLibrary::Instance->Save(&gfx_file);
}
void CMainFrame::OnUpdateFileQuicksave(CCmdUI* pCmdUI)
{
pCmdUI->Enable(theApp.DocPath.GetLength()>0);
}
void CMainFrame::OnEditNeweffectCardcloud()
{
theApp.EListWin->m_EffectList.NewCardCloud();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectPertcloud()
{
theApp.EListWin->m_EffectList.NewPertcloud();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectPointcloud()
{
theApp.EListWin->m_EffectList.NewPointCloud();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectShapecloud()
{
theApp.EListWin->m_EffectList.NewShapeCloud();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectShardcloud()
{
theApp.EListWin->m_EffectList.NewShardCloud();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectSingletonCard()
{
theApp.EListWin->m_EffectList.NewSingletonCard();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectSingletonShape()
{
theApp.EListWin->m_EffectList.NewSingletonShape();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectSingletonFlare()
{
theApp.EListWin->m_EffectList.NewSingletonFlare();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectEffectcloud()
{
theApp.EListWin->m_EffectList.NewEffectCloud();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectTube()
{
theApp.EListWin->m_EffectList.NewTube();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectDebriscloud()
{
theApp.EListWin->m_EffectList.NewDebrisCloud();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectPointlight()
{
theApp.EListWin->m_EffectList.NewPointLight();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnFileNew()
{
int res=IDYES;
if(theApp.Modified)
{
res=MessageBox("Unsaved Data... Do you really want New?","Quit Confirmation",MB_YESNO);
}
if(res!=IDYES) return;
theApp.StopEffects();
theApp.ClearEffects();
theApp.DocTitle="Untitled.effects";
theApp.DocPath="";
theApp.RefreshAllWins();
theApp.StartEffects();
}
void CMainFrame::OnUpdateFileNew(CCmdUI* pCmdUI)
{
}
BOOL CMainFrame::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
void CMainFrame::OnEditDeleteeffect()
{
theApp.StopEffects();
theApp.EListWin->m_EffectList.DeleteSelectedEffect();
theApp.EListWin->Refresh();
theApp.StartEffects();
theApp.Modified=true;
}
void CMainFrame::OnFileLoadlastlibrary()
{
int res=IDYES;
if(theApp.Modified)
{
res=MessageBox("Unsaved Data... Do you really want to Load?","Quit Confirmation",MB_YESNO);
}
if(res!=IDYES) return;
CString LastLib=theApp.GetProfileString("PixelPro2000","LastLib");
if(LastLib.GetLength()>0)
LoadEffect(LastLib);
}
void CMainFrame::OnEditNeweffectNulleffect()
{
theApp.EListWin->m_EffectList.NewNullEffect();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::LoadEffect(CString &pathname)
{
CString wdir;
wdir=pathname.Left(pathname.ReverseFind('\\'));
SetCurrentDirectory(wdir);
theApp.StopEffects();
theApp.ClearEffects();
theApp.DocPath=pathname;
theApp.DocTitle=pathname.Right(pathname.GetLength()-pathname.ReverseFind('\\'));
theApp.WriteProfileString("PixelPro2000","LastLib",theApp.DocPath);
if(gosFX::EffectLibrary::Instance)
{
Unregister_Object(gosFX::EffectLibrary::Instance);
delete gosFX::EffectLibrary::Instance;
}
gos_PushCurrentHeap(gosFX::Heap);
gosFX::EffectLibrary::Instance = new PP2KEffectLibrary;
Register_Object(gosFX::EffectLibrary::Instance);
//----------------------
// Read it in from disk
//----------------------
if(theApp.fx_stream!=NULL) delete theApp.fx_stream;
Check_Object(Stuff::FileStreamManager::Instance);
theApp.fx_stream=new Stuff::FileStream((LPCSTR)theApp.DocPath);
gosFX::EffectLibrary::Instance->Load(theApp.fx_stream);
gos_PopCurrentHeap();
theApp.Modified=false;
theApp.RefreshAllWins();
MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
theApp.TranslateTextureNames();
//Fix Effects if Bad
int effnum;
for(effnum=0;effnum<gosFX::EffectLibrary::Instance->m_effects.GetLength();effnum++)
{
gosFX::EffectLibrary::Instance->m_effects[effnum]->IsDataValid(true);
}
theApp.VerifyEffectLib();
theApp.StartEffects();
}
void CMainFrame::OnFileImport()
{
CFileDialog dlg1(TRUE,"effects",NULL,NULL,"Effects (*.effects)|*.effects||",this);
if(dlg1.DoModal()==IDOK)
{
ImportEffects(dlg1.GetPathName());
}
}
void CMainFrame::ImportEffects(CString &pathname)
{
theApp.StopEffects();
Verify(gosFX::EffectLibrary::Instance);
gos_PushCurrentHeap(gosFX::Heap);
Check_Object(Stuff::FileStreamManager::Instance);
Stuff::FileStream *gfx_file=new Stuff::FileStream((LPCSTR)pathname);
gosFX::EffectLibrary::Instance->Load(gfx_file);
gos_PopCurrentHeap();
theApp.VerifyEffectLib();
theApp.Modified=true;
theApp.RefreshAllWins();
MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
theApp.StartEffects();
}
void CMainFrame::OnEditNeweffectBeam()
{
theApp.EListWin->m_EffectList.NewBeam();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnEditNeweffectCloudsSpritecloud()
{
theApp.EListWin->m_EffectList.NewSpriteCloud();
theApp.RefreshAllWins();
theApp.Modified=true;
}
void CMainFrame::OnTimer(UINT nIDEvent)
{
if(theApp.EListWin)
theApp.EListWin->m_EffectList.UpdatePlayIcons();
CMDIFrameWnd::OnTimer(nIDEvent);
}
void CMainFrame::OnFileExportcurrenteffect()
{
CFileDialog dlg1(FALSE,"effects","export.effects",NULL,"Effects (*.effects)|*.effects||",this);
gos_PushCurrentHeap(gosFX::Heap);
if(dlg1.DoModal()==IDOK)
{
gosFX::EffectLibrary *templib=new PP2KEffectLibrary;
theApp.EListWin->m_EffectList.MakeAllNamesUnique();
theApp.EListWin->m_EffectList.CopySelectedIntoLib(templib);
Stuff::FileStream gfx_file((char *)(LPCSTR)dlg1.GetPathName(), Stuff::FileStream::WriteOnly);
templib->Save(&gfx_file);
templib->m_effects.SetLength(0);
delete templib;
}
gos_PopCurrentHeap();
}
void CMainFrame::OnEditScaleeffect()
{
CScaleOpt dlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.ScaleAll)
{
theApp.EListWin->m_EffectList.ScaleAllEffects(dlg.m_SFact,dlg.Brightness);
}
else
{
theApp.EListWin->m_EffectList.ScaleSelectedEffect(dlg.m_SFact,dlg.m_Recurse?true:false,dlg.Brightness);
}
if(theApp.ParamWin) theApp.ParamWin->Refresh();
if(theApp.CurveWin) theApp.CurveWin->m_wndView.Refresh();
}
}