#include "stdafx.h" #include "App_Windows.h" #include using namespace Template_UWP; using namespace concurrency; using namespace Windows::ApplicationModel; using namespace Windows::ApplicationModel::Core; using namespace Windows::ApplicationModel::Activation; using namespace Windows::UI::Core; using namespace Windows::UI::Input; using namespace Windows::System; using namespace Windows::Foundation; using namespace Windows::Graphics::Display; // The main function is only used to initialize our IFrameworkView class. [Platform::MTAThread] int main(Platform::Array^) { auto direct3DApplicationSource = ref new Direct3DApplicationSource(); CoreApplication::Run(direct3DApplicationSource); return 0; } IFrameworkView^ Direct3DApplicationSource::CreateView() { return ref new App(); } App::App() : m_windowClosed(false), m_windowVisible(true) { } // The first method called when the IFrameworkView is being created. void App::Initialize(CoreApplicationView^ applicationView) { // Register event handlers for app lifecycle. This example includes Activated, so that we // can make the CoreWindow active and start rendering on the window. applicationView->Activated += ref new TypedEventHandler(this, &App::OnActivated); CoreApplication::Suspending += ref new EventHandler(this, &App::OnSuspending); CoreApplication::Resuming += ref new EventHandler(this, &App::OnResuming); wiFont::SetFontPath(""); wiRenderer::SetShaderPath("shaders/"); } // Called when the CoreWindow object is created (or re-created). void App::SetWindow(CoreWindow^ window) { window->SizeChanged += ref new TypedEventHandler(this, &App::OnWindowSizeChanged); window->VisibilityChanged += ref new TypedEventHandler(this, &App::OnVisibilityChanged); window->Closed += ref new TypedEventHandler(this, &App::OnWindowClosed); DisplayInformation^ currentDisplayInformation = DisplayInformation::GetForCurrentView(); currentDisplayInformation->DpiChanged += ref new TypedEventHandler(this, &App::OnDpiChanged); currentDisplayInformation->OrientationChanged += ref new TypedEventHandler(this, &App::OnOrientationChanged); DisplayInformation::DisplayContentsInvalidated += ref new TypedEventHandler(this, &App::OnDisplayContentsInvalidated); window->KeyDown += ref new TypedEventHandler(this, &App::OnKeyDown); window->CharacterReceived += ref new TypedEventHandler(this, &App::OnCharacterReceived); editor.SetWindow(wiPlatform::window_type(window)); } // Initializes scene resources, or loads a previously saved app state. void App::Load(Platform::String^ entryPoint) { } // This method is called after the window becomes active. void App::Run() { while (!m_windowClosed) { if (m_windowVisible) { CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent); editor.Run(); } else { CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessOneAndAllPending); } } } // Required for IFrameworkView. // Terminate events do not cause Uninitialize to be called. It will be called if your IFrameworkView // class is torn down while the app is in the foreground. void App::Uninitialize() { } // Application lifecycle event handlers. void App::OnActivated(CoreApplicationView^ applicationView, IActivatedEventArgs^ args) { if (args->Kind == ActivationKind::Launch) { LaunchActivatedEventArgs^ launchargs = (LaunchActivatedEventArgs^)args; wiStartupArguments::Parse(launchargs->Arguments->Data()); } // Run() won't start until the CoreWindow is activated. CoreWindow::GetForCurrentThread()->Activate(); } void App::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(); create_task([this, deferral]() { // Insert your code here. deferral->Complete(); }); } void App::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. // Insert your code here. } // Window event handlers. void App::OnWindowSizeChanged(CoreWindow^ sender, WindowSizeChangedEventArgs^ args) { float dpiscale = wiPlatform::GetDPIScaling(); uint64 data = 0; data |= int(sender->Bounds.Width * dpiscale); data |= int(sender->Bounds.Height * dpiscale) << 16; wiEvent::FireEvent(SYSTEM_EVENT_CHANGE_RESOLUTION, data); } void App::OnVisibilityChanged(CoreWindow^ sender, VisibilityChangedEventArgs^ args) { m_windowVisible = args->Visible; } void App::OnWindowClosed(CoreWindow^ sender, CoreWindowEventArgs^ args) { m_windowClosed = true; } // DisplayInformation event handlers. void App::OnDpiChanged(DisplayInformation^ sender, Object^ args) { wiEvent::FireEvent(SYSTEM_EVENT_CHANGE_DPI, (int)sender->LogicalDpi); } void App::OnOrientationChanged(DisplayInformation^ sender, Object^ args) { } void App::OnDisplayContentsInvalidated(DisplayInformation^ sender, Object^ args) { } // Input event handlers void App::OnKeyDown(CoreWindow^ sender, KeyEventArgs^ key) { } void App::OnCharacterReceived(CoreWindow^ sender, CharacterReceivedEventArgs^ key) { switch (key->KeyCode) { case (unsigned int)VirtualKey::Back: if (wiBackLog::isActive()) wiBackLog::deletefromInput(); wiTextInputField::DeleteFromInput(); break; case (unsigned int)VirtualKey::Enter: break; default: { const char c = (const char)key->KeyCode; if (wiBackLog::isActive()) { wiBackLog::input(c); } wiTextInputField::AddInput(c); } break; } }