#include "pch.h" #include "BasicTimer.h" #include "Direct3DApp1.h" using namespace Windows::ApplicationModel; using namespace Windows::ApplicationModel::Core; using namespace Windows::ApplicationModel::Activation; using namespace Windows::UI::Core; using namespace Windows::System; using namespace Windows::Foundation; using namespace Windows::Graphics::Display; using namespace concurrency; Direct3DApp1::Direct3DApp1() : m_windowClosed(false) , m_windowVisible(true) { } void Direct3DApp1::Initialize(CoreApplicationView ^ applicationView) { applicationView->Activated += ref new TypedEventHandler( this, &Direct3DApp1::OnActivated); CoreApplication::Suspending += ref new EventHandler( this, &Direct3DApp1::OnSuspending); CoreApplication::Resuming += ref new EventHandler(this, &Direct3DApp1::OnResuming); m_renderer = ref new CubeRenderer(); } void Direct3DApp1::SetWindow(CoreWindow ^ window) { window->SizeChanged += ref new TypedEventHandler( this, &Direct3DApp1::OnWindowSizeChanged); window->VisibilityChanged += ref new TypedEventHandler( this, &Direct3DApp1::OnVisibilityChanged); window->Closed += ref new TypedEventHandler( this, &Direct3DApp1::OnWindowClosed); #ifndef PHONE window->PointerCursor = ref new CoreCursor(CoreCursorType::Arrow, 0); #endif window->PointerPressed += ref new TypedEventHandler( this, &Direct3DApp1::OnPointerPressed); window->PointerMoved += ref new TypedEventHandler( this, &Direct3DApp1::OnPointerMoved); m_renderer->Initialize(CoreWindow::GetForCurrentThread()); } void Direct3DApp1::Load(Platform::String ^ entryPoint) { } void Direct3DApp1::Run() { BasicTimer ^ timer = ref new BasicTimer(); while (!m_windowClosed) { if (m_windowVisible) { timer->Update(); CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents( CoreProcessEventsOption::ProcessAllIfPresent); m_renderer->Update(timer->Total, timer->Delta); m_renderer->Render(); m_renderer ->Present(); // This call is synchronized to the display frame rate. } else { CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents( CoreProcessEventsOption::ProcessOneAndAllPending); } } } void Direct3DApp1::Uninitialize() { } void Direct3DApp1::OnWindowSizeChanged(CoreWindow ^ sender, WindowSizeChangedEventArgs ^ args) { m_renderer->UpdateForWindowSizeChange(); } void Direct3DApp1::OnVisibilityChanged(CoreWindow ^ sender, VisibilityChangedEventArgs ^ args) { m_windowVisible = args->Visible; } void Direct3DApp1::OnWindowClosed(CoreWindow ^ sender, CoreWindowEventArgs ^ args) { m_windowClosed = true; } void Direct3DApp1::OnPointerPressed(CoreWindow ^ sender, PointerEventArgs ^ args) { // Insert your code here. } void Direct3DApp1::OnPointerMoved(CoreWindow ^ sender, PointerEventArgs ^ args) { // Insert your code here. } void Direct3DApp1::OnActivated(CoreApplicationView ^ applicationView, IActivatedEventArgs ^ args) { CoreWindow::GetForCurrentThread()->Activate(); } void Direct3DApp1::OnSuspending(Platform::Object ^ sender, SuspendingEventArgs ^ args) { // Save app state asynchronously after requesting a deferral. Holding a // deferral // indicates that the application is busy performing suspending operations. // Be // aware that a deferral may not be held indefinitely. After about five // seconds, // the app will be forced to exit. SuspendingDeferral ^ deferral = args->SuspendingOperation->GetDeferral(); m_renderer->ReleaseResourcesForSuspending(); create_task([this, deferral]() { // Insert your code here. deferral->Complete(); }); } void Direct3DApp1::OnResuming(Platform::Object ^ sender, Platform::Object ^ args) { // Restore any data or state that was unloaded on suspend. By default, data // and state are persisted when resuming from suspend. Note that this event // does not occur if the app was previously terminated. m_renderer->CreateWindowSizeDependentResources(); } IFrameworkView ^ Direct3DApplicationSource::CreateView() { return ref new Direct3DApp1(); } [Platform::MTAThread] int main(Platform::Array ^) { auto direct3DApplicationSource = ref new Direct3DApplicationSource(); CoreApplication::Run(direct3DApplicationSource); return 0; }