forked from LeenkxTeam/LNXSDK
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)");
|
|
}
|
|
}
|