//========= 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; }