497 lines
16 KiB
Haxe
497 lines
16 KiB
Haxe
package kha;
|
|
|
|
import kha.graphics4.TextureFormat;
|
|
import kha.input.Gamepad;
|
|
import kha.input.KeyCode;
|
|
import kha.input.Keyboard;
|
|
import kha.input.Mouse;
|
|
import kha.input.MouseImpl;
|
|
import kha.input.Pen;
|
|
import kha.input.Surface;
|
|
import kha.System;
|
|
|
|
class SystemImpl {
|
|
static var framebuffer: Framebuffer;
|
|
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 {
|
|
haxe.Log.trace = function(v: Dynamic, ?infos: haxe.PosInfos) {
|
|
var message = infos != null ? infos.className + ":" + infos.lineNumber + ": " + v : Std.string(v);
|
|
kinc_log(StringHelper.convert(message));
|
|
};
|
|
init_kore(StringHelper.convert(options.title), options.width, options.height, options.framebuffer.samplesPerPixel, options.framebuffer.verticalSync,
|
|
cast options.window.mode, options.window.windowFeatures);
|
|
|
|
new Window(0);
|
|
Scheduler.init();
|
|
Shaders.init();
|
|
|
|
var g4 = new kha.korehl.graphics4.Graphics();
|
|
framebuffer = new Framebuffer(0, null, null, g4);
|
|
framebuffer.init(new kha.graphics2.Graphics1(framebuffer), new kha.korehl.graphics4.Graphics2(framebuffer), g4);
|
|
final samplesRef: hl.Ref<Int> = kha.audio2.Audio.samplesPerSecond;
|
|
kinc_init_audio(kha.audio2.Audio._callCallback, kha.audio2.Audio._readSample, samplesRef);
|
|
kha.audio2.Audio.samplesPerSecond = samplesRef.get();
|
|
kha.audio1.Audio._init();
|
|
kha.audio2.Audio._init();
|
|
keyboard = new kha.input.Keyboard();
|
|
mouse = new kha.input.MouseImpl();
|
|
pen = new kha.input.Pen();
|
|
gamepads = new Array<Gamepad>();
|
|
for (i in 0...4) {
|
|
gamepads[i] = new kha.input.Gamepad(i);
|
|
gamepads[i].connected = kinc_gamepad_connected(i);
|
|
}
|
|
surface = new kha.input.Surface();
|
|
mouseLockListeners = new Array();
|
|
kinc_register_keyboard(keyDown, keyUp, keyPress);
|
|
kinc_register_mouse(mouseDown, mouseUp, mouseMove, mouseWheel);
|
|
kinc_register_pen(penDown, penUp, penMove);
|
|
kinc_register_gamepad(gamepadAxis, gamepadButton);
|
|
kinc_register_surface(touchStart, touchEnd, touchMove);
|
|
kinc_register_sensor(kha.input.Sensor._accelerometerChanged, kha.input.Sensor._gyroscopeChanged);
|
|
kinc_register_callbacks(foreground, resume, pause, background, shutdown);
|
|
kinc_register_dropfiles(dropFiles);
|
|
kinc_register_copycutpaste(copy, cut, paste);
|
|
|
|
Scheduler.start();
|
|
callback(Window.get(0));
|
|
|
|
run_kore();
|
|
}
|
|
|
|
public static function initEx(title: String, options: Array<WindowOptions>, windowCallback: Int->Void, callback: Void->Void): Void {}
|
|
|
|
@:keep
|
|
public static function frame(): Void {
|
|
Scheduler.executeFrame();
|
|
System.render([framebuffer]);
|
|
|
|
for (i in 0...4) {
|
|
if (gamepads[i].connected && !kinc_gamepad_connected(i)) {
|
|
Gamepad.sendDisconnectEvent(i);
|
|
}
|
|
else if (!gamepads[i].connected && kinc_gamepad_connected(i)) {
|
|
Gamepad.sendConnectEvent(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function getTime(): Float {
|
|
return kinc_get_time();
|
|
}
|
|
|
|
public static function windowWidth(windowId: Int): Int {
|
|
return kinc_get_window_width(windowId);
|
|
}
|
|
|
|
public static function windowHeight(windowId: Int): Int {
|
|
return kinc_get_window_height(windowId);
|
|
}
|
|
|
|
public static function getScreenRotation(): ScreenRotation {
|
|
return ScreenRotation.RotationNone;
|
|
}
|
|
|
|
public static function getSystemId(): String {
|
|
final b: hl.Bytes = kinc_get_system_id();
|
|
return @:privateAccess String.fromUTF8(b);
|
|
}
|
|
|
|
public static function vibrate(ms: Int): Void {
|
|
kinc_vibrate(ms);
|
|
}
|
|
|
|
public static function getLanguage(): String {
|
|
final b: hl.Bytes = kinc_get_language();
|
|
return @:privateAccess String.fromUTF8(b);
|
|
}
|
|
|
|
public static function requestShutdown(): Bool {
|
|
kinc_request_shutdown();
|
|
return true;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
public static function lockMouse(windowId: Int = 0): Void {
|
|
if (!isMouseLocked()) {
|
|
kinc_mouse_lock(windowId);
|
|
for (listener in mouseLockListeners) {
|
|
listener();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function unlockMouse(windowId: Int = 0): Void {
|
|
if (isMouseLocked()) {
|
|
kinc_mouse_unlock(windowId);
|
|
for (listener in mouseLockListeners) {
|
|
listener();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function canLockMouse(windowId: Int = 0): Bool {
|
|
return kinc_can_lock_mouse(windowId);
|
|
}
|
|
|
|
public static function isMouseLocked(windowId: Int = 0): Bool {
|
|
return kinc_is_mouse_locked(windowId);
|
|
}
|
|
|
|
public static function notifyOfMouseLockChange(func: Void->Void, error: Void->Void): Void {
|
|
if (canLockMouse(0) && func != null) {
|
|
mouseLockListeners.push(func);
|
|
}
|
|
}
|
|
|
|
public static function removeFromMouseLockChange(func: Void->Void, error: Void->Void): Void {
|
|
if (canLockMouse(0) && func != null) {
|
|
mouseLockListeners.remove(func);
|
|
}
|
|
}
|
|
|
|
public static function hideSystemCursor(): Void {
|
|
kinc_show_mouse(false);
|
|
}
|
|
|
|
public static function showSystemCursor(): Void {
|
|
kinc_show_mouse(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 function mouseDown(windowId: Int, button: Int, x: Int, y: Int): Void {
|
|
mouse.sendDownEvent(windowId, button, x, y);
|
|
}
|
|
|
|
public static function mouseUp(windowId: Int, button: Int, x: Int, y: Int): Void {
|
|
mouse.sendUpEvent(windowId, button, x, y);
|
|
}
|
|
|
|
public static function mouseMove(windowId: Int, x: Int, y: Int, movementX: Int, movementY: Int): Void {
|
|
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 gamepadAxis(gamepad: Int, axis: Int, value: FastFloat): Void {
|
|
gamepads[gamepad].sendAxisEvent(axis, value);
|
|
}
|
|
|
|
public static function gamepadButton(gamepad: Int, button: Int, value: FastFloat): 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(): hl.Bytes {
|
|
if (System.copyListener != null) {
|
|
final text = System.copyListener();
|
|
if (text == null)
|
|
return null;
|
|
return StringHelper.convert(text);
|
|
}
|
|
else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static function cut(): hl.Bytes {
|
|
if (System.cutListener != null) {
|
|
final text = System.cutListener();
|
|
if (text == null)
|
|
return null;
|
|
return StringHelper.convert(text);
|
|
}
|
|
else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static function paste(data: hl.Bytes): Void {
|
|
final text = @:privateAccess String.fromUTF8(data);
|
|
if (System.pasteListener != null) {
|
|
System.pasteListener(text);
|
|
}
|
|
}
|
|
|
|
static var fullscreenListeners: Array<Void->Void> = new Array();
|
|
static var previousWidth: Int = 0;
|
|
static var previousHeight: Int = 0;
|
|
|
|
public static function canSwitchFullscreen(): Bool {
|
|
return true;
|
|
}
|
|
|
|
public static function isFullscreen(): Bool {
|
|
return kinc_system_is_fullscreen();
|
|
}
|
|
|
|
public static function requestFullscreen(): Void {
|
|
if (!isFullscreen()) {
|
|
previousWidth = kinc_get_window_width(0);
|
|
previousHeight = kinc_get_window_height(0);
|
|
kinc_system_request_fullscreen();
|
|
for (listener in fullscreenListeners) {
|
|
listener();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function exitFullscreen(): Void {
|
|
if (isFullscreen()) {
|
|
if (previousWidth == 0 || previousHeight == 0) {
|
|
previousWidth = kinc_get_window_width(0);
|
|
previousHeight = kinc_get_window_height(0);
|
|
}
|
|
kinc_system_exit_fullscreen(previousWidth, previousHeight);
|
|
for (listener in fullscreenListeners) {
|
|
listener();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function notifyOfFullscreenChange(func: Void->Void, error: Void->Void): Void {
|
|
if (canSwitchFullscreen() && func != null) {
|
|
fullscreenListeners.push(func);
|
|
}
|
|
}
|
|
|
|
public static function removeFromFullscreenChange(func: Void->Void, error: Void->Void): Void {
|
|
if (canSwitchFullscreen() && func != null) {
|
|
fullscreenListeners.remove(func);
|
|
}
|
|
}
|
|
|
|
public static function changeResolution(width: Int, height: Int): Void {
|
|
kinc_system_change_resolution(width, height);
|
|
}
|
|
|
|
public static function setKeepScreenOn(on: Bool): Void {
|
|
kinc_system_set_keepscreenon(on);
|
|
}
|
|
|
|
public static function loadUrl(url: String): Void {
|
|
kinc_system_load_url(StringHelper.convert(url));
|
|
}
|
|
|
|
public static function getGamepadId(index: Int): String {
|
|
final b: hl.Bytes = kinc_get_gamepad_id(index);
|
|
return @:privateAccess String.fromUTF8(b);
|
|
}
|
|
|
|
public static function getGamepadVendor(index: Int): String {
|
|
final b: hl.Bytes = kinc_get_gamepad_vendor(index);
|
|
return @:privateAccess String.fromUTF8(b);
|
|
}
|
|
|
|
public static function setGamepadRumble(index: Int, leftAmount: Float, rightAmount: Float) {}
|
|
|
|
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 {}
|
|
|
|
@:hlNative("std", "init_kore") static function init_kore(title: hl.Bytes, width: Int, height: Int, samplesPerPixel: Int, vSync: Bool, windowMode: Int,
|
|
windowFeatures: Int): Void {}
|
|
|
|
@:hlNative("std", "run_kore") static function run_kore(): Void {}
|
|
|
|
@:hlNative("std", "kinc_init_audio") static function kinc_init_audio(callCallback: Int->Void, readSample: Void->FastFloat,
|
|
outSamplesPerSecond: hl.Ref<Int>): Void {}
|
|
|
|
@:hlNative("std", "kinc_log") static function kinc_log(v: hl.Bytes): Void {}
|
|
|
|
@:hlNative("std", "kinc_get_time") static function kinc_get_time(): Float {
|
|
return 0;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_get_window_width") static function kinc_get_window_width(window: Int): Int {
|
|
return 0;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_get_window_height") static function kinc_get_window_height(window: Int): Int {
|
|
return 0;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_get_system_id") static function kinc_get_system_id(): hl.Bytes {
|
|
return null;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_vibrate") static function kinc_vibrate(ms: Int): Void {}
|
|
|
|
@:hlNative("std", "kinc_get_language") static function kinc_get_language(): hl.Bytes {
|
|
return null;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_request_shutdown") static function kinc_request_shutdown(): Void {}
|
|
|
|
@:hlNative("std", "kinc_mouse_lock") static function kinc_mouse_lock(windowId: Int): Void {}
|
|
|
|
@:hlNative("std", "kinc_mouse_unlock") static function kinc_mouse_unlock(windowId: Int): Void {}
|
|
|
|
@:hlNative("std", "kinc_can_lock_mouse") static function kinc_can_lock_mouse(windowId: Int): Bool {
|
|
return false;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_is_mouse_locked") static function kinc_is_mouse_locked(windowId: Int): Bool {
|
|
return false;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_show_mouse") static function kinc_show_mouse(show: Bool): Void {}
|
|
|
|
@:hlNative("std", "kinc_system_is_fullscreen") static function kinc_system_is_fullscreen(): Bool {
|
|
return false;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_system_request_fullscreen") static function kinc_system_request_fullscreen(): Void {}
|
|
|
|
@:hlNative("std", "kinc_system_exit_fullscreen") static function kinc_system_exit_fullscreen(previousWidth: Int, previousHeight: Int): Void {}
|
|
|
|
@:hlNative("std", "kinc_register_keyboard") static function kinc_register_keyboard(keyDown: KeyCode->Void, keyUp: KeyCode->Void,
|
|
keyPress: Int->Void): Void {}
|
|
|
|
@:hlNative("std", "kinc_register_mouse") static function kinc_register_mouse(mouseDown: Int->Int->Int->Int->Void, mouseUp: Int->Int->Int->Int->Void,
|
|
mouseMove: Int->Int->Int->Int->Int->Void, mouseWheel: Int->Int->Void): Void {}
|
|
|
|
@:hlNative("std", "kinc_register_pen") static function kinc_register_pen(penDown: Int->Int->Int->Float->Void, penUp: Int->Int->Int->Float->Void,
|
|
penMove: Int->Int->Int->Float->Void): Void {}
|
|
|
|
@:hlNative("std", "kinc_register_gamepad") static function kinc_register_gamepad(gamepadAxis: Int->Int->FastFloat->Void,
|
|
gamepadButton: Int->Int->FastFloat->Void): Void {}
|
|
|
|
@:hlNative("std", "kinc_register_surface") static function kinc_register_surface(touchStart: Int->Int->Int->Void, touchEnd: Int->Int->Int->Void,
|
|
touchMove: Int->Int->Int->Void): Void {}
|
|
|
|
@:hlNative("std", "kinc_register_sensor") static function kinc_register_sensor(accelerometerChanged: Float->Float->Float->Void,
|
|
gyroscopeChanged: Float->Float->Float->Void): Void {}
|
|
|
|
@:hlNative("std", "kinc_register_callbacks") static function kinc_register_callbacks(foreground: Void->Void, resume: Void->Void, pause: Void->Void,
|
|
background: Void->Void, shutdown: Void->Void): Void {}
|
|
|
|
@:hlNative("std", "kinc_register_dropfiles") static function kinc_register_dropfiles(dropFiles: String->Void): Void {}
|
|
|
|
@:hlNative("std", "kinc_register_copycutpaste") static function kinc_register_copycutpaste(copy: Void->hl.Bytes, cut: Void->hl.Bytes,
|
|
paste: hl.Bytes->Void): Void {}
|
|
|
|
@:hlNative("std", "kinc_system_change_resolution") static function kinc_system_change_resolution(width: Int, height: Int): Void {}
|
|
|
|
@:hlNative("std", "kinc_system_set_keepscreenon") static function kinc_system_set_keepscreenon(on: Bool): Void {}
|
|
|
|
@:hlNative("std", "kinc_system_load_url") static function kinc_system_load_url(url: hl.Bytes): Void {}
|
|
|
|
@:hlNative("std", "kinc_get_gamepad_id") static function kinc_get_gamepad_id(index: Int): hl.Bytes {
|
|
return null;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_get_gamepad_vendor") static function kinc_get_gamepad_vendor(index: Int): hl.Bytes {
|
|
return null;
|
|
}
|
|
|
|
@:hlNative("std", "kinc_gamepad_connected") static function kinc_gamepad_connected(index: Int): Bool {
|
|
return false;
|
|
}
|
|
}
|