fixed texture corruption (really)

This commit is contained in:
LAX1DUDE 2022-08-09 17:43:26 -07:00
parent 0b2a351278
commit d4d5d24805
9 changed files with 34770 additions and 34653 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -554,6 +554,9 @@ public class EaglerAdapterImpl2 {
public static final void _wglBindFramebuffer(int p1, FramebufferGL p2) { public static final void _wglBindFramebuffer(int p1, FramebufferGL p2) {
GL30.glBindFramebuffer(p1, p2 == null ? 0 : p2.obj); GL30.glBindFramebuffer(p1, p2 == null ? 0 : p2.obj);
} }
public static final void _wglReadBuffer(int p1) {
GL11.glReadBuffer(p1);
}
public static final void _wglDrawBuffer(int p1) { public static final void _wglDrawBuffer(int p1) {
GL11.glDrawBuffer(p1); GL11.glDrawBuffer(p1);
} }
@ -569,6 +572,9 @@ public class EaglerAdapterImpl2 {
public static final void _wglFramebufferTexture2D(int p1, TextureGL p2) { public static final void _wglFramebufferTexture2D(int p1, TextureGL p2) {
GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, p1, GL11.GL_TEXTURE_2D, p2.obj, 0); GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, p1, GL11.GL_TEXTURE_2D, p2.obj, 0);
} }
public static final void _wglFramebufferTexture2D(int p1, TextureGL p2, int lvl) {
GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, p1, GL11.GL_TEXTURE_2D, p2.obj, lvl);
}
public static final RenderbufferGL _wglCreateRenderBuffer() { public static final RenderbufferGL _wglCreateRenderBuffer() {
return new RenderbufferGL(GL30.glGenRenderbuffers()); return new RenderbufferGL(GL30.glGenRenderbuffers());
} }
@ -899,6 +905,9 @@ public class EaglerAdapterImpl2 {
public static final void mouseSetGrabbed(boolean grabbed) { public static final void mouseSetGrabbed(boolean grabbed) {
Mouse.setGrabbed(grabbed); Mouse.setGrabbed(grabbed);
} }
public static final boolean isPointerLocked() {
return Mouse.isGrabbed();
}
public static final int mouseGetDX() { public static final int mouseGetDX() {
return Mouse.getDX(); return Mouse.getDX();
} }
@ -1245,6 +1254,10 @@ public class EaglerAdapterImpl2 {
fileChooserName = null; fileChooserName = null;
return s; return s;
} }
public static final void clearFileChooserResult() {
fileChooserName = null;
fileChooserFile = null;
}
public static final void setListenerPos(float x, float y, float z, float vx, float vy, float vz, float pitch, float yaw) { 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 var2 = MathHelper.cos(-yaw * 0.017453292F);
float var3 = MathHelper.sin(-yaw * 0.017453292F); float var3 = MathHelper.sin(-yaw * 0.017453292F);
@ -1354,10 +1367,10 @@ public class EaglerAdapterImpl2 {
} }
public static final boolean voiceAvailable() { public static final boolean voiceAvailable() {
return true; return false;
} }
public static final boolean voiceAllowed() { public static final boolean voiceAllowed() {
return true; return false;
} }
public static final boolean voiceRelayed() { public static final boolean voiceRelayed() {
return false; return false;
@ -1643,7 +1656,7 @@ public class EaglerAdapterImpl2 {
} }
public static final boolean isIntegratedServerAvailable() { public static final boolean isIntegratedServerAvailable() {
return true; //TODO: change to false return false; //TODO: change to false
} }
public static final void beginLoadingIntegratedServer() { public static final void beginLoadingIntegratedServer() {
@ -1651,7 +1664,7 @@ public class EaglerAdapterImpl2 {
} }
public static final boolean isIntegratedServerAlive() { public static final boolean isIntegratedServerAlive() {
throw new UnsupportedOperationException("Integrated server is not available in LWJGL eagleradapter"); return false;
} }
public static final void terminateIntegratedServer() { public static final void terminateIntegratedServer() {
@ -1670,7 +1683,7 @@ public class EaglerAdapterImpl2 {
throw new UnsupportedOperationException("Integrated server is not available in LWJGL eagleradapter"); throw new UnsupportedOperationException("Integrated server is not available in LWJGL eagleradapter");
} }
public static final PKT recieveFromIntegratedServer(String channel, byte[] pkt) { public static final PKT recieveFromIntegratedServer(String channel) {
throw new UnsupportedOperationException("Integrated server is not available in LWJGL eagleradapter"); throw new UnsupportedOperationException("Integrated server is not available in LWJGL eagleradapter");
} }

View File

@ -6,7 +6,7 @@ public class ConfigConstants {
public static boolean profanity = false; public static boolean profanity = false;
public static final String version = "SP-SNAPSHOT-03"; public static final String version = "SP-SNAPSHOT-04";
public static final String mainMenuString = "eaglercraft " + version; public static final String mainMenuString = "eaglercraft " + version;
public static final String forkMe = "https://github.com/LAX1DUDE/eaglercraft"; public static final String forkMe = "https://github.com/LAX1DUDE/eaglercraft";

View File

@ -5,6 +5,8 @@ import java.nio.ByteOrder;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.FramebufferGL;
import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2.TextureGL;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.src.Block; import net.minecraft.src.Block;
import net.minecraft.src.GLAllocation; import net.minecraft.src.GLAllocation;
@ -21,7 +23,7 @@ public class TextureTerrainMap implements IconRegister {
public final String name; public final String name;
public final int id; public final int id;
public final int size; public final int size;
private EaglerImage[][] frames = null; private TextureGL frames = null;
private int[] framesIdx = null; private int[] framesIdx = null;
protected int originX; protected int originX;
@ -72,6 +74,13 @@ public class TextureTerrainMap implements IconRegister {
this.maxV_center = (float)(originY_center + 16 - 0.025f) / (float)map.height; this.maxV_center = (float)(originY_center + 16 - 0.025f) / (float)map.height;
} }
private void free() {
if(frames != null) {
EaglerAdapter._wglDeleteTextures(frames);
frames = null;
}
}
@Override @Override
public int getOriginX() { public int getOriginX() {
return originX_center; return originX_center;
@ -131,12 +140,11 @@ public class TextureTerrainMap implements IconRegister {
private void updateAnimation() { private void updateAnimation() {
if(frames != null) { if(frames != null) {
int var4 = this.frameCounter;
this.frameCounter = (this.frameCounter + 1) % this.framesIdx.length; this.frameCounter = (this.frameCounter + 1) % this.framesIdx.length;
int i = framesIdx[this.frameCounter]; int i = framesIdx[this.frameCounter];
if (this.frameCurrent != i) { if (this.frameCurrent != i) {
this.frameCurrent = i; this.frameCurrent = i;
map.replaceTexture(this, frames[i]); map.copyFrame(this, i);
} }
} }
} }
@ -153,19 +161,58 @@ public class TextureTerrainMap implements IconRegister {
int ss = size * 16; int ss = size * 16;
int divs = img.h / ss; int divs = img.h / ss;
if(divs == 1) { if(divs == 1) {
map.replaceTexture(this, generateMip(img));
this.frames = null; this.frames = null;
this.framesIdx = null; this.framesIdx = null;
map.replaceTexture(this, generateMip(img));
}else { }else {
frames = new EaglerImage[divs][]; map.replaceTexture(this, generateMip(img.getSubImage(0, 0, ss, ss)));
for(int i = 0; i < divs; ++i) {
frames[i] = generateMip(img.getSubImage(0, i * ss, ss, ss)); EaglerAdapter.glBindTexture(EaglerAdapter.GL_TEXTURE_2D, -1);
} frames = EaglerAdapter._wglGenTextures();
EaglerAdapter._wglBindTexture(EaglerAdapter.GL_TEXTURE_2D, frames);
EaglerImage mipLvl = populateAlpha(img);
uploadBuffer.clear();
uploadBuffer.put(mipLvl.data);
uploadBuffer.flip();
EaglerAdapter.glTexImage2D(EaglerAdapter.GL_TEXTURE_2D, 0, EaglerAdapter.GL_RGBA, mipLvl.w, mipLvl.h, 0,
EaglerAdapter.GL_RGBA, EaglerAdapter.GL_UNSIGNED_BYTE, uploadBuffer);
mipLvl = generateLevel(mipLvl);
uploadBuffer.clear();
uploadBuffer.put(mipLvl.data);
uploadBuffer.flip();
EaglerAdapter.glTexImage2D(EaglerAdapter.GL_TEXTURE_2D, 1, EaglerAdapter.GL_RGBA, mipLvl.w, mipLvl.h, 0,
EaglerAdapter.GL_RGBA, EaglerAdapter.GL_UNSIGNED_BYTE, uploadBuffer);
mipLvl = generateLevel(mipLvl);
uploadBuffer.clear();
uploadBuffer.put(mipLvl.data);
uploadBuffer.flip();
EaglerAdapter.glTexImage2D(EaglerAdapter.GL_TEXTURE_2D, 2, EaglerAdapter.GL_RGBA, mipLvl.w, mipLvl.h, 0,
EaglerAdapter.GL_RGBA, EaglerAdapter.GL_UNSIGNED_BYTE, uploadBuffer);
mipLvl = generateLevel(mipLvl);
uploadBuffer.clear();
uploadBuffer.put(mipLvl.data);
uploadBuffer.flip();
EaglerAdapter.glTexImage2D(EaglerAdapter.GL_TEXTURE_2D, 3, EaglerAdapter.GL_RGBA, mipLvl.w, mipLvl.h, 0,
EaglerAdapter.GL_RGBA, EaglerAdapter.GL_UNSIGNED_BYTE, uploadBuffer);
mipLvl = generateLevel(mipLvl);
uploadBuffer.clear();
uploadBuffer.put(mipLvl.data);
uploadBuffer.flip();
EaglerAdapter.glTexImage2D(EaglerAdapter.GL_TEXTURE_2D, 4, EaglerAdapter.GL_RGBA, mipLvl.w, mipLvl.h, 0,
EaglerAdapter.GL_RGBA, EaglerAdapter.GL_UNSIGNED_BYTE, uploadBuffer);
EaglerAdapter.glTexParameteri(EaglerAdapter.GL_TEXTURE_2D, EaglerAdapter.GL_TEXTURE_MAX_LEVEL, 4);
String dat = EaglerAdapter.fileContents("/" + map.basePath + name + ".txt"); String dat = EaglerAdapter.fileContents("/" + map.basePath + name + ".txt");
if(dat != null) System.out.println("Found animation info for: " + map.basePath + name + ".png"); if(dat != null) System.out.println("Found animation info for: " + map.basePath + name + ".png");
if(dat == null || (dat = dat.trim()).isEmpty()) { if(dat == null || (dat = dat.trim()).isEmpty()) {
framesIdx = new int[frames.length]; framesIdx = new int[divs];
for(int i = 0; i < frames.length; ++i) { for(int i = 0; i < divs; ++i) {
framesIdx[i] = i; framesIdx[i] = i;
} }
}else { }else {
@ -190,7 +237,6 @@ public class TextureTerrainMap implements IconRegister {
} }
} }
} }
map.replaceTexture(this, this.frames[framesIdx[0]]);
} }
} }
} }
@ -205,10 +251,12 @@ public class TextureTerrainMap implements IconRegister {
private ArrayList<TerrainIconV2> iconList; private ArrayList<TerrainIconV2> iconList;
public final int texture; public final int texture;
private final EaglerImage[] missingData; private final EaglerImage[] missingData;
public final FramebufferGL copyFramebuffer;
private int[] nextSlot = new int[3]; private int[] nextSlot = new int[3];
private static final IntBuffer uploadBuffer = EaglerAdapter.isWebGL ? IntBuffer.wrap(new int[4096]) : ByteBuffer.allocateDirect(4096 << 2).order(ByteOrder.nativeOrder()).asIntBuffer(); private static final IntBuffer uploadBuffer = EaglerAdapter.isWebGL ? IntBuffer.wrap(new int[0xFFFF]) :
ByteBuffer.allocateDirect(0xFFFF << 2).order(ByteOrder.nativeOrder()).asIntBuffer();
public TextureTerrainMap(int size, String par2, String par3Str, EaglerImage par4BufferedImage) { public TextureTerrainMap(int size, String par2, String par3Str, EaglerImage par4BufferedImage) {
this.width = size; this.width = size;
@ -217,15 +265,16 @@ public class TextureTerrainMap implements IconRegister {
this.missingImage = new TerrainIconV2(nextSlot[1]++, 1, this, null); this.missingImage = new TerrainIconV2(nextSlot[1]++, 1, this, null);
this.iconList = new ArrayList(); this.iconList = new ArrayList();
this.texture = EaglerAdapter.glGenTextures(); this.texture = EaglerAdapter.glGenTextures();
this.copyFramebuffer = EaglerAdapter._wglCreateFramebuffer();
EaglerAdapter.glBindTexture(EaglerAdapter.GL_TEXTURE_2D, texture); EaglerAdapter.glBindTexture(EaglerAdapter.GL_TEXTURE_2D, texture);
int levelW = width; int levelW = width;
int levelH = height; int levelH = height;
IntBuffer blank = GLAllocation.createDirectIntBuffer(levelW * levelH); IntBuffer blank = GLAllocation.createDirectIntBuffer(levelW * levelH);
for(int i = 0; i < blank.limit(); ++i) {
blank.put(i, ((i / width + (i % width)) % 2 == 0) ? 0xffff00ff : 0xff000000);
}
for(int i = 0; i < 5; ++i) { for(int i = 0; i < 5; ++i) {
blank.clear().limit(levelW * levelH); blank.clear().limit(levelW * levelH);
for(int j = 0; j < blank.limit(); ++j) {
blank.put(j, ((j / levelW + (j % levelW)) % 2 == 0) ? 0xffff00ff : 0xff000000);
}
EaglerAdapter.glTexImage2D(EaglerAdapter.GL_TEXTURE_2D, i, EaglerAdapter.GL_RGBA, levelW, levelH, 0, EaglerAdapter.GL_RGBA, EaglerAdapter.GL_UNSIGNED_BYTE, blank); EaglerAdapter.glTexImage2D(EaglerAdapter.GL_TEXTURE_2D, i, EaglerAdapter.GL_RGBA, levelW, levelH, 0, EaglerAdapter.GL_RGBA, EaglerAdapter.GL_UNSIGNED_BYTE, blank);
levelW /= 2; levelW /= 2;
levelH /= 2; levelH /= 2;
@ -406,6 +455,9 @@ public class TextureTerrainMap implements IconRegister {
} }
public void refreshTextures() { public void refreshTextures() {
for(TerrainIconV2 t : iconList) {
t.free();
}
iconList.clear(); iconList.clear();
nextSlot = new int[3]; nextSlot = new int[3];
nextSlot[1] = 1; nextSlot[1] = 1;
@ -429,8 +481,6 @@ public class TextureTerrainMap implements IconRegister {
} }
private void replaceTexture(TerrainIconV2 icon, EaglerImage[] textures) { private void replaceTexture(TerrainIconV2 icon, EaglerImage[] textures) {
int levelW = width;
int levelH = height;
int divisor = 1; int divisor = 1;
EaglerAdapter.glBindTexture(EaglerAdapter.GL_TEXTURE_2D, texture); EaglerAdapter.glBindTexture(EaglerAdapter.GL_TEXTURE_2D, texture);
for(int i = 0; i < 5; i++) { for(int i = 0; i < 5; i++) {
@ -439,12 +489,46 @@ public class TextureTerrainMap implements IconRegister {
uploadBuffer.flip(); uploadBuffer.flip();
EaglerAdapter.glTexSubImage2D(EaglerAdapter.GL_TEXTURE_2D, i, icon.originX / divisor, icon.originY / divisor, EaglerAdapter.glTexSubImage2D(EaglerAdapter.GL_TEXTURE_2D, i, icon.originX / divisor, icon.originY / divisor,
(16 * icon.size + 32) / divisor, (16 * icon.size + 32) / divisor, EaglerAdapter.GL_RGBA, EaglerAdapter.GL_UNSIGNED_BYTE, uploadBuffer); (16 * icon.size + 32) / divisor, (16 * icon.size + 32) / divisor, EaglerAdapter.GL_RGBA, EaglerAdapter.GL_UNSIGNED_BYTE, uploadBuffer);
levelW /= 2;
levelH /= 2;
divisor *= 2; divisor *= 2;
} }
} }
private void copyFrame(TerrainIconV2 icon, int frame) {
int off = icon.size * 16;
int divisor = 1;
EaglerAdapter._wglBindFramebuffer(EaglerAdapter._wGL_FRAMEBUFFER, copyFramebuffer);
EaglerAdapter._wglReadBuffer(EaglerAdapter._wGL_COLOR_ATTACHMENT0);
for(int i = 0; i < 5; i++) {
EaglerAdapter._wglBindTexture(EaglerAdapter.GL_TEXTURE_2D, icon.frames);
EaglerAdapter._wglFramebufferTexture2D(EaglerAdapter._wGL_COLOR_ATTACHMENT0, icon.frames, i);
EaglerAdapter.glBindTexture(EaglerAdapter.GL_TEXTURE_2D, texture);
// 0, -1
EaglerAdapter.glCopyTexSubImage2D(EaglerAdapter.GL_TEXTURE_2D, i, icon.originX_center / divisor, (icon.originY_center - 16) / divisor,
0, (frame * off + off - 16 / divisor), off, 16 / divisor);
// -1, 0
EaglerAdapter.glCopyTexSubImage2D(EaglerAdapter.GL_TEXTURE_2D, i, (icon.originX_center - 16) / divisor, icon.originY_center / divisor,
off - 16 / divisor, frame * off, 16 / divisor, off);
// 0, 0
EaglerAdapter.glCopyTexSubImage2D(EaglerAdapter.GL_TEXTURE_2D, i, icon.originX_center / divisor, icon.originY_center / divisor,
0, frame * off, off, off);
// 0, 1
EaglerAdapter.glCopyTexSubImage2D(EaglerAdapter.GL_TEXTURE_2D, i, icon.originX_center / divisor, (icon.originY_center + 16 * icon.size) / divisor,
0, frame * off, off, 16 / divisor);
// 1, 0
EaglerAdapter.glCopyTexSubImage2D(EaglerAdapter.GL_TEXTURE_2D, i, (icon.originX_center + 16 * icon.size) / divisor, icon.originY_center / divisor,
0, frame * off, 16 / divisor, off);
off /= 2;
divisor *= 2;
}
EaglerAdapter._wglBindFramebuffer(EaglerAdapter._wGL_FRAMEBUFFER, null);
}
public void updateAnimations() { public void updateAnimations() {
for(TerrainIconV2 t : iconList) { for(TerrainIconV2 t : iconList) {
t.updateAnimation(); t.updateAnimation();

View File

@ -876,6 +876,9 @@ public class EaglerAdapterImpl2 {
public static final void _wglBindFramebuffer(int p1, FramebufferGL p2) { public static final void _wglBindFramebuffer(int p1, FramebufferGL p2) {
webgl.bindFramebuffer(p1, p2 == null ? null : p2.obj); webgl.bindFramebuffer(p1, p2 == null ? null : p2.obj);
} }
public static final void _wglReadBuffer(int p1) {
webgl.readBuffer(p1);
}
public static final FramebufferGL _wglCreateFramebuffer() { public static final FramebufferGL _wglCreateFramebuffer() {
return new FramebufferGL(webgl.createFramebuffer()); return new FramebufferGL(webgl.createFramebuffer());
} }
@ -885,6 +888,9 @@ public class EaglerAdapterImpl2 {
public static final void _wglFramebufferTexture2D(int p1, TextureGL p2) { public static final void _wglFramebufferTexture2D(int p1, TextureGL p2) {
webgl.framebufferTexture2D(FRAMEBUFFER, p1, TEXTURE_2D, p2 == null ? null : p2.obj, 0); webgl.framebufferTexture2D(FRAMEBUFFER, p1, TEXTURE_2D, p2 == null ? null : p2.obj, 0);
} }
public static final void _wglFramebufferTexture2D(int p1, TextureGL p2, int p3) {
webgl.framebufferTexture2D(FRAMEBUFFER, p1, TEXTURE_2D, p2 == null ? null : p2.obj, p3);
}
public static final QueryGL _wglCreateQuery() { public static final QueryGL _wglCreateQuery() {
return new QueryGL(webgl.createQuery()); return new QueryGL(webgl.createQuery());
} }

View File

@ -39,4 +39,6 @@ public interface WebGL2RenderingContext extends WebGLRenderingContext {
void drawBuffers(int[] p1); void drawBuffers(int[] p1);
void readBuffer(int p1);
} }