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 /utils/matsys_regressiontest/matsys_regressiontest.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/matsys_regressiontest/matsys_regressiontest.cpp')
| -rw-r--r-- | utils/matsys_regressiontest/matsys_regressiontest.cpp | 1023 |
1 files changed, 1023 insertions, 0 deletions
diff --git a/utils/matsys_regressiontest/matsys_regressiontest.cpp b/utils/matsys_regressiontest/matsys_regressiontest.cpp new file mode 100644 index 0000000..d4b81d8 --- /dev/null +++ b/utils/matsys_regressiontest/matsys_regressiontest.cpp @@ -0,0 +1,1023 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//===========================================================================// + +#define PROTECTED_THINGS_DISABLE +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#include "materialsystem/imaterialsystem.h" +#include "materialsystem/IMaterialSystemHardwareConfig.h" +#include "materialsystem/imaterialproxyfactory.h" +#include "filesystem.h" +#include "bitmap/imageformat.h" +#include "materialsystem/MaterialSystem_Config.h" +#include "tier0/icommandline.h" +#include "tier1/strtools.h" +#include "mathlib/mathlib.h" +#include "materialsystem/imesh.h" +#include "materialsystem/imaterial.h" +#include "materialsystem/imaterialvar.h" +#include "bitmap/tgawriter.h" +#include <sys/types.h> +#include <sys/stat.h> +#include <direct.h> +#include "vstdlib/cvar.h" +#include "KeyValues.h" +#include "tier1/utlbuffer.h" +#include "tier2/tier2.h" + +#define CHECKERBOARD_DIMS 16 + +IMaterial *g_pProceduralMaterial = NULL; + +static char g_pCommandLine[1024]; +static int g_ArgC = 0; +static char* g_ppArgV[32]; +static HWND g_HWnd = 0; +static CreateInterfaceFn g_MaterialsFactory; + +static CSysModule *g_MaterialsDLL = NULL; + +static int g_RenderWidth = 640; +static int g_RenderHeight = 480; +static int g_RefreshRate = 60; + +static bool g_Exiting = false; + +void CreateLightmapPages( void ); +void RenderFrame( void ); + +//----------------------------------------------------------------------------- +// Command-line... +//----------------------------------------------------------------------------- + +int FindCommand( const char *pCommand ) +{ + for ( int i = 0; i < g_ArgC; i++ ) + { + if ( !stricmp( pCommand, g_ppArgV[i] ) ) + return i; + } + return -1; +} + +const char* CommandArgument( const char *pCommand ) +{ + int cmd = FindCommand( pCommand ); + if ((cmd != -1) && (cmd < g_ArgC - 1)) + { + return g_ppArgV[cmd+1]; + } + return 0; +} + +void SetupCommandLine( const char* pCommandLine ) +{ + Q_strncpy( g_pCommandLine, pCommandLine, sizeof( g_pCommandLine ) ); + + g_ArgC = 0; + + char* pStr = g_pCommandLine; + while ( *pStr ) + { + pStr = strtok( pStr, " " ); + if( !pStr ) + { + break; + } + g_ppArgV[g_ArgC++] = pStr; + pStr += strlen(pStr) + 1; + } +} +//----------------------------------------------------------------------------- +// DummyMaterialProxyFactory... +//----------------------------------------------------------------------------- + +class DummyMaterialProxyFactory : public IMaterialProxyFactory +{ +public: + virtual IMaterialProxy *CreateProxy( const char *proxyName ) {return NULL;} + virtual void DeleteProxy( IMaterialProxy *pProxy ) {} +}; +static DummyMaterialProxyFactory g_DummyMaterialProxyFactory; + +//----------------------------------------------------------------------------- +// Spew function! +//----------------------------------------------------------------------------- +SpewRetval_t SpewFunc( SpewType_t spewType, char const *pMsg ) +{ + OutputDebugString( pMsg ); + switch( spewType ) + { + case SPEW_MESSAGE: + case SPEW_WARNING: + case SPEW_LOG: + OutputDebugString( pMsg ); + return SPEW_CONTINUE; + + case SPEW_ASSERT: + case SPEW_ERROR: + default: + ::MessageBox( NULL, pMsg, "Error!", MB_OK ); + return SPEW_DEBUGGER; + } +} + +//----------------------------------------------------------------------------- +// Error... +//----------------------------------------------------------------------------- + +void DisplayError( const char* pError, ... ) +{ + va_list argptr; + char msg[1024]; + + va_start( argptr, pError ); + Q_vsnprintf( msg, sizeof( msg ), pError, argptr ); + va_end( argptr ); + + MessageBox( 0, msg, 0, MB_OK ); +} + + + +IFileSystem *g_pFileSystem; +static CSysModule *g_pFileSystemModule = NULL; +static CreateInterfaceFn g_pFileSystemFactory = NULL; +static bool FileSystem_LoadDLL( void ) +{ + g_pFileSystemModule = Sys_LoadModule( "filesystem_stdio.dll" ); + Assert( g_pFileSystemModule ); + if( !g_pFileSystemModule ) + { + return false; + } + + g_pFileSystemFactory = Sys_GetFactory( g_pFileSystemModule ); + if( !g_pFileSystemFactory ) + { + return false; + } + g_pFileSystem = ( IFileSystem * )g_pFileSystemFactory( FILESYSTEM_INTERFACE_VERSION, NULL ); + Assert( g_pFileSystem ); + if( !g_pFileSystem ) + { + return false; + } + return true; +} + +void FileSystem_UnloadDLL( void ) +{ + if ( !g_pFileSystemModule ) + return; + + Sys_UnloadModule( g_pFileSystemModule ); + g_pFileSystemModule = 0; +} + +void FileSystem_Init( ) +{ + if( !FileSystem_LoadDLL() ) + { + return; + } + + g_pFileSystem->RemoveSearchPath( NULL, "GAME" ); + g_pFileSystem->AddSearchPath( "hl2", "GAME", PATH_ADD_TO_HEAD ); +} + +void FileSystem_Shutdown( void ) +{ + g_pFileSystem->Shutdown(); + + FileSystem_UnloadDLL(); +} + + +//----------------------------------------------------------------------------- +// Purpose: Unloads the material system .dll +//----------------------------------------------------------------------------- +void UnloadMaterialSystem( void ) +{ + if ( !g_MaterialsFactory ) + return; + + Sys_UnloadModule( g_MaterialsDLL ); + g_MaterialsDLL = NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: Loads the material system dll +//----------------------------------------------------------------------------- +void LoadMaterialSystem( void ) +{ + if( g_MaterialsFactory ) + { + return; + } + + Assert( !g_MaterialsDLL ); + + g_MaterialsDLL = Sys_LoadModule( "MaterialSystem.dll" ); + + g_MaterialsFactory = Sys_GetFactory( g_MaterialsDLL ); + if ( !g_MaterialsFactory ) + { + DisplayError( "LoadMaterialSystem: Failed to load MaterialSystem.DLL\n" ); + return; + } + + if ( g_MaterialsFactory ) + { + g_pMaterialSystem = (IMaterialSystem *)g_MaterialsFactory( MATERIAL_SYSTEM_INTERFACE_VERSION, NULL ); + if ( !g_pMaterialSystem ) + { + DisplayError( "Could not get the material system interface from materialsystem.dll (a)" ); + } + } + else + { + DisplayError( "Could not find factory interface in library MaterialSystem.dll" ); + } +} + +void InitMaterialSystemConfig(MaterialSystem_Config_t *pConfig) +{ +} + +CreateInterfaceFn g_MaterialSystemClientFactory; +void Shader_Init( HWND mainWindow ) +{ + LoadMaterialSystem(); + Assert( g_pMaterialSystem ); + + // FIXME: Where do we put this? + const char* pDLLName; + pDLLName = "shaderapidx9"; + + // assume that IFileSystem paths have already been set via g_pFileSystem + g_MaterialSystemClientFactory = g_pMaterialSystem->Init( + pDLLName, &g_DummyMaterialProxyFactory, g_pFileSystemFactory, VStdLib_GetICVarFactory() ); + if (!g_MaterialSystemClientFactory) + { + DisplayError( "Unable to init shader system\n" ); + } + + // Get the adapter from the command line.... + MaterialVideoMode_t mode; + memset( &mode, 0, sizeof( mode ) ); + mode.m_Width = g_RenderWidth; + mode.m_Height = g_RenderHeight; + mode.m_Format = IMAGE_FORMAT_BGRX8888; + mode.m_RefreshRate = g_RefreshRate; +// bool modeSet = g_pMaterialSystem->SetMode( (void*)mainWindow, mode, modeFlags ); +// if (!modeSet) +// { +// DisplayError( "Unable to set mode\n" ); +// } + + g_pMaterialSystemHardwareConfig = (IMaterialSystemHardwareConfig*) + g_MaterialSystemClientFactory( MATERIALSYSTEM_HARDWARECONFIG_INTERFACE_VERSION, 0 ); + if ( !g_pMaterialSystemHardwareConfig ) + { + DisplayError( "Could not get the material system hardware config interface!" ); + } + + MaterialSystem_Config_t config; + InitMaterialSystemConfig(&config); + g_pMaterialSystem->OverrideConfig( config, false ); + if( FindCommand( "-stub" ) != -1 ) + { + g_pMaterialSystem->SetInStubMode( true ); + } +} + +void Shader_Shutdown( HWND hwnd ) +{ + // Recursive shutdown + if ( !g_pMaterialSystem ) + return; + + g_pMaterialSystem->Shutdown( ); + g_pMaterialSystem = NULL; + UnloadMaterialSystem(); +} + +static void CalcWindowSize( int desiredRenderingWidth, int desiredRenderingHeight, + int *windowWidth, int *windowHeight ) +{ + int borderX, borderY; + borderX = (GetSystemMetrics(SM_CXFIXEDFRAME) + 1) * 2; + borderY = (GetSystemMetrics(SM_CYFIXEDFRAME) + 1) * 2 + GetSystemMetrics(SM_CYSIZE) + 1; + *windowWidth = desiredRenderingWidth + borderX; + *windowHeight = desiredRenderingHeight + borderY; +} + +//----------------------------------------------------------------------------- +// Window create, destroy... +//----------------------------------------------------------------------------- +LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + switch( msg ) + { + case WM_PAINT: + RenderFrame(); + break; + // abort when ESC is hit + case WM_CHAR: + switch(wParam) + { + case VK_ESCAPE: + SendMessage( g_HWnd, WM_CLOSE, 0, 0 ); + break; + } + break; + + case WM_DESTROY: + g_Exiting = true; + PostQuitMessage( 0 ); + return 0; + } + + return DefWindowProc( hWnd, msg, wParam, lParam ); +} + +bool CreateAppWindow( const char* pAppName, int width, int height ) +{ + // Register the window class + WNDCLASSEX windowClass = + { + sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, + GetModuleHandle(NULL), NULL, NULL, NULL, NULL, + pAppName, NULL + }; + + RegisterClassEx( &windowClass ); + + // Create the application's window + g_HWnd = CreateWindow( pAppName, pAppName, + WS_OVERLAPPEDWINDOW, + 0, 0, width, height, + GetDesktopWindow(), NULL, windowClass.hInstance, NULL ); + + ShowWindow (g_HWnd, SW_SHOWDEFAULT); + + return (g_HWnd != 0); +} + +void DestroyAppWindow() +{ + if (g_HWnd) + DestroyWindow( g_HWnd ); +} +bool Init( const char* pCommands) +{ + // Store off the command line... + SetupCommandLine( pCommands ); + FileSystem_Init( ); + + /* figure out g_Renderwidth and g_RenderHeight */ + g_RenderWidth = -1; + g_RenderHeight = -1; + + g_RenderWidth = 640; + g_RenderHeight = 480; + + int windowWidth, windowHeight; + CalcWindowSize( g_RenderWidth, g_RenderHeight, &windowWidth, &windowHeight ); + + if( !CreateAppWindow( "matsys_regressiontest", windowWidth, windowHeight ) ) + { + return false; + } + + Shader_Init( g_HWnd ); + g_pMaterialSystem->CacheUsedMaterials(); + CreateLightmapPages(); + return true; +} + + +//----------------------------------------------------------------------------- +// Purpose: Return the directory where this .exe is running from +// Output : char +//----------------------------------------------------------------------------- + +static char *GetBaseDir( const char *pszBuffer ) +{ + static char basedir[ MAX_PATH ]; + char szBuffer[ MAX_PATH ]; + int j; + char *pBuffer = NULL; + + Q_strncpy( szBuffer, pszBuffer, sizeof( szBuffer ) ); + + pBuffer = strrchr( szBuffer,'\\' ); + if ( pBuffer ) + { + *(pBuffer+1) = '\0'; + } + + Q_strncpy( basedir, szBuffer, sizeof( basedir ) ); + + j = strlen( basedir ); + if (j > 0) + { + if ( ( basedir[ j-1 ] == '\\' ) || + ( basedir[ j-1 ] == '/' ) ) + { + basedir[ j-1 ] = 0; + } + } + + return basedir; +} + +//----------------------------------------------------------------------------- +// Shutdown +//----------------------------------------------------------------------------- + +void Shutdown() +{ + // Close the window + DestroyAppWindow(); + + Shader_Shutdown( g_HWnd ); +} + +//----------------------------------------------------------------------------- +// Pump windows messages +//----------------------------------------------------------------------------- + +void PumpWindowsMessages () +{ + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) == TRUE) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + InvalidateRect(g_HWnd, NULL, false); + UpdateWindow(g_HWnd); +} + +MaterialSystem_SortInfo_t *g_pMaterialSortInfo = NULL; +struct LightmapInfo_t +{ + int m_LightmapDims[2]; + int m_LightmapPageDims[2]; + int m_OffsetIntoLightmapPage[2]; + int m_SortID; +}; + +LightmapInfo_t g_CheckerboardLightmapInfo; + +void AllocateLightmap( LightmapInfo_t& lightmapInfo, int width, int height ) +{ + lightmapInfo.m_LightmapDims[0] = width; + lightmapInfo.m_LightmapDims[1] = height; + // HACK! We don't ever use this material for anything. . just need it for allocating lightmaps. + CMatRenderContextPtr pRenderContext( materials ); + IMaterial *pHackMaterial = g_pMaterialSystem->FindMaterial( "shadertest/lightmappedgeneric", TEXTURE_GROUP_OTHER ); + pRenderContext->Bind( pHackMaterial ); + lightmapInfo.m_SortID = + g_pMaterialSystem->AllocateLightmap( 16, 16, lightmapInfo.m_OffsetIntoLightmapPage, pHackMaterial ); +} + +void Lightmap_PostAllocation( LightmapInfo_t& lightmapInfo ) +{ + g_pMaterialSystem->GetLightmapPageSize( lightmapInfo.m_SortID, + &lightmapInfo.m_LightmapPageDims[0], &lightmapInfo.m_LightmapPageDims[1] ); +} + +void UpdateLightmap( LightmapInfo_t& lightmapInfo, float *data ) +{ + g_pMaterialSystem->UpdateLightmap( g_pMaterialSortInfo[lightmapInfo.m_SortID].lightmapPageID, + lightmapInfo.m_LightmapDims, lightmapInfo.m_OffsetIntoLightmapPage, data, NULL, NULL, NULL ); +} + +void CreateLightmapPages( void ) +{ + g_pMaterialSystem->BeginLightmapAllocation(); + + AllocateLightmap( g_CheckerboardLightmapInfo, CHECKERBOARD_DIMS, CHECKERBOARD_DIMS ); + + g_pMaterialSystem->EndLightmapAllocation(); + int numSortIDs = g_pMaterialSystem->GetNumSortIDs(); + g_pMaterialSortInfo = new MaterialSystem_SortInfo_t[numSortIDs]; + g_pMaterialSystem->GetSortInfo( g_pMaterialSortInfo ); + + Lightmap_PostAllocation( g_CheckerboardLightmapInfo ); + + float checkerboardImage[CHECKERBOARD_DIMS*CHECKERBOARD_DIMS*4]; + int x, y; + for( y = 0; y < CHECKERBOARD_DIMS; y++ ) + { + for( x = 0; x < CHECKERBOARD_DIMS; x++ ) + { + if( ( x + y ) & 1 ) + { + checkerboardImage[(y*CHECKERBOARD_DIMS+x)*4+0] = 1.0f; + checkerboardImage[(y*CHECKERBOARD_DIMS+x)*4+1] = 1.0f; + checkerboardImage[(y*CHECKERBOARD_DIMS+x)*4+2] = 1.0f; + checkerboardImage[(y*CHECKERBOARD_DIMS+x)*4+3] = 1.0f; + } + else + { + checkerboardImage[(y*CHECKERBOARD_DIMS+x)*4+0] = 0.0f; + checkerboardImage[(y*CHECKERBOARD_DIMS+x)*4+1] = 0.0f; + checkerboardImage[(y*CHECKERBOARD_DIMS+x)*4+2] = 0.0f; + checkerboardImage[(y*CHECKERBOARD_DIMS+x)*4+3] = 1.0f; + } + } + } + + UpdateLightmap( g_CheckerboardLightmapInfo, checkerboardImage ); +} + +void LightmapTexCoord( CMeshBuilder& meshBuilder, LightmapInfo_t lightmapInfo, float s, float t ) +{ + // add a one texel border. + float newS = ( s * ( lightmapInfo.m_LightmapDims[0] - 2 ) ) + 1; + float newT = ( t * ( lightmapInfo.m_LightmapDims[1] - 2 ) ) + 1; + newS += lightmapInfo.m_OffsetIntoLightmapPage[0]; + newT += lightmapInfo.m_OffsetIntoLightmapPage[1]; + newS *= 1.0f / lightmapInfo.m_LightmapPageDims[0]; + newT *= 1.0f / lightmapInfo.m_LightmapPageDims[1]; + meshBuilder.TexCoord2f( 1, newS, newT ); +} + +//----------------------------------------------------------------------------- +// Update +//----------------------------------------------------------------------------- +bool Update() +{ + PumpWindowsMessages(); + return g_Exiting; +} + +void ScreenShot( const char *pFilename ) +{ + // bitmap bits + unsigned char *pImage = ( unsigned char * )malloc( g_RenderWidth * 3 * g_RenderHeight ); + + // Get Bits from the material system + CMatRenderContextPtr pRenderContext( materials ); + pRenderContext->ReadPixels( 0, 0, g_RenderWidth, g_RenderHeight, pImage, IMAGE_FORMAT_RGB888 ); + + CUtlBuffer outBuf; + if( !TGAWriter::WriteToBuffer( pImage, outBuf, g_RenderWidth, g_RenderHeight, IMAGE_FORMAT_RGB888, + IMAGE_FORMAT_RGB888 ) ) + { + Error( "Couldn't write %s\n", pFilename ); + } + if ( !g_pFullFileSystem->WriteFile( pFilename, NULL, outBuf ) ) + { + Error( "Couldn't write %s\n", pFilename ); + } + + free( pImage ); +} + +void SetVar( const char *pVarName, const char *pStringValue ) +{ + IMaterialVar *pVar = g_pProceduralMaterial->FindVar( pVarName, NULL ); + if( pStringValue ) + { + pVar->SetStringValue( pStringValue ); + } + else + { + pVar->SetUndefined(); + } +} + +void SetVar( const char *pVarName, int val ) +{ + IMaterialVar *pVar = g_pProceduralMaterial->FindVar( pVarName, NULL ); + pVar->SetIntValue( val ); +} + +void SetFlag( MaterialVarFlags_t flag, int val ) +{ + g_pProceduralMaterial->SetMaterialVarFlag( flag, val ? true : false ); +} + +void DrawBackground( void ) +{ + CMatRenderContextPtr pRenderContext( materials ); + IMaterial *pMaterial = g_pMaterialSystem->FindMaterial( "matsys_regressiontest/background", TEXTURE_GROUP_OTHER ); + pRenderContext->Bind( pMaterial ); + + IMesh *pMesh = pRenderContext->GetDynamicMesh(); + CMeshBuilder meshBuilder; + meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); + +#define X 500.0f +#define Y 500.0f +#define Z -500.0f + + meshBuilder.Position3f( -X, Y, Z ); + meshBuilder.TexCoord2f( 0, 0.0f, 0.0f ); + meshBuilder.AdvanceVertex(); + + meshBuilder.Position3f( X, Y, Z ); + meshBuilder.TexCoord2f( 0, 1.0f, 0.0f ); + meshBuilder.AdvanceVertex(); + + meshBuilder.Position3f( X, -Y, Z ); + meshBuilder.TexCoord2f( 0, 1.0f, 1.0f ); + meshBuilder.AdvanceVertex(); + + meshBuilder.Position3f( -X, -Y, Z ); + meshBuilder.TexCoord2f( 0, 0.0f, 1.0f ); + meshBuilder.AdvanceVertex(); + + meshBuilder.End(); + pMesh->Draw(); + +#undef X +#undef Y +#undef Z +} + +void BeginFrame( void ) +{ + g_pMaterialSystem->BeginFrame( 0 ); + + CMatRenderContextPtr pRenderContext( materials ); + pRenderContext->ClearColor3ub( 255, 0, 0 ); + pRenderContext->ClearBuffers( true, true ); + pRenderContext->Viewport( 0, 0, g_RenderWidth, g_RenderHeight ); + + pRenderContext->MatrixMode( MATERIAL_PROJECTION ); + pRenderContext->LoadIdentity(); + pRenderContext->PerspectiveX( 90.0f, ( g_RenderWidth / g_RenderHeight), 1.0f, 500000.0f ); + + pRenderContext->MatrixMode( MATERIAL_VIEW ); + pRenderContext->LoadIdentity(); + + pRenderContext->MatrixMode( MATERIAL_MODEL ); + pRenderContext->LoadIdentity(); +} + +void EndFrame( void ) +{ + g_pMaterialSystem->EndFrame(); + g_pMaterialSystem->SwapBuffers(); +} + +void DrawQuad( const LightmapInfo_t& lightmapInfo ) +{ + CMatRenderContextPtr pRenderContext( materials ); + pRenderContext->BindLightmapPage( g_pMaterialSortInfo[lightmapInfo.m_SortID].lightmapPageID ); + + pRenderContext->Bind( g_pProceduralMaterial ); + + IMesh *pMesh = pRenderContext->GetDynamicMesh(); + CMeshBuilder meshBuilder; + meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); + +#define X 350.0f +#define Y (X*(4.0f/3.0f)) +#define Z -500.0f + + meshBuilder.Position3f( -X, Y, Z ); + meshBuilder.TexCoord2f( 0, 0.0f, 0.0f ); + LightmapTexCoord( meshBuilder, lightmapInfo, 0.0f, 0.0f ); + meshBuilder.Normal3f( 0.0f, 0.0f, 1.0f ); + meshBuilder.Color4f( 1.0f, 0.0f, 0.0f, 1.0f ); + meshBuilder.AdvanceVertex(); + + meshBuilder.Position3f( X, Y, Z ); + meshBuilder.TexCoord2f( 0, 1.0f, 0.0f ); + LightmapTexCoord( meshBuilder, lightmapInfo, 1.0f, 0.0f ); + meshBuilder.Normal3f( 0.0f, 0.0f, 1.0f ); + meshBuilder.Color4f( 1.0f, 1.0f, 0.0f, 1.0f ); + meshBuilder.AdvanceVertex(); + + meshBuilder.Position3f( X, -Y, Z ); + meshBuilder.TexCoord2f( 0, 1.0f, 1.0f ); + LightmapTexCoord( meshBuilder, lightmapInfo, 1.0f, 1.0f ); + meshBuilder.Normal3f( 0.0f, 0.0f, 1.0f ); + meshBuilder.Color4f( 1.0f, 1.0f, 1.0f, 0.0f ); + meshBuilder.AdvanceVertex(); + + meshBuilder.Position3f( -X, -Y, Z ); + meshBuilder.TexCoord2f( 0, 0.0f, 1.0f ); + LightmapTexCoord( meshBuilder, lightmapInfo, 0.0f, 1.0f ); + meshBuilder.Normal3f( 0.0f, 0.0f, 1.0f ); + meshBuilder.Color4f( 0.0f, 1.0f, 1.0f, 1.0f ); + meshBuilder.AdvanceVertex(); + + meshBuilder.End(); + pMesh->Draw(); + +#undef X +#undef Y +#undef Z +} + +void TestLightmappedGeneric_dx80( void ) +{ +/* +based on lightmappedgeneric_vs11.fxc: +// STATIC: "DETAIL" "0..1" +// STATIC: "ENVMAP" "0..1" +// STATIC: "ENVMAPCAMERASPACE" "0..1" +// STATIC: "ENVMAPSPHERE" "0..1" +// STATIC: "VERTEXCOLOR" "0..1" +// DYNAMIC: "FOGTYPE" "0..1" + +// SKIP: $ENVMAPCAMERASPACE && $ENVMAPSPHERE +// SKIP: !$ENVMAP && ( $ENVMAPCAMERASPACE || $ENVMAPSPHERE ) + +based on lightmappedgeneric_ps11.fxc: +// STATIC: "BASETEXTURE" "0..1" +// STATIC: "ENVMAP" "0..1" +// STATIC: "ENVMAPMASK" "0..1" +// STATIC: "SELFILLUM" "0..1" +// STATIC: "BASEALPHAENVMAPMASK" "0..1" + +// SKIP: !$ENVMAP && ( $BASEALPHAENVMAPMASK || $ENVMAPMASK ) +// SKIP: !$BASETEXTURE && $BASEALPHAENVMAPMASK +// SKIP: $BASEALPHAENVMAPMASK && $ENVMAPMASK +// SKIP: !$BASETEXTURE && $BASEALPHAENVMAPMASK +// SKIP: $SELFILLUM && $BASEALPHAENVMAPMASK +// SKIP: !$BASETEXTURE && $SELFILLUM + + +Versions with DETAIL aren't implemented yet in HLSL, but we'll go ahead and test those. +*/ + // The following are shader combos from lightmappedgeneric_ps20 + for( int BUMPMAP = 0; BUMPMAP <= 1; BUMPMAP++ ) + { + for( int NORMALMAPALPHAENVMAPMASK = 0; NORMALMAPALPHAENVMAPMASK <= 1; NORMALMAPALPHAENVMAPMASK++ ) + { + // The following are shader combos from lightmappedgeneric_ps11 (that aren't in lightmappedgenerc_vs11) + for( int BASETEXTURE = 0; BASETEXTURE <= 1; BASETEXTURE++ ) + { + for( int ENVMAPMASK = 0; ENVMAPMASK <= 1; ENVMAPMASK++ ) + { + for( int SELFILLUM = 0; SELFILLUM <= 1; SELFILLUM++ ) + { + for( int BASEALPHAENVMAPMASK = 0; BASEALPHAENVMAPMASK <= 1; BASEALPHAENVMAPMASK++ ) + { + // The following are shader combos from lightmappedgeneric_vs11 + for( int DETAIL = 0; DETAIL <= 1; DETAIL++ ) + { + for( int ENVMAP = 0; ENVMAP <= 1; ENVMAP++ ) + { + for( int ENVMAPCAMERASPACE = 0; ENVMAPCAMERASPACE <= 1; ENVMAPCAMERASPACE++ ) + { + for( int ENVMAPSPHERE = 0; ENVMAPSPHERE <= 1; ENVMAPSPHERE++ ) + { + for( int VERTEXCOLOR = 0; VERTEXCOLOR <= 1; VERTEXCOLOR++ ) + { + // for( int FOGTYPE = 0; FOGTYPE <= 1; FOGTYPE++ ) + { + // conditional beneath here are flags, not shader combos + for( int ALPHATEST = 0; ALPHATEST <= 1; ALPHATEST++ ) + { + for( int TRANSLUCENT = 0; TRANSLUCENT <= 1; TRANSLUCENT++ ) + { + for( int COLORMODULATE = 0; COLORMODULATE <= 1; COLORMODULATE++ ) + { + for( int ALPHAMODULATE = 0; ALPHAMODULATE <= 1; ALPHAMODULATE++ ) + { +#if 0 + BUMPMAP = 0; + NORMALMAPALPHAENVMAPMASK = 0; + BASETEXTURE = 1; + ENVMAPMASK = 0; + SELFILLUM = 0; + BASEALPHAENVMAPMASK = 1; + DETAIL = 0; + ENVMAP = 1; + ENVMAPCAMERASPACE = 0; + ENVMAPSPHERE = 0; + VERTEXCOLOR = 0; + ALPHATEST = 0; + TRANSLUCENT = 0; + COLORMODULATE = 0; + ALPHAMODULATE = 0; +#endif + // skip commands from shader lightmappedgeneric_vs11 + if( ENVMAPCAMERASPACE && ENVMAPSPHERE ) continue; + if( !ENVMAP && ( ENVMAPCAMERASPACE || ENVMAPSPHERE ) ) continue; + + // skip commands from shader lihgtmappedgeneric_ps11 + if( !ENVMAP && ( BASEALPHAENVMAPMASK || ENVMAPMASK ) ) continue; + if( !BASETEXTURE && BASEALPHAENVMAPMASK ) continue; + if( BASEALPHAENVMAPMASK && ENVMAPMASK ) continue; + if( !BASETEXTURE && BASEALPHAENVMAPMASK ) continue; + if( SELFILLUM && BASEALPHAENVMAPMASK ) continue; + if( !BASETEXTURE && SELFILLUM ) continue; + + // skip commands from shader lightmappedgeneric_ps20 + if( DETAIL && BUMPMAP ) continue; + if( ENVMAPMASK && BUMPMAP ) continue; + if( NORMALMAPALPHAENVMAPMASK && BASEALPHAENVMAPMASK ) continue; + if( NORMALMAPALPHAENVMAPMASK && ENVMAPMASK ) continue; + if( BASEALPHAENVMAPMASK && ENVMAPMASK ) continue; + if( BASEALPHAENVMAPMASK && SELFILLUM ) continue; + + // skip commands from flags that don't make sense (or we don't want to test) + if( !BASETEXTURE && ( ALPHATEST || TRANSLUCENT ) ) continue; + if( TRANSLUCENT && ALPHATEST ) continue; + + KeyValues *pKeyValues = new KeyValues( "lightmappedgeneric" ); + if ( BASETEXTURE ) + { + pKeyValues->SetString( "$basetexture", "matsys_regressiontest/basetexture" ); + } + if ( ENVMAPMASK ) + { + pKeyValues->SetString( "$envmapmask", "matsys_regressiontest/specularmask" ); + } + if ( SELFILLUM ) + { + pKeyValues->SetInt( "$selfillum", 1 ); + } + if ( BASEALPHAENVMAPMASK ) + { + pKeyValues->SetInt( "$basealphaenvmapmask", 1 ); + } + if ( BUMPMAP ) + { + pKeyValues->SetString( "$bumpmap", "matsys_regressiontest/normalmap_normal" ); + } + if ( DETAIL ) + { + pKeyValues->SetString( "$detail", "matsys_regressiontest/detail" ); + pKeyValues->SetFloat( "$detailscale", 0.5f ); + } + if ( ENVMAP ) + { + pKeyValues->SetString( "$envmap", "matsys_regressiontest/cubemap" ); + } + if ( BASEALPHAENVMAPMASK ) + { + pKeyValues->SetInt( "$basealphaenvmapmask", 1 ); + } + if ( NORMALMAPALPHAENVMAPMASK ) + { + pKeyValues->SetInt( "$normalmapalphaenvmapmask", 1 ); + } + if ( TRANSLUCENT ) + { + pKeyValues->SetInt( "$translucent", 1 ); + } + if ( ENVMAPCAMERASPACE ) + { + pKeyValues->SetInt( "$envmapcameraspace", 1 ); + } + if ( ENVMAPSPHERE ) + { + pKeyValues->SetInt( "$envmapsphere", 1 ); + } + if ( VERTEXCOLOR ) + { + pKeyValues->SetInt( "$vertexcolor", 1 ); + } + if ( ALPHATEST ) + { + pKeyValues->SetInt( "$alphatest", 1 ); + } + if ( COLORMODULATE ) + { + pKeyValues->SetString( "$color", "[1.0 0.8 0.5]" ); + } + if ( ALPHAMODULATE ) + { + pKeyValues->SetFloat( "$alpha", 0.6f ); + } + + // FIXME: ignoring fogtype for now. + // hack hack - LEAK - need to figure out how to clear a material out. + g_pProceduralMaterial = g_pMaterialSystem->CreateMaterial( "test", pKeyValues ); + g_pProceduralMaterial->Refresh(); + + BeginFrame(); + DrawBackground(); + DrawQuad( g_CheckerboardLightmapInfo ); + EndFrame(); + char filename[MAX_PATH]; + sprintf( filename, "%s\\lightmappedgeneric_dx80", CommandLine()->ParmValue( "-targetdir" ) ); + + if( BUMPMAP ) Q_strcat( filename, "_BUMPMAP", sizeof(filename) ); + if( NORMALMAPALPHAENVMAPMASK ) Q_strcat( filename, "_NORMALMAPALPHAENVMAPMASK", sizeof(filename) ); + + if( BASETEXTURE ) Q_strcat( filename, "_BASE", sizeof(filename) ); + if( ENVMAPMASK ) Q_strcat( filename, "_ENVMAPMASK", sizeof(filename) ); + if( SELFILLUM ) Q_strcat( filename, "_SELFILLUM", sizeof(filename) ); + if( BASEALPHAENVMAPMASK ) Q_strcat( filename, "_BASEALPHAENVMAPMASK", sizeof(filename) ); + + if( DETAIL ) Q_strcat( filename, "_DETAIL", sizeof(filename) ); + if( ENVMAP ) Q_strcat( filename, "_ENVMAP", sizeof(filename) ); + if( ENVMAPCAMERASPACE ) Q_strcat( filename, "_ENVMAPCAMERASPACE", sizeof(filename) ); + if( ENVMAPSPHERE ) Q_strcat( filename, "_ENVMAPSPHERE", sizeof(filename) ); + if( VERTEXCOLOR ) Q_strcat( filename, "_VERTEXCOLOR", sizeof(filename) ); + // if( FOGTYPE ) Q_strcat( filename, "_FOGTYPE", sizeof(filename) ); + if( ALPHATEST ) Q_strcat( filename, "_ALPHATEST", sizeof(filename) ); + if( TRANSLUCENT ) Q_strcat( filename, "_TRANSLUCENT", sizeof(filename) ); + if( COLORMODULATE ) Q_strcat( filename, "_COLORMODULATE", sizeof(filename) ); + if( ALPHAMODULATE ) Q_strcat( filename, "_ALPHAMODULATE", sizeof(filename) ); + + if( BUMPMAP ) Q_strcat( filename, "_BUMPMAP", sizeof(filename) ); + Q_strcat( filename, ".tga", sizeof(filename) ); + ScreenShot( filename ); + + g_pProceduralMaterial->DecrementReferenceCount(); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } +} + +//----------------------------------------------------------------------------- +// Render a frame +//----------------------------------------------------------------------------- + +void RenderFrame( void ) +{ + TestLightmappedGeneric_dx80(); +} + +INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE hInstance, LPSTR pCommands, INT ) +{ + SpewOutputFunc( SpewFunc ); + CommandLine()->CreateCmdLine( ::GetCommandLine() ); + InitDefaultFileSystem(); + + if( !CommandLine()->ParmValue( "-targetdir" ) ) + { + Error( "Must specify -targetdir on command line!\n" ); + } + + struct _stat statbuf; + if( 0 != _stat( CommandLine()->ParmValue( "-targetdir" ), &statbuf ) ) + { + if( 0 != _mkdir( CommandLine()->ParmValue( "-targetdir" ) ) ) + { + Error( "Couldn't create path %s\n", CommandLine()->ParmValue( "-targetdir" ) ); + } + } + + // Must add 'bin' to the path.... + char* pPath = getenv("PATH"); + + // Use the .EXE name to determine the root directory + char moduleName[ MAX_PATH ]; + char szBuffer[ 4096 ]; + if ( !GetModuleFileName( hInstance, moduleName, MAX_PATH ) ) + { + MessageBox( 0, "Failed calling GetModuleFileName", "Launcher Error", MB_OK ); + return 0; + } + + // Get the root directory the .exe is in + char* pRootDir = GetBaseDir( moduleName ); + +#ifdef DBGFLAG_ASSERT + int len = +#endif + + Q_snprintf( szBuffer, sizeof( szBuffer ), "PATH=%s;%s", pRootDir, pPath ); + Assert( len < 4096 ); + _putenv( szBuffer ); + + MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f ); + + if (!Init( pCommands ) ) + return false; + +/* + bool done = false; + while( !done ) + { + done = Update(); + } + */ + RenderFrame(); + Shutdown(); + + return 0; +} + |