u32
This commit is contained in:
parent
f6612ce09e
commit
cfab2e85bf
|
@ -44,6 +44,27 @@ window.eaglercraftXOptsHints = {
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
"use strict";
|
"use strict";
|
||||||
(function(){
|
(function(){
|
||||||
|
function fetchB64PayloadSafe() {
|
||||||
|
const dataURL = window.eaglercraftXClientBundle;
|
||||||
|
if(!dataURL.startsWith("data:application/octet-stream;base64,")) {
|
||||||
|
return fetch(dataURL, { cache: "force-cache" }).then((response) => response.blob());
|
||||||
|
}
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
fetch(dataURL)
|
||||||
|
.then((response) => response.blob())
|
||||||
|
.then((blob) => { resolve(blob); })
|
||||||
|
.catch((err) => {
|
||||||
|
console.error("Caught an error decoding base64 via fetch, doing it the slow way instead...");
|
||||||
|
// MIT License - https://github.com/beatgammit/base64-js
|
||||||
|
const base64js = (function(){return function(){function b(d,e,g){function a(j,i){if(!e[j]){if(!d[j]){var f="function"==typeof require&&require;if(!i&&f)return f(j,!0);if(h)return h(j,!0);var c=new Error("Cannot find module '"+j+"'");throw c.code="MODULE_NOT_FOUND",c}var k=e[j]={exports:{}};d[j][0].call(k.exports,function(b){var c=d[j][1][b];return a(c||b)},k,k.exports,b,d,e,g)}return e[j].exports}for(var h="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return b}()({"/":[function(a,b,c){"use strict";function d(a){var b=a.length;if(0<b%4)throw new Error("Invalid string. Length must be a multiple of 4");var c=a.indexOf("=");-1===c&&(c=b);var d=c===b?0:4-c%4;return[c,d]}function e(a,b,c){return 3*(b+c)/4-c}function f(a){var b,c,f=d(a),g=f[0],j=f[1],k=new Uint8Array(e(a,g,j)),l=0,m=0<j?g-4:g;for(c=0;c<m;c+=4)b=h[a.charCodeAt(c)]<<18|h[a.charCodeAt(c+1)]<<12|h[a.charCodeAt(c+2)]<<6|h[a.charCodeAt(c+3)],k[l++]=255&b>>16,k[l++]=255&b>>8,k[l++]=255&b;return 2===j&&(b=h[a.charCodeAt(c)]<<2|h[a.charCodeAt(c+1)]>>4,k[l++]=255&b),1===j&&(b=h[a.charCodeAt(c)]<<10|h[a.charCodeAt(c+1)]<<4|h[a.charCodeAt(c+2)]>>2,k[l++]=255&b>>8,k[l++]=255&b),k}c.byteLength=function b(a){var c=d(a),e=c[0],f=c[1];return 3*(e+f)/4-f},c.toByteArray=f;for(var g=[],h=[],j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",k=0,l=j.length;k<l;++k)g[k]=j[k],h[j.charCodeAt(k)]=k;h[45]=62,h[95]=63},{}]},{},[])("/")})();
|
||||||
|
const bytesDec = base64js.toByteArray(dataURL.substring(37)).buffer;
|
||||||
|
const bytesBlob = new Blob([bytesDec], { type: "application/octet-stream" });
|
||||||
|
window.eaglercraftXClientBundle = URL.createObjectURL(bytesBlob);
|
||||||
|
console.error("Created " + bytesDec.byteLength + " byte object URL: " + window.eaglercraftXClientBundle);
|
||||||
|
resolve(bytesBlob);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
var ds = new DecompressionStream("gzip");
|
var ds = new DecompressionStream("gzip");
|
||||||
var result = [];
|
var result = [];
|
||||||
function fetchStream(reader) {
|
function fetchStream(reader) {
|
||||||
|
@ -58,9 +79,7 @@ window.eaglercraftXOptsHints = {
|
||||||
return reader.read().then(processData);
|
return reader.read().then(processData);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
fetch(window.eaglercraftXClientBundle, { cache: "force-cache" })
|
fetchB64PayloadSafe().then((blob) => fetchStream(blob.stream().pipeThrough(ds).getReader()));
|
||||||
.then((response) => response.blob())
|
|
||||||
.then((blob) => fetchStream(blob.stream().pipeThrough(ds).getReader()));
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
- Made the integrated PBR resource pack
|
- Made the integrated PBR resource pack
|
||||||
- Wrote all desktop emulation code
|
- Wrote all desktop emulation code
|
||||||
- Wrote EaglercraftXBungee
|
- Wrote EaglercraftXBungee
|
||||||
|
- Wrote EaglercraftXVelocity
|
||||||
- Wrote WebRTC relay server
|
- Wrote WebRTC relay server
|
||||||
- Wrote voice chat server
|
- Wrote voice chat server
|
||||||
- Wrote the patch and build system
|
- Wrote the patch and build system
|
||||||
|
@ -20,6 +21,7 @@
|
||||||
- Many bug fixes
|
- Many bug fixes
|
||||||
- WebRTC LAN worlds
|
- WebRTC LAN worlds
|
||||||
- WebRTC voice chat
|
- WebRTC voice chat
|
||||||
|
- Made velocity plugin work
|
||||||
- Added resource packs
|
- Added resource packs
|
||||||
- Added screen recording
|
- Added screen recording
|
||||||
- Added seamless fullscreen
|
- Added seamless fullscreen
|
||||||
|
@ -584,6 +586,44 @@
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
Project Name: BungeeCord
|
||||||
|
Project Author: md_5
|
||||||
|
Project URL: https://www.spigotmc.org/go/bungeecord/
|
||||||
|
|
||||||
|
Used For: parsing YAML config files in EaglercraftXVelocity
|
||||||
|
|
||||||
|
* Copyright (c) 2012, md_5. All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
* list of conditions and the following disclaimer.
|
||||||
|
*
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
|
* and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* The name of the author may not be used to endorse or promote products derived
|
||||||
|
* from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* You may not use the software for commercial software hosting services without
|
||||||
|
* written permission from the author.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
Project Name: 3D Sound System
|
Project Name: 3D Sound System
|
||||||
Project Author: Paul Lamb
|
Project Author: Paul Lamb
|
||||||
Project URL: http://www.paulscode.com/forum/index.php?topic=4.0
|
Project URL: http://www.paulscode.com/forum/index.php?topic=4.0
|
||||||
|
|
Binary file not shown.
|
@ -1 +1 @@
|
||||||
{"pluginName":"EaglercraftXBungee","pluginVersion":"1.2.1","pluginButton":"Download \"EaglerXBungee-1.2.1.jar\"","pluginFilename":"EaglerXBungee.zip"}
|
{"pluginName":"EaglercraftXBungee","pluginVersion":"1.2.3","pluginButton":"Download \"EaglerXBungee-1.2.3.jar\"","pluginFilename":"EaglerXBungee.zip"}
|
|
@ -44,6 +44,27 @@ window.eaglercraftXOptsHints = {
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
"use strict";
|
"use strict";
|
||||||
(function(){
|
(function(){
|
||||||
|
function fetchB64PayloadSafe() {
|
||||||
|
const dataURL = window.eaglercraftXClientBundle;
|
||||||
|
if(!dataURL.startsWith("data:application/octet-stream;base64,")) {
|
||||||
|
return fetch(dataURL, { cache: "force-cache" }).then((response) => response.blob());
|
||||||
|
}
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
fetch(dataURL)
|
||||||
|
.then((response) => response.blob())
|
||||||
|
.then((blob) => { resolve(blob); })
|
||||||
|
.catch((err) => {
|
||||||
|
console.error("Caught an error decoding base64 via fetch, doing it the slow way instead...");
|
||||||
|
// MIT License - https://github.com/beatgammit/base64-js
|
||||||
|
const base64js = (function(){return function(){function b(d,e,g){function a(j,i){if(!e[j]){if(!d[j]){var f="function"==typeof require&&require;if(!i&&f)return f(j,!0);if(h)return h(j,!0);var c=new Error("Cannot find module '"+j+"'");throw c.code="MODULE_NOT_FOUND",c}var k=e[j]={exports:{}};d[j][0].call(k.exports,function(b){var c=d[j][1][b];return a(c||b)},k,k.exports,b,d,e,g)}return e[j].exports}for(var h="function"==typeof require&&require,c=0;c<g.length;c++)a(g[c]);return a}return b}()({"/":[function(a,b,c){"use strict";function d(a){var b=a.length;if(0<b%4)throw new Error("Invalid string. Length must be a multiple of 4");var c=a.indexOf("=");-1===c&&(c=b);var d=c===b?0:4-c%4;return[c,d]}function e(a,b,c){return 3*(b+c)/4-c}function f(a){var b,c,f=d(a),g=f[0],j=f[1],k=new Uint8Array(e(a,g,j)),l=0,m=0<j?g-4:g;for(c=0;c<m;c+=4)b=h[a.charCodeAt(c)]<<18|h[a.charCodeAt(c+1)]<<12|h[a.charCodeAt(c+2)]<<6|h[a.charCodeAt(c+3)],k[l++]=255&b>>16,k[l++]=255&b>>8,k[l++]=255&b;return 2===j&&(b=h[a.charCodeAt(c)]<<2|h[a.charCodeAt(c+1)]>>4,k[l++]=255&b),1===j&&(b=h[a.charCodeAt(c)]<<10|h[a.charCodeAt(c+1)]<<4|h[a.charCodeAt(c+2)]>>2,k[l++]=255&b>>8,k[l++]=255&b),k}c.byteLength=function b(a){var c=d(a),e=c[0],f=c[1];return 3*(e+f)/4-f},c.toByteArray=f;for(var g=[],h=[],j="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",k=0,l=j.length;k<l;++k)g[k]=j[k],h[j.charCodeAt(k)]=k;h[45]=62,h[95]=63},{}]},{},[])("/")})();
|
||||||
|
const bytesDec = base64js.toByteArray(dataURL.substring(37)).buffer;
|
||||||
|
const bytesBlob = new Blob([bytesDec], { type: "application/octet-stream" });
|
||||||
|
window.eaglercraftXClientBundle = URL.createObjectURL(bytesBlob);
|
||||||
|
console.error("Created " + bytesDec.byteLength + " byte object URL: " + window.eaglercraftXClientBundle);
|
||||||
|
resolve(bytesBlob);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
var ds = new DecompressionStream("gzip");
|
var ds = new DecompressionStream("gzip");
|
||||||
var result = [];
|
var result = [];
|
||||||
function fetchStream(reader) {
|
function fetchStream(reader) {
|
||||||
|
@ -58,9 +79,7 @@ window.eaglercraftXOptsHints = {
|
||||||
return reader.read().then(processData);
|
return reader.read().then(processData);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
fetch(window.eaglercraftXClientBundle, { cache: "force-cache" })
|
fetchB64PayloadSafe().then((blob) => fetchStream(blob.stream().pipeThrough(ds).getReader()));
|
||||||
.then((response) => response.blob())
|
|
||||||
.then((blob) => fetchStream(blob.stream().pipeThrough(ds).getReader()));
|
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
|
@ -10,7 +10,7 @@ public class EaglercraftVersion {
|
||||||
/// Customize these to fit your fork:
|
/// Customize these to fit your fork:
|
||||||
|
|
||||||
public static final String projectForkName = "EaglercraftX";
|
public static final String projectForkName = "EaglercraftX";
|
||||||
public static final String projectForkVersion = "u31";
|
public static final String projectForkVersion = "u32";
|
||||||
public static final String projectForkVendor = "lax1dude";
|
public static final String projectForkVendor = "lax1dude";
|
||||||
|
|
||||||
public static final String projectForkURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8";
|
public static final String projectForkURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8";
|
||||||
|
@ -20,7 +20,7 @@ public class EaglercraftVersion {
|
||||||
public static final String projectOriginName = "EaglercraftX";
|
public static final String projectOriginName = "EaglercraftX";
|
||||||
public static final String projectOriginAuthor = "lax1dude";
|
public static final String projectOriginAuthor = "lax1dude";
|
||||||
public static final String projectOriginRevision = "1.8";
|
public static final String projectOriginRevision = "1.8";
|
||||||
public static final String projectOriginVersion = "u31";
|
public static final String projectOriginVersion = "u32";
|
||||||
|
|
||||||
public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; // rest in peace
|
public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; // rest in peace
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ public class EaglercraftVersion {
|
||||||
public static final boolean enableUpdateService = true;
|
public static final boolean enableUpdateService = true;
|
||||||
|
|
||||||
public static final String updateBundlePackageName = "net.lax1dude.eaglercraft.v1_8.client";
|
public static final String updateBundlePackageName = "net.lax1dude.eaglercraft.v1_8.client";
|
||||||
public static final int updateBundlePackageVersionInt = 31;
|
public static final int updateBundlePackageVersionInt = 32;
|
||||||
|
|
||||||
public static final String updateLatestLocalStorageKey = "latestUpdate_" + updateBundlePackageName;
|
public static final String updateLatestLocalStorageKey = "latestUpdate_" + updateBundlePackageName;
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,10 @@ public class GLObjectMap<T> {
|
||||||
return (T) values[obj];
|
return (T) values[obj];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void set(int obj, T val) {
|
||||||
|
values[obj] = val;
|
||||||
|
}
|
||||||
|
|
||||||
private void resize() {
|
private void resize() {
|
||||||
int oldSize = size;
|
int oldSize = size;
|
||||||
size += size / 2;
|
size += size / 2;
|
||||||
|
|
|
@ -153,13 +153,14 @@ public class EaglerFolderResourcePack extends AbstractResourcePack {
|
||||||
List<String> fileNames = Lists.newArrayList();
|
List<String> fileNames = Lists.newArrayList();
|
||||||
|
|
||||||
logger.info("Counting files...");
|
logger.info("Counting files...");
|
||||||
ZipInputStream ziss = new ZipInputStream(new EaglerInputStream(file));
|
|
||||||
ZipEntry zipEntry;
|
ZipEntry zipEntry;
|
||||||
|
try(ZipInputStream ziss = new ZipInputStream(new EaglerInputStream(file))) {
|
||||||
while ((zipEntry = ziss.getNextEntry()) != null) {
|
while ((zipEntry = ziss.getNextEntry()) != null) {
|
||||||
if (!zipEntry.isDirectory()) {
|
if (!zipEntry.isDirectory()) {
|
||||||
fileNames.add(zipEntry.getName());
|
fileNames.add(zipEntry.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int prefixLen = Integer.MAX_VALUE;
|
int prefixLen = Integer.MAX_VALUE;
|
||||||
for(int i = 0, l = fileNames.size(); i < l; ++i) {
|
for(int i = 0, l = fileNames.size(); i < l; ++i) {
|
||||||
|
@ -195,16 +196,23 @@ public class EaglerFolderResourcePack extends AbstractResourcePack {
|
||||||
int totalSize = 0;
|
int totalSize = 0;
|
||||||
int totalFiles = 0;
|
int totalFiles = 0;
|
||||||
int lastProg = 0;
|
int lastProg = 0;
|
||||||
ziss = new ZipInputStream(new EaglerInputStream(file));
|
try(ZipInputStream ziss = new ZipInputStream(new EaglerInputStream(file))) {
|
||||||
|
int sz;
|
||||||
while ((zipEntry = ziss.getNextEntry()) != null) {
|
while ((zipEntry = ziss.getNextEntry()) != null) {
|
||||||
if (!zipEntry.isDirectory()) {
|
if (!zipEntry.isDirectory()) {
|
||||||
fn = zipEntry.getName();
|
fn = zipEntry.getName();
|
||||||
if(fn.length() > prefixLen) {
|
if(fn.length() > prefixLen) {
|
||||||
byte[] buffer = new byte[(int)zipEntry.getSize()];
|
byte[] buffer;
|
||||||
|
sz = (int)zipEntry.getSize();
|
||||||
|
if(sz >= 0) {
|
||||||
|
buffer = new byte[sz];
|
||||||
int i = 0, j;
|
int i = 0, j;
|
||||||
while(i < buffer.length && (j = ziss.read(buffer, i, buffer.length - i)) != -1) {
|
while(i < buffer.length && (j = ziss.read(buffer, i, buffer.length - i)) != -1) {
|
||||||
i += j;
|
i += j;
|
||||||
}
|
}
|
||||||
|
}else {
|
||||||
|
buffer = EaglerInputStream.inputStreamToBytes(ziss);
|
||||||
|
}
|
||||||
(new VFile2(prefix, folderName, fn.substring(prefixLen))).setAllBytes(buffer);
|
(new VFile2(prefix, folderName, fn.substring(prefixLen))).setAllBytes(buffer);
|
||||||
totalSize += buffer.length;
|
totalSize += buffer.length;
|
||||||
++totalFiles;
|
++totalFiles;
|
||||||
|
@ -215,6 +223,7 @@ public class EaglerFolderResourcePack extends AbstractResourcePack {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}catch(IOException ex) {
|
}catch(IOException ex) {
|
||||||
logger.error("Encountered an error extracting zip file, deleting extracted files...");
|
logger.error("Encountered an error extracting zip file, deleting extracted files...");
|
||||||
for(int i = 0, l = fileNames.size(); i < l; ++i) {
|
for(int i = 0, l = fileNames.size(); i < l; ++i) {
|
||||||
|
|
|
@ -488,6 +488,17 @@ public class EaglercraftGPU {
|
||||||
return mapTexturesGL.get(tex);
|
return mapTexturesGL.get(tex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final void regenerateTexture(int tex) {
|
||||||
|
ITextureGL webglTex = mapTexturesGL.get(tex);
|
||||||
|
if(webglTex != null) {
|
||||||
|
GlStateManager.unbindTextureIfCached(tex);
|
||||||
|
_wglDeleteTextures(webglTex);
|
||||||
|
mapTexturesGL.set(tex, _wglGenTextures());
|
||||||
|
}else {
|
||||||
|
logger.error("Tried to regenerate a missing texture!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static final void drawHighPoly(HighPolyMesh mesh) {
|
public static final void drawHighPoly(HighPolyMesh mesh) {
|
||||||
if(mesh.vertexCount == 0 || mesh.indexCount == 0 || mesh.vertexArray == null) {
|
if(mesh.vertexCount == 0 || mesh.indexCount == 0 || mesh.vertexArray == null) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -589,18 +589,25 @@ public class GlStateManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final void deleteTexture(int texture) {
|
public static final void deleteTexture(int texture) {
|
||||||
|
unbindTextureIfCached(texture);
|
||||||
_wglDeleteTextures(EaglercraftGPU.mapTexturesGL.free(texture));
|
_wglDeleteTextures(EaglercraftGPU.mapTexturesGL.free(texture));
|
||||||
boolean f = false;
|
}
|
||||||
|
|
||||||
|
static final void unbindTextureIfCached(int texture) {
|
||||||
|
boolean f1, f2 = false;
|
||||||
for(int i = 0; i < boundTexture.length; ++i) {
|
for(int i = 0; i < boundTexture.length; ++i) {
|
||||||
if(boundTexture[i] == texture) {
|
if(boundTexture[i] == texture) {
|
||||||
|
f1 = i != activeTexture;
|
||||||
|
if(f2 || f1) {
|
||||||
_wglActiveTexture(GL_TEXTURE0 + i);
|
_wglActiveTexture(GL_TEXTURE0 + i);
|
||||||
|
f2 = f1;
|
||||||
|
}
|
||||||
_wglBindTexture(GL_TEXTURE_2D, null);
|
_wglBindTexture(GL_TEXTURE_2D, null);
|
||||||
_wglBindTexture(GL_TEXTURE_3D, null);
|
_wglBindTexture(GL_TEXTURE_3D, null);
|
||||||
boundTexture[i] = -1;
|
boundTexture[i] = -1;
|
||||||
f = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(f) {
|
if(f2) {
|
||||||
_wglActiveTexture(GL_TEXTURE0 + activeTexture);
|
_wglActiveTexture(GL_TEXTURE0 + activeTexture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2058,7 +2058,7 @@ public class EaglerDeferredPipeline {
|
||||||
|
|
||||||
GlStateManager.disableBlend();
|
GlStateManager.disableBlend();
|
||||||
|
|
||||||
if(reprojectionEngineEnable || config.realisticWater) {
|
if(reprojectionEngineEnable || config.is_rendering_realisticWater) {
|
||||||
|
|
||||||
// =========== SAVE REPROJECTION DATA FOR NEXT FRAME ============= //
|
// =========== SAVE REPROJECTION DATA FOR NEXT FRAME ============= //
|
||||||
|
|
||||||
|
|
|
@ -74,13 +74,17 @@ public class WorldConverterMCA {
|
||||||
if (f.isDirectory()) continue;
|
if (f.isDirectory()) continue;
|
||||||
String lowerName = f.getName().toLowerCase();
|
String lowerName = f.getName().toLowerCase();
|
||||||
if (!(lowerName.endsWith(".dat") || lowerName.endsWith(".dat_old") || lowerName.endsWith(".mca") || lowerName.endsWith(".mcr") || lowerName.endsWith(".bmp"))) continue;
|
if (!(lowerName.endsWith(".dat") || lowerName.endsWith(".dat_old") || lowerName.endsWith(".mca") || lowerName.endsWith(".mcr") || lowerName.endsWith(".bmp"))) continue;
|
||||||
EaglerOutputStream baos = new EaglerOutputStream();
|
byte[] b;
|
||||||
int len;
|
int sz = (int)f.getSize();
|
||||||
while ((len = zis.read(bb)) != -1) {
|
if(sz >= 0) {
|
||||||
baos.write(bb, 0, len);
|
b = new byte[sz];
|
||||||
|
int j = 0, k;
|
||||||
|
while(j < b.length && (k = zis.read(b, j, b.length - j)) != -1) {
|
||||||
|
j += k;
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
b = EaglerInputStream.inputStreamToBytes(zis);
|
||||||
}
|
}
|
||||||
baos.close();
|
|
||||||
byte[] b = baos.toByteArray();
|
|
||||||
String fileName = f.getName().substring(folderPrefixOffset);
|
String fileName = f.getName().substring(folderPrefixOffset);
|
||||||
if (fileName.equals("level.dat") || fileName.equals("level.dat_old")) {
|
if (fileName.equals("level.dat") || fileName.equals("level.dat_old")) {
|
||||||
NBTTagCompound worldDatNBT = CompressedStreamTools.readCompressed(new EaglerInputStream(b));
|
NBTTagCompound worldDatNBT = CompressedStreamTools.readCompressed(new EaglerInputStream(b));
|
||||||
|
|
|
@ -30,6 +30,7 @@ public abstract class AbstractTexture implements ITextureObject {
|
||||||
protected boolean mipmap;
|
protected boolean mipmap;
|
||||||
protected boolean blurLast;
|
protected boolean blurLast;
|
||||||
protected boolean mipmapLast;
|
protected boolean mipmapLast;
|
||||||
|
protected boolean hasAllocated;
|
||||||
|
|
||||||
public void setBlurMipmapDirect(boolean parFlag, boolean parFlag2) {
|
public void setBlurMipmapDirect(boolean parFlag, boolean parFlag2) {
|
||||||
if (blur != parFlag || mipmap != parFlag2) {
|
if (blur != parFlag || mipmap != parFlag2) {
|
||||||
|
@ -67,6 +68,7 @@ public abstract class AbstractTexture implements ITextureObject {
|
||||||
public int getGlTextureId() {
|
public int getGlTextureId() {
|
||||||
if (this.glTextureId == -1) {
|
if (this.glTextureId == -1) {
|
||||||
this.glTextureId = TextureUtil.glGenTextures();
|
this.glTextureId = TextureUtil.glGenTextures();
|
||||||
|
hasAllocated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.glTextureId;
|
return this.glTextureId;
|
||||||
|
@ -79,4 +81,18 @@ public abstract class AbstractTexture implements ITextureObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is needed due to EaglercraftX's use of glTexStorage2D to
|
||||||
|
* allocate memory for textures, some OpenGL implementations don't like it when
|
||||||
|
* you call glTexStorage2D on the same texture object more than once
|
||||||
|
*/
|
||||||
|
protected void regenerateIfNotAllocated() {
|
||||||
|
if (this.glTextureId != -1) {
|
||||||
|
if (hasAllocated) {
|
||||||
|
EaglercraftGPU.regenerateTexture(glTextureId);
|
||||||
|
}
|
||||||
|
hasAllocated = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -40,6 +40,7 @@ public class DynamicTexture extends AbstractTexture {
|
||||||
this.width = textureWidth;
|
this.width = textureWidth;
|
||||||
this.height = textureHeight;
|
this.height = textureHeight;
|
||||||
this.dynamicTextureData = new int[textureWidth * textureHeight];
|
this.dynamicTextureData = new int[textureWidth * textureHeight];
|
||||||
|
this.hasAllocated = true;
|
||||||
TextureUtil.allocateTexture(this.getGlTextureId(), textureWidth, textureHeight);
|
TextureUtil.allocateTexture(this.getGlTextureId(), textureWidth, textureHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,7 @@ public class LayeredColorMaskTexture extends AbstractTexture {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
regenerateIfNotAllocated();
|
||||||
TextureUtil.uploadTextureImage(this.getGlTextureId(), bufferedimage);
|
TextureUtil.uploadTextureImage(this.getGlTextureId(), bufferedimage);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -63,6 +63,7 @@ public class LayeredTexture extends AbstractTexture {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
regenerateIfNotAllocated();
|
||||||
TextureUtil.uploadTextureImage(this.getGlTextureId(), bufferedimage);
|
TextureUtil.uploadTextureImage(this.getGlTextureId(), bufferedimage);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -62,6 +62,7 @@ public class SimpleTexture extends AbstractTexture {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
regenerateIfNotAllocated();
|
||||||
TextureUtil.uploadTextureImageAllocate(this.getGlTextureId(), bufferedimage, flag, flag1);
|
TextureUtil.uploadTextureImageAllocate(this.getGlTextureId(), bufferedimage, flag, flag1);
|
||||||
} finally {
|
} finally {
|
||||||
if (inputstream != null) {
|
if (inputstream != null) {
|
||||||
|
|
|
@ -74,6 +74,7 @@ public class TextureMap extends AbstractTexture implements ITickableTextureObjec
|
||||||
private int height;
|
private int height;
|
||||||
private boolean isEaglerPBRMode = false;
|
private boolean isEaglerPBRMode = false;
|
||||||
public int eaglerPBRMaterialTexture = -1;
|
public int eaglerPBRMaterialTexture = -1;
|
||||||
|
private boolean hasAllocatedEaglerPBRMaterialTexture = false;
|
||||||
|
|
||||||
public static final int _GL_FRAMEBUFFER = 0x8D40;
|
public static final int _GL_FRAMEBUFFER = 0x8D40;
|
||||||
public static final int _GL_COLOR_ATTACHMENT0 = 0x8CE0;
|
public static final int _GL_COLOR_ATTACHMENT0 = 0x8CE0;
|
||||||
|
@ -173,6 +174,7 @@ public class TextureMap extends AbstractTexture implements ITickableTextureObjec
|
||||||
if (isEaglerPBRMode) {
|
if (isEaglerPBRMode) {
|
||||||
if (eaglerPBRMaterialTexture == -1) {
|
if (eaglerPBRMaterialTexture == -1) {
|
||||||
eaglerPBRMaterialTexture = GlStateManager.generateTexture();
|
eaglerPBRMaterialTexture = GlStateManager.generateTexture();
|
||||||
|
hasAllocatedEaglerPBRMaterialTexture = false;
|
||||||
}
|
}
|
||||||
if (copyMaterialFramebuffer == null) {
|
if (copyMaterialFramebuffer == null) {
|
||||||
GlStateManager.bindTexture(eaglerPBRMaterialTexture);
|
GlStateManager.bindTexture(eaglerPBRMaterialTexture);
|
||||||
|
@ -422,9 +424,14 @@ public class TextureMap extends AbstractTexture implements ITickableTextureObjec
|
||||||
|
|
||||||
logger.info("Created: {}x{} {}-atlas", new Object[] { Integer.valueOf(stitcher.getCurrentWidth()),
|
logger.info("Created: {}x{} {}-atlas", new Object[] { Integer.valueOf(stitcher.getCurrentWidth()),
|
||||||
Integer.valueOf(stitcher.getCurrentHeight()), this.basePath });
|
Integer.valueOf(stitcher.getCurrentHeight()), this.basePath });
|
||||||
|
regenerateIfNotAllocated();
|
||||||
TextureUtil.allocateTextureImpl(this.getGlTextureId(), this.mipmapLevels, stitcher.getCurrentWidth(),
|
TextureUtil.allocateTextureImpl(this.getGlTextureId(), this.mipmapLevels, stitcher.getCurrentWidth(),
|
||||||
stitcher.getCurrentHeight());
|
stitcher.getCurrentHeight());
|
||||||
if (isEaglerPBRMode) {
|
if (isEaglerPBRMode) {
|
||||||
|
if (hasAllocatedEaglerPBRMaterialTexture) {
|
||||||
|
EaglercraftGPU.regenerateTexture(eaglerPBRMaterialTexture);
|
||||||
|
}
|
||||||
|
hasAllocatedEaglerPBRMaterialTexture = true;
|
||||||
TextureUtil.allocateTextureImpl(eaglerPBRMaterialTexture, this.mipmapLevels, stitcher.getCurrentWidth(),
|
TextureUtil.allocateTextureImpl(eaglerPBRMaterialTexture, this.mipmapLevels, stitcher.getCurrentWidth(),
|
||||||
stitcher.getCurrentHeight() * 2);
|
stitcher.getCurrentHeight() * 2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -326,7 +326,7 @@ public class TextureUtil {
|
||||||
public static int[] convertComponentOrder(int[] arr) {
|
public static int[] convertComponentOrder(int[] arr) {
|
||||||
for (int i = 0; i < arr.length; ++i) {
|
for (int i = 0; i < arr.length; ++i) {
|
||||||
int j = arr[i];
|
int j = arr[i];
|
||||||
arr[i] = (j & 0xFF000000) | ((j >> 16) & 0xFF) | (j & 0xFF00) | ((j << 16) & 0xFF0000);
|
arr[i] = ((j >> 16) & 0xFF) | (j & 0xFF00FF00) | ((j << 16) & 0xFF0000);
|
||||||
}
|
}
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,6 +136,8 @@ public abstract class ResourcePackListEntry implements GuiListExtended.IGuiListE
|
||||||
|
|
||||||
protected abstract void func_148313_c();
|
protected abstract void func_148313_c();
|
||||||
|
|
||||||
|
protected abstract String getEaglerFolderName();
|
||||||
|
|
||||||
protected boolean func_148310_d() {
|
protected boolean func_148310_d() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -183,7 +185,7 @@ public abstract class ResourcePackListEntry implements GuiListExtended.IGuiListE
|
||||||
if (deleteInstead) {
|
if (deleteInstead) {
|
||||||
this.mc.loadingScreen.eaglerShow(I18n.format("resourcePack.load.deleting"), this.func_148312_b());
|
this.mc.loadingScreen.eaglerShow(I18n.format("resourcePack.load.deleting"), this.func_148312_b());
|
||||||
EaglerFolderResourcePack.deleteResourcePack(EaglerFolderResourcePack.RESOURCE_PACKS,
|
EaglerFolderResourcePack.deleteResourcePack(EaglerFolderResourcePack.RESOURCE_PACKS,
|
||||||
this.func_148312_b());
|
this.getEaglerFolderName());
|
||||||
} else {
|
} else {
|
||||||
this.resourcePacksGUI.getSelectedResourcePacks().add(0, this);
|
this.resourcePacksGUI.getSelectedResourcePacks().add(0, this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,4 +100,9 @@ public class ResourcePackListEntryDefault extends ResourcePackListEntry {
|
||||||
protected boolean func_148310_d() {
|
protected boolean func_148310_d() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getEaglerFolderName() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -50,4 +50,9 @@ public class ResourcePackListEntryFound extends ResourcePackListEntry {
|
||||||
public ResourcePackRepository.Entry func_148318_i() {
|
public ResourcePackRepository.Entry func_148318_i() {
|
||||||
return this.field_148319_c;
|
return this.field_148319_c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getEaglerFolderName() {
|
||||||
|
return field_148319_c.getResourcePackName();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -7,6 +7,7 @@ import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import net.lax1dude.eaglercraft.v1_8.Base64;
|
||||||
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
import net.lax1dude.eaglercraft.v1_8.EagRuntime;
|
||||||
import net.lax1dude.eaglercraft.v1_8.EaglercraftVersion;
|
import net.lax1dude.eaglercraft.v1_8.EaglercraftVersion;
|
||||||
import net.lax1dude.eaglercraft.v1_8.profile.EaglerProfile;
|
import net.lax1dude.eaglercraft.v1_8.profile.EaglerProfile;
|
||||||
|
@ -377,10 +378,26 @@ public class PlatformRuntime {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Async
|
@Async
|
||||||
public static native ArrayBuffer downloadRemoteURI(String assetPackageURI, boolean forceCache);
|
public static native ArrayBuffer downloadRemoteURI(final String assetPackageURI, final boolean forceCache);
|
||||||
|
|
||||||
private static void downloadRemoteURI(String assetPackageURI, boolean useCache, final AsyncCallback<ArrayBuffer> cb) {
|
private static void downloadRemoteURI(final String assetPackageURI, final boolean useCache, final AsyncCallback<ArrayBuffer> cb) {
|
||||||
doFetchDownload(assetPackageURI, useCache ? "force-cache" : "no-store", cb::complete);
|
doFetchDownload(assetPackageURI, useCache ? "force-cache" : "no-store",
|
||||||
|
assetPackageURI.startsWith("data:application/octet-stream;base64,") ? (data) -> {
|
||||||
|
if(data != null) {
|
||||||
|
cb.complete(data);
|
||||||
|
}else {
|
||||||
|
logger.error("Caught an error decoding base64 via fetch, doing it the slow way instead...");
|
||||||
|
byte[] b = null;
|
||||||
|
try {
|
||||||
|
b = Base64.decodeBase64(assetPackageURI.substring(37));
|
||||||
|
}catch(Throwable t) {
|
||||||
|
logger.error("Failed to manually decode base64!", t);
|
||||||
|
cb.complete(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cb.complete(TeaVMUtils.unwrapArrayBuffer(b));
|
||||||
|
}
|
||||||
|
} : cb::complete);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isDebugRuntime() {
|
public static boolean isDebugRuntime() {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user