| 
									
										
										
										
											2025-05-13 19:35:50 +00:00
										 |  |  | package kha; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import kha.graphics4.TextureFormat; | 
					
						
							|  |  |  | import kha.input.Gamepad; | 
					
						
							|  |  |  | import kha.input.Keyboard; | 
					
						
							|  |  |  | import kha.input.Mouse; | 
					
						
							|  |  |  | import kha.input.MouseImpl; | 
					
						
							|  |  |  | import kha.input.Pen; | 
					
						
							|  |  |  | import kha.input.Surface; | 
					
						
							|  |  |  | import kha.System; | 
					
						
							|  |  |  | import haxe.ds.Vector; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SystemImpl { | 
					
						
							|  |  |  | 	static var start: Float; | 
					
						
							|  |  |  | 	static var framebuffer: Framebuffer; | 
					
						
							|  |  |  | 	static var keyboard: Keyboard; | 
					
						
							|  |  |  | 	static var mouse: Mouse; | 
					
						
							|  |  |  | 	static var pen: Pen; | 
					
						
							|  |  |  | 	static var maxGamepads: Int = 4; | 
					
						
							|  |  |  | 	static var gamepads: Array<Gamepad>; | 
					
						
							|  |  |  | 	static var mouseLockListeners: Array<Void->Void> = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function renderCallback(): Void { | 
					
						
							|  |  |  | 		Scheduler.executeFrame(); | 
					
						
							|  |  |  | 		System.render([framebuffer]); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function dropFilesCallback(filePath: String): Void { | 
					
						
							|  |  |  | 		System.dropFiles(filePath); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function copyCallback(): String { | 
					
						
							|  |  |  | 		if (System.copyListener != null) { | 
					
						
							|  |  |  | 			return System.copyListener(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			return null; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function cutCallback(): String { | 
					
						
							|  |  |  | 		if (System.cutListener != null) { | 
					
						
							|  |  |  | 			return System.cutListener(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			return null; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function pasteCallback(data: String): Void { | 
					
						
							|  |  |  | 		if (System.pasteListener != null) { | 
					
						
							|  |  |  | 			System.pasteListener(data); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function foregroundCallback(): Void { | 
					
						
							|  |  |  | 		System.foreground(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function resumeCallback(): Void { | 
					
						
							|  |  |  | 		System.resume(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function pauseCallback(): Void { | 
					
						
							|  |  |  | 		System.pause(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function backgroundCallback(): Void { | 
					
						
							|  |  |  | 		System.background(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function shutdownCallback(): Void { | 
					
						
							|  |  |  | 		System.shutdown(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function keyboardDownCallback(code: Int): Void { | 
					
						
							|  |  |  | 		keyboard.sendDownEvent(cast code); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function keyboardUpCallback(code: Int): Void { | 
					
						
							|  |  |  | 		keyboard.sendUpEvent(cast code); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function keyboardPressCallback(charCode: Int): Void { | 
					
						
							|  |  |  | 		keyboard.sendPressEvent(String.fromCharCode(charCode)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function mouseDownCallback(button: Int, x: Int, y: Int): Void { | 
					
						
							|  |  |  | 		mouse.sendDownEvent(0, button, x, y); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function mouseUpCallback(button: Int, x: Int, y: Int): Void { | 
					
						
							|  |  |  | 		mouse.sendUpEvent(0, button, x, y); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function mouseMoveCallback(x: Int, y: Int, mx: Int, my: Int): Void { | 
					
						
							|  |  |  | 		mouse.sendMoveEvent(0, x, y, mx, my); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function mouseWheelCallback(delta: Int): Void { | 
					
						
							|  |  |  | 		mouse.sendWheelEvent(0, delta); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function penDownCallback(x: Int, y: Int, pressure: Float): Void { | 
					
						
							|  |  |  | 		pen.sendDownEvent(0, x, y, pressure); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function penUpCallback(x: Int, y: Int, pressure: Float): Void { | 
					
						
							|  |  |  | 		pen.sendUpEvent(0, x, y, pressure); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function penMoveCallback(x: Int, y: Int, pressure: Float): Void { | 
					
						
							|  |  |  | 		pen.sendMoveEvent(0, x, y, pressure); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function gamepadAxisCallback(gamepad: Int, axis: Int, value: Float): Void { | 
					
						
							|  |  |  | 		gamepads[gamepad].sendAxisEvent(axis, value); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function gamepadButtonCallback(gamepad: Int, button: Int, value: Float): Void { | 
					
						
							|  |  |  | 		gamepads[gamepad].sendButtonEvent(button, value); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function audioCallback(samples: Int): Void { | 
					
						
							|  |  |  | 		kha.audio2.Audio._callCallback(samples); | 
					
						
							|  |  |  | 		var buffer = @:privateAccess kha.audio2.Audio.buffer; | 
					
						
							|  |  |  | 		Krom.writeAudioBuffer(buffer.data.buffer, samples); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function init(options: SystemOptions, callback: Window->Void): Void { | 
					
						
							|  |  |  | 		Krom.init(options.title, options.width, options.height, options.framebuffer.samplesPerPixel, options.framebuffer.verticalSync, | 
					
						
							|  |  |  | 			cast options.window.mode, options.window.windowFeatures, Krom.KROM_API); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		start = Krom.getTime(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		haxe.Log.trace = function(v: Dynamic, ?infos: haxe.PosInfos) { | 
					
						
							|  |  |  | 			var message = haxe.Log.formatOutput(v, infos); | 
					
						
							|  |  |  | 			Krom.log(message); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		new Window(0); | 
					
						
							|  |  |  | 		Scheduler.init(); | 
					
						
							|  |  |  | 		Shaders.init(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		var g4 = new kha.krom.Graphics(); | 
					
						
							|  |  |  | 		framebuffer = new Framebuffer(0, null, null, g4); | 
					
						
							|  |  |  | 		framebuffer.init(new kha.graphics2.Graphics1(framebuffer), new kha.graphics4.Graphics2(framebuffer), g4); | 
					
						
							|  |  |  | 		Krom.setCallback(renderCallback); | 
					
						
							|  |  |  | 		Krom.setDropFilesCallback(dropFilesCallback); | 
					
						
							|  |  |  | 		Krom.setCutCopyPasteCallback(cutCallback, copyCallback, pasteCallback); | 
					
						
							|  |  |  | 		Krom.setApplicationStateCallback(foregroundCallback, resumeCallback, pauseCallback, backgroundCallback, shutdownCallback); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		keyboard = new Keyboard(); | 
					
						
							|  |  |  | 		mouse = new MouseImpl(); | 
					
						
							|  |  |  | 		pen = new Pen(); | 
					
						
							|  |  |  | 		gamepads = new Array<Gamepad>(); | 
					
						
							|  |  |  | 		for (i in 0...maxGamepads) { | 
					
						
							|  |  |  | 			gamepads[i] = new Gamepad(i); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Krom.setKeyboardDownCallback(keyboardDownCallback); | 
					
						
							|  |  |  | 		Krom.setKeyboardUpCallback(keyboardUpCallback); | 
					
						
							|  |  |  | 		Krom.setKeyboardPressCallback(keyboardPressCallback); | 
					
						
							|  |  |  | 		Krom.setMouseDownCallback(mouseDownCallback); | 
					
						
							|  |  |  | 		Krom.setMouseUpCallback(mouseUpCallback); | 
					
						
							|  |  |  | 		Krom.setMouseMoveCallback(mouseMoveCallback); | 
					
						
							|  |  |  | 		Krom.setMouseWheelCallback(mouseWheelCallback); | 
					
						
							|  |  |  | 		Krom.setPenDownCallback(penDownCallback); | 
					
						
							|  |  |  | 		Krom.setPenUpCallback(penUpCallback); | 
					
						
							|  |  |  | 		Krom.setPenMoveCallback(penMoveCallback); | 
					
						
							|  |  |  | 		Krom.setGamepadAxisCallback(gamepadAxisCallback); | 
					
						
							|  |  |  | 		Krom.setGamepadButtonCallback(gamepadButtonCallback); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-13 19:50:08 +00:00
										 |  |  | 		kha.audio2.Audio.samplesPerSecond = Krom.getSamplesPerSecond(); | 
					
						
							| 
									
										
										
										
											2025-05-13 19:35:50 +00:00
										 |  |  | 		kha.audio1.Audio._init(); | 
					
						
							| 
									
										
										
										
											2025-05-13 19:50:08 +00:00
										 |  |  | 		kha.audio2.Audio._init(); | 
					
						
							| 
									
										
										
										
											2025-05-13 19:35:50 +00:00
										 |  |  | 		Krom.setAudioCallback(audioCallback); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Scheduler.start(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		callback(Window.get(0)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function initEx(title: String, options: Array<WindowOptions>, windowCallback: Int->Void, callback: Void->Void): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function translateWindowMode(value: Null<WindowMode>): Int { | 
					
						
							|  |  |  | 		if (value == null) { | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return switch (value) { | 
					
						
							|  |  |  | 			case Windowed: 0; | 
					
						
							|  |  |  | 			case Fullscreen: 1; | 
					
						
							|  |  |  | 			case ExclusiveFullscreen: 2; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getScreenRotation(): ScreenRotation { | 
					
						
							|  |  |  | 		return ScreenRotation.RotationNone; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getTime(): Float { | 
					
						
							|  |  |  | 		return Krom.getTime() - start; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getVsync(): Bool { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getRefreshRate(): Int { | 
					
						
							|  |  |  | 		return Krom.displayFrequency(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getSystemId(): String { | 
					
						
							|  |  |  | 		return Krom.systemId(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function vibrate(ms: Int): Void { | 
					
						
							|  |  |  | 		// TODO: Implement | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getLanguage(): String { | 
					
						
							|  |  |  | 		return "en"; // TODO: Implement | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function requestShutdown(): Bool { | 
					
						
							|  |  |  | 		Krom.requestShutdown(); | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getMouse(num: Int): Mouse { | 
					
						
							|  |  |  | 		return mouse; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getPen(num: Int): Pen { | 
					
						
							|  |  |  | 		return pen; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getKeyboard(num: Int): Keyboard { | 
					
						
							|  |  |  | 		return keyboard; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function lockMouse(): Void { | 
					
						
							|  |  |  | 		if (!isMouseLocked()) { | 
					
						
							|  |  |  | 			Krom.lockMouse(); | 
					
						
							|  |  |  | 			for (listener in mouseLockListeners) { | 
					
						
							|  |  |  | 				listener(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function unlockMouse(): Void { | 
					
						
							|  |  |  | 		if (isMouseLocked()) { | 
					
						
							|  |  |  | 			Krom.unlockMouse(); | 
					
						
							|  |  |  | 			for (listener in mouseLockListeners) { | 
					
						
							|  |  |  | 				listener(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function canLockMouse(): Bool { | 
					
						
							|  |  |  | 		return Krom.canLockMouse(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function isMouseLocked(): Bool { | 
					
						
							|  |  |  | 		return Krom.isMouseLocked(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function notifyOfMouseLockChange(func: Void->Void, error: Void->Void): Void { | 
					
						
							|  |  |  | 		if (canLockMouse() && func != null) { | 
					
						
							|  |  |  | 			mouseLockListeners.push(func); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function removeFromMouseLockChange(func: Void->Void, error: Void->Void): Void { | 
					
						
							|  |  |  | 		if (canLockMouse() && func != null) { | 
					
						
							|  |  |  | 			mouseLockListeners.remove(func); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function hideSystemCursor(): Void { | 
					
						
							|  |  |  | 		Krom.showMouse(false); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function showSystemCursor(): Void { | 
					
						
							|  |  |  | 		Krom.showMouse(true); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	static function unload(): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function canSwitchFullscreen(): Bool { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function isFullscreen(): Bool { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function requestFullscreen(): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function exitFullscreen(): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function notifyOfFullscreenChange(func: Void->Void, error: Void->Void): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function removeFromFullscreenChange(func: Void->Void, error: Void->Void): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function changeResolution(width: Int, height: Int): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function setKeepScreenOn(on: Bool): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function loadUrl(url: String): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getGamepadId(index: Int): String { | 
					
						
							|  |  |  | 		return "unknown"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function getGamepadVendor(index: Int): String { | 
					
						
							|  |  |  | 		return "unknown"; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function setGamepadRumble(index: Int, leftAmount: Float, rightAmount: Float): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function safeZone(): Float { | 
					
						
							|  |  |  | 		return 1.0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function login(): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function automaticSafeZone(): Bool { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function setSafeZone(value: Float): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function unlockAchievement(id: Int): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function waitingForLogin(): Bool { | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function disallowUserChange(): Void {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public static function allowUserChange(): Void {} | 
					
						
							|  |  |  | } |