text: //--------------------------------------------------------------------------------------
  // ArcadeStick.h
  //
  // Advanced Technology Group (ATG)
  // Copyright (C) Microsoft Corporation. All rights reserved.
  //--------------------------------------------------------------------------------------
  
  #pragma once
  
  #include "DeviceResources.h"
  #include "StepTimer.h"
  
  #include "AggregateNavigation.h"
  #include "TestController.h"
  
  // A basic sample implementation that creates a D3D11 device and
  // provides a render loop.
  class Sample
  {
  public:
  
      Sample() noexcept(false);
      ~Sample() = default;
  
      Sample(Sample&&) = default;
      Sample& operator= (Sample&&) = default;
  
      Sample(Sample const&) = delete;
      Sample& operator= (Sample const&) = delete;
  
      // Initialization and management
      void Initialize(IUnknown* window);
  
      // Basic game loop
      void Tick();
  
      // Messages
      void OnSuspending();
      void OnResuming();
  
  private:
  
      void Update(DX::StepTimer const& timer);
      void Render();
  
      void Clear();
  
      void CreateDeviceDependentResources();
      void CreateWindowSizeDependentResources();
  
      void OnControllerAdded(Windows::Xbox::Input::IController^ pIController);
      void OnControllerRemoved(Windows::Xbox::Input::IController^ pIController);
  
      void RenderControllerList();
      void RenderInformation();
      void RenderTestData();
  
      FLOAT RenderGlyph(const wchar_t* glyph, bool active, FLOAT x, FLOAT y);
  
      // Device resources.
      std::unique_ptr<DX::DeviceResources>        m_deviceResources;
  
      // Rendering loop timer.
      uint64_t                                    m_frame;
      DX::StepTimer                               m_timer;
  
      // Input devices.
      std::unique_ptr<DirectX::GamePad>           m_gamePad;
  
      DirectX::GamePad::ButtonStateTracker        m_gamePadButtons;
  
      // DirectXTK objects.
      std::unique_ptr<DirectX::GraphicsMemory>    m_graphicsMemory;
  
      std::unique_ptr<DirectX::SpriteBatch>               m_spriteBatch;
      std::unique_ptr<DirectX::SpriteFont>                m_font;
      std::unique_ptr<DirectX::SpriteFont>                m_ctrlFont;
  
      //
      // Full list of controllers
      //
      std::vector<TestController>  controllers_;
      std::mutex              controllerLock_;
  
      //
      // Aggregate navigation for test
      //
      AggregateNavigation      testNavigation_;
  };
  