Campanion

Campanion

2M Downloads

Dependency on Indigo internal classes breaks with Canvas (or any other renderer)

grondag opened this issue ยท 0 comments

commented

RopeBridgePostBlockEntityRenderer depends directly on Indigo's block render context which isn't available when another renderer is present.

The resulting crash looks like this:

java.lang.ClassCastException: class grondag.canvas.apiimpl.mesh.MeshImpl cannot be cast to class net.fabricmc.fabric.impl.client.indigo.renderer.mesh.MeshImpl (grondag.canvas.apiimpl.mesh.MeshImpl and net.fabricmc.fabric.impl.client.indigo.renderer.mesh.MeshImpl are in unnamed module of loader net.fabricmc.loader.launch.knot.KnotClassLoader @5ddeb7cb)
	at net.fabricmc.fabric.impl.client.indigo.renderer.render.AbstractMeshConsumer.accept(AbstractMeshConsumer.java:69)
	at net.fabricmc.fabric.impl.client.indigo.renderer.render.AbstractMeshConsumer.accept(AbstractMeshConsumer.java:40)
	at com.terraformersmc.campanion.client.model.block.BridgePlanksBakedModel$StaticPlanksModel.emitBlockQuads(BridgePlanksBakedModel.java:122)
	at net.fabricmc.fabric.impl.client.indigo.renderer.render.BlockRenderContext.render(BlockRenderContext.java:112)
	at com.terraformersmc.campanion.client.renderer.blockentity.RopeBridgePostBlockEntityRenderer.lambda$render$0(RopeBridgePostBlockEntityRenderer.java:42)
	at java.base/java.util.HashMap.forEach(HashMap.java:1425)
	at com.terraformersmc.campanion.client.renderer.blockentity.RopeBridgePostBlockEntityRenderer.render(RopeBridgePostBlockEntityRenderer.java:36)
	at com.terraformersmc.campanion.client.renderer.blockentity.RopeBridgePostBlockEntityRenderer.method_3569(RopeBridgePostBlockEntityRenderer.java:23)
	at net.minecraft.class_824.method_23079(class_824.java:107)
	at net.minecraft.class_824.method_23081(class_824.java:96)
	at net.minecraft.class_824.method_3554(class_824.java:128)
	at net.minecraft.class_824.method_3555(class_824.java:96)
	at grondag.canvas.render.CanvasWorldRenderer.renderWorld(CanvasWorldRenderer.java:604)
	at grondag.canvas.render.CanvasWorldRenderer.method_22710(CanvasWorldRenderer.java:1165)
	at net.minecraft.class_757.method_3188(class_757.java:727)
	at net.minecraft.class_757.method_3192(class_757.java:546)
	at net.minecraft.class_310.method_1523(class_310.java:1048)
	at net.minecraft.class_310.method_1514(class_310.java:681)
	at net.minecraft.client.main.Main.main(Main.java:215)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at net.fabricmc.loader.game.MinecraftGameProvider.launch(MinecraftGameProvider.java:224)
	at net.fabricmc.loader.launch.knot.Knot.init(Knot.java:141)
	at net.fabricmc.loader.launch.knot.KnotClient.main(KnotClient.java:27)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at org.multimc.onesix.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:196)
	at org.multimc.onesix.OneSixLauncher.launch(OneSixLauncher.java:231)
	at org.multimc.EntryPoint.listen(EntryPoint.java:143)
	at org.multimc.EntryPoint.main(EntryPoint.java:34)

There is currently no supported way to get access to a RenderContext in a block entity renderer. Probably the best way to fix this now is to pass your FabricBakedModel instances to BlockModelRenderer.renderBlockAsEntity(). Both Indigo and Canvas Intercept those calls and pass the model to a BlockRenderContext.

If that is not viable or you have questions please ping me on Discord and I'll try to help.

Referencing the Canvas issue here: vram-guild/canvas#128