From b5ec799081edf3bc52c9945232e2a6cf4de7fc1a Mon Sep 17 00:00:00 2001 From: crunny <70722011+crunny@users.noreply.github.com> Date: Sat, 7 Mar 2026 17:06:51 +0000 Subject: [PATCH] Fix Sodium NPE: attach RenderMaterial to all branch/root baked quads --- .../baked/BasicBranchBlockBakedModel.java | 20 ++++++++--- .../baked/BasicRootsBlockBakedModel.java | 1 - .../baked/SurfaceRootBlockBakedModel.java | 33 +++++++++++++++++-- .../baked/ThickBranchBlockBakedModel.java | 15 +++++++-- 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/BasicBranchBlockBakedModel.java b/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/BasicBranchBlockBakedModel.java index 80b4d2e1f..064c8c15c 100644 --- a/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/BasicBranchBlockBakedModel.java +++ b/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/BasicBranchBlockBakedModel.java @@ -5,6 +5,9 @@ import net.fabricmc.fabric.api.renderer.v1.mesh.*; import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BlockElement; import net.minecraft.client.renderer.block.model.BlockElementFace; @@ -200,7 +203,7 @@ public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, Block } for (BakedQuad quad : quads) { if (quad.getDirection() == face) { - emitQuad(emitter, quad, face); + emitQuad(emitter, quad, face, context); } } } @@ -214,7 +217,7 @@ public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, Block if (sleeveQuads != null) { for (BakedQuad quad : sleeveQuads) { if (quad.getDirection() == face) { - emitQuad(emitter, quad, face); + emitQuad(emitter, quad, face, context); } } } @@ -224,8 +227,17 @@ public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, Block } } - protected void emitQuad(QuadEmitter emitter, BakedQuad quad, Direction cullFace) { - emitter.fromVanilla(quad, null, cullFace); + protected void emitQuad(QuadEmitter emitter, BakedQuad quad, Direction cullFace, RenderContext context) { + var renderer = RendererAccess.INSTANCE.getRenderer(); + + MaterialFinder finder = renderer.materialFinder(); + + finder.disableAo(0, true); + finder.disableDiffuse(0, true); + + RenderMaterial material = finder.find(); + + emitter.fromVanilla(quad, material, cullFace); emitter.emit(); } diff --git a/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/BasicRootsBlockBakedModel.java b/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/BasicRootsBlockBakedModel.java index e900afa56..47e637acb 100644 --- a/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/BasicRootsBlockBakedModel.java +++ b/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/BasicRootsBlockBakedModel.java @@ -85,7 +85,6 @@ protected int getRadius(BlockState blockState) { return super.getRadius(blockState); } - @Override protected void emitQuad(QuadEmitter emitter, BakedQuad quad, Direction cullFace) { emitter.fromVanilla(quad, null, null); emitter.emit(); diff --git a/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/SurfaceRootBlockBakedModel.java b/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/SurfaceRootBlockBakedModel.java index b56fe423c..48103d715 100644 --- a/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/SurfaceRootBlockBakedModel.java +++ b/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/SurfaceRootBlockBakedModel.java @@ -7,6 +7,9 @@ import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BlockElement; import net.minecraft.client.renderer.block.model.BlockElementFace; @@ -254,7 +257,15 @@ public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, Block if (coreQuads != null) { for (BakedQuad quad : coreQuads) { if (quad.getDirection() == face) { - emitter.fromVanilla(quad, null, null); + var renderer = RendererAccess.INSTANCE.getRenderer(); + MaterialFinder finder = renderer.materialFinder(); + + finder.disableAo(0, true); + finder.disableDiffuse(0, true); + + RenderMaterial material = finder.find(); + + emitter.fromVanilla(quad, material, null); emitter.emit(); } } @@ -269,7 +280,15 @@ public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, Block if (isGrounded && sleevesQuads[idx][connRadius - 1] != null) { for (BakedQuad quad : sleevesQuads[idx][connRadius - 1]) { if (quad.getDirection() == face) { - emitter.fromVanilla(quad, null, null); + var renderer = RendererAccess.INSTANCE.getRenderer(); + MaterialFinder finder = renderer.materialFinder(); + + finder.disableAo(0, true); + finder.disableDiffuse(0, true); + + RenderMaterial material = finder.find(); + + emitter.fromVanilla(quad, material, null); emitter.emit(); } } @@ -277,7 +296,15 @@ public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, Block if (connectionLevels[idx] == RootConnections.ConnectionLevel.HIGH && vertsQuads[idx][connRadius - 1] != null) { for (BakedQuad quad : vertsQuads[idx][connRadius - 1]) { if (quad.getDirection() == face) { - emitter.fromVanilla(quad, null, null); + var renderer = RendererAccess.INSTANCE.getRenderer(); + MaterialFinder finder = renderer.materialFinder(); + + finder.disableAo(0, true); + finder.disableDiffuse(0, true); + + RenderMaterial material = finder.find(); + + emitter.fromVanilla(quad, material, null); emitter.emit(); } } diff --git a/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/ThickBranchBlockBakedModel.java b/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/ThickBranchBlockBakedModel.java index d7e10ccc2..891a5ba14 100644 --- a/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/ThickBranchBlockBakedModel.java +++ b/fabric/src/main/java/com/dtteam/dynamictrees/model/baked/ThickBranchBlockBakedModel.java @@ -6,6 +6,9 @@ import com.dtteam.dynamictrees.utility.CoordUtils.Surround; import com.google.common.collect.Maps; import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; +import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; +import net.fabricmc.fabric.api.renderer.v1.RendererAccess; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BlockElement; import net.minecraft.client.renderer.block.model.BlockElementFace; @@ -196,12 +199,18 @@ public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, Block int radiusIndex = coreRadius - 9; if (radiusIndex < 0 || radiusIndex >= trunksBarkQuads.length) return; + var renderer = RendererAccess.INSTANCE.getRenderer(); + MaterialFinder finder = renderer.materialFinder(); + finder.disableAo(0, true); + finder.disableDiffuse(0, true); + RenderMaterial material = finder.find(); + for (Direction face : Direction.values()) { List barkQuads = trunksBarkQuads[radiusIndex]; if (barkQuads != null) { for (BakedQuad quad : barkQuads) { if (quad.getDirection() == face) { - emitter.fromVanilla(quad, null, face); + emitter.fromVanilla(quad, material, face); emitter.emit(); } } @@ -213,7 +222,7 @@ public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, Block if (ringQuads != null) { for (BakedQuad quad : ringQuads) { if (quad.getDirection() == face) { - emitter.fromVanilla(quad, null, face); + emitter.fromVanilla(quad, material, face); emitter.emit(); } } @@ -223,7 +232,7 @@ public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, Block if (topBarkQuads != null) { for (BakedQuad quad : topBarkQuads) { if (quad.getDirection() == face) { - emitter.fromVanilla(quad, null, face); + emitter.fromVanilla(quad, material, face); emitter.emit(); } }