forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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;
 | |
| }
 |