Improve video support

This commit is contained in:
Motschen
2022-12-26 22:12:57 +01:00
parent c801e8ecd8
commit 29982f838d
4 changed files with 51 additions and 40 deletions

View File

@@ -1,13 +1,19 @@
package eu.midnightdust.picturesign; package eu.midnightdust.picturesign;
import com.igrium.videolib.VideoLib;
import eu.midnightdust.picturesign.config.PictureSignConfig; import eu.midnightdust.picturesign.config.PictureSignConfig;
import eu.midnightdust.picturesign.render.PictureSignRenderer;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.client.networking.v1.ClientLoginConnectionEvents;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.client.gui.screen.ingame.SignEditScreen; import net.minecraft.client.gui.screen.ingame.SignEditScreen;
import net.minecraft.client.option.KeyBinding; import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil; import net.minecraft.client.util.InputUtil;
import net.minecraft.util.Identifier;
import net.minecraft.util.hit.HitResult; import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
@@ -17,8 +23,6 @@ import org.lwjgl.glfw.GLFW;
public class PictureSignClient implements ClientModInitializer { public class PictureSignClient implements ClientModInitializer {
public static Logger LOGGER = LogManager.getLogger("PictureSign"); public static Logger LOGGER = LogManager.getLogger("PictureSign");
public static String[] clipboard = new String[4]; public static String[] clipboard = new String[4];
public static final KeyBinding BINDING_EDIT_SIGN = new KeyBinding("key.picturesign.edit_sign",
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_C, "key.categories.picturesign");
public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key.picturesign.copy_sign", public static final KeyBinding BINDING_COPY_SIGN = new KeyBinding("key.picturesign.copy_sign",
InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories.picturesign"); InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_U, "key.categories.picturesign");
@Override @Override
@@ -26,6 +30,12 @@ public class PictureSignClient implements ClientModInitializer {
PictureSignConfig.init("picturesign", PictureSignConfig.class); PictureSignConfig.init("picturesign", PictureSignConfig.class);
KeyBindingHelper.registerKeyBinding(BINDING_COPY_SIGN); KeyBindingHelper.registerKeyBinding(BINDING_COPY_SIGN);
ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> {
PictureSignRenderer.videoPlayers.forEach(id -> {
VideoLib.getInstance().getVideoManager().closePlayer(id);
PictureSignRenderer.videoPlayers.remove(id);
});
});
ClientTickEvents.END_CLIENT_TICK.register(client -> { ClientTickEvents.END_CLIENT_TICK.register(client -> {
if (!PictureSignClient.BINDING_COPY_SIGN.isPressed()) return; if (!PictureSignClient.BINDING_COPY_SIGN.isPressed()) return;
@@ -41,33 +51,5 @@ public class PictureSignClient implements ClientModInitializer {
} }
} }
}); });
if (PictureSignConfig.debug) {
KeyBindingHelper.registerKeyBinding(BINDING_EDIT_SIGN);
ClientTickEvents.END_CLIENT_TICK.register(client -> {
if (!PictureSignClient.BINDING_EDIT_SIGN.isPressed()) return;
PictureSignClient.BINDING_EDIT_SIGN.setPressed(false);
if (client.player == null || client.crosshairTarget == null || client.crosshairTarget.getType() != HitResult.Type.BLOCK) return;
if (client.crosshairTarget.getType() == HitResult.Type.BLOCK && client.world.getBlockState(new BlockPos(client.crosshairTarget.getPos())).hasBlockEntity()) {
if (client.world.getBlockEntity(new BlockPos(client.crosshairTarget.getPos())) instanceof SignBlockEntity) {
BlockPos pos = new BlockPos(client.crosshairTarget.getPos());
SignBlockEntity sign = (SignBlockEntity) client.world.getBlockEntity(pos);
sign.setEditable(true);
sign.setEditor(client.player.getUuid());
sign.toUpdatePacket();
sign.markDirty();
client.world.updateListeners(pos, sign.getCachedState(), sign.getCachedState(), 3);
client.setScreen(new SignEditScreen(sign,false));
// clipboard[0] = sign.getTextOnRow(0, false).asString();
// clipboard[1] = sign.getTextOnRow(1, false).asString();
// clipboard[2] = sign.getTextOnRow(2, false).asString();
// clipboard[3] = sign.getTextOnRow(3, false).asString();
// Block signBlock = sign.getCachedState().getBlock();
// client.interactionManager.breakBlock(pos);
// client.player.setStackInHand(client.player.preferredHand, new ItemStack(signBlock.asItem()));
// client.interactionManager.interactBlock(client.player, client.world, client.player.preferredHand, new BlockHitResult(new Vec3d(pos.getX(), pos.getY(), pos.getZ()), Direction.DOWN, pos,false));
}
}
});
}
} }
} }

View File

