diff options
| author | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:31:46 -0800 |
|---|---|---|
| committer | Jørgen P. Tjernø <[email protected]> | 2013-12-02 19:46:31 -0800 |
| commit | f56bb35301836e56582a575a75864392a0177875 (patch) | |
| tree | de61ddd39de3e7df52759711950b4c288592f0dc /sp/src/utils/vrad/macro_texture.cpp | |
| parent | Mark some more files as text. (diff) | |
| download | source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip | |
Fix line endings. WHAMMY.
Diffstat (limited to 'sp/src/utils/vrad/macro_texture.cpp')
| -rw-r--r-- | sp/src/utils/vrad/macro_texture.cpp | 332 |
1 files changed, 166 insertions, 166 deletions
diff --git a/sp/src/utils/vrad/macro_texture.cpp b/sp/src/utils/vrad/macro_texture.cpp index 8511d979..cd0eac12 100644 --- a/sp/src/utils/vrad/macro_texture.cpp +++ b/sp/src/utils/vrad/macro_texture.cpp @@ -1,166 +1,166 @@ -//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-//=============================================================================//
-
-#include "tier1/strtools.h"
-#include "macro_texture.h"
-#include "bsplib.h"
-#include "cmdlib.h"
-#include "vtf/vtf.h"
-#include "tier1/utldict.h"
-#include "tier1/utlbuffer.h"
-#include "bitmap/imageformat.h"
-
-
-class CMacroTextureData
-{
-public:
- int m_Width, m_Height;
- CUtlMemory<unsigned char> m_ImageData;
-};
-
-
-CMacroTextureData *g_pGlobalMacroTextureData = NULL;
-
-// Which macro texture each map face uses.
-static CUtlDict<CMacroTextureData*, int> g_MacroTextureLookup; // Stores a list of unique macro textures.
-static CUtlVector<CMacroTextureData*> g_FaceMacroTextures; // Which macro texture each face wants to use.
-static Vector g_MacroWorldMins, g_MacroWorldMaxs;
-
-
-CMacroTextureData* FindMacroTexture( const char *pFilename )
-{
- int index = g_MacroTextureLookup.Find( pFilename );
- if ( g_MacroTextureLookup.IsValidIndex( index ) )
- return g_MacroTextureLookup[index];
- else
- return NULL;
-}
-
-
-CMacroTextureData* LoadMacroTextureFile( const char *pFilename )
-{
- FileHandle_t hFile = g_pFileSystem->Open( pFilename, "rb" );
- if ( hFile == FILESYSTEM_INVALID_HANDLE )
- return NULL;
-
- // Read the file in.
- CUtlVector<char> tempData;
- tempData.SetSize( g_pFileSystem->Size( hFile ) );
- g_pFileSystem->Read( tempData.Base(), tempData.Count(), hFile );
- g_pFileSystem->Close( hFile );
-
-
- // Now feed the data into a CUtlBuffer (great...)
- CUtlBuffer buf;
- buf.Put( tempData.Base(), tempData.Count() );
-
-
- // Now make a texture out of it.
- IVTFTexture *pTex = CreateVTFTexture();
- if ( !pTex->Unserialize( buf ) )
- Error( "IVTFTexture::Unserialize( %s ) failed.", pFilename );
-
- pTex->ConvertImageFormat( IMAGE_FORMAT_RGBA8888, false ); // Get it in a format we like.
-
-
- // Now convert to a CMacroTextureData.
- CMacroTextureData *pData = new CMacroTextureData;
- pData->m_Width = pTex->Width();
- pData->m_Height = pTex->Height();
- pData->m_ImageData.EnsureCapacity( pData->m_Width * pData->m_Height * 4 );
- memcpy( pData->m_ImageData.Base(), pTex->ImageData(), pData->m_Width * pData->m_Height * 4 );
-
- DestroyVTFTexture( pTex );
-
- Msg( "-- LoadMacroTextureFile: %s\n", pFilename );
- return pData;
-}
-
-
-void InitMacroTexture( const char *pBSPFilename )
-{
- // Get the world bounds (same ones used by minimaps and level designers know how to use).
- int i = 0;
- for (i; i < num_entities; ++i)
- {
- char* pEntity = ValueForKey(&entities[i], "classname");
- if( !strcmp(pEntity, "worldspawn") )
- {
- GetVectorForKey( &entities[i], "world_mins", g_MacroWorldMins );
- GetVectorForKey( &entities[i], "world_maxs", g_MacroWorldMaxs );
- break;
- }
- }
-
- if ( i == num_entities )
- {
- Warning( "MaskOnMacroTexture: can't find worldspawn" );
- return;
- }
-
-
- // Load the macro texture that is mapped onto everything.
- char mapName[512], vtfFilename[512];
- Q_FileBase( pBSPFilename, mapName, sizeof( mapName ) );
- Q_snprintf( vtfFilename, sizeof( vtfFilename ), "materials/macro/%s/base.vtf", mapName );
- g_pGlobalMacroTextureData = LoadMacroTextureFile( vtfFilename );
-
-
- // Now load the macro texture for each face.
- g_FaceMacroTextures.SetSize( numfaces );
- for ( int iFace=0; iFace < numfaces; iFace++ )
- {
- g_FaceMacroTextures[iFace] = NULL;
-
- if ( iFace < g_FaceMacroTextureInfos.Count() )
- {
- unsigned short stringID = g_FaceMacroTextureInfos[iFace].m_MacroTextureNameID;
- if ( stringID != 0xFFFF )
- {
- const char *pMacroTextureName = &g_TexDataStringData[ g_TexDataStringTable[stringID] ];
- Q_snprintf( vtfFilename, sizeof( vtfFilename ), "%smaterials/%s.vtf", gamedir, pMacroTextureName );
-
- g_FaceMacroTextures[iFace] = FindMacroTexture( vtfFilename );
- if ( !g_FaceMacroTextures[iFace] )
- {
- g_FaceMacroTextures[iFace] = LoadMacroTextureFile( vtfFilename );
- if ( g_FaceMacroTextures[iFace] )
- {
- g_MacroTextureLookup.Insert( vtfFilename, g_FaceMacroTextures[iFace] );
- }
- }
- }
- }
- }
-}
-
-
-inline Vector SampleMacroTexture( const CMacroTextureData *t, const Vector &vWorldPos )
-{
- int ix = (int)RemapVal( vWorldPos.x, g_MacroWorldMins.x, g_MacroWorldMaxs.x, 0, t->m_Width-0.00001 );
- int iy = (int)RemapVal( vWorldPos.y, g_MacroWorldMins.y, g_MacroWorldMaxs.y, 0, t->m_Height-0.00001 );
- ix = clamp( ix, 0, t->m_Width-1 );
- iy = t->m_Height - 1 - clamp( iy, 0, t->m_Height-1 );
-
- const unsigned char *pInputColor = &t->m_ImageData[(iy*t->m_Width + ix) * 4];
- return Vector( pInputColor[0] / 255.0, pInputColor[1] / 255.0, pInputColor[2] / 255.0 );
-}
-
-
-void ApplyMacroTextures( int iFace, const Vector &vWorldPos, Vector &outLuxel )
-{
- // Add the global macro texture.
- Vector vGlobal;
- if ( g_pGlobalMacroTextureData )
- outLuxel *= SampleMacroTexture( g_pGlobalMacroTextureData, vWorldPos );
-
- // Now add the per-material macro texture.
- if ( g_FaceMacroTextures[iFace] )
- outLuxel *= SampleMacroTexture( g_FaceMacroTextures[iFace], vWorldPos );
-}
-
-
-
+//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "tier1/strtools.h" +#include "macro_texture.h" +#include "bsplib.h" +#include "cmdlib.h" +#include "vtf/vtf.h" +#include "tier1/utldict.h" +#include "tier1/utlbuffer.h" +#include "bitmap/imageformat.h" + + +class CMacroTextureData +{ +public: + int m_Width, m_Height; + CUtlMemory<unsigned char> m_ImageData; +}; + + +CMacroTextureData *g_pGlobalMacroTextureData = NULL; + +// Which macro texture each map face uses. +static CUtlDict<CMacroTextureData*, int> g_MacroTextureLookup; // Stores a list of unique macro textures. +static CUtlVector<CMacroTextureData*> g_FaceMacroTextures; // Which macro texture each face wants to use. +static Vector g_MacroWorldMins, g_MacroWorldMaxs; + + +CMacroTextureData* FindMacroTexture( const char *pFilename ) +{ + int index = g_MacroTextureLookup.Find( pFilename ); + if ( g_MacroTextureLookup.IsValidIndex( index ) ) + return g_MacroTextureLookup[index]; + else + return NULL; +} + + +CMacroTextureData* LoadMacroTextureFile( const char *pFilename ) +{ + FileHandle_t hFile = g_pFileSystem->Open( pFilename, "rb" ); + if ( hFile == FILESYSTEM_INVALID_HANDLE ) + return NULL; + + // Read the file in. + CUtlVector<char> tempData; + tempData.SetSize( g_pFileSystem->Size( hFile ) ); + g_pFileSystem->Read( tempData.Base(), tempData.Count(), hFile ); + g_pFileSystem->Close( hFile ); + + + // Now feed the data into a CUtlBuffer (great...) + CUtlBuffer buf; + buf.Put( tempData.Base(), tempData.Count() ); + + + // Now make a texture out of it. + IVTFTexture *pTex = CreateVTFTexture(); + if ( !pTex->Unserialize( buf ) ) + Error( "IVTFTexture::Unserialize( %s ) failed.", pFilename ); + + pTex->ConvertImageFormat( IMAGE_FORMAT_RGBA8888, false ); // Get it in a format we like. + + + // Now convert to a CMacroTextureData. + CMacroTextureData *pData = new CMacroTextureData; + pData->m_Width = pTex->Width(); + pData->m_Height = pTex->Height(); + pData->m_ImageData.EnsureCapacity( pData->m_Width * pData->m_Height * 4 ); + memcpy( pData->m_ImageData.Base(), pTex->ImageData(), pData->m_Width * pData->m_Height * 4 ); + + DestroyVTFTexture( pTex ); + + Msg( "-- LoadMacroTextureFile: %s\n", pFilename ); + return pData; +} + + +void InitMacroTexture( const char *pBSPFilename ) +{ + // Get the world bounds (same ones used by minimaps and level designers know how to use). + int i = 0; + for (i; i < num_entities; ++i) + { + char* pEntity = ValueForKey(&entities[i], "classname"); + if( !strcmp(pEntity, "worldspawn") ) + { + GetVectorForKey( &entities[i], "world_mins", g_MacroWorldMins ); + GetVectorForKey( &entities[i], "world_maxs", g_MacroWorldMaxs ); + break; + } + } + + if ( i == num_entities ) + { + Warning( "MaskOnMacroTexture: can't find worldspawn" ); + return; + } + + + // Load the macro texture that is mapped onto everything. + char mapName[512], vtfFilename[512]; + Q_FileBase( pBSPFilename, mapName, sizeof( mapName ) ); + Q_snprintf( vtfFilename, sizeof( vtfFilename ), "materials/macro/%s/base.vtf", mapName ); + g_pGlobalMacroTextureData = LoadMacroTextureFile( vtfFilename ); + + + // Now load the macro texture for each face. + g_FaceMacroTextures.SetSize( numfaces ); + for ( int iFace=0; iFace < numfaces; iFace++ ) + { + g_FaceMacroTextures[iFace] = NULL; + + if ( iFace < g_FaceMacroTextureInfos.Count() ) + { + unsigned short stringID = g_FaceMacroTextureInfos[iFace].m_MacroTextureNameID; + if ( stringID != 0xFFFF ) + { + const char *pMacroTextureName = &g_TexDataStringData[ g_TexDataStringTable[stringID] ]; + Q_snprintf( vtfFilename, sizeof( vtfFilename ), "%smaterials/%s.vtf", gamedir, pMacroTextureName ); + + g_FaceMacroTextures[iFace] = FindMacroTexture( vtfFilename ); + if ( !g_FaceMacroTextures[iFace] ) + { + g_FaceMacroTextures[iFace] = LoadMacroTextureFile( vtfFilename ); + if ( g_FaceMacroTextures[iFace] ) + { + g_MacroTextureLookup.Insert( vtfFilename, g_FaceMacroTextures[iFace] ); + } + } + } + } + } +} + + +inline Vector SampleMacroTexture( const CMacroTextureData *t, const Vector &vWorldPos ) +{ + int ix = (int)RemapVal( vWorldPos.x, g_MacroWorldMins.x, g_MacroWorldMaxs.x, 0, t->m_Width-0.00001 ); + int iy = (int)RemapVal( vWorldPos.y, g_MacroWorldMins.y, g_MacroWorldMaxs.y, 0, t->m_Height-0.00001 ); + ix = clamp( ix, 0, t->m_Width-1 ); + iy = t->m_Height - 1 - clamp( iy, 0, t->m_Height-1 ); + + const unsigned char *pInputColor = &t->m_ImageData[(iy*t->m_Width + ix) * 4]; + return Vector( pInputColor[0] / 255.0, pInputColor[1] / 255.0, pInputColor[2] / 255.0 ); +} + + +void ApplyMacroTextures( int iFace, const Vector &vWorldPos, Vector &outLuxel ) +{ + // Add the global macro texture. + Vector vGlobal; + if ( g_pGlobalMacroTextureData ) + outLuxel *= SampleMacroTexture( g_pGlobalMacroTextureData, vWorldPos ); + + // Now add the per-material macro texture. + if ( g_FaceMacroTextures[iFace] ) + outLuxel *= SampleMacroTexture( g_FaceMacroTextures[iFace], vWorldPos ); +} + + + |