Skip to content

Commit

Permalink
Fix Sodium 0.5 incompatibility (#178)
Browse files Browse the repository at this point in the history
* Fix Sodium 0.5 compatibility

* Compare against Sodium's minor version

* Check if Sodium >=0.5 instead

* Ensure Sodium mixin doesn't crash in production

* Applied licenses

* why did gradle use a broken symbol?

* Attempt improving dynamic light update fluidity in Sodium 0.5.x

* Another attempt to improve light fluidity with Sodium 0.5.x

* Revert "why did gradle use a broken symbol?"

This reverts commit a2f6f58.

* Revert "Applied licenses"

This reverts commit 68f504f

* Use actual copyright symbol
  • Loading branch information
BluSpring committed Aug 30, 2023
1 parent ff81f92 commit 8c2c010
Show file tree
Hide file tree
Showing 9 changed files with 168 additions and 2 deletions.
13 changes: 13 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,17 @@ repositories {
name 'grondag'
url 'https://maven.dblsaiko.net/'
}
exclusiveContent {
forRepository {
maven {
name "Modrinth"
url "https://api.modrinth.com/maven"
}
}
filter {
includeGroup "maven.modrinth"
}
}
}

configurations {
Expand All @@ -119,6 +130,8 @@ dependencies {
transitive = false
}

modImplementation "maven.modrinth:sodium:${project.sodium_version}"

shadow 'com.electronwill.night-config:core:3.6.6'
shadow 'com.electronwill.night-config:toml:3.6.6'
}
Expand Down
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,4 @@ curseforge_id=393442
spruceui_version=5.0.0+1.20
pridelib_version=1.2.0+1.19.4
modmenu_version=7.0.1
sodium_version=mc1.20.1-0.5.1
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
package dev.lambdaurora.lambdynlights;

import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.Version;
import net.fabricmc.loader.api.VersionParsingException;

/**
* Represents a utility class for compatibility.
Expand Down Expand Up @@ -47,4 +49,14 @@ public static boolean isSodium010Installed() {
return FabricLoader.getInstance().getModContainer("sodium").map(mod -> mod.getMetadata().getVersion().getFriendlyString().startsWith("0.1.0"))
.orElse(false);
}

public static boolean isSodium05XInstalled() {
return FabricLoader.getInstance().getModContainer("sodium").map(mod -> {
try {
return mod.getMetadata().getVersion().compareTo(Version.parse("0.5.0")) >= 0;
} catch (VersionParsingException e) {
throw new RuntimeException(e);
}
}).orElse(false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ public LambDynLightsMixinPlugin() {
boolean ltrInstalled = LambDynLightsCompat.isLilTaterReloadedInstalled();
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.ltr.LilTaterBlocksMixin", ltrInstalled);
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.ltr.LilTaterBlockEntityMixin", ltrInstalled);

boolean sodium05XInstalled = LambDynLightsCompat.isSodium05XInstalled();
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.ArrayLightDataCache", sodium05XInstalled);
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.FlatLightPipelineMixin", sodium05XInstalled);
this.conditionalMixins.put("dev.lambdaurora.lambdynlights.mixin.sodium.LightDataAccessMixin", sodium05XInstalled);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright © 2023 LambdAurora <[email protected]>
*
* This file is part of LambDynamicLights.
*
* Licensed under the MIT license. For more information,
* see the LICENSE file.
*/

package dev.lambdaurora.lambdynlights.mixin.sodium;

