460 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			460 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include <kinc/graphics4/graphics.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/input/gamepad.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/input/keyboard.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/input/mouse.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/system.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/threads/thread.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/video.h>
							 | 
						||
| 
								 | 
							
								#include <kinc/window.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define WIN32_LEAN_AND_MEAN
							 | 
						||
| 
								 | 
							
								#define NOMINMAX
							 | 
						||
| 
								 | 
							
								#include <windows.h>
							 | 
						||
| 
								 | 
							
								#ifndef XINPUT
							 | 
						||
| 
								 | 
							
								#ifdef KINC_WINDOWS
							 | 
						||
| 
								 | 
							
								#define XINPUT 1
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef KINC_WINDOWSAPP
							 | 
						||
| 
								 | 
							
								#define XINPUT !(WINAPI_PARTITION_PHONE_APP)
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#if XINPUT
							 | 
						||
| 
								 | 
							
								#include <Xinput.h>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <d3d11_1.h>
							 | 
						||
| 
								 | 
							
								#include <d3d11_4.h>
							 | 
						||
| 
								 | 
							
								#include <dxgi1_5.h>
							 | 
						||
| 
								 | 
							
								#include <wrl.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#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<IUnknown *>(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<CoreApplicationView ^, IActivatedEventArgs ^>(this, &Win8Application::OnActivated);
							 | 
						||
| 
								 | 
							
									CoreApplication::Suspending += ref new EventHandler<SuspendingEventArgs ^>(this, &Win8Application::OnSuspending);
							 | 
						||
| 
								 | 
							
									CoreApplication::Resuming += ref new EventHandler<Platform::Object ^>(this, &Win8Application::OnResuming);
							 | 
						||
| 
								 | 
							
									// m_renderer = ref new CubeRenderer();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void Win8Application::SetWindow(CoreWindow ^ window) {
							 | 
						||
| 
								 | 
							
									window->SizeChanged += ref new TypedEventHandler<CoreWindow ^, WindowSizeChangedEventArgs ^>(this, &Win8Application::OnWindowSizeChanged);
							 | 
						||
| 
								 | 
							
									window->Closed += ref new TypedEventHandler<CoreWindow ^, CoreWindowEventArgs ^>(this, &Win8Application::OnWindowClosed);
							 | 
						||
| 
								 | 
							
									window->PointerPressed += ref new TypedEventHandler<CoreWindow ^, PointerEventArgs ^>(this, &Win8Application::OnPointerPressed);
							 | 
						||
| 
								 | 
							
									window->PointerReleased += ref new TypedEventHandler<CoreWindow ^, PointerEventArgs ^>(this, &Win8Application::OnPointerReleased);
							 | 
						||
| 
								 | 
							
									window->PointerMoved += ref new TypedEventHandler<CoreWindow ^, PointerEventArgs ^>(this, &Win8Application::OnPointerMoved);
							 | 
						||
| 
								 | 
							
									window->KeyDown +=
							 | 
						||
| 
								 | 
							
									    ref new Windows::Foundation::TypedEventHandler<Windows::UI::Core::CoreWindow ^, Windows::UI::Core::KeyEventArgs ^>(this, &Win8Application::OnKeyDown);
							 | 
						||
| 
								 | 
							
									window->KeyUp +=
							 | 
						||
| 
								 | 
							
									    ref new Windows::Foundation::TypedEventHandler<Windows::UI::Core::CoreWindow ^, Windows::UI::Core::KeyEventArgs ^>(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<HolographicFrameController>(window);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// create video frame processor
							 | 
						||
| 
								 | 
							
									VideoFrameProcessor::createAsync().then([this](std::shared_ptr<VideoFrameProcessor> 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<int>(args->CurrentPoint->Position.X);
							 | 
						||
| 
								 | 
							
									mouseY = static_cast<int>(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<int>(args->CurrentPoint->Position.X);
							 | 
						||
| 
								 | 
							
									mouseY = static_cast<int>(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<int>(args->CurrentPoint->Position.X);
							 | 
						||
| 
								 | 
							
									mouseY = static_cast<int>(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<LARGE_INTEGER *>(&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<LARGE_INTEGER *>(&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<Platform::String ^> ^) {
							 | 
						||
| 
								 | 
							
									QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER *>(&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;
							 | 
						||
| 
								 | 
							
								}
							 |