minepad stuff

This commit is contained in:
GiantLuigi4 2023-09-27 22:33:13 -04:00
parent e0ab3d2495
commit ce718eeea2
4 changed files with 253 additions and 216 deletions

View File

@ -194,6 +194,8 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
private final UUID id; private final UUID id;
private long lastURLSent; private long lastURLSent;
public int activeCursor;
private PadData(String url, UUID id) { private PadData(String url, UUID id) {
String webUrl; String webUrl;
try { try {
@ -202,8 +204,12 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
throw new RuntimeException(e); throw new RuntimeException(e);
} }
view = MCEF.createBrowser(WebDisplays.applyBlacklist(webUrl), false); view = MCEF.createBrowser(WebDisplays.applyBlacklist(webUrl), false);
if (view instanceof MCEFBrowser browser) if (view instanceof MCEFBrowser browser) {
browser.resize((int) WebDisplays.INSTANCE.padResX, (int) WebDisplays.INSTANCE.padResY); browser.resize((int) WebDisplays.INSTANCE.padResX, (int) WebDisplays.INSTANCE.padResY);
browser.setCursorChangeListener((cursor) -> {
activeCursor = cursor;
});
}
isInHotbar = true; isInHotbar = true;
this.id = id; this.id = id;
} }

View File

@ -4,9 +4,13 @@
package net.montoyo.wd.client.gui; package net.montoyo.wd.client.gui;
import com.cinemamod.mcef.MCEF;
import com.cinemamod.mcef.MCEFBrowser;
import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.vertex.*;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@ -14,6 +18,7 @@ import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.client.ClientProxy;
import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.BlockSide;
import org.cef.browser.CefBrowserOsr; import org.cef.browser.CefBrowserOsr;
import org.cef.misc.CefCursorType;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import java.util.Optional; import java.util.Optional;
@ -22,219 +27,241 @@ import static net.minecraftforge.api.distmarker.Dist.CLIENT;
@OnlyIn(CLIENT) @OnlyIn(CLIENT)
public class GuiMinePad extends WDScreen { public class GuiMinePad extends WDScreen {
private ClientProxy.PadData pad; private ClientProxy.PadData pad;
private double vx; private double vx;
private double vy; private double vy;
private double vw; private double vw;
private double vh; private double vh;
public GuiMinePad() { public GuiMinePad() {
super(Component.nullToEmpty(null)); super(Component.nullToEmpty(null));
} }
public GuiMinePad(ClientProxy.PadData pad) { public GuiMinePad(ClientProxy.PadData pad) {
this(); this();
this.pad = pad; this.pad = pad;
}
// if (WebDisplays.cursorSupport)
// pad.view.allowCursorChanges(true); int trueWidth, trueHeight;
}
@Override
@Override public void init() {
public void init() { vw = ((double) width) - 32.0f;
vw = ((double) width) - 32.0f; vh = vw / WebDisplays.PAD_RATIO;
vh = vw / WebDisplays.PAD_RATIO; vx = 16.0f;
vx = 16.0f; vy = (((double) height) - vh) / 2.0f;
vy = (((double) height) - vh) / 2.0f;
trueWidth = width;
this.width = (int) vw; trueHeight = height;
this.height = (int) vh;
this.width = (int) vw;
super.init(); this.height = (int) vh;
}
super.init();
private static void addRect(BufferBuilder bb, double x, double y, double w, double h) {
bb.vertex(x, y, 0.0).color(255, 255, 255, 255).endVertex(); ((MCEFBrowser) pad.view).setCursor(CefCursorType.fromId(pad.activeCursor));
bb.vertex(x + w, y, 0.0).color(255, 255, 255, 255).endVertex(); ((MCEFBrowser) pad.view).setCursorChangeListener((id) -> {
bb.vertex(x + w, y + h, 0.0).color(255, 255, 255, 255).endVertex(); pad.activeCursor = id;
bb.vertex(x, y + h, 0.0).color(255, 255, 255, 255).endVertex(); ((MCEFBrowser) pad.view).setCursor(CefCursorType.fromId(id));
} });
}
// @Override
// public void render(PoseStack poseStack, int mouseX, int mouseY, float ptt) { private static void addRect(BufferBuilder bb, double x, double y, double w, double h) {
// renderBackground(poseStack); bb.vertex(x, y, 0.0).color(255, 255, 255, 255).endVertex();
// bb.vertex(x + w, y, 0.0).color(255, 255, 255, 255).endVertex();
// RenderSystem.disableTexture(); bb.vertex(x + w, y + h, 0.0).color(255, 255, 255, 255).endVertex();
// RenderSystem.disableCull(); bb.vertex(x, y + h, 0.0).color(255, 255, 255, 255).endVertex();
// RenderSystem.setShaderColor(0.73f, 0.73f, 0.73f, 1.0f); }
//
// Tesselator t = Tesselator.getInstance(); @Override
// BufferBuilder bb = t.getBuilder(); public void render(GuiGraphics graphics, int mouseX, int mouseY, float ptt) {
// bb.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); width = trueWidth;
// addRect(bb, vx, vy - 16, vw, 16); height = trueHeight;
// addRect(bb, vx, vy + vh, vw, 16); renderBackground(graphics);
// addRect(bb, vx - 16, vy, 16, vh); width = (int) vw;
// addRect(bb, vx + vw, vy, 16, vh); height = (int) vh;
// t.end();
// RenderSystem.disableCull();
// RenderSystem.enableTexture(); RenderSystem.setShaderColor(0.73f, 0.73f, 0.73f, 1.0f);
//
// if (pad.view != null) { Tesselator t = Tesselator.getInstance();
BufferBuilder bb = t.getBuilder();
bb.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR);
addRect(bb, vx, vy - 16, vw, 16);
addRect(bb, vx, vy + vh, vw, 16);
addRect(bb, vx - 16, vy, 16, vh);
addRect(bb, vx + vw, vy, 16, vh);
t.end();
if (pad.view != null) {
// pad.view.draw(poseStack, vx, vy + vh, vx + vw, vy); // pad.view.draw(poseStack, vx, vy + vh, vx + vw, vy);
// } RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);
// RenderSystem.disableDepthTest();
// RenderSystem.enableCull(); RenderSystem.setShader(GameRenderer::getPositionTexColorShader);
// } RenderSystem.setShaderTexture(0, ((MCEFBrowser) pad.view).getRenderer().getTextureID());
t = Tesselator.getInstance();
@Override BufferBuilder buffer = t.getBuilder();
public boolean keyPressed(int keyCode, int scanCode, int modifiers) { buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR);
return this.keyChanged(keyCode, scanCode, modifiers, true) || super.keyPressed(keyCode, scanCode, modifiers); double x1 = vx;
} double y1 = vy;
double x2 = vx + vw;
@Override double y2 = vy + vh;
public boolean keyReleased(int keyCode, int scanCode, int modifiers) { buffer.vertex(graphics.pose().last().pose(), (float) x1, (float) y1, 0.0f).uv(0.0F, 0.0F).color(255, 255, 255, 255).endVertex();
return this.keyChanged(keyCode, scanCode, modifiers, false) || super.keyReleased(keyCode, scanCode, modifiers); buffer.vertex(graphics.pose().last().pose(), (float) x2, (float) y1, 0.0f).uv(1.0F, 0.0F).color(255, 255, 255, 255).endVertex();
} buffer.vertex(graphics.pose().last().pose(), (float) x2, (float) y2, 0.0f).uv(1.0F, 1.0F).color(255, 255, 255, 255).endVertex();
buffer.vertex(graphics.pose().last().pose(), (float) x1, (float) y2, 0.0f).uv(0.0F, 1.0F).color(255, 255, 255, 255).endVertex();
@Override t.end();
public boolean charTyped(char codePoint, int modifiers) { RenderSystem.enableDepthTest();
// if (pad.view != null) { }
// pad.view.injectKeyTyped((int) codePoint, modifiers);
// return true; RenderSystem.enableCull();
// } else { }
// return super.charTyped(codePoint, modifiers);
// } @Override
return false; public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
} return this.keyChanged(keyCode, scanCode, modifiers, true) || super.keyPressed(keyCode, scanCode, modifiers);
}
/* copied from MCEF */
public boolean keyChanged(int keyCode, int scanCode, int modifiers, boolean pressed) { @Override
assert minecraft != null; public boolean keyReleased(int keyCode, int scanCode, int modifiers) {
if (keyCode == GLFW.GLFW_KEY_ESCAPE) { return this.keyChanged(keyCode, scanCode, modifiers, false) || super.keyReleased(keyCode, scanCode, modifiers);
minecraft.setScreen(null); }
return true;
} @Override
public boolean charTyped(char codePoint, int modifiers) {
InputConstants.Key iuKey = InputConstants.getKey(keyCode, scanCode); if (pad.view != null) {
String keystr = iuKey.getDisplayName().getString(); ((MCEFBrowser) pad.view).sendKeyTyped(codePoint, modifiers);
return true;
} else {
return super.charTyped(codePoint, modifiers);
}
}
/* copied from MCEF */
public boolean keyChanged(int keyCode, int scanCode, int modifiers, boolean pressed) {
assert minecraft != null;
if (keyCode == GLFW.GLFW_KEY_ESCAPE) {
minecraft.setScreen(null);
return true;
}
InputConstants.Key iuKey = InputConstants.getKey(keyCode, scanCode);
String keystr = iuKey.getDisplayName().getString();
// System.out.println("KEY STR " + keystr); // System.out.println("KEY STR " + keystr);
if (keystr.length() == 0) if (keystr.length() == 0)
return false; return false;
char key = keystr.charAt(keystr.length() - 1); char key = keystr.charAt(keystr.length() - 1);
if(keystr.equals("Enter")) { if (keystr.equals("Enter")) {
keyCode = 10; keyCode = 10;
key = '\n'; key = '\n';
} }
// if (pad.view != null) { if (pad.view != null) {
// if (pressed) if (pressed)
// pad.view.injectKeyPressedByKeyCode(keyCode, key, modifiers); ((MCEFBrowser) pad.view).sendKeyPress(keyCode, scanCode, modifiers);
// else else
// pad.view.injectKeyReleasedByKeyCode(keyCode, key, modifiers); ((MCEFBrowser) pad.view).sendKeyRelease(keyCode, scanCode, modifiers);
//
// if (pressed && key == '\n') if (pressed && key == '\n')
// if (modifiers != 0) pad.view.injectKeyTyped('\r', modifiers); if (modifiers != 0) ((MCEFBrowser) pad.view).sendKeyTyped('\r', modifiers);
// return true; return true;
// } }
return false; return false;
} }
@Override @Override
public void mouseMoved(double mouseX, double mouseY) { public void mouseMoved(double mouseX, double mouseY) {
super.mouseMoved(mouseX, mouseY); super.mouseMoved(mouseX, mouseY);
mouse(-1, false, (int) mouseX, (int) mouseY, 0); mouse(-1, false, (int) mouseX, (int) mouseY, 0);
} }
@Override @Override
public boolean mouseClicked(double mouseX, double mouseY, int button) { public boolean mouseClicked(double mouseX, double mouseY, int button) {
mouse(button, true, (int) mouseX, (int) mouseY, 0); mouse(button, true, (int) mouseX, (int) mouseY, 0);
return super.mouseClicked(mouseX, mouseY, button); return super.mouseClicked(mouseX, mouseY, button);
} }
@Override @Override
public boolean mouseReleased(double mouseX, double mouseY, int button) { public boolean mouseReleased(double mouseX, double mouseY, int button) {
mouse(button, false, (int) mouseX, (int) mouseY, 0); mouse(button, false, (int) mouseX, (int) mouseY, 0);
return super.mouseReleased(mouseX, mouseY, button); return super.mouseReleased(mouseX, mouseY, button);
} }
@Override @Override
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
mouse(button, true, (int) mouseX, (int) mouseY, 0); double mx = (mouseX - vx) / vw;
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); double my = (mouseY - vy) / vh;
} int sx = (int) (mx * WebDisplays.INSTANCE.padResX);
int sy = (int) (my * WebDisplays.INSTANCE.padResY);
@Override // TODO: this doesn't work, and I don't understand why?
public boolean mouseScrolled(double mouseX, double mouseY, double amount) { ((MCEFBrowser) pad.view).sendMouseWheel(sx, sy, amount, (hasControlDown() && !hasAltDown() && !hasShiftDown()) ? GLFW.GLFW_MOD_CONTROL : 0);
mouse(-1, false, (int) mouseX, (int) mouseY, amount);
return super.mouseScrolled(mouseX, mouseY, amount); return super.mouseScrolled(mouseX, mouseY, amount);
} }
public void mouse(int btn, boolean pressed, int sx, int sy, double scrollAmount) { public void mouse(int btn, boolean pressed, int sx, int sy, double scrollAmount) {
double mx = (sx - vx) / vw; double mx = (sx - vx) / vw;
double my = (sy - vy) / vh; double my = (sy - vy) / vh;
// if (pad.view != null && mx >= 0 && mx <= 1) { if (pad.view != null && mx >= 0 && mx <= 1) {
// int wheel = (int) scrollAmount; //Scale again according to the webview
// sx = (int) (mx * WebDisplays.INSTANCE.padResX);
// //Scale again according to the webview sy = (int) (my * WebDisplays.INSTANCE.padResY);
// sx = (int) (mx * WebDisplays.INSTANCE.padResX);
// sy = (int) (my * WebDisplays.INSTANCE.padResY); if (btn == -1)
// ((MCEFBrowser) pad.view).sendMouseMove(sx, sy);
// if (wheel != 0) else if (pressed)
// pad.view.injectMouseWheel(sx, sy, (hasControlDown() && ! hasAltDown() && !hasShiftDown()) ? GLFW.GLFW_MOD_CONTROL : 0, wheel, 0); ((MCEFBrowser) pad.view).sendMousePress(sx, sy, btn);
// if (btn == -1) else
// pad.view.injectMouseMove(sx, sy, 0, sy < 0); ((MCEFBrowser) pad.view).sendMouseRelease(sx, sy, btn);
// else pad.view.setFocus(true);
// pad.view.injectMouseButton(sx, sy, 0, btn + 1, pressed, 1); }
// } }
}
public static Optional<Character> getChar(int keyCode, int scanCode) {
public static Optional<Character> getChar(int keyCode, int scanCode) { String keystr = GLFW.glfwGetKeyName(keyCode, scanCode);
String keystr = GLFW.glfwGetKeyName(keyCode, scanCode); if (keystr == null) {
if(keystr == null){ keystr = "\0";
keystr = "\0"; }
} if (keyCode == GLFW.GLFW_KEY_ENTER) {
if(keyCode == GLFW.GLFW_KEY_ENTER){ keystr = "\n";
keystr = "\n"; }
} if (keystr.length() == 0) {
if(keystr.length() == 0){ return Optional.empty();
return Optional.empty(); }
}
return Optional.of(keystr.charAt(keystr.length() - 1));
return Optional.of(keystr.charAt(keystr.length() - 1)); }
}
@Override
@Override public void tick() {
public void tick() { if (pad.view == null)
if(pad.view == null) minecraft.setScreen(null); //In case the user dies with the pad in the hand
minecraft.setScreen(null); //In case the user dies with the pad in the hand }
}
@Override
@Override public boolean isForBlock(BlockPos bp, BlockSide side) {
public boolean isForBlock(BlockPos bp, BlockSide side) { return false;
return false; }
}
@Override
@Override public void removed() {
public void removed() { super.removed();
super.removed(); if (pad.view instanceof MCEFBrowser browser) {
if (pad.view instanceof CefBrowserOsr osr) { browser.setCursor(CefCursorType.POINTER);
// osr.allowCursorChanges(true); browser.setCursorChangeListener((cursor) -> {
osr.onCursorChange(null, 0); pad.activeCursor = cursor;
} });
} }
}
@Override
public void onClose() { @Override
super.onClose(); public void onClose() {
// if (WebDisplays.cursorSupport) { super.onClose();
// pad.view.allowCursorChanges(false); removed();
// if (pad.view instanceof CefBrowserOsr osr) }
// osr.onCursorChange(null, 0);
// }
}
} }

View File

@ -115,8 +115,8 @@ public final class MinePadRenderer implements IItemRenderer {
double y2 = 14.0 / 32.0 + 0.002; double y2 = 14.0 / 32.0 + 0.002;
stack.translate(0.063f, 0.28f, 0.001f); stack.translate(0.063f, 0.28f, 0.001f);
RenderSystem.setShaderTexture(0, tex); // RenderSystem.setShaderTexture(0, tex);
RenderSystem.disableDepthTest(); RenderSystem.disableDepthTest();
RenderSystem.setShader(GameRenderer::getPositionTexColorShader); RenderSystem.setShader(GameRenderer::getPositionTexColorShader);
RenderSystem.setShaderTexture(0, ((MCEFBrowser) pd.view).getRenderer().getTextureID()); RenderSystem.setShaderTexture(0, ((MCEFBrowser) pd.view).getRenderer().getTextureID());

View File

@ -234,6 +234,10 @@ public class TileEntityScreen extends BlockEntity {
else else
mcefBrowser.resize(resolution.x, resolution.y); mcefBrowser.resize(resolution.x, resolution.y);
// uh yes this is intentional
// basically: on my laptop, this line caused an error inexplicably
// reason: the compiler didn't update this file, so it stayed as a Consumer<Integer> in the bytecode
//noinspection RedundantCast
mcefBrowser.setCursorChangeListener((MCEFCursorChangeListener) (type) -> mouseType = type); mcefBrowser.setCursorChangeListener((MCEFCursorChangeListener) (type) -> mouseType = type);
} }