import dev.lambdaurora.lambdynlights.LambDynLights;
import dev.lambdaurora.lambdynlights.util.SodiumDynamicLightHandler;
import me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Pseudo
@Mixin(targets = "me.jellysquid.mods.sodium.client.model.light.data.ArrayLightDataCache", remap = false)
public abstract class ArrayLightDataCacheMixin extends LightDataAccess {
@Dynamic
@Inject(method = "get(III)I", at = @At("HEAD"))
private void lambdynlights$storeLightPos(int x, int y, int z, CallbackInfoReturnable<Integer> cir) {
if (!LambDynLights.get().config.getDynamicLightsMode().isEnabled())
return;

// Store the current light position.
// This is possible under smooth lighting scenarios, because AoFaceData in Sodium runs a get() call
// before getting the lightmap.
SodiumDynamicLightHandler.lambdynlights$pos.get().set(x, y, z);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright © 2023 LambdAurora <[email protected]>
*
* This file is part of LambDynamicLights.
*
* Licensed under the MIT license. For more information,
* see the LICENSE file.
*/

package dev.lambdaurora.lambdynlights.mixin.sodium;

import dev.lambdaurora.lambdynlights.util.SodiumDynamicLightHandler;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

@Pseudo
@Mixin(targets = "me.jellysquid.mods.sodium.client.model.light.flat.FlatLightPipeline", remap = false)
public abstract class FlatLightPipelineMixin {
@Dynamic
@Inject(method = "getOffsetLightmap", at = @At(value = "RETURN", ordinal = 1), remap = false, locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true)
private void lambdynlights$getLightmap(BlockPos pos, Direction face, CallbackInfoReturnable<Integer> cir, int word, int adjWord) {
int lightmap = SodiumDynamicLightHandler.lambdynlights$getLightmap(pos, adjWord, cir.getReturnValueI());
cir.setReturnValue(lightmap);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright © 2023 LambdAurora <[email protected]>
*
* This file is part of LambDynamicLights.
*
* Licensed under the MIT license. For more information,
* see the LICENSE file.
*/

package dev.lambdaurora.lambdynlights.mixin.sodium;

import dev.lambdaurora.lambdynlights.util.SodiumDynamicLightHandler;
import org.spongepowered.asm.mixin.Dynamic;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

@Pseudo
@Mixin(targets = "me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess", remap = false)
public abstract class LightDataAccessMixin {
@Dynamic
@Inject(method = "getLightmap", at = @At("RETURN"), remap = false, cancellable = true)
private static void lambdynlights$getLightmap(int word, CallbackInfoReturnable<Integer> cir) {
int lightmap = SodiumDynamicLightHandler.lambdynlights$getLightmap(SodiumDynamicLightHandler.lambdynlights$pos.get(), word, cir.getReturnValueI());
cir.setReturnValue(lightmap);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright © 2023 LambdAurora <[email protected]>
*
* This file is part of LambDynamicLights.
*
* Licensed under the MIT license. For more information,
* see the LICENSE file.
*/

package dev.lambdaurora.lambdynlights.util;

import dev.lambdaurora.lambdynlights.LambDynLights;
import me.jellysquid.mods.sodium.client.model.light.data.LightDataAccess;
import net.minecraft.util.math.BlockPos;
import org.jetbrains.annotations.ApiStatus;

@ApiStatus.Internal
public interface SodiumDynamicLightHandler {
// Stores the current light position being used by ArrayLightDataCache#get
// We use ThreadLocal because Sodium's chunk builder is multithreaded, otherwise it will break
// catastrophically.
ThreadLocal<BlockPos.Mutable> lambdynlights$pos = ThreadLocal.withInitial(BlockPos.Mutable::new);

static int lambdynlights$getLightmap(BlockPos pos, int word, int lightmap) {
if (!LambDynLights.get().config.getDynamicLightsMode().isEnabled())
return lightmap;

// Equivalent to world.getBlockState(pos).isOpaqueFullCube(world, pos)
if (LightDataAccess.unpackFO(word))
return lightmap;

double dynamic = LambDynLights.get().getDynamicLightLevel(pos);
return LambDynLights.get().getLightmapWithDynamicLight(dynamic, lightmap);
}
}
7 changes: 5 additions & 2 deletions src/main/resources/lambdynlights.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,17 @@
"BlockEntityTypeMixin",
"ClientWorldMixin",
"CommonWorldRendererMixin",
"EntityTypeMixin",
"DebugHudMixin",
"EntityRendererMixin",
"EntityTypeMixin",
"MinecraftClientMixin",
"VideoOptionsScreenMixin",
"WorldMixin",
"ltr.LilTaterBlockEntityMixin",
"ltr.LilTaterBlocksMixin"
"ltr.LilTaterBlocksMixin",
"sodium.ArrayLightDataCacheMixin",
"sodium.FlatLightPipelineMixin",
"sodium.LightDataAccessMixin"
],
"injectors": {
"defaultRequire": 1
Expand Down

0 comments on commit 8c2c010

Please sign in to comment.