deargui-vpl/ref/virtools/Samples/Behaviors/Shader/Sources/ShaderManagerDX8.h

248 lines
8.6 KiB
C++

#ifndef ShaderManagerDX8_H
#define ShaderManagerDX8_H "$Id:$"
#include "CKBaseManager.h"
#include "RCKShaderDX8.h"
#ifdef _XBOX
#undef CompileShader
#endif
//-----------------------------------------------------------------------------
// Shader Automatic Info
class ShaderAutomaticInfoDX8 {
public:
//--- Static information
XString m_name; // XString Name of the parameter
#ifndef _XBOX
XString m_desc;
int m_typeSize;
#endif
D3DXPARAMETERTYPE m_d3dType;
#ifdef _XBOX
DWORD m_dName; // 4CC Name of the param
#endif
};
BOOL _WinExec(const XString& command);
typedef XArray<D3DXHANDLE> ExposedLocalParamsPerRC;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Shader Manager Class
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
class ShaderManagerDX8 : public CKShaderManager
{
public:
ShaderManagerDX8(CKContext *Context);
~ShaderManagerDX8();
//--------------------------------------------------------------
// Methods to implement
//--------------------------------------------------------------
//--- Called to save manager data. return NULL if nothing to save...
virtual CKStateChunk* SaveData(CKFile* SavedFile);
//--- Called to load manager data.
virtual CKERROR LoadData(CKStateChunk *chunk,CKFile* LoadedFile);
//--- Called before the end of a CKContext::ClearAll operation.
virtual CKERROR PreClearAll();
//--- Called at the end of a CKContext::ClearAll operation.
virtual CKERROR PostClearAll();
//--- Called at deletion of a CKContext
virtual CKERROR OnCKEnd();
//--- Called at the end of the creation of a CKContext.
virtual CKERROR OnCKInit();
//--- Called at the end of a load operation.
virtual CKERROR PostLoad() { return CK_OK; }
//--- Called at the end of a save operation.
virtual CKERROR PostSave() { return CK_OK; }
virtual CKERROR OnRasterizerEvent(CKRST_EVENTS Event,CKRenderContext* dev);
//--- Returns list of functions implemented by the manager.
virtual CKDWORD GetValidFunctionsMask() {
return CKShaderManager::GetValidFunctionsMask() |
CKMANAGER_FUNC_PreClearAll|
CKMANAGER_FUNC_PostClearAll|
CKMANAGER_FUNC_OnCKEnd|
CKMANAGER_FUNC_OnCKInit|
CKMANAGER_FUNC_PostLoad|
CKMANAGER_FUNC_PostSave|
CKMANAGER_FUNC_OnRasterizerEvent;
}
//--------------------------------------------------------------
// Unused methods
//--------------------------------------------------------------
// virtual CKERROR SequenceAddedToScene(CKScene *scn,CK_ID *objids,int count) { return CK_OK; }
// virtual CKERROR SequenceRemovedFromScene(CKScene *scn,CK_ID *objids,int count){ return CK_OK; }
// virtual CKERROR OnPostBackToFront(CKRenderContext* dev) { return CK_OK; }
// virtual CKERROR OnPreBackToFront(CKRenderContext* dev) { return CK_OK; }
// virtual CKERROR PreClearAll() { return CK_OK; }
// virtual CKERROR OnPostCopy(CKDependenciesContext& context) { return CK_OK; }
// virtual CKERROR OnPreCopy(CKDependenciesContext& context) { return CK_OK; }
// virtual CKERROR SequenceDeleted(CK_ID *objids,int count) { return CK_OK; }
// virtual CKERROR SequenceToBeDeleted(CK_ID *objids,int count) { return CK_OK; }
// virtual CKERROR OnPostFullScreen(BOOL Going2Fullscreen,CKRenderContext* dev) { return CK_OK; }
// virtual CKERROR OnPreFullScreen(BOOL Going2Fullscreen, CKRenderContext* dev) { return CK_OK; }
// virtual CKERROR PreLoad() { return CK_OK; }
// virtual CKERROR PostLaunchScene(CKScene* OldScene,CKScene* NewScene) { return CK_OK; }
// virtual CKERROR PreLaunchScene(CKScene* OldScene,CKScene* NewScene) { return CK_OK; }
// virtual CKERROR OnCKPause() { return CK_OK; }
// virtual CKERROR OnCKPlay() { return CK_OK; }
// virtual CKERROR PostProcess() { return CK_OK; }
// virtual CKERROR PreProcess() { return CK_OK; }
// virtual CKERROR OnPostRender(CKRenderContext* dev) { return CK_OK; }
// virtual CKERROR OnPreRender(CKRenderContext* dev) { return CK_OK; }
// virtual CKERROR OnCKPostReset() { return CK_OK; }
// virtual CKERROR OnCKReset() { return CK_OK; }
// virtual CKERROR PreSave() { return CK_OK; }
// virtual CKERROR OnPostSpriteRender(CKRenderContext* dev) { return CK_OK; }
protected:
virtual void OnCreateDevice(CKRenderContext* rc);
virtual void OnDestroyDevice(CKRenderContext* rc);
virtual void OnLostDevice(CKRenderContext* rc);
virtual void OnResetDevice(CKRenderContext* rc);
//-----------------------------------------------------------------------//
// Support
//-----------------------------------------------------------------------//
public:
// Is supported only if the driver is Direct X 9.
virtual CKBOOL IsSupported() const;
virtual CKBOOL IsSupportedAndWarnIfNot();
virtual void GetVSPSVersion(float& vs, float& ps) const;
//-----------------------------------------------------------------------//
// Shader Compilation & Automatics variables
//-----------------------------------------------------------------------//
public:
virtual CKShader* CreateShader(
const XString* name = NULL,
const XString* text = NULL,
BOOL uniqueName = TRUE );
virtual void DeleteShader(CKShader* fx);
virtual CKShader* CreateShaderFromFile(const CKSTRING filename);
virtual bool SaveShaderToFile(const XString& filename, CKShader* fx);
virtual bool CompileShader(CKShader* fx, XClassArray<XString> &output);
virtual bool CompileShaderOutput(CKShader* fx, const CKSTRING funcname,
const CKSTRING target, XClassArray<XString> &output, XArray<char>& text);
virtual CKShader* GetShaderByName(const XBaseString& name);
virtual int GetNumShaders() const;
virtual CKShader* GetShader(int pos);
virtual void BeginShaders(CKRenderContext* rc);
virtual void EndShaders(CKRenderContext* rc);
virtual void SetRegAutomaticName( ShaderAutomaticParameter index, const XString& iName );
virtual XString& GetRegAutomaticName( ShaderAutomaticParameter index, int NameIndex =0);
virtual XString& GetRegAutomaticDesc( ShaderAutomaticParameter index );
public:
BOOL IsAutomatic( const D3DXPARAMETER_DESC& desc ) const;
ShaderAutomaticInfoDX8& GetRegAutomaticInfo( ShaderAutomaticParameter index );
protected:
void _SetRegAutomaticInfo( ShaderAutomaticParameter index,
const ShaderAutomaticInfoDX8& iSai );
void _SetRegAutomaticInfo( ShaderAutomaticParameter index,
const XString& iName,
D3DXPARAMETERTYPE iD3DType,
int iTypeSize,
const char* iDesc=NULL );
D3DXHANDLE _FindAutomaticParameter( CKShader& rfx,
ShaderAutomaticParameter index,
CKRenderContext* rc );
void _RegisterAutomatics();
BOOL _ReadStringFromFile(const XString& filename, XString &s) const;
BOOL _WriteStringToFile(const XString& filename, const XString &s) const;
protected:
XString m_FXCCommand;
XString m_FXPCommand;
XString m_XBECCommand;
ShaderAutomaticInfoDX8 m_RegisteredAutomatics[FXAP_MAXSIZE];
int m_NextCompID;
//-----------------------------------------------------------------------//
// Default Shader
//-----------------------------------------------------------------------//
public:
virtual CKShader* GetDefaultShader();
virtual CKShader* GetDefaultShaderI();
virtual CKShader* GetShadowShader()
{
XASSERT(0);
return NULL;
}
//-----------------------------------------------------------------------//
// View Structure
//-----------------------------------------------------------------------//
/****************************************************************
Summary: Gets the render context index.
Arguments:
iRc: the render context
Return Value:
The render context index or -1 if not found.
Remarks:
Gets the render context index among the whole list of render
context.
See Also:
*******************************************************************/
int _GetRenderContextIndex( CKRenderContext* rc );
XArray<CKRenderContext*> m_rcList;
XHashTable<int, CKParameterLocal*> m_hashParamIndex;
XClassArray<ExposedLocalParamsPerRC> m_paramLinker;
/*******************************************************************
Summary: Called when a RenderContext gets created or destroyed
to update the Shader Manager's inner list of render contexts
*******************************************************************/
virtual void OnRenderContextCreated( CKRenderContext* rc );
virtual void OnRenderContextDestroyed( CKRenderContext* rc );
void _AddRCForExposedParameters();
void _RemoveRCForExposedParameters( int rcIndex );
};
#endif