This commit is contained in:
GiantLuigi4 2023-06-06 23:12:06 -04:00
parent d6ed36063d
commit 0f5f9e43cc
6 changed files with 220 additions and 158 deletions

View File

@ -21,6 +21,8 @@ import net.minecraft.client.multiplayer.ClientAdvancements;
import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; 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.BlockPos;
import net.minecraft.core.NonNullList; import net.minecraft.core.NonNullList;
import net.minecraft.nbt.CompoundTag; 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.HitResult;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.client.event.*;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.client.event.RenderHighlightEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.event.level.LevelEvent;
@ -226,7 +225,6 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
@SubscribeEvent @SubscribeEvent
public static void onClientSetup(FMLClientSetupEvent event) { public static void onClientSetup(FMLClientSetupEvent event) {
BlockEntityRenderers.register(TileInit.SCREEN_BLOCK_ENTITY.get(), new ScreenRenderer.ScreenRendererProvider()); BlockEntityRenderers.register(TileInit.SCREEN_BLOCK_ENTITY.get(), new ScreenRenderer.ScreenRendererProvider());
registerBlockRenderLayers(RenderType.cutout(), BlockInit.blockKeyBoard.get(), BlockInit.blockKbRight.get());
} }
@SubscribeEvent @SubscribeEvent
@ -579,16 +577,17 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
/**************************************** EVENT METHODS ****************************************/ /**************************************** EVENT METHODS ****************************************/
// @SubscribeEvent TODO: CHeck if we need this at all @SubscribeEvent
// public void onStitchTextures(TextureStitchEvent.Pre ev) { public void onStitchTextures(TextureStitchEvent.Pre ev) {
// TextureAtlas texMap = ev.getAtlas(); TextureAtlas texMap = ev.getAtlas();
//
// if(texMap == mc.getTextureManager()..getTextureAtlas()) { if (texMap.location().equals(TextureAtlas.LOCATION_BLOCKS)) {
// for(ResourceModelPair pair : modelBakers) for (Material materialsSide : ScreenModelLoader.MATERIALS_SIDES) {
// pair.getModel().loadTextures(texMap); ev.addSprite(materialsSide.texture());
// } }
// } }
// }
// @SubscribeEvent // @SubscribeEvent
// public void onBakeModel(ModelBakeEvent ev) { // public void onBakeModel(ModelBakeEvent ev) {
// for(ResourceModelPair pair : modelBakers) // for(ResourceModelPair pair : modelBakers)

View File

@ -230,7 +230,7 @@ public class GuiServer extends WDScreen {
@Override @Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) { 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); Minecraft.getInstance().setScreen(null);
return true; return true;
} }
@ -371,6 +371,10 @@ public class GuiServer extends WDScreen {
if (keyCode == GLFW.GLFW_KEY_SPACE) if (keyCode == GLFW.GLFW_KEY_SPACE)
typedChar = ' '; typedChar = ' ';
if (
(typedChar == 'v' || typedChar == 'V') &&
(modifier & 2) == 2
) return;
if (keyCode == GLFW.GLFW_KEY_BACKSPACE) { if (keyCode == GLFW.GLFW_KEY_BACKSPACE) {
if (prompt.length() > 0) if (prompt.length() > 0)
@ -384,7 +388,6 @@ public class GuiServer extends WDScreen {
} else } else
writeLine(userPrompt); writeLine(userPrompt);
} else if (prompt.length() + 1 < MAX_LINE_LEN && typedChar >= 32 && typedChar <= 126) } else if (prompt.length() + 1 < MAX_LINE_LEN && typedChar >= 32 && typedChar <= 126)
prompt = prompt + typedChar; prompt = prompt + typedChar;
blinkTime = 0; blinkTime = 0;

View File

