Skip to content
This repository has been archived by the owner on Dec 14, 2024. It is now read-only.

Commit

Permalink
Add New RenderInstructions
Browse files Browse the repository at this point in the history
- Create DebugRenderer
- Create GameRenderer#renderItemActivation
  • Loading branch information
gmitch215 committed Sep 8, 2024
1 parent b83602c commit 316da22
Show file tree
Hide file tree
Showing 7 changed files with 175 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
import org.jetbrains.annotations.NotNull;
import org.joml.Matrix4f;
import xyz.gmitch215.socketmc.util.DataHolder;
import xyz.gmitch215.socketmc.util.NBTTag;

import java.io.Serial;
import java.io.Serializable;
import java.security.SecureRandom;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -74,6 +76,15 @@ public static RenderInstruction.GameRenderer game() {
return new GameRenderer();
}

/**
* Creates a new instruction for the DebugRenderer.
* @return Debug Renderer Instruction
*/
@NotNull
public static RenderInstruction.DebugRenderer debug() {
return new DebugRenderer();
}

/**
* Represents instructions for the Game Renderer.
*/
Expand Down Expand Up @@ -120,7 +131,7 @@ public void transformItemInHand(@NotNull Matrix4f matrix, long millis) throws Il
}

/**
* Renders the confusion effect, used when the player has the nausea effect.
* Renders the confusion effect. Used when the player has the nausea effect.
* @param strength The strength of the effect, between 0 and 1
* @throws IllegalArgumentException if the strength is not between 0 and 1
*/
Expand All @@ -135,6 +146,61 @@ public void renderConfusionEffect(float strength) throws IllegalArgumentExceptio
isFilled = true;
}

/**
* Renders the item activation effect. Used when the player activates a Totem of Undying.
* @param item The item that is being activated
* @throws IllegalArgumentException if the item is null
*/
public void renderItemActivation(@NotNull NBTTag item) throws IllegalArgumentException {
SecureRandom random = new SecureRandom();
renderItemActivation(item, random.nextFloat() * 2.0f - 1.0f, random.nextFloat() * 2.0f - 1.0f);
}

/**
* Renders the item activation effect. Used when the player activates a Totem of Undying.
* @param item The item that is being activated
* @param offsetX The final offsetX the item should glide to
* @param offsetY The final offsetY the item should glide to
* @throws IllegalArgumentException if the item is null
*/
public void renderItemActivation(@NotNull NBTTag item, float offsetX, float offsetY) throws IllegalArgumentException {
checkFilled();

data.put("item", item);
data.put("offsetX", offsetX);
data.put("offsetY", offsetY);

subOrdinal = 2;
isFilled = true;
}

}

public static final class DebugRenderer extends RenderInstruction {

/**
* The ordinal for a {@link RenderInstruction.DebugRenderer}.
*/
public static final int ORDINAL = 1;

@Serial
private static final long serialVersionUID = -2873349323016509570L;

private DebugRenderer() { super(ORDINAL); }

/**
* Renders the chunk border seen when using the F3+G debug keybind.
* @param enabled Whether the chunk border should be rendered
*/
public void renderChunkborder(boolean enabled) {
checkFilled();

data.put("enabled", enabled);

subOrdinal = 0;
isFilled = true;
}

}

}
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
package xyz.gmitch215.socketmc.fabric.machines;

import net.minecraft.client.gui.GuiGraphics;
import xyz.gmitch215.socketmc.fabric.FabricUtil;
import xyz.gmitch215.socketmc.instruction.Instruction;
import xyz.gmitch215.socketmc.instruction.InstructionId;
import xyz.gmitch215.socketmc.instruction.Machine;
import xyz.gmitch215.socketmc.instruction.RenderInstruction;
import xyz.gmitch215.socketmc.util.LifecycleMap;
import org.joml.Matrix4f;
import xyz.gmitch215.socketmc.fabric.FabricSocketMC;
import xyz.gmitch215.socketmc.util.NBTTag;

import java.util.List;
import java.util.function.Function;
import java.util.function.BiFunction;

