Skip to content

Instantly share code, notes, and snippets.

@Daomephsta
Last active November 10, 2021 19:12
Show Gist options
  • Save Daomephsta/e986c37932b42cd8d89066ceab412764 to your computer and use it in GitHub Desktop.
Save Daomephsta/e986c37932b42cd8d89066ceab412764 to your computer and use it in GitHub Desktop.
Render Layer API
package net.fabricmc.fabric.api.client.rendering.v1;
import net.fabricmc.fabric.impl.client.rendering.RenderLayerAccessors;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexFormat;
/**
* Extend this to get access to protected members of RenderLayer, e.g. MultiPhaseParameters
*/
public abstract class FabricRenderLayers extends RenderLayer {
protected FabricRenderLayers() {
super(null, null, null, 0, false, false, null, null);
}
/**Makes a render layer**/
protected static RenderLayer create(String name, VertexFormat vertexFormat,
VertexFormat.DrawMode drawMode, int expectedBufferSize, RenderLayer.MultiPhaseParameters phaseParameters) {
return RenderLayerAccessors.create(name, vertexFormat, drawMode, expectedBufferSize, phaseParameters);
}
}
package net.fabricmc.fabric.impl.client.rendering;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.MappingResolver;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexFormat;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public abstract class RenderLayerAccessors extends RenderLayer
{
private RenderLayerAccessors() {
super(null, null, null, 0, false, false, null, null);
}
// TODO Replace with Global Access Widener for MultiPhaseParameters & Mixin @Invoker for RenderLayer.of()
private static final MethodHandle RENDER_LAYER__OF;
static {
try {
var lookup = MethodHandles.privateLookupIn(RenderLayer.class, MethodHandles.lookup());
MappingResolver mappings = FabricLoader.getInstance().getMappingResolver();
{
var methodName = mappings.mapMethodName("intermediary", "net.minecraft.class_1921", "method_24048",
"(Ljava/lang/String;Lnet/minecraft/class_293;Lnet/minecraft/class_293$class_5596;"
+ "ILnet/minecraft/class_1921$class_4688;)Lnet/minecraft/class_1921$class_4687;");
var renderLayer$Multiphase = Class.forName(mappings.mapClassName("intermediary",
"net.minecraft.class_1921$class_4687"));
var methodDesc = MethodType.methodType(renderLayer$Multiphase, String.class, VertexFormat.class,
VertexFormat.DrawMode.class, int.class, MultiPhaseParameters.class);
RENDER_LAYER__OF = lookup.findStatic(RenderLayer.class, methodName, methodDesc)
.asType(methodDesc.changeReturnType(RenderLayer.class));
}
}
catch (IllegalAccessException | ClassNotFoundException | NoSuchMethodException e) {
throw new RuntimeException("Failed to initialise RenderLayer method handles", e);
}
}
public static RenderLayer create(String name, VertexFormat vertexFormat,
VertexFormat.DrawMode drawMode, int expectedBufferSize, RenderLayer.MultiPhaseParameters phaseParameters) {
try {
return (RenderLayer) RENDER_LAYER__OF.invokeExact(name, vertexFormat,
drawMode, expectedBufferSize, phaseParameters);
}
catch (Throwable e) {
throw new RuntimeException("Failed to invoke RenderLayer.of method handle", e);
}
}
}
package net.fabricmc.fabric.test.rendering.client;
import net.fabricmc.fabric.api.client.rendering.v1.FabricRenderLayers;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderPhase;
import net.minecraft.client.render.VertexFormat.DrawMode;
import net.minecraft.client.render.VertexFormats;
public class TestRenderLayers extends FabricRenderLayers {
public static final RenderLayer COLOUR_QUADS;
static {
MultiPhaseParameters multiPhaseParameters = MultiPhaseParameters.builder()
.shader(RenderPhase.COLOR_SHADER)
.cull(RenderPhase.DISABLE_CULLING)
.transparency(RenderPhase.TRANSLUCENT_TRANSPARENCY)
.build(false);
long start = System.currentTimeMillis();
COLOUR_QUADS = create("render_layer_testmod:colour_quads",
VertexFormats.POSITION_COLOR, DrawMode.QUADS, 256, multiPhaseParameters);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment