summaryrefslogtreecommitdiff
path: root/game/client/portal/MaterialProxy_Portal_PickAlphaMask.cpp
blob: 2d7ff2f2c81f01313f5ec0cc81084d8688f70212 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "materialsystem/imaterialproxy.h"
#include "materialsystem/imaterialvar.h"
#include "materialsystem/imaterial.h"
#include "materialsystem/itexture.h"
#include "toolframework_client.h"
#include "portalrenderable_flatbasic.h"
#include <KeyValues.h>

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

class CPortalPickAlphaMaskProxy : public IMaterialProxy
{
private:
	IMaterialVar *m_AlphaMaskTextureOutput;
	IMaterialVar *m_AlphaMaskTextureFrame;
	ITexture *m_pOpeningTexture;
	ITexture *m_pIdleTexture;

public:
	CPortalPickAlphaMaskProxy( void );
	~CPortalPickAlphaMaskProxy( void );
	virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues );
	virtual void OnBind( void *pBind );
	virtual void Release( void ) { delete this; }
	virtual IMaterial *	GetMaterial() 
	{ 
		if ( m_AlphaMaskTextureOutput )
			return m_AlphaMaskTextureOutput->GetOwningMaterial();
		if ( m_AlphaMaskTextureFrame )
			return m_AlphaMaskTextureFrame->GetOwningMaterial();
		return NULL; 
	}
};

CPortalPickAlphaMaskProxy::CPortalPickAlphaMaskProxy( void )
: m_pOpeningTexture( NULL ), m_pIdleTexture( NULL )
{

}

CPortalPickAlphaMaskProxy::~CPortalPickAlphaMaskProxy( void )
{
	if( m_pOpeningTexture )
	{
		m_pOpeningTexture->DecrementReferenceCount();
		m_pOpeningTexture = NULL;
	}

	if( m_pIdleTexture )
	{
		m_pIdleTexture->DecrementReferenceCount();
		m_pIdleTexture = NULL;
	}
}

bool CPortalPickAlphaMaskProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues )
{
	char const* pszResultVar = pKeyValues->GetString( "maskTextureVar" );
	if( !pszResultVar )
		return false;

	char const* pszFrameVar = pKeyValues->GetString( "maskFrameVar" );
	if( !pszFrameVar )
		return false;

	char const* pszOpeningTextureInput = pKeyValues->GetString( "openingTexture" );
	if( !pszOpeningTextureInput )
		return false;

	char const* pszIdleTextureInput = pKeyValues->GetString( "idleTexture" );
	if( !pszIdleTextureInput )
		return false;

	bool foundVar;
	m_AlphaMaskTextureOutput = pMaterial->FindVar( pszResultVar, &foundVar, false );
	if( !foundVar )
		return false;

	m_AlphaMaskTextureFrame = pMaterial->FindVar( pszFrameVar, &foundVar, false );
	if( !foundVar )
		return false;


	m_pOpeningTexture = materials->FindTexture( pszOpeningTextureInput, TEXTURE_GROUP_CLIENT_EFFECTS );
	m_pOpeningTexture->IncrementReferenceCount();
	m_pIdleTexture = materials->FindTexture( pszIdleTextureInput, TEXTURE_GROUP_CLIENT_EFFECTS );	
	m_pIdleTexture->IncrementReferenceCount();
	return true;
}

void CPortalPickAlphaMaskProxy::OnBind( void *pBind )
{
	if( pBind == NULL )
		return;

	IClientRenderable *pRenderable = (IClientRenderable*)( pBind );

	CPortalRenderable_FlatBasic *pFlatBasic = dynamic_cast<CPortalRenderable_FlatBasic*>( pRenderable );

	if ( !pFlatBasic )
		return;

	if( pFlatBasic->m_fOpenAmount == 1.0f )
	{
		m_AlphaMaskTextureOutput->SetTextureValue( m_pIdleTexture );
	}
	else
	{
		m_AlphaMaskTextureOutput->SetTextureValue( m_pOpeningTexture );
		m_AlphaMaskTextureFrame->SetIntValue( pFlatBasic->m_fOpenAmount * m_pOpeningTexture->GetNumAnimationFrames() );
	}

	if ( ToolsEnabled() )
	{
		ToolFramework_RecordMaterialParams( GetMaterial() );
	}
}

EXPOSE_INTERFACE( CPortalPickAlphaMaskProxy, IMaterialProxy, "PortalPickAlphaMask" IMATERIAL_PROXY_INTERFACE_VERSION );