mirror of
https://github.com/Eaglercraft-Archive/Eaglercraftx-1.8.8-src.git
synced 2025-07-16 12:19:58 -05:00
Update #53 - Improved FPS, reduced WebGL context loss crashes
This commit is contained in:
@ -22,6 +22,7 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.teavm.interop.Address;
|
||||
import org.teavm.interop.Import;
|
||||
import org.teavm.jso.JSBody;
|
||||
import org.teavm.jso.JSObject;
|
||||
@ -41,6 +42,7 @@ import org.teavm.jso.webaudio.PannerNode;
|
||||
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.MemoryStack;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayCopy;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.BetterJSStringConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.JOrbisAudioBufferDecoder;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.WASMGCClientConfigAdapter;
|
||||
@ -100,7 +102,10 @@ public class PlatformAudio {
|
||||
if (silenceFile != null) {
|
||||
MemoryStack.push();
|
||||
try {
|
||||
initKeepAliveHack(WASMGCDirectArrayConverter.byteArrayToStackU8Array(silenceFile));
|
||||
int len = silenceFile.length;
|
||||
Address addr = MemoryStack.malloc(len);
|
||||
WASMGCDirectArrayCopy.memcpy(addr, silenceFile, 0, len);
|
||||
initKeepAliveHack(addr, len);
|
||||
}finally {
|
||||
MemoryStack.pop();
|
||||
}
|
||||
@ -112,7 +117,7 @@ public class PlatformAudio {
|
||||
private static native AudioContext getContext();
|
||||
|
||||
@Import(module = "platformAudio", name = "initKeepAliveHack")
|
||||
private static native void initKeepAliveHack(Uint8Array array);
|
||||
private static native void initKeepAliveHack(Address addr, int length);
|
||||
|
||||
protected static class BrowserAudioResource implements IAudioResource {
|
||||
|
||||
|
@ -199,7 +199,7 @@ public class PlatformOpenGL {
|
||||
@Import(module = "platformOpenGL", name = "glReadPixels")
|
||||
static native void _wglReadPixelsN(int x, int y, int width, int height, int format, int type, ArrayBufferView array);
|
||||
|
||||
@Import(module = "platformOpenGL", name = "glReadPixels0")
|
||||
@Import(module = "platformOpenGL", name = "glReadPixels")
|
||||
static native void _wglReadPixelsN(int x, int y, int width, int height, int format, int type, ArrayBufferView array, int offset);
|
||||
|
||||
@Import(module = "platformOpenGL", name = "glPolygonOffset")
|
||||
@ -367,7 +367,7 @@ public class PlatformOpenGL {
|
||||
@Import(module = "platformOpenGL", name = "glBufferData")
|
||||
static native void _wglBufferDataN(int target, ArrayBufferView typedArray, int usage);
|
||||
|
||||
@Import(module = "platformOpenGL", name = "glBufferData0")
|
||||
@Import(module = "platformOpenGL", name = "glBufferData")
|
||||
static native void _wglBufferDataN(int target, ArrayBufferView typedArray, int usage, int srcOffset, int length);
|
||||
|
||||
public static void _wglBufferSubData(int target, int dstOffset, ByteBuffer buffer) {
|
||||
@ -397,7 +397,7 @@ public class PlatformOpenGL {
|
||||
@Import(module = "platformOpenGL", name = "glBufferSubData")
|
||||
static native void _wglBufferSubDataN(int target, int dstOffset, ArrayBufferView typedArray);
|
||||
|
||||
@Import(module = "platformOpenGL", name = "glBufferSubData0")
|
||||
@Import(module = "platformOpenGL", name = "glBufferSubData")
|
||||
static native void _wglBufferSubDataN(int target, int dstOffset, ArrayBufferView typedArray, int srcOffset, int length);
|
||||
|
||||
public static void _wglBindVertexArray(IVertexArrayGL objId) {
|
||||
@ -450,7 +450,7 @@ public class PlatformOpenGL {
|
||||
static native void _wglTexImage3DN(int target, int level, int internalFormat, int width, int height, int depth,
|
||||
int border, int format, int type, ArrayBufferView typedArray);
|
||||
|
||||
@Import(module = "platformOpenGL", name = "glTexImage3D0")
|
||||
@Import(module = "platformOpenGL", name = "glTexImage3D")
|
||||
static native void _wglTexImage3DN(int target, int level, int internalFormat, int width, int height, int depth,
|
||||
int border, int format, int type, ArrayBufferView typedArray, int offset);
|
||||
|
||||
@ -513,7 +513,7 @@ public class PlatformOpenGL {
|
||||
static native void _wglTexImage2DN(int target, int level, int internalFormat, int width, int height, int border,
|
||||
int format, int type, ArrayBufferView typedArray);
|
||||
|
||||
@Import(module = "platformOpenGL", name = "glTexImage2D0")
|
||||
@Import(module = "platformOpenGL", name = "glTexImage2D")
|
||||
static native void _wglTexImage2DN(int target, int level, int internalFormat, int width, int height, int border,
|
||||
int format, int type, ArrayBufferView typedArray, int offset);
|
||||
|
||||
@ -565,7 +565,7 @@ public class PlatformOpenGL {
|
||||
static native void _wglTexSubImage2D(int target, int level, int offsetx, int offsety, int width, int height,
|
||||
int format, int type, ArrayBufferView typedArray);
|
||||
|
||||
@Import(module = "platformOpenGL", name = "glTexSubImage2D0")
|
||||
@Import(module = "platformOpenGL", name = "glTexSubImage2D")
|
||||
static native void _wglTexSubImage2D(int target, int level, int offsetx, int offsety, int width, int height,
|
||||
int format, int type, ArrayBufferView typedArray, int offset);
|
||||
|
||||
@ -658,6 +658,9 @@ public class PlatformOpenGL {
|
||||
@Import(module = "platformOpenGL", name = "glDrawElements")
|
||||
public static native void _wglDrawElements(int mode, int count, int type, int offset);
|
||||
|
||||
@Import(module = "platformOpenGL", name = "glDrawRangeElements")
|
||||
public static native void _wglDrawRangeElements(int mode, int start, int end, int count, int type, int offset);
|
||||
|
||||
@Import(module = "platformOpenGL", name = "glDrawArraysInstanced")
|
||||
public static native void _wglDrawArraysInstanced(int mode, int first, int count, int instanced);
|
||||
|
||||
|
@ -21,6 +21,7 @@ import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import org.teavm.interop.Address;
|
||||
import org.teavm.interop.Import;
|
||||
import org.teavm.jso.JSBody;
|
||||
import org.teavm.jso.JSObject;
|
||||
@ -32,6 +33,7 @@ import org.teavm.jso.typedarrays.Uint8Array;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime.JSEagRuntimeEvent;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.MemoryStack;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayCopy;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.BetterJSStringConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
|
||||
@ -226,8 +228,10 @@ public class PlatformWebView {
|
||||
}else if(packet.type == SPacketWebViewMessageV4EAG.TYPE_BINARY) {
|
||||
MemoryStack.push();
|
||||
try {
|
||||
sendBinaryMessage(BetterJSStringConverter.stringToJS(currentMessageChannelName),
|
||||
WASMGCDirectArrayConverter.byteArrayToStackU8Array(packet.data));
|
||||
int len = packet.data.length;
|
||||
Address addr = MemoryStack.malloc(len);
|
||||
WASMGCDirectArrayCopy.memcpy(addr, packet.data, 0, len);
|
||||
sendBinaryMessage(BetterJSStringConverter.stringToJS(currentMessageChannelName), addr, len);
|
||||
}finally {
|
||||
MemoryStack.pop();
|
||||
}
|
||||
@ -241,7 +245,7 @@ public class PlatformWebView {
|
||||
private static native void sendStringMessage(JSString ch, JSString str);
|
||||
|
||||
@Import(module = "platformWebView", name = "sendBinaryMessage")
|
||||
private static native void sendBinaryMessage(JSString ch, Uint8Array bin);
|
||||
private static native void sendBinaryMessage(JSString ch, Address addr, int length);
|
||||
|
||||
private static void sendMessageToServer(String channelName, int type, byte[] data) {
|
||||
if(channelName.length() > 255) {
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm;
|
||||
|
||||
import org.teavm.interop.Address;
|
||||
import org.teavm.interop.Import;
|
||||
import org.teavm.jso.JSObject;
|
||||
import org.teavm.jso.JSProperty;
|
||||
@ -124,16 +125,14 @@ public class IndexedDBFilesystem implements IEaglerFilesystem {
|
||||
|
||||
@Override
|
||||
public void eaglerWrite(String pathName, ByteBuffer data) {
|
||||
int len = data.remaining();
|
||||
Uint8Array arr = new Uint8Array(len);
|
||||
arr.set(WASMGCBufferAllocator.getByteBufferView(data));
|
||||
if(!eaglerWrite(database, BetterJSStringConverter.stringToJS(pathName), arr.getBuffer())) {
|
||||
throw new EaglerFileSystemException("Failed to write " + len + " byte file to indexeddb table: " + pathName);
|
||||
if(!eaglerWrite(database, BetterJSStringConverter.stringToJS(pathName),
|
||||
WASMGCBufferAllocator.getByteBufferAddress(data), data.remaining())) {
|
||||
throw new EaglerFileSystemException("Failed to write " + data.remaining() + " byte file to indexeddb table: " + pathName);
|
||||
}
|
||||
}
|
||||
|
||||
@Import(module = "platformFilesystem", name = "eaglerWrite")
|
||||
private static native boolean eaglerWrite(IDBDatabase database, JSString pathName, ArrayBuffer arr);
|
||||
private static native boolean eaglerWrite(IDBDatabase database, JSString pathName, Address addr, int length);
|
||||
|
||||
@Override
|
||||
public boolean eaglerExists(String pathName) {
|
||||
|
@ -21,7 +21,6 @@ import java.util.List;
|
||||
|
||||
import org.teavm.jso.JSObject;
|
||||
import org.teavm.jso.JSProperty;
|
||||
import org.teavm.jso.core.JSString;
|
||||
import org.teavm.jso.typedarrays.Uint8Array;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.EagUtils;
|
||||
|
@ -21,14 +21,14 @@ import java.util.Arrays;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import org.teavm.interop.Address;
|
||||
import org.teavm.interop.Import;
|
||||
import org.teavm.jso.core.JSString;
|
||||
import org.teavm.jso.typedarrays.Uint8Array;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.MemoryStack;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayCopy;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.BetterJSStringConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.WASMGCClientConfigAdapter;
|
||||
import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
|
||||
@ -71,8 +71,10 @@ public class ClientPlatformSingleplayer {
|
||||
}else {
|
||||
MemoryStack.push();
|
||||
try {
|
||||
sendPacket0(BetterJSStringConverter.stringToJS(packet.channel),
|
||||
WASMGCDirectArrayConverter.byteArrayToStackU8Array(packet.contents));
|
||||
int len = packet.contents.length;
|
||||
Address addr = MemoryStack.malloc(len);
|
||||
WASMGCDirectArrayCopy.memcpy(addr, packet.contents, 0, len);
|
||||
sendPacket0(BetterJSStringConverter.stringToJS(packet.channel), addr, len);
|
||||
} finally {
|
||||
MemoryStack.pop();
|
||||
}
|
||||
@ -80,7 +82,7 @@ public class ClientPlatformSingleplayer {
|
||||
}
|
||||
|
||||
@Import(module = "clientPlatformSingleplayer", name = "sendPacket")
|
||||
private static native void sendPacket0(JSString channel, Uint8Array arr);
|
||||
private static native void sendPacket0(JSString channel, Address addr, int length);
|
||||
|
||||
public static List<IPCPacketData> recieveAllPacket() {
|
||||
if(isSingleThreadMode) {
|
||||
|
@ -22,11 +22,11 @@ import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import org.teavm.interop.Address;
|
||||
import org.teavm.interop.Import;
|
||||
import org.teavm.jso.JSFunctor;
|
||||
import org.teavm.jso.JSObject;
|
||||
import org.teavm.jso.core.JSString;
|
||||
import org.teavm.jso.typedarrays.Uint8Array;
|
||||
|
||||
import net.lax1dude.eaglercraft.v1_8.Filesystem;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IClientConfigAdapter;
|
||||
@ -34,7 +34,7 @@ import net.lax1dude.eaglercraft.v1_8.internal.IEaglerFilesystem;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.IPCPacketData;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.MemoryStack;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.buffer.WASMGCDirectArrayCopy;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.vfs2.VFile2;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.BetterJSStringConverter;
|
||||
import net.lax1dude.eaglercraft.v1_8.internal.wasm_gc_teavm.WASMGCClientConfigAdapter;
|
||||
@ -74,8 +74,10 @@ public class ServerPlatformSingleplayer {
|
||||
}else {
|
||||
MemoryStack.push();
|
||||
try {
|
||||
sendPacket0(BetterJSStringConverter.stringToJS(packet.channel),
|
||||
WASMGCDirectArrayConverter.byteArrayToStackU8Array(packet.contents));
|
||||
int len = packet.contents.length;
|
||||
Address addr = MemoryStack.malloc(len);
|
||||
WASMGCDirectArrayCopy.memcpy(addr, packet.contents, 0, len);
|
||||
sendPacket0(BetterJSStringConverter.stringToJS(packet.channel), addr, len);
|
||||
} finally {
|
||||
MemoryStack.pop();
|
||||
}
|
||||
@ -83,7 +85,7 @@ public class ServerPlatformSingleplayer {
|
||||
}
|
||||
|
||||
@Import(module = "serverPlatformSingleplayer", name = "sendPacket")
|
||||
private static native void sendPacket0(JSString channel, Uint8Array arr);
|
||||
private static native void sendPacket0(JSString channel, Address addr, int length);
|
||||
|
||||
public static List<IPCPacketData> recieveAllPacket() {
|
||||
if(singleThreadMode) {
|
||||
|
@ -100,8 +100,13 @@ function initializeClientPlatfSP(spImports) {
|
||||
});
|
||||
}));
|
||||
|
||||
const classesTEADBGCopy = new Int8Array(classesTEADBG.length);
|
||||
classesTEADBGCopy.set(classesTEADBG, 0);
|
||||
const transferList = [];
|
||||
var classesTEADBGCopy = null;
|
||||
|
||||
if(classesTEADBG) {
|
||||
classesTEADBGCopy = classesTEADBG.buffer.slice(classesTEADBG.byteOffset, classesTEADBG.byteOffset + classesTEADBG.byteLength);
|
||||
transferList.push(classesTEADBGCopy);
|
||||
}
|
||||
|
||||
var eagRuntimeJS;
|
||||
try {
|
||||
@ -116,13 +121,15 @@ function initializeClientPlatfSP(spImports) {
|
||||
return false;
|
||||
}
|
||||
|
||||
transferList.push(eagRuntimeJS);
|
||||
|
||||
workerObj.postMessage({
|
||||
"eaglercraftXOpts": eaglercraftXOpts,
|
||||
"eagruntimeJS": eagRuntimeJS,
|
||||
"classesWASM": classesWASMModule,
|
||||
"classesDeobfWASM": classesDeobfWASMModule,
|
||||
"classesTEADBG": classesTEADBGCopy.buffer
|
||||
});
|
||||
"classesTEADBG": classesTEADBGCopy
|
||||
}, transferList);
|
||||
|
||||
return true;
|
||||
};
|
||||
@ -131,16 +138,16 @@ function initializeClientPlatfSP(spImports) {
|
||||
|
||||
/**
|
||||
* @param {string} channel
|
||||
* @param {Uint8Array} arr
|
||||
* @param {number} addr
|
||||
* @param {number} length
|
||||
*/
|
||||
spImports["sendPacket"] = function(channel, arr) {
|
||||
spImports["sendPacket"] = function(channel, addr, length) {
|
||||
if(workerObj) {
|
||||
const copiedArray = new Uint8Array(arr.length);
|
||||
copiedArray.set(arr, 0);
|
||||
const copiedArray = heapArrayBuffer.slice(addr, addr + length);
|
||||
workerObj.postMessage({
|
||||
"ch": channel,
|
||||
"dat": copiedArray.buffer
|
||||
}, [copiedArray.buffer]);
|
||||
"dat": copiedArray
|
||||
}, [copiedArray]);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -45,7 +45,7 @@ async function entryPoint() {
|
||||
|
||||
const teavm = await wasmGC.load(classesWASM, {
|
||||
stackDeobfuscator: {
|
||||
enabled: true,
|
||||
enabled: !!(classesDeobfWASM && classesTEADBGURL),
|
||||
path: classesDeobfWASM,
|
||||
infoLocation: "external",
|
||||
externalInfoPath: classesTEADBGURL
|
||||
|
@ -106,6 +106,8 @@ var keepAliveCallback = null;
|
||||
var showDebugConsole = null;
|
||||
/** @type {function()|null} */
|
||||
var resetSettings = null;
|
||||
/** @type {function()|null} */
|
||||
var handleVisibilityChange = null;
|
||||
|
||||
const runtimeOpts = {
|
||||
localStorageNamespace: "_eaglercraftX",
|
||||
|
@ -16,6 +16,9 @@
|
||||
|
||||
const platfAudioName = "platformAudio";
|
||||
|
||||
/** @type {HTMLAudioElement|null} */
|
||||
var silenceElement = null;
|
||||
|
||||
function setCurrentAudioContext(audioContext, audioImports) {
|
||||
|
||||
/**
|
||||
@ -26,25 +29,41 @@ function setCurrentAudioContext(audioContext, audioImports) {
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Uint8Array} fileData
|
||||
* @param {number} addr
|
||||
* @param {number} length
|
||||
*/
|
||||
audioImports["initKeepAliveHack"] = function(fileData) {
|
||||
const copiedData = new Uint8Array(fileData.length);
|
||||
copiedData.set(fileData, 0);
|
||||
audioImports["initKeepAliveHack"] = function(addr, length) {
|
||||
const copiedData = heapArrayBuffer.slice(addr, addr + length);
|
||||
const copiedDataURI = URL.createObjectURL(new Blob([copiedData], {type: "audio/wav"}));
|
||||
const audioElement = /** @type {HTMLAudioElement} */ (document.createElement("audio"));
|
||||
audioElement.classList.add("_eaglercraftX_keepalive_hack");
|
||||
audioElement.setAttribute("style", "display:none;");
|
||||
audioElement.autoplay = true;
|
||||
audioElement.autoplay = false;
|
||||
audioElement.loop = true;
|
||||
audioElement.addEventListener("seeked", function() {
|
||||
// NOP, wakes up the browser's event loop
|
||||
});
|
||||
audioElement.addEventListener("canplay", function() {
|
||||
if (silenceElement && document.visibilityState === "hidden") {
|
||||
silenceElement.play();
|
||||
}
|
||||
});
|
||||
const sourceElement = /** @type {HTMLSourceElement} */ (document.createElement("source"));
|
||||
sourceElement.type = "audio/wav";
|
||||
sourceElement.src = copiedDataURI;
|
||||
audioElement.appendChild(sourceElement);
|
||||
audioElement.addEventListener("seeked", function() {
|
||||
// NOP, wakes up the browser's event loop
|
||||
});
|
||||
parentElement.appendChild(audioElement);
|
||||
silenceElement = audioElement;
|
||||
};
|
||||
|
||||
handleVisibilityChange = function() {
|
||||
if (silenceElement) {
|
||||
if (document.visibilityState === "hidden") {
|
||||
silenceElement.play();
|
||||
} else {
|
||||
silenceElement.pause();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -144,13 +144,24 @@ function eaglerReadImpl(database, pathName) {
|
||||
|
||||
eagruntimeImpl.platformFilesystem["eaglerRead"] = new WebAssembly.Suspending(eaglerReadImpl);
|
||||
|
||||
/**
|
||||
* @param {IDBDatabase} database
|
||||
* @param {string} pathName
|
||||
* @param {number} addr
|
||||
* @param {number} length
|
||||
* @return {Promise}
|
||||
*/
|
||||
function eaglerWriteImpl(database, pathName, addr, length) {
|
||||
return eaglerWriteImpl0(database, pathName, heapArrayBuffer.slice(addr, addr + length));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {IDBDatabase} database
|
||||
* @param {string} pathName
|
||||
* @param {ArrayBuffer} arr
|
||||
* @return {Promise}
|
||||
*/
|
||||
function eaglerWriteImpl(database, pathName, arr) {
|
||||
function eaglerWriteImpl0(database, pathName, arr) {
|
||||
return new Promise(function(resolve) {
|
||||
const tx = database.transaction("filesystem", "readwrite");
|
||||
const r = tx.objectStore("filesystem").put(writeDBRow(pathName, arr));
|
||||
@ -193,7 +204,7 @@ eagruntimeImpl.platformFilesystem["eaglerExists"] = new WebAssembly.Suspending(e
|
||||
*/
|
||||
async function eaglerMoveImpl(database, pathNameOld, pathNameNew) {
|
||||
const oldData = await eaglerReadImpl(database, pathNameOld);
|
||||
if(!oldData || !(await eaglerWriteImpl(database, pathNameNew, oldData))) {
|
||||
if(!oldData || !(await eaglerWriteImpl0(database, pathNameNew, oldData))) {
|
||||
return false;
|
||||
}
|
||||
return await eaglerDeleteImpl(database, pathNameOld);
|
||||
@ -209,7 +220,7 @@ eagruntimeImpl.platformFilesystem["eaglerMove"] = new WebAssembly.Suspending(eag
|
||||
*/
|
||||
async function eaglerCopyImpl(database, pathNameOld, pathNameNew) {
|
||||
const oldData = await eaglerReadImpl(database, pathNameOld);
|
||||
return oldData && (await eaglerWriteImpl(database, pathNameNew, oldData));
|
||||
return oldData && (await eaglerWriteImpl0(database, pathNameNew, oldData));
|
||||
}
|
||||
|
||||
eagruntimeImpl.platformFilesystem["eaglerCopy"] = new WebAssembly.Suspending(eaglerCopyImpl);
|
||||
|
@ -118,7 +118,8 @@ async function initPlatformInput(inputImports) {
|
||||
blur: null,
|
||||
pointerlock: null,
|
||||
pointerlockerr: null,
|
||||
fullscreenChange: null
|
||||
fullscreenChange: null,
|
||||
visibilitychange: null
|
||||
};
|
||||
|
||||
touchKeyboardOpenZone = document.createElement("div");
|
||||
@ -351,6 +352,11 @@ async function initPlatformInput(inputImports) {
|
||||
pushEvent(EVENT_TYPE_INPUT, EVENT_INPUT_FOCUS, null);
|
||||
});
|
||||
|
||||
document.addEventListener("visibilitychange", currentEventListeners.visibilitychange = function(/** Event */ evt) {
|
||||
if (handleVisibilityChange)
|
||||
handleVisibilityChange();
|
||||
});
|
||||
|
||||
/**
|
||||
* @param {number} evtType
|
||||
* @param {KeyboardEvent} evt
|
||||
@ -1138,6 +1144,10 @@ async function initPlatformInput(inputImports) {
|
||||
window.removeEventListener("blur", /** @type {function(Event)} */ (currentEventListeners.blur));
|
||||
currentEventListeners.blur = null;
|
||||
}
|
||||
if(currentEventListeners.visibilitychange) {
|
||||
document.removeEventListener("visibilitychange", currentEventListeners.visibilitychange);
|
||||
currentEventListeners.visibilitychange = null;
|
||||
}
|
||||
if(currentEventListeners.pointerlock) {
|
||||
document.removeEventListener("pointerlockchange", /** @type {function(Event)} */ (currentEventListeners.pointerlock));
|
||||
currentEventListeners.pointerlock = null;
|
||||
|
@ -99,7 +99,7 @@ function setCurrentGLContext(ctx, glesVersIn, allowExts, glImports) {
|
||||
glImports["glColorMask"] = ctx.colorMask.bind(ctx);
|
||||
glImports["glDrawBuffers"] = glesVersIn >= 300 ? ctx.drawBuffers.bind(ctx) : unsupportedFunc(platfOpenGLName, "glDrawBuffers");
|
||||
glImports["glReadBuffer"] = glesVersIn >= 300 ? ctx.readBuffer.bind(ctx) : unsupportedFunc(platfOpenGLName, "glReadBuffer");
|
||||
glImports["glReadPixels"] = glImports["glReadPixels0"] = ctx.readPixels.bind(ctx);
|
||||
glImports["glReadPixels"] = ctx.readPixels.bind(ctx);
|
||||
glImports["glPolygonOffset"] = ctx.polygonOffset.bind(ctx);
|
||||
glImports["glLineWidth"] = ctx.lineWidth.bind(ctx);
|
||||
glImports["glGenBuffers"] = ctx.createBuffer.bind(ctx);
|
||||
@ -117,8 +117,8 @@ function setCurrentGLContext(ctx, glesVersIn, allowExts, glImports) {
|
||||
glImports["glDeleteRenderbuffer"] = ctx.deleteRenderbuffer.bind(ctx);
|
||||
glImports["glDeleteQueries"] = glesVersIn >= 300 ? ctx.deleteQuery.bind(ctx) : unsupportedFunc(platfOpenGLName, "glDeleteQueries");
|
||||
glImports["glBindBuffer"] = ctx.bindBuffer.bind(ctx);
|
||||
glImports["glBufferData"] = glImports["glBufferData0"] = ctx.bufferData.bind(ctx);
|
||||
glImports["glBufferSubData"] = glImports["glBufferSubData0"] = ctx.bufferSubData.bind(ctx);
|
||||
glImports["glBufferData"] = ctx.bufferData.bind(ctx);
|
||||
glImports["glBufferSubData"] = ctx.bufferSubData.bind(ctx);
|
||||
glImports["glEnableVertexAttribArray"] = ctx.enableVertexAttribArray.bind(ctx);
|
||||
glImports["glDisableVertexAttribArray"] = ctx.disableVertexAttribArray.bind(ctx);
|
||||
glImports["glVertexAttribPointer"] = ctx.vertexAttribPointer.bind(ctx);
|
||||
@ -126,9 +126,9 @@ function setCurrentGLContext(ctx, glesVersIn, allowExts, glImports) {
|
||||
glImports["glBindTexture"] = ctx.bindTexture.bind(ctx);
|
||||
glImports["glTexParameterf"] = ctx.texParameterf.bind(ctx);
|
||||
glImports["glTexParameteri"] = ctx.texParameteri.bind(ctx);
|
||||
glImports["glTexImage3D"] = glImports["glTexImage3D0"] = glesVersIn >= 300 ? ctx.texImage3D.bind(ctx) : unsupportedFunc(platfOpenGLName, "glTexImage3D");
|
||||
glImports["glTexImage2D"] = glImports["glTexImage2D0"] = ctx.texImage2D.bind(ctx);
|
||||
glImports["glTexSubImage2D"] = glImports["glTexSubImage2D0"] = ctx.texSubImage2D.bind(ctx);
|
||||
glImports["glTexImage3D"] = glesVersIn >= 300 ? ctx.texImage3D.bind(ctx) : unsupportedFunc(platfOpenGLName, "glTexImage3D");
|
||||
glImports["glTexImage2D"] = ctx.texImage2D.bind(ctx);
|
||||
glImports["glTexSubImage2D"] = ctx.texSubImage2D.bind(ctx);
|
||||
glImports["glCopyTexSubImage2D"] = ctx.copyTexSubImage2D.bind(ctx);
|
||||
glImports["glTexStorage2D"] = glesVersIn >= 300 ? ctx.texStorage2D.bind(ctx) : unsupportedFunc(platfOpenGLName, "glTexStorage2D");
|
||||
glImports["glPixelStorei"] = ctx.pixelStorei.bind(ctx);
|
||||
@ -145,6 +145,7 @@ function setCurrentGLContext(ctx, glesVersIn, allowExts, glImports) {
|
||||
glImports["glGetProgramInfoLog"] = ctx.getProgramInfoLog.bind(ctx);
|
||||
glImports["glDrawArrays"] = ctx.drawArrays.bind(ctx);
|
||||
glImports["glDrawElements"] = ctx.drawElements.bind(ctx);
|
||||
glImports["glDrawRangeElements"] = glesVersIn >= 300 ? ctx.drawRangeElements.bind(ctx) : unsupportedFunc(platfOpenGLName, "glDrawRangeElements");
|
||||
glImports["glBindAttribLocation"] = ctx.bindAttribLocation.bind(ctx);
|
||||
glImports["glGetAttribLocation"] = ctx.getAttribLocation.bind(ctx);
|
||||
glImports["glGetUniformLocation"] = ctx.getUniformLocation.bind(ctx);
|
||||
@ -299,7 +300,6 @@ function setNoGLContext(glImports) {
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glDrawBuffers");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glReadBuffer");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glReadPixels");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glReadPixels0");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glPolygonOffset");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glLineWidth");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glGenBuffers");
|
||||
@ -318,9 +318,7 @@ function setNoGLContext(glImports) {
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteQueries");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glBindBuffer");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glBufferData");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glBufferData0");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glBufferSubData");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glBufferSubData0");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glEnableVertexAttribArray");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glDisableVertexAttribArray");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glVertexAttribPointer");
|
||||
@ -329,11 +327,8 @@ function setNoGLContext(glImports) {
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glTexParameterf");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glTexParameteri");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glTexImage3D");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glTexImage3D0");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glTexImage2D");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glTexImage2D0");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glTexSubImage2D");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glTexSubImage2D0");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glCopyTexSubImage2D");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glTexStorage2D");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glPixelStorei");
|
||||
@ -350,6 +345,7 @@ function setNoGLContext(glImports) {
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glGetProgramInfoLog");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glDrawArrays");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glDrawElements");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glDrawRangeElements");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glBindAttribLocation");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glGetAttribLocation");
|
||||
setUnsupportedFunc(glImports, platfOpenGLName, "glGetUniformLocation");
|
||||
|
@ -121,19 +121,18 @@ function initializePlatfWebView(webViewImports) {
|
||||
|
||||
/**
|
||||
* @param {string} ch
|
||||
* @param {Uint8Array} bin
|
||||
* @param {number} addr
|
||||
* @param {number} length
|
||||
*/
|
||||
webViewImports["sendBinaryMessage"] = function(ch, bin) {
|
||||
webViewImports["sendBinaryMessage"] = function(ch, addr, length) {
|
||||
try {
|
||||
var w;
|
||||
if(currentIFrame != null && (w = currentIFrame.contentWindow) != null) {
|
||||
const copiedArray = new Uint8Array(bin.length);
|
||||
copiedArray.set(bin, 0);
|
||||
w.postMessage({
|
||||
"ver": 1,
|
||||
"channel": ch,
|
||||
"type": "binary",
|
||||
"data": copiedArray.buffer
|
||||
"data": heapArrayBuffer.slice(addr, addr + length)
|
||||
}, "*");
|
||||
}else {
|
||||
eagError("Server tried to send the WebView a message, but the message channel is not open!");
|
||||
|
@ -57,15 +57,15 @@ function initializeServerPlatfSP(spImports) {
|
||||
|
||||
/**
|
||||
* @param {string} channel
|
||||
* @param {Uint8Array} arr
|
||||
* @param {number} addr
|
||||
* @param {number} length
|
||||
*/
|
||||
spImports["sendPacket"] = function(channel, arr) {
|
||||
const copiedArray = new Uint8Array(arr.length);
|
||||
copiedArray.set(arr, 0);
|
||||
spImports["sendPacket"] = function(channel, addr, length) {
|
||||
const copiedArray = heapArrayBuffer.slice(addr, addr + length);
|
||||
postMessage({
|
||||
"ch": channel,
|
||||
"dat": copiedArray.buffer
|
||||
}, [copiedArray.buffer]);
|
||||
"dat": copiedArray
|
||||
}, [copiedArray]);
|
||||
};
|
||||
|
||||
spImports["getAvailablePackets"] = serverMessageQueue.getLength.bind(serverMessageQueue);
|
||||
|
Reference in New Issue
Block a user