@@ -0,0 +1,27 @@
package eu.midnightdust.picturesign.mixin;
import com.igrium.videolib.VideoLib;
import eu.midnightdust.picturesign.render.PictureSignRenderer;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.BlockPos;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
@Mixin(value = SignBlockEntity.class, priority = 1100)
public abstract class MixinSignBlockEntity extends BlockEntity {
public MixinSignBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
@Override
@Unique
public void markRemoved() {
VideoLib.getInstance().getVideoManager().closePlayer(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ()));
PictureSignRenderer.videoPlayers.remove(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ()));
super.markRemoved();
}
}

View File

@@ -1,8 +1,6 @@
package eu.midnightdust.picturesign.render; package eu.midnightdust.picturesign.render;
import com.igrium.videolib.VideoLib; import com.igrium.videolib.VideoLib;
import com.igrium.videolib.api.VideoHandle;
import com.igrium.videolib.api.VideoHandleFactory;
import com.igrium.videolib.api.VideoManager; import com.igrium.videolib.api.VideoManager;
import com.igrium.videolib.api.VideoPlayer; import com.igrium.videolib.api.VideoPlayer;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
@@ -15,9 +13,7 @@ import net.fabricmc.loader.api.FabricLoader;
import net.irisshaders.iris.api.v0.IrisApi; import net.irisshaders.iris.api.v0.IrisApi;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.entity.SignBlockEntity; import net.minecraft.block.entity.SignBlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.*; import net.minecraft.client.render.*;
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.util.Identifier; import net.minecraft.util.Identifier;
@@ -31,6 +27,7 @@ import java.util.List;
public class PictureSignRenderer { public class PictureSignRenderer {
VideoManager videoManager = VideoLib.getInstance().getVideoManager(); VideoManager videoManager = VideoLib.getInstance().getVideoManager();
public static List<Identifier> videoPlayers = new ArrayList<>();
List<BlockPos> playedOnce = new ArrayList<>(); List<BlockPos> playedOnce = new ArrayList<>();
public void render(SignBlockEntity signBlockEntity, MatrixStack matrixStack, int light, int overlay) { public void render(SignBlockEntity signBlockEntity, MatrixStack matrixStack, int light, int overlay) {
@@ -85,10 +82,13 @@ public class PictureSignRenderer {
} }
else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) {
videoPlayer = videoManager.getOrCreate(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ())); videoPlayer = videoManager.getOrCreate(new Identifier("picturesign", pos.getX() + "." + pos.getY() + "." + pos.getZ()));
videoPlayers.add(videoPlayer.getId());
try { try {
if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { if (PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) {
if (!videoPlayer.getMediaInterface().hasMedia()) if (!videoPlayer.getMediaInterface().hasMedia()) {
videoPlayer.getMediaInterface().play(url); videoPlayer.getMediaInterface().play(url);
videoPlayer.getControlsInterface().setRepeat(true);
}
} }
else if (!videoPlayer.getMediaInterface().hasMedia() && !playedOnce.contains(pos)) else if (!videoPlayer.getMediaInterface().hasMedia() && !playedOnce.contains(pos))
videoPlayer.getMediaInterface().play(url); videoPlayer.getMediaInterface().play(url);
@@ -152,12 +152,13 @@ public class PictureSignRenderer {
} }
else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) { else if (PictureSignType.isType(signBlockEntity, PictureSignType.VIDEO) || PictureSignType.isType(signBlockEntity, PictureSignType.LOOPED_VIDEO)) {
assert videoPlayer != null; assert videoPlayer != null;
TextureManager textureManager = MinecraftClient.getInstance().getTextureManager(); //TextureManager textureManager = MinecraftClient.getInstance().getTextureManager();
if (videoPlayer.getTexture() != null && videoPlayer.getCodecInterface().getFrameRate() > 1 && textureManager.getTexture(videoPlayer.getTexture()) != null && textureManager.getTexture(videoPlayer.getTexture()).getGlId() != 0) //if (videoPlayer.getTexture() != null && videoPlayer.getCodecInterface().getFrameRate() > 1 && textureManager.getTexture(videoPlayer.getTexture()) != null && textureManager.getTexture(videoPlayer.getTexture()).getGlId() != 0)
texture = videoPlayer.getTexture(); texture = videoPlayer.getTexture();
else texture = new Identifier("picturesign", "textures/black.png"); //else texture = new Identifier("picturesign", "textures/black.png");
} }
else return; else return;
RenderSystem.setShaderTexture(0, new Identifier("picturesign", "textures/black.png"));
RenderSystem.setShaderTexture(0, texture); RenderSystem.setShaderTexture(0, texture);
if (PictureSignConfig.translucency) RenderSystem.enableBlend(); if (PictureSignConfig.translucency) RenderSystem.enableBlend();

View File

@@ -1,10 +1,11 @@
{ {
"required": true, "required": true,
"package": "eu.midnightdust.picturesign.mixin", "package": "eu.midnightdust.picturesign.mixin",
"compatibilityLevel": "JAVA_16", "compatibilityLevel": "JAVA_17",
"client": [ "client": [
"MixinSignBlockEntityRenderer", "MixinSignBlockEntityRenderer",
"MixinSignEditScreen" "MixinSignEditScreen",
"MixinSignBlockEntity"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1