Further improvements

This commit is contained in:
Martin Prokoph
2024-07-03 14:03:21 +02:00
parent db1f6b5896
commit 3d532a9c2f
3 changed files with 22 additions and 20 deletions

View File

@@ -22,7 +22,6 @@ import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats; import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.texture.TextureManager;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.state.property.Properties; import net.minecraft.state.property.Properties;
import net.minecraft.text.OrderedText; import net.minecraft.text.OrderedText;
@@ -32,6 +31,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RotationAxis; import net.minecraft.util.math.RotationAxis;
import net.minecraft.world.World; import net.minecraft.world.World;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.joml.Matrix4f; import org.joml.Matrix4f;
@@ -42,12 +42,12 @@ import static eu.midnightdust.picturesign.PictureSignClient.hasWaterMedia;
import static eu.midnightdust.picturesign.PictureSignClient.id; import static eu.midnightdust.picturesign.PictureSignClient.id;
import static eu.midnightdust.picturesign.util.PictureSignType.GIF; import static eu.midnightdust.picturesign.util.PictureSignType.GIF;
import static eu.midnightdust.picturesign.util.PictureSignType.PICTURE; import static eu.midnightdust.picturesign.util.PictureSignType.PICTURE;
import static net.minecraft.client.texture.TextureManager.MISSING_IDENTIFIER;
public class PictureRenderer { public class PictureRenderer {
private boolean isSafeUrl; private boolean isSafeUrl;
private boolean isSafeJsonUrl; private boolean isSafeJsonUrl;
@Nullable private Text errorMessage;
public static final Text ERROR = Text.translatable("picturesign.error"); public static final Text ERROR = Text.translatable("picturesign.error");
public static final Text MISSING_VLC = ERROR.copy().append(Text.translatable("picturesign.error.missingVLC")); public static final Text MISSING_VLC = ERROR.copy().append(Text.translatable("picturesign.error.missingVLC"));
public static final Text MISSING_WATERMEDIA = ERROR.copy().append(Text.translatable("picturesign.error.missingWatermedia")); public static final Text MISSING_WATERMEDIA = ERROR.copy().append(Text.translatable("picturesign.error.missingWatermedia"));
@@ -60,7 +60,7 @@ public class PictureRenderer {
public static final Identifier RAW_TEXTURE = id("internal_raw_texture"); public static final Identifier RAW_TEXTURE = id("internal_raw_texture");
public void render(BlockEntity blockEntity, PictureSignType type, String url, PictureDimensions dimensions, PictureOffset offset, boolean front, MatrixStack matrixStack, VertexConsumerProvider vertices, int light, int overlay) { public void render(BlockEntity blockEntity, PictureSignType type, String url, PictureDimensions dimensions, PictureOffset offset, boolean front, MatrixStack matrixStack, VertexConsumerProvider vertices, int light, int overlay) {
errorMessage = null; Text errorMessage = null;
MediaJsonInfo info = null; MediaJsonInfo info = null;
if (!url.contains("://") && !url.startsWith("file:") && !url.startsWith("rp:")) { if (!url.contains("://") && !url.startsWith("file:") && !url.startsWith("rp:")) {
url = "https://" + url; url = "https://" + url;
@@ -123,7 +123,7 @@ public class PictureRenderer {
else if (mediaHandler != null) { else if (mediaHandler != null) {
if (!mediaHandler.isReady()) errorMessage = MISSING_VLC; if (!mediaHandler.isReady()) errorMessage = MISSING_VLC;
else { else {
if (!mediaHandler.hasMedia() && !mediaHandler.playbackStarted) { if (!mediaHandler.playbackStarted && !mediaHandler.hasMedia()) {
mediaHandler.play(url, type.isVideo); mediaHandler.play(url, type.isVideo);
if (info != null && info.start() > 0) mediaHandler.setTime(info.start()); if (info != null && info.start() > 0) mediaHandler.setTime(info.start());
if (type.isLooped && !mediaHandler.hasMedia() && !mediaHandler.playbackStarted) if (type.isLooped && !mediaHandler.hasMedia() && !mediaHandler.playbackStarted)
@@ -204,32 +204,35 @@ public class PictureRenderer {
BufferRenderer.drawWithGlobalProgram(buffer.end()); BufferRenderer.drawWithGlobalProgram(buffer.end());
if (errorMessage != null) renderErrorMessage(client.textRenderer, matrixStack, vertices, dimensions.width(), dimensions.height()); if (errorMessage != null) renderErrorMessage(errorMessage, client.textRenderer, matrixStack, vertices, dimensions.width(), dimensions.height());
matrixStack.pop(); matrixStack.pop();
RenderSystem.disableBlend(); RenderSystem.disableBlend();
RenderSystem.disableDepthTest(); RenderSystem.disableDepthTest();
} }
private void renderErrorMessage(TextRenderer textRenderer, MatrixStack matrices, VertexConsumerProvider vertices, float width, float height) { private static void renderErrorMessage(Text error, @NotNull TextRenderer textRenderer, @NotNull MatrixStack matrices, VertexConsumerProvider vertices, float width, float height) {
float scale = Math.min(width, height) / 100; float scale = Math.min(width, height) / 100;
matrices.translate(0, height, 1.005f); matrices.translate(0, height, 1.005f);
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180)); matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180));
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180)); matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180));
matrices.scale(scale,scale,scale); matrices.scale(scale,scale,scale);
int wrappedY = 0; int wrappedY = 0;
for(Iterator<OrderedText> textIterator = textRenderer.wrapLines(errorMessage, MathHelper.floor(width/scale)).iterator(); textIterator.hasNext(); wrappedY += 9) { for(Iterator<OrderedText> textIterator = textRenderer.wrapLines(error, MathHelper.floor(width/scale)).iterator(); textIterator.hasNext(); wrappedY += 9) {
renderTextWithShadow(textIterator.next(), wrappedY, textRenderer, matrices.peek().getPositionMatrix(), vertices); renderTextWithShadow(textIterator.next(), wrappedY, textRenderer, matrices.peek().getPositionMatrix(), vertices);
} }
} }
private void renderTextWithShadow(OrderedText text, int wrappedY, TextRenderer textRenderer, Matrix4f matrix, VertexConsumerProvider vertices) { private static void renderTextWithShadow(OrderedText text, int wrappedY, @NotNull TextRenderer textRenderer, Matrix4f matrix, VertexConsumerProvider vertices) {
textRenderer.draw(text, 0, wrappedY, 0xFFFFFF, false, matrix, vertices, TextRenderer.TextLayerType.POLYGON_OFFSET, 0, 15728880); textRenderer.draw(text, 0, wrappedY, 0xFFFFFF, false, matrix, vertices, TextRenderer.TextLayerType.POLYGON_OFFSET, 0, 15728880);
matrix.translate(0, 0, 0.025f); matrix.translate(0, 0, 0.025f);
textRenderer.draw(text, 1, wrappedY + 1, 0x555555, false, matrix, vertices, TextRenderer.TextLayerType.POLYGON_OFFSET, 0, 15728880); textRenderer.draw(text, 1, wrappedY + 1, 0x555555, false, matrix, vertices, TextRenderer.TextLayerType.POLYGON_OFFSET, 0, 15728880);
matrix.translate(0, 0, -0.025f); matrix.translate(0, 0, -0.025f);
} }
public static Identifier getMissingTexture() { private static final Identifier BLACK_TEXTURE = id("textures/black.png");
if (PictureSignConfig.missingImageMode.equals(PictureSignConfig.MissingImageMode.TRANSPARENT)) return null; public @Nullable Identifier getMissingTexture() {
return PictureSignConfig.missingImageMode.equals(PictureSignConfig.MissingImageMode.BLACK) ? return switch (PictureSignConfig.missingImageMode) {
(id("textures/black.png")) : (TextureManager.MISSING_IDENTIFIER); case BLACK -> BLACK_TEXTURE;
case MISSING_TEXTURE -> MISSING_IDENTIFIER;
default -> null;
};
} }
public void checkJsonUrlSafety(String jsonUrl) { public void checkJsonUrlSafety(String jsonUrl) {
isSafeJsonUrl = false; isSafeJsonUrl = false;

View File

@@ -22,7 +22,7 @@ public class PictureSignRenderer extends PictureRenderer {
PictureSignType type = getType(signBlockEntity, front); PictureSignType type = getType(signBlockEntity, front);
super.render(signBlockEntity, type, PictureURLUtils.getLink(signBlockEntity, front), dimensions, getOffset(signBlockEntity, front, type), front, matrixStack, vertices, light, overlay); super.render(signBlockEntity, type, PictureURLUtils.getLink(signBlockEntity, front), dimensions, getOffset(signBlockEntity, front, type), front, matrixStack, vertices, light, overlay);
} }
private PictureDimensions getDimensions(String thirdLine, String forthLine) { private static PictureDimensions getDimensions(String thirdLine, String forthLine) {
String[] scale = forthLine.split(":"); String[] scale = forthLine.split(":");
float width = 0; float width = 0;
float height = 0; float height = 0;
@@ -54,7 +54,7 @@ public class PictureSignRenderer extends PictureRenderer {
} }
return new PictureDimensions(width, height, x, y, z, xRot, yRot, zRot); return new PictureDimensions(width, height, x, y, z, xRot, yRot, zRot);
} }
private PictureOffset getOffset(BlockEntity blockEntity, boolean front, PictureSignType type) { private static PictureOffset getOffset(BlockEntity blockEntity, boolean front, PictureSignType type) {
if (type.isAudio) return null; if (type.isAudio) return null;
float xOffset = 0.0F; float xOffset = 0.0F;
float zOffset = 0.0F; float zOffset = 0.0F;

View File

@@ -314,7 +314,7 @@ public class PictureSignHelperScreen extends Screen {
MatrixStack matrices = context.getMatrices(); MatrixStack matrices = context.getMatrices();
matrices.push(); matrices.push();
VertexConsumerProvider.Immediate immediate = this.client.getBufferBuilders().getEntityVertexConsumers(); VertexConsumerProvider.Immediate immediate = this.client.getBufferBuilders().getEntityVertexConsumers();
translateForRender(context, sign.getCachedState()); translateForRender(context);
renderSignBackground(context, sign.getCachedState()); renderSignBackground(context, sign.getCachedState());
int i = this.sign.getText(front).getColor().getSignColor(); int i = this.sign.getText(front).getColor().getSignColor();
@@ -347,7 +347,7 @@ public class PictureSignHelperScreen extends Screen {
matrices.pop(); matrices.pop();
DiffuseLighting.enableGuiDepthLighting(); DiffuseLighting.enableGuiDepthLighting();
} }
protected void translateForRender(DrawContext context, BlockState state) { protected void translateForRender(DrawContext context) {
MatrixStack matrices = context.getMatrices(); MatrixStack matrices = context.getMatrices();
if (isHanging) { if (isHanging) {
matrices.translate((float)this.width / 2.0F + 100, this.height / 5f + 50, 50.0F); matrices.translate((float)this.width / 2.0F + 100, this.height / 5f + 50, 50.0F);
@@ -361,19 +361,18 @@ public class PictureSignHelperScreen extends Screen {
} }
protected void renderSignBackground(DrawContext context, BlockState state) { protected void renderSignBackground(DrawContext context, BlockState state) {
if (!isHanging) { if (!isHanging && this.client != null) {
VertexConsumerProvider.Immediate immediate = this.client.getBufferBuilders().getEntityVertexConsumers(); VertexConsumerProvider.Immediate immediate = this.client.getBufferBuilders().getEntityVertexConsumers();
MatrixStack matrices = context.getMatrices(); MatrixStack matrices = context.getMatrices();
BlockState blockState = this.sign.getCachedState(); boolean bl = state.getBlock() instanceof SignBlock;
boolean bl = blockState.getBlock() instanceof SignBlock;
if (!bl) { if (!bl) {
matrices.translate(0.0, -0.15625, 0.0); matrices.translate(0.0, -0.15625, 0.0);
} }
matrices.push(); matrices.push();
matrices.scale(0.6666667F, -0.6666667F, -0.6666667F); matrices.scale(0.6666667F, -0.6666667F, -0.6666667F);
SpriteIdentifier spriteIdentifier = TexturedRenderLayers.getSignTextureId(AbstractSignBlock.getWoodType(sign.getCachedState().getBlock())); SpriteIdentifier spriteIdentifier = TexturedRenderLayers.getSignTextureId(AbstractSignBlock.getWoodType(state.getBlock()));
SignBlockEntityRenderer.SignModel var10002 = this.model; SignBlockEntityRenderer.SignModel var10002 = this.model;
Objects.requireNonNull(var10002); Objects.requireNonNull(var10002);
VertexConsumer vertexConsumer = spriteIdentifier.getVertexConsumer(immediate, var10002::getLayer); VertexConsumer vertexConsumer = spriteIdentifier.getVertexConsumer(immediate, var10002::getLayer);