From 0f5f9e43cc0a460764ca8ea69ca439520696f8d0 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Tue, 6 Jun 2023 23:12:06 -0400 Subject: [PATCH] waaaaaa --- .../net/montoyo/wd/client/ClientProxy.java | 29 +- .../net/montoyo/wd/client/gui/GuiServer.java | 7 +- .../wd/client/renderers/ScreenBaker.java | 314 +++++++++++------- .../client/renderers/ScreenModelLoader.java | 23 +- .../webdisplays/models/block/screen.json | 5 +- .../webdisplays/textures/models/minepad.png | Bin 258 -> 0 bytes 6 files changed, 220 insertions(+), 158 deletions(-) delete mode 100644 src/main/resources/assets/webdisplays/textures/models/minepad.png diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 1ab8b0b..37e2277 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -21,6 +21,8 @@ import net.minecraft.client.multiplayer.ClientAdvancements; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.resources.model.Material; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; @@ -46,10 +48,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.ModelEvent; -import net.minecraftforge.client.event.RegisterKeyMappingsEvent; -import net.minecraftforge.client.event.RenderHandEvent; -import net.minecraftforge.client.event.RenderHighlightEvent; +import net.minecraftforge.client.event.*; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.level.LevelEvent; @@ -226,7 +225,6 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { BlockEntityRenderers.register(TileInit.SCREEN_BLOCK_ENTITY.get(), new ScreenRenderer.ScreenRendererProvider()); - registerBlockRenderLayers(RenderType.cutout(), BlockInit.blockKeyBoard.get(), BlockInit.blockKbRight.get()); } @SubscribeEvent @@ -579,16 +577,17 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer /**************************************** EVENT METHODS ****************************************/ -// @SubscribeEvent TODO: CHeck if we need this at all -// public void onStitchTextures(TextureStitchEvent.Pre ev) { -// TextureAtlas texMap = ev.getAtlas(); -// -// if(texMap == mc.getTextureManager()..getTextureAtlas()) { -// for(ResourceModelPair pair : modelBakers) -// pair.getModel().loadTextures(texMap); -// } -// } -// + @SubscribeEvent + public void onStitchTextures(TextureStitchEvent.Pre ev) { + TextureAtlas texMap = ev.getAtlas(); + + if (texMap.location().equals(TextureAtlas.LOCATION_BLOCKS)) { + for (Material materialsSide : ScreenModelLoader.MATERIALS_SIDES) { + ev.addSprite(materialsSide.texture()); + } + } + } + // @SubscribeEvent // public void onBakeModel(ModelBakeEvent ev) { // for(ResourceModelPair pair : modelBakers) diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java index cfc1863..fae025d 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiServer.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiServer.java @@ -230,7 +230,7 @@ public class GuiServer extends WDScreen { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == GLFW.GLFW_KEY_ESCAPE) { + if (keyCode == GLFW.GLFW_KEY_ESCAPE && !uploadWizard) { Minecraft.getInstance().setScreen(null); return true; } @@ -371,6 +371,10 @@ public class GuiServer extends WDScreen { if (keyCode == GLFW.GLFW_KEY_SPACE) typedChar = ' '; + if ( + (typedChar == 'v' || typedChar == 'V') && + (modifier & 2) == 2 + ) return; if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { if (prompt.length() > 0) @@ -384,7 +388,6 @@ public class GuiServer extends WDScreen { } else writeLine(userPrompt); } else if (prompt.length() + 1 < MAX_LINE_LEN && typedChar >= 32 && typedChar <= 126) - prompt = prompt + typedChar; blinkTime = 0; diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenBaker.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenBaker.java index 388ab5e..8a3d69c 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenBaker.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenBaker.java @@ -5,19 +5,24 @@ package net.montoyo.wd.client.renderers; import com.google.common.collect.ImmutableList; +import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemOverrides; import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelState; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.client.model.data.ModelProperty; import net.montoyo.wd.utilities.BlockSide; import net.montoyo.wd.utilities.Vector3f; import net.montoyo.wd.utilities.Vector3i; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.Nonnull; @@ -26,130 +31,185 @@ import java.util.List; import java.util.function.Function; public class ScreenBaker implements BakedModel { - - private static final List noQuads = ImmutableList.of(); - private final TextureAtlasSprite[] texs = new TextureAtlasSprite[16]; - private final BlockSide[] blockSides = BlockSide.values(); - private final Direction[] blockFacings = Direction.values(); - private final ModelState modelState; - private final Function spriteGetter; - private final ItemOverrides overrides; - private final ItemTransforms itemTransforms; - - public ScreenBaker(ModelState modelState, Function spriteGetter, ItemOverrides overrides, ItemTransforms itemTransforms) { - this.modelState = modelState; - this.spriteGetter = spriteGetter; - this.overrides = overrides; - this.itemTransforms = itemTransforms; - } - - private void putVertex(int[] buf, int pos, Vector3f vpos, TextureAtlasSprite tex, Vector3f uv, Vector3i normal) { - buf[pos * 7 + 0] = Float.floatToRawIntBits(vpos.x); - buf[pos * 7 + 1] = Float.floatToRawIntBits(vpos.y); - buf[pos * 7 + 2] = Float.floatToRawIntBits(vpos.z); - buf[pos * 7 + 3] = 0xFFFFFFFF; //Color, let this white... - buf[pos * 7 + 4] = Float.floatToRawIntBits(tex.getU(uv.x)); - buf[pos * 7 + 5] = Float.floatToRawIntBits(tex.getV(uv.y)); - - int nx = (normal.x * 127) & 0xFF; - int ny = (normal.y * 127) & 0xFF; - int nz = (normal.z * 127) & 0xFF; - buf[pos * 7 + 6] = nx | (ny << 8) | (nz << 16); - } - - private Vector3f rotateVec(Vector3f vec, BlockSide side) { - switch(side) { - case BOTTOM: return new Vector3f(vec.x, 1.0f, 1.0f - vec.z); - case TOP: return new Vector3f(vec.x, 0.0f, vec.z); - case NORTH: return new Vector3f(vec.x, vec.z, 1.0f); - case SOUTH: return new Vector3f(vec.x, 1.0f - vec.z, 0.0f); - case WEST: return new Vector3f(1.f , vec.x, vec.z); - case EAST: return new Vector3f(0.0f, 1.0f - vec.x, vec.z); - } - - throw new RuntimeException("Unknown block side " + side); - } - - private Vector3f rotateTex(BlockSide side, float u, float v) { - switch(side) { - case BOTTOM: return new Vector3f(u, 16.f - v, 0.0f); - case TOP: return new Vector3f(u, v, 0.0f); - case NORTH: return new Vector3f(16.f - u, 16.f - v, 0.0f); - case SOUTH: return new Vector3f(u, v, 0.0f); - case WEST: return new Vector3f(v, 16.f - u, 0.0f); - case EAST: return new Vector3f(16.f - v, u, 0.0f); - } - - throw new RuntimeException("Unknown block side " + side); - } - - private BakedQuad bakeSide(BlockSide side, TextureAtlasSprite tex) { - int[] data = new int[7 * 4]; - - putVertex(data, 3, rotateVec(new Vector3f(0.0f, 0.0f, 0.0f), side), tex, rotateTex(side, 0.0f, 0.0f ), side.backward); - putVertex(data, 2, rotateVec(new Vector3f(0.0f, 0.0f, 1.0f), side), tex, rotateTex(side, 0.0f, 16.0f ), side.backward); - putVertex(data, 1, rotateVec(new Vector3f(1.0f, 0.0f, 1.0f), side), tex, rotateTex(side, 16.0f, 16.0f), side.backward); - putVertex(data, 0, rotateVec(new Vector3f(1.0f, 0.0f, 0.0f), side), tex, rotateTex(side, 16.0f, 0.0f ), side.backward); - - return new BakedQuad(data, 0xFFFFFFFF, blockFacings[side.ordinal()], tex, true); - } - - @Override - public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource random) { - if(side == null) - return noQuads; - BlockState bs = state; - List ret = new ArrayList<>(); - - int sid = BlockSide.reverse(side.ordinal()); - BlockSide s = blockSides[sid]; - TextureAtlasSprite tex = texs[15]; - if(bs != null) { - IntegerProperty[] sideFlags = new IntegerProperty[6]; - for(int i = 0; i < sideFlags.length; i++) - sideFlags[i] = IntegerProperty.create("neighbor" + i, 0, 15); - tex = texs[bs.getValue(sideFlags[sid])]; - } - ret.add(bakeSide(s, tex)); - return ret; - } - - @Override - public boolean useAmbientOcclusion() { - return true; - } - - @Override - public boolean isGui3d() { - return true; - } - - @Override - public boolean usesBlockLight() { - return false; - } - - @Override - public boolean isCustomRenderer() { - return false; - } - - @Override - @Nonnull - public TextureAtlasSprite getParticleIcon() { - return texs[15]; - } - - @Override - @Nonnull - public ItemTransforms getTransforms() { - return ItemTransforms.NO_TRANSFORMS; - } - - @Override - @Nonnull - public ItemOverrides getOverrides() { - return ItemOverrides.EMPTY; - } - + + private static final List noQuads = ImmutableList.of(); + private final TextureAtlasSprite[] texs = new TextureAtlasSprite[16]; + private final BlockSide[] blockSides = BlockSide.values(); + private final Direction[] blockFacings = Direction.values(); + private final ModelState modelState; + private final Function spriteGetter; + private final ItemOverrides overrides; + private final ItemTransforms itemTransforms; + + IntegerModelProperty[] TEXTURES = new IntegerModelProperty[6]; + + public ScreenBaker(ModelState modelState, Function spriteGetter, ItemOverrides overrides, ItemTransforms itemTransforms) { + this.modelState = modelState; + this.spriteGetter = spriteGetter; + this.overrides = overrides; + this.itemTransforms = itemTransforms; + + for (int i = 0; i < texs.length; i++) { + texs[i] = spriteGetter.apply(ScreenModelLoader.MATERIALS_SIDES[i]); + } + + for (int i = 0; i < TEXTURES.length; i++) { + TEXTURES[i] = new IntegerModelProperty(); + } + } + + private void putVertex(int[] buf, int pos, Vector3f vpos, TextureAtlasSprite tex, Vector3f uv, Vector3i normal) { + buf[pos * 8 + 0] = Float.floatToRawIntBits(vpos.x); + buf[pos * 8 + 1] = Float.floatToRawIntBits(vpos.y); + buf[pos * 8 + 2] = Float.floatToRawIntBits(vpos.z); + buf[pos * 8 + 3] = 0xFFFFFFFF; //Color, let this white... + buf[pos * 8 + 4] = Float.floatToRawIntBits(tex.getU(uv.x)); + buf[pos * 8 + 5] = Float.floatToRawIntBits(tex.getV(uv.y)); + + int nx = (normal.x * 127) & 0xFF; + int ny = (normal.y * 127) & 0xFF; + int nz = (normal.z * 127) & 0xFF; + buf[pos * 8 + 7] = nx | (ny << 8) | (nz << 16); + } + + private Vector3f rotateVec(Vector3f vec, BlockSide side) { + return switch (side) { + case BOTTOM -> new Vector3f(vec.x, 1.0f, 1.0f - vec.z); + case TOP -> new Vector3f(vec.x, 0.0f, vec.z); + case NORTH -> new Vector3f(vec.x, vec.z, 1.0f); + case SOUTH -> new Vector3f(vec.x, 1.0f - vec.z, 0.0f); + case WEST -> new Vector3f(1.f, vec.x, vec.z); + case EAST -> new Vector3f(0.0f, 1.0f - vec.x, vec.z); + //noinspection UnnecessaryDefault + default -> throw new RuntimeException("Unknown block side " + side); + }; + } + + private Vector3f rotateTex(BlockSide side, float u, float v) { + return switch (side) { + case BOTTOM -> new Vector3f(16.f - u, 16.f - v, 0.0f); + case TOP -> new Vector3f(16.f - u, v, 0.0f); + case NORTH -> new Vector3f(16.f - u, 16.f - v, 0.0f); + case SOUTH -> new Vector3f(u, v, 0.0f); + case WEST -> new Vector3f(16.f - v, u, 0.0f); + case EAST -> new Vector3f(v, 16.f - u, 0.0f); + //noinspection UnnecessaryDefault + default -> throw new RuntimeException("Unknown block side " + side); + }; + } + + private BakedQuad bakeSide(BlockSide side, TextureAtlasSprite tex) { + int[] data = new int[8 * 4]; + + int rotation = switch (side) { + case NORTH -> 0; + case SOUTH -> 0; + case EAST -> 0; + case WEST -> 0; + case TOP -> 0; + case BOTTOM -> 0; + //noinspection UnnecessaryDefault + default -> throw new RuntimeException("Unknown block side " + side); + }; + + putVertex(data, (rotation + 3) % 4, rotateVec(new Vector3f(0.0f, 0.0f, 0.0f), side), tex, rotateTex(side, 16.0f, 0.0f), side.backward); + putVertex(data, (rotation + 2) % 4, rotateVec(new Vector3f(0.0f, 0.0f, 1.0f), side), tex, rotateTex(side, 16.0f, 16.0f), side.backward); + putVertex(data, (rotation + 1) % 4, rotateVec(new Vector3f(1.0f, 0.0f, 1.0f), side), tex, rotateTex(side, 0.0f, 16.0f), side.backward); + putVertex(data, (rotation + 0) % 4, rotateVec(new Vector3f(1.0f, 0.0f, 0.0f), side), tex, rotateTex(side, 0.0f, 0.0f), side.backward); + + return new BakedQuad(data, 0xFFFFFFFF, blockFacings[side.ordinal()].getOpposite(), tex, true); + } + + @Override + public List getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource random) { + return getQuads(state, side, random, ModelData.EMPTY, null); + } + + @Override + public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, @NotNull ModelData data, @Nullable RenderType renderType) { + if (side == null) + return noQuads; + + List ret = new ArrayList<>(); + + int sid = BlockSide.reverse(side.ordinal()); + BlockSide s = blockSides[sid]; + TextureAtlasSprite tex = texs[15]; + if (data.has(TEXTURES[side.ordinal()])) + tex = texs[data.get(TEXTURES[side.ordinal()])]; + ret.add(bakeSide(s, tex)); + return ret; + } + + @Override + public @NotNull ModelData getModelData(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, @NotNull BlockState state, @NotNull ModelData modelData) { + ModelData.Builder builder = ModelData.builder(); + for (int i = 0; i < TEXTURES.length; i++) { + int res = 0; + BlockSide side = blockSides[i]; + BlockState u = level.getBlockState(pos.offset(side.up.x, side.up.y, side.up.z)); + BlockState d = level.getBlockState(pos.offset(-side.up.x, -side.up.y, -side.up.z)); + if ( + u.getBlock() == state.getBlock() && + d.getBlock() != state.getBlock() + ) res = 1; + else res = 4; + + BlockState r = level.getBlockState(pos.offset(side.right.x, side.right.y, side.right.z)); + BlockState l = level.getBlockState(pos.offset(-side.right.x, -side.right.y, -side.right.z)); + if ( + r.getBlock() == state.getBlock() && + l.getBlock() != state.getBlock() + ) { + if (res == 1) res = 9; + else if (res == 4) res = 12; + else res = 8; + } + + builder.with(TEXTURES[i], res); + } + return builder.build(); + } + + @Override + public boolean useAmbientOcclusion() { + return true; + } + + @Override + public boolean isGui3d() { + return true; + } + + @Override + public boolean usesBlockLight() { + return false; + } + + @Override + public boolean isCustomRenderer() { + return false; + } + + @Override + @Nonnull + public TextureAtlasSprite getParticleIcon() { + return texs[15]; + } + + @Override + @Nonnull + public ItemTransforms getTransforms() { + return ItemTransforms.NO_TRANSFORMS; + } + + @Override + @Nonnull + public ItemOverrides getOverrides() { + return ItemOverrides.EMPTY; + } + + //@formatter:off + public final class IntegerModelProperty extends ModelProperty {} + //@formatter:on } diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenModelLoader.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenModelLoader.java index 8f611d5..0d387d3 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenModelLoader.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenModelLoader.java @@ -13,25 +13,31 @@ import net.minecraftforge.client.model.geometry.IGeometryBakingContext; import net.minecraftforge.client.model.geometry.IGeometryLoader; import net.minecraftforge.client.model.geometry.IUnbakedGeometry; +import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.Set; import java.util.function.Function; public class ScreenModelLoader implements IGeometryLoader { - public static final ResourceLocation SCREEN_LOADER = new ResourceLocation("webdisplays", "screen_loader"); - public static final ResourceLocation SCREEN_SIDE = new ResourceLocation("webdisplays", "block/screen"); - - public static final Material MATERIAL_SIDE = ForgeHooksClient.getBlockMaterial(SCREEN_SIDE); + public static final ResourceLocation SCREEN_SIDE = new ResourceLocation("webdisplays", "blocks/screen"); + private static final ResourceLocation[] SIDES = new ResourceLocation[16]; + public static final Material[] MATERIALS_SIDES = new Material[16]; + + static { + for (int i = 0; i < SIDES.length; i++) { + SIDES[i] = new ResourceLocation(SCREEN_SIDE.getNamespace(), SCREEN_SIDE.getPath() + i); + MATERIALS_SIDES[i] = ForgeHooksClient.getBlockMaterial(SIDES[i]); + } + } + @Override public ScreenModelGeometry read(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { return new ScreenModelGeometry(); } - public static class ScreenModelGeometry implements IUnbakedGeometry { @Override @@ -41,12 +47,9 @@ public class ScreenModelLoader implements IGeometryLoader getMaterials(IGeometryBakingContext iGeometryBakingContext, Function function, Set> set) { - return List.of(MATERIAL_SIDE); + return Arrays.asList(MATERIALS_SIDES); } } - - - } diff --git a/src/main/resources/assets/webdisplays/models/block/screen.json b/src/main/resources/assets/webdisplays/models/block/screen.json index f8e03ca..92e6e72 100644 --- a/src/main/resources/assets/webdisplays/models/block/screen.json +++ b/src/main/resources/assets/webdisplays/models/block/screen.json @@ -1,6 +1,3 @@ { - "parent": "block/cube_all", - "textures": { - "all": "webdisplays:blocks/screen15" - } + "loader": "webdisplays:screen_loader" } diff --git a/src/main/resources/assets/webdisplays/textures/models/minepad.png b/src/main/resources/assets/webdisplays/textures/models/minepad.png deleted file mode 100644 index d77de822700ce2dd6ed8a4be54267ba2480175df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmV+d0sa1oP)p}_Am@pF|wtA7$bnkO-$2-ob$B;m>D4igb<*VI(&dY;}*;)rC^My@|CZ?)4Po0 z2=9HJfacW?m