Skip to content

Commit 99f4a63

Browse files
committed
- Bug Fix: Doors being placed at 2x2 rendering off-kilter
- Bug Fix: Sodium rendering causing artifacting in custom models
1 parent fc99ac7 commit 99f4a63

File tree

13 files changed

+160
-33
lines changed

13 files changed

+160
-33
lines changed

common/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ dependencies {
1616
because "Ensure the dependency is resolved from the specified repository."
1717
}
1818

19+
// Sodium
20+
modImplementation "maven.modrinth:sodium:${rootProject.sodium_version}"
1921

2022
modCompileOnlyApi ("com.github.iPortalTeam.ImmersivePortalsMod:imm_ptl_core:${rootProject.immersive_portals_version}"){
2123
exclude(group: "net.fabricmc.fabric-api")

common/src/main/java/whocraft/tardis_refined/TRMixinPlugin.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,30 @@
33
import org.objectweb.asm.tree.ClassNode;
44
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
55
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
6-
import whocraft.tardis_refined.compat.ModCompatChecker;
6+
import org.spongepowered.asm.service.MixinService;
77

8+
import java.io.IOException;
89
import java.util.List;
910
import java.util.Set;
1011

1112
public class TRMixinPlugin implements IMixinConfigPlugin {
1213

14+
public static final boolean HAS_SODIUM;
15+
16+
static {
17+
HAS_SODIUM = hasClass("net.caffeinemc.mods.sodium.client.render.immediate.model.EntityRenderer");
18+
}
19+
20+
private static boolean hasClass(String name) {
21+
try {
22+
// This does *not* load the class!
23+
MixinService.getService().getBytecodeProvider().getClassNode(name);
24+
return true;
25+
} catch (ClassNotFoundException | IOException e) {
26+
return false;
27+
}
28+
}
29+
1330
@Override
1431
public void onLoad(String mixinPackage) {
1532

@@ -22,11 +39,12 @@ public String getRefMapperConfig() {
2239

2340
@Override
2441
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
25-
if (ModCompatChecker.immersivePortals() && mixinClassName.contains("whocraft.tardis_refined.mixin.render.buffer")) {
26-
TardisRefined.LOGGER.info("Immersive Portals Detected, we will NOT be activating our Mixin: {}", mixinClassName);
27-
return false;
42+
43+
if (mixinClassName.contains("whocraft.tardis_refined.mixin.render.SodiumFixMixin")) {
44+
return HAS_SODIUM;
2845
}
29-
return false;
46+
47+
return true;
3048
}
3149

3250
@Override

common/src/main/java/whocraft/tardis_refined/client/renderer/blockentity/door/GlobalDoorRenderer.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import net.minecraft.client.renderer.MultiBufferSource;
55
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
66
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
7+
import net.minecraft.core.Direction;
78
import net.minecraft.world.level.block.state.BlockState;
89
import whocraft.tardis_refined.client.renderer.vortex.RenderTargetHelper;
910
import whocraft.tardis_refined.common.block.door.GlobalDoorBlock;
11+
import whocraft.tardis_refined.common.block.door.InternalDoorBlock;
1012
import whocraft.tardis_refined.common.blockentity.door.GlobalDoorBlockEntity;
1113

1214
public class GlobalDoorRenderer implements BlockEntityRenderer<GlobalDoorBlockEntity>, BlockEntityRendererProvider<GlobalDoorBlockEntity> {
@@ -21,11 +23,6 @@ public void render(GlobalDoorBlockEntity blockEntity, float partialTick, PoseSta
2123
poseStack.pushPose();
2224
BlockState blockstate = blockEntity.getBlockState();
2325

24-
if(blockstate.hasProperty(GlobalDoorBlock.OFFSET) && blockstate.getValue(GlobalDoorBlock.OFFSET)) {
25-
poseStack.translate(0, 0, -0.5);
26-
// poseStack.translate(0, 0, -0.01);
27-
}
28-
2926
RenderTargetHelper.renderVortex(blockEntity, partialTick, poseStack, bufferSource, packedLight, packedOverlay);
3027
poseStack.popPose();
3128
}

common/src/main/java/whocraft/tardis_refined/client/renderer/vortex/RenderTargetHelper.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import net.minecraft.client.renderer.RenderType;
2121
import net.minecraft.client.renderer.texture.OverlayTexture;
2222
import net.minecraft.client.renderer.texture.TextureAtlas;
23+
import net.minecraft.core.Direction;
2324
import net.minecraft.resources.ResourceLocation;
2425
import net.minecraft.world.level.block.state.BlockState;
2526
import org.apache.logging.log4j.LogManager;
@@ -33,6 +34,7 @@
3334
import whocraft.tardis_refined.client.model.blockentity.door.interior.ShellDoorModel;
3435
import whocraft.tardis_refined.client.model.blockentity.shell.ShellModelCollection;
3536
import whocraft.tardis_refined.common.VortexRegistry;
37+
import whocraft.tardis_refined.common.block.door.GlobalDoorBlock;
3638
import whocraft.tardis_refined.common.block.door.InternalDoorBlock;
3739
import whocraft.tardis_refined.common.blockentity.door.GlobalDoorBlockEntity;
3840
import whocraft.tardis_refined.compat.ModCompatChecker;
@@ -61,19 +63,28 @@ public static void renderVortex(GlobalDoorBlockEntity blockEntity, float partial
6163

6264
VORTEX.vortexType = VortexRegistry.VORTEX_DEFERRED_REGISTRY.get(tardisClientData.getVortex());
6365

66+
if (blockstate.hasProperty(GlobalDoorBlock.OFFSET) && blockstate.getValue(GlobalDoorBlock.OFFSET)) {
67+
Direction facing = blockstate.getValue(InternalDoorBlock.FACING);
68+
double xOffset = 0.0;
69+
double zOffset = 0.0;
70+
71+
switch (facing) {
72+
case NORTH -> xOffset = -0.5;
73+
case SOUTH -> xOffset = 0.5;
74+
case EAST -> zOffset = -0.5;
75+
case WEST -> zOffset = 0.5;
76+
}
77+
78+
stack.translate(xOffset, 0, zOffset);
79+
}
80+
6481
if (tardisClientData.isFlying() && TRConfig.CLIENT.RENDER_VORTEX_IN_DOOR.get()) {
6582
renderDoorOpen(blockEntity, stack, bufferSource, packedLight, rotation, currentModel, isOpen, tardisClientData);
6683
} else {
6784
renderNoVortex(blockEntity, stack, bufferSource, packedLight, rotation, currentModel, isOpen);
6885
}
69-
7086
}
7187

72-
public static void copyRenderTarget(RenderTarget src, RenderTarget dest) {
73-
GL30.glBindFramebuffer(GlConst.GL_READ_FRAMEBUFFER, src.frameBufferId);
74-
GL30.glBindFramebuffer(GlConst.GL_DRAW_FRAMEBUFFER, dest.frameBufferId);
75-
GL30.glBlitFramebuffer(0, 0, src.width, src.height, 0, 0, dest.width, dest.height, GlConst.GL_DEPTH_BUFFER_BIT | GlConst.GL_COLOR_BUFFER_BIT, GlConst.GL_NEAREST);
76-
}
7788

7889
private static ResourceLocation BLACK = new ResourceLocation(TardisRefined.MODID, "textures/black_portal.png");
7990

common/src/main/java/whocraft/tardis_refined/common/block/door/GlobalDoorBlock.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,13 @@ public InteractionResult use(BlockState blockState, Level level, BlockPos blockP
9090

9191
@Override
9292
public VoxelShape getShape(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext) {
93-
switch (blockState.getValue(FACING)) {
94-
case EAST:
95-
return EAST_AABB;
96-
case SOUTH:
97-
return SOUTH_AABB;
98-
case WEST:
99-
return WEST_AABB;
100-
case NORTH:
101-
return NORTH_AABB;
102-
}
103-
return SOUTH_AABB;
93+
return switch (blockState.getValue(FACING)) {
94+
case EAST -> blockState.getValue(OFFSET) ? EAST_AABB.move(0, 0, -0.5) : EAST_AABB;
95+
case SOUTH -> blockState.getValue(OFFSET) ? SOUTH_AABB.move(0.5, 0, 0) : SOUTH_AABB;
96+
case WEST -> blockState.getValue(OFFSET) ? WEST_AABB.move(0, 0, 0.5) : WEST_AABB;
97+
case NORTH -> blockState.getValue(OFFSET) ? NORTH_AABB.move(-0.5, 0, 0) : NORTH_AABB;
98+
default -> SOUTH_AABB;
99+
};
104100
}
105101

106102
@Override

common/src/main/java/whocraft/tardis_refined/common/block/door/InternalDoorBlock.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,24 @@ public void onPlace(BlockState blockState, Level level, BlockPos blockPos, Block
5757

5858
@Override
5959
public VoxelShape getShape(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext) {
60-
6160
if (blockState.getValue(OFFSET)) {
62-
return COLLISION.move(0, 0, -0.5);
61+
Direction facing = blockState.getValue(FACING);
62+
double xOffset = 0.0;
63+
double zOffset = 0.0;
64+
65+
switch (facing) {
66+
case NORTH -> xOffset = -0.5;
67+
case SOUTH -> xOffset = 0.5;
68+
case EAST -> zOffset = -0.5;
69+
case WEST -> zOffset = 0.5;
70+
}
71+
72+
return COLLISION.move(xOffset, 0, zOffset);
6373
}
6474
return COLLISION;
6575
}
6676

77+
6778
@Override
6879
public VoxelShape getCollisionShape(BlockState blockState, BlockGetter blockGetter, BlockPos blockPos, CollisionContext collisionContext) {
6980
return this.getShape(blockState, blockGetter, blockPos, collisionContext);

common/src/main/java/whocraft/tardis_refined/mixin/ServerPlayerMixin.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import net.minecraft.resources.ResourceKey;
55
import net.minecraft.server.level.ServerPlayer;
66
import net.minecraft.world.level.Level;
7-
import org.jetbrains.annotations.Nullable;
87
import org.spongepowered.asm.mixin.Mixin;
98
import org.spongepowered.asm.mixin.injection.At;
109
import org.spongepowered.asm.mixin.injection.Inject;
@@ -19,7 +18,9 @@ public class ServerPlayerMixin {
1918
@Inject(method = "stopSleepInBed(ZZ)V", at = @At("HEAD"))
2019
private void stopSleepInBed(boolean bl, boolean bl2, CallbackInfo ci) {
2120
ServerPlayer serverPlayer = (ServerPlayer) (Object) this;
22-
PlayerUtil.sendMessage(serverPlayer, ModMessages.TARDIS_SLEEP_END, true);
21+
if (serverPlayer.level().dimensionTypeId() == TRDimensionTypes.TARDIS) {
22+
PlayerUtil.sendMessage(serverPlayer, ModMessages.TARDIS_SLEEP_END, true);
23+
}
2324
}
2425

2526
@Inject(method = "setRespawnPosition(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/BlockPos;FZZ)V", at = @At("HEAD"), cancellable = true)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package whocraft.tardis_refined.mixin.render;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import com.mojang.blaze3d.vertex.VertexConsumer;
5+
import net.minecraft.client.model.geom.ModelPart;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.gen.Invoker;
8+
9+
@Mixin(ModelPart.class)
10+
public interface ModelPartInvoker {
11+
12+
@Invoker("compile")
13+
void invokeCompile(PoseStack.Pose pose, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha);
14+
15+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package whocraft.tardis_refined.mixin.render;
2+
3+
import com.mojang.blaze3d.vertex.PoseStack;
4+
import com.mojang.blaze3d.vertex.VertexConsumer;
5+
import me.jellysquid.mods.sodium.client.render.immediate.model.EntityRenderer;
6+
import net.caffeinemc.mods.sodium.api.util.ColorABGR;
7+
import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter;
8+
import net.minecraft.client.model.geom.ModelPart;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.Inject;
12+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
13+
import whocraft.tardis_refined.client.model.pallidium.ExtendedCubeListBuilder;
14+
15+
@Mixin(EntityRenderer.class)
16+
public class SodiumFixMixin {
17+
18+
@SuppressWarnings("ConstantValue")
19+
@Inject(method = "render", at = @At("HEAD"), remap = false, cancellable = true)
20+
private static void render(PoseStack poseStack, VertexBufferWriter writer, ModelPart part, int packedLight, int packedOverlay, int color, CallbackInfo ci) {
21+
boolean found = false;
22+
for (ModelPart.Cube cube : part.cubes) {
23+
if (cube instanceof ExtendedCubeListBuilder.PerFaceUVCube) {
24+
found = true;
25+
break;
26+
}
27+
}
28+
29+
if (found && writer instanceof VertexConsumer vertexConsumer) {
30+
ci.cancel();
31+
32+
if (part.visible) {
33+
float red = ColorABGR.unpackRed(color) / 255F;
34+
float green = ColorABGR.unpackGreen(color) / 255F;
35+
float blue = ColorABGR.unpackBlue(color) / 255F;
36+
float alpha = ColorABGR.unpackAlpha(color) / 255F;
37+
38+
if (!part.cubes.isEmpty() || !part.children.isEmpty()) {
39+
poseStack.pushPose();
40+
part.translateAndRotate(poseStack);
41+
if (!part.skipDraw && ((Object) part) instanceof ModelPartInvoker invoker) {
42+
invoker.invokeCompile(poseStack.last(), vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
43+
}
44+
45+
for (ModelPart modelPart : part.children.values()) {
46+
modelPart.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha);
47+
}
48+
49+
poseStack.popPose();
50+
}
51+
}
52+
}
53+
}
54+
55+
}

common/src/main/resources/tardis_refined-common.mixins.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"minVersion": "0.8",
44
"package": "whocraft.tardis_refined.mixin",
55
"compatibilityLevel": "JAVA_17",
6+
"plugin": "whocraft.tardis_refined.TRMixinPlugin",
67
"mixins": [
78
"EndDragonFightAccessor",
89
"MappedRegistryAccessor",
@@ -14,9 +15,11 @@
1415
"VillagerMixin"
1516
],
1617
"client": [
18+
"render.SodiumFixMixin",
1719
"LocalPlayerMixin",
1820
"MultiplayerGameModeMixin",
1921
"render.FogRendererMixin",
22+
"render.ModelPartInvoker",
2023
"render.PlayerRenderMixin",
2124
"render.buffer.MixinMainTarget",
2225
"render.buffer.MixinRenderTarget",

0 commit comments

Comments
 (0)