import static xyz.gmitch215.socketmc.fabric.FabricSocketMC.minecraft;

Expand All @@ -22,38 +23,58 @@ public final class RenderingMachine implements Machine {
private RenderingMachine() {}

private static final LifecycleMap<Runnable> lifecycle = new LifecycleMap<>();
private static final Runnable DONE = () -> {};

public static void tick() {
lifecycle.run();
lifecycle.forEach(Runnable::run);
}

public static final List<List<Function<RenderInstruction, Runnable>>> RENDERERS = List.of(
public static final List<List<BiFunction<RenderInstruction, Long, Runnable>>> RENDERERS = List.of(
// GameRenderer
List.of(
i -> {
(i, time) -> {
Matrix4f matrix = i.data("matrix", Matrix4f.class);
return () -> minecraft.gameRenderer.renderItemInHand(
minecraft.gameRenderer.getMainCamera(),
minecraft.getTimer().getGameTimeDeltaPartialTick(true),
matrix
);
},
i -> {
(i, time) -> {
float strength = i.data("strength", Float.class);
GuiGraphics graphics = new GuiGraphics(minecraft, minecraft.renderBuffers().bufferSource());
return () -> minecraft.gameRenderer.renderConfusionOverlay(graphics, strength);
},
(i, time) -> {
NBTTag item = i.data("item", NBTTag.class);
float offsetX = i.data("offsetX", Float.class);
float offsetY = i.data("offsetY", Float.class);

minecraft.gameRenderer.itemActivationItem = FabricUtil.toItem(item);
minecraft.gameRenderer.itemActivationTicks = (int) (time / 50);
minecraft.gameRenderer.itemActivationOffX = offsetX;
minecraft.gameRenderer.itemActivationOffY = offsetY;

return DONE;
}
),
// DebugRenderer
List.of(
(i, time) -> {
minecraft.debugRenderer.renderChunkborder = i.data("enabled", Boolean.class);
return DONE;
}
)
);

@Override
public void onInstruction(Instruction instruction) {
RenderInstruction render = instruction.lastParameter(RenderInstruction.class);

Runnable action = RENDERERS.get(render.getOrdinal()).get(render.getSubOrdinal()).apply(render);
long millis = (long) render.data("time");

Runnable action = RENDERERS.get(render.getOrdinal()).get(render.getSubOrdinal()).apply(render, millis);

lifecycle.store(action, millis);
}

Expand Down
9 changes: 8 additions & 1 deletion mod/fabric/src/main/resources/socketmc.accesswidener
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,11 @@ accessible field net/minecraft/client/gui/components/CycleButton values Lnet/min

# GameRenderer
accessible method net/minecraft/client/renderer/GameRenderer renderItemInHand (Lnet/minecraft/client/Camera;FLorg/joml/Matrix4f;)V
accessible method net/minecraft/client/renderer/GameRenderer renderConfusionOverlay (Lnet/minecraft/client/gui/GuiGraphics;F)V
accessible method net/minecraft/client/renderer/GameRenderer renderConfusionOverlay (Lnet/minecraft/client/gui/GuiGraphics;F)V
accessible field net/minecraft/client/renderer/GameRenderer itemActivationItem Lnet/minecraft/world/item/ItemStack;
accessible field net/minecraft/client/renderer/GameRenderer itemActivationTicks I
accessible field net/minecraft/client/renderer/GameRenderer itemActivationOffX F
accessible field net/minecraft/client/renderer/GameRenderer itemActivationOffY F

# DebugRenderer
accessible field net/minecraft/client/renderer/debug/DebugRenderer renderChunkborder Z
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package xyz.gmitch215.socketmc.forge.machines;

import net.minecraft.client.gui.GuiGraphics;
import xyz.gmitch215.socketmc.forge.ForgeUtil;
import xyz.gmitch215.socketmc.instruction.Instruction;
import xyz.gmitch215.socketmc.instruction.InstructionId;
import xyz.gmitch215.socketmc.instruction.Machine;
import xyz.gmitch215.socketmc.instruction.RenderInstruction;
import xyz.gmitch215.socketmc.util.LifecycleMap;
import org.joml.Matrix4f;
import xyz.gmitch215.socketmc.util.NBTTag;

import java.util.List;
import java.util.function.Function;
import java.util.function.BiFunction;

import static xyz.gmitch215.socketmc.forge.ForgeSocketMC.minecraft;

Expand All @@ -21,38 +23,58 @@ public final class RenderingMachine implements Machine {
private RenderingMachine() {}

private static final LifecycleMap<Runnable> lifecycle = new LifecycleMap<>();
private static final Runnable DONE = () -> {};

public static void tick() {
lifecycle.run();
lifecycle.forEach(Runnable::run);
}

public static final List<List<Function<RenderInstruction, Runnable>>> RENDERERS = List.of(
public static final List<List<BiFunction<RenderInstruction, Long, Runnable>>> RENDERERS = List.of(
// GameRenderer
List.of(
i -> {
(i, time) -> {
Matrix4f matrix = i.data("matrix", Matrix4f.class);
return () -> minecraft.gameRenderer.renderItemInHand(
minecraft.gameRenderer.getMainCamera(),
minecraft.getTimer().getGameTimeDeltaPartialTick(true),
matrix
);
},
i -> {
(i, time) -> {
float strength = i.data("strength", Float.class);
GuiGraphics graphics = new GuiGraphics(minecraft, minecraft.renderBuffers().bufferSource());
return () -> minecraft.gameRenderer.renderConfusionOverlay(graphics, strength);
},
(i, time) -> {
NBTTag item = i.data("item", NBTTag.class);
float offsetX = i.data("offsetX", Float.class);
float offsetY = i.data("offsetY", Float.class);

minecraft.gameRenderer.itemActivationItem = ForgeUtil.toItem(item);
minecraft.gameRenderer.itemActivationTicks = (int) (time / 50);
minecraft.gameRenderer.itemActivationOffX = offsetX;
minecraft.gameRenderer.itemActivationOffY = offsetY;

return DONE;
}
),
// DebugRenderer
List.of(
(i, time) -> {
minecraft.debugRenderer.renderChunkborder = i.data("enabled", Boolean.class);
return DONE;
}
)
);

@Override
public void onInstruction(Instruction instruction) {
RenderInstruction render = instruction.lastParameter(RenderInstruction.class);

Runnable action = RENDERERS.get(render.getOrdinal()).get(render.getSubOrdinal()).apply(render);
long millis = (long) render.data("time");

Runnable action = RENDERERS.get(render.getOrdinal()).get(render.getSubOrdinal()).apply(render, millis);

lifecycle.store(action, millis);
}

Expand Down
9 changes: 8 additions & 1 deletion mod/forge/src/main/resources/META-INF/accesstransformer.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,11 @@ public net.minecraft.client.gui.components.CycleButton f_168861_ # values

# GameRenderer
public net.minecraft.client.renderer.GameRenderer m_109120_(Lnet/minecraft/client/Camera;FLorg/joml/Matrix4f;)V # renderItemInHand
public net.minecraft.client.renderer.GameRenderer m_280083_(Lnet/minecraft/client/gui/GuiGraphics;F)V # renderConfusionOverlay
public net.minecraft.client.renderer.GameRenderer m_280083_(Lnet/minecraft/client/gui/GuiGraphics;F)V # renderConfusionOverlay
public net.minecraft.client.renderer.GameRenderer f_109080_ # itemActivationItem
public net.minecraft.client.renderer.GameRenderer f_109047_ # itemActivationTicks
public net.minecraft.client.renderer.GameRenderer f_109048_ # itemActivationOffX
public net.minecraft.client.renderer.GameRenderer f_109049_ # itemActivationOffY

# DebugRenderer
public net.minecraft.client.renderer.debug.DebugRenderer f_113431_ # renderChunkborder
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@
import xyz.gmitch215.socketmc.instruction.InstructionId;
import xyz.gmitch215.socketmc.instruction.Machine;
import xyz.gmitch215.socketmc.instruction.RenderInstruction;
import xyz.gmitch215.socketmc.neoforge.NeoForgeUtil;
import xyz.gmitch215.socketmc.util.LifecycleMap;
import xyz.gmitch215.socketmc.util.NBTTag;

import java.util.List;
import java.util.function.Function;
import java.util.function.BiFunction;

import static xyz.gmitch215.socketmc.neoforge.NeoForgeSocketMC.minecraft;

Expand All @@ -21,38 +23,58 @@ public final class RenderingMachine implements Machine {
private RenderingMachine() {}

private static final LifecycleMap<Runnable> lifecycle = new LifecycleMap<>();
private static final Runnable DONE = () -> {};

public static void tick() {
lifecycle.run();
lifecycle.forEach(Runnable::run);
}

public static final List<List<Function<RenderInstruction, Runnable>>> RENDERERS = List.of(
public static final List<List<BiFunction<RenderInstruction, Long, Runnable>>> RENDERERS = List.of(
// GameRenderer
List.of(
i -> {
(i, time) -> {
Matrix4f matrix = i.data("matrix", Matrix4f.class);
return () -> minecraft.gameRenderer.renderItemInHand(
minecraft.gameRenderer.getMainCamera(),
minecraft.getTimer().getGameTimeDeltaPartialTick(true),
matrix
);
},
i -> {
(i, time) -> {
float strength = i.data("strength", Float.class);
GuiGraphics graphics = new GuiGraphics(minecraft, minecraft.renderBuffers().bufferSource());
return () -> minecraft.gameRenderer.renderConfusionOverlay(graphics, strength);
},
(i, time) -> {
NBTTag item = i.data("item", NBTTag.class);
float offsetX = i.data("offsetX", Float.class);
float offsetY = i.data("offsetY", Float.class);

minecraft.gameRenderer.itemActivationItem = NeoForgeUtil.toItem(item);
minecraft.gameRenderer.itemActivationTicks = (int) (time / 50);
minecraft.gameRenderer.itemActivationOffX = offsetX;
minecraft.gameRenderer.itemActivationOffY = offsetY;

return DONE;
}
),
// DebugRenderer
List.of(
(i, time) -> {
minecraft.debugRenderer.renderChunkborder = i.data("enabled", Boolean.class);
return DONE;
}
)
);

@Override
public void onInstruction(Instruction instruction) {
RenderInstruction render = instruction.lastParameter(RenderInstruction.class);

Runnable action = RENDERERS.get(render.getOrdinal()).get(render.getSubOrdinal()).apply(render);
long millis = (long) render.data("time");

Runnable action = RENDERERS.get(render.getOrdinal()).get(render.getSubOrdinal()).apply(render, millis);

lifecycle.store(action, millis);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,11 @@ public net.minecraft.client.gui.components.CycleButton values # values

# GameRenderer
public net.minecraft.client.renderer.GameRenderer renderItemInHand(Lnet/minecraft/client/Camera;FLorg/joml/Matrix4f;)V # renderItemInHand
public net.minecraft.client.renderer.GameRenderer renderConfusionOverlay(Lnet/minecraft/client/gui/GuiGraphics;F)V # renderConfusionOverlay
public net.minecraft.client.renderer.GameRenderer renderConfusionOverlay(Lnet/minecraft/client/gui/GuiGraphics;F)V # renderConfusionOverlay
public net.minecraft.client.renderer.GameRenderer itemActivationItem # itemActivationItem
public net.minecraft.client.renderer.GameRenderer itemActivationTicks # itemActivationTicks
public net.minecraft.client.renderer.GameRenderer itemActivationOffX # itemActivationOffX
public net.minecraft.client.renderer.GameRenderer itemActivationOffY # itemActivationOffY

# DebugRenderer
public net.minecraft.client.renderer.debug.DebugRenderer renderChunkborder # renderChunkborder

0 comments on commit 316da22

Please sign in to comment.