diff options
Diffstat (limited to 'utils/splitskybox')
| -rw-r--r-- | utils/splitskybox/splitskybox.cpp | 184 | ||||
| -rw-r--r-- | utils/splitskybox/splitskybox.vpc | 42 |
2 files changed, 226 insertions, 0 deletions
diff --git a/utils/splitskybox/splitskybox.cpp b/utils/splitskybox/splitskybox.cpp new file mode 100644 index 0000000..37a4357 --- /dev/null +++ b/utils/splitskybox/splitskybox.cpp @@ -0,0 +1,184 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +#include <stdlib.h> +#include <stdio.h> +#include "UtlBuffer.h" +#include "filesystem.h" +#include "filesystem_tools.h" +#include "tier1/strtools.h" +#include "tier0/icommandline.h" +#include "cmdlib.h" + +void Usage( void ) +{ + printf( "Usage: splitskybox blah.pfm\n" ); + exit( -1 ); +} + +static int ReadIntFromUtlBuffer( CUtlBuffer &buf ) +{ + int val = 0; + int c; + while( 1 ) + { + c = buf.GetChar(); + if( c >= '0' && c <= '9' ) + { + val = val * 10 + ( c - '0' ); + } + else + { + return val; + } + } +} + +//----------------------------------------------------------------------------- +// Loads a file into a UTLBuffer +//----------------------------------------------------------------------------- +static bool LoadFile( const char *pFileName, CUtlBuffer &buf, bool bFailOnError ) +{ + FILE *fp = fopen( pFileName, "rb" ); + if (!fp) + { + if (!bFailOnError) + return false; + + Error( "Can't open: \"%s\"\n", pFileName ); + } + + fseek( fp, 0, SEEK_END ); + int nFileLength = ftell( fp ); + fseek( fp, 0, SEEK_SET ); + + buf.EnsureCapacity( nFileLength ); + fread( buf.Base(), 1, nFileLength, fp ); + fclose( fp ); + buf.SeekPut( CUtlBuffer::SEEK_HEAD, nFileLength ); + return true; +} + +static bool PFMRead( CUtlBuffer &fileBuffer, int &nWidth, int &nHeight, float **ppImage ) +{ + fileBuffer.SeekGet( CUtlBuffer::SEEK_HEAD, 0 ); + if( fileBuffer.GetChar() != 'P' ) + { + Assert( 0 ); + return false; + } + if( fileBuffer.GetChar() != 'F' ) + { + Assert( 0 ); + return false; + } + if( fileBuffer.GetChar() != 0xa ) + { + Assert( 0 ); + return false; + } + nWidth = ReadIntFromUtlBuffer( fileBuffer ); + nHeight = ReadIntFromUtlBuffer( fileBuffer ); + + // eat crap until the next newline + while( fileBuffer.GetChar() != 0xa ) + { + } + + *ppImage = new float[nWidth * nHeight * 3]; + + int y; + for( y = nHeight-1; y >= 0; y-- ) + { + fileBuffer.Get( *ppImage + nWidth * y * 3, nWidth * 3 * sizeof( float ) ); + } + return true; +} + +static void PFMWrite( float *pFloatImage, const char *pFilename, int width, int height ) +{ + printf( "filename: %s\n", pFilename ); + FileHandle_t fp; + fp = g_pFullFileSystem->Open( pFilename, "wb" ); + if( fp == FILESYSTEM_INVALID_HANDLE ) + { + fprintf( stderr, "error opening \"%s\"\n", pFilename ); + exit( -1 ); + } + g_pFullFileSystem->FPrintf( fp, "PF\n%d %d\n-1.000000\n", width, height ); + int i; + for( i = height-1; i >= 0; i-- ) +// for( i = 0; i < height; i++ ) + { + float *pRow = &pFloatImage[3 * width * i]; + g_pFullFileSystem->Write( pRow, width * sizeof( float ) * 3, fp ); + } + g_pFullFileSystem->Close( fp ); +} + +void WriteSubRect( int nSrcWidth, int nSrcHeight, const float *pSrcImage, + int nSrcOffsetX, int nSrcOffsetY, int nDstWidth, int nDstHeight, + const char *pSrcFileName, const char *pDstFileNameExtension ) +{ + float *pDstImage = new float[nDstWidth * nDstHeight * 3]; + + int x, y; + for( y = 0; y < nDstHeight; y++ ) + { + for( x = 0; x < nDstWidth; x++ ) + { + pDstImage[(x+(nDstWidth*y))*3+0] = pSrcImage[((nSrcOffsetX+x)+(nSrcOffsetY+y)*nSrcWidth)*3+0]; + pDstImage[(x+(nDstWidth*y))*3+1] = pSrcImage[((nSrcOffsetX+x)+(nSrcOffsetY+y)*nSrcWidth)*3+1]; + pDstImage[(x+(nDstWidth*y))*3+2] = pSrcImage[((nSrcOffsetX+x)+(nSrcOffsetY+y)*nSrcWidth)*3+2]; + } + } + + char dstFileName[MAX_PATH]; + Q_strcpy( dstFileName, pSrcFileName ); + Q_StripExtension( pSrcFileName, dstFileName, MAX_PATH ); + Q_strcat( dstFileName, pDstFileNameExtension, sizeof(dstFileName) ); + Q_strcat( dstFileName, ".pfm", sizeof(dstFileName) ); + + PFMWrite( pDstImage, dstFileName, nDstWidth, nDstHeight ); + + delete [] pDstImage; +} + +int main( int argc, char **argv ) +{ + CommandLine()->CreateCmdLine( argc, argv ); + if( argc != 2 ) + { + Usage(); + } + CmdLib_InitFileSystem( argv[ argc-1 ] ); + CUtlBuffer srcFileData; + + // Expand the path so that it can run correctly from a shortcut + char source[1024]; + strcpy (source, ExpandPath(argv[1])); + + LoadFile( argv[1], srcFileData, true ); + + float *pSrcImage = NULL; + int nSrcWidth, nSrcHeight; + if( !PFMRead( srcFileData, nSrcWidth, nSrcHeight, &pSrcImage ) ) + { + printf( "Couldn't read %s\n", argv[1] ); + } + + int nDstWidth = nSrcWidth / 4; + int nDstHeight = nSrcHeight / 3; + Assert( nDstWidth == nDstHeight ); + + WriteSubRect( nSrcWidth, nSrcHeight, pSrcImage, nDstWidth * 0, nDstHeight * 1, nDstWidth, nDstHeight, argv[1], "ft" ); + WriteSubRect( nSrcWidth, nSrcHeight, pSrcImage, nDstWidth * 1, nDstHeight * 1, nDstWidth, nDstHeight, argv[1], "lf" ); + WriteSubRect( nSrcWidth, nSrcHeight, pSrcImage, nDstWidth * 2, nDstHeight * 1, nDstWidth, nDstHeight, argv[1], "bk" ); + WriteSubRect( nSrcWidth, nSrcHeight, pSrcImage, nDstWidth * 3, nDstHeight * 1, nDstWidth, nDstHeight, argv[1], "rt" ); + WriteSubRect( nSrcWidth, nSrcHeight, pSrcImage, nDstWidth * 3, nDstHeight * 0, nDstWidth, nDstHeight, argv[1], "up" ); + WriteSubRect( nSrcWidth, nSrcHeight, pSrcImage, nDstWidth * 3, nDstHeight * 2, nDstWidth, nDstHeight, argv[1], "dn" ); + + CmdLib_Cleanup(); + CmdLib_Exit( 1 ); + + return 0; +} + diff --git a/utils/splitskybox/splitskybox.vpc b/utils/splitskybox/splitskybox.vpc new file mode 100644 index 0000000..ffa9116 --- /dev/null +++ b/utils/splitskybox/splitskybox.vpc @@ -0,0 +1,42 @@ +//----------------------------------------------------------------------------- +// SPLITSKYBOX.VPC +// +// Project Script +//----------------------------------------------------------------------------- + +$Macro SRCDIR "..\.." +$Macro OUTBINDIR "$SRCDIR\..\game\bin" + +$Include "$SRCDIR\vpc_scripts\source_exe_con_base.vpc" + +$Configuration +{ + $Compiler + { + $AdditionalIncludeDirectories "$BASE,..\common" + } +} + +$Project "Splitskybox" +{ + $Folder "Source Files" + { + -$File "$SRCDIR\public\tier0\memoverride.cpp" + + $File "$SRCDIR\public\filesystem_helpers.cpp" + $File "$SRCDIR\public\filesystem_init.cpp" + $File "..\common\filesystem_tools.cpp" + $File "..\common\cmdlib.cpp" + $File "splitskybox.cpp" + } + + $Folder "Header Files" + { + $File "$SRCDIR\public\tier1\strtools.h" + } + + $Folder "Link Libraries" + { + $Lib tier2 + } +} |