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.
1693 lines
46 KiB
C++
1693 lines
46 KiB
C++
// PixelWhipPro.cpp : Defines the class behaviors for the application.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "PixelWhipPro.h"
|
|
#include <MFCPlatform\MFCPlatform.hpp>
|
|
#include <GosFx\GosFx.hpp>
|
|
#include <MLR\MLR.hpp>
|
|
#include <ElementRenderer\ElementRenderer.hpp>
|
|
#include <Adept\Adept.hpp>
|
|
#include <Adept\Zone.hpp>
|
|
|
|
#include "MainFrm.h"
|
|
#include "ChildFrm.h"
|
|
#include "View3DChildWindow.h"
|
|
#include "EffectListWin.h"
|
|
#include "EffectEditWin.h"
|
|
#include "CurveEditorFrame.h"
|
|
#include "MoveProps.h"
|
|
#include "Export.h"
|
|
#include "EditMLRStateDlg.h"
|
|
#include "PPLightManager.h"
|
|
#include "PP2KEffectLibrary.hpp"
|
|
#include "PP2KTexturePool.h"
|
|
|
|
|
|
|
|
extern bool gActive;
|
|
extern bool gGotFocus;
|
|
|
|
ElementRenderer::gosFXElement *EffectWrapper=NULL;
|
|
gosFX::Effect *CurrentEffect=NULL;
|
|
ElementRenderer::GroupElement *Scene=NULL;
|
|
ElementRenderer::CameraElement *Camera=NULL;
|
|
Stuff::YawPitchRange Camera_Direction(0.0f, 0.0f, 10.0f);
|
|
Stuff::Vector2DOf<Stuff::Scalar> Camera_Shift(0.0f, 0.0f);
|
|
//Stuff::Point3D Camera_Loc(0.0f,100.0f,-100.0f),
|
|
Stuff::Point3D Camera_LookAt(0.0f,0.0f,0.0f);
|
|
ElementRenderer::StateChange *Camera_State=NULL;
|
|
Stuff::RGBAColor fogColor(0.3f, 0.3f, 0.3f, 1.0f);
|
|
|
|
|
|
Vector3D FXVel=Vector3D(0,0,10.0f),FXAcc=Vector3D(0,0,0);
|
|
double LastTime,FrameTime=0.0f,MaxTime=5.0f;
|
|
bool MoveFX=false;
|
|
|
|
bool HasEmptyEffectCloud(gosFX::Effect::Specification *spec);
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPixelWhipProApp
|
|
|
|
BEGIN_MESSAGE_MAP(CPixelWhipProApp, CWinApp)
|
|
//{{AFX_MSG_MAP(CPixelWhipProApp)
|
|
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
|
|
ON_COMMAND(ID_FILE_LOADSCENEBACKGROUND, OnFileLoadscenebackground)
|
|
ON_COMMAND(ID_FILE_CLEARSCENEBACKGROUND, OnFileClearscenebackground)
|
|
ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
|
|
ON_COMMAND(ID_OPTIONS_SETTEXTUREPATH, OnOptionsSettexturepath)
|
|
ON_COMMAND(ID_WINDOWS_CURVEEDITOR, OnWindowsCurveeditor)
|
|
ON_COMMAND(ID_WINDOWS_EFFECTLISTWINDOW, OnWindowsEffectlistwindow)
|
|
ON_COMMAND(ID_WINDOWS_EFFECTPARAMETERWINDOW, OnWindowsEffectparameterwindow)
|
|
ON_UPDATE_COMMAND_UI(ID_WINDOWS_CURVEEDITOR, OnUpdateWindowsCurveeditor)
|
|
ON_UPDATE_COMMAND_UI(ID_WINDOWS_EFFECTLISTWINDOW, OnUpdateWindowsEffectlistwindow)
|
|
ON_UPDATE_COMMAND_UI(ID_WINDOWS_EFFECTPARAMETERWINDOW, OnUpdateWindowsEffectparameterwindow)
|
|
ON_COMMAND(ID_VIEW_RESTARTPLAYBACK, OnViewRestartplayback)
|
|
ON_COMMAND(ID_VIEW_LOOPING, OnViewLooping)
|
|
ON_COMMAND(ID_VIEW_DYNAMICWORLDSPACE, OnViewDynamicworldspace)
|
|
ON_COMMAND(ID_VIEW_LOCALSPACE, OnViewLocalspace)
|
|
ON_COMMAND(ID_VIEW_STATICWORLDSPACE, OnViewStaticworldspace)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_STATICWORLDSPACE, OnUpdateViewStaticworldspace)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_LOOPING, OnUpdateViewLooping)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_LOCALSPACE, OnUpdateViewLocalspace)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_DYNAMICWORLDSPACE, OnUpdateViewDynamicworldspace)
|
|
ON_COMMAND(ID_VIEW_MOVEMENTOPTIONS, OnViewMovementoptions)
|
|
ON_COMMAND(ID_VIEW_MOVEEFFECT, OnViewMoveeffect)
|
|
ON_UPDATE_COMMAND_UI(ID_VIEW_MOVEEFFECT, OnUpdateViewMoveeffect)
|
|
ON_COMMAND(ID_OPTIONS_CLEARREGISTRY, OnOptionsClearregistry)
|
|
ON_COMMAND(ID_VIEW_RESETCAMERA, OnViewResetcamera)
|
|
ON_COMMAND(ID_OPTIONS_SETTOFIRE, OnOptionsSettofire)
|
|
ON_COMMAND(ID_OPTIONS_SETTOSMOKE, OnOptionsSettosmoke)
|
|
ON_COMMAND(ID_OPTIONS_EDITFIREQUICKSET, OnOptionsEditfirequickset)
|
|
ON_COMMAND(ID_OPTIONS_EDITSMOKEQUICKSET, OnOptionsEditsmokequickset)
|
|
ON_COMMAND(ID_FILE_LOADTERRAIN, OnFileLoadterrain)
|
|
ON_COMMAND(ID_FILE_CLEARTERRAIN, OnFileClearterrain)
|
|
ON_COMMAND(ID_FILE_LOADLIGHTS, OnFileLoadlights)
|
|
ON_COMMAND(ID_FILE_CLEARLIGHTS, OnFileClearlights)
|
|
ON_COMMAND(ID_FILE_LOADLASTWORKSPACE, OnFileLoadlastworkspace)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPixelWhipProApp construction
|
|
|
|
CPixelWhipProApp::CPixelWhipProApp()
|
|
{
|
|
AllowDraw=true;
|
|
GOSActive=false;
|
|
Window3D=NULL;
|
|
Modified=false;
|
|
Looping=true;
|
|
RegNoWrite=false;
|
|
SpaceFlag=gosFX::Effect::DynamicWorldSpaceSimulationMode;
|
|
SceneBackground=NULL;
|
|
TerrainGrid=NULL;
|
|
LightState=NULL;
|
|
fx_stream=NULL;
|
|
}
|
|
|
|
CPixelWhipProApp::~CPixelWhipProApp()
|
|
{
|
|
//if(Window3D) delete Window3D;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The one and only CPixelWhipProApp object
|
|
|
|
CPixelWhipProApp theApp;
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPixelWhipProApp initialization
|
|
|
|
BOOL CPixelWhipProApp::InitInstance()
|
|
{
|
|
AfxEnableControlContainer();
|
|
|
|
// Standard initialization
|
|
// If you are not using these features and wish to reduce the size
|
|
// of your final executable, you should remove from the following
|
|
// the specific initialization routines you do not need.
|
|
|
|
#ifdef _AFXDLL
|
|
Enable3dControls(); // Call this when using MFC in a shared DLL
|
|
#else
|
|
Enable3dControlsStatic(); // Call this when linking to MFC statically
|
|
#endif
|
|
|
|
// Change the registry key under which our settings are stored.
|
|
// TODO: You should modify this string to be something appropriate
|
|
// such as the name of your company or organization.
|
|
SetRegistryKey(_T("Microsoft\\ArtTools"));
|
|
|
|
|
|
// To create the main window, this code creates a new frame window
|
|
// object and then sets it as the application's main window object.
|
|
|
|
CMDIFrameWnd* pFrame = new CMainFrame;
|
|
m_pMainWnd = pFrame;
|
|
|
|
// create main MDI frame window
|
|
if (!pFrame->LoadFrame(IDR_MAINFRAME))
|
|
return FALSE;
|
|
|
|
// try to load shared MDI menus and accelerator table
|
|
//TODO: add additional member variables and load calls for
|
|
// additional menu types your application may need.
|
|
|
|
HINSTANCE hInst = AfxGetResourceHandle();
|
|
//m_hMDIMenu = ::LoadMenu(hInst, MAKEINTRESOURCE(IDR_MAINFRAME));
|
|
m_hMDIAccel = ::LoadAccelerators(hInst, MAKEINTRESOURCE(IDR_MAINFRAME));
|
|
|
|
|
|
|
|
// The main window has been initialized, so show and update it.
|
|
pFrame->ShowWindow(m_nCmdShow);
|
|
pFrame->UpdateWindow();
|
|
|
|
WINDOWPLACEMENT wpl;
|
|
ZeroMemory(&wpl,sizeof(WINDOWPLACEMENT));
|
|
wpl.length=sizeof(WINDOWPLACEMENT);
|
|
wpl.flags=WPF_RESTORETOMAXIMIZED;
|
|
wpl.showCmd=SW_SHOWMAXIMIZED;
|
|
|
|
pFrame->SetWindowPlacement(&wpl);
|
|
|
|
Window3D=new CView3DChildWindow;
|
|
Window3D->Create(NULL,
|
|
"3D View Window",
|
|
WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,
|
|
CRect(0,0,640,480+GetSystemMetrics(SM_CYCAPTION)),
|
|
pFrame);
|
|
|
|
|
|
GetTexturePath();
|
|
InitGameOS( m_hInstance , Window3D->m_hWnd,m_lpCmdLine);
|
|
LastTime=gos_GetElapsedTime();
|
|
FrameTime=0.0f;
|
|
|
|
Window3D->ShowWindow(SW_SHOW);
|
|
Window3D->GOSActive=GOSActive=true;
|
|
Window3D->PostGosInit();
|
|
Window3D->Fix3DView();
|
|
|
|
EListWin=new CEffectListWin;
|
|
CurveWin=new CCurveEditorFrame(m_pMainWnd);
|
|
ParamWin=new CEffectEditWin;
|
|
|
|
EListWin->Create(CEffectListWin::IDD,m_pMainWnd);
|
|
ParamWin->LoadFrame(IDR_PARAMMENU,WS_OVERLAPPEDWINDOW,m_pMainWnd);
|
|
|
|
|
|
CurveWin->SetWindowText("Curve Editor");
|
|
ParamWin->SetWindowText("Effect Parameters");
|
|
EListWin->SetWindowText("Effect List");
|
|
|
|
LoadWindowStates();
|
|
|
|
ParamWin->UpdateWindow();
|
|
|
|
LightState = new ElementRenderer::StateChange;
|
|
for (int new_index=0;new_index<MidLevelRenderer::Limits::Max_Number_Of_Lights_Per_Primitive ;new_index++)
|
|
LightState->m_lights[new_index]=NULL;
|
|
|
|
Register_Object(LightState);
|
|
|
|
gos_PushCurrentHeap(MidLevelRenderer::LightsHeap);
|
|
Scene->AdoptStateChange(LightState);
|
|
gosFX::LightManager::Instance=new CPPLightManager;
|
|
gos_PopCurrentHeap();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CPixelWhipProApp message handlers
|
|
|
|
int CPixelWhipProApp::ExitInstance()
|
|
{
|
|
/*
|
|
if (m_hMDIMenu != NULL)
|
|
FreeResource(m_hMDIMenu);
|
|
if (m_hMDIAccel != NULL)
|
|
FreeResource(m_hMDIAccel);
|
|
*/
|
|
return CWinApp::ExitInstance();
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CAboutDlg dialog used for App About
|
|
|
|
class CAboutDlg : public CDialog
|
|
{
|
|
public:
|
|
CAboutDlg();
|
|
|
|
// Dialog Data
|
|
//{{AFX_DATA(CAboutDlg)
|
|
enum { IDD = IDD_ABOUTBOX };
|
|
//}}AFX_DATA
|
|
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CAboutDlg)
|
|
protected:
|
|
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
protected:
|
|
//{{AFX_MSG(CAboutDlg)
|
|
// No message handlers
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
|
|
{
|
|
//{{AFX_DATA_INIT(CAboutDlg)
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CAboutDlg)
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CAboutDlg)
|
|
// No message handlers
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
// App command to run the dialog
|
|
void CPixelWhipProApp::OnAppAbout()
|
|
{
|
|
CAboutDlg aboutDlg;
|
|
aboutDlg.DoModal();
|
|
}
|
|
|
|
|
|
void __stdcall TerminateGameEngine();
|
|
|
|
void CPixelWhipProApp::GOSCleanUp()
|
|
{
|
|
if(Scene)
|
|
{
|
|
Unregister_Object(Scene);
|
|
delete Scene;
|
|
}
|
|
|
|
TerminateGameEngine();
|
|
ExitGameOS();
|
|
GOSActive=0;
|
|
}
|
|
|
|
BOOL CPixelWhipProApp::OnIdle(LONG lCount)
|
|
{
|
|
static bool inhere=false;
|
|
|
|
gActive = true;
|
|
gGotFocus= true;
|
|
if(GOSActive && AllowDraw)
|
|
if(RunGameOSLogic()) PostQuitMessage(0);
|
|
|
|
inhere=false;
|
|
// return AllowDraw;
|
|
HRESULT res;
|
|
res=CWinApp::OnIdle(lCount);
|
|
if(res || AllowDraw) return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
|
|
void CPixelWhipProApp::OnFileLoadscenebackground()
|
|
{
|
|
CFileDialog dlg1(TRUE,"erf",NULL,NULL,"ERF Geometry(*.erf)|*.erf||",m_pMainWnd);
|
|
if(dlg1.DoModal()==IDOK)
|
|
{
|
|
LoadBackground(dlg1.GetPathName());
|
|
}
|
|
}
|
|
|
|
void CPixelWhipProApp::OnFileClearscenebackground()
|
|
{
|
|
if(SceneBackground==NULL) return;
|
|
|
|
StopEffects();
|
|
|
|
Scene->DetachChild(SceneBackground);
|
|
delete SceneBackground;
|
|
SceneBackground=NULL;
|
|
|
|
StartEffects();
|
|
}
|
|
|
|
|
|
|
|
void __stdcall InitializeGameEngine()
|
|
{
|
|
//
|
|
//---------------------
|
|
// Initialize libraries
|
|
//---------------------
|
|
//
|
|
Stuff::InitializeClasses();
|
|
MidLevelRenderer::InitializeClasses(NULL, 8192*4*2, 1024*2);
|
|
// MidLevelRenderer::InitializeStatistics();
|
|
|
|
gosFX::InitializeClasses();
|
|
ElementRenderer::InitializeClasses();
|
|
|
|
|
|
theApp.GetTexturePath();
|
|
|
|
gos_PushCurrentHeap(ElementRenderer::GroupElement::s_Heap);
|
|
Scene = new ElementRenderer::GroupElement;
|
|
Register_Object(Scene);
|
|
Scene->SetRootMode();
|
|
Scene->LockBounds();
|
|
gos_PopCurrentHeap();
|
|
|
|
//
|
|
//------------------------
|
|
// Set up the texture pool
|
|
//------------------------
|
|
//
|
|
if(theApp.TexturePath.GetLength())
|
|
{
|
|
gos_PushCurrentHeap(MidLevelRenderer::TexturePoolHeap);
|
|
PP2KTexturePool *pool = new PP2KTexturePool((LPCSTR)theApp.TexturePath);
|
|
Register_Object(pool);
|
|
MidLevelRenderer::MLRTexturePool::Instance = new MidLevelRenderer::MLRTexturePool(pool);
|
|
Check_Object(MidLevelRenderer::MLRTexturePool::Instance);
|
|
gos_PopCurrentHeap();
|
|
|
|
Register_Object(MidLevelRenderer::MLRTexturePool::Instance);
|
|
/*
|
|
Stuff::MString effects_name = (LPCSTR)theApp.TexturePath;
|
|
int content_root_length = effects_name.GetLength() - 9;
|
|
Verify(!_stricmp(&((char*)effects_name)[content_root_length], "Textures\\"));
|
|
((char*)effects_name)[content_root_length] = '\0';
|
|
*/
|
|
gos_PushCurrentHeap(gosFX::Heap);
|
|
gosFX::EffectLibrary::Instance = new PP2KEffectLibrary;
|
|
Register_Object(gosFX::EffectLibrary::Instance);
|
|
gosFX::LightManager::Instance = new gosFX::LightManager;
|
|
Register_Pointer(gosFX::LightManager::Instance);
|
|
gos_PopCurrentHeap();
|
|
}
|
|
else
|
|
{
|
|
// fatal warning
|
|
}
|
|
|
|
//---------------
|
|
// Build a camera
|
|
//---------------
|
|
//
|
|
gos_PushCurrentHeap(ElementRenderer::g_Heap);
|
|
Camera_State = new ElementRenderer::StateChange();
|
|
Register_Object(Camera_State);
|
|
Camera_State->EnableBackfaceCulling();
|
|
Camera_State->EnableDithering();
|
|
Camera_State->EnablePerspectiveCorrection();
|
|
Camera_State->EnableZBufferWrite();
|
|
Camera_State->EnableZBufferCompare();
|
|
// Camera_State->SetFogMode(LightFogMode);
|
|
Camera_State->SetFogColor(fogColor);
|
|
Camera_State->SetFogMode(ElementRenderer::StateChange::DisableFogMode);
|
|
|
|
Camera = new ElementRenderer::CameraElement(Camera_State);
|
|
Register_Object(Camera);
|
|
Scene->AttachChild(Camera);
|
|
Camera->SetPerspective(1.0f, 1000.0f, Stuff::Pi_Over_3);
|
|
Camera->SetViewport(1.0f, 1.0f, 0.0f, 0.0f);
|
|
Camera->SetScene(Scene);
|
|
Stuff::LinearMatrix4D origin;
|
|
origin.BuildRotation(
|
|
Stuff::EulerAngles(Camera_Direction.pitch, Camera_Direction.yaw, 0.0f)
|
|
);
|
|
origin.BuildTranslation(Stuff::Point3D(Camera_Direction));
|
|
Camera->SetLocalToParent(origin);
|
|
// Camera->SetFogColor(fogColor);
|
|
|
|
|
|
// Sync the matrices of the scene and load the textures
|
|
Scene->Sync();
|
|
|
|
MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
|
|
gos_PopCurrentHeap();
|
|
|
|
}
|
|
|
|
|
|
void __stdcall DoGameLogic()
|
|
{
|
|
if(!Camera_State) return;
|
|
|
|
Check_Object(Camera_State);
|
|
MidLevelRenderer::MLRState mlr_state = Camera_State->GetMLRState();
|
|
|
|
Stuff::LinearMatrix4D mat(true);
|
|
|
|
|
|
if(EffectWrapper!=NULL)
|
|
{
|
|
if(MoveFX)
|
|
{
|
|
double curtime=gos_GetElapsedTime();
|
|
|
|
Point3D FXLoc;
|
|
FrameTime+=curtime-LastTime;
|
|
LastTime=curtime;
|
|
if(FrameTime>MaxTime)
|
|
{
|
|
theApp.StopEffects();
|
|
theApp.StartEffects();
|
|
FrameTime=0.0;
|
|
}
|
|
|
|
FXLoc.x=(float)(FrameTime*FrameTime*FXAcc.x+FXVel.x*FrameTime);
|
|
FXLoc.y=(float)(FrameTime*FrameTime*FXAcc.y+FXVel.y*FrameTime);
|
|
FXLoc.z=(float)(FrameTime*FrameTime*FXAcc.z+FXVel.z*FrameTime);
|
|
|
|
mat.BuildTranslation(FXLoc);
|
|
}
|
|
EffectWrapper->SetLocalToParent(mat);
|
|
}
|
|
|
|
//
|
|
//---------------
|
|
// Read the mouse
|
|
//---------------
|
|
//
|
|
int
|
|
x_delta,
|
|
y_delta;
|
|
Stuff::Scalar
|
|
n_xdelta,
|
|
n_ydelta;
|
|
|
|
DWORD
|
|
buttons;
|
|
gos_GetMouseInfo(NULL, NULL, &x_delta, &y_delta, NULL, &buttons);
|
|
Stuff::Scalar
|
|
x_speed = x_delta * 0.01f,
|
|
y_speed = y_delta * 0.01f;
|
|
|
|
n_xdelta=(Stuff::Scalar)x_delta/Environment.screenWidth;
|
|
n_ydelta=(Stuff::Scalar)y_delta/Environment.screenHeight;
|
|
|
|
//
|
|
//------------------------------------------------------
|
|
// If the left Ctrl button is held down, move the camera
|
|
//------------------------------------------------------
|
|
//
|
|
gosEnum_KeyStatus status = gos_GetKeyStatus(KEY_LCONTROL);
|
|
if (status != KEY_FREE && status != KEY_RELEASED)
|
|
{
|
|
Camera_Direction.pitch += y_speed;
|
|
Camera_Direction.yaw -= x_speed;
|
|
}
|
|
|
|
//
|
|
//------------------------------------------------------
|
|
// If the left Shift button is held down, pan the camera
|
|
//------------------------------------------------------
|
|
//
|
|
status = gos_GetKeyStatus(KEY_LSHIFT);
|
|
if (status != KEY_FREE && status != KEY_RELEASED)
|
|
{
|
|
Camera_Shift.x += n_xdelta*Camera_Direction.range;
|
|
Camera_Shift.y += n_ydelta*Camera_Direction.range;
|
|
}
|
|
|
|
//
|
|
//-----------------------------------------------------
|
|
// If the left Alt button is held down, zoom the camera
|
|
//-----------------------------------------------------
|
|
//
|
|
status = gos_GetKeyStatus(KEY_LMENU);
|
|
if (status != KEY_FREE && status != KEY_RELEASED)
|
|
{
|
|
Camera_Direction.range *=(Stuff::Scalar)pow(2, n_ydelta);
|
|
}
|
|
|
|
|
|
Stuff::LinearMatrix4D TransMat(Stuff::Point3D(0.0f,0.0f,-Camera_Direction.range));
|
|
Stuff::LinearMatrix4D RotMat(Stuff::EulerAngles(Camera_Direction.pitch,Camera_Direction.yaw , 0.0f));
|
|
Stuff::LinearMatrix4D PanMat(Stuff::Point3D(Camera_Shift.x,Camera_Shift.y,0.0f));
|
|
Stuff::LinearMatrix4D ViewMat,CameraMatrix;
|
|
|
|
RotMat.BuildTranslation(Camera_LookAt);
|
|
ViewMat.Multiply(PanMat,TransMat);
|
|
CameraMatrix.Multiply(ViewMat,RotMat);
|
|
Camera->SetLocalToParent(CameraMatrix);
|
|
// gosFX::Effect::s_LastCameraPosition=Stuff::Point3D(0.0f,0.0f,Camera_Direction.range);
|
|
|
|
|
|
//
|
|
//-------------------------------------------------------
|
|
// Now that we have moved everything, update the matrices
|
|
//-------------------------------------------------------
|
|
//
|
|
Camera->Sync();
|
|
|
|
|
|
if(EffectWrapper!=NULL)
|
|
{
|
|
if(EffectWrapper->GetEffect()->HasFinished())
|
|
{
|
|
theApp.Set3DWindowTitle();
|
|
}
|
|
|
|
if(CurrentEffect->GetClassID()==gosFX::BeamClassID)
|
|
{
|
|
gosFX::Beam::ExecuteInfo info(gos_GetElapsedTime(),&mat,&theApp.TargetLoc,NULL);
|
|
info.m_bounds = &EffectWrapper->m_localOBB;
|
|
Start_Timer(gosFX::Animation_Time);
|
|
if (
|
|
EffectWrapper->GetEffect()->IsExecuted()
|
|
&& ((gosFX::Beam *)EffectWrapper->GetEffect())->Execute(&info)
|
|
&& EffectWrapper->m_localOBB.sphereRadius > 0.0f
|
|
)
|
|
EffectWrapper->NeedNewBounds();
|
|
else
|
|
EffectWrapper->SetAlwaysCullMode();
|
|
|
|
}
|
|
else
|
|
{
|
|
gosFX::Effect::ExecuteInfo info(gos_GetElapsedTime(),&mat,NULL);
|
|
info.m_bounds = &EffectWrapper->m_localOBB;
|
|
Start_Timer(gosFX::Animation_Time);
|
|
if (
|
|
EffectWrapper->GetEffect()->IsExecuted()
|
|
&& EffectWrapper->GetEffect()->Execute(&info)
|
|
&& EffectWrapper->m_localOBB.sphereRadius > 0.0f
|
|
)
|
|
EffectWrapper->NeedNewBounds();
|
|
else
|
|
EffectWrapper->SetAlwaysCullMode();
|
|
}
|
|
Stop_Timer(gosFX::Animation_Time);
|
|
|
|
|
|
EffectWrapper->Sync();
|
|
}
|
|
}
|
|
|
|
void __stdcall UpdateDisplay()
|
|
{
|
|
Camera->DrawScene();
|
|
}
|
|
|
|
void __stdcall TerminateGameEngine()
|
|
{
|
|
//--------------------
|
|
// Turn off libraries
|
|
//--------------------
|
|
ElementRenderer::TerminateClasses();
|
|
gosFX::TerminateClasses();
|
|
MidLevelRenderer::TerminateClasses();
|
|
Stuff::TerminateClasses();
|
|
}
|
|
|
|
|
|
void __stdcall GetGameOSEnvironment(char *CommandLine)
|
|
{
|
|
|
|
//------------------------------------------------
|
|
// gosEnvironment struct documented in GameOS.hpp
|
|
//------------------------------------------------
|
|
Environment.applicationName = "PixelPro2000";
|
|
// setup application title (window caption)
|
|
Environment.version = "01.01.04.0101";
|
|
Environment.directoryPath = ""; //"\\Binaries\\PixelWhip;\\Tools\\PixelWhip";
|
|
Environment.screenWidth = 640;
|
|
Environment.screenHeight = 480;
|
|
Environment.bitDepth = 16; // 8 or 16
|
|
Environment.fullScreen = FALSE;
|
|
Environment.Key_FullScreen = NULL; // Default is KEY_F4 (Enter/exit full screen mode)
|
|
Environment.Key_Exit = NULL; // Default is KEY_ESC (Exit full screen mode or exit game)
|
|
Environment.debugLog = ""; //"DebugLog.txt"; // File to dump info to, or "debugger" to the debug console
|
|
|
|
|
|
Environment.spew = ""; // List of groups to dump to debuglog - eg: GameOS_Texture, GameOS_DirectDraw
|
|
Environment.TimeStampSpew = FALSE; // adds the current time stamp to all spews
|
|
|
|
Environment.FullScreenDevice = 0; // 0=Primary, 1=2nd video card (ie: 3Dfx) etc...
|
|
Environment.Renderer = 0; // 0=Try hardware, fallback to software, 1=RGB, 2=Refrast
|
|
Environment.AntiAlias = FALSE; // true/false - Enable full screen antialiasing
|
|
|
|
Environment.MaxTimeDelta = 0.25f;
|
|
Environment.MinimumTimeDelta = 0.25f;
|
|
|
|
//--------------------
|
|
// Texture infomation
|
|
//--------------------
|
|
Environment.Texture_S_256 = 5; // Number of 256*256 Solid texture heap pages
|
|
Environment.Texture_S_128 = 9; // Number of 128*128 Solid texture heap pages
|
|
Environment.Texture_S_64 = 4; // Number of 64*64 Solid texture heap pages
|
|
Environment.Texture_S_32 = 8; // Number of 32*32 Solid texture heap pages
|
|
Environment.Texture_S_16 = 4; // Number of 16*16 Solid texture heap pages
|
|
|
|
Environment.Texture_K_256 = 2; // Number of 256*256 Keyed texture heap pages
|
|
Environment.Texture_K_128 = 1; // Number of 128*128 Keyed texture heap pages (GameOS uses one 128*128 Keyed page)
|
|
Environment.Texture_K_64 = 1; // Number of 64*64 Keyed texture heap pages
|
|
Environment.Texture_K_32 = 1; // Number of 32*32 Keyed texture heap pages
|
|
Environment.Texture_K_16 = 1; // Number of 16*16 Keyed texture heap pages
|
|
|
|
Environment.Texture_A_256 = 4; // Number of 256*256 Alpha texture heap pages
|
|
Environment.Texture_A_128 = 8; // Number of 128*128 Alpha texture heap pages
|
|
Environment.Texture_A_64 = 1; // Number of 64*64 Alpha texture heap pages
|
|
Environment.Texture_A_32 = 1; // Number of 32*32 Alpha texture heap pages
|
|
Environment.Texture_A_16 = 1; // Number of 16*16 Alpha texture heap pages
|
|
|
|
//------------------------
|
|
// Application call-backs
|
|
//------------------------
|
|
Environment.InitializeGameEngine = InitializeGameEngine;
|
|
Environment.DoGameLogic = DoGameLogic;
|
|
Environment.UpdateRenderers = UpdateDisplay;
|
|
Environment.TerminateGameEngine = TerminateGameEngine;
|
|
Environment.soundDisable = true;
|
|
Environment.NetworkGame = false;
|
|
|
|
}
|
|
|
|
|
|
void CPixelWhipProApp::GetTexturePath()
|
|
{
|
|
|
|
TexturePath=GetProfileString("PixelPro2000","TexturePath");
|
|
if(TexturePath.GetLength()==0)
|
|
{
|
|
NewTexturePath();
|
|
} // end if string in Registry
|
|
|
|
|
|
if(TexturePath.GetLength())
|
|
{
|
|
if(MidLevelRenderer::MLRTexturePool::Instance)
|
|
{
|
|
Unregister_Object(MidLevelRenderer::MLRTexturePool::Instance);
|
|
delete MidLevelRenderer::MLRTexturePool::Instance;
|
|
|
|
MidLevelRenderer::TGAFilePool *pool = new MidLevelRenderer::TGAFilePool((LPCSTR)TexturePath);
|
|
Register_Object(pool);
|
|
MidLevelRenderer::MLRTexturePool::Instance = new MidLevelRenderer::MLRTexturePool(pool);
|
|
Check_Object(MidLevelRenderer::MLRTexturePool::Instance);
|
|
Register_Object(MidLevelRenderer::MLRTexturePool::Instance);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void myILFree(LPITEMIDLIST pidl)
|
|
{
|
|
LPMALLOC pMalloc;
|
|
|
|
if (pidl)
|
|
{
|
|
#ifdef DEBUG
|
|
UINT cbSize = ILGetSize(pidl);
|
|
VALIDATE_PIDL(pidl);
|
|
|
|
// Fill the memory with some bad value...
|
|
_fmemset(pidl, 0xE5, cbSize);
|
|
|
|
// If large enough try to save the call return address of who
|
|
// freed us in the 3-6 byte of the structure.
|
|
if (cbSize >= 6)
|
|
*((UINT*)((LPSTR)pidl + 2)) = *(((UINT*)&pidl) - 1);
|
|
|
|
#endif
|
|
SHGetMalloc(&pMalloc);
|
|
pMalloc->Free( pidl);
|
|
pMalloc->Release();
|
|
|
|
}
|
|
}
|
|
|
|
void CPixelWhipProApp::NewTexturePath()
|
|
{
|
|
char pname[MAX_PATH];
|
|
BROWSEINFO bi;
|
|
if(m_pMainWnd==NULL)
|
|
bi.hwndOwner =NULL;
|
|
else
|
|
bi.hwndOwner = m_pMainWnd->m_hWnd;
|
|
|
|
bi.pidlRoot = NULL;
|
|
bi.pszDisplayName = NULL;
|
|
bi.lpszTitle = "Choose Texture Path...";
|
|
bi.ulFlags = BIF_RETURNONLYFSDIRS;
|
|
bi.lpfn = NULL;
|
|
bi.lParam = (LPARAM)this;
|
|
|
|
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
|
|
|
|
if (SHGetPathFromIDList(pidl,pname))
|
|
{
|
|
TexturePath=pname;
|
|
TexturePath+="\\";
|
|
|
|
|
|
WriteProfileString("PixelPro2000","TexturePath",TexturePath);
|
|
}
|
|
|
|
if (bi.pidlRoot)
|
|
{
|
|
myILFree( const_cast< ITEMIDLIST* >( bi.pidlRoot ) );
|
|
}
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnOptionsSettexturepath()
|
|
{
|
|
NewTexturePath();
|
|
MessageBox(NULL,"You Must Restart for this Change to Take Effect","Restart",MB_OK);
|
|
}
|
|
|
|
void CPixelWhipProApp::RefreshAllWins()
|
|
{
|
|
if(EListWin) EListWin->Refresh();
|
|
if(ParamWin) ParamWin->Refresh();
|
|
if(CurveWin) CurveWin->m_wndView.Refresh();
|
|
}
|
|
|
|
void CPixelWhipProApp::OnWindowsCurveeditor()
|
|
{
|
|
if(CurveWin)
|
|
{
|
|
CurveWin->ShowWindow(CurveWin->IsWindowVisible()?SW_HIDE:SW_SHOW);
|
|
}
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnWindowsEffectlistwindow()
|
|
{
|
|
if(EListWin)
|
|
{
|
|
EListWin->ShowWindow(EListWin->IsWindowVisible()?SW_HIDE:SW_SHOW);
|
|
}
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnWindowsEffectparameterwindow()
|
|
{
|
|
if(ParamWin)
|
|
{
|
|
ParamWin->ShowWindow(ParamWin->IsWindowVisible()?SW_HIDE:SW_SHOW);
|
|
}
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnUpdateWindowsCurveeditor(CCmdUI* pCmdUI)
|
|
{
|
|
if(CurveWin)
|
|
pCmdUI->SetCheck(CurveWin->IsWindowVisible()?1:0);
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnUpdateWindowsEffectlistwindow(CCmdUI* pCmdUI)
|
|
{
|
|
if(EListWin)
|
|
pCmdUI->SetCheck(EListWin->IsWindowVisible()?1:0);
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnUpdateWindowsEffectparameterwindow(CCmdUI* pCmdUI)
|
|
{
|
|
if(ParamWin)
|
|
pCmdUI->SetCheck(ParamWin->IsWindowVisible()?1:0);
|
|
|
|
}
|
|
|
|
|
|
void CPixelWhipProApp::SaveWindowStates()
|
|
{
|
|
if(RegNoWrite) return;
|
|
WriteProfileInt("PixelPro2000","CurveWinVis",CurveWin->IsWindowVisible());
|
|
WriteProfileInt("PixelPro2000","ParamWinVis",ParamWin->IsWindowVisible());
|
|
WriteProfileInt("PixelPro2000","EListWinVis",EListWin->IsWindowVisible());
|
|
WriteProfileInt("PixelPro2000","Window3DVis",Window3D->IsWindowVisible());
|
|
|
|
CRect rct;
|
|
/*
|
|
pFrame->GetWindowRect(&rct);
|
|
WriteProfileInt("PixelPro2000","pFrameXPos",rct.left);
|
|
WriteProfileInt("PixelPro2000","pFrameYPos",rct.bottom);
|
|
WriteProfileInt("PixelPro2000","pFrameXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","pFrameYSize",rct.Height());
|
|
*/
|
|
|
|
CurveWin->GetWindowRect(&rct);
|
|
WriteProfileInt("PixelPro2000","CurveWinXPos",rct.left);
|
|
WriteProfileInt("PixelPro2000","CurveWinYPos",rct.top);
|
|
WriteProfileInt("PixelPro2000","CurveWinXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","CurveWinYSize",rct.Height());
|
|
|
|
ParamWin->GetWindowRect(&rct);
|
|
WriteProfileInt("PixelPro2000","ParamWinXPos",rct.left);
|
|
WriteProfileInt("PixelPro2000","ParamWinYPos",rct.top);
|
|
WriteProfileInt("PixelPro2000","ParamWinXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","ParamWinYSize",rct.Height());
|
|
|
|
EListWin->GetWindowRect(&rct);
|
|
WriteProfileInt("PixelPro2000","EListWinXPos",rct.left);
|
|
WriteProfileInt("PixelPro2000","EListWinYPos",rct.top);
|
|
WriteProfileInt("PixelPro2000","EListWinXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","EListWinYSize",rct.Height());
|
|
|
|
Window3D->GetWindowRect(&rct);
|
|
WriteProfileInt("PixelPro2000","Window3DXPos",rct.left);
|
|
WriteProfileInt("PixelPro2000","Window3DYPos",rct.top);
|
|
WriteProfileInt("PixelPro2000","Window3DXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","Window3DYSize",rct.Height());
|
|
gos_SaveDataToRegistry("FireState",&FireState,sizeof(FireState));
|
|
gos_SaveDataToRegistry("SmokeState",&SmokeState,sizeof(SmokeState));
|
|
}
|
|
|
|
void CPixelWhipProApp::LoadWindowStates()
|
|
{
|
|
|
|
|
|
|
|
CRect rct;
|
|
CurveWin->GetWindowRect(&rct);
|
|
rct.left=(int)GetProfileInt("PixelPro2000","CurveWinXPos",0);
|
|
rct.top=(int)GetProfileInt("PixelPro2000","CurveWinYPos",0);
|
|
rct.right=rct.left+(int)GetProfileInt("PixelPro2000","CurveWinXSize",0);
|
|
rct.bottom=rct.top+(int)GetProfileInt("PixelPro2000","CurveWinYSize",0);
|
|
if(rct.Width()>0)
|
|
CurveWin->SetWindowPos(NULL,rct.left,rct.top,rct.Width(),rct.Height(),SWP_NOZORDER);
|
|
|
|
|
|
|
|
rct.left=(int)GetProfileInt("PixelPro2000","ParamWinXPos",0);
|
|
rct.top=(int)GetProfileInt("PixelPro2000","ParamWinYPos",0);
|
|
rct.right=rct.left+(int)GetProfileInt("PixelPro2000","ParamWinXSize",0);
|
|
rct.bottom=rct.top+(int)GetProfileInt("PixelPro2000","ParamWinYSize",0);
|
|
if(rct.Width()>0)
|
|
ParamWin->SetWindowPos(NULL,rct.left,rct.top,rct.Width(),rct.Height(),SWP_NOZORDER);
|
|
|
|
rct.left=(int)GetProfileInt("PixelPro2000","EListWinXPos",0);
|
|
rct.top=(int)GetProfileInt("PixelPro2000","EListWinYPos",0);
|
|
rct.right=rct.left+(int)GetProfileInt("PixelPro2000","EListWinXSize",0);
|
|
rct.bottom=rct.top+(int)GetProfileInt("PixelPro2000","EListWinYSize",0);
|
|
if(rct.Width()>0)
|
|
EListWin->SetWindowPos(NULL,rct.left,rct.top,rct.Width(),rct.Height(),SWP_NOZORDER);
|
|
|
|
rct.left=(int)GetProfileInt("PixelPro2000","Window3DXPos",0);
|
|
rct.top=(int)GetProfileInt("PixelPro2000","Window3DYPos",0);
|
|
rct.right=rct.left+(int)GetProfileInt("PixelPro2000","Window3DXSize",0);
|
|
rct.bottom=rct.top+(int)GetProfileInt("PixelPro2000","Window3DYSize",0);
|
|
// m_pMainWnd->ScreenToClient(&rct);
|
|
/*
|
|
rct.top-=GetSystemMetrics(SM_CYCAPTION);
|
|
rct.bottom-=GetSystemMetrics(SM_CYCAPTION);
|
|
rct.top-=GetSystemMetrics(SM_CYFRAME)*2;
|
|
rct.bottom-=GetSystemMetrics(SM_CYFRAME)*2;
|
|
*/
|
|
// rct.left-=GetSystemMetrics(SM_CXFRAME);
|
|
// rct.right-=GetSystemMetrics(SM_CXFRAME);
|
|
if(rct.Width()>0)
|
|
Window3D->SetWindowPos(NULL,rct.left,rct.top,rct.Width(),rct.Height(),SWP_NOZORDER);
|
|
|
|
|
|
CurveWin->ShowWindow(GetProfileInt("PixelPro2000","CurveWinVis",1)==0?SW_HIDE:SW_SHOW);
|
|
ParamWin->ShowWindow(GetProfileInt("PixelPro2000","ParamWinVis",1)==0?SW_HIDE:SW_SHOW);
|
|
EListWin->ShowWindow(GetProfileInt("PixelPro2000","EListWinVis",1)==0?SW_HIDE:SW_SHOW);
|
|
Window3D->ShowWindow(GetProfileInt("PixelPro2000","Window3DVis",1)==0?SW_HIDE:SW_SHOW);
|
|
|
|
unsigned long DatSize;
|
|
DatSize=sizeof(FireState);
|
|
gos_LoadDataFromRegistry("FireState",&FireState,&DatSize);
|
|
if(DatSize!=0)
|
|
if(DatSize!=sizeof(FireState))
|
|
{
|
|
MidLevelRenderer::MLRState tmpstate;
|
|
FireState=tmpstate;
|
|
gos_SaveDataToRegistry("FireState",&tmpstate,sizeof(tmpstate));
|
|
}
|
|
|
|
DatSize=sizeof(SmokeState);
|
|
gos_LoadDataFromRegistry("SmokeState",&SmokeState,&DatSize);
|
|
if(DatSize!=0)
|
|
if(DatSize!=sizeof(FireState))
|
|
{
|
|
MidLevelRenderer::MLRState tmpstate;
|
|
SmokeState=tmpstate;
|
|
gos_SaveDataToRegistry("SmokeState",&tmpstate,sizeof(tmpstate));
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::StopEffects()
|
|
{
|
|
if(EffectWrapper)
|
|
{
|
|
Check_Object(EffectWrapper);
|
|
if(CurrentEffect)
|
|
{
|
|
// CurrentEffect->Stop();
|
|
CurrentEffect->Kill();
|
|
}
|
|
|
|
Unregister_Object(EffectWrapper);
|
|
delete EffectWrapper;
|
|
EffectWrapper=NULL;
|
|
CurrentEffect=NULL;
|
|
}
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::StartEffects()
|
|
{
|
|
|
|
gosFX::Effect::Specification *spec;
|
|
|
|
HTREEITEM CurItem;
|
|
CurItem=EListWin->m_EffectList.GetSelectedItem();
|
|
if(CurItem==NULL) return;
|
|
|
|
spec=(gosFX::Effect::Specification *)EListWin->m_EffectList.GetItemData(CurItem);
|
|
|
|
if(HasEmptyEffectCloud(spec)) return;
|
|
|
|
CurrentEffect =
|
|
gosFX::EffectLibrary::Instance->MakeEffect(
|
|
spec->m_effectID,
|
|
gosFX::Effect::ExecuteFlag |
|
|
(Looping?gosFX::Effect::LoopFlag:0) |
|
|
SpaceFlag
|
|
//gosFX::Effect::DynamicWorldSpaceSimulationMode
|
|
);
|
|
Register_Object(CurrentEffect);
|
|
|
|
gos_PushCurrentHeap(ElementRenderer::gosFXElement::s_Heap);
|
|
EffectWrapper = new ElementRenderer::gosFXElement(CurrentEffect);
|
|
Register_Object(EffectWrapper);
|
|
gos_PopCurrentHeap();
|
|
Scene->AttachChild(EffectWrapper);
|
|
EffectWrapper->NeedNewBounds();
|
|
|
|
if(CurrentEffect->GetClassID()==gosFX::BeamClassID)
|
|
{
|
|
gosFX::Beam::ExecuteInfo info(gos_GetElapsedTime(),&EffectWrapper->GetLocalToWorld(),&theApp.TargetLoc,NULL);
|
|
((gosFX::Beam *)CurrentEffect)->Start(&info);
|
|
}
|
|
else
|
|
{
|
|
gosFX::Effect::ExecuteInfo info(gos_GetElapsedTime(),&EffectWrapper->GetLocalToWorld(),NULL);
|
|
CurrentEffect->Start(&info);
|
|
}
|
|
|
|
Set3DWindowTitle();
|
|
}
|
|
|
|
void CPixelWhipProApp::ClearEffects()
|
|
{
|
|
gosFX::EffectLibrary::Instance->m_effects.SetLength(0);
|
|
}
|
|
|
|
|
|
|
|
void CPixelWhipProApp::OnViewRestartplayback()
|
|
{
|
|
StopEffects();
|
|
FrameTime=0.0f;
|
|
StartEffects();
|
|
}
|
|
|
|
|
|
void CPixelWhipProApp::OnFileExport()
|
|
{
|
|
|
|
CFileDialog dlg1(FALSE,"txtfx",NULL,NULL,"Text Effects (*.txtfx)|*.txtfx||",m_pMainWnd);
|
|
|
|
if(dlg1.DoModal()==IDOK)
|
|
{
|
|
FILE *fl;
|
|
fl=fopen(dlg1.GetPathName(),"w");
|
|
fprintf(fl,"NumberOfEffects=%i\n",gosFX::EffectLibrary::Instance->m_effects.GetLength());
|
|
CString prefix="";
|
|
LPCSTR prx=(LPCSTR)prefix;
|
|
|
|
|
|
int effnum;
|
|
|
|
for(effnum=0;effnum<gosFX::EffectLibrary::Instance->m_effects.GetLength();effnum++)
|
|
|
|
{
|
|
gosFX::Effect::Specification *spec=gosFX::EffectLibrary::Instance->m_effects[effnum];
|
|
if(IsRootEffect(spec))
|
|
ExportEffect(fl,spec,prefix);
|
|
}
|
|
|
|
fclose(fl);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool HasEmptyEffectCloud(gosFX::Effect::Specification *spec)
|
|
{
|
|
if(spec->GetClassID()==gosFX::EffectCloudClassID)
|
|
{
|
|
gosFX::EffectCloud__Specification *tspec;
|
|
tspec=Cast_Pointer(gosFX::EffectCloud__Specification *,spec);
|
|
Check_Object(tspec);
|
|
if(tspec->m_particleEffectID==BADINDEX) return true;
|
|
else
|
|
return HasEmptyEffectCloud(gosFX::EffectLibrary::Instance->m_effects[tspec->m_particleEffectID]);
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
Stuff::ChainIteratorOf<gosFX::Event*> eitr(&(spec->m_events));
|
|
gosFX::Event *tmpevent;
|
|
|
|
eitr.First();
|
|
while(NULL!=(tmpevent=eitr.ReadAndNext()))
|
|
{
|
|
if(HasEmptyEffectCloud(gosFX::EffectLibrary::Instance->m_effects[tmpevent->m_effectID]))
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool CPixelWhipProApp::CurrentFXIsValid()
|
|
{
|
|
gosFX::Effect::Specification *spec;
|
|
|
|
HTREEITEM CurItem;
|
|
CurItem=EListWin->m_EffectList.GetSelectedItem();
|
|
if(CurItem==NULL) return false;
|
|
|
|
spec=(gosFX::Effect::Specification *)EListWin->m_EffectList.GetItemData(CurItem);
|
|
|
|
if(HasEmptyEffectCloud(spec)) return false;
|
|
return true;
|
|
}
|
|
|
|
void CPixelWhipProApp::OnViewLooping()
|
|
{
|
|
StopEffects();
|
|
Looping=!Looping;
|
|
StartEffects();
|
|
}
|
|
|
|
void CPixelWhipProApp::OnUpdateViewLooping(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(Looping?1:0);
|
|
}
|
|
|
|
void CPixelWhipProApp::OnViewDynamicworldspace()
|
|
{
|
|
StopEffects();
|
|
SpaceFlag=gosFX::Effect::DynamicWorldSpaceSimulationMode;
|
|
StartEffects();
|
|
}
|
|
|
|
void CPixelWhipProApp::OnViewLocalspace()
|
|
{
|
|
StopEffects();
|
|
SpaceFlag=gosFX::Effect::LocalSpaceSimulationMode;
|
|
StartEffects();
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnViewStaticworldspace()
|
|
{
|
|
StopEffects();
|
|
SpaceFlag=gosFX::Effect::StaticWorldSpaceSimulationMode;
|
|
StartEffects();
|
|
}
|
|
|
|
void CPixelWhipProApp::OnUpdateViewStaticworldspace(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(SpaceFlag==gosFX::Effect::StaticWorldSpaceSimulationMode?1:0);
|
|
}
|
|
|
|
|
|
void CPixelWhipProApp::OnUpdateViewLocalspace(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(SpaceFlag==gosFX::Effect::LocalSpaceSimulationMode?1:0);
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnUpdateViewDynamicworldspace(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(SpaceFlag==gosFX::Effect::DynamicWorldSpaceSimulationMode?1:0);
|
|
|
|
}
|
|
|
|
|
|
void CPixelWhipProApp::OnViewMovementoptions()
|
|
{
|
|
CMoveProps dlg;
|
|
dlg.m_accx=FXAcc.x;
|
|
dlg.m_accy=FXAcc.y;
|
|
dlg.m_accz=FXAcc.z;
|
|
dlg.m_velx=FXVel.x;
|
|
dlg.m_vely=FXVel.y;
|
|
dlg.m_velz=FXVel.z;
|
|
dlg.m_rtime=MaxTime;
|
|
|
|
if(dlg.DoModal()==IDOK)
|
|
{
|
|
|
|
FXAcc.x=dlg.m_accx;
|
|
FXAcc.y=dlg.m_accy;
|
|
FXAcc.z=dlg.m_accz;
|
|
FXVel.x=dlg.m_velx;
|
|
FXVel.y=dlg.m_vely;
|
|
FXVel.z=dlg.m_velz;
|
|
MaxTime=dlg.m_rtime;
|
|
}
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnViewMoveeffect()
|
|
{
|
|
MoveFX=!MoveFX;
|
|
FrameTime=0.0f;
|
|
}
|
|
|
|
void CPixelWhipProApp::OnUpdateViewMoveeffect(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->SetCheck(MoveFX?1:0);
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnOptionsClearregistry()
|
|
{
|
|
WriteProfileInt("PixelPro2000","CurveWinVis",TRUE);
|
|
WriteProfileInt("PixelPro2000","ParamWinVis",TRUE);
|
|
WriteProfileInt("PixelPro2000","EListWinVis",TRUE);
|
|
WriteProfileInt("PixelPro2000","Window3DVis",TRUE);
|
|
|
|
CRect rct;
|
|
/*
|
|
pFrame->GetWindowRect(&rct);
|
|
WriteProfileInt("PixelPro2000","pFrameXPos",rct.left);
|
|
WriteProfileInt("PixelPro2000","pFrameYPos",rct.bottom);
|
|
WriteProfileInt("PixelPro2000","pFrameXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","pFrameYSize",rct.Height());
|
|
*/
|
|
|
|
rct=CurveWin->rectDefault;
|
|
WriteProfileInt("PixelPro2000","CurveWinXPos",rct.left);
|
|
WriteProfileInt("PixelPro2000","CurveWinYPos",rct.top);
|
|
WriteProfileInt("PixelPro2000","CurveWinXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","CurveWinYSize",rct.Height());
|
|
|
|
rct=ParamWin->rectDefault;
|
|
WriteProfileInt("PixelPro2000","ParamWinXPos",rct.left);
|
|
WriteProfileInt("PixelPro2000","ParamWinYPos",rct.top);
|
|
WriteProfileInt("PixelPro2000","ParamWinXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","ParamWinYSize",rct.Height());
|
|
|
|
WriteProfileInt("PixelPro2000","EListWinXPos",10);
|
|
WriteProfileInt("PixelPro2000","EListWinYPos",10);
|
|
WriteProfileInt("PixelPro2000","EListWinXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","EListWinYSize",rct.Height());
|
|
|
|
rct=Window3D->rectDefault;
|
|
WriteProfileInt("PixelPro2000","Window3DXPos",rct.left);
|
|
WriteProfileInt("PixelPro2000","Window3DYPos",rct.top);
|
|
WriteProfileInt("PixelPro2000","Window3DXSize",rct.Width());
|
|
WriteProfileInt("PixelPro2000","Window3DYSize",rct.Height());
|
|
WriteProfileString("PixelPro2000","TexturePath","");
|
|
RegNoWrite=true;
|
|
|
|
MidLevelRenderer::MLRState tmpstate;
|
|
gos_SaveDataToRegistry("FireState",&tmpstate,sizeof(tmpstate));
|
|
gos_SaveDataToRegistry("SmokeState",&tmpstate,sizeof(tmpstate));
|
|
|
|
MessageBox(NULL,"You Must Restart for this Change to Take Effect","Restart",MB_OK);
|
|
|
|
}
|
|
|
|
|
|
void CPixelWhipProApp::OnViewResetcamera()
|
|
{
|
|
Camera_Shift.x=0.0f;
|
|
Camera_Shift.y=0.0f;
|
|
Camera_LookAt.x=0.0f;
|
|
Camera_LookAt.y=0.0f;
|
|
Camera_LookAt.z=0.0f;
|
|
Camera_Direction.yaw=0.0f;
|
|
Camera_Direction.pitch=0.0f;
|
|
Camera_Direction.range=10.0f;
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnOptionsSettofire()
|
|
{
|
|
MidLevelRenderer::MLRState EffState;
|
|
|
|
if(CurrentEffect)
|
|
{
|
|
|
|
gosFX::Effect::Specification *spec=CurrentEffect->GetSpecification();
|
|
spec->m_state=FireState;
|
|
/*
|
|
spec->m_state.SetAlphaMode(FireState.GetAlphaMode());
|
|
spec->m_state.SetPriority(FireState.GetPriority());
|
|
|
|
if(FireState.GetZBufferWriteMode()==MidLevelRenderer::MLRState::ZBufferWriteOnMode)
|
|
spec->m_state.SetZBufferWriteOn();
|
|
else
|
|
spec->m_state.SetZBufferWriteOff();
|
|
|
|
if(FireState.GetZBufferCompareMode()==MidLevelRenderer::MLRState::ZBufferCompareOnMode)
|
|
spec->m_state.SetZBufferCompareOn();
|
|
else
|
|
spec->m_state.SetZBufferCompareOff();
|
|
|
|
*/
|
|
}
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnOptionsSettosmoke()
|
|
{
|
|
if(CurrentEffect)
|
|
{
|
|
|
|
gosFX::Effect::Specification *spec=CurrentEffect->GetSpecification();
|
|
spec->m_state=SmokeState;
|
|
/*
|
|
spec->m_state.SetAlphaMode(FireState.GetAlphaMode());
|
|
spec->m_state.SetPriority(FireState.GetPriority());
|
|
|
|
if(FireState.GetZBufferWriteMode()==MidLevelRenderer::MLRState::ZBufferWriteOnMode)
|
|
spec->m_state.SetZBufferWriteOn();
|
|
else
|
|
spec->m_state.SetZBufferWriteOff();
|
|
|
|
if(FireState.GetZBufferCompareMode()==MidLevelRenderer::MLRState::ZBufferCompareOnMode)
|
|
spec->m_state.SetZBufferCompareOn();
|
|
else
|
|
spec->m_state.SetZBufferCompareOff();
|
|
*/
|
|
|
|
}
|
|
}
|
|
|
|
void CPixelWhipProApp::OnOptionsEditfirequickset()
|
|
{
|
|
CEditMLRStateDlg dlg1;
|
|
Stuff::DynamicArrayOf< MidLevelRenderer::MLRState> States(1);
|
|
States[0]=FireState;
|
|
|
|
dlg1.SetStates(&States);
|
|
if(dlg1.DoModal()==IDOK)
|
|
{
|
|
FireState=States[0];
|
|
}
|
|
}
|
|
|
|
void CPixelWhipProApp::OnOptionsEditsmokequickset()
|
|
{
|
|
CEditMLRStateDlg dlg1;
|
|
Stuff::DynamicArrayOf< MidLevelRenderer::MLRState> States(1);
|
|
States[0]=SmokeState;
|
|
|
|
dlg1.SetStates(&States);
|
|
if(dlg1.DoModal()==IDOK)
|
|
{
|
|
SmokeState=States[0];
|
|
}
|
|
}
|
|
|
|
void CPixelWhipProApp::OnFileLoadterrain()
|
|
{
|
|
|
|
CFileDialog dlg1(TRUE,"erf",NULL,NULL,"Terrain Geometry(*.erf)|*.erf||",m_pMainWnd);
|
|
if(dlg1.DoModal()==IDOK)
|
|
{
|
|
LoadTerrain(dlg1.GetPathName());
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnFileClearterrain()
|
|
{
|
|
if(TerrainGrid==NULL) return;
|
|
StopEffects();
|
|
|
|
Scene->DetachChild(TerrainGrid);
|
|
delete TerrainGrid;
|
|
TerrainGrid=NULL;
|
|
|
|
StartEffects();
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::OnFileLoadlights()
|
|
{
|
|
|
|
CFileDialog dlg1(TRUE,"lights",NULL,NULL,"MLR Lights(*.lights)|*.lights||",m_pMainWnd);
|
|
if(dlg1.DoModal()==IDOK)
|
|
{
|
|
CString light_file_name=dlg1.GetPathName();
|
|
|
|
LoadLights(light_file_name);
|
|
|
|
}
|
|
}
|
|
|
|
void CPixelWhipProApp::OnFileClearlights()
|
|
{
|
|
for (int new_index=0;new_index<MidLevelRenderer::Limits::Max_Number_Of_Lights_Per_Primitive ;new_index++)
|
|
if(LightState->m_lights[new_index])
|
|
{
|
|
Unregister_Object(LightState->m_lights[new_index]);
|
|
delete LightState->m_lights[new_index];
|
|
LightState->m_lights[new_index]=NULL;
|
|
}
|
|
}
|
|
|
|
void CPixelWhipProApp::OnFileLoadlastworkspace()
|
|
{
|
|
BackGroundFilePath=GetProfileString("PixelPro2000","BackGround","");
|
|
LightFilePath=GetProfileString("PixelPro2000","Lights","");
|
|
TerrainFilePath=GetProfileString("PixelPro2000","Terrain","");
|
|
|
|
if(BackGroundFilePath.GetLength()>0)
|
|
LoadBackground(BackGroundFilePath);
|
|
|
|
if(LightFilePath.GetLength()>0)
|
|
LoadLights(LightFilePath);
|
|
|
|
if(TerrainFilePath.GetLength()>0)
|
|
LoadTerrain(TerrainFilePath);
|
|
|
|
/*
|
|
Stuff::MString erf_name("C:\\temp\\Test.erf");
|
|
|
|
Scene->SetRootMode();
|
|
|
|
Stuff::FileStream element_stream(erf_name, Stuff::FileStream::WriteOnly);
|
|
ElementRenderer::WriteERFVersion(&element_stream);
|
|
Scene->Save(&element_stream);
|
|
*/
|
|
|
|
|
|
}
|
|
|
|
|
|
void CPixelWhipProApp::LoadLights(CString light_file_name)
|
|
{
|
|
LightFilePath=light_file_name;
|
|
SaveWorkSpaceInfo();
|
|
|
|
SetCurrentDirectory(light_file_name.Left(light_file_name.ReverseFind('\\')));
|
|
gos_PushCurrentHeap(MidLevelRenderer::LightsHeap);
|
|
|
|
Stuff::NotationFile light_file((char *)(LPCSTR)LightFilePath);
|
|
Stuff::NotationFile::PageIterator *light_page_list = light_file.MakePageIterator();
|
|
|
|
OnFileClearlights();
|
|
int last_slot=0;
|
|
|
|
Page *light_page_entry;
|
|
while ((light_page_entry = light_page_list->ReadAndNext()) != NULL)
|
|
{
|
|
const char *tmpchr;
|
|
|
|
light_page_entry->GetEntry("LightType",&tmpchr);
|
|
CString ltype(tmpchr);
|
|
if(ltype.CompareNoCase("LookUp"))
|
|
{
|
|
LightState->m_lights[last_slot]=
|
|
MidLevelRenderer::MLRLight::Make(light_page_entry);
|
|
Check_Object(LightState->m_lights[last_slot]);
|
|
last_slot++;
|
|
}
|
|
}
|
|
|
|
gos_PopCurrentHeap();
|
|
|
|
Check_Object(light_page_list);
|
|
delete light_page_list;
|
|
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::LoadTerrain(CString terrain_file_name)
|
|
{
|
|
TerrainFilePath=terrain_file_name;
|
|
SaveWorkSpaceInfo();
|
|
|
|
if( TerrainGrid!=NULL ) OnFileClearterrain();
|
|
TerrainGrid=new ElementRenderer::GroupElement;
|
|
|
|
StopEffects();
|
|
CString tstr(TerrainFilePath);
|
|
MString *erf_name=new Stuff::MString;
|
|
*erf_name=Stuff::MString((LPCSTR)tstr);
|
|
|
|
Check_Object(Stuff::FileStreamManager::Instance);
|
|
Stuff::FileStream *erf_file=new Stuff::FileStream(*erf_name);
|
|
|
|
ElementRenderer::Element *tmpele;
|
|
|
|
while(erf_file->GetBytesRemaining() > 0)
|
|
{
|
|
tmpele =
|
|
ElementRenderer::Element::Create(
|
|
erf_file,
|
|
ElementRenderer::ReadERFVersion(erf_file)
|
|
);
|
|
TerrainGrid->AttachChild(tmpele);
|
|
tmpele->ClearAlignX();
|
|
tmpele->SetNeverCullMode();
|
|
tmpele->SetLocalToParent(Stuff::LinearMatrix4D::Identity);
|
|
|
|
}
|
|
|
|
Scene->AttachChild(TerrainGrid);
|
|
|
|
|
|
|
|
Scene->Sync();
|
|
MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
|
|
|
|
delete erf_name;
|
|
StartEffects();
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::LoadBackground(CString background_file_name)
|
|
{
|
|
BackGroundFilePath=background_file_name;
|
|
SaveWorkSpaceInfo();
|
|
if( SceneBackground!=NULL ) OnFileClearscenebackground();
|
|
|
|
StopEffects();
|
|
CString tstr(BackGroundFilePath);
|
|
MString *erf_name=new Stuff::MString;
|
|
*erf_name=Stuff::MString((LPCSTR)tstr);
|
|
|
|
Check_Object(Stuff::FileStreamManager::Instance);
|
|
Stuff::FileStream *erf_file=new Stuff::FileStream(*erf_name);
|
|
|
|
SceneBackground =
|
|
ElementRenderer::Element::Create(
|
|
erf_file,
|
|
ElementRenderer::ReadERFVersion(erf_file)
|
|
);
|
|
|
|
ElementRenderer::StateChange *state;
|
|
state=Scene->GetStateChange();
|
|
state->SetLightingMode(MidLevelRenderer::MLRState::VertexLightingMode|MidLevelRenderer::MLRState::FaceLightingMode);
|
|
Scene->AttachChild(SceneBackground);
|
|
|
|
Scene->Sync();
|
|
MidLevelRenderer::MLRTexturePool::Instance->LoadImages();
|
|
|
|
|
|
delete erf_name;
|
|
StartEffects();
|
|
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::SaveWorkSpaceInfo()
|
|
{
|
|
|
|
WriteProfileString("PixelPro2000","BackGround",BackGroundFilePath);
|
|
WriteProfileString("PixelPro2000","Lights",LightFilePath);
|
|
WriteProfileString("PixelPro2000","Terrain",TerrainFilePath);
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::Set3DWindowTitle()
|
|
{
|
|
if(CurrentFXIsValid())
|
|
{
|
|
Stuff::Vector3D vect;
|
|
Stuff::Point3D FXLoc,CameraLoc;
|
|
FXLoc=EffectWrapper->GetLocalToParent();
|
|
CameraLoc=Camera->GetLocalToParent();
|
|
vect.Subtract(FXLoc,CameraLoc);
|
|
|
|
CString wintitle;
|
|
wintitle.Format("3D View - Distance to Effect = %5.3f",vect.GetLength());
|
|
theApp.Window3D->SetWindowText(wintitle);
|
|
}
|
|
}
|
|
|
|
|
|
Stuff::Scalar CPixelWhipProApp::GetEffectDistance()
|
|
{
|
|
if(CurrentFXIsValid())
|
|
{
|
|
Stuff::Vector3D vect;
|
|
Stuff::Point3D FXLoc,CameraLoc;
|
|
FXLoc=EffectWrapper->GetLocalToParent();
|
|
CameraLoc=Camera->GetLocalToParent();
|
|
vect.Subtract(FXLoc,CameraLoc);
|
|
return vect.GetLength();
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void CPixelWhipProApp::FixEffectNameTable()
|
|
{
|
|
int effnum;
|
|
gosFX::EffectLibrary::Instance->m_effectNames.SetLength(gosFX::EffectLibrary::Instance->m_effects.GetLength());
|
|
for(effnum=0;effnum<gosFX::EffectLibrary::Instance->m_effects.GetLength();effnum++)
|
|
{
|
|
Verify(gosFX::EffectLibrary::Instance->m_effects[effnum]->m_effectID==effnum);
|
|
// gosFX::EffectLibrary::Instance->m_effects[effnum]->m_effectID=effnum;
|
|
gosFX::EffectLibrary::Instance->m_effectNames[effnum] = gosFX::EffectLibrary::Instance->m_effects[effnum]->m_name;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void CPixelWhipProApp::VerifyEffectLib()
|
|
{
|
|
int *ref_array;
|
|
int effecttot=gosFX::EffectLibrary::Instance->m_effects.GetLength();
|
|
|
|
|
|
ref_array=new int[effecttot];
|
|
|
|
int cureff,j;
|
|
|
|
for(j=0;j<effecttot;j++) ref_array[j]=0;
|
|
|
|
for(cureff=0;cureff<effecttot;cureff++)
|
|
{
|
|
Stuff::ChainIteratorOf<gosFX::Event*> eitr(&(gosFX::EffectLibrary::Instance->m_effects[cureff]->m_events));
|
|
gosFX::Event *tmpevent;
|
|
eitr.First();
|
|
|
|
while(NULL!=(tmpevent=eitr.ReadAndNext()) )
|
|
{
|
|
|
|
if( ref_array[tmpevent->m_effectID]>0)
|
|
{
|
|
PAUSE(("effect %s is childed twice,Reference Deleted from %s",
|
|
(char *)gosFX::EffectLibrary::Instance->m_effects[tmpevent->m_effectID]->m_name,
|
|
(char *)gosFX::EffectLibrary::Instance->m_effects[cureff]->m_name));
|
|
Unregister_Pointer(tmpevent);
|
|
delete tmpevent;
|
|
|
|
if(EListWin) EListWin->Refresh();
|
|
cureff=-1;
|
|
for(j=0;j<effecttot;j++) ref_array[j]=0;
|
|
break;
|
|
}
|
|
else
|
|
ref_array[tmpevent->m_effectID]++;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
for(cureff=0;cureff<effecttot;cureff++)
|
|
{
|
|
if(ref_array[cureff]>1)
|
|
{
|
|
gosFX::Effect::Specification *debugspec=gosFX::EffectLibrary::Instance->m_effects[cureff];
|
|
CString str;
|
|
str.Format("effect %s is childed twice",(char *)gosFX::EffectLibrary::Instance->m_effects[cureff]->m_name);
|
|
m_pMainWnd->MessageBox(str,"Hiearchy Corruption",MB_OK);
|
|
}
|
|
}
|
|
|
|
ref_array[cureff]=0;
|
|
*/
|
|
|
|
|
|
}
|
|
|
|
bool TranslateName(CString &tname,NotationFile &hint_file)
|
|
{
|
|
|
|
const char *tstr;
|
|
Page*page=hint_file.FindPage(tname);
|
|
if(page && page->GetEntry("alias",&tstr))
|
|
{
|
|
tname=tstr;
|
|
return true;
|
|
}
|
|
else
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
void CPixelWhipProApp::TranslateTextureNames()
|
|
{
|
|
NotationFile hint_file(TexturePath+"Textures.hint");
|
|
|
|
for(int effnum=0;effnum<gosFX::EffectLibrary::Instance->m_effects.GetLength();effnum++)
|
|
{
|
|
gosFX::Effect::Specification *spec=gosFX::EffectLibrary::Instance->m_effects[effnum];
|
|
if(spec->m_state.GetTextureHandle()!=0)
|
|
{
|
|
|
|
CString tname(((*MidLevelRenderer::MLRTexturePool::Instance)[&spec->m_state])->GetTextureName());
|
|
if(TranslateName(tname,hint_file))
|
|
{
|
|
MidLevelRenderer::MLRTexture *tex=MidLevelRenderer::MLRTexturePool::Instance->Add((LPCSTR)tname);
|
|
spec->m_state.SetTextureHandle(tex->GetTextureHandle());
|
|
Modified=true;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|