Last active
November 10, 2021 19:12
-
-
Save Daomephsta/e986c37932b42cd8d89066ceab412764 to your computer and use it in GitHub Desktop.
Render Layer API
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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