Skip to content

Commit 5774bf3

Browse files
committed
Implement Fabric Rendering API
- Refactor - Fix biome blending not applied in some cases
1 parent 863eaeb commit 5774bf3

64 files changed

Lines changed: 3527 additions & 467 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ dependencies {
2323
// Fabric API. This is technically optional, but you probably want it anyway.
2424
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
2525

26-
// Needed in order to load mod namespace
2726
ext.includeModule = { name ->
2827
var module = fabricApi.module(name, project.fabric_version)
2928
modImplementation(module)
@@ -32,8 +31,9 @@ dependencies {
3231

3332
includeModule("fabric-api-base")
3433
includeModule("fabric-resource-loader-v0")
35-
includeModule("fabric-rendering-fluids-v1")
3634
includeModule("fabric-rendering-v1")
35+
includeModule("fabric-renderer-api-v1")
36+
includeModule("fabric-rendering-fluids-v1")
3737
}
3838

3939
project.ext.lwjglVersion = "3.3.3"

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ loader_version=0.16.5
1212
fabric_version=0.102.0+1.21
1313

1414
# Mod Properties
15-
mod_version = 0.4.8_dev
15+
mod_version = 0.5.0_dev
1616
maven_group = net.vulkanmod
1717
archives_base_name = VulkanMod_1.21

src/main/java/net/vulkanmod/Initializer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package net.vulkanmod;
22

33
import net.fabricmc.api.ClientModInitializer;
4+
import net.fabricmc.fabric.api.renderer.v1.RendererAccess;
45
import net.fabricmc.loader.api.FabricLoader;
56
import net.vulkanmod.config.Config;
67
import net.vulkanmod.config.Platform;
78
import net.vulkanmod.config.video.VideoModeManager;
9+
import net.vulkanmod.render.chunk.build.frapi.VulkanModRenderer;
810
import org.apache.logging.log4j.LogManager;
911
import org.apache.logging.log4j.Logger;
1012

@@ -35,6 +37,8 @@ public void onInitializeClient() {
3537
.resolve("vulkanmod_settings.json");
3638

3739
CONFIG = loadConfig(configPath);
40+
41+
RendererAccess.INSTANCE.registerRenderer(VulkanModRenderer.INSTANCE);
3842
}
3943

4044
private static Config loadConfig(Path path) {

src/main/java/net/vulkanmod/config/option/Options.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import net.vulkanmod.config.video.VideoModeManager;
1010
import net.vulkanmod.config.video.VideoModeSet;
1111
import net.vulkanmod.render.chunk.build.light.LightMode;
12+
import net.vulkanmod.render.vertex.TerrainRenderType;
1213
import net.vulkanmod.vulkan.Renderer;
1314
import net.vulkanmod.vulkan.device.DeviceManager;
1415

@@ -252,6 +253,7 @@ public static OptionBlock[] getOptimizationOpts() {
252253
new SwitchOption(Component.translatable("vulkanmod.options.uniqueOpaqueLayer"),
253254
value -> {
254255
config.uniqueOpaqueLayer = value;
256+
TerrainRenderType.updateMapping();
255257
minecraft.levelRenderer.allChanged();
256258
},
257259
() -> config.uniqueOpaqueLayer)

src/main/java/net/vulkanmod/mixin/render/block/BakedQuadM.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import net.minecraft.client.renderer.block.model.BakedQuad;
44
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
55
import net.minecraft.core.Direction;
6-
import net.vulkanmod.render.model.quad.QuadView;
6+
import net.vulkanmod.render.chunk.build.frapi.helper.NormalHelper;
7+
import net.vulkanmod.render.chunk.cull.QuadFacing;
8+
import net.vulkanmod.render.model.quad.ModelQuadView;
79
import net.vulkanmod.render.model.quad.ModelQuadFlags;
810
import org.spongepowered.asm.mixin.Final;
911
import org.spongepowered.asm.mixin.Mixin;
@@ -15,16 +17,28 @@
1517
import static net.vulkanmod.render.model.quad.ModelQuad.VERTEX_SIZE;
1618

1719
@Mixin(BakedQuad.class)
18-
public class BakedQuadM implements QuadView {
20+
public class BakedQuadM implements ModelQuadView {
1921

2022
@Shadow @Final protected int[] vertices;
2123
@Shadow @Final protected Direction direction;
2224
@Shadow @Final protected int tintIndex;
25+
2326
private int flags;
27+
private int normal;
28+
private QuadFacing facing;
2429

2530
@Inject(method = "<init>", at = @At("RETURN"))
26-
private void onInit(int[] vertices, int tintIndex, Direction direction, TextureAtlasSprite textureAtlasSprite, boolean shade, CallbackInfo ci) {
27-
this.flags = ModelQuadFlags.getQuadFlags(vertices, direction);
31+
private void onInit(int[] vertices, int tintIndex, Direction face, TextureAtlasSprite textureAtlasSprite, boolean shade, CallbackInfo ci) {
32+
this.flags = ModelQuadFlags.getQuadFlags(this, face);
33+
34+
if (face != null) {
35+
this.facing = QuadFacing.fromDirection(face);
36+
this.normal = NormalHelper.packedNormalFromDirection(face);
37+
} else {
38+
int packedNormal = NormalHelper.computePackedNormal(this);
39+
this.facing = QuadFacing.fromNormal(packedNormal);
40+
this.normal = packedNormal;
41+
}
2842
}
2943

3044
@Override
@@ -67,11 +81,26 @@ public int getColorIndex() {
6781
return this.tintIndex;
6882
}
6983

84+
@Override
85+
public Direction lightFace() {
86+
return this.direction;
87+
}
88+
7089
@Override
7190
public Direction getFacingDirection() {
7291
return this.direction;
7392
}
7493

94+
@Override
95+
public QuadFacing getQuadFacing() {
96+
return this.facing;
97+
}
98+
99+
@Override
100+
public int getNormal() {
101+
return this.normal;
102+
}
103+
75104
@Override
76105
public boolean isTinted() {
77106
return this.tintIndex != -1;

src/main/java/net/vulkanmod/mixin/render/entity/model/ModelPartM.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import net.vulkanmod.interfaces.ExtendedVertexBuilder;
77
import net.vulkanmod.interfaces.ModelPartCubeMixed;
88
import net.vulkanmod.render.model.CubeModel;
9-
import net.vulkanmod.render.vertex.VertexUtil;
9+
import net.vulkanmod.render.vertex.format.I32_SNorm;
1010
import net.vulkanmod.vulkan.util.ColorUtil;
1111
import org.joml.Matrix3f;
1212
import org.joml.Matrix4f;
@@ -52,7 +52,7 @@ public void renderCubes(PoseStack.Pose pose, VertexConsumer vertexConsumer, int
5252
matrix3f.transform(this.normal.set(polygon.normal));
5353
this.normal.normalize();
5454

55-
int packedNormal = VertexUtil.packNormal(normal.x(), normal.y(), normal.z());
55+
int packedNormal = I32_SNorm.packNormal(normal.x(), normal.y(), normal.z());
5656

5757
ModelPart.Vertex[] vertices = polygon.vertices;
5858

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package net.vulkanmod.mixin.render.frapi;
2+
3+
import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
4+
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
5+
import net.minecraft.client.resources.model.BakedModel;
6+
import net.minecraft.core.BlockPos;
7+
import net.minecraft.util.RandomSource;
8+
import net.minecraft.world.item.ItemStack;
9+
import net.minecraft.world.level.BlockAndTintGetter;
10+
import net.minecraft.world.level.block.state.BlockState;
11+
import net.vulkanmod.render.chunk.build.frapi.render.AbstractBlockRenderContext;
12+
import net.vulkanmod.render.chunk.build.frapi.render.ItemRenderContext;
13+
import org.spongepowered.asm.mixin.Mixin;
14+
15+
import java.util.function.Supplier;
16+
17+
@Mixin(BakedModel.class)
18+
public interface BakedModelM extends FabricBakedModel {
19+
20+
@Override
21+
default void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) {
22+
((AbstractBlockRenderContext) context).emitBlockQuads((BakedModel) this, state, randomSupplier, context);
23+
}
24+
25+
@Override
26+
default void emitItemQuads(ItemStack stack, Supplier<RandomSource> randomSupplier, RenderContext context) {
27+
((ItemRenderContext) context).emitItemQuads((BakedModel) this, null, randomSupplier);
28+
}
29+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package net.vulkanmod.mixin.render.frapi;
2+
3+
import net.minecraft.client.renderer.entity.ItemRenderer;
4+
import net.minecraft.world.item.ItemStack;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.gen.Invoker;
7+
8+
@Mixin(ItemRenderer.class)
9+
public interface ItemRendererAccessor {
10+
@Invoker("hasAnimatedTexture")
11+
static boolean hasAnimatedTexture(ItemStack stack) {
12+
throw new AssertionError();
13+
}
14+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package net.vulkanmod.mixin.render.frapi;
18+
19+
import net.vulkanmod.render.chunk.build.frapi.render.ItemRenderContext;
20+
import org.spongepowered.asm.mixin.Final;
21+
import org.spongepowered.asm.mixin.Mixin;
22+
import org.spongepowered.asm.mixin.Shadow;
23+
import org.spongepowered.asm.mixin.Unique;
24+
import org.spongepowered.asm.mixin.injection.At;
25+
import org.spongepowered.asm.mixin.injection.Inject;
26+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
27+
28+
import net.minecraft.client.color.item.ItemColors;
29+
import net.minecraft.client.renderer.MultiBufferSource;
30+
import net.minecraft.client.renderer.entity.ItemRenderer;
31+
import net.minecraft.client.resources.model.BakedModel;
32+
import net.minecraft.world.item.ItemDisplayContext;
33+
import net.minecraft.world.item.ItemStack;
34+
import com.mojang.blaze3d.vertex.PoseStack;
35+
36+
@Mixin(ItemRenderer.class)
37+
public abstract class ItemRendererMixin {
38+
@Final
39+
@Shadow
40+
private ItemColors itemColors;
41+
42+
@Unique
43+
private final ThreadLocal<ItemRenderContext> fabric_contexts = ThreadLocal.withInitial(() -> new ItemRenderContext(itemColors));
44+
45+
@Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/BakedModel;isCustomRenderer()Z"), method = "render", cancellable = true)
46+
public void hook_renderItem(ItemStack stack, ItemDisplayContext transformMode, boolean invert, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int light, int overlay, BakedModel model, CallbackInfo ci) {
47+
if (!model.isVanillaAdapter()) {
48+
fabric_contexts.get().renderModel(stack, transformMode, invert, matrixStack, vertexConsumerProvider, light, overlay, model);
49+
matrixStack.popPose();
50+
ci.cancel();
51+
}
52+
}
53+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package net.vulkanmod.mixin.render.frapi;
18+
19+
import net.vulkanmod.render.chunk.build.frapi.render.BlockRenderContext;
20+
import org.spongepowered.asm.mixin.Mixin;
21+
import org.spongepowered.asm.mixin.Unique;
22+
import org.spongepowered.asm.mixin.injection.At;
23+
import org.spongepowered.asm.mixin.injection.Inject;
24+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
25+
import com.mojang.blaze3d.vertex.PoseStack;
26+
import com.mojang.blaze3d.vertex.VertexConsumer;
27+
import net.minecraft.client.renderer.block.ModelBlockRenderer;
28+
import net.minecraft.client.resources.model.BakedModel;
29+
import net.minecraft.core.BlockPos;
30+
import net.minecraft.util.RandomSource;
31+
import net.minecraft.world.level.BlockAndTintGetter;
32+
import net.minecraft.world.level.block.state.BlockState;
33+
34+
@Mixin(ModelBlockRenderer.class)
35+
public abstract class ModelBlockRendererM {
36+
37+
// TODO ThreadLocal look ups are slow, same goes for ItemRendererMixin
38+
@Unique
39+
private final ThreadLocal<BlockRenderContext> fabric_contexts = ThreadLocal.withInitial(BlockRenderContext::new);
40+
41+
@Inject(at = @At("HEAD"), method = "tesselateBlock", cancellable = true)
42+
private void hookRender(BlockAndTintGetter blockView, BakedModel model, BlockState state, BlockPos pos, PoseStack matrix, VertexConsumer buffer, boolean cull, RandomSource rand, long seed, int overlay, CallbackInfo ci) {
43+
if (!model.isVanillaAdapter()) {
44+
BlockRenderContext context = fabric_contexts.get();
45+
context.render(blockView, model, state, pos, matrix, buffer, cull, rand, seed, overlay);
46+
ci.cancel();
47+
}
48+
}
49+
50+
}

0 commit comments

Comments
 (0)