From 3bf9df6b2785fa6d951086978a3e66f49427166a Mon Sep 17 00:00:00 2001 From: FluorescentCIAAfricanAmerican <0934gj3049fk@protonmail.com> Date: Wed, 22 Apr 2020 12:56:21 -0400 Subject: 1 --- utils/xbox/Test360/TriangleASM.cpp | 981 +++++++++++++++++++++++++++++++++++++ 1 file changed, 981 insertions(+) create mode 100644 utils/xbox/Test360/TriangleASM.cpp (limited to 'utils/xbox/Test360/TriangleASM.cpp') diff --git a/utils/xbox/Test360/TriangleASM.cpp b/utils/xbox/Test360/TriangleASM.cpp new file mode 100644 index 0000000..7610661 --- /dev/null +++ b/utils/xbox/Test360/TriangleASM.cpp @@ -0,0 +1,981 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +//-------------------------------------------------------------------------------------- +// TriangleASM.cpp +// +// Hijacked from samples, assimilated into valve app. +//-------------------------------------------------------------------------------------- + +#include "tier0\platform.h" +#if !defined( _X360 ) +#include +#endif +#include "appframework\iappsystemgroup.h" +#include "appframework\appframework.h" +#include "tier0\dbg.h" +#include "tier1\interface.h" +#include "filesystem.h" +#include "vstdlib\cvar.h" +#include "filesystem_init.h" +#include "tier1/utlbuffer.h" +#include "icommandline.h" +#include "datacache\idatacache.h" +#include "datacache\imdlcache.h" +#include "studio.h" +#include "utlbuffer.h" +#include "tier2\utlstreambuffer.h" +#include "tier2\tier2.h" +#include "tier3\tier3.h" +#include "mathlib/mathlib.h" +#include "inputsystem\iinputsystem.h" +#include "vphysics_interface.h" +#include "istudiorender.h" +#include "studio.h" +#include "tier1\KeyValues.h" +#include "vgui\IVGui.h" +#include "vguimatsurface\imatsystemsurface.h" +#include "matsys_controls\matsyscontrols.h" +#include "vgui\ILocalize.h" +#include "vgui_controls\panel.h" +#include "vgui_controls\label.h" +#if defined( _X360 ) +#include "xbox\xbox_console.h" +#include "xbox\xbox_win32stubs.h" +#endif +#include "materialsystem\imaterialsystem.h" +#include "materialsystem\imesh.h" +#include "materialsystem\materialsystem_config.h" +#include "materialsystem\MaterialSystemUtil.h" +#include "materialsystem\ishaderapi.h" +#if !defined( _X360 ) +#include "xbox\xboxstubs.h" +#endif +#include "bone_setup.h" +#include "tier0\memdbgon.h" + +bool g_bActive = true; + +extern SpewOutputFunc_t g_DefaultSpewFunc; + +// These must be turned on in order.... +#define USE_FILESYSTEM +#define USE_MATERIALSYSTEM +#define USE_VPHYSICS + +// Note: VPHYSICS is just used via the datacache to load a model's physics collision mesh + +// These can be turned on in any order +#define USE_INPUTSYSTEM +#define USE_VGUI +#define USE_STUDIORENDER + +#pragma warning(disable:4189) // local variable is initialized but not referenced + +//----------------------------------------------------------------------------- +// The application object +//----------------------------------------------------------------------------- +class CTest360App : public CDefaultAppSystemGroup +{ +public: + virtual bool Create(); + virtual bool PreInit(); + virtual int Main(); + virtual void Destroy(); + +private: + const char *GetAppName() { return "TEST360"; } + void RenderScene(); + bool CreateMainWindow( int width, int height, bool fullscreen ); + +#if defined( USE_MATERIALSYSTEM ) + bool SetupMaterialSystem(); +#endif + +#if defined( USE_STUDIORENDER ) + bool SetupStudioRender(); + bool LoadModel( const char *pModelName ); + matrix3x4_t* SetUpBones( studiohdr_t *pStudioHdr, const matrix3x4_t &modelMatrix ); +#endif + +#if defined( USE_VGUI ) + int InitializeVGUI( void ); + void ShutdownVGUI( void ); +#endif + + IPhysicsCollision *m_pCollision; + IMaterialSystem *m_pMaterialSystem; + IFileSystem *m_pFileSystem; + int m_nWidth; + int m_nHeight; + float m_fAspect; + float m_NearClip; + float m_FarClip; + float m_fov; + HWND m_hWnd; + studiohdr_t *m_pStudioHdr; + studiohwdata_t *m_pStudioHWData; + int m_nLod; + float m_flTime; + float m_flPlaybackRate; + vgui::Panel *m_pMainPanel; +}; + + +static float g_yaw; +static float g_horizontalPan; +static float g_verticalPan; +static float g_zoom; +static int g_sequence; +static bool g_bWireframe; + +DEFINE_WINDOWED_STEAM_APPLICATION_OBJECT( CTest360App ); + +#if defined( USE_MATERIALSYSTEM ) +static void MaterialSystem_Warning( const char *fmt, ... ) +{ + va_list argptr; + char msg[2048]; + + va_start( argptr, fmt ); + Q_vsnprintf( msg, sizeof ( msg ), fmt, argptr ); + va_end( argptr ); + + OutputDebugString( msg ); +} +#endif + +#if defined( USE_MATERIALSYSTEM ) +static void MaterialSystem_Warning( char *fmt, ... ) +{ + va_list argptr; + char msg[2048]; + + va_start( argptr, fmt ); + Q_vsnprintf( msg, sizeof( msg ), fmt, argptr ); + va_end( argptr ); + + OutputDebugString( msg ); +} +#endif + +virtualmodel_t *studiohdr_t::GetVirtualModel( void ) const +{ + if ( numincludemodels == 0 ) + return NULL; + return g_pMDLCache->GetVirtualModelFast( this, (MDLHandle_t)virtualModel ); +} +byte *studiohdr_t::GetAnimBlock( int i ) const +{ + return g_pMDLCache->GetAnimBlock( (MDLHandle_t)virtualModel, i ); +} +int studiohdr_t::GetAutoplayList( unsigned short **pOut ) const +{ + return g_pMDLCache->GetAutoplayList( (MDLHandle_t)virtualModel, pOut ); +} +const studiohdr_t *virtualgroup_t::GetStudioHdr( void ) const +{ + return g_pMDLCache->GetStudioHdr( (MDLHandle_t)cache ); +} + +#if defined( USE_STUDIORENDER ) +matrix3x4_t* CTest360App::SetUpBones( studiohdr_t *pStudioHdr, const matrix3x4_t &shapeToWorld ) +{ + // Default to middle of the pose parameter range + float pPoseParameter[MAXSTUDIOPOSEPARAM]; + for ( int i = 0; i < MAXSTUDIOPOSEPARAM; ++i ) + { + pPoseParameter[i] = 0.5f; + } + + CStudioHdr studioHdr( pStudioHdr, g_pMDLCache ); + + int nFrameCount = Studio_MaxFrame( &studioHdr, g_sequence, pPoseParameter ); + if ( nFrameCount == 0 ) + { + nFrameCount = 1; + } + float flCycle = ( m_flTime * m_flPlaybackRate ) / nFrameCount; + + // FIXME: We're always wrapping; may want to determing if we should clamp + flCycle -= (int)(flCycle); + + int boneMask = BONE_USED_BY_VERTEX_AT_LOD( m_nLod ); + + Vector pos[MAXSTUDIOBONES]; + Quaternion q[MAXSTUDIOBONES]; + + IBoneSetup boneSetup( &studioHdr, boneMask, pPoseParameter ); + boneSetup.InitPose( pos, q ); + boneSetup.AccumulatePose( pos, q, g_sequence, flCycle, 1.0f, m_flTime, NULL ); + + // FIXME: Try enabling this? +// CalcAutoplaySequences( pStudioHdr, NULL, pos, q, pPoseParameter, BoneMask( ), flTime ); + + // Root transform + matrix3x4_t rootToWorld, temp; + + MatrixCopy( shapeToWorld, rootToWorld ); + + matrix3x4_t *pBoneToWorld = g_pStudioRender->LockBoneMatrices( studioHdr.numbones() ); + for ( int i = 0; i < studioHdr.numbones(); i++ ) + { + // If it's not being used, fill with NAN for errors + if ( !(studioHdr.pBone( i )->flags & boneMask) ) + { + int j, k; + for (j = 0; j < 3; j++) + { + for (k = 0; k < 4; k++) + { + pBoneToWorld[i][j][k] = VEC_T_NAN; + } + } + continue; + } + + matrix3x4_t boneMatrix; + QuaternionMatrix( q[i], boneMatrix ); + MatrixSetColumn( pos[i], 3, boneMatrix ); + + if (studioHdr.pBone(i)->parent == -1) + { + ConcatTransforms (rootToWorld, boneMatrix, pBoneToWorld[i]); + } + else + { + ConcatTransforms (pBoneToWorld[ studioHdr.pBone(i)->parent ], boneMatrix, pBoneToWorld[i] ); + } + } + return pBoneToWorld; +} +#endif + +//-------------------------------------------------------------------------------------- +// LoadModel +// +//-------------------------------------------------------------------------------------- +#if defined( USE_STUDIORENDER ) +bool CTest360App::LoadModel( const char* pModelName ) +{ + MDLHandle_t hMdl = g_pMDLCache->FindMDL( pModelName ); + + m_pStudioHdr = g_pMDLCache->GetStudioHdr( hMdl ); + + g_pMDLCache->GetVertexData( hMdl ); + g_pMDLCache->FinishPendingLoads(); + + g_pMDLCache->GetHardwareData( hMdl ); + g_pMDLCache->FinishPendingLoads(); + + m_pStudioHWData = g_pMDLCache->GetHardwareData( hMdl ); + + g_sequence = 0; + m_nLod = 0; + m_flPlaybackRate = 30.0; + g_yaw = 0; + g_zoom = -100; + g_horizontalPan = 0; + g_verticalPan = -30; + + return true; +} +#endif + +//-------------------------------------------------------------------------------------- +// SetupMaterialSystem +// +//-------------------------------------------------------------------------------------- +#if defined( USE_MATERIALSYSTEM ) +bool CTest360App::SetupMaterialSystem() +{ + RECT rect; + + MaterialSystem_Config_t config; + config.SetFlag( MATSYS_VIDCFG_FLAGS_WINDOWED, IsPC() ? true : false ); + config.SetFlag( MATSYS_VIDCFG_FLAGS_NO_WAIT_FOR_VSYNC, 0 ); + + config.m_VideoMode.m_Width = 0; + config.m_VideoMode.m_Height = 0; + config.m_VideoMode.m_Format = IMAGE_FORMAT_BGRX8888; + config.m_VideoMode.m_RefreshRate = 0; + config.dxSupportLevel = IsX360() ? 98 : 0; + + bool modeSet = m_pMaterialSystem->SetMode( m_hWnd, config ); + if ( !modeSet ) + { + Error( "Failed to set mode\n" ); + return false; + } + + m_pMaterialSystem->OverrideConfig( config, false ); + + GetClientRect( m_hWnd, &rect ); + m_nWidth = rect.right; + m_nHeight = rect.bottom; + m_fAspect = (float)m_nWidth/(float)m_nHeight; + + m_NearClip = 8.0f; + m_FarClip = 28400.0f; + m_fov = 90; + + return true; +} +#endif + +//-------------------------------------------------------------------------------------- +// SetupStudioRender +// +//-------------------------------------------------------------------------------------- +#if defined( USE_STUDIORENDER ) +bool CTest360App::SetupStudioRender() +{ + StudioRenderConfig_t config; + memset( &config, 0, sizeof(config) ); + + config.bEyeMove = false; + config.bTeeth = true; + config.bEyes = true; + config.bFlex = true; + + config.fEyeShiftX = 0.0f; + config.fEyeShiftY = 0.0f; + config.fEyeShiftZ = 0.0f; + config.fEyeSize = 0.0f; + + config.bNoHardware = false; + config.bNoSoftware = false; + + config.bSoftwareSkin = false; + config.bSoftwareLighting = false; + + config.drawEntities = true; + config.bWireframe = false; + config.SetNormals( false ); + config.SetTangentFrame( false ); + config.skin = 0; + + config.fullbright = 0; + config.pConDPrintf = MaterialSystem_Warning; + config.pConPrintf = MaterialSystem_Warning; + + config.bShowEnvCubemapOnly = false; + + g_pStudioRender->UpdateConfig( config ); + + return true; +} +#endif + +//-------------------------------------------------------------------------------------- +// Render a model using the MaterialSystem +//-------------------------------------------------------------------------------------- +void CTest360App::RenderScene() +{ + m_flTime = Plat_FloatTime(); + +#if defined( USE_MATERIALSYSTEM ) + CMatRenderContextPtr pRenderContext( m_pMaterialSystem ); + m_pMaterialSystem->BeginFrame(); +#endif + +#if defined( USE_STUDIORENDER ) + g_pStudioRender->BeginFrame(); +#endif + +#if defined( USE_MATERIALSYSTEM ) + pRenderContext->ClearColor3ub( 0, 0, 0 ); + pRenderContext->ClearBuffers( true, true ); +#endif + +#if defined( USE_STUDIORENDER ) + pRenderContext->Viewport( 0, 0, m_nWidth, m_nHeight ); + pRenderContext->MatrixMode( MATERIAL_PROJECTION ); + pRenderContext->LoadIdentity(); + pRenderContext->PerspectiveX( m_fov, m_fAspect, m_NearClip, m_FarClip ); + + pRenderContext->MatrixMode( MATERIAL_VIEW ); + pRenderContext->LoadIdentity(); + pRenderContext->Translate( g_horizontalPan, g_verticalPan, g_zoom ); + + pRenderContext->MatrixMode( MATERIAL_MODEL ); + pRenderContext->LoadIdentity(); + + g_pStudioRender->SetLocalLights( 0, NULL ); + pRenderContext->SetAmbientLight( 1.0, 1.0, 1.0 ); + + QAngle angles; + angles[YAW] = 0; + angles[PITCH] = -90 + g_yaw; + angles[ROLL] = -90; + + matrix3x4_t cameraMatrix; + AngleMatrix( angles, cameraMatrix ); + + static Vector white[6] = + { + Vector( 1.0, 1.0, 1.0 ), + Vector( 1.0, 1.0, 1.0 ), + Vector( 1.0, 1.0, 1.0 ), + Vector( 1.0, 1.0, 1.0 ), + Vector( 1.0, 1.0, 1.0 ), + Vector( 1.0, 1.0, 1.0 ), + }; + g_pStudioRender->SetAmbientLightColors( white ); + + matrix3x4_t *pBoneToWorld = SetUpBones( m_pStudioHdr, cameraMatrix ); + + Vector modelOrigin( 0, 0, 0 ); + + pRenderContext->MatrixMode( MATERIAL_MODEL ); + pRenderContext->PushMatrix(); + + DrawModelInfo_t modelInfo; + memset( &modelInfo, 0, sizeof( modelInfo ) ); + modelInfo.m_pStudioHdr = m_pStudioHdr; + modelInfo.m_pHardwareData = m_pStudioHWData; + modelInfo.m_Decals = STUDIORENDER_DECAL_INVALID; + modelInfo.m_Skin = 0; + modelInfo.m_Body = 0; + modelInfo.m_HitboxSet = 0; + modelInfo.m_pClientEntity = NULL; + modelInfo.m_Lod = 0; + modelInfo.m_ppColorMeshes = NULL; + + int drawFlags = 0; + if ( g_bWireframe ) + { + drawFlags |= STUDIORENDER_DRAW_WIREFRAME; + } + + g_pStudioRender->DrawModel( NULL, modelInfo, pBoneToWorld, modelOrigin, drawFlags ); + + pRenderContext->MatrixMode( MATERIAL_MODEL ); + pRenderContext->PopMatrix(); +#endif + +#if defined( USE_MATERIALSYSTEM ) + pRenderContext->Flush( true ); +#endif + +#if defined( USE_VGUI ) + vgui::ivgui()->RunFrame(); + vgui::surface()->PaintTraverseEx( vgui::surface()->GetEmbeddedPanel() ); +#endif + +#if defined( USE_STUDIORENDER ) + g_pStudioRender->EndFrame(); +#endif + +#if defined( USE_MATERIALSYSTEM ) + m_pMaterialSystem->EndFrame(); + m_pMaterialSystem->SwapBuffers(); +#endif +} + +//-------------------------------------------------------------------------------------- +// Window Proc +//-------------------------------------------------------------------------------------- +LRESULT CALLBACK WndProc( HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) +{ + switch ( iMsg ) + { + case WM_CLOSE: + g_bActive = false; + break; + + case WM_DESTROY: + PostQuitMessage( 0 ); + return 0L; + + case WM_XCONTROLLER_INSERTED: + Msg( "Port %d: Gamepad Activated\n", wParam ); + break; + + case WM_XCONTROLLER_UNPLUGGED: + Msg( "Port %d: Gamepad Unplugged\n", wParam ); + break; + + case WM_XCONTROLLER_KEY: + // wParam == key + // HIWORD( lParam ) = port + // LOWWORD( lParam ) = sample + Msg( "Port %d: Button %d %s\n", HIWORD( lParam ), wParam, LOWORD( lParam ) ? "Pressed" : "Released" ); + switch ( wParam ) + { + case XK_BUTTON_RTRIGGER: + if ( LOWORD( lParam ) ) + { + g_zoom++; + } + break; + + case XK_BUTTON_LTRIGGER: + if ( LOWORD( lParam ) ) + { + g_zoom--; + } + break; + + case XK_BUTTON_DOWN: + if ( LOWORD( lParam ) ) + { + g_verticalPan += 2; + } + break; + + case XK_BUTTON_UP: + if ( LOWORD( lParam ) ) + { + g_verticalPan -= 2; + } + break; + + case XK_BUTTON_LEFT: + if ( LOWORD( lParam ) ) + { + g_horizontalPan += 2; + } + break; + + case XK_BUTTON_RIGHT: + if ( LOWORD( lParam ) ) + { + g_horizontalPan -= 2; + } + break; + + case XK_STICK2_LEFT: + if ( LOWORD( lParam ) ) + { + g_yaw += 5; + } + break; + + case XK_STICK2_RIGHT: + if ( LOWORD( lParam ) ) + { + g_yaw -= 5; + } + break; + + case XK_BUTTON_A: + if ( LOWORD( lParam ) ) + { + g_sequence++; + } + break; + + case XK_BUTTON_B: + if ( LOWORD( lParam ) ) + { + g_sequence--; + if ( g_sequence < 0 ) + g_sequence = 0; + } + break; + + case XK_BUTTON_Y: + if ( LOWORD( lParam ) ) + { + g_bWireframe ^= 1; + } + break; + } + break; + + case WM_KEYDOWN: + switch ( wParam ) + { + case 'O': + g_zoom++; + break; + + case 'P': + g_zoom--; + break; + + case 'W': + g_verticalPan += 2; + break; + + case 'S': + g_verticalPan -= 2; + break; + + case 'A': + g_horizontalPan += 2; + break; + + case 'D': + g_horizontalPan -= 2; + break; + + case 'N': + g_sequence--; + if ( g_sequence < 0 ) + g_sequence = 0; + break; + + case 'M': + g_sequence++; + break; + } + break; + } + + return DefWindowProc( hWnd, iMsg, wParam, lParam ); +} + +//-------------------------------------------------------------------------------------- +// CreateMainWindow +// +//-------------------------------------------------------------------------------------- +bool CTest360App::CreateMainWindow( int width, int height, bool fullscreen ) +{ + HWND hwnd; + WNDCLASSEX wndclass; + DWORD dwStyle, dwExStyle; + int x, y, sx, sy; + + if ( ( hwnd = FindWindow( GetAppName(), GetAppName() ) ) != NULL ) + { + SetForegroundWindow( hwnd ); + return true; + } + + wndclass.cbSize = sizeof (wndclass); + wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; + wndclass.lpfnWndProc = ::WndProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = (HINSTANCE)GetAppInstance(); + wndclass.hIcon = 0; + wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); + wndclass.hbrBackground = (HBRUSH)COLOR_GRAYTEXT; + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = GetAppName(); + wndclass.hIconSm = 0; + + if ( !RegisterClassEx( &wndclass ) ) + { + Error( "Window class registration failed\n" ); + return false; + } + + if ( fullscreen ) + { + dwExStyle = WS_EX_TOPMOST; + dwStyle = WS_POPUP | WS_VISIBLE; + } + else + { + dwExStyle = 0; + dwStyle = WS_CAPTION | WS_SYSMENU; + } + + x = y = 0; + sx = width; + sy = height; + + hwnd = CreateWindowEx( + dwExStyle, + GetAppName(), // window class name + GetAppName(), // window caption + dwStyle | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, // window style + x, // initial x position + y, // initial y position + sx, // initial x size + sy, // initial y size + NULL, // parent window handle + NULL, // window menu handle + (HINSTANCE)GetAppInstance(),// program instance handle + NULL); // creation parameter + + if ( hwnd == NULL ) + { + ChangeDisplaySettings( 0, 0 ); + Error( "Window creation failed\n" ); + return false; + } + + m_hWnd = hwnd; + + return true; +} + +//----------------------------------------------------------------------------- +// Create +//----------------------------------------------------------------------------- +bool CTest360App::Create() +{ + AppSystemInfo_t appSystems[] = + { +#if defined( USE_STUDIORENDER ) + { "datacache.dll", DATACACHE_INTERFACE_VERSION }, + { "datacache.dll", MDLCACHE_INTERFACE_VERSION }, +#endif +#if defined( USE_MATERIALSYSTEM ) + { "materialsystem.dll", MATERIAL_SYSTEM_INTERFACE_VERSION }, +#endif +#if defined( USE_STUDIORENDER ) + { "studiorender.dll", STUDIO_RENDER_INTERFACE_VERSION }, +#endif +#if defined( USE_INPUTSYSTEM ) + { "inputsystem.dll", INPUTSYSTEM_INTERFACE_VERSION }, +#endif +#if defined( USE_VGUI ) + { "vgui2.dll", VGUI_IVGUI_INTERFACE_VERSION }, + { "vguimatsurface.dll", VGUI_SURFACE_INTERFACE_VERSION }, +#endif +#if defined( USE_STUDIORENDER ) + { "vphysics.dll", VPHYSICS_INTERFACE_VERSION }, +#endif + { "", "" } + }; + + MathLib_Init( 2.2f, 2.2f, 0.0f, 2.0f ); + + SpewOutputFunc( g_DefaultSpewFunc ); + +#if defined( USE_FILESYSTEM ) + // Add in the cvar factory + AppModule_t cvarModule = LoadModule( VStdLib_GetICVarFactory() ); + AddSystem( cvarModule, VENGINE_CVAR_INTERFACE_VERSION ); +#endif + +#if defined( _X360 ) + // vxconsole - true will block (legacy behavior) + XBX_InitConsoleMonitor( false ); +#endif + + if ( !AddSystems( appSystems ) ) + return false; + +#if defined( USE_FILESYSTEM ) + m_pFileSystem = (IFileSystem*)FindSystem( FILESYSTEM_INTERFACE_VERSION ); + if ( !m_pFileSystem ) + { + Error( "Failed to find %s\n", FILESYSTEM_INTERFACE_VERSION ); + return false; + } +#endif + +#if defined( USE_VPHYSICS ) + m_pCollision = (IPhysicsCollision*)FindSystem( VPHYSICS_COLLISION_INTERFACE_VERSION ); + if ( !m_pCollision ) + { + Error( "Failed to find %s\n", VPHYSICS_COLLISION_INTERFACE_VERSION ); + return false; + } +#endif + +#if defined( USE_MATERIALSYSTEM ) + m_pMaterialSystem = (IMaterialSystem*)FindSystem( MATERIAL_SYSTEM_INTERFACE_VERSION ); + if ( !m_pMaterialSystem ) + { + Error( "Failed to find %s\n", MATERIAL_SYSTEM_INTERFACE_VERSION ); + return false; + } +#if defined( _X360 ) + m_pFileSystem->LoadModule( "shaderapidx9.dll" ); +#endif + m_pMaterialSystem->SetShaderAPI( "shaderapidx9.dll" ); +#endif + + return true; +} + +//----------------------------------------------------------------------------- +// PreInit +//----------------------------------------------------------------------------- +bool CTest360App::PreInit() +{ +#if defined( USE_FILESYSTEM ) + // Add paths... + if ( !SetupSearchPaths( NULL, false, true ) ) + { + Error( "Failed to setup search paths\n" ); + return false; + } +#endif + + CreateInterfaceFn factory = GetFactory(); + ConnectTier1Libraries( &factory, 1 ); + ConnectTier2Libraries( &factory, 1 ); + ConnectTier3Libraries( &factory, 1 ); + + // Create the main program window and our viewport + int w = 640; + int h = 480; + if ( IsX360() ) + { + w = GetSystemMetrics( SM_CXSCREEN ); + h = GetSystemMetrics( SM_CYSCREEN ); + } + if ( !CreateMainWindow( w, h, false ) ) + { + ChangeDisplaySettings( 0, 0 ); + Error( "Unable to create main window\n" ); + return false; + } + + ShowWindow( m_hWnd, SW_SHOWNORMAL ); + UpdateWindow( m_hWnd ); + SetForegroundWindow( m_hWnd ); + SetFocus( m_hWnd ); + + return true; +} + +//----------------------------------------------------------------------------- +// Destroy +//----------------------------------------------------------------------------- +void CTest360App::Destroy() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: Setup all our VGUI info +//----------------------------------------------------------------------------- +#if defined( USE_VGUI ) + +static CreateInterfaceFn s_pFactoryList[3]; + +void *VGuiFactory( const char *pName, int *pReturnCode ) +{ + for ( int i = 0; i < ARRAYSIZE( s_pFactoryList ); ++i ) + { + void *pInterface = s_pFactoryList[i]( pName, pReturnCode ); + if ( pInterface ) + return pInterface; + } + return NULL; +} + +int CTest360App::InitializeVGUI( void ) +{ + s_pFactoryList[0] = Sys_GetFactory( m_pFileSystem->LoadModule( "filesystem_stdio" ) ); + s_pFactoryList[1] = Sys_GetFactory( m_pFileSystem->LoadModule( "vguimatsurface" ) ); + s_pFactoryList[2] = Sys_GetFactory( m_pFileSystem->LoadModule( "vgui2" ) ); + int factorycount = ARRAYSIZE( s_pFactoryList ); + + if ( !vgui::VGui_InitInterfacesList( "test360", s_pFactoryList, factorycount ) ) + return 3; + + vgui::ivgui()->Connect( VGuiFactory ); + vgui::ivgui()->Init(); + + vgui::ivgui()->SetSleep(false); + + // Init the surface + vgui::Panel *pPanel = new vgui::Panel( NULL, "TopPanel" ); + pPanel->SetBounds( 0, 0, m_nWidth, m_nHeight ); + pPanel->SetPaintBackgroundEnabled( false ); + pPanel->SetVisible(true); + + vgui::surface()->SetEmbeddedPanel(pPanel->GetVPanel()); + + // load the scheme + vgui::scheme()->LoadSchemeFromFile( "resource/clientscheme.res", NULL ); + + // localization + //vgui::localize()->AddFile( "resource/vgui_%language%.txt" ); + + // Start vgui + vgui::ivgui()->Start(); + + // add a panel + m_pMainPanel = new vgui::Panel( pPanel, "MainPanel" ); + SETUP_PANEL( m_pMainPanel ); + m_pMainPanel->SetBounds( 30, 30, 200, 100 ); + m_pMainPanel->SetBgColor( Color(255,255,0,255) ); + + // add text + vgui::Label *pLabel = new vgui::Label( m_pMainPanel, "Text", L"" ); + SETUP_PANEL( pLabel ); + + vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" ); +// vgui::HFont hFont = vgui::scheme()->GetIScheme(scheme)->GetFont( "BudgetLabel" ); +// pLabel->SetFont( hFont ); + pLabel->SetText( L"This is text" ); + + pLabel->SetFgColor( Color(0,0,0,255) ); + + return 0; +} +#endif + +//----------------------------------------------------------------------------- +// Purpose: Stop VGUI +//----------------------------------------------------------------------------- +#if defined( USE_VGUI ) +void CTest360App::ShutdownVGUI( void ) +{ + delete m_pMainPanel; + + // Shutdown + vgui::surface()->Shutdown(); +} +#endif + +//----------------------------------------------------------------------------- +// Main +//----------------------------------------------------------------------------- +int CTest360App::Main() +{ +#if defined( USE_MATERIALSYSTEM ) + if ( !SetupMaterialSystem() ) + { + return 0; + } +#endif + +#if defined( USE_STUDIORENDER ) + if ( !SetupStudioRender() ) + { + return 0; + } +#endif + +#if defined( USE_VGUI ) + int ret = InitializeVGUI(); + if ( ret != 0 ) + return ret; +#endif + + const char *pArgVal; + const char* pModelName = "models\\alyx.mdl"; + if ( CommandLine()->CheckParm( "-model", &pArgVal ) ) + { + pModelName = pArgVal; + } + +#if defined( USE_STUDIORENDER ) + // the easiest model to load - no anims + //const char* pModelName = "models\\items\\item_item_crate.mdl"; + if ( !LoadModel( pModelName ) ) + { + return 0; + } +#endif + + MSG msg; + while ( g_bActive == TRUE ) + { + while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) + { + TranslateMessage( &msg ); + DispatchMessage( &msg ); + } + +#if defined( USE_INPUTSYSTEM ) + g_pInputSystem->PollInputState(); +#endif + RenderScene(); + } + +#if defined( USE_VGUI ) + ShutdownVGUI(); +#endif + + return 0; +} -- cgit v1.2.3