mirror of
https://git.eaglercraft.rip/eaglercraft/eaglercraft-b1.3.git
synced 2025-04-16 21:47:40 -07:00
1905 lines
63 KiB
Java
1905 lines
63 KiB
Java
package net.lax1dude.eaglercraft.adapter;
|
|
|
|
import java.io.ByteArrayInputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.IntBuffer;
|
|
import java.nio.charset.Charset;
|
|
import java.text.DateFormat;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Collection;
|
|
import java.util.Date;
|
|
import java.util.HashMap;
|
|
import java.util.HashSet;
|
|
import java.util.LinkedList;
|
|
import java.util.Set;
|
|
|
|
import org.teavm.interop.Async;
|
|
import org.teavm.interop.AsyncCallback;
|
|
import org.teavm.jso.JSBody;
|
|
import org.teavm.jso.JSFunctor;
|
|
import org.teavm.jso.JSObject;
|
|
import org.teavm.jso.ajax.ReadyStateChangeHandler;
|
|
import org.teavm.jso.ajax.XMLHttpRequest;
|
|
import org.teavm.jso.browser.TimerHandler;
|
|
import org.teavm.jso.browser.Window;
|
|
import org.teavm.jso.canvas.CanvasRenderingContext2D;
|
|
import org.teavm.jso.dom.events.EventListener;
|
|
import org.teavm.jso.dom.events.KeyboardEvent;
|
|
import org.teavm.jso.dom.events.MessageEvent;
|
|
import org.teavm.jso.dom.events.MouseEvent;
|
|
import org.teavm.jso.dom.events.WheelEvent;
|
|
import org.teavm.jso.dom.html.HTMLCanvasElement;
|
|
import org.teavm.jso.dom.html.HTMLDocument;
|
|
import org.teavm.jso.dom.html.HTMLElement;
|
|
import org.teavm.jso.typedarrays.ArrayBuffer;
|
|
import org.teavm.jso.typedarrays.Float32Array;
|
|
import org.teavm.jso.typedarrays.Int32Array;
|
|
import org.teavm.jso.typedarrays.Uint8Array;
|
|
import org.teavm.jso.webaudio.AudioBuffer;
|
|
import org.teavm.jso.webaudio.AudioBufferSourceNode;
|
|
import org.teavm.jso.webaudio.AudioContext;
|
|
import org.teavm.jso.webaudio.AudioListener;
|
|
import org.teavm.jso.webaudio.DecodeErrorCallback;
|
|
import org.teavm.jso.webaudio.DecodeSuccessCallback;
|
|
import org.teavm.jso.webaudio.GainNode;
|
|
import org.teavm.jso.webaudio.MediaEvent;
|
|
import org.teavm.jso.webaudio.PannerNode;
|
|
import org.teavm.jso.webgl.WebGLBuffer;
|
|
import org.teavm.jso.webgl.WebGLFramebuffer;
|
|
import org.teavm.jso.webgl.WebGLProgram;
|
|
import org.teavm.jso.webgl.WebGLRenderbuffer;
|
|
import org.teavm.jso.webgl.WebGLShader;
|
|
import org.teavm.jso.webgl.WebGLTexture;
|
|
import org.teavm.jso.webgl.WebGLUniformLocation;
|
|
import org.teavm.jso.websocket.CloseEvent;
|
|
import org.teavm.jso.websocket.WebSocket;
|
|
|
|
import net.lax1dude.eaglercraft.AssetRepository;
|
|
import net.lax1dude.eaglercraft.Base64;
|
|
import net.lax1dude.eaglercraft.Client;
|
|
import net.lax1dude.eaglercraft.EarlyLoadScreen;
|
|
import net.lax1dude.eaglercraft.LocalStorageManager;
|
|
import net.lax1dude.eaglercraft.adapter.teavm.WebGLQuery;
|
|
import net.lax1dude.eaglercraft.adapter.teavm.WebGLVertexArray;
|
|
import net.minecraft.src.ISaveFormat;
|
|
import net.minecraft.src.MathHelper;
|
|
import net.lax1dude.eaglercraft.adapter.teavm.IndexedDBFilesystem;
|
|
import net.lax1dude.eaglercraft.adapter.teavm.IndexedDBFilesystem.OpenState;
|
|
import net.lax1dude.eaglercraft.adapter.teavm.WebGL2RenderingContext;
|
|
import static net.lax1dude.eaglercraft.adapter.teavm.WebGL2RenderingContext.*;
|
|
|
|
public class EaglerAdapterImpl2 {
|
|
|
|
public static final boolean _wisWebGL() {
|
|
return true;
|
|
}
|
|
private static boolean isAnisotropicPatched = false;
|
|
public static final boolean _wisAnisotropicPatched() {
|
|
return isAnisotropicPatched;
|
|
}
|
|
public static final String _wgetShaderHeader() {
|
|
return "#version 300 es";
|
|
}
|
|
|
|
@JSBody(params = { }, script = "return window.location.href;")
|
|
private static native String getLocationString();
|
|
|
|
public static final boolean isSSLPage() {
|
|
return getLocationString().startsWith("https");
|
|
}
|
|
|
|
public static final InputStream loadResource(String path) {
|
|
byte[] file = loadResourceBytes(path);
|
|
if (file != null) {
|
|
return new ByteArrayInputStream(file);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static final byte[] loadResourceBytes(String path) {
|
|
return AssetRepository.getResource(path);
|
|
}
|
|
|
|
public static final String fileContents(String path) {
|
|
byte[] contents = loadResourceBytes(path);
|
|
if(contents == null) {
|
|
return null;
|
|
}else {
|
|
return new String(contents, Charset.forName("UTF-8"));
|
|
}
|
|
}
|
|
|
|
public static final String[] fileContentsLines(String path) {
|
|
String contents = fileContents(path);
|
|
if(contents == null) {
|
|
return null;
|
|
}else {
|
|
return contents.replace("\r\n", "\n").split("[\r\n]");
|
|
}
|
|
}
|
|
|
|
@Async
|
|
public static native String downloadAssetPack(String assetPackageURI);
|
|
|
|
private static void downloadAssetPack(String assetPackageURI, final AsyncCallback<String> cb) {
|
|
final XMLHttpRequest request = XMLHttpRequest.create();
|
|
request.setResponseType("arraybuffer");
|
|
request.open("GET", assetPackageURI, true);
|
|
request.setOnReadyStateChange(new ReadyStateChangeHandler() {
|
|
@Override
|
|
public void stateChanged() {
|
|
if(request.getReadyState() == XMLHttpRequest.DONE) {
|
|
Uint8Array bl = Uint8Array.create((ArrayBuffer)request.getResponse());
|
|
loadedPackage = new byte[bl.getByteLength()];
|
|
for(int i = 0; i < loadedPackage.length; ++i) {
|
|
loadedPackage[i] = (byte) bl.get(i);
|
|
}
|
|
cb.complete("yee");
|
|
}
|
|
}
|
|
});
|
|
request.send();
|
|
}
|
|
|
|
@JSBody(params = { "obj" }, script = "window.currentContext = obj;")
|
|
private static native int setContextVar(JSObject obj);
|
|
|
|
@JSBody(params = { "v", "s" }, script = "window[v] = s;")
|
|
public static native void setDebugVar(String v, String s);
|
|
|
|
@JSBody(params = { }, script = "if(window.navigator.userActivation){return window.navigator.userActivation.hasBeenActive;}else{return false;}")
|
|
public static native boolean hasBeenActive();
|
|
|
|
public static HTMLDocument doc = null;
|
|
public static HTMLElement parent = null;
|
|
public static HTMLCanvasElement canvas = null;
|
|
public static CanvasRenderingContext2D canvasContext = null;
|
|
public static HTMLCanvasElement canvasBack = null;
|
|
public static WebGL2RenderingContext webgl = null;
|
|
public static Window win = null;
|
|
private static byte[] loadedPackage = null;
|
|
private static EventListener contextmenu = null;
|
|
private static EventListener mousedown = null;
|
|
private static EventListener mouseup = null;
|
|
private static EventListener mousemove = null;
|
|
private static EventListener keydown = null;
|
|
private static EventListener keyup = null;
|
|
private static EventListener keypress = null;
|
|
private static EventListener wheel = null;
|
|
private static String[] identifier = new String[0];
|
|
|
|
public static final String[] getIdentifier() {
|
|
return identifier;
|
|
}
|
|
|
|
@JSBody(params = { "v" }, script = "try { return \"\"+window.eval(v); } catch(e) { return \"<error>\"; }")
|
|
private static native String getString(String var);
|
|
|
|
public static void onWindowUnload() {
|
|
LocalStorageManager.saveStorageG();
|
|
LocalStorageManager.saveStorageP();
|
|
}
|
|
|
|
@JSBody(params = { "m" }, script = "return m.offsetX;")
|
|
private static native int getOffsetX(MouseEvent m);
|
|
|
|
@JSBody(params = { "m" }, script = "return m.offsetY;")
|
|
private static native int getOffsetY(MouseEvent m);
|
|
|
|
@JSBody(params = { "e" }, script = "return e.which;")
|
|
private static native int getWhich(KeyboardEvent e);
|
|
|
|
public static final void initializeContext(HTMLElement rootElement, String assetPackageURI) {
|
|
parent = rootElement;
|
|
String s = parent.getAttribute("style");
|
|
parent.setAttribute("style", (s == null ? "" : s)+"overflow-x:hidden;overflow-y:hidden;");
|
|
win = Window.current();
|
|
doc = win.getDocument();
|
|
canvas = (HTMLCanvasElement)doc.createElement("canvas");
|
|
width = rootElement.getClientWidth();
|
|
height = rootElement.getClientHeight();
|
|
canvas.setWidth(width);
|
|
canvas.setHeight(height);
|
|
canvasContext = (CanvasRenderingContext2D) canvas.getContext("2d");
|
|
canvas.setAttribute("id", "deevis589723589");
|
|
rootElement.appendChild(canvas);
|
|
canvasBack = (HTMLCanvasElement)doc.createElement("canvas");
|
|
canvasBack.setWidth(width);
|
|
canvasBack.setHeight(height);
|
|
webgl = (WebGL2RenderingContext) canvasBack.getContext("webgl2", youEagler());
|
|
if(webgl == null) {
|
|
throw new RuntimeException("WebGL 2.0 is not supported in your browser ("+getString("window.navigator.userAgent")+")");
|
|
}
|
|
setContextVar(webgl);
|
|
|
|
//String agent = getString("window.navigator.userAgent").toLowerCase();
|
|
//if(agent.contains("windows")) isAnisotropicPatched = false;
|
|
|
|
webgl.getExtension("EXT_texture_filter_anisotropic");
|
|
|
|
win.addEventListener("contextmenu", contextmenu = new EventListener<MouseEvent>() {
|
|
@Override
|
|
public void handleEvent(MouseEvent evt) {
|
|
evt.preventDefault();
|
|
evt.stopPropagation();
|
|
}
|
|
});
|
|
canvas.addEventListener("mousedown", mousedown = new EventListener<MouseEvent>() {
|
|
@Override
|
|
public void handleEvent(MouseEvent evt) {
|
|
int b = evt.getButton();
|
|
buttonStates[b == 1 ? 2 : (b == 2 ? 1 : b)] = true;
|
|
mouseEvents.add(evt);
|
|
evt.preventDefault();
|
|
evt.stopPropagation();
|
|
}
|
|
});
|
|
canvas.addEventListener("mouseup", mouseup = new EventListener<MouseEvent>() {
|
|
@Override
|
|
public void handleEvent(MouseEvent evt) {
|
|
int b = evt.getButton();
|
|
buttonStates[b == 1 ? 2 : (b == 2 ? 1 : b)] = false;
|
|
mouseEvents.add(evt);
|
|
evt.preventDefault();
|
|
evt.stopPropagation();
|
|
}
|
|
});
|
|
canvas.addEventListener("mousemove", mousemove = new EventListener<MouseEvent>() {
|
|
@Override
|
|
public void handleEvent(MouseEvent evt) {
|
|
mouseX = getOffsetX(evt);
|
|
mouseY = canvas.getClientHeight() - getOffsetY(evt);
|
|
mouseDX += evt.getMovementX();
|
|
mouseDY += -evt.getMovementY();
|
|
evt.preventDefault();
|
|
evt.stopPropagation();
|
|
}
|
|
});
|
|
win.addEventListener("keydown", keydown = new EventListener<KeyboardEvent>() {
|
|
@Override
|
|
public void handleEvent(KeyboardEvent evt) {
|
|
//keyStates[remapKey(evt.getKeyCode())] = true;
|
|
keyStates[remapKey(getWhich(evt))] = true;
|
|
keyEvents.add(evt);
|
|
evt.preventDefault();
|
|
evt.stopPropagation();
|
|
}
|
|
});
|
|
win.addEventListener("keyup", keyup = new EventListener<KeyboardEvent>() {
|
|
@Override
|
|
public void handleEvent(KeyboardEvent evt) {
|
|
//keyStates[remapKey(evt.getKeyCode())] = false;
|
|
keyStates[remapKey(getWhich(evt))] = false;
|
|
keyEvents.add(evt);
|
|
evt.preventDefault();
|
|
evt.stopPropagation();
|
|
}
|
|
});
|
|
win.addEventListener("keypress", keypress = new EventListener<KeyboardEvent>() {
|
|
@Override
|
|
public void handleEvent(KeyboardEvent evt) {
|
|
if(enableRepeatEvents && evt.isRepeat()) keyEvents.add(evt);
|
|
evt.preventDefault();
|
|
evt.stopPropagation();
|
|
}
|
|
});
|
|
canvas.addEventListener("wheel", wheel = new EventListener<WheelEvent>() {
|
|
@Override
|
|
public void handleEvent(WheelEvent evt) {
|
|
mouseEvents.add(evt);
|
|
evt.preventDefault();
|
|
evt.stopPropagation();
|
|
}
|
|
});
|
|
win.addEventListener("blur", new EventListener<WheelEvent>() {
|
|
@Override
|
|
public void handleEvent(WheelEvent evt) {
|
|
isWindowFocused = false;
|
|
}
|
|
});
|
|
win.addEventListener("focus", new EventListener<WheelEvent>() {
|
|
@Override
|
|
public void handleEvent(WheelEvent evt) {
|
|
isWindowFocused = true;
|
|
}
|
|
});
|
|
onBeforeCloseRegister();
|
|
execute("window.eagsFileChooser = {\r\n" +
|
|
"inputElement: null,\r\n" +
|
|
"openFileChooser: function(ext, mime){\r\n" +
|
|
"el = window.eagsFileChooser.inputElement = document.createElement(\"input\");\r\n" +
|
|
"el.type = \"file\";\r\n" +
|
|
"el.multiple = false;\r\n" +
|
|
"el.addEventListener(\"change\", function(evt){\r\n" +
|
|
"var f = window.eagsFileChooser.inputElement.files;\r\n" +
|
|
"if(f.length == 0){\r\n" +
|
|
"window.eagsFileChooser.getFileChooserResult = null;\r\n" +
|
|
"}else{\r\n" +
|
|
"(async function(){\r\n" +
|
|
"window.eagsFileChooser.getFileChooserResult = await f[0].arrayBuffer();\r\n" +
|
|
"window.eagsFileChooser.getFileChooserResultName = f[0].name;\r\n" +
|
|
"})();\r\n" +
|
|
"}\r\n" +
|
|
"});\r\n" +
|
|
"window.eagsFileChooser.getFileChooserResult = null;\r\n" +
|
|
"window.eagsFileChooser.getFileChooserResultName = null;\r\n" +
|
|
"el.accept = mime;\r\n" +
|
|
"el.click();\r\n" +
|
|
"},\r\n" +
|
|
"getFileChooserResult: null,\r\n" +
|
|
"getFileChooserResultName: null\r\n" +
|
|
"};");
|
|
|
|
EarlyLoadScreen.paintScreen();
|
|
|
|
OpenState st = IndexedDBFilesystem.initialize();
|
|
if(st != OpenState.OPENED) {
|
|
if(st == OpenState.LOCKED) {
|
|
Client.showDatabaseLockedScreen("\nError: World folder is locked!\n\nYou are already playing Eaglercraft in a different tab.\nClose all other Eaglercraft tabs and reload");
|
|
}else {
|
|
Client.showDatabaseLockedScreen("\nError: World folder could not be loaded!\n\n" + IndexedDBFilesystem.errorDetail());
|
|
}
|
|
throw new Client.AbortedLaunchException();
|
|
}
|
|
|
|
downloadAssetPack(assetPackageURI);
|
|
|
|
try {
|
|
AssetRepository.install(loadedPackage);
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
|
|
if(mouseEvents.isEmpty() && keyEvents.isEmpty() && !hasBeenActive()) {
|
|
EarlyLoadScreen.paintEnable();
|
|
|
|
while(mouseEvents.isEmpty() && keyEvents.isEmpty()) {
|
|
try {
|
|
Thread.sleep(100l);
|
|
} catch (InterruptedException e) {
|
|
;
|
|
}
|
|
}
|
|
}
|
|
|
|
audioctx = AudioContext.create();
|
|
|
|
mouseEvents.clear();
|
|
keyEvents.clear();
|
|
}
|
|
|
|
public static final void destroyContext() {
|
|
|
|
}
|
|
|
|
public static final void removeEventHandlers() {
|
|
win.removeEventListener("contextmenu", contextmenu);
|
|
win.removeEventListener("mousedown", mousedown);
|
|
win.removeEventListener("mouseup", mouseup);
|
|
win.removeEventListener("mousemove", mousemove);
|
|
win.removeEventListener("keydown", keydown);
|
|
win.removeEventListener("keyup", keyup);
|
|
win.removeEventListener("keypress", keypress);
|
|
win.removeEventListener("wheel", wheel);
|
|
}
|
|
|
|
private static LinkedList<MouseEvent> mouseEvents = new LinkedList();
|
|
private static LinkedList<KeyboardEvent> keyEvents = new LinkedList();
|
|
|
|
private static int mouseX = 0;
|
|
private static int mouseY = 0;
|
|
private static double mouseDX = 0.0D;
|
|
private static double mouseDY = 0.0D;
|
|
private static int width = 0;
|
|
private static int height = 0;
|
|
private static boolean enableRepeatEvents = false;
|
|
private static boolean isWindowFocused = true;
|
|
|
|
@JSBody(params = { }, script = "return {antialias: false, depth: true, powerPreference: \"high-performance\", desynchronized: false, preserveDrawingBuffer: false, premultipliedAlpha: false, alpha: false};")
|
|
public static native JSObject youEagler();
|
|
|
|
public static final int _wGL_TEXTURE_2D = TEXTURE_2D;
|
|
public static final int _wGL_DEPTH_TEST = DEPTH_TEST;
|
|
public static final int _wGL_LEQUAL = LEQUAL;
|
|
public static final int _wGL_GEQUAL = GEQUAL;
|
|
public static final int _wGL_GREATER = GREATER;
|
|
public static final int _wGL_LESS = LESS;
|
|
public static final int _wGL_BACK = BACK;
|
|
public static final int _wGL_FRONT = FRONT;
|
|
public static final int _wGL_FRONT_AND_BACK = FRONT_AND_BACK;
|
|
public static final int _wGL_COLOR_BUFFER_BIT = COLOR_BUFFER_BIT;
|
|
public static final int _wGL_DEPTH_BUFFER_BIT = DEPTH_BUFFER_BIT;
|
|
public static final int _wGL_BLEND = BLEND;
|
|
public static final int _wGL_RGBA = RGBA;
|
|
public static final int _wGL_RGB = RGB;
|
|
public static final int _wGL_RGB8 = RGB8;
|
|
public static final int _wGL_RGBA8 = RGBA8;
|
|
public static final int _wGL_UNSIGNED_BYTE = UNSIGNED_BYTE;
|
|
public static final int _wGL_UNSIGNED_SHORT = UNSIGNED_SHORT;
|
|
public static final int _wGL_SRC_ALPHA = SRC_ALPHA;
|
|
public static final int _wGL_ONE_MINUS_SRC_ALPHA = ONE_MINUS_SRC_ALPHA;
|
|
public static final int _wGL_ONE_MINUS_DST_COLOR = ONE_MINUS_DST_COLOR;
|
|
public static final int _wGL_ONE_MINUS_SRC_COLOR = ONE_MINUS_SRC_COLOR;
|
|
public static final int _wGL_ZERO = ZERO;
|
|
public static final int _wGL_CULL_FACE = CULL_FACE;
|
|
public static final int _wGL_TEXTURE_MIN_FILTER = TEXTURE_MIN_FILTER;
|
|
public static final int _wGL_TEXTURE_MAG_FILTER = TEXTURE_MAG_FILTER;
|
|
public static final int _wGL_LINEAR = LINEAR;
|
|
public static final int _wGL_EQUAL = EQUAL;
|
|
public static final int _wGL_SRC_COLOR = SRC_COLOR;
|
|
public static final int _wGL_ONE = ONE;
|
|
public static final int _wGL_NEAREST = NEAREST;
|
|
public static final int _wGL_CLAMP = CLAMP_TO_EDGE;
|
|
public static final int _wGL_TEXTURE_WRAP_S = TEXTURE_WRAP_S;
|
|
public static final int _wGL_TEXTURE_WRAP_T = TEXTURE_WRAP_T;
|
|
public static final int _wGL_REPEAT = REPEAT;
|
|
public static final int _wGL_DST_COLOR = DST_COLOR;
|
|
public static final int _wGL_DST_ALPHA = DST_ALPHA;
|
|
public static final int _wGL_FLOAT = FLOAT;
|
|
public static final int _wGL_SHORT = SHORT;
|
|
public static final int _wGL_TRIANGLES = TRIANGLES;
|
|
public static final int _wGL_TRIANGLE_STRIP = TRIANGLE_STRIP;
|
|
public static final int _wGL_TRIANGLE_FAN = TRIANGLE_FAN;
|
|
public static final int _wGL_LINE_STRIP = LINE_STRIP;
|
|
public static final int _wGL_LINES = LINES;
|
|
public static final int _wGL_PACK_ALIGNMENT = PACK_ALIGNMENT;
|
|
public static final int _wGL_UNPACK_ALIGNMENT = UNPACK_ALIGNMENT;
|
|
public static final int _wGL_TEXTURE0 = TEXTURE0;
|
|
public static final int _wGL_TEXTURE1 = TEXTURE1;
|
|
public static final int _wGL_TEXTURE2 = TEXTURE2;
|
|
public static final int _wGL_TEXTURE3 = TEXTURE3;
|
|
public static final int _wGL_VIEWPORT = VIEWPORT;
|
|
public static final int _wGL_VERTEX_SHADER = VERTEX_SHADER;
|
|
public static final int _wGL_FRAGMENT_SHADER = FRAGMENT_SHADER;
|
|
public static final int _wGL_ARRAY_BUFFER = ARRAY_BUFFER;
|
|
public static final int _wGL_ELEMENT_ARRAY_BUFFER = ELEMENT_ARRAY_BUFFER;
|
|
public static final int _wGL_STATIC_DRAW = STATIC_DRAW;
|
|
public static final int _wGL_DYNAMIC_DRAW = DYNAMIC_DRAW;
|
|
public static final int _wGL_INVALID_ENUM = INVALID_ENUM;
|
|
public static final int _wGL_INVALID_VALUE= INVALID_VALUE;
|
|
public static final int _wGL_INVALID_OPERATION = INVALID_OPERATION;
|
|
public static final int _wGL_OUT_OF_MEMORY = OUT_OF_MEMORY;
|
|
public static final int _wGL_CONTEXT_LOST_WEBGL = CONTEXT_LOST_WEBGL;
|
|
public static final int _wGL_FRAMEBUFFER_COMPLETE = FRAMEBUFFER_COMPLETE;
|
|
public static final int _wGL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
|
public static final int _wGL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
|
|
public static final int _wGL_COLOR_ATTACHMENT0 = COLOR_ATTACHMENT0;
|
|
public static final int _wGL_DEPTH_STENCIL_ATTACHMENT = DEPTH_STENCIL_ATTACHMENT;
|
|
public static final int _wGL_DEPTH_STENCIL = DEPTH_STENCIL;
|
|
public static final int _wGL_NEAREST_MIPMAP_LINEAR = NEAREST_MIPMAP_LINEAR;
|
|
public static final int _wGL_LINEAR_MIPMAP_LINEAR = LINEAR_MIPMAP_LINEAR;
|
|
public static final int _wGL_LINEAR_MIPMAP_NEAREST = LINEAR_MIPMAP_NEAREST;
|
|
public static final int _wGL_NEAREST_MIPMAP_NEAREST = NEAREST_MIPMAP_NEAREST;
|
|
public static final int _wGL_TEXTURE_MAX_LEVEL = TEXTURE_MAX_LEVEL;
|
|
public static final int _wGL_UNSIGNED_INT_24_8 = UNSIGNED_INT_24_8;
|
|
public static final int _wGL_UNSIGNED_INT = UNSIGNED_INT;
|
|
public static final int _wGL_ANY_SAMPLES_PASSED = ANY_SAMPLES_PASSED;
|
|
public static final int _wGL_QUERY_RESULT = QUERY_RESULT;
|
|
public static final int _wGL_QUERY_RESULT_AVAILABLE = QUERY_RESULT_AVAILABLE;
|
|
public static final int _wGL_TEXTURE_MAX_ANISOTROPY = TEXTURE_MAX_ANISOTROPY_EXT;
|
|
public static final int _wGL_DEPTH24_STENCIL8 = DEPTH24_STENCIL8;
|
|
public static final int _wGL_DEPTH_COMPONENT32F = DEPTH_COMPONENT32F;
|
|
public static final int _wGL_DEPTH_ATTACHMENT = DEPTH_ATTACHMENT;
|
|
public static final int _wGL_MULTISAMPLE = -1;
|
|
public static final int _wGL_LINE_SMOOTH = -1;
|
|
public static final int _wGL_READ_FRAMEBUFFER = READ_FRAMEBUFFER;
|
|
public static final int _wGL_DRAW_FRAMEBUFFER = DRAW_FRAMEBUFFER;
|
|
public static final int _wGL_FRAMEBUFFER = FRAMEBUFFER;
|
|
public static final int _wGL_POLYGON_OFFSET_FILL = POLYGON_OFFSET_FILL;
|
|
|
|
public static final class TextureGL {
|
|
protected final WebGLTexture obj;
|
|
public int w = -1;
|
|
public int h = -1;
|
|
public boolean nearest = true;
|
|
public boolean anisotropic = false;
|
|
protected TextureGL(WebGLTexture obj) {
|
|
this.obj = obj;
|
|
}
|
|
}
|
|
public static final class BufferGL {
|
|
protected final WebGLBuffer obj;
|
|
protected BufferGL(WebGLBuffer obj) {
|
|
this.obj = obj;
|
|
}
|
|
}
|
|
public static final class ShaderGL {
|
|
protected final WebGLShader obj;
|
|
protected ShaderGL(WebGLShader obj) {
|
|
this.obj = obj;
|
|
}
|
|
}
|
|
private static int progId = 0;
|
|
public static final class ProgramGL {
|
|
protected final WebGLProgram obj;
|
|
protected final int hashcode;
|
|
protected ProgramGL(WebGLProgram obj) {
|
|
this.obj = obj;
|
|
this.hashcode = ++progId;
|
|
}
|
|
}
|
|
public static final class UniformGL {
|
|
protected final WebGLUniformLocation obj;
|
|
protected UniformGL(WebGLUniformLocation obj) {
|
|
this.obj = obj;
|
|
}
|
|
}
|
|
public static final class BufferArrayGL {
|
|
protected final WebGLVertexArray obj;
|
|
public boolean isQuadBufferBound;
|
|
protected BufferArrayGL(WebGLVertexArray obj) {
|
|
this.obj = obj;
|
|
this.isQuadBufferBound = false;
|
|
}
|
|
}
|
|
public static final class FramebufferGL {
|
|
protected final WebGLFramebuffer obj;
|
|
protected FramebufferGL(WebGLFramebuffer obj) {
|
|
this.obj = obj;
|
|
}
|
|
}
|
|
public static final class RenderbufferGL {
|
|
protected final WebGLRenderbuffer obj;
|
|
protected RenderbufferGL(WebGLRenderbuffer obj) {
|
|
this.obj = obj;
|
|
}
|
|
}
|
|
public static final class QueryGL {
|
|
protected final WebGLQuery obj;
|
|
protected QueryGL(WebGLQuery obj) {
|
|
this.obj = obj;
|
|
}
|
|
}
|
|
|
|
public static final void _wglEnable(int p1) {
|
|
webgl.enable(p1);
|
|
}
|
|
public static final void _wglClearDepth(float p1) {
|
|
webgl.clearDepth(p1);
|
|
}
|
|
public static final void _wglDepthFunc(int p1) {
|
|
webgl.depthFunc(p1);
|
|
}
|
|
public static final void _wglCullFace(int p1) {
|
|
webgl.cullFace(p1);
|
|
}
|
|
private static int[] viewportCache = new int[4];
|
|
public static final void _wglViewport(int p1, int p2, int p3, int p4) {
|
|
viewportCache[0] = p1; viewportCache[1] = p2;
|
|
viewportCache[2] = p3; viewportCache[3] = p4;
|
|
webgl.viewport(p1, p2, p3, p4);
|
|
}
|
|
public static final void _wglClear(int p1) {
|
|
webgl.clear(p1);
|
|
}
|
|
public static final void _wglClearColor(float p1, float p2, float p3, float p4) {
|
|
webgl.clearColor(p1, p2, p3, p4);
|
|
}
|
|
public static final void _wglDisable(int p1) {
|
|
webgl.disable(p1);
|
|
}
|
|
public static final int _wglGetError() {
|
|
return webgl.getError();
|
|
}
|
|
public static final void _wglFlush() {
|
|
//webgl.flush();
|
|
}
|
|
private static Uint8Array uploadBuffer = Uint8Array.create(ArrayBuffer.create(4 * 1024 * 1024));
|
|
public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, ByteBuffer p9) {
|
|
if(p9 == null) {
|
|
webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, null);
|
|
}else {
|
|
int len = p9.remaining();
|
|
Uint8Array uploadBuffer1 = uploadBuffer;
|
|
for(int i = 0; i < len; ++i) {
|
|
uploadBuffer1.set(i, (short) ((int)p9.get() & 0xff));
|
|
}
|
|
Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len);
|
|
webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data);
|
|
}
|
|
}
|
|
public static final void _wglBlendFunc(int p1, int p2) {
|
|
webgl.blendFunc(p1, p2);
|
|
}
|
|
public static final void _wglDepthMask(boolean p1) {
|
|
webgl.depthMask(p1);
|
|
}
|
|
public static final void _wglColorMask(boolean p1, boolean p2, boolean p3, boolean p4) {
|
|
webgl.colorMask(p1, p2, p3, p4);
|
|
}
|
|
public static final void _wglBindTexture(int p1, TextureGL p2) {
|
|
webgl.bindTexture(p1, p2 == null ? null : p2.obj);
|
|
}
|
|
public static final void _wglCopyTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) {
|
|
webgl.copyTexSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8);
|
|
}
|
|
public static final void _wglTexParameteri(int p1, int p2, int p3) {
|
|
webgl.texParameteri(p1, p2, p3);
|
|
}
|
|
public static final void _wglTexParameterf(int p1, int p2, float p3) {
|
|
webgl.texParameterf(p1, p2, p3);
|
|
}
|
|
public static final void _wglTexImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) {
|
|
int len = p9.remaining();
|
|
Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer());
|
|
for(int i = 0; i < len; ++i) {
|
|
deevis.set(i, p9.get());
|
|
}
|
|
Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4);
|
|
webgl.texImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data);
|
|
}
|
|
public static final void _wglTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, IntBuffer p9) {
|
|
int len = p9.remaining();
|
|
Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer());
|
|
for(int i = 0; i < len; ++i) {
|
|
deevis.set(i, p9.get());
|
|
}
|
|
Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4);
|
|
webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data);
|
|
}
|
|
public static final void _wglDeleteTextures(TextureGL p1) {
|
|
webgl.deleteTexture(p1.obj);
|
|
}
|
|
public static final void _wglDrawArrays(int p1, int p2, int p3) {
|
|
webgl.drawArrays(p1, p2, p3);
|
|
}
|
|
public static final void _wglDrawElements(int p1, int p2, int p3, int p4) {
|
|
webgl.drawElements(p1, p2, p3, p4);
|
|
}
|
|
public static final TextureGL _wglGenTextures() {
|
|
return new TextureGL(webgl.createTexture());
|
|
}
|
|
public static final void _wglTexSubImage2D(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, ByteBuffer p9) {
|
|
int len = p9.remaining();
|
|
for(int i = 0; i < len; ++i) {
|
|
uploadBuffer.set(i, (short) ((int)p9.get() & 0xff));
|
|
}
|
|
Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len);
|
|
webgl.texSubImage2D(p1, p2, p3, p4, p5, p6, p7, p8, data);
|
|
}
|
|
public static final void _wglActiveTexture(int p1) {
|
|
webgl.activeTexture(p1);
|
|
}
|
|
public static final ProgramGL _wglCreateProgram() {
|
|
return new ProgramGL(webgl.createProgram());
|
|
}
|
|
public static final ShaderGL _wglCreateShader(int p1) {
|
|
return new ShaderGL(webgl.createShader(p1));
|
|
}
|
|
public static final void _wglAttachShader(ProgramGL p1, ShaderGL p2) {
|
|
webgl.attachShader(p1.obj, p2.obj);
|
|
}
|
|
public static final void _wglDetachShader(ProgramGL p1, ShaderGL p2) {
|
|
webgl.detachShader(p1.obj, p2.obj);
|
|
}
|
|
public static final void _wglCompileShader(ShaderGL p1) {
|
|
webgl.compileShader(p1.obj);
|
|
}
|
|
public static final void _wglLinkProgram(ProgramGL p1) {
|
|
webgl.linkProgram(p1.obj);
|
|
}
|
|
public static final void _wglShaderSource(ShaderGL p1, String p2) {
|
|
webgl.shaderSource(p1.obj, p2);
|
|
}
|
|
public static final String _wglGetShaderInfoLog(ShaderGL p1) {
|
|
return webgl.getShaderInfoLog(p1.obj);
|
|
}
|
|
public static final String _wglGetProgramInfoLog(ProgramGL p1) {
|
|
return webgl.getProgramInfoLog(p1.obj);
|
|
}
|
|
public static final boolean _wglGetShaderCompiled(ShaderGL p1) {
|
|
return webgl.getShaderParameteri(p1.obj, COMPILE_STATUS) == 1;
|
|
}
|
|
public static final boolean _wglGetProgramLinked(ProgramGL p1) {
|
|
return webgl.getProgramParameteri(p1.obj, LINK_STATUS) == 1;
|
|
}
|
|
public static final void _wglDeleteShader(ShaderGL p1) {
|
|
webgl.deleteShader(p1.obj);
|
|
}
|
|
public static final void _wglDeleteProgram(ProgramGL p1) {
|
|
webgl.deleteProgram(p1.obj);
|
|
}
|
|
public static final BufferGL _wglCreateBuffer() {
|
|
return new BufferGL(webgl.createBuffer());
|
|
}
|
|
public static final void _wglDeleteBuffer(BufferGL p1) {
|
|
webgl.deleteBuffer(p1.obj);
|
|
}
|
|
public static final void _wglBindBuffer(int p1, BufferGL p2) {
|
|
webgl.bindBuffer(p1, p2 == null ? null : p2.obj);
|
|
}
|
|
public static final void _wglBufferData0(int p1, IntBuffer p2, int p3) {
|
|
int len = p2.remaining();
|
|
Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer());
|
|
for(int i = 0; i < len; ++i) {
|
|
deevis.set(i, p2.get());
|
|
}
|
|
Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4);
|
|
webgl.bufferData(p1, data, p3);
|
|
}
|
|
public static final void _wglBufferSubData0(int p1, int p2, IntBuffer p3) {
|
|
int len = p3.remaining();
|
|
Int32Array deevis = Int32Array.create(uploadBuffer.getBuffer());
|
|
for(int i = 0; i < len; ++i) {
|
|
deevis.set(i, p3.get());
|
|
}
|
|
Uint8Array data = Uint8Array.create(uploadBuffer.getBuffer(), 0, len*4);
|
|
webgl.bufferSubData(p1, p2, data);
|
|
}
|
|
public static final void _wglBufferData(int p1, Object p2, int p3) {
|
|
webgl.bufferData(p1, (Int32Array)p2, p3);
|
|
}
|
|
public static final void _wglBufferSubData(int p1, int p2, Object p3) {
|
|
webgl.bufferSubData(p1, p2, (Int32Array)p3);
|
|
}
|
|
public static final void _wglBindAttribLocation(ProgramGL p1, int p2, String p3) {
|
|
webgl.bindAttribLocation(p1.obj, p2, p3);
|
|
}
|
|
public static final void _wglEnableVertexAttribArray(int p1) {
|
|
webgl.enableVertexAttribArray(p1);
|
|
}
|
|
public static final void _wglDisableVertexAttribArray(int p1) {
|
|
webgl.disableVertexAttribArray(p1);
|
|
}
|
|
public static final UniformGL _wglGetUniformLocation(ProgramGL p1, String p2) {
|
|
WebGLUniformLocation u = webgl.getUniformLocation(p1.obj, p2);
|
|
return u == null ? null : new UniformGL(u);
|
|
}
|
|
public static final void _wglBindAttributeLocation(ProgramGL p1, int p2, String p3) {
|
|
webgl.bindAttribLocation(p1.obj, p2, p3);
|
|
}
|
|
public static final void _wglUniform1f(UniformGL p1, float p2) {
|
|
if(p1 != null) webgl.uniform1f(p1.obj, p2);
|
|
}
|
|
public static final void _wglUniform2f(UniformGL p1, float p2, float p3) {
|
|
if(p1 != null) webgl.uniform2f(p1.obj, p2, p3);
|
|
}
|
|
public static final void _wglUniform3f(UniformGL p1, float p2, float p3, float p4) {
|
|
if(p1 != null) webgl.uniform3f(p1.obj, p2, p3, p4);
|
|
}
|
|
public static final void _wglUniform4f(UniformGL p1, float p2, float p3, float p4, float p5) {
|
|
if(p1 != null) webgl.uniform4f(p1.obj, p2, p3, p4, p5);
|
|
}
|
|
public static final void _wglUniform1i(UniformGL p1, int p2) {
|
|
if(p1 != null) webgl.uniform1i(p1.obj, p2);
|
|
}
|
|
public static final void _wglUniform2i(UniformGL p1, int p2, int p3) {
|
|
if(p1 != null) webgl.uniform2i(p1.obj, p2, p3);
|
|
}
|
|
public static final void _wglUniform3i(UniformGL p1, int p2, int p3, int p4) {
|
|
if(p1 != null) webgl.uniform3i(p1.obj, p2, p3, p4);
|
|
}
|
|
public static final void _wglUniform4i(UniformGL p1, int p2, int p3, int p4, int p5) {
|
|
if(p1 != null) webgl.uniform4i(p1.obj, p2, p3, p4, p5);
|
|
}
|
|
private static Float32Array mat2 = Float32Array.create(4);
|
|
private static Float32Array mat3 = Float32Array.create(9);
|
|
private static Float32Array mat4 = Float32Array.create(16);
|
|
public static final void _wglUniformMat2fv(UniformGL p1, float[] mat) {
|
|
mat2.set(mat);
|
|
if(p1 != null) webgl.uniformMatrix2fv(p1.obj, false, mat2);
|
|
}
|
|
public static final void _wglUniformMat3fv(UniformGL p1, float[] mat) {
|
|
mat3.set(mat);
|
|
if(p1 != null) webgl.uniformMatrix3fv(p1.obj, false, mat3);
|
|
}
|
|
public static final void _wglUniformMat4fv(UniformGL p1, float[] mat) {
|
|
mat4.set(mat);
|
|
if(p1 != null) webgl.uniformMatrix4fv(p1.obj, false, mat4);
|
|
}
|
|
private static int currentProgram = -1;
|
|
public static final void _wglUseProgram(ProgramGL p1) {
|
|
if(p1 != null && currentProgram != p1.hashcode) {
|
|
currentProgram = p1.hashcode;
|
|
webgl.useProgram(p1.obj);
|
|
}
|
|
}
|
|
public static final void _wglGetParameter(int p1, int size, int[] ret) {
|
|
if(p1 == _wGL_VIEWPORT) {
|
|
ret[0] = viewportCache[0];
|
|
ret[1] = viewportCache[1];
|
|
ret[2] = viewportCache[2];
|
|
ret[3] = viewportCache[3];
|
|
}
|
|
}
|
|
public static final void _wglPolygonOffset(float p1, float p2) {
|
|
webgl.polygonOffset(p1, p2);
|
|
}
|
|
public static final void _wglVertexAttribPointer(int p1, int p2, int p3, boolean p4, int p5, int p6) {
|
|
webgl.vertexAttribPointer(p1, p2, p3, p4, p5, p6);
|
|
}
|
|
public static final void _wglBindFramebuffer(int p1, FramebufferGL p2) {
|
|
webgl.bindFramebuffer(p1, p2 == null ? null : p2.obj);
|
|
}
|
|
public static final FramebufferGL _wglCreateFramebuffer() {
|
|
return new FramebufferGL(webgl.createFramebuffer());
|
|
}
|
|
public static final void _wglDeleteFramebuffer(FramebufferGL p1) {
|
|
webgl.deleteFramebuffer(p1.obj);
|
|
}
|
|
public static final void _wglFramebufferTexture2D(int p1, TextureGL p2) {
|
|
webgl.framebufferTexture2D(FRAMEBUFFER, p1, TEXTURE_2D, p2 == null ? null : p2.obj, 0);
|
|
}
|
|
public static final QueryGL _wglCreateQuery() {
|
|
return new QueryGL(webgl.createQuery());
|
|
}
|
|
public static final void _wglBeginQuery(int p1, QueryGL p2) {
|
|
webgl.beginQuery(p1, p2.obj);
|
|
}
|
|
public static final void _wglEndQuery(int p1) {
|
|
webgl.endQuery(p1);
|
|
}
|
|
public static final void _wglDeleteQuery(QueryGL p1) {
|
|
webgl.deleteQuery(p1.obj);
|
|
}
|
|
public static final int _wglGetQueryObjecti(QueryGL p1, int p2) {
|
|
return webgl.getQueryParameter(p1.obj, p2);
|
|
}
|
|
public static final BufferArrayGL _wglCreateVertexArray() {
|
|
return new BufferArrayGL(webgl.createVertexArray());
|
|
}
|
|
public static final void _wglDeleteVertexArray(BufferArrayGL p1) {
|
|
webgl.deleteVertexArray(p1.obj);
|
|
}
|
|
public static final void _wglBindVertexArray(BufferArrayGL p1) {
|
|
webgl.bindVertexArray(p1 == null ? null : p1.obj);
|
|
}
|
|
public static final void _wglDrawBuffer(int p1) {
|
|
webgl.drawBuffers(new int[] { p1 });
|
|
}
|
|
public static final RenderbufferGL _wglCreateRenderBuffer() {
|
|
return new RenderbufferGL(webgl.createRenderbuffer());
|
|
}
|
|
public static final void _wglBindRenderbuffer(RenderbufferGL p1) {
|
|
webgl.bindRenderbuffer(RENDERBUFFER, p1 == null ? null : p1.obj);
|
|
}
|
|
public static final void _wglRenderbufferStorage(int p1, int p2, int p3) {
|
|
webgl.renderbufferStorage(RENDERBUFFER, p1, p2, p3);
|
|
}
|
|
public static final void _wglFramebufferRenderbuffer(int p1, RenderbufferGL p2) {
|
|
webgl.framebufferRenderbuffer(FRAMEBUFFER, p1, RENDERBUFFER, p2 == null ? null : p2.obj);
|
|
}
|
|
public static final void _wglDeleteRenderbuffer(RenderbufferGL p1) {
|
|
webgl.deleteRenderbuffer(p1.obj);
|
|
}
|
|
public static final void _wglRenderbufferStorageMultisample(int p1, int p2, int p3, int p4) {
|
|
webgl.renderbufferStorageMultisample(RENDERBUFFER, p1, p2, p3, p4);
|
|
}
|
|
public static final void _wglBlitFramebuffer(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8, int p9, int p10) {
|
|
webgl.blitFramebuffer(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10);
|
|
}
|
|
public static final int _wglGetAttribLocation(ProgramGL p1, String p2) {
|
|
return webgl.getAttribLocation(p1.obj, p2);
|
|
}
|
|
|
|
@JSBody(params = { "ctx", "p" }, script = "return ctx.getTexParameter(0x0DE1, p) | 0;")
|
|
private static final native int __wglGetTexParameteri(WebGL2RenderingContext ctx, int p);
|
|
public static final int _wglGetTexParameteri(int p1) {
|
|
return __wglGetTexParameteri(webgl, p1);
|
|
}
|
|
@JSBody(params = { "ctx", "p" }, script = "return (0.0 + ctx.getTexParameter(0x0DE1, p));")
|
|
private static final native float __wglGetTexParameterf(WebGL2RenderingContext ctx, int p);
|
|
public static final float _wglGetTexParameterf(int p1) {
|
|
return __wglGetTexParameterf(webgl, p1);
|
|
}
|
|
public static final boolean isWindows() {
|
|
return getString("window.navigator.platform").toLowerCase().contains("win");
|
|
}
|
|
|
|
private static MouseEvent currentEvent = null;
|
|
private static KeyboardEvent currentEventK = null;
|
|
private static boolean[] buttonStates = new boolean[8];
|
|
private static boolean[] keyStates = new boolean[256];
|
|
public static final boolean mouseNext() {
|
|
currentEvent = null;
|
|
return !mouseEvents.isEmpty() && (currentEvent = mouseEvents.remove(0)) != null;
|
|
}
|
|
public static final int mouseGetEventButton() {
|
|
if(currentEvent == null) return -1;
|
|
int b = currentEvent.getButton();
|
|
return b == 1 ? 2 : (b == 2 ? 1 : b);
|
|
}
|
|
public static final boolean mouseGetEventButtonState() {
|
|
return currentEvent == null ? false : currentEvent.getType().equals(MouseEvent.MOUSEDOWN);
|
|
}
|
|
public static final boolean mouseIsButtonDown(int p1) {
|
|
return buttonStates[p1];
|
|
}
|
|
public static final int mouseGetEventDWheel() {
|
|
return ("wheel".equals(currentEvent.getType())) ? (((WheelEvent)currentEvent).getDeltaY() == 0.0D ? 0 : (((WheelEvent)currentEvent).getDeltaY() > 0.0D ? -1 : 1)) : 0;
|
|
}
|
|
public static final void mouseSetCursorPosition(int x, int y) {
|
|
|
|
}
|
|
private static long mouseUngrabTimer = 0l;
|
|
private static int mouseUngrabTimeout = 0;
|
|
public static final void mouseSetGrabbed(boolean grabbed) {
|
|
if(grabbed) {
|
|
canvas.requestPointerLock();
|
|
long t = System.currentTimeMillis();
|
|
if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout);
|
|
if(t - mouseUngrabTimer < 3000l) {
|
|
mouseUngrabTimeout = Window.setTimeout(new TimerHandler() {
|
|
@Override
|
|
public void onTimer() {
|
|
canvas.requestPointerLock();
|
|
}
|
|
}, 3000 - (int)(t - mouseUngrabTimer));
|
|
}
|
|
}else {
|
|
mouseUngrabTimer = System.currentTimeMillis();
|
|
if(mouseUngrabTimeout != 0) Window.clearTimeout(mouseUngrabTimeout);
|
|
doc.exitPointerLock();
|
|
}
|
|
}
|
|
public static final int mouseGetDX() {
|
|
double dx = mouseDX;
|
|
mouseDX = 0.0D;
|
|
return (int)dx;
|
|
}
|
|
public static final int mouseGetDY() {
|
|
double dy = mouseDY;
|
|
mouseDY = 0.0D;
|
|
return (int)dy;
|
|
}
|
|
public static final int mouseGetX() {
|
|
return mouseX;
|
|
}
|
|
public static final int mouseGetY() {
|
|
return mouseY;
|
|
}
|
|
public static final int mouseGetEventX() {
|
|
return currentEvent == null ? -1 : currentEvent.getClientX();
|
|
}
|
|
public static final int mouseGetEventY() {
|
|
return currentEvent == null ? -1 : canvas.getClientHeight() - currentEvent.getClientY();
|
|
}
|
|
public static final boolean keysNext() {
|
|
if(unpressCTRL) { //un-press ctrl after copy/paste permission
|
|
keyEvents.clear();
|
|
currentEventK = null;
|
|
keyStates[29] = false;
|
|
keyStates[157] = false;
|
|
keyStates[28] = false;
|
|
keyStates[219] = false;
|
|
keyStates[220] = false;
|
|
unpressCTRL = false;
|
|
return false;
|
|
}
|
|
currentEventK = null;
|
|
return !keyEvents.isEmpty() && (currentEventK = keyEvents.remove(0)) != null;
|
|
}
|
|
public static final int getEventKey() {
|
|
return currentEventK == null ? -1 : remapKey(getWhich(currentEventK));
|
|
}
|
|
public static final char getEventChar() {
|
|
if(currentEventK == null) return '\0';
|
|
String s = currentEventK.getKey();
|
|
return currentEventK == null ? ' ' : (char) (s.length() > 1 ? '\0' : s.charAt(0));
|
|
}
|
|
public static final boolean getEventKeyState() {
|
|
return currentEventK == null? false : !currentEventK.getType().equals("keyup");
|
|
}
|
|
public static final boolean isKeyDown(int p1) {
|
|
if(unpressCTRL) { //un-press ctrl after copy/paste permission
|
|
keyStates[28] = false;
|
|
keyStates[29] = false;
|
|
keyStates[157] = false;
|
|
keyStates[219] = false;
|
|
keyStates[220] = false;
|
|
}
|
|
return keyStates[p1];
|
|
}
|
|
public static final String getKeyName(int p1) {
|
|
return (p1 >= 0 && p1 < 256) ? LWJGLKeyNames[p1] : "null";
|
|
}
|
|
public static final void setFullscreen(boolean p1) {
|
|
win.alert("use F11 to enter fullscreen");
|
|
}
|
|
public static final boolean shouldShutdown() {
|
|
return false;
|
|
}
|
|
public static final boolean isFunctionKeyDown(boolean mod, int p1) {
|
|
return mod && p1 >= 59 && p1 <= 67 && getEventKey() == (2 + (p1 - 59));
|
|
}
|
|
public static final boolean isFunctionKeyDown(int mod, int p1) {
|
|
return isKeyDown(mod) && p1 >= 59 && p1 <= 67 & getEventKey() == (2 + (p1 - 59));
|
|
}
|
|
public static final boolean isFunctionKeyHeldDown(int mod, int p1) {
|
|
return isKeyDown(mod) && p1 >= 59 && p1 <= 67 & isKeyDown(2 + (p1 - 59));
|
|
}
|
|
|
|
@JSBody(params = { "obj" }, script = "if(obj.commit) obj.commit();")
|
|
private static native int commitContext(JSObject obj);
|
|
|
|
public static final void updateDisplay() {
|
|
commitContext(webgl);
|
|
canvasContext.drawImage(canvasBack, 0d, 0d, canvas.getWidth(), canvas.getHeight());
|
|
|
|
int ww = canvas.getClientWidth();
|
|
int hh = canvas.getClientHeight();
|
|
if(ww != width || hh != height) {
|
|
width = ww;
|
|
height = hh;
|
|
canvasBack.setWidth(ww);
|
|
canvasBack.setHeight(hh);
|
|
}
|
|
|
|
try {
|
|
Thread.sleep(1l);
|
|
} catch (InterruptedException e) {
|
|
;
|
|
}
|
|
}
|
|
public static final void setVSyncEnabled(boolean p1) {
|
|
|
|
}
|
|
public static final void enableRepeatEvents(boolean b) {
|
|
enableRepeatEvents = b;
|
|
}
|
|
|
|
@JSBody(params = { }, script = "return document.pointerLockElement != null;")
|
|
public static native boolean isPointerLocked();
|
|
|
|
private static boolean pointerLockFlag = false;
|
|
|
|
public static final boolean isFocused() {
|
|
boolean yee = isPointerLocked();
|
|
boolean dee = pointerLockFlag;
|
|
pointerLockFlag = yee;
|
|
if(!dee && yee) {
|
|
mouseDX = 0.0D;
|
|
mouseDY = 0.0D;
|
|
}
|
|
return isWindowFocused && !(dee && !yee);
|
|
}
|
|
public static final int getScreenWidth() {
|
|
return win.getScreen().getAvailWidth();
|
|
}
|
|
public static final int getScreenHeight() {
|
|
return win.getScreen().getAvailHeight();
|
|
}
|
|
public static final int getCanvasWidth() {
|
|
int w = parent.getClientWidth();
|
|
if(w != width) {
|
|
canvas.setWidth(w);
|
|
canvasBack.setWidth(w);
|
|
width = w;
|
|
}
|
|
return w;
|
|
}
|
|
public static final int getCanvasHeight() {
|
|
int h = parent.getClientHeight();
|
|
if(h != height) {
|
|
canvas.setHeight(h);
|
|
canvasBack.setHeight(h);
|
|
height = h;
|
|
}
|
|
return h;
|
|
}
|
|
public static final void setDisplaySize(int x, int y) {
|
|
|
|
}
|
|
public static final void syncDisplay(int performanceToFps) {
|
|
|
|
}
|
|
|
|
private static final DateFormat dateFormatSS = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
|
|
public static final void saveScreenshot() {
|
|
saveScreenshot("screenshot_" + dateFormatSS.format(new Date()).toString() + ".png", canvas);
|
|
}
|
|
|
|
@JSBody(params = { "name", "cvs" }, script = "var a=document.createElement(\"a\");a.href=cvs.toDataURL(\"image/png\");a.download=name;a.click();")
|
|
private static native void saveScreenshot(String name, HTMLCanvasElement cvs);
|
|
|
|
public static enum RateLimit {
|
|
NONE, FAILED, BLOCKED, FAILED_POSSIBLY_LOCKED, LOCKED, NOW_LOCKED;
|
|
}
|
|
|
|
private static final Set<String> rateLimitedAddresses = new HashSet();
|
|
private static final Set<String> blockedAddresses = new HashSet();
|
|
|
|
private static WebSocket sock = null;
|
|
private static boolean sockIsConnecting = false;
|
|
private static boolean sockIsConnected = false;
|
|
private static boolean sockIsAlive = false;
|
|
private static LinkedList<byte[]> readPackets = new LinkedList();
|
|
private static RateLimit rateLimitStatus = null;
|
|
private static String currentSockURI = null;
|
|
|
|
public static final RateLimit getRateLimitStatus() {
|
|
RateLimit l = rateLimitStatus;
|
|
rateLimitStatus = null;
|
|
return l;
|
|
}
|
|
public static final void logRateLimit(String addr, RateLimit l) {
|
|
if(l == RateLimit.BLOCKED) {
|
|
blockedAddresses.add(addr);
|
|
}else {
|
|
rateLimitedAddresses.add(addr);
|
|
}
|
|
}
|
|
public static final RateLimit checkRateLimitHistory(String addr) {
|
|
if(blockedAddresses.contains(addr)) {
|
|
return RateLimit.LOCKED;
|
|
}else if(rateLimitedAddresses.contains(addr)) {
|
|
return RateLimit.BLOCKED;
|
|
}else {
|
|
return RateLimit.NONE;
|
|
}
|
|
}
|
|
|
|
@Async
|
|
public static native String connectWebSocket(String sockURI);
|
|
|
|
private static void connectWebSocket(String sockURI, final AsyncCallback<String> cb) {
|
|
sockIsConnecting = true;
|
|
sockIsConnected = false;
|
|
sockIsAlive = false;
|
|
rateLimitStatus = null;
|
|
currentSockURI = sockURI;
|
|
try {
|
|
sock = WebSocket.create(sockURI);
|
|
} catch(Throwable t) {
|
|
sockIsConnecting = false;
|
|
sockIsAlive = false;
|
|
return;
|
|
}
|
|
sock.setBinaryType("arraybuffer");
|
|
sock.onOpen(new EventListener<MessageEvent>() {
|
|
@Override
|
|
public void handleEvent(MessageEvent evt) {
|
|
sockIsConnecting = false;
|
|
sockIsAlive = false;
|
|
sockIsConnected = true;
|
|
readPackets.clear();
|
|
cb.complete("okay");
|
|
}
|
|
});
|
|
sock.onClose(new EventListener<CloseEvent>() {
|
|
@Override
|
|
public void handleEvent(CloseEvent evt) {
|
|
sock = null;
|
|
if(sockIsConnecting) {
|
|
if(rateLimitStatus == null) {
|
|
if(blockedAddresses.contains(currentSockURI)) {
|
|
rateLimitStatus = RateLimit.LOCKED;
|
|
}else if(rateLimitedAddresses.contains(currentSockURI)) {
|
|
rateLimitStatus = RateLimit.FAILED_POSSIBLY_LOCKED;
|
|
}else {
|
|
rateLimitStatus = RateLimit.FAILED;
|
|
}
|
|
}
|
|
}else if(!sockIsAlive) {
|
|
if(rateLimitStatus == null) {
|
|
if(blockedAddresses.contains(currentSockURI)) {
|
|
rateLimitStatus = RateLimit.LOCKED;
|
|
}else if(rateLimitedAddresses.contains(currentSockURI)) {
|
|
rateLimitStatus = RateLimit.BLOCKED;
|
|
}
|
|
}
|
|
}
|
|
boolean b = sockIsConnecting;
|
|
sockIsConnecting = false;
|
|
sockIsConnected = false;
|
|
sockIsAlive = false;
|
|
if(b) cb.complete("fail");
|
|
}
|
|
});
|
|
sock.onMessage(new EventListener<MessageEvent>() {
|
|
@Override
|
|
public void handleEvent(MessageEvent evt) {
|
|
sockIsAlive = true;
|
|
if(isString(evt.getData())) {
|
|
String stat = evt.getDataAsString();
|
|
if(stat.equalsIgnoreCase("BLOCKED")) {
|
|
if(rateLimitStatus == null) {
|
|
rateLimitStatus = RateLimit.BLOCKED;
|
|
}
|
|
rateLimitedAddresses.add(currentSockURI);
|
|
}else if(stat.equalsIgnoreCase("LOCKED")) {
|
|
if(rateLimitStatus == null) {
|
|
rateLimitStatus = RateLimit.NOW_LOCKED;
|
|
}
|
|
rateLimitedAddresses.add(currentSockURI);
|
|
blockedAddresses.add(currentSockURI);
|
|
}
|
|
sockIsConnecting = false;
|
|
sockIsConnected = false;
|
|
sock.close();
|
|
return;
|
|
}
|
|
Uint8Array a = Uint8Array.create(evt.getDataAsArray());
|
|
byte[] b = new byte[a.getByteLength()];
|
|
for(int i = 0; i < b.length; ++i) {
|
|
b[i] = (byte) (a.get(i) & 0xFF);
|
|
}
|
|
readPackets.add(b);
|
|
}
|
|
});
|
|
}
|
|
|
|
public static final boolean startConnection(String uri) {
|
|
String res = connectWebSocket(uri);
|
|
return "fail".equals(res) ? false : true;
|
|
}
|
|
public static final void endConnection() {
|
|
if(sock == null || sock.getReadyState() == 3) {
|
|
sockIsConnecting = false;
|
|
}
|
|
if(sock != null && !sockIsConnecting) sock.close();
|
|
}
|
|
public static final boolean connectionOpen() {
|
|
if(sock == null || sock.getReadyState() == 3) {
|
|
sockIsConnecting = false;
|
|
}
|
|
return sock != null && !sockIsConnecting && sock.getReadyState() != 3;
|
|
}
|
|
@JSBody(params = { "sock", "buffer" }, script = "sock.send(buffer);")
|
|
private static native void nativeBinarySend(WebSocket sock, ArrayBuffer buffer);
|
|
public static final void writePacket(byte[] packet) {
|
|
if(sock != null && !sockIsConnecting) {
|
|
Uint8Array arr = Uint8Array.create(packet.length);
|
|
arr.set(packet);
|
|
nativeBinarySend(sock, arr.getBuffer());
|
|
}
|
|
}
|
|
public static final byte[] readPacket() {
|
|
if(!readPackets.isEmpty()) {
|
|
return readPackets.remove(0);
|
|
}else {
|
|
return null;
|
|
}
|
|
}
|
|
public static final byte[] loadLocalStorage(String key) {
|
|
String s = win.getLocalStorage().getItem("_eaglercraft."+key);
|
|
if(s != null) {
|
|
return Base64.decodeBase64(s);
|
|
}else {
|
|
return null;
|
|
}
|
|
}
|
|
public static final void saveLocalStorage(String key, byte[] data) {
|
|
win.getLocalStorage().setItem("_eaglercraft."+key, Base64.encodeBase64String(data));
|
|
}
|
|
public static final void openLink(String url) {
|
|
win.open(url, "_blank");
|
|
}
|
|
public static final void redirectTo(String url) {
|
|
Window.current().getLocation().setFullURL(url);
|
|
}
|
|
|
|
@JSBody(params = { "str" }, script = "window.eval(str);")
|
|
private static native void execute(String str);
|
|
|
|
@JSBody(params = { }, script = "window.onbeforeunload = function(){javaMethods.get('net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.onWindowUnload()V').invoke();return false;};")
|
|
private static native void onBeforeCloseRegister();
|
|
|
|
@JSBody(params = { "ext", "mime" }, script = "window.eagsFileChooser.openFileChooser(ext, mime);")
|
|
public static native void openFileChooser(String ext, String mime);
|
|
|
|
public static final byte[] getFileChooserResult() {
|
|
ArrayBuffer b = getFileChooserResult0();
|
|
if(b == null) return null;
|
|
Uint8Array array = Uint8Array.create(b);
|
|
byte[] ret = new byte[array.getByteLength()];
|
|
for(int i = 0; i < ret.length; ++i) {
|
|
ret[i] = (byte) array.get(i);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
@JSBody(params = { }, script = "var ret = window.eagsFileChooser.getFileChooserResult; window.eagsFileChooser.getFileChooserResult = null; return ret;")
|
|
private static native ArrayBuffer getFileChooserResult0();
|
|
|
|
@JSBody(params = { }, script = "var ret = window.eagsFileChooser.getFileChooserResultName; window.eagsFileChooser.getFileChooserResultName = null; return ret;")
|
|
public static native String getFileChooserResultName();
|
|
|
|
public static final void setListenerPos(float x, float y, float z, float vx, float vy, float vz, float pitch, float yaw) {
|
|
float var2 = MathHelper.cos(-yaw * 0.017453292F);
|
|
float var3 = MathHelper.sin(-yaw * 0.017453292F);
|
|
float var4 = -MathHelper.cos(pitch * 0.017453292F);
|
|
float var5 = MathHelper.sin(pitch * 0.017453292F);
|
|
AudioListener l = audioctx.getListener();
|
|
l.setPosition(x, y, z);
|
|
l.setOrientation(-var3 * var4, -var5, -var2 * var4, 0.0f, 1.0f, 0.0f);
|
|
}
|
|
|
|
private static int playbackId = 0;
|
|
private static final HashMap<String,AudioBufferX> loadedSoundFiles = new HashMap();
|
|
private static AudioContext audioctx = null;
|
|
private static float playbackOffsetDelay = 0.03f;
|
|
|
|
public static final void setPlaybackOffsetDelay(float f) {
|
|
playbackOffsetDelay = f;
|
|
}
|
|
|
|
@Async
|
|
public static native AudioBuffer decodeAudioAsync(ArrayBuffer buffer);
|
|
|
|
private static void decodeAudioAsync(ArrayBuffer buffer, final AsyncCallback<AudioBuffer> cb) {
|
|
audioctx.decodeAudioData(buffer, new DecodeSuccessCallback() {
|
|
@Override
|
|
public void onSuccess(AudioBuffer decodedData) {
|
|
cb.complete(decodedData);
|
|
}
|
|
}, new DecodeErrorCallback() {
|
|
@Override
|
|
public void onError(JSObject error) {
|
|
cb.complete(null);
|
|
}
|
|
});
|
|
}
|
|
|
|
private static final HashMap<Integer,AudioBufferSourceNodeX> activeSoundEffects = new HashMap();
|
|
|
|
private static class AudioBufferX {
|
|
private final AudioBuffer buffer;
|
|
private AudioBufferX(AudioBuffer buffer) {
|
|
this.buffer = buffer;
|
|
}
|
|
}
|
|
|
|
private static class AudioBufferSourceNodeX {
|
|
private final AudioBufferSourceNode source;
|
|
private final PannerNode panner;
|
|
private final GainNode gain;
|
|
private AudioBufferSourceNodeX(AudioBufferSourceNode source, PannerNode panner, GainNode gain) {
|
|
this.source = source;
|
|
this.panner = panner;
|
|
this.gain = gain;
|
|
}
|
|
}
|
|
|
|
private static final AudioBuffer getBufferFor(String fileName) {
|
|
AudioBufferX ret = loadedSoundFiles.get(fileName);
|
|
if(ret == null) {
|
|
byte[] file = loadResourceBytes(fileName);
|
|
if(file == null) return null;
|
|
Uint8Array buf = Uint8Array.create(file.length);
|
|
buf.set(file);
|
|
ret = new AudioBufferX(decodeAudioAsync(buf.getBuffer()));
|
|
loadedSoundFiles.put(fileName, ret);
|
|
}
|
|
return ret.buffer;
|
|
}
|
|
public static final int beginPlayback(String fileName, float x, float y, float z, float volume, float pitch) {
|
|
AudioBuffer b = getBufferFor(fileName);
|
|
if(b == null) return -1;
|
|
AudioBufferSourceNode s = audioctx.createBufferSource();
|
|
s.setBuffer(b);
|
|
s.getPlaybackRate().setValue(pitch);
|
|
PannerNode p = audioctx.createPanner();
|
|
p.setPosition(x, y, z);
|
|
p.setMaxDistance(volume * 16f + 0.1f);
|
|
p.setRolloffFactor(1f);
|
|
//p.setVelocity(0f, 0f, 0f);
|
|
p.setDistanceModel("linear");
|
|
p.setPanningModel("HRTF");
|
|
p.setConeInnerAngle(360f);
|
|
p.setConeOuterAngle(0f);
|
|
p.setConeOuterGain(0f);
|
|
p.setOrientation(0f, 1f, 0f);
|
|
GainNode g = audioctx.createGain();
|
|
g.getGain().setValue(volume > 1.0f ? 1.0f : volume);
|
|
s.connect(g);
|
|
g.connect(p);
|
|
p.connect(audioctx.getDestination());
|
|
s.start(0.0d, playbackOffsetDelay);
|
|
final int theId = ++playbackId;
|
|
activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, p, g));
|
|
s.setOnEnded(new EventListener<MediaEvent>() {
|
|
|
|
@Override
|
|
public void handleEvent(MediaEvent evt) {
|
|
activeSoundEffects.remove(theId);
|
|
}
|
|
|
|
});
|
|
return theId;
|
|
}
|
|
public static final int beginPlaybackStatic(String fileName, float volume, float pitch) {
|
|
AudioBuffer b = getBufferFor(fileName);
|
|
if(b == null) return -1;
|
|
AudioBufferSourceNode s = audioctx.createBufferSource();
|
|
s.setBuffer(b);
|
|
s.getPlaybackRate().setValue(pitch);
|
|
GainNode g = audioctx.createGain();
|
|
g.getGain().setValue(volume > 1.0f ? 1.0f : volume);
|
|
s.connect(g);
|
|
g.connect(audioctx.getDestination());
|
|
s.start(0.0d, playbackOffsetDelay);
|
|
final int theId = ++playbackId;
|
|
activeSoundEffects.put(theId, new AudioBufferSourceNodeX(s, null, g));
|
|
s.setOnEnded(new EventListener<MediaEvent>() {
|
|
@Override
|
|
public void handleEvent(MediaEvent evt) {
|
|
activeSoundEffects.remove(theId);
|
|
}
|
|
|
|
});
|
|
return playbackId;
|
|
}
|
|
public static final void setPitch(int id, float pitch) {
|
|
AudioBufferSourceNodeX b = activeSoundEffects.get(id);
|
|
if(b != null) {
|
|
b.source.getPlaybackRate().setValue(pitch);
|
|
}
|
|
}
|
|
public static final void setVolume(int id, float volume) {
|
|
AudioBufferSourceNodeX b = activeSoundEffects.get(id);
|
|
if(b != null) {
|
|
b.gain.getGain().setValue(volume > 1.0f ? 1.0f : volume);
|
|
if(b.panner != null) b.panner.setMaxDistance(volume * 16f + 0.1f);
|
|
}
|
|
}
|
|
public static final void moveSound(int id, float x, float y, float z, float vx, float vy, float vz) {
|
|
AudioBufferSourceNodeX b = activeSoundEffects.get(id);
|
|
if(b != null && b.panner != null) {
|
|
b.panner.setPosition(x, y, z);
|
|
//b.panner.setVelocity(vx, vy, vz);
|
|
}
|
|
}
|
|
public static final void endSound(int id) {
|
|
AudioBufferSourceNodeX b = activeSoundEffects.get(id);
|
|
if(b != null) {
|
|
b.source.stop();
|
|
activeSoundEffects.remove(id);
|
|
}
|
|
}
|
|
public static final boolean isPlaying(int id) {
|
|
return activeSoundEffects.containsKey(id);
|
|
}
|
|
public static final void openConsole() {
|
|
|
|
}
|
|
private static boolean connected = false;
|
|
public static final void voiceConnect(String channel) {
|
|
win.alert("voice channels are not implemented yet");
|
|
connected = true;
|
|
}
|
|
public static final void voiceVolume(float volume) {
|
|
|
|
}
|
|
public static final boolean voiceActive() {
|
|
return connected;
|
|
}
|
|
public static final boolean voiceRelayed() {
|
|
return connected;
|
|
}
|
|
public static final String[] voiceUsers() {
|
|
return new String[0];
|
|
}
|
|
public static final String[] voiceUsersTalking() {
|
|
return new String[0];
|
|
}
|
|
public static final void voiceEnd() {
|
|
connected = false;
|
|
}
|
|
public static final void doJavascriptCoroutines() {
|
|
|
|
}
|
|
public static final long maxMemory() {
|
|
return 1024*1024*1024;
|
|
}
|
|
public static final long totalMemory() {
|
|
return 1024*1024*1024;
|
|
}
|
|
public static final long freeMemory() {
|
|
return 0l;
|
|
}
|
|
public static final void exit() {
|
|
|
|
}
|
|
|
|
@JSBody(params = { }, script = "return window.navigator.userAgent;")
|
|
public static native String getUserAgent();
|
|
|
|
private static String[] LWJGLKeyNames = new String[] {"NONE", "ESCAPE", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "MINUS", "EQUALS", "BACK", "TAB", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "LBRACKET", "RBRACKET", "RETURN", "LCONTROL", "A", "S", "D", "F", "G", "H", "J", "K", "L", "SEMICOLON", "APOSTROPHE", "GRAVE", "LSHIFT", "BACKSLASH", "Z", "X", "C", "V", "B", "N", "M", "COMMA", "PERIOD", "SLASH", "RSHIFT", "MULTIPLY", "LMENU", "SPACE", "CAPITAL", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "NUMLOCK", "SCROLL", "NUMPAD7", "NUMPAD8", "NUMPAD9", "SUBTRACT", "NUMPAD4", "NUMPAD5", "NUMPAD6", "ADD", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD0", "DECIMAL", "null", "null", "null", "F11", "F12", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "F13", "F14", "F15", "F16", "F17", "F18", "null", "null", "null", "null", "null", "null", "KANA", "F19", "null", "null", "null", "null", "null", "null", "null", "CONVERT", "null", "NOCONVERT", "null", "YEN", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "NUMPADEQUALS", "null", "null", "CIRCUMFLEX", "AT", "COLON", "UNDERLINE", "KANJI", "STOP", "AX", "UNLABELED", "null", "null", "null", "null", "NUMPADENTER", "RCONTROL", "null", "null", "null", "null", "null", "null", "null", "null", "null", "SECTION", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "NUMPADCOMMA", "null", "DIVIDE", "null", "SYSRQ", "RMENU", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "FUNCTION", "PAUSE", "null", "HOME", "UP", "PRIOR", "null", "LEFT", "null", "RIGHT", "null", "END", "DOWN", "NEXT", "INSERT", "DELETE", "null", "null", "null", "null", "null", "null", "CLEAR", "LMETA", "RMETA", "APPS", "POWER", "SLEEP", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null", "null"};
|
|
|
|
private static int[] LWJGLKeyCodes = new int[] {
|
|
/* 0 */ -1,
|
|
/* 1 */ -1,
|
|
/* 2 */ -1,
|
|
/* 3 */ -1,
|
|
/* 4 */ -1,
|
|
/* 5 */ -1,
|
|
/* 6 */ -1,
|
|
/* 7 */ -1,
|
|
/* 8 */ 14,
|
|
/* 9 */ 15,
|
|
/* 10 */ -1,
|
|
/* 11 */ -1,
|
|
/* 12 */ -1,
|
|
/* 13 */ 28,
|
|
/* 14 */ -1,
|
|
/* 15 */ -1,
|
|
/* 16 */ 42,
|
|
/* 17 */ 29,
|
|
/* 18 */ 56,
|
|
/* 19 */ -1,
|
|
/* 20 */ -1,
|
|
/* 21 */ -1,
|
|
/* 22 */ -1,
|
|
/* 23 */ -1,
|
|
/* 24 */ -1,
|
|
/* 25 */ -1,
|
|
/* 26 */ -1,
|
|
/* 27 */ 1,
|
|
/* 28 */ -1,
|
|
/* 29 */ -1,
|
|
/* 30 */ -1,
|
|
/* 31 */ -1,
|
|
/* 32 */ 57,
|
|
/* 33 */ 210,
|
|
/* 34 */ 201,
|
|
/* 35 */ 207,
|
|
/* 36 */ 199,
|
|
/* 37 */ 203,
|
|
/* 38 */ 200,
|
|
/* 39 */ 205,
|
|
/* 40 */ 208,
|
|
/* 41 */ 205,
|
|
/* 42 */ 208,
|
|
/* 43 */ -1,
|
|
/* 44 */ -1,
|
|
/* 45 */ 210,
|
|
/* 46 */ 211,
|
|
/* 47 */ 211,
|
|
/* 48 */ 11,
|
|
/* 49 */ 2,
|
|
/* 50 */ 3,
|
|
/* 51 */ 4,
|
|
/* 52 */ 5,
|
|
/* 53 */ 6,
|
|
/* 54 */ 7,
|
|
/* 55 */ 8,
|
|
/* 56 */ 9,
|
|
/* 57 */ 10,
|
|
/* 58 */ -1,
|
|
/* 59 */ -1,
|
|
/* 60 */ -1,
|
|
/* 61 */ -1,
|
|
/* 62 */ -1,
|
|
/* 63 */ -1,
|
|
/* 64 */ -1,
|
|
/* 65 */ 30,
|
|
/* 66 */ 48,
|
|
/* 67 */ 46,
|
|
/* 68 */ 32,
|
|
/* 69 */ 18,
|
|
/* 70 */ 33,
|
|
/* 71 */ 34,
|
|
/* 72 */ 35,
|
|
/* 73 */ 23,
|
|
/* 74 */ 36,
|
|
/* 75 */ 37,
|
|
/* 76 */ 38,
|
|
/* 77 */ 50,
|
|
/* 78 */ 49,
|
|
/* 79 */ 24,
|
|
/* 80 */ 25,
|
|
/* 81 */ 16,
|
|
/* 82 */ 19,
|
|
/* 83 */ 31,
|
|
/* 84 */ 20,
|
|
/* 85 */ 22,
|
|
/* 86 */ 47,
|
|
/* 87 */ 17,
|
|
/* 88 */ 45,
|
|
/* 89 */ 21,
|
|
/* 90 */ 44,
|
|
/* 91 */ -1,
|
|
/* 92 */ -1,
|
|
/* 93 */ -1,
|
|
/* 94 */ -1,
|
|
/* 95 */ -1,
|
|
/* 96 */ -1,
|
|
/* 97 */ -1,
|
|
/* 98 */ -1,
|
|
/* 99 */ -1,
|
|
/* 100 */ -1,
|
|
/* 101 */ -1,
|
|
/* 102 */ -1,
|
|
/* 103 */ -1,
|
|
/* 104 */ -1,
|
|
/* 105 */ -1,
|
|
/* 106 */ -1,
|
|
/* 107 */ -1,
|
|
/* 108 */ -1,
|
|
/* 109 */ 12,
|
|
/* 110 */ 52,
|
|
/* 111 */ 53,
|
|
/* 112 */ -1,
|
|
/* 113 */ -1,
|
|
/* 114 */ -1,
|
|
/* 115 */ -1,
|
|
/* 116 */ -1,
|
|
/* 117 */ -1,
|
|
/* 118 */ -1,
|
|
/* 119 */ -1,
|
|
/* 120 */ -1,
|
|
/* 121 */ -1,
|
|
/* 122 */ -1,
|
|
/* 123 */ -1,
|
|
/* 124 */ -1,
|
|
/* 125 */ -1,
|
|
/* 126 */ -1,
|
|
/* 127 */ -1,
|
|
/* 128 */ -1,
|
|
/* 129 */ -1,
|
|
/* 130 */ -1,
|
|
/* 131 */ -1,
|
|
/* 132 */ -1,
|
|
/* 133 */ -1,
|
|
/* 134 */ -1,
|
|
/* 135 */ -1,
|
|
/* 136 */ -1,
|
|
/* 137 */ -1,
|
|
/* 138 */ -1,
|
|
/* 139 */ -1,
|
|
/* 140 */ -1,
|
|
/* 141 */ -1,
|
|
/* 142 */ -1,
|
|
/* 143 */ -1,
|
|
/* 144 */ -1,
|
|
/* 145 */ -1,
|
|
/* 146 */ -1,
|
|
/* 147 */ -1,
|
|
/* 148 */ -1,
|
|
/* 149 */ -1,
|
|
/* 150 */ -1,
|
|
/* 151 */ -1,
|
|
/* 152 */ -1,
|
|
/* 153 */ -1,
|
|
/* 154 */ -1,
|
|
/* 155 */ -1,
|
|
/* 156 */ -1,
|
|
/* 157 */ -1,
|
|
/* 158 */ -1,
|
|
/* 159 */ -1,
|
|
/* 160 */ -1,
|
|
/* 161 */ -1,
|
|
/* 162 */ -1,
|
|
/* 163 */ -1,
|
|
/* 164 */ -1,
|
|
/* 165 */ -1,
|
|
/* 166 */ -1,
|
|
/* 167 */ -1,
|
|
/* 168 */ -1,
|
|
/* 169 */ -1,
|
|
/* 170 */ -1,
|
|
/* 171 */ -1,
|
|
/* 172 */ -1,
|
|
/* 173 */ -1,
|
|
/* 174 */ -1,
|
|
/* 175 */ -1,
|
|
/* 176 */ -1,
|
|
/* 177 */ -1,
|
|
/* 178 */ -1,
|
|
/* 179 */ -1,
|
|
/* 180 */ -1,
|
|
/* 181 */ -1,
|
|
/* 182 */ -1,
|
|
/* 183 */ -1,
|
|
/* 184 */ -1,
|
|
/* 185 */ -1,
|
|
/* 186 */ 39,
|
|
/* 187 */ 13,
|
|
/* 188 */ 51,
|
|
/* 189 */ 12,
|
|
/* 190 */ 52,
|
|
/* 191 */ 53,
|
|
/* 192 */ -1,
|
|
/* 193 */ -1,
|
|
/* 194 */ -1,
|
|
/* 195 */ -1,
|
|
/* 196 */ -1,
|
|
/* 197 */ -1,
|
|
/* 198 */ -1,
|
|
/* 199 */ -1,
|
|
/* 200 */ -1,
|
|
/* 200 */ -1,
|
|
/* 201 */ -1,
|
|
/* 202 */ -1,
|
|
/* 203 */ -1,
|
|
/* 204 */ -1,
|
|
/* 205 */ -1,
|
|
/* 206 */ -1,
|
|
/* 207 */ -1,
|
|
/* 208 */ -1,
|
|
/* 209 */ -1,
|
|
/* 210 */ -1,
|
|
/* 211 */ -1,
|
|
/* 212 */ -1,
|
|
/* 213 */ -1,
|
|
/* 214 */ -1,
|
|
/* 215 */ -1,
|
|
/* 216 */ -1,
|
|
/* 217 */ -1,
|
|
/* 218 */ -1,
|
|
/* 219 */ 26,
|
|
/* 220 */ 43,
|
|
/* 221 */ 27,
|
|
/* 222 */ 40
|
|
};
|
|
|
|
public static final int _wArrayByteLength(Object obj) {
|
|
return ((Int32Array)obj).getByteLength();
|
|
}
|
|
|
|
public static final Object _wCreateLowLevelIntBuffer(int len) {
|
|
return Int32Array.create(len);
|
|
}
|
|
|
|
private static int appendbufferindex = 0;
|
|
private static Int32Array appendbuffer = Int32Array.create(ArrayBuffer.create(525000*4));
|
|
|
|
public static final void _wAppendLowLevelBuffer(Object arr) {
|
|
Int32Array a = ((Int32Array)arr);
|
|
if(appendbufferindex + a.getLength() < appendbuffer.getLength()) {
|
|
appendbuffer.set(a, appendbufferindex);
|
|
appendbufferindex += a.getLength();
|
|
}
|
|
}
|
|
|
|
public static final Object _wGetLowLevelBuffersAppended() {
|
|
Int32Array ret = Int32Array.create(appendbuffer.getBuffer(), 0, appendbufferindex);
|
|
appendbufferindex = 0;
|
|
return ret;
|
|
}
|
|
|
|
private static int remapKey(int k) {
|
|
return (k > LWJGLKeyCodes.length || k < 0) ? -1 : LWJGLKeyCodes[k];
|
|
}
|
|
|
|
@JSFunctor
|
|
private static interface StupidFunctionResolveString extends JSObject {
|
|
void resolveStr(String s);
|
|
}
|
|
|
|
private static boolean unpressCTRL = false;
|
|
|
|
@Async
|
|
public static native String getClipboard();
|
|
|
|
private static void getClipboard(final AsyncCallback<String> cb) {
|
|
final long start = System.currentTimeMillis();
|
|
getClipboard0(new StupidFunctionResolveString() {
|
|
@Override
|
|
public void resolveStr(String s) {
|
|
if(System.currentTimeMillis() - start > 500l) {
|
|
unpressCTRL = true;
|
|
}
|
|
cb.complete(s);
|
|
}
|
|
});
|
|
}
|
|
|
|
@JSBody(params = { "cb" }, script = "if(!window.navigator.clipboard) cb(null); else window.navigator.clipboard.readText().then(function(s) { cb(s); }, function(s) { cb(null); });")
|
|
private static native void getClipboard0(StupidFunctionResolveString cb);
|
|
|
|
@JSBody(params = { "str" }, script = "if(window.navigator.clipboard) window.navigator.clipboard.writeText(str);")
|
|
public static native void setClipboard(String str);
|
|
|
|
@JSBody(params = { "obj" }, script = "return typeof obj === \"string\";")
|
|
private static native boolean isString(JSObject obj);
|
|
|
|
private static String serverToJoinOnLaunch = null;
|
|
|
|
public static final void setServerToJoinOnLaunch(String s) {
|
|
serverToJoinOnLaunch = s;
|
|
}
|
|
|
|
public static final String getServerToJoinOnLaunch() {
|
|
return serverToJoinOnLaunch;
|
|
}
|
|
|
|
public static final boolean fileExists(String path) {
|
|
return IndexedDBFilesystem.fileExists(path);
|
|
}
|
|
|
|
public static final boolean directoryExists(String path) {
|
|
return IndexedDBFilesystem.directoryExists(path);
|
|
}
|
|
|
|
public static final boolean pathExists(String path) {
|
|
return IndexedDBFilesystem.pathExists(path);
|
|
}
|
|
|
|
public static final void writeFile(String path, byte[] data) {
|
|
IndexedDBFilesystem.writeFile(path, data);
|
|
}
|
|
|
|
public static final byte[] readFile(String path) {
|
|
return IndexedDBFilesystem.readFile(path);
|
|
}
|
|
|
|
public static final long getLastModified(String path) {
|
|
return IndexedDBFilesystem.getLastModified(path);
|
|
}
|
|
|
|
public static final int getFileSize(String path) {
|
|
return IndexedDBFilesystem.getFileSize(path);
|
|
}
|
|
|
|
public static final void renameFile(String oldPath, String newPath) {
|
|
IndexedDBFilesystem.renameFile(oldPath, newPath);
|
|
}
|
|
|
|
public static final void copyFile(String oldPath, String newPath) {
|
|
IndexedDBFilesystem.copyFile(oldPath, newPath);
|
|
}
|
|
|
|
public static final void deleteFile(String path) {
|
|
IndexedDBFilesystem.deleteFile(path);
|
|
}
|
|
|
|
public static final Collection<FileEntry> listFiles(String path, boolean listDirs, boolean recursiveDirs) {
|
|
return IndexedDBFilesystem.listFiles(path, listDirs, recursiveDirs);
|
|
}
|
|
|
|
public static final Collection<FileEntry> listFilesAndDirectories(String path) {
|
|
return listFiles(path, true, false);
|
|
}
|
|
|
|
public static final Collection<FileEntry> listFilesRecursive(String path) {
|
|
return listFiles(path, false, true);
|
|
}
|
|
|
|
public static class FileEntry {
|
|
|
|
public final String path;
|
|
public final boolean isDirectory;
|
|
public final long lastModified;
|
|
|
|
public FileEntry(String path, boolean isDirectory, long lastModified) {
|
|
this.path = path;
|
|
this.isDirectory = isDirectory;
|
|
this.lastModified = lastModified;
|
|
}
|
|
|
|
public String getName() {
|
|
int i = path.indexOf('/');
|
|
if(i >= 0) {
|
|
return path.substring(i + 1);
|
|
}else {
|
|
return path;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
private static String stripPath(String str) {
|
|
if(str.startsWith("/")) {
|
|
str = str.substring(1);
|
|
}
|
|
if(str.endsWith("/")) {
|
|
str = str.substring(0, str.length() - 1);
|
|
}
|
|
return str;
|
|
}
|
|
|
|
private static ISaveFormat svformat = null;
|
|
|
|
public static final void configureSaveFormat(ISaveFormat fmt) {
|
|
svformat = fmt;
|
|
}
|
|
|
|
public static final ISaveFormat getConfiguredSaveFormat() {
|
|
return svformat;
|
|
}
|
|
|
|
@JSBody(params = { "name", "cvs" }, script = "var a=document.createElement(\"a\");a.href=URL.createObjectURL(new Blob([cvs],{type:\"application/octet-stream\"}));a.download=name;a.click();URL.revokeObjectURL(a.href);")
|
|
private static native void downloadFile0(String name, ArrayBuffer cvs);
|
|
|
|
public static final void downloadFile(String filename, byte[] data) {
|
|
Uint8Array b = Uint8Array.create(data.length);
|
|
b.set(data);
|
|
downloadFile0(filename, b.getBuffer());
|
|
}
|
|
|
|
} |