diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/materialproxyfactory_wc.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'hammer/materialproxyfactory_wc.cpp')
| -rw-r--r-- | hammer/materialproxyfactory_wc.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/hammer/materialproxyfactory_wc.cpp b/hammer/materialproxyfactory_wc.cpp new file mode 100644 index 0000000..e56cfc8 --- /dev/null +++ b/hammer/materialproxyfactory_wc.cpp @@ -0,0 +1,113 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "stdafx.h" +#include "tier1/strtools.h" +#include "materialsystem/IMaterialProxy.h" +#include "materialsystem/IMaterialProxyFactory.h" +#include "materialsystem/imaterialvar.h" +#include "materialsystem/imaterial.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include <tier0/memdbgon.h> + + +// ------------------------------------------------------------------------------------- // +// The material proxy factory for WC. +// ------------------------------------------------------------------------------------- // + +class CMaterialProxyFactory : public IMaterialProxyFactory +{ +public: + IMaterialProxy *CreateProxy( const char *proxyName ); + void DeleteProxy( IMaterialProxy *pProxy ); +}; +CMaterialProxyFactory g_MaterialProxyFactory; + + +IMaterialProxy *CMaterialProxyFactory::CreateProxy( const char *proxyName ) +{ + // assumes that the client.dll is already LoadLibraried + CreateInterfaceFn clientFactory = Sys_GetFactoryThis(); + + // allocate exactly enough memory for the versioned name on the stack. + char proxyVersionedName[512]; + Q_snprintf( proxyVersionedName, sizeof( proxyVersionedName ), "%s%s", proxyName, IMATERIAL_PROXY_INTERFACE_VERSION ); + return ( IMaterialProxy * )clientFactory( proxyVersionedName, NULL ); +} + +void CMaterialProxyFactory::DeleteProxy( IMaterialProxy *pProxy ) +{ + if ( pProxy ) + { + pProxy->Release(); + } +} + + +IMaterialProxyFactory* GetHammerMaterialProxyFactory() +{ + return &g_MaterialProxyFactory; +} + + + +// ------------------------------------------------------------------------------------- // +// Specific material proxies. +// ------------------------------------------------------------------------------------- // + +class CWorldDimsProxy : public IMaterialProxy +{ +public: + CWorldDimsProxy(); + virtual ~CWorldDimsProxy(); + virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ); + virtual void OnBind( void *pC_BaseEntity ); + virtual void Release( void ) { delete this; } + virtual IMaterial *GetMaterial(); + +public: + IMaterialVar *m_pMinsVar; + IMaterialVar *m_pMaxsVar; +}; + + +CWorldDimsProxy::CWorldDimsProxy() +{ + m_pMinsVar = m_pMaxsVar = NULL; +} + +CWorldDimsProxy::~CWorldDimsProxy() +{ +} + +bool CWorldDimsProxy::Init( IMaterial *pMaterial, KeyValues *pKeyValues ) +{ + m_pMinsVar = pMaterial->FindVar( "$world_mins", NULL, false ); + m_pMaxsVar = pMaterial->FindVar( "$world_maxs", NULL, false ); + return true; +} + +void CWorldDimsProxy::OnBind( void *pC_BaseEntity ) +{ + if ( m_pMinsVar && m_pMaxsVar ) + { + float mins[3] = {-500,-500,-500}; + float maxs[3] = {+500,+500,+500}; + m_pMinsVar->SetVecValue( (const float*)mins, 3 ); + m_pMaxsVar->SetVecValue( (const float*)maxs, 3 ); + } +} + +IMaterial *CWorldDimsProxy::GetMaterial() +{ + if ( m_pMinsVar && m_pMaxsVar ) + return m_pMinsVar->GetOwningMaterial(); + return NULL; +} + +EXPOSE_INTERFACE( CWorldDimsProxy, IMaterialProxy, "WorldDims" IMATERIAL_PROXY_INTERFACE_VERSION ); + |