|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//===========================================================================//
#include "tier0/platform.h"
#include "tier0/progressbar.h"
#include "bitmap/float_bm.h"
#include "mathlib/mathlib.h"
#include "tier1/strtools.h"
#include "tier2/tier2.h"
#include "tier0/memdbgon.h"
static float RangeAdjust( float x ) { return (2*(x-.5)); }
static float saturate_and_square( float x ) { x=max(0.f,min(1.f, x) ); return x * x; }
#define OO_SQRT_3 0.57735025882720947f
static Vector bumpBasis[3] = { Vector( 0.81649661064147949f, 0.0f, OO_SQRT_3 ), Vector( -0.40824833512306213f, 0.70710676908493042f, OO_SQRT_3 ), Vector( -0.40824821591377258f, -0.7071068286895752f, OO_SQRT_3 ) };
void main(int argc,char **argv) { InitCommandLineProgram( argc, argv ); if (argc != 2) { printf("format is 'normal2ssbump filename.tga\n"); } else { ReportProgress( "reading src texture",0,0 ); FloatBitMap_t src_texture(argv[1]); for(int y=0;y<src_texture.Height;y++) { ReportProgress( "Converting to ssbump format",src_texture.Height,y ); for(int x=0;x<src_texture.Width;x++) { Vector n( RangeAdjust( src_texture.Pixel( x,y,0 ) ), RangeAdjust( src_texture.Pixel( x,y,1 ) ), RangeAdjust( src_texture.Pixel( x,y,2 ) ) ); Vector dp( saturate_and_square( DotProduct( n, bumpBasis[0] ) ), saturate_and_square( DotProduct( n, bumpBasis[1] ) ), saturate_and_square( DotProduct( n, bumpBasis[2] ) ) ); float sum = DotProduct(dp, Vector(1,1,1)); dp *= 1.0/sum; src_texture.Pixel(x,y,0) = dp.x; src_texture.Pixel(x,y,1) = dp.y; src_texture.Pixel(x,y,2) = dp.z; } } char oname[1024]; strcpy(oname,argv[1]); char *dot=Q_stristr(oname,"_normal"); if (! dot) dot=strchr(oname,'.'); if (! dot) dot=oname+strlen(oname); strcpy(dot,"_ssbump.tga"); printf( "\nWriting %s\n",oname ); src_texture.WriteTGAFile( oname ); }
}
|