You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.3 KiB
132 lines
4.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ================================== // |
|
// |
|
// Purpose: Defines a texture compositor which uses simple operations and shaders to |
|
// create complex procedural textures. |
|
// |
|
//============================================================================================== // |
|
|
|
#ifndef CTEXTURECOMPOSITOR_H |
|
#define CTEXTURECOMPOSITOR_H |
|
|
|
#include "materialsystem/itexturecompositor.h" |
|
#include "materialsystem/combineoperations.h" |
|
|
|
class CTCStage; |
|
|
|
// ------------------------------------------------------------------------------------------------ |
|
struct RenderTarget_t |
|
{ |
|
int m_nWidth; |
|
int m_nHeight; |
|
ITexture* m_pRT; |
|
}; |
|
|
|
// ------------------------------------------------------------------------------------------------ |
|
class CTextureCompositor : public ITextureCompositor |
|
{ |
|
public: |
|
CTextureCompositor( int _width, int _height, int nTeam, const char* pCompositeName, uint64 nRandomSeed, uint32 nTexCompositeCreateFlags ); |
|
|
|
virtual int AddRef() OVERRIDE; |
|
virtual int Release() OVERRIDE; |
|
virtual int GetRefCount() const OVERRIDE { return m_nReferenceCount; } |
|
|
|
virtual void Update() OVERRIDE; |
|
virtual ITexture* GetResultTexture() const OVERRIDE; |
|
virtual ECompositeResolveStatus GetResolveStatus() const OVERRIDE; |
|
virtual void ScheduleResolve() OVERRIDE; |
|
|
|
void Resolve(); |
|
|
|
void Error( bool _retry, PRINTF_FORMAT_STRING const char* _debugDevMsg, ... ); |
|
|
|
void SetRootStage( CTCStage* _rootStage ); |
|
|
|
ITexture* AllocateCompositorRenderTarget( ); |
|
void ReleaseCompositorRenderTarget( ITexture* _tex ); |
|
|
|
int GetTeamNumber() const { return m_nTeam; } |
|
const CUtlString& GetName() const { return m_CompositeName; } |
|
uint32 GetCreateFlags() const { return m_nTexCompositeCreateFlags; } |
|
void GetTextureName( char* pOutBuffer, int nBufferLen ) const; |
|
void GetSeed( uint32* pOutHi, uint32* pOutLo ) const; |
|
|
|
void SetTemplate( const char* pTemplate ) { m_TemplateName = pTemplate; } |
|
bool UsesTemplate() const { return m_TemplateName.IsEmpty() == false; } |
|
const CUtlString& GetTemplateName() const { return m_TemplateName; } |
|
|
|
protected: |
|
virtual ~CTextureCompositor(); |
|
void Restart(); |
|
|
|
private: |
|
void Shutdown(); |
|
|
|
CInterlockedInt m_nReferenceCount; |
|
|
|
int m_nWidth; |
|
int m_nHeight; |
|
int m_nTeam; |
|
uint64 m_nRandomSeed; |
|
CTCStage* m_pRootStage; |
|
ECompositeResolveStatus m_ResolveStatus; |
|
|
|
// Did an error occur |
|
bool m_bError; |
|
// And is it fatal, or should we try again? |
|
bool m_bFatal; |
|
|
|
CUtlVector<RenderTarget_t> m_RenderTargetPool; |
|
int m_nRenderTargetsAllocated; |
|
int m_nCompositePaintKitId; |
|
|
|
CUtlString m_CompositeName; |
|
CUtlString m_TemplateName; |
|
uint32 m_nTexCompositeCreateFlags; |
|
bool m_bHasTeamSpecifics; |
|
}; |
|
|
|
// ------------------------------------------------------------------------------------------------ |
|
class CTextureCompositorTemplate |
|
{ |
|
public: |
|
static CTextureCompositorTemplate* Create( const char* pName, KeyValues* pTmplDesc ); |
|
~CTextureCompositorTemplate(); |
|
|
|
/* const */ KeyValues* GetKV() /* const */ { return m_pKV; } |
|
const CUtlString& GetName() const { return m_Name; } |
|
|
|
bool ResolveDependencies() const; |
|
bool HasDependencyCycles(); // Not const because we update m_bCheckedForCycles |
|
|
|
void SetImplementsName( const CUtlString& implementsName ) { m_ImplementsName = implementsName; } |
|
bool ImplementsTemplate() const { return m_ImplementsName.IsEmpty() == false; } |
|
const CUtlString& GetImplementsName() const { return m_ImplementsName; } |
|
|
|
void SetCheckedForCycles( bool checked ) { m_bCheckedForCycles = checked; } |
|
bool HasCheckedForCycles() const { return m_bCheckedForCycles; } |
|
|
|
private: |
|
CTextureCompositorTemplate( const char* pName, KeyValues* pKV ) |
|
: m_pKV( pKV ) |
|
, m_Name( pName ) |
|
, m_bCheckedForCycles( false ) |
|
{ } |
|
|
|
KeyValues* m_pKV; |
|
|
|
// Our own name |
|
CUtlString m_Name; |
|
|
|
// If we are an implementation of another template, what is that template's name? |
|
CUtlString m_ImplementsName; |
|
|
|
// Have we checked this template and it's hierarchy for cycles? If so we can early out on future checks. |
|
bool m_bCheckedForCycles; |
|
}; |
|
|
|
// ------------------------------------------------------------------------------------------------ |
|
const char *GetCombinedMaterialName( ECombineOperation eMaterial ); |
|
CTextureCompositor* CreateTextureCompositor( int _w, int _h, const char* pCompositeName, int nTeamNum, uint64 _randomSeed, KeyValues* _stageDesc, uint32 texCompositeCreateFlags ); |
|
|
|
#endif /* CTEXTURECOMPOSITOR_H */
|
|
|