forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			351 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			351 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | #ifdef KINC_OPENGL
 | ||
|  | #include <GL/glfw.h>
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #include <emscripten/emscripten.h>
 | ||
|  | #include <kinc/audio2/audio.h>
 | ||
|  | #include <kinc/graphics4/graphics.h>
 | ||
|  | #include <kinc/input/keyboard.h>
 | ||
|  | #include <kinc/input/mouse.h>
 | ||
|  | #include <kinc/log.h>
 | ||
|  | #include <kinc/system.h>
 | ||
|  | #include <kinc/window.h>
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <stdlib.h>
 | ||
|  | 
 | ||
|  | static int html5_argc; | ||
|  | static char **html5_argv; | ||
|  | static bool initialized = false; | ||
|  | 
 | ||
|  | static void drawfunc() { | ||
|  | 	if (!initialized) | ||
|  | 		return; | ||
|  | 	kinc_internal_update_callback(); | ||
|  | 	kinc_a2_update(); | ||
|  | #ifdef KINC_OPENGL
 | ||
|  | 	glfwSwapBuffers(); | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | #define KEY_DOWN(GLFW_KEYCODE, KINC_KEY)                                                                                                                       \
 | ||
|  | 	case GLFW_KEYCODE:                                                                                                                                         \ | ||
|  | 		kinc_internal_keyboard_trigger_key_down(KINC_KEY);                                                                                                     \ | ||
|  | 		break; | ||
|  | 
 | ||
|  | #define KEY_UP(GLFW_KEYCODE, KINC_KEY)                                                                                                                         \
 | ||
|  | 	case GLFW_KEYCODE:                                                                                                                                         \ | ||
|  | 		kinc_internal_keyboard_trigger_key_up(KINC_KEY);                                                                                                       \ | ||
|  | 		break; | ||
|  | 
 | ||
|  | #ifdef KINC_OPENGL
 | ||
|  | // glfw mappings as state here: https://www.glfw.org/docs/3.3/group__keys.html
 | ||
|  | static void onKeyPressed(int key, int action) { | ||
|  | 	if (action == GLFW_PRESS) { | ||
|  | 		switch (key) { | ||
|  | 			KEY_DOWN(32, KINC_KEY_SPACE) | ||
|  | 			KEY_DOWN(39, KINC_KEY_QUOTE) | ||
|  | 			KEY_DOWN(44, KINC_KEY_COMMA) | ||
|  | 			KEY_DOWN(45, KINC_KEY_SUBTRACT) | ||
|  | 			KEY_DOWN(46, KINC_KEY_PERIOD) | ||
|  | 			KEY_DOWN(47, KINC_KEY_SLASH) | ||
|  | 			KEY_DOWN(48, KINC_KEY_0) | ||
|  | 			KEY_DOWN(49, KINC_KEY_1) | ||
|  | 			KEY_DOWN(50, KINC_KEY_2) | ||
|  | 			KEY_DOWN(51, KINC_KEY_3) | ||
|  | 			KEY_DOWN(52, KINC_KEY_4) | ||
|  | 			KEY_DOWN(53, KINC_KEY_5) | ||
|  | 			KEY_DOWN(54, KINC_KEY_6) | ||
|  | 			KEY_DOWN(55, KINC_KEY_7) | ||
|  | 			KEY_DOWN(56, KINC_KEY_8) | ||
|  | 			KEY_DOWN(57, KINC_KEY_9) | ||
|  | 			KEY_DOWN(59, KINC_KEY_SEMICOLON) | ||
|  | 			KEY_DOWN(61, KINC_KEY_EQUALS) | ||
|  | 			KEY_DOWN(65, KINC_KEY_A) | ||
|  | 			KEY_DOWN(66, KINC_KEY_B) | ||
|  | 			KEY_DOWN(67, KINC_KEY_C) | ||
|  | 			KEY_DOWN(68, KINC_KEY_D) | ||
|  | 			KEY_DOWN(69, KINC_KEY_E) | ||
|  | 			KEY_DOWN(70, KINC_KEY_F) | ||
|  | 			KEY_DOWN(71, KINC_KEY_G) | ||
|  | 			KEY_DOWN(72, KINC_KEY_H) | ||
|  | 			KEY_DOWN(73, KINC_KEY_I) | ||
|  | 			KEY_DOWN(74, KINC_KEY_J) | ||
|  | 			KEY_DOWN(75, KINC_KEY_K) | ||
|  | 			KEY_DOWN(76, KINC_KEY_L) | ||
|  | 			KEY_DOWN(77, KINC_KEY_M) | ||
|  | 			KEY_DOWN(78, KINC_KEY_N) | ||
|  | 			KEY_DOWN(79, KINC_KEY_O) | ||
|  | 			KEY_DOWN(80, KINC_KEY_P) | ||
|  | 			KEY_DOWN(81, KINC_KEY_Q) | ||
|  | 			KEY_DOWN(82, KINC_KEY_R) | ||
|  | 			KEY_DOWN(83, KINC_KEY_S) | ||
|  | 			KEY_DOWN(84, KINC_KEY_T) | ||
|  | 			KEY_DOWN(85, KINC_KEY_U) | ||
|  | 			KEY_DOWN(86, KINC_KEY_V) | ||
|  | 			KEY_DOWN(87, KINC_KEY_W) | ||
|  | 			KEY_DOWN(88, KINC_KEY_X) | ||
|  | 			KEY_DOWN(89, KINC_KEY_Y) | ||
|  | 			KEY_DOWN(90, KINC_KEY_Z) | ||
|  | 			KEY_DOWN(92, KINC_KEY_BACK_SLASH) | ||
|  | 			KEY_DOWN(256, KINC_KEY_ESCAPE) | ||
|  | 			KEY_DOWN(257, KINC_KEY_RETURN) | ||
|  | 			KEY_DOWN(258, KINC_KEY_TAB) | ||
|  | 			KEY_DOWN(259, KINC_KEY_BACKSPACE) | ||
|  | 			KEY_DOWN(260, KINC_KEY_INSERT) | ||
|  | 			KEY_DOWN(261, KINC_KEY_DELETE) | ||
|  | 			KEY_DOWN(262, KINC_KEY_RIGHT) | ||
|  | 			KEY_DOWN(263, KINC_KEY_LEFT) | ||
|  | 			KEY_DOWN(264, KINC_KEY_DOWN) | ||
|  | 			KEY_DOWN(265, KINC_KEY_UP) | ||
|  | 			KEY_DOWN(268, KINC_KEY_HOME) | ||
|  | 			KEY_DOWN(269, KINC_KEY_END) | ||
|  | 			KEY_DOWN(284, KINC_KEY_PAUSE) | ||
|  | 			KEY_DOWN(290, KINC_KEY_F1) | ||
|  | 			KEY_DOWN(291, KINC_KEY_F2) | ||
|  | 			KEY_DOWN(292, KINC_KEY_F3) | ||
|  | 			KEY_DOWN(293, KINC_KEY_F4) | ||
|  | 			KEY_DOWN(294, KINC_KEY_F5) | ||
|  | 			KEY_DOWN(295, KINC_KEY_F6) | ||
|  | 			KEY_DOWN(296, KINC_KEY_F7) | ||
|  | 			KEY_DOWN(297, KINC_KEY_F8) | ||
|  | 			KEY_DOWN(298, KINC_KEY_F9) | ||
|  | 			KEY_DOWN(299, KINC_KEY_F10) | ||
|  | 			KEY_DOWN(300, KINC_KEY_F11) | ||
|  | 			KEY_DOWN(301, KINC_KEY_F12) | ||
|  | 			KEY_DOWN(302, KINC_KEY_F13) | ||
|  | 			KEY_DOWN(303, KINC_KEY_F14) | ||
|  | 			KEY_DOWN(304, KINC_KEY_F15) | ||
|  | 			KEY_DOWN(305, KINC_KEY_F16) | ||
|  | 			KEY_DOWN(306, KINC_KEY_F17) | ||
|  | 			KEY_DOWN(307, KINC_KEY_F18) | ||
|  | 			KEY_DOWN(308, KINC_KEY_F19) | ||
|  | 			KEY_DOWN(309, KINC_KEY_F20) | ||
|  | 			KEY_DOWN(310, KINC_KEY_F21) | ||
|  | 			KEY_DOWN(311, KINC_KEY_F22) | ||
|  | 			KEY_DOWN(312, KINC_KEY_F23) | ||
|  | 			KEY_DOWN(313, KINC_KEY_F24) | ||
|  | 			KEY_DOWN(348, KINC_KEY_CONTEXT_MENU) | ||
|  | 		} | ||
|  | 	} | ||
|  | 	else { | ||
|  | 		switch (key) { | ||
|  | 			KEY_UP(32, KINC_KEY_SPACE) | ||
|  | 			KEY_UP(39, KINC_KEY_QUOTE) | ||
|  | 			KEY_UP(44, KINC_KEY_COMMA) | ||
|  | 			KEY_UP(45, KINC_KEY_SUBTRACT) | ||
|  | 			KEY_UP(46, KINC_KEY_PERIOD) | ||
|  | 			KEY_UP(47, KINC_KEY_SLASH) | ||
|  | 			KEY_UP(48, KINC_KEY_0) | ||
|  | 			KEY_UP(49, KINC_KEY_1) | ||
|  | 			KEY_UP(50, KINC_KEY_2) | ||
|  | 			KEY_UP(51, KINC_KEY_3) | ||
|  | 			KEY_UP(52, KINC_KEY_4) | ||
|  | 			KEY_UP(53, KINC_KEY_5) | ||
|  | 			KEY_UP(54, KINC_KEY_6) | ||
|  | 			KEY_UP(55, KINC_KEY_7) | ||
|  | 			KEY_UP(56, KINC_KEY_8) | ||
|  | 			KEY_UP(57, KINC_KEY_9) | ||
|  | 			KEY_UP(59, KINC_KEY_SEMICOLON) | ||
|  | 			KEY_UP(61, KINC_KEY_EQUALS) | ||
|  | 			KEY_UP(65, KINC_KEY_A) | ||
|  | 			KEY_UP(66, KINC_KEY_B) | ||
|  | 			KEY_UP(67, KINC_KEY_C) | ||
|  | 			KEY_UP(68, KINC_KEY_D) | ||
|  | 			KEY_UP(69, KINC_KEY_E) | ||
|  | 			KEY_UP(70, KINC_KEY_F) | ||
|  | 			KEY_UP(71, KINC_KEY_G) | ||
|  | 			KEY_UP(72, KINC_KEY_H) | ||
|  | 			KEY_UP(73, KINC_KEY_I) | ||
|  | 			KEY_UP(74, KINC_KEY_J) | ||
|  | 			KEY_UP(75, KINC_KEY_K) | ||
|  | 			KEY_UP(76, KINC_KEY_L) | ||
|  | 			KEY_UP(77, KINC_KEY_M) | ||
|  | 			KEY_UP(78, KINC_KEY_N) | ||
|  | 			KEY_UP(79, KINC_KEY_O) | ||
|  | 			KEY_UP(80, KINC_KEY_P) | ||
|  | 			KEY_UP(81, KINC_KEY_Q) | ||
|  | 			KEY_UP(82, KINC_KEY_R) | ||
|  | 			KEY_UP(83, KINC_KEY_S) | ||
|  | 			KEY_UP(84, KINC_KEY_T) | ||
|  | 			KEY_UP(85, KINC_KEY_U) | ||
|  | 			KEY_UP(86, KINC_KEY_V) | ||
|  | 			KEY_UP(87, KINC_KEY_W) | ||
|  | 			KEY_UP(88, KINC_KEY_X) | ||
|  | 			KEY_UP(89, KINC_KEY_Y) | ||
|  | 			KEY_UP(90, KINC_KEY_Z) | ||
|  | 			KEY_UP(92, KINC_KEY_BACK_SLASH) | ||
|  | 			KEY_UP(256, KINC_KEY_ESCAPE) | ||
|  | 			KEY_UP(257, KINC_KEY_RETURN) | ||
|  | 			KEY_UP(258, KINC_KEY_TAB) | ||
|  | 			KEY_UP(259, KINC_KEY_BACKSPACE) | ||
|  | 			KEY_UP(260, KINC_KEY_INSERT) | ||
|  | 			KEY_UP(261, KINC_KEY_DELETE) | ||
|  | 			KEY_UP(262, KINC_KEY_RIGHT) | ||
|  | 			KEY_UP(263, KINC_KEY_LEFT) | ||
|  | 			KEY_UP(264, KINC_KEY_DOWN) | ||
|  | 			KEY_UP(265, KINC_KEY_UP) | ||
|  | 			KEY_UP(268, KINC_KEY_HOME) | ||
|  | 			KEY_UP(269, KINC_KEY_END) | ||
|  | 			KEY_UP(284, KINC_KEY_PAUSE) | ||
|  | 			KEY_UP(290, KINC_KEY_F1) | ||
|  | 			KEY_UP(291, KINC_KEY_F2) | ||
|  | 			KEY_UP(292, KINC_KEY_F3) | ||
|  | 			KEY_UP(293, KINC_KEY_F4) | ||
|  | 			KEY_UP(294, KINC_KEY_F5) | ||
|  | 			KEY_UP(295, KINC_KEY_F6) | ||
|  | 			KEY_UP(296, KINC_KEY_F7) | ||
|  | 			KEY_UP(297, KINC_KEY_F8) | ||
|  | 			KEY_UP(298, KINC_KEY_F9) | ||
|  | 			KEY_UP(299, KINC_KEY_F10) | ||
|  | 			KEY_UP(300, KINC_KEY_F11) | ||
|  | 			KEY_UP(301, KINC_KEY_F12) | ||
|  | 			KEY_UP(302, KINC_KEY_F13) | ||
|  | 			KEY_UP(303, KINC_KEY_F14) | ||
|  | 			KEY_UP(304, KINC_KEY_F15) | ||
|  | 			KEY_UP(305, KINC_KEY_F16) | ||
|  | 			KEY_UP(306, KINC_KEY_F17) | ||
|  | 			KEY_UP(307, KINC_KEY_F18) | ||
|  | 			KEY_UP(308, KINC_KEY_F19) | ||
|  | 			KEY_UP(309, KINC_KEY_F20) | ||
|  | 			KEY_UP(310, KINC_KEY_F21) | ||
|  | 			KEY_UP(311, KINC_KEY_F22) | ||
|  | 			KEY_UP(312, KINC_KEY_F23) | ||
|  | 			KEY_UP(313, KINC_KEY_F24) | ||
|  | 			KEY_UP(348, KINC_KEY_CONTEXT_MENU) | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | static int mouseX = 0; | ||
|  | static int mouseY = 0; | ||
|  | 
 | ||
|  | static void onMouseClick(int button, int action) { | ||
|  | 	if (action == GLFW_PRESS) { | ||
|  | 		if (button == 0) { | ||
|  | 			kinc_internal_mouse_trigger_press(0, 0, mouseX, mouseY); | ||
|  | 		} | ||
|  | 		else if (button == 1) { | ||
|  | 			kinc_internal_mouse_trigger_press(0, 1, mouseX, mouseY); | ||
|  | 		} | ||
|  | 	} | ||
|  | 	else { | ||
|  | 		if (button == 0) { | ||
|  | 			kinc_internal_mouse_trigger_release(0, 0, mouseX, mouseY); | ||
|  | 		} | ||
|  | 		else if (button == 1) { | ||
|  | 			kinc_internal_mouse_trigger_release(0, 1, mouseX, mouseY); | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | static void onMouseMove(int x, int y) { | ||
|  | 	mouseX = x; | ||
|  | 	mouseY = y; | ||
|  | 	kinc_internal_mouse_trigger_move(0, x, y); | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | static int with, height; | ||
|  | 
 | ||
|  | extern int kinc_internal_window_width; | ||
|  | extern int kinc_internal_window_height; | ||
|  | 
 | ||
|  | #ifdef KINC_KONG
 | ||
|  | void kong_init(void); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | int kinc_init(const char *name, int width, int height, kinc_window_options_t *win, kinc_framebuffer_options_t *frame) { | ||
|  | 	kinc_window_options_t defaultWin; | ||
|  | 	if (win == NULL) { | ||
|  | 		kinc_window_options_set_defaults(&defaultWin); | ||
|  | 		win = &defaultWin; | ||
|  | 	} | ||
|  | 	kinc_framebuffer_options_t defaultFrame; | ||
|  | 	if (frame == NULL) { | ||
|  | 		kinc_framebuffer_options_set_defaults(&defaultFrame); | ||
|  | 		frame = &defaultFrame; | ||
|  | 	} | ||
|  | 	win->width = width; | ||
|  | 	win->height = height; | ||
|  | 
 | ||
|  | #ifdef KINC_OPENGL
 | ||
|  | 	glfwInit(); | ||
|  | 	glfwOpenWindow(width, height, 8, 8, 8, 0, frame->depth_bits, frame->stencil_bits, GLFW_WINDOW); | ||
|  | 	glfwSetWindowTitle(name); | ||
|  | 	glfwSetKeyCallback(onKeyPressed); | ||
|  | 	glfwSetMousePosCallback(onMouseMove); | ||
|  | 	glfwSetMouseButtonCallback(onMouseClick); | ||
|  | #endif
 | ||
|  | 	kinc_internal_window_width = width; | ||
|  | 	kinc_internal_window_height = height; | ||
|  | 	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; | ||
|  | } | ||
|  | 
 | ||
|  | bool kinc_internal_handle_messages() { | ||
|  | 	return true; | ||
|  | } | ||
|  | 
 | ||
|  | void kinc_set_keep_screen_on(bool on) {} | ||
|  | 
 | ||
|  | double kinc_frequency(void) { | ||
|  | 	return 1000.0; | ||
|  | } | ||
|  | 
 | ||
|  | kinc_ticks_t kinc_timestamp(void) { | ||
|  | #ifdef KINC_OPENGL
 | ||
|  | 	return (kinc_ticks_t)(glfwGetTime() * 1000.0); | ||
|  | #else
 | ||
|  | 	return (kinc_ticks_t)(0.0); | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | double kinc_time(void) { | ||
|  | #ifdef KINC_OPENGL
 | ||
|  | 	return glfwGetTime(); | ||
|  | #else
 | ||
|  | 	return 0.0; | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | int kinc_cpu_cores(void) { | ||
|  | 	return 4; | ||
|  | } | ||
|  | 
 | ||
|  | int kinc_hardware_threads(void) { | ||
|  | 	return 4; | ||
|  | } | ||
|  | 
 | ||
|  | extern int kickstart(int argc, char **argv); | ||
|  | 
 | ||
|  | #ifdef KINC_WEBGPU
 | ||
|  | EMSCRIPTEN_KEEPALIVE void kinc_internal_webgpu_initialized() { | ||
|  | 	kickstart(html5_argc, html5_argv); | ||
|  | 	initialized = true; | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | int main(int argc, char **argv) { | ||
|  | 	html5_argc = argc; | ||
|  | 	html5_argv = argv; | ||
|  | #ifdef KINC_WEBGPU
 | ||
|  | 	char *code = "(async () => {\
 | ||
|  | 		const adapter = await navigator.gpu.requestAdapter();\ | ||
|  | 		const device = await adapter.requestDevice();\ | ||
|  | 		Module.preinitializedWebGPUDevice = device;\ | ||
|  | 		_kinc_internal_webgpu_initialized();\ | ||
|  | 	})();"; | ||
|  | 	emscripten_run_script(code); | ||
|  | #else
 | ||
|  | 	kickstart(argc, argv); | ||
|  | 	initialized = true; | ||
|  | #endif
 | ||
|  | 	emscripten_set_main_loop(drawfunc, 0, 1); | ||
|  | } |