mirror of
https://github.com/izzy2lost/vba10.git
synced 2026-03-26 18:15:30 -07:00
166 lines
4.8 KiB
C++
166 lines
4.8 KiB
C++
|
|
|
|
#include "pch.h"
|
|
#include "VBA10Main.h"
|
|
#include "Common\DirectXHelper.h"
|
|
#include "EmulatorSettings.h"
|
|
|
|
using namespace VBA10;
|
|
using namespace Windows::Foundation;
|
|
using namespace Windows::System::Threading;
|
|
using namespace Concurrency;
|
|
|
|
// Loads and initializes application assets when the application is loaded.
|
|
VBA10Main::VBA10Main(const std::shared_ptr<DX::DeviceResources>& deviceResources) :
|
|
m_deviceResources(deviceResources)
|
|
{
|
|
// Register to be notified if the Device is lost or recreated
|
|
m_deviceResources->RegisterDeviceNotify(this);
|
|
|
|
// TODO: Replace this with your app's content initialization.
|
|
try
|
|
{
|
|
this->emulator = new EmulatorGame(false);
|
|
this->emulator->Initialize();
|
|
|
|
renderer = std::unique_ptr<EmulatorRenderer>(new EmulatorRenderer(deviceResources));
|
|
m_fpsTextRenderer = std::unique_ptr<SampleFpsTextRenderer>(new SampleFpsTextRenderer(m_deviceResources));
|
|
}
|
|
catch (std::exception &e)
|
|
{
|
|
#if _DEBUG
|
|
string s(e.what());
|
|
OutputDebugStringA(s.c_str());
|
|
#endif
|
|
}
|
|
|
|
|
|
// TODO: Change the timer settings if you want something other than the default variable timestep mode.
|
|
// e.g. for 60 FPS fixed timestep update logic, call:
|
|
/*
|
|
m_timer.SetFixedTimeStep(true);
|
|
m_timer.SetTargetElapsedSeconds(1.0 / 60);
|
|
*/
|
|
}
|
|
|
|
VBA10Main::~VBA10Main()
|
|
{
|
|
// Deregister device notification
|
|
m_deviceResources->RegisterDeviceNotify(nullptr);
|
|
}
|
|
|
|
// Updates application state when the window size changes (e.g. device orientation change)
|
|
void VBA10Main::CreateWindowSizeDependentResources()
|
|
{
|
|
// TODO: Replace this with the size-dependent initialization of your app's content.
|
|
renderer->CreateWindowSizeDependentResources();
|
|
renderer->CreateTransformMatrix();
|
|
}
|
|
|
|
//void VBA10Main::StartRenderLoop()
|
|
//{
|
|
// // If the animation render loop is already running then do not start another thread.
|
|
// if (m_renderLoopWorker != nullptr && m_renderLoopWorker->Status == AsyncStatus::Started)
|
|
// {
|
|
// return;
|
|
// }
|
|
//
|
|
// // Create a task that will be run on a background thread.
|
|
// auto workItemHandler = ref new WorkItemHandler([this](IAsyncAction ^ action)
|
|
// {
|
|
// // Calculate the updated frame and render once per vertical blanking interval.
|
|
// while (action->Status == AsyncStatus::Started)
|
|
// {
|
|
// critical_section::scoped_lock lock(m_criticalSection);
|
|
// Update();
|
|
// if (Render())
|
|
// {
|
|
// m_deviceResources->Present();
|
|
// }
|
|
// }
|
|
// });
|
|
//
|
|
// // Run task on a dedicated high priority background thread.
|
|
// m_renderLoopWorker = ThreadPool::RunAsync(workItemHandler, WorkItemPriority::High, WorkItemOptions::TimeSliced);
|
|
//}
|
|
//
|
|
//void VBA10Main::StopRenderLoop()
|
|
//{
|
|
// if (m_renderLoopWorker)
|
|
// m_renderLoopWorker->Cancel();
|
|
//}
|
|
|
|
// Updates the application state once per frame.
|
|
void VBA10Main::Update()
|
|
{
|
|
//process input from user
|
|
//ProcessInput();
|
|
|
|
// Update scene objects.
|
|
m_timer.Tick([&]()
|
|
{
|
|
// TODO: Replace this with your app's content update functions.
|
|
renderer->Update(m_timer);
|
|
m_fpsTextRenderer->Update(m_timer);
|
|
});
|
|
|
|
//renderer->Update(m_timer);
|
|
}
|
|
|
|
|
|
|
|
// Renders the current frame according to the current application state.
|
|
// Returns true if the frame was rendered and is ready to be displayed.
|
|
bool VBA10Main::Render()
|
|
{
|
|
// Don't try to render anything before the first Update.
|
|
if (m_timer.GetFrameCount() == 0)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
auto context = m_deviceResources->GetD3DDeviceContext();
|
|
|
|
// Reset the viewport to target the whole screen.
|
|
auto viewport = m_deviceResources->GetScreenViewport();
|
|
context->RSSetViewports(1, &viewport);
|
|
|
|
// Reset render targets to the screen.
|
|
ID3D11RenderTargetView *const targets[1] = { m_deviceResources->GetBackBufferRenderTargetView() };
|
|
context->OMSetRenderTargets(1, targets, m_deviceResources->GetDepthStencilView());
|
|
|
|
// Clear the back buffer and depth stencil view.
|
|
context->ClearRenderTargetView(m_deviceResources->GetBackBufferRenderTargetView(), DirectX::Colors::CornflowerBlue);
|
|
context->ClearDepthStencilView(m_deviceResources->GetDepthStencilView(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
|
|
|
|
// Render the scene objects.
|
|
// TODO: Replace this with your app's content rendering functions.
|
|
renderer->Render();
|
|
if (ShowingFPS())
|
|
m_fpsTextRenderer->Render();
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
void VBA10Main::Present()
|
|
{
|
|
m_deviceResources->Present();
|
|
}
|
|
|
|
// Notifies renderers that device resources need to be released.
|
|
void VBA10Main::OnDeviceLost()
|
|
{
|
|
renderer->ReleaseDeviceDependentResources();
|
|
m_fpsTextRenderer->ReleaseDeviceDependentResources();
|
|
}
|
|
|
|
// Notifies renderers that device resources may now be recreated.
|
|
void VBA10Main::OnDeviceRestored()
|
|
{
|
|
renderer->CreateDeviceDependentResources();
|
|
m_fpsTextRenderer->CreateDeviceDependentResources();
|
|
CreateWindowSizeDependentResources();
|
|
}
|
|
|