@ -5,19 +5,24 @@
package net.montoyo.wd.client.renderers; package net.montoyo.wd.client.renderers;
import com.google.common.collect.ImmutableList; 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.BakedQuad;
import net.minecraft.client.renderer.block.model.ItemOverrides; import net.minecraft.client.renderer.block.model.ItemOverrides;
import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelState; import net.minecraft.client.resources.model.ModelState;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource; 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.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.BlockSide;
import net.montoyo.wd.utilities.Vector3f; import net.montoyo.wd.utilities.Vector3f;
import net.montoyo.wd.utilities.Vector3i; import net.montoyo.wd.utilities.Vector3i;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@ -27,129 +32,184 @@ import java.util.function.Function;
public class ScreenBaker implements BakedModel { public class ScreenBaker implements BakedModel {
private static final List<BakedQuad> noQuads = ImmutableList.of(); private static final List<BakedQuad> noQuads = ImmutableList.of();
private final TextureAtlasSprite[] texs = new TextureAtlasSprite[16]; private final TextureAtlasSprite[] texs = new TextureAtlasSprite[16];
private final BlockSide[] blockSides = BlockSide.values(); private final BlockSide[] blockSides = BlockSide.values();
private final Direction[] blockFacings = Direction.values(); private final Direction[] blockFacings = Direction.values();
private final ModelState modelState; private final ModelState modelState;
private final Function<net.minecraft.client.resources.model.Material, TextureAtlasSprite> spriteGetter; private final Function<net.minecraft.client.resources.model.Material, TextureAtlasSprite> spriteGetter;
private final ItemOverrides overrides; private final ItemOverrides overrides;
private final ItemTransforms itemTransforms; private final ItemTransforms itemTransforms;
public ScreenBaker(ModelState modelState, Function<net.minecraft.client.resources.model.Material, TextureAtlasSprite> spriteGetter, ItemOverrides overrides, ItemTransforms itemTransforms) { IntegerModelProperty[] TEXTURES = new IntegerModelProperty[6];
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) { public ScreenBaker(ModelState modelState, Function<net.minecraft.client.resources.model.Material, TextureAtlasSprite> spriteGetter, ItemOverrides overrides, ItemTransforms itemTransforms) {
buf[pos * 7 + 0] = Float.floatToRawIntBits(vpos.x); this.modelState = modelState;
buf[pos * 7 + 1] = Float.floatToRawIntBits(vpos.y); this.spriteGetter = spriteGetter;
buf[pos * 7 + 2] = Float.floatToRawIntBits(vpos.z); this.overrides = overrides;
buf[pos * 7 + 3] = 0xFFFFFFFF; //Color, let this white... this.itemTransforms = itemTransforms;
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; for (int i = 0; i < texs.length; i++) {
int ny = (normal.y * 127) & 0xFF; texs[i] = spriteGetter.apply(ScreenModelLoader.MATERIALS_SIDES[i]);
int nz = (normal.z * 127) & 0xFF; }
buf[pos * 7 + 6] = nx | (ny << 8) | (nz << 16);
}
private Vector3f rotateVec(Vector3f vec, BlockSide side) { for (int i = 0; i < TEXTURES.length; i++) {
switch(side) { TEXTURES[i] = new IntegerModelProperty();
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 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));
private Vector3f rotateTex(BlockSide side, float u, float v) { int nx = (normal.x * 127) & 0xFF;
switch(side) { int ny = (normal.y * 127) & 0xFF;
case BOTTOM: return new Vector3f(u, 16.f - v, 0.0f); int nz = (normal.z * 127) & 0xFF;
case TOP: return new Vector3f(u, v, 0.0f); buf[pos * 8 + 7] = nx | (ny << 8) | (nz << 16);
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 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 BakedQuad bakeSide(BlockSide side, TextureAtlasSprite tex) { private Vector3f rotateTex(BlockSide side, float u, float v) {
int[] data = new int[7 * 4]; 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);
};
}
putVertex(data, 3, rotateVec(new Vector3f(0.0f, 0.0f, 0.0f), side), tex, rotateTex(side, 0.0f, 0.0f ), side.backward); private BakedQuad bakeSide(BlockSide side, TextureAtlasSprite tex) {
putVertex(data, 2, rotateVec(new Vector3f(0.0f, 0.0f, 1.0f), side), tex, rotateTex(side, 0.0f, 16.0f ), side.backward); int[] data = new int[8 * 4];
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); 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);
};
@Override putVertex(data, (rotation + 3) % 4, rotateVec(new Vector3f(0.0f, 0.0f, 0.0f), side), tex, rotateTex(side, 16.0f, 0.0f), side.backward);
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource random) { putVertex(data, (rotation + 2) % 4, rotateVec(new Vector3f(0.0f, 0.0f, 1.0f), side), tex, rotateTex(side, 16.0f, 16.0f), side.backward);
if(side == null) putVertex(data, (rotation + 1) % 4, rotateVec(new Vector3f(1.0f, 0.0f, 1.0f), side), tex, rotateTex(side, 0.0f, 16.0f), side.backward);
return noQuads; putVertex(data, (rotation + 0) % 4, rotateVec(new Vector3f(1.0f, 0.0f, 0.0f), side), tex, rotateTex(side, 0.0f, 0.0f), side.backward);
BlockState bs = state;
List<BakedQuad> ret = new ArrayList<>();
int sid = BlockSide.reverse(side.ordinal()); return new BakedQuad(data, 0xFFFFFFFF, blockFacings[side.ordinal()].getOpposite(), tex, true);
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 @Override
public boolean useAmbientOcclusion() { public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource random) {
return true; return getQuads(state, side, random, ModelData.EMPTY, null);
} }
@Override @Override
public boolean isGui3d() { public @NotNull List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, @NotNull RandomSource rand, @NotNull ModelData data, @Nullable RenderType renderType) {
return true; if (side == null)
} return noQuads;
@Override List<BakedQuad> ret = new ArrayList<>();
public boolean usesBlockLight() {
return false;
}
@Override int sid = BlockSide.reverse(side.ordinal());
public boolean isCustomRenderer() { BlockSide s = blockSides[sid];
return false; 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 @Override
@Nonnull public @NotNull ModelData getModelData(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, @NotNull BlockState state, @NotNull ModelData modelData) {
public TextureAtlasSprite getParticleIcon() { ModelData.Builder builder = ModelData.builder();
return texs[15]; 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;
@Override BlockState r = level.getBlockState(pos.offset(side.right.x, side.right.y, side.right.z));
@Nonnull BlockState l = level.getBlockState(pos.offset(-side.right.x, -side.right.y, -side.right.z));
public ItemTransforms getTransforms() { if (
return ItemTransforms.NO_TRANSFORMS; r.getBlock() == state.getBlock() &&
} l.getBlock() != state.getBlock()
) {
if (res == 1) res = 9;
else if (res == 4) res = 12;
else res = 8;
}
@Override builder.with(TEXTURES[i], res);
@Nonnull }
public ItemOverrides getOverrides() { return builder.build();
return ItemOverrides.EMPTY; }
}
@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<Integer> {}
//@formatter:on
} }

View File

@ -13,25 +13,31 @@ import net.minecraftforge.client.model.geometry.IGeometryBakingContext;
import net.minecraftforge.client.model.geometry.IGeometryLoader; import net.minecraftforge.client.model.geometry.IGeometryLoader;
import net.minecraftforge.client.model.geometry.IUnbakedGeometry; import net.minecraftforge.client.model.geometry.IUnbakedGeometry;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.function.Function; import java.util.function.Function;
public class ScreenModelLoader implements IGeometryLoader<ScreenModelLoader.ScreenModelGeometry> { public class ScreenModelLoader implements IGeometryLoader<ScreenModelLoader.ScreenModelGeometry> {
public static final ResourceLocation SCREEN_LOADER = new ResourceLocation("webdisplays", "screen_loader"); 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 ResourceLocation SCREEN_SIDE = new ResourceLocation("webdisplays", "blocks/screen");
public static final Material MATERIAL_SIDE = ForgeHooksClient.getBlockMaterial(SCREEN_SIDE); 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 @Override
public ScreenModelGeometry read(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { public ScreenModelGeometry read(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
return new ScreenModelGeometry(); return new ScreenModelGeometry();
} }
public static class ScreenModelGeometry implements IUnbakedGeometry<ScreenModelGeometry> { public static class ScreenModelGeometry implements IUnbakedGeometry<ScreenModelGeometry> {
@Override @Override
@ -41,12 +47,9 @@ public class ScreenModelLoader implements IGeometryLoader<ScreenModelLoader.Scre
@Override @Override
public Collection<Material> getMaterials(IGeometryBakingContext iGeometryBakingContext, Function<ResourceLocation, UnbakedModel> function, Set<Pair<String, String>> set) { public Collection<Material> getMaterials(IGeometryBakingContext iGeometryBakingContext, Function<ResourceLocation, UnbakedModel> function, Set<Pair<String, String>> set) {
return List.of(MATERIAL_SIDE); return Arrays.asList(MATERIALS_SIDES);
} }
} }
} }

View File

@ -1,6 +1,3 @@
{ {
"parent": "block/cube_all", "loader": "webdisplays:screen_loader"
"textures": {
"all": "webdisplays:blocks/screen15"
}
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 B