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.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.texture.TextureManager;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.state.property.Properties;
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.RotationAxis;
import net.minecraft.world.World;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
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.util.PictureSignType.GIF;
import static eu.midnightdust.picturesign.util.PictureSignType.PICTURE;
import static net.minecraft.client.texture.TextureManager.MISSING_IDENTIFIER;
public class PictureRenderer {
private boolean isSafeUrl;
private boolean isSafeJsonUrl;
@Nullable private Text errorMessage;
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_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 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;
if (!url.contains("://") && !url.startsWith("file:") && !url.startsWith("rp:")) {
url = "https://" + url;
@@ -123,7 +123,7 @@ public class PictureRenderer {
else if (mediaHandler != null) {
if (!mediaHandler.isReady()) errorMessage = MISSING_VLC;
else {
if (!mediaHandler.hasMedia() && !mediaHandler.playbackStarted) {
if (!mediaHandler.playbackStarted && !mediaHandler.hasMedia()) {
mediaHandler.play(url, type.isVideo);
if (info != null && info.start() > 0) mediaHandler.setTime(info.start());
if (type.isLooped && !mediaHandler.hasMedia() && !mediaHandler.playbackStarted)
@@ -204,32 +204,35 @@ public class PictureRenderer {
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();
RenderSystem.disableBlend();
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;
matrices.translate(0, height, 1.005f);
matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180));
matrices.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(180));
matrices.scale(scale,scale,scale);
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);
}
}
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);
matrix.translate(0, 0, 0.025f);
textRenderer.draw(text, 1, wrappedY + 1, 0x555555, false, matrix, vertices, TextRenderer.TextLayerType.POLYGON_OFFSET, 0, 15728880);
matrix.translate(0, 0, -0.025f);
}
public static Identifier getMissingTexture() {
if (PictureSignConfig.missingImageMode.equals(PictureSignConfig.MissingImageMode.TRANSPARENT)) return null;
return PictureSignConfig.missingImageMode.equals(PictureSignConfig.MissingImageMode.BLACK) ?
(id("textures/black.png")) : (TextureManager.MISSING_IDENTIFIER);
private static final Identifier BLACK_TEXTURE = id("textures/black.png");
public @Nullable Identifier getMissingTexture() {
return switch (PictureSignConfig.missingImageMode) {
case BLACK -> BLACK_TEXTURE;
case MISSING_TEXTURE -> MISSING_IDENTIFIER;
default -> null;
};
}
public void checkJsonUrlSafety(String jsonUrl) {
isSafeJsonUrl = false;

View File

@@ -22,7 +22,7 @@ public class PictureSignRenderer extends PictureRenderer {
PictureSignType type = getType(signBlockEntity, front);
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(":");
float width = 0;
float height = 0;
@@ -54,7 +54,7 @@ public class PictureSignRenderer extends PictureRenderer {
}
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;
float xOffset = 0.0F;
float zOffset = 0.0F;

View File

@@ -314,7 +314,7 @@ public class PictureSignHelperScreen extends Screen {
MatrixStack matrices = context.getMatrices();
matrices.push();
VertexConsumerProvider.Immediate immediate = this.client.getBufferBuilders().getEntityVertexConsumers();
translateForRender(context, sign.getCachedState());
translateForRender(context);
renderSignBackground(context, sign.getCachedState());
int i = this.sign.getText(front).getColor().getSignColor();
@@ -347,7 +347,7 @@ public class PictureSignHelperScreen extends Screen {
matrices.pop();
DiffuseLighting.enableGuiDepthLighting();
}
protected void translateForRender(DrawContext context, BlockState state) {
protected void translateForRender(DrawContext context) {
MatrixStack matrices = context.getMatrices();
if (isHanging) {
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) {
if (!isHanging) {
if (!isHanging && this.client != null) {
VertexConsumerProvider.Immediate immediate = this.client.getBufferBuilders().getEntityVertexConsumers();
MatrixStack matrices = context.getMatrices();
BlockState blockState = this.sign.getCachedState();
boolean bl = blockState.getBlock() instanceof SignBlock;
boolean bl = state.getBlock() instanceof SignBlock;
if (!bl) {
matrices.translate(0.0, -0.15625, 0.0);
}
matrices.push();
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;
Objects.requireNonNull(var10002);
VertexConsumer vertexConsumer = spriteIdentifier.getVertexConsumer(immediate, var10002::getLayer);