252 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			252 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								package kha;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@:headerCode("
							 | 
						||
| 
								 | 
							
								#include <kinc/window.h>
							 | 
						||
| 
								 | 
							
								")
							 | 
						||
| 
								 | 
							
								@:cppFileCode("
							 | 
						||
| 
								 | 
							
								namespace {
							 | 
						||
| 
								 | 
							
									char windowTitles[10][256];
							 | 
						||
| 
								 | 
							
									int titleIndex = 0;
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									void resizeCallback(int width, int height, void* data) {
							 | 
						||
| 
								 | 
							
										::kha::Window_obj::callResizeCallbacks(*((int*)&data), width, height);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
									void ppiCallback(int ppi, void* data) {
							 | 
						||
| 
								 | 
							
										::kha::Window_obj::callPpiCallbacks(*((int*)&data), ppi);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								kinc_window_options_t convertWindowOptions(::kha::WindowOptions win) {
							 | 
						||
| 
								 | 
							
									kinc_window_options_t window;
							 | 
						||
| 
								 | 
							
									strcpy(windowTitles[titleIndex], win->title.c_str());
							 | 
						||
| 
								 | 
							
									window.title = windowTitles[titleIndex];
							 | 
						||
| 
								 | 
							
									++titleIndex;
							 | 
						||
| 
								 | 
							
									window.x = win->x;
							 | 
						||
| 
								 | 
							
									window.y = win->y;
							 | 
						||
| 
								 | 
							
									window.width = win->width;
							 | 
						||
| 
								 | 
							
									window.height = win->height;
							 | 
						||
| 
								 | 
							
									window.display_index = win->display;
							 | 
						||
| 
								 | 
							
									window.visible = win->visible;
							 | 
						||
| 
								 | 
							
									window.window_features = win->windowFeatures;
							 | 
						||
| 
								 | 
							
									window.mode = (kinc_window_mode_t)win->mode;
							 | 
						||
| 
								 | 
							
									return window;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								kinc_framebuffer_options_t convertFramebufferOptions(::kha::FramebufferOptions frame) {
							 | 
						||
| 
								 | 
							
									kinc_framebuffer_options_t framebuffer;
							 | 
						||
| 
								 | 
							
									framebuffer.frequency = frame->frequency;
							 | 
						||
| 
								 | 
							
									framebuffer.vertical_sync = frame->verticalSync;
							 | 
						||
| 
								 | 
							
									framebuffer.color_bits = frame->colorBufferBits;
							 | 
						||
| 
								 | 
							
									framebuffer.depth_bits = frame->depthBufferBits;
							 | 
						||
| 
								 | 
							
									framebuffer.stencil_bits = frame->stencilBufferBits;
							 | 
						||
| 
								 | 
							
									framebuffer.samples_per_pixel = frame->samplesPerPixel;
							 | 
						||
| 
								 | 
							
									return framebuffer;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								")
							 | 
						||
| 
								 | 
							
								class Window {
							 | 
						||
| 
								 | 
							
									static var windows: Array<Window> = [];
							 | 
						||
| 
								 | 
							
									static var resizeCallbacks: Array<Array<Int->Int->Void>> = [];
							 | 
						||
| 
								 | 
							
									static var ppiCallbacks: Array<Array<Int->Void>> = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var num: Int;
							 | 
						||
| 
								 | 
							
									var visibility: Bool;
							 | 
						||
| 
								 | 
							
									var windowTitle: String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									@:noDoc
							 | 
						||
| 
								 | 
							
									public function new(num: Int, win: WindowOptions) {
							 | 
						||
| 
								 | 
							
										this.num = num;
							 | 
						||
| 
								 | 
							
										visibility = win != null && win.visible;
							 | 
						||
| 
								 | 
							
										windowTitle = win == null ? "Kha" : (win.title == null ? "Kha" : win.title);
							 | 
						||
| 
								 | 
							
										resizeCallbacks[num] = [];
							 | 
						||
| 
								 | 
							
										ppiCallbacks[num] = [];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									@:noDoc
							 | 
						||
| 
								 | 
							
									@:keep
							 | 
						||
| 
								 | 
							
									static function unused(): Void {
							 | 
						||
| 
								 | 
							
										Display.primary.x;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									@:noDoc
							 | 
						||
| 
								 | 
							
									public static function _init(win: WindowOptions = null, frame: FramebufferOptions = null): Void {
							 | 
						||
| 
								 | 
							
										var window = new Window(windows.length, win);
							 | 
						||
| 
								 | 
							
										windows.push(window);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:access(kha.SystemImpl)
							 | 
						||
| 
								 | 
							
									public static function create(win: WindowOptions = null, frame: FramebufferOptions = null): Window {
							 | 
						||
| 
								 | 
							
										koreCreate(win == null ? {} : win, frame == null ? {} : frame);
							 | 
						||
| 
								 | 
							
										var window = new Window(windows.length, win);
							 | 
						||
| 
								 | 
							
										var index = windows.push(window) - 1;
							 | 
						||
| 
								 | 
							
										kha.SystemImpl.onWindowCreated(index);
							 | 
						||
| 
								 | 
							
										return window;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
										kinc_window_options_t window = convertWindowOptions(win);
							 | 
						||
| 
								 | 
							
										kinc_framebuffer_options_t framebuffer = convertFramebufferOptions(frame);
							 | 
						||
| 
								 | 
							
										kinc_window_create(&window, &framebuffer);
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									static function koreCreate(win: WindowOptions, frame: FramebufferOptions) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function destroy(window: Window): Void {
							 | 
						||
| 
								 | 
							
										koreDestroy(window.num);
							 | 
						||
| 
								 | 
							
										windows.remove(window);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_window_destroy(num);")
							 | 
						||
| 
								 | 
							
									static function koreDestroy(num: Int) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static function get(index: Int): Window {
							 | 
						||
| 
								 | 
							
										return windows[index];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public static var all(get, never): Array<Window>;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									static function get_all(): Array<Window> {
							 | 
						||
| 
								 | 
							
										return windows;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_window_resize(num, width, height);")
							 | 
						||
| 
								 | 
							
									public function resize(width: Int, height: Int): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_window_move(num, x, y);")
							 | 
						||
| 
								 | 
							
									public function move(x: Int, y: Int): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_window_change_features(num, features);")
							 | 
						||
| 
								 | 
							
									public function changeWindowFeatures(features: Int): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("
							 | 
						||
| 
								 | 
							
										kinc_framebuffer_options_t framebuffer = convertFramebufferOptions(frame);
							 | 
						||
| 
								 | 
							
										kinc_window_change_framebuffer(num, &framebuffer);
							 | 
						||
| 
								 | 
							
									")
							 | 
						||
| 
								 | 
							
									public function changeFramebuffer(frame: FramebufferOptions): Void {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var x(get, set): Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return kinc_window_x(num);")
							 | 
						||
| 
								 | 
							
									function get_x(): Int {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("int y = kinc_window_y(num); kinc_window_move(num, value, y);")
							 | 
						||
| 
								 | 
							
									function set_x(value: Int): Int {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var y(get, set): Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return kinc_window_y(num);")
							 | 
						||
| 
								 | 
							
									function get_y(): Int {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("int x = kinc_window_x(num); kinc_window_move(num, x, value);")
							 | 
						||
| 
								 | 
							
									function set_y(value: Int): Int {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var width(get, set): Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return kinc_window_width(num);")
							 | 
						||
| 
								 | 
							
									function get_width(): Int {
							 | 
						||
| 
								 | 
							
										return 800;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("int height = kinc_window_height(num); kinc_window_resize(num, value, height);")
							 | 
						||
| 
								 | 
							
									function set_width(value: Int): Int {
							 | 
						||
| 
								 | 
							
										return 800;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var height(get, set): Int;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return kinc_window_height(num);")
							 | 
						||
| 
								 | 
							
									function get_height(): Int {
							 | 
						||
| 
								 | 
							
										return 600;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("int width = kinc_window_width(num); kinc_window_move(num, width, value);")
							 | 
						||
| 
								 | 
							
									function set_height(value: Int): Int {
							 | 
						||
| 
								 | 
							
										return 600;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var mode(get, set): WindowMode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function get_mode(): WindowMode {
							 | 
						||
| 
								 | 
							
										return cast getKincMode();
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return kinc_window_get_mode(num);")
							 | 
						||
| 
								 | 
							
									function getKincMode(): Int {
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_window_change_mode(num, (kinc_window_mode_t)mode); return mode;")
							 | 
						||
| 
								 | 
							
									function set_mode(mode: WindowMode): WindowMode {
							 | 
						||
| 
								 | 
							
										return mode;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var visible(get, set): Bool;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function get_visible(): Bool {
							 | 
						||
| 
								 | 
							
										return visibility;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("if (value) kinc_window_show(num); else kinc_window_hide(num);")
							 | 
						||
| 
								 | 
							
									function set_visible(value: Bool): Bool {
							 | 
						||
| 
								 | 
							
										visibility = value;
							 | 
						||
| 
								 | 
							
										return value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var title(get, set): String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function get_title(): String {
							 | 
						||
| 
								 | 
							
										return windowTitle;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_window_set_title(num, value.c_str());")
							 | 
						||
| 
								 | 
							
									function set_title(value: String): String {
							 | 
						||
| 
								 | 
							
										windowTitle = value;
							 | 
						||
| 
								 | 
							
										return windowTitle;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_window_set_resize_callback(num, resizeCallback, (void*)this->num);")
							 | 
						||
| 
								 | 
							
									public function notifyOnResize(callback: Int->Int->Void): Void {
							 | 
						||
| 
								 | 
							
										resizeCallbacks[num].push(callback);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									@:noDoc
							 | 
						||
| 
								 | 
							
									@:keep
							 | 
						||
| 
								 | 
							
									public static function callResizeCallbacks(num: Int, width: Int, height: Int) {
							 | 
						||
| 
								 | 
							
										for (callback in resizeCallbacks[num]) {
							 | 
						||
| 
								 | 
							
											callback(width, height);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("kinc_window_set_ppi_changed_callback(num, ppiCallback, (void*)this->num);")
							 | 
						||
| 
								 | 
							
									public function notifyOnPpiChange(callback: Int->Void): Void {
							 | 
						||
| 
								 | 
							
										ppiCallbacks[num].push(callback);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:noCompletion
							 | 
						||
| 
								 | 
							
									@:noDoc
							 | 
						||
| 
								 | 
							
									@:keep
							 | 
						||
| 
								 | 
							
									public static function callPpiCallbacks(num: Int, ppi: Int) {
							 | 
						||
| 
								 | 
							
										for (callback in ppiCallbacks[num]) {
							 | 
						||
| 
								 | 
							
											callback(ppi);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public var vSynced(get, never): Bool;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									@:functionCode("return kinc_window_vsynced(num);")
							 | 
						||
| 
								 | 
							
									function get_vSynced(): Bool {
							 | 
						||
| 
								 | 
							
										return true;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |