520 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			520 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha; | ||
|  | 
 | ||
|  | import kha.input.Gamepad; | ||
|  | import kha.input.KeyCode; | ||
|  | import kha.input.Keyboard; | ||
|  | import kha.input.Mouse; | ||
|  | import kha.input.Pen; | ||
|  | import kha.input.Sensor; | ||
|  | import kha.input.SensorType; | ||
|  | import kha.input.Surface; | ||
|  | import kha.System; | ||
|  | import kha.graphics4.TextureFormat; | ||
|  | import kha.graphics4.DepthStencilFormat; | ||
|  | #if ANDROID | ||
|  | #if VR_CARDBOARD | ||
|  | import kha.kore.vr.CardboardVrInterface; | ||
|  | #end | ||
|  | #if !VR_CARDBOARD | ||
|  | import kha.kore.vr.VrInterface; | ||
|  | #end | ||
|  | #end | ||
|  | #if !ANDROID | ||
|  | #if VR_RIFT | ||
|  | import kha.kore.vr.VrInterfaceRift; | ||
|  | #end | ||
|  | #if !VR_RIFT | ||
|  | import kha.vr.VrInterfaceEmulated; | ||
|  | #end | ||
|  | #end | ||
|  | @:headerCode("
 | ||
|  | #include <kinc/system.h> | ||
|  | #include <kinc/input/gamepad.h> | ||
|  | #include <kinc/input/mouse.h> | ||
|  | #include <kinc/input/pen.h> | ||
|  | #include <kinc/display.h> | ||
|  | #include <kinc/window.h> | ||
|  | 
 | ||
|  | kinc_window_options_t convertWindowOptions(::kha::WindowOptions win); | ||
|  | kinc_framebuffer_options_t convertFramebufferOptions(::kha::FramebufferOptions frame); | ||
|  | 
 | ||
|  | void init_kinc(const char *name, int width, int height, kinc_window_options_t *win, kinc_framebuffer_options_t *frame); | ||
|  | void post_kinc_init(); | ||
|  | void kha_kinc_init_audio(void); | ||
|  | void run_kinc(); | ||
|  | const char *getGamepadId(int index); | ||
|  | const char *getGamepadVendor(int index); | ||
|  | void setGamepadRumble(int index, float left, float right); | ||
|  | ")
 | ||
|  | @:keep | ||
|  | class SystemImpl { | ||
|  | 	public static var needs3d: Bool = false; | ||
|  | 
 | ||
|  | 	public static function getMouse(num: Int): Mouse { | ||
|  | 		if (num != 0) | ||
|  | 			return null; | ||
|  | 		return mouse; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function getPen(num: Int): Pen { | ||
|  | 		if (num != 0) | ||
|  | 			return null; | ||
|  | 		return pen; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function getKeyboard(num: Int): Keyboard { | ||
|  | 		if (num != 0) | ||
|  | 			return null; | ||
|  | 		return keyboard; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("return kinc_time();") | ||
|  | 	public static function getTime(): Float { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function windowWidth(windowId: Int): Int { | ||
|  | 		return untyped __cpp__("kinc_window_width(windowId)"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function windowHeight(windowId: Int): Int { | ||
|  | 		return untyped __cpp__("kinc_window_height(windowId)"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function screenDpi(): Int { | ||
|  | 		return untyped __cpp__("kinc_display_current_mode(kinc_primary_display()).pixels_per_inch"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function getVsync(): Bool { | ||
|  | 		return true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function getRefreshRate(): Int { | ||
|  | 		return 60; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function getScreenRotation(): ScreenRotation { | ||
|  | 		return ScreenRotation.RotationNone; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("return ::String(kinc_system_id());") | ||
|  | 	public static function getSystemId(): String { | ||
|  | 		return ""; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function vibrate(ms: Int): Void { | ||
|  | 		untyped __cpp__("kinc_vibrate(ms)"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("return ::String(kinc_language());") | ||
|  | 	public static function getLanguage(): String { | ||
|  | 		return "en"; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function requestShutdown(): Bool { | ||
|  | 		untyped __cpp__("kinc_stop()"); | ||
|  | 		return true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static var framebuffers: Array<Framebuffer> = new Array(); | ||
|  | 	static var keyboard: Keyboard; | ||
|  | 	static var mouse: kha.input.Mouse; | ||
|  | 	static var pen: kha.input.Pen; | ||
|  | 	static var gamepads: Array<Gamepad>; | ||
|  | 	static var surface: Surface; | ||
|  | 	static var mouseLockListeners: Array<Void->Void>; | ||
|  | 
 | ||
|  | 	public static function init(options: SystemOptions, callback: Window->Void): Void { | ||
|  | 		initKinc(options.title, options.width, options.height, options.window, options.framebuffer); | ||
|  | 		Window._init(); | ||
|  | 
 | ||
|  | 		kha.Worker._mainThread = sys.thread.Thread.current(); | ||
|  | 
 | ||
|  | 		untyped __cpp__("post_kinc_init()"); | ||
|  | 
 | ||
|  | 		Shaders.init(); | ||
|  | 
 | ||
|  | 		#if (!VR_GEAR_VR && !VR_RIFT) | ||
|  | 		var g4 = new kha.kore.graphics4.Graphics(); | ||
|  | 		g4.window = 0; | ||
|  | 		// var g5 = new kha.kore.graphics5.Graphics(); | ||
|  | 		var framebuffer = new Framebuffer(0, null, null, g4 /*, g5*/); | ||
|  | 		framebuffer.init(new kha.graphics2.Graphics1(framebuffer), new kha.kore.graphics4.Graphics2(framebuffer), g4 /*, g5*/); | ||
|  | 		framebuffers.push(framebuffer); | ||
|  | 		#end | ||
|  | 
 | ||
|  | 		postInit(callback); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function onWindowCreated(index: Int) { | ||
|  | 		var g4 = new kha.kore.graphics4.Graphics(); | ||
|  | 		g4.window = index; | ||
|  | 		var framebuffer = new Framebuffer(index, null, null, g4); | ||
|  | 		framebuffer.init(new kha.graphics2.Graphics1(framebuffer), new kha.kore.graphics4.Graphics2(framebuffer), g4); | ||
|  | 		framebuffers.push(framebuffer); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function postInit(callback: Window->Void) { | ||
|  | 		mouseLockListeners = new Array(); | ||
|  | 		haxe.Timer.stamp(); | ||
|  | 		Sensor.get(SensorType.Accelerometer); // force compilation | ||
|  | 		keyboard = new kha.kore.Keyboard(); | ||
|  | 		mouse = new kha.input.MouseImpl(); | ||
|  | 		pen = new kha.input.Pen(); | ||
|  | 		gamepads = new Array<Gamepad>(); | ||
|  | 		for (i in 0...4) { | ||
|  | 			gamepads[i] = new Gamepad(i); | ||
|  | 			gamepads[i].connected = checkGamepadConnected(i); | ||
|  | 		} | ||
|  | 		surface = new Surface(); | ||
|  | 		kha.audio2.Audio._init(); | ||
|  | 		kha.audio1.Audio._init(); | ||
|  | 		untyped __cpp__("kha_kinc_init_audio()"); | ||
|  | 		Scheduler.init(); | ||
|  | 		loadFinished(); | ||
|  | 		callback(Window.get(0)); | ||
|  | 
 | ||
|  | 		untyped __cpp__("run_kinc()"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function loadFinished() { | ||
|  | 		Scheduler.start(); | ||
|  | 
 | ||
|  | 		/* | ||
|  | 			#if ANDROID | ||
|  | 				#if VR_GEAR_VR | ||
|  | 					kha.vr.VrInterface.instance = new kha.kore.vr.VrInterface(); | ||
|  | 				#end | ||
|  | 				#if !VR_GEAR_VR | ||
|  | 					kha.vr.VrInterface.instance = new CardboardVrInterface(); | ||
|  | 				#end | ||
|  | 			#end | ||
|  | 			#if !ANDROID | ||
|  | 				#if VR_RIFT | ||
|  | 					kha.vr.VrInterface.instance = new VrInterfaceRift(); | ||
|  | 				#end | ||
|  | 				#if !VR_RIFT | ||
|  | 					kha.vr.VrInterface.instance = new kha.vr.VrInterfaceEmulated(); | ||
|  | 				#end | ||
|  | 			#end | ||
|  | 		 */ | ||
|  | 
 | ||
|  | 		// (DK) moved | ||
|  | 		/*Shaders.init(); | ||
|  | 
 | ||
|  | 			#if (!VR_GEAR_VR && !VR_RIFT) | ||
|  | 			var g4 = new kha.kore.graphics4.Graphics(); | ||
|  | 			framebuffers.push(new Framebuffer(null, null, g4)); | ||
|  | 			framebuffers[0].init(new kha.graphics2.Graphics1(framebuffers[0]), new kha.kore.graphics4.Graphics2(framebuffers[0]), g4); | ||
|  | 
 | ||
|  | 			g4 = new kha.kore.graphics4.Graphics(); | ||
|  | 			framebuffers.push(new Framebuffer(null, null, g4)); | ||
|  | 			framebuffers[1].init(new kha.graphics2.Graphics1(framebuffers[1]), new kha.kore.graphics4.Graphics2(framebuffers[1]), g4); | ||
|  | 			#end | ||
|  | 		 */} | ||
|  | 
 | ||
|  | 	public static function lockMouse(windowId: Int = 0): Void { | ||
|  | 		if (!isMouseLocked()) { | ||
|  | 			untyped __cpp__("kinc_mouse_lock(windowId);"); | ||
|  | 			for (listener in mouseLockListeners) { | ||
|  | 				listener(); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function unlockMouse(windowId: Int = 0): Void { | ||
|  | 		if (isMouseLocked()) { | ||
|  | 			untyped __cpp__("kinc_mouse_unlock();"); | ||
|  | 			for (listener in mouseLockListeners) { | ||
|  | 				listener(); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function canLockMouse(windowId: Int = 0): Bool { | ||
|  | 		return untyped __cpp__("kinc_mouse_can_lock()"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function isMouseLocked(windowId: Int = 0): Bool { | ||
|  | 		return untyped __cpp__("kinc_mouse_is_locked()"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function notifyOfMouseLockChange(func: Void->Void, error: Void->Void, windowId: Int = 0): Void { | ||
|  | 		if (canLockMouse(windowId) && func != null) { | ||
|  | 			mouseLockListeners.push(func); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function removeFromMouseLockChange(func: Void->Void, error: Void->Void, windowId: Int = 0): Void { | ||
|  | 		if (canLockMouse(windowId) && func != null) { | ||
|  | 			mouseLockListeners.remove(func); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function hideSystemCursor(): Void { | ||
|  | 		untyped __cpp__("kinc_mouse_hide();"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function showSystemCursor(): Void { | ||
|  | 		untyped __cpp__("kinc_mouse_show();"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function setSystemCursor(cursor: Int): Void { | ||
|  | 		untyped __cpp__("kinc_mouse_set_cursor(cursor)"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function frame() { | ||
|  | 		/* | ||
|  | 			#if !ANDROID | ||
|  | 			#if !VR_RIFT | ||
|  | 				if (framebuffer == null) return; | ||
|  | 				var vrInterface: VrInterfaceEmulated = cast(VrInterface.instance, VrInterfaceEmulated); | ||
|  | 				vrInterface.framebuffer = framebuffer; | ||
|  | 			#end | ||
|  | 			#else | ||
|  | 				#if VR_CARDBOARD | ||
|  | 					var vrInterface: CardboardVrInterface = cast(VrInterface.instance, CardboardVrInterface); | ||
|  | 					vrInterface.framebuffer = framebuffer; | ||
|  | 				#end | ||
|  | 			#end | ||
|  | 		 */ | ||
|  | 
 | ||
|  | 		LoaderImpl.tick(); | ||
|  | 		Scheduler.executeFrame(); | ||
|  | 		System.render(framebuffers); | ||
|  | 		if (kha.kore.graphics4.Graphics.lastWindow != -1) { | ||
|  | 			var win = kha.kore.graphics4.Graphics.lastWindow; | ||
|  | 			untyped __cpp__("kinc_g4_end({0})", win); | ||
|  | 		} | ||
|  | 		else { | ||
|  | 			untyped __cpp__("kinc_g4_begin(0)"); | ||
|  | 			untyped __cpp__("kinc_g4_clear(KINC_G4_CLEAR_COLOR | KINC_G4_CLEAR_DEPTH | KINC_G4_CLEAR_STENCIL, 0, 0.0f, 0)"); | ||
|  | 			untyped __cpp__("kinc_g4_end(0)"); | ||
|  | 		} | ||
|  | 		kha.kore.graphics4.Graphics.lastWindow = -1; | ||
|  | 
 | ||
|  | 		for (i in 0...4) { | ||
|  | 			if (gamepads[i].connected && !checkGamepadConnected(i)) { | ||
|  | 				Gamepad.sendDisconnectEvent(i); | ||
|  | 			} | ||
|  | 			else if (!gamepads[i].connected && checkGamepadConnected(i)) { | ||
|  | 				Gamepad.sendConnectEvent(i); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("return kinc_gamepad_connected(i);") | ||
|  | 	static function checkGamepadConnected(i: Int): Bool { | ||
|  | 		return true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function keyDown(code: KeyCode): Void { | ||
|  | 		keyboard.sendDownEvent(code); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function keyUp(code: KeyCode): Void { | ||
|  | 		keyboard.sendUpEvent(code); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function keyPress(char: Int): Void { | ||
|  | 		keyboard.sendPressEvent(String.fromCharCode(char)); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static var mouseX: Int; | ||
|  | 	public static var mouseY: Int; | ||
|  | 
 | ||
|  | 	public static function mouseDown(windowId: Int, button: Int, x: Int, y: Int): Void { | ||
|  | 		mouseX = x; | ||
|  | 		mouseY = y; | ||
|  | 		mouse.sendDownEvent(windowId, button, x, y); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function mouseUp(windowId: Int, button: Int, x: Int, y: Int): Void { | ||
|  | 		mouseX = x; | ||
|  | 		mouseY = y; | ||
|  | 		mouse.sendUpEvent(windowId, button, x, y); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function mouseMove(windowId: Int, x: Int, y: Int, movementX: Int, movementY: Int): Void { | ||
|  | 		// var movementX = x - mouseX; | ||
|  | 		// var movementY = y - mouseY; | ||
|  | 		mouseX = x; | ||
|  | 		mouseY = y; | ||
|  | 		mouse.sendMoveEvent(windowId, x, y, movementX, movementY); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function mouseWheel(windowId: Int, delta: Int): Void { | ||
|  | 		mouse.sendWheelEvent(windowId, delta); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function mouseLeave(windowId: Int): Void { | ||
|  | 		mouse.sendLeaveEvent(windowId); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function penDown(windowId: Int, x: Int, y: Int, pressure: Float): Void { | ||
|  | 		pen.sendDownEvent(windowId, x, y, pressure); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function penUp(windowId: Int, x: Int, y: Int, pressure: Float): Void { | ||
|  | 		pen.sendUpEvent(windowId, x, y, pressure); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function penMove(windowId: Int, x: Int, y: Int, pressure: Float): Void { | ||
|  | 		pen.sendMoveEvent(windowId, x, y, pressure); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function penEraserDown(windowId: Int, x: Int, y: Int, pressure: Float): Void { | ||
|  | 		pen.sendEraserDownEvent(windowId, x, y, pressure); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function penEraserUp(windowId: Int, x: Int, y: Int, pressure: Float): Void { | ||
|  | 		pen.sendEraserUpEvent(windowId, x, y, pressure); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function penEraserMove(windowId: Int, x: Int, y: Int, pressure: Float): Void { | ||
|  | 		pen.sendEraserMoveEvent(windowId, x, y, pressure); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function gamepadAxis(gamepad: Int, axis: Int, value: Float): Void { | ||
|  | 		gamepads[gamepad].sendAxisEvent(axis, value); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function gamepadButton(gamepad: Int, button: Int, value: Float): Void { | ||
|  | 		gamepads[gamepad].sendButtonEvent(button, value); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function touchStart(index: Int, x: Int, y: Int): Void { | ||
|  | 		surface.sendTouchStartEvent(index, x, y); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function touchEnd(index: Int, x: Int, y: Int): Void { | ||
|  | 		surface.sendTouchEndEvent(index, x, y); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function touchMove(index: Int, x: Int, y: Int): Void { | ||
|  | 		surface.sendMoveEvent(index, x, y); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function foreground(): Void { | ||
|  | 		System.foreground(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function resume(): Void { | ||
|  | 		System.resume(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function pause(): Void { | ||
|  | 		System.pause(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function background(): Void { | ||
|  | 		System.background(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function shutdown(): Void { | ||
|  | 		System.shutdown(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function dropFiles(filePath: String): Void { | ||
|  | 		System.dropFiles(filePath); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function copy(): String { | ||
|  | 		if (System.copyListener != null) { | ||
|  | 			return System.copyListener(); | ||
|  | 		} | ||
|  | 		else { | ||
|  | 			return null; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function cut(): String { | ||
|  | 		if (System.cutListener != null) { | ||
|  | 			return System.cutListener(); | ||
|  | 		} | ||
|  | 		else { | ||
|  | 			return null; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function paste(data: String): Void { | ||
|  | 		if (System.pasteListener != null) { | ||
|  | 			System.pasteListener(data); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("kinc_copy_to_clipboard(text.c_str());") | ||
|  | 	public static function copyToClipboard(text: String) {} | ||
|  | 
 | ||
|  | 	@:functionCode("kinc_login();") | ||
|  | 	public static function login(): Void {} | ||
|  | 
 | ||
|  | 	@:functionCode("return kinc_waiting_for_login();") | ||
|  | 	public static function waitingForLogin(): Bool { | ||
|  | 		return false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("kinc_disallow_user_change();") | ||
|  | 	public static function disallowUserChange(): Void {} | ||
|  | 
 | ||
|  | 	@:functionCode("kinc_allow_user_change();") | ||
|  | 	public static function allowUserChange(): Void {} | ||
|  | 
 | ||
|  | 	public static function loginevent(): Void { | ||
|  | 		if (System.loginListener != null) { | ||
|  | 			System.loginListener(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function logoutevent(): Void { | ||
|  | 		if (System.logoutListener != null) { | ||
|  | 			System.logoutListener(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("
 | ||
|  | 		kinc_window_options_t window = convertWindowOptions(win); | ||
|  | 		kinc_framebuffer_options_t framebuffer = convertFramebufferOptions(frame); | ||
|  | 		init_kinc(name, width, height, &window, &framebuffer); | ||
|  | 	")
 | ||
|  | 	static function initKinc(name: String, width: Int, height: Int, win: WindowOptions, frame: FramebufferOptions): Void {} | ||
|  | 
 | ||
|  | 	public static function setKeepScreenOn(on: Bool): Void { | ||
|  | 		untyped __cpp__("kinc_set_keep_screen_on(on)"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function loadUrl(url: String): Void { | ||
|  | 		untyped __cpp__("kinc_load_url(url)"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("return ::String(::getGamepadId(index));") | ||
|  | 	public static function getGamepadId(index: Int): String { | ||
|  | 		return "unknown"; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode("return ::String(::getGamepadVendor(index));") | ||
|  | 	public static function getGamepadVendor(index: Int): String { | ||
|  | 		return "unknown"; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function setGamepadRumble(index: Int, leftAmount: Float, rightAmount: Float): Void { | ||
|  | 		untyped __cpp__("::setGamepadRumble(index, leftAmount, rightAmount)"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function safeZone(): Float { | ||
|  | 		return untyped __cpp__("kinc_safe_zone()"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function automaticSafeZone(): Bool { | ||
|  | 		return untyped __cpp__("kinc_automatic_safe_zone()"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function setSafeZone(value: Float): Void { | ||
|  | 		untyped __cpp__("kinc_set_safe_zone(value)"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function unlockAchievement(id: Int): Void { | ||
|  | 		untyped __cpp__("kinc_unlock_achievement(id)"); | ||
|  | 	} | ||
|  | } |