#include #include #include #include #include #include #include #include #define WIN32_LEAN_AND_MEAN #define NOMINMAX #include #ifndef XINPUT #ifdef KINC_WINDOWS #define XINPUT 1 #endif #ifdef KINC_WINDOWSAPP #define XINPUT !(WINAPI_PARTITION_PHONE_APP) #endif #endif #if XINPUT #include #endif #include #include #include #include #ifdef KINC_WINDOWSAPP using namespace ::Microsoft::WRL; using namespace Windows::UI::Core; using namespace Windows::Foundation; #ifdef KINC_HOLOLENS using namespace Windows::Graphics::Holographic; using namespace Windows::Graphics::DirectX::Direct3D11; #endif #endif extern "C" IUnknown *kinc_winapp_internal_get_window(void) { return reinterpret_cast(CoreWindow::GetForCurrentThread()); } extern "C" void kinc_internal_uwp_installed_location_path(char *path) { Platform::String ^ locationString = Windows::ApplicationModel::Package::Current->InstalledLocation->Path; WideCharToMultiByte(CP_UTF8, 0, locationString->Begin(), -1, path, 1000, nullptr, nullptr); } ref class Win8Application sealed : public Windows::ApplicationModel::Core::IFrameworkView { public: Win8Application(); virtual void Initialize(Windows::ApplicationModel::Core::CoreApplicationView ^ applicationView); virtual void SetWindow(Windows::UI::Core::CoreWindow ^ window); virtual void Load(Platform::String ^ entryPoint); virtual void Run(); virtual void Uninitialize(); protected: void OnWindowSizeChanged(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::WindowSizeChangedEventArgs ^ args); // void OnLogicalDpiChanged(Platform::Object^ sender); void OnActivated(Windows::ApplicationModel::Core::CoreApplicationView ^ applicationView, Windows::ApplicationModel::Activation::IActivatedEventArgs ^ args); void OnSuspending(Platform::Object ^ sender, Windows::ApplicationModel::SuspendingEventArgs ^ args); void OnResuming(Platform::Object ^ sender, Platform::Object ^ args); void OnWindowClosed(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::CoreWindowEventArgs ^ args); void OnPointerPressed(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args); void OnPointerReleased(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args); void OnPointerMoved(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args); private: // CubeRenderer^ m_renderer; // Windows::ApplicationModel::Core::CoreApplicationView^ view; bool closed; void OnKeyDown(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args); void OnKeyUp(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args); }; ref class Win8ApplicationSource : Windows::ApplicationModel::Core::IFrameworkViewSource { public: virtual Windows::ApplicationModel::Core::IFrameworkView ^ CreateView(); }; namespace { int mouseX, mouseY; float axes[12 * 6]; float buttons[12 * 16]; } 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; const char *kinc_gamepad_vendor(int gamepad) { return "Microsoft"; } const char *kinc_gamepad_product_name(int gamepad) { return "Xbox 360 Controller"; } bool kinc_internal_handle_messages(void) { CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent); #if XINPUT DWORD dwResult; for (DWORD i = 0; i < XUSER_MAX_COUNT; ++i) { XINPUT_STATE state; ZeroMemory(&state, sizeof(XINPUT_STATE)); dwResult = XInputGetState(i, &state); if (dwResult == ERROR_SUCCESS) { float newaxes[6]; newaxes[0] = state.Gamepad.sThumbLX / 32768.0f; newaxes[1] = state.Gamepad.sThumbLY / 32768.0f; newaxes[2] = state.Gamepad.sThumbRX / 32768.0f; newaxes[3] = state.Gamepad.sThumbRY / 32768.0f; newaxes[4] = state.Gamepad.bLeftTrigger / 255.0f; newaxes[5] = state.Gamepad.bRightTrigger / 255.0f; for (int i2 = 0; i2 < 6; ++i2) { if (axes[i * 6 + i2] != newaxes[i2]) { kinc_internal_gamepad_trigger_axis(i, i2, newaxes[i2]); axes[i * 6 + i2] = newaxes[i2]; } } float newbuttons[16]; newbuttons[0] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_A) ? 1.0f : 0.0f; newbuttons[1] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_B) ? 1.0f : 0.0f; newbuttons[2] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_X) ? 1.0f : 0.0f; newbuttons[3] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_Y) ? 1.0f : 0.0f; newbuttons[4] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? 1.0f : 0.0f; newbuttons[5] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) ? 1.0f : 0.0f; newbuttons[6] = state.Gamepad.bLeftTrigger / 255.0f; newbuttons[7] = state.Gamepad.bRightTrigger / 255.0f; newbuttons[8] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 1.0f : 0.0f; newbuttons[9] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 1.0f : 0.0f; newbuttons[10] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? 1.0f : 0.0f; newbuttons[11] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? 1.0f : 0.0f; newbuttons[12] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) ? 1.0f : 0.0f; newbuttons[13] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) ? 1.0f : 0.0f; newbuttons[14] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) ? 1.0f : 0.0f; newbuttons[15] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) ? 1.0f : 0.0f; for (int i2 = 0; i2 < 16; ++i2) { if (buttons[i * 16 + i2] != newbuttons[i2]) { kinc_internal_gamepad_trigger_button(i, i2, newbuttons[i2]); buttons[i * 16 + i2] = newbuttons[i2]; } } } } #endif return true; } // Kore::vec2i Kore::System::mousePos() { // return vec2i(mouseX, mouseY); //} #ifdef KINC_KONG extern "C" void kong_init(void); #endif #undef CreateWindow int kinc_init(const char *name, int width, int height, struct kinc_window_options *win, struct kinc_framebuffer_options *frame) { kinc_window_options_t defaultWin; if (win == NULL) { kinc_window_options_set_defaults(&defaultWin); win = &defaultWin; } win->width = width; win->height = height; kinc_framebuffer_options_t defaultFrame; if (frame == NULL) { kinc_framebuffer_options_set_defaults(&defaultFrame); frame = &defaultFrame; } kinc_g4_internal_init(); kinc_g4_internal_init_window(0, frame->depth_bits, frame->stencil_bits, true); #ifdef KINC_KONG kong_init(); #endif return 0; } void kinc_set_keep_screen_on(bool on) {} namespace { bool keyboardshown = false; char language[3] = {0}; } void kinc_keyboard_show() { keyboardshown = true; } void kinc_keyboard_hide() { keyboardshown = false; } bool kinc_keyboard_active() { return keyboardshown; } void kinc_load_url(const char *url) {} void kinc_vibrate(int ms) {} const char *kinc_language() { wchar_t wlanguage[3] = {0}; if (GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SISO639LANGNAME, wlanguage, 3)) { WideCharToMultiByte(CP_UTF8, 0, wlanguage, -1, language, 3, nullptr, nullptr); return language; } return "en"; } Win8Application::Win8Application() : closed(false) {} void Win8Application::Initialize(CoreApplicationView ^ applicationView) { applicationView->Activated += ref new TypedEventHandler(this, &Win8Application::OnActivated); CoreApplication::Suspending += ref new EventHandler(this, &Win8Application::OnSuspending); CoreApplication::Resuming += ref new EventHandler(this, &Win8Application::OnResuming); // m_renderer = ref new CubeRenderer(); } void Win8Application::SetWindow(CoreWindow ^ window) { window->SizeChanged += ref new TypedEventHandler(this, &Win8Application::OnWindowSizeChanged); window->Closed += ref new TypedEventHandler(this, &Win8Application::OnWindowClosed); window->PointerPressed += ref new TypedEventHandler(this, &Win8Application::OnPointerPressed); window->PointerReleased += ref new TypedEventHandler(this, &Win8Application::OnPointerReleased); window->PointerMoved += ref new TypedEventHandler(this, &Win8Application::OnPointerMoved); window->KeyDown += ref new Windows::Foundation::TypedEventHandler(this, &Win8Application::OnKeyDown); window->KeyUp += ref new Windows::Foundation::TypedEventHandler(this, &Win8Application::OnKeyUp); // m_renderer->Initialize(CoreWindow::GetForCurrentThread()); #ifdef KINC_HOLOLENS // Create holographics space - needs to be created before window is activated holographicFrameController = std::make_unique(window); // create video frame processor VideoFrameProcessor::createAsync().then([this](std::shared_ptr videoProcessor) { videoFrameProcessor = std::move(videoProcessor); }); #endif } void Win8Application::Load(Platform::String ^ entryPoint) {} void Win8Application::Run() { // BasicTimer^ timer = ref new BasicTimer(); kickstart(0, nullptr); // while (!closed) { // timer->Update(); // m_renderer->Update(timer->Total, timer->Delta); // m_renderer->Render(); // m_renderer->Present(); // This call is synchronized to the display frame rate. //} } void Win8Application::Uninitialize() {} int kinc_uwp_window_width; int kinc_uwp_window_height; extern "C" void kinc_internal_resize(int window, int width, int height); void Win8Application::OnWindowSizeChanged(CoreWindow ^ sender, WindowSizeChangedEventArgs ^ args) { kinc_uwp_window_width = (int)args->Size.Width; kinc_uwp_window_height = (int)args->Size.Height; kinc_internal_resize(0, (int)args->Size.Width, (int)args->Size.Height); } void Win8Application::OnWindowClosed(CoreWindow ^ sender, CoreWindowEventArgs ^ args) { closed = true; } void Win8Application::OnActivated(CoreApplicationView ^ applicationView, IActivatedEventArgs ^ args) { CoreWindow::GetForCurrentThread()->Activate(); } void Win8Application::OnSuspending(Platform::Object ^ sender, SuspendingEventArgs ^ args) { // SuspendingDeferral^ deferral = args->SuspendingOperation->GetDeferral(); // deferral->Complete(); } void Win8Application::OnResuming(Platform::Object ^ sender, Platform::Object ^ args) {} void Win8Application::OnPointerPressed(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args) { mouseX = static_cast(args->CurrentPoint->Position.X); mouseY = static_cast(args->CurrentPoint->Position.Y); kinc_internal_mouse_trigger_press(0, 0, mouseX, mouseY); } void Win8Application::OnPointerReleased(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args) { mouseX = static_cast(args->CurrentPoint->Position.X); mouseY = static_cast(args->CurrentPoint->Position.Y); kinc_internal_mouse_trigger_release(0, 0, mouseX, mouseY); } void Win8Application::OnPointerMoved(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args) { mouseX = static_cast(args->CurrentPoint->Position.X); mouseY = static_cast(args->CurrentPoint->Position.Y); kinc_internal_mouse_trigger_move(0, mouseX, mouseY); } void Win8Application::OnKeyDown(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args) { switch (args->VirtualKey) { case Windows::System::VirtualKey::Left: kinc_internal_keyboard_trigger_key_down(KINC_KEY_LEFT); break; case Windows::System::VirtualKey::Right: kinc_internal_keyboard_trigger_key_down(KINC_KEY_RIGHT); break; case Windows::System::VirtualKey::Up: kinc_internal_keyboard_trigger_key_down(KINC_KEY_UP); break; case Windows::System::VirtualKey::Down: kinc_internal_keyboard_trigger_key_down(KINC_KEY_DOWN); break; default: if (args->VirtualKey >= Windows::System::VirtualKey::A && args->VirtualKey <= Windows::System::VirtualKey::Z) { kinc_internal_keyboard_trigger_key_down((int)args->VirtualKey); } else if (args->VirtualKey >= Windows::System::VirtualKey::Number0 && args->VirtualKey <= Windows::System::VirtualKey::Number9) { kinc_internal_keyboard_trigger_key_down((int)args->VirtualKey); } break; } } void Win8Application::OnKeyUp(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args) { switch (args->VirtualKey) { case Windows::System::VirtualKey::Left: kinc_internal_keyboard_trigger_key_up(KINC_KEY_LEFT); break; case Windows::System::VirtualKey::Right: kinc_internal_keyboard_trigger_key_up(KINC_KEY_RIGHT); break; case Windows::System::VirtualKey::Up: kinc_internal_keyboard_trigger_key_up(KINC_KEY_UP); break; case Windows::System::VirtualKey::Down: kinc_internal_keyboard_trigger_key_up(KINC_KEY_DOWN); break; default: if (args->VirtualKey >= Windows::System::VirtualKey::A && args->VirtualKey <= Windows::System::VirtualKey::Z) { kinc_internal_keyboard_trigger_key_up((int)args->VirtualKey); } else if (args->VirtualKey >= Windows::System::VirtualKey::Number0 && args->VirtualKey <= Windows::System::VirtualKey::Number9) { kinc_internal_keyboard_trigger_key_up((int)args->VirtualKey); } break; } } IFrameworkView ^ Win8ApplicationSource::CreateView() { return ref new Win8Application; } const char *kinc_internal_save_path() { return "\\"; } const char *kinc_system_id() { return "WindowsApp"; } namespace { const char *videoFormats[] = {"ogv", nullptr}; } const char **kinc_video_formats() { return ::videoFormats; } int kinc_window_width(int window_index) { return kinc_uwp_window_width; } int kinc_window_height(int window_index) { return kinc_uwp_window_height; } double kinc_frequency() { kinc_ticks_t rate; QueryPerformanceFrequency(reinterpret_cast(&rate)); return (double)rate; } void kinc_internal_shutdown() {} static kinc_ticks_t start_stamp; kinc_ticks_t kinc_timestamp() { kinc_ticks_t stamp; QueryPerformanceCounter(reinterpret_cast(&stamp)); return stamp - start_stamp; } void kinc_login() {} void kinc_unlock_achievement(int id) {} bool kinc_gamepad_connected(int num) { return true; } void kinc_gamepad_rumble(int gamepad, float left, float right){ } [Platform::MTAThread] int main(Platform::Array ^) { QueryPerformanceCounter(reinterpret_cast(&start_stamp)); CoreApplication::Run(ref new Win8ApplicationSource); return 0; } int kinc_cpu_cores(void) { SYSTEM_LOGICAL_PROCESSOR_INFORMATION info[1024]; DWORD returnLength = sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) * 1024; BOOL success = GetLogicalProcessorInformation(&info[0], &returnLength); int proper_cpu_count = 0; if (success) { DWORD byteOffset = 0; PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = &info[0]; while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) { if (ptr->Relationship == RelationProcessorCore) { ++proper_cpu_count; } byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); ++ptr; } } else { proper_cpu_count = 1; } return proper_cpu_count; } int kinc_hardware_threads(void) { SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); return sysinfo.dwNumberOfProcessors; }