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;
@ -36,11 +41,10 @@ public class GuiMinePad extends WDScreen {
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;
@ -48,10 +52,19 @@ public class GuiMinePad extends WDScreen {
vx = 16.0f; vx = 16.0f;
vy = (((double) height) - vh) / 2.0f; vy = (((double) height) - vh) / 2.0f;
trueWidth = width;
trueHeight = height;
this.width = (int) vw; this.width = (int) vw;
this.height = (int) vh; this.height = (int) vh;
super.init(); super.init();
((MCEFBrowser) pad.view).setCursor(CefCursorType.fromId(pad.activeCursor));
((MCEFBrowser) pad.view).setCursorChangeListener((id) -> {
pad.activeCursor = id;
((MCEFBrowser) pad.view).setCursor(CefCursorType.fromId(id));
});
} }
private static void addRect(BufferBuilder bb, double x, double y, double w, double h) { private static void addRect(BufferBuilder bb, double x, double y, double w, double h) {
@ -61,31 +74,49 @@ public class GuiMinePad extends WDScreen {
bb.vertex(x, y + h, 0.0).color(255, 255, 255, 255).endVertex(); bb.vertex(x, y + h, 0.0).color(255, 255, 255, 255).endVertex();
} }
// @Override @Override
// public void render(PoseStack poseStack, int mouseX, int mouseY, float ptt) { public void render(GuiGraphics graphics, int mouseX, int mouseY, float ptt) {
// renderBackground(poseStack); width = trueWidth;
// height = trueHeight;
// RenderSystem.disableTexture(); renderBackground(graphics);
// RenderSystem.disableCull(); width = (int) vw;
// RenderSystem.setShaderColor(0.73f, 0.73f, 0.73f, 1.0f); height = (int) vh;
//
// Tesselator t = Tesselator.getInstance(); RenderSystem.disableCull();
// BufferBuilder bb = t.getBuilder(); RenderSystem.setShaderColor(0.73f, 0.73f, 0.73f, 1.0f);
// bb.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR);
// addRect(bb, vx, vy - 16, vw, 16); Tesselator t = Tesselator.getInstance();
// addRect(bb, vx, vy + vh, vw, 16); BufferBuilder bb = t.getBuilder();
// addRect(bb, vx - 16, vy, 16, vh); bb.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR);
// addRect(bb, vx + vw, vy, 16, vh); addRect(bb, vx, vy - 16, vw, 16);
// t.end(); addRect(bb, vx, vy + vh, vw, 16);
// addRect(bb, vx - 16, vy, 16, vh);
// RenderSystem.enableTexture(); addRect(bb, vx + vw, vy, 16, vh);
// t.end();
// if (pad.view != null) {
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();
BufferBuilder buffer = t.getBuilder();
buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR);
double x1 = vx;
double y1 = vy;
double x2 = vx + vw;
double y2 = vy + vh;
buffer.vertex(graphics.pose().last().pose(), (float) x1, (float) y1, 0.0f).uv(0.0F, 0.0F).color(255, 255, 255, 255).endVertex();
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();
t.end();
RenderSystem.enableDepthTest();
}
RenderSystem.enableCull();
}
@Override @Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) { public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
@ -99,13 +130,12 @@ public class GuiMinePad extends WDScreen {
@Override @Override
public boolean charTyped(char codePoint, int modifiers) { public boolean charTyped(char codePoint, int modifiers) {
// if (pad.view != null) { if (pad.view != null) {
// pad.view.injectKeyTyped((int) codePoint, modifiers); ((MCEFBrowser) pad.view).sendKeyTyped(codePoint, modifiers);
// return true; return true;
// } else { } else {
// return super.charTyped(codePoint, modifiers); return super.charTyped(codePoint, modifiers);
// } }
return false;
} }
/* copied from MCEF */ /* copied from MCEF */
@ -124,21 +154,21 @@ public class GuiMinePad extends WDScreen {
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;
} }
@ -161,15 +191,15 @@ public class GuiMinePad extends WDScreen {
return super.mouseReleased(mouseX, mouseY, button); return super.mouseReleased(mouseX, mouseY, button);
} }
@Override
public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
mouse(button, true, (int) mouseX, (int) mouseY, 0);
return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
}
@Override @Override
public boolean mouseScrolled(double mouseX, double mouseY, double amount) { public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
mouse(-1, false, (int) mouseX, (int) mouseY, amount); double mx = (mouseX - vx) / vw;
double my = (mouseY - vy) / vh;
int sx = (int) (mx * WebDisplays.INSTANCE.padResX);
int sy = (int) (my * WebDisplays.INSTANCE.padResY);
// TODO: this doesn't work, and I don't understand why?
((MCEFBrowser) pad.view).sendMouseWheel(sx, sy, amount, (hasControlDown() && !hasAltDown() && !hasShiftDown()) ? GLFW.GLFW_MOD_CONTROL : 0);
return super.mouseScrolled(mouseX, mouseY, amount); return super.mouseScrolled(mouseX, mouseY, amount);
} }
@ -177,31 +207,30 @@ public class GuiMinePad extends WDScreen {
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();
} }
@ -210,7 +239,7 @@ public class GuiMinePad extends WDScreen {
@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
} }
@ -222,19 +251,17 @@ public class GuiMinePad extends WDScreen {
@Override @Override
public void removed() { public void removed() {
super.removed(); super.removed();
if (pad.view instanceof CefBrowserOsr osr) { if (pad.view instanceof MCEFBrowser browser) {
// osr.allowCursorChanges(true); browser.setCursor(CefCursorType.POINTER);
osr.onCursorChange(null, 0); browser.setCursorChangeListener((cursor) -> {
pad.activeCursor = cursor;
});
} }
} }
@Override @Override
public void onClose() { public void onClose() {
super.onClose(); super.onClose();
// if (WebDisplays.cursorSupport) { removed();
// pad.view.allowCursorChanges(false);
// if (pad.view instanceof CefBrowserOsr osr)
// osr.onCursorChange(null, 0);
// }
} }
} }

View File

@ -115,7 +115,7 @@ 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);

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);
} }