Porting I

This commit is contained in:
techno-sam
2026-04-04 16:33:31 +02:00
parent cb423ccf6b
commit bec8232663
36 changed files with 352 additions and 382 deletions
@@ -1,12 +1,12 @@
package io.github.slimeistdev.crystalline_sky; package io.github.slimeistdev.crystalline_sky;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DebugRenderer_Duck; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DebugRenderer_Duck;
import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks; import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.client.rendering.v1.BlockRenderLayerMap;
import net.minecraft.client.option.KeyBinding; import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil; import net.minecraft.client.util.InputUtil;
import net.minecraft.screen.ScreenTexts; import net.minecraft.screen.ScreenTexts;
@@ -17,8 +17,8 @@ import org.lwjgl.glfw.GLFW;
public class CrystallineSkyClient implements ClientModInitializer { public class CrystallineSkyClient implements ClientModInitializer {
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
BlockRenderLayerMap.putBlock(CrystallineBlocks.SKY, BlockRenderLayerExt.CRYSTALLINE_SKY_SKY); BlockRenderLayerMap.INSTANCE.putBlock(CrystallineBlocks.SKY, CrystallineRenderLayers.SKY);
BlockRenderLayerMap.putBlock(CrystallineBlocks.WEEPING_SKY, BlockRenderLayerExt.CRYSTALLINE_SKY_SKY); BlockRenderLayerMap.INSTANCE.putBlock(CrystallineBlocks.WEEPING_SKY, CrystallineRenderLayers.SKY);
var weepingSkyKeybind = KeyBindingHelper.registerKeyBinding(new KeyBinding( var weepingSkyKeybind = KeyBindingHelper.registerKeyBinding(new KeyBinding(
"crystalline_sky.key.toggle_weeping_sky_debug", "crystalline_sky.key.toggle_weeping_sky_debug",
@@ -1,17 +1,18 @@
package io.github.slimeistdev.crystalline_sky.compat.sodium; package io.github.slimeistdev.crystalline_sky.compat.sodium;
import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.textures.GpuTextureView;
import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems;
import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformFloat3v; import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformFloat3v;
import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformFloat4v; import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformFloat4v;
import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformInt; import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformInt;
import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformMatrix4f; import net.caffeinemc.mods.sodium.client.gl.shader.uniform.GlUniformMatrix4f;
import net.caffeinemc.mods.sodium.client.render.chunk.shader.*; import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderFogComponent;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderInterface;
import net.caffeinemc.mods.sodium.client.util.FogParameters; import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderOptions;
import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderTextureSlot;
import net.caffeinemc.mods.sodium.client.render.chunk.shader.ShaderBindingContext;
import net.caffeinemc.mods.sodium.client.util.TextureUtil;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.texture.GlTexture;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import org.joml.Matrix4fc; import org.joml.Matrix4fc;
import org.lwjgl.opengl.GL32C; import org.lwjgl.opengl.GL32C;
@@ -31,6 +32,8 @@ public class SkyShaderInterface implements ChunkShaderInterface {
// The fog shader component used by this program in order to set up the appropriate GL state // The fog shader component used by this program in order to set up the appropriate GL state
private final ChunkShaderFogComponent fogShader; private final ChunkShaderFogComponent fogShader;
private final float[] colorModulator = new float[] {1.0f, 1.0f, 1.0f, 1.0f};
public SkyShaderInterface(ShaderBindingContext context, ChunkShaderOptions options) { public SkyShaderInterface(ShaderBindingContext context, ChunkShaderOptions options) {
this.uniformModelViewMatrix = context.bindUniform("u_ModelViewMatrix", GlUniformMatrix4f::new); this.uniformModelViewMatrix = context.bindUniform("u_ModelViewMatrix", GlUniformMatrix4f::new);
this.uniformProjectionMatrix = context.bindUniform("u_ProjectionMatrix", GlUniformMatrix4f::new); this.uniformProjectionMatrix = context.bindUniform("u_ProjectionMatrix", GlUniformMatrix4f::new);
@@ -43,9 +46,9 @@ public class SkyShaderInterface implements ChunkShaderInterface {
this.fogShader = options.fog().getFactory().apply(context); this.fogShader = options.fog().getFactory().apply(context);
} }
@Override // the shader interface should not modify pipeline state @Override
public void setupState(TerrainRenderPass pass, FogParameters parameters) { public void setupState() {
this.bindTexture(ChunkShaderTextureSlot.BLOCK, pass.getAtlas()); this.bindTexture(ChunkShaderTextureSlot.BLOCK, TextureUtil.getBlockTextureId());
MinecraftClient client = MinecraftClient.getInstance(); MinecraftClient client = MinecraftClient.getInstance();
if (client.world != null if (client.world != null
@@ -55,17 +58,18 @@ public class SkyShaderInterface implements ChunkShaderInterface {
|| client.player.getMainHandStack().isOf(CrystallineItems.WEEPING_SKY) || client.player.getMainHandStack().isOf(CrystallineItems.WEEPING_SKY)
|| client.player.getOffHandStack().isOf(CrystallineItems.WEEPING_SKY))) { || client.player.getOffHandStack().isOf(CrystallineItems.WEEPING_SKY))) {
float f = client.world.getTime() + client.getRenderTickCounter().getTickProgress(true); float f = client.world.getTime() + client.getRenderTickCounter().getTickDelta(true);
float alpha = (MathHelper.sin(f / 10.0f) + 1.0f) / 2.0f; float alpha = (MathHelper.sin(f / 10.0f) + 1.0f) / 2.0f;
// remap alpha from [0, 1] to [0, 0.75] // remap alpha from [0, 1] to [0, 0.75]
float maxAlpha = 1.0f - 0.25f; float maxAlpha = 1.0f - 0.25f;
alpha = alpha * maxAlpha; alpha = alpha * maxAlpha;
this.uniformColorModulator.set(1.0f, 1.0f, 1.0f, alpha); colorModulator[3] = alpha;
} else { } else {
this.uniformColorModulator.set(1.0f, 1.0f, 1.0f, 1.0f); colorModulator[3] = 1.0f;
} }
this.uniformColorModulator.set(colorModulator);
this.fogShader.setup(parameters); this.fogShader.setup();
} }
@Override // the shader interface should not modify pipeline state @Override // the shader interface should not modify pipeline state
@@ -73,16 +77,14 @@ public class SkyShaderInterface implements ChunkShaderInterface {
// This is used by alternate implementations. // This is used by alternate implementations.
} }
@Deprecated(forRemoval = true) // should be handled properly in GFX instead. /** @deprecated */
private void bindTexture(ChunkShaderTextureSlot slot, GpuTextureView textureView) { @Deprecated(
GlTexture tex = (GlTexture) textureView.texture(); forRemoval = true
)
private void bindTexture(ChunkShaderTextureSlot slot, int textureId) {
GlStateManager._activeTexture(GL32C.GL_TEXTURE0 + slot.ordinal()); GlStateManager._activeTexture(GL32C.GL_TEXTURE0 + slot.ordinal());
GlStateManager._bindTexture(tex.getGlId()); GlStateManager._bindTexture(textureId);
GlStateManager._texParameter(GL32C.GL_TEXTURE_2D, 33084, textureView.baseMipLevel()); GlUniformInt uniform = this.uniformTextures.get(slot);
GlStateManager._texParameter(GL32C.GL_TEXTURE_2D, 33085, textureView.baseMipLevel() + textureView.mipLevels() - 1);
tex.checkDirty(GL32C.GL_TEXTURE_2D);
var uniform = this.uniformTextures.get(slot);
uniform.setInt(slot.ordinal()); uniform.setInt(slot.ordinal());
} }
@@ -1,7 +1,11 @@
package io.github.slimeistdev.crystalline_sky.content.blocks; package io.github.slimeistdev.crystalline_sky.content.blocks;
import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems;
import net.minecraft.block.*; import net.minecraft.block.Block;
import net.minecraft.block.BlockRenderType;
import net.minecraft.block.BlockState;
import net.minecraft.block.ShapeContext;
import net.minecraft.block.Waterloggable;
import net.minecraft.fluid.FluidState; import net.minecraft.fluid.FluidState;
import net.minecraft.fluid.Fluids; import net.minecraft.fluid.Fluids;
import net.minecraft.state.StateManager; import net.minecraft.state.StateManager;
@@ -9,12 +13,10 @@ import net.minecraft.state.property.BooleanProperty;
import net.minecraft.state.property.Properties; import net.minecraft.state.property.Properties;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.util.math.random.Random;
import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes; import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView; import net.minecraft.world.BlockView;
import net.minecraft.world.WorldView; import net.minecraft.world.WorldAccess;
import net.minecraft.world.tick.ScheduledTickView;
public class WeepingSkyLightBlock extends Block implements Waterloggable { public class WeepingSkyLightBlock extends Block implements Waterloggable {
public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED;
@@ -35,7 +37,7 @@ public class WeepingSkyLightBlock extends Block implements Waterloggable {
} }
@Override @Override
protected boolean isTransparent(BlockState state) { protected boolean isTransparent(BlockState state, BlockView world, BlockPos pos) {
return state.getFluidState().isEmpty(); return state.getFluidState().isEmpty();
} }
@@ -52,19 +54,17 @@ public class WeepingSkyLightBlock extends Block implements Waterloggable {
@Override @Override
protected BlockState getStateForNeighborUpdate( protected BlockState getStateForNeighborUpdate(
BlockState state, BlockState state,
WorldView world,
ScheduledTickView tickView,
BlockPos pos,
Direction direction, Direction direction,
BlockPos neighborPos,
BlockState neighborState, BlockState neighborState,
Random random WorldAccess world,
BlockPos pos,
BlockPos neighborPos
) { ) {
if (state.get(WATERLOGGED)) { if (state.get(WATERLOGGED)) {
tickView.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world));
} }
return super.getStateForNeighborUpdate(state, world, tickView, pos, direction, neighborPos, neighborState, random); return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos);
} }
@Override @Override
@@ -8,6 +8,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsageContext; import net.minecraft.item.ItemUsageContext;
import net.minecraft.util.ActionResult; import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ColumnPos; import net.minecraft.util.math.ColumnPos;
import net.minecraft.world.World; import net.minecraft.world.World;
@@ -32,13 +33,13 @@ public class WeepingSkyBlockItem extends BlockItem {
} }
@Override @Override
public ActionResult use(World world, PlayerEntity user, Hand hand) { public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
ItemStack stack = user.getStackInHand(hand); ItemStack stack = user.getStackInHand(hand);
if (stack.get(CrystallineDataComponentTypes.WEEPING_SKY_DEBUG_COLUMN_TOOL) != null) { if (stack.get(CrystallineDataComponentTypes.WEEPING_SKY_DEBUG_COLUMN_TOOL) != null) {
if (world.isClient) { if (world.isClient) {
WeepingSkyBlockItemClient.setSelectedColumn(null); WeepingSkyBlockItemClient.setSelectedColumn(null);
} }
return ActionResult.SUCCESS; return TypedActionResult.success(stack);
} }
return super.use(world, user, hand); return super.use(world, user, hand);
@@ -18,13 +18,13 @@ public class CrystallineSkyBlockTagProvider extends FabricTagProvider.BlockTagPr
@Override @Override
protected void configure(RegistryWrapper.WrapperLookup wrapperLookup) { protected void configure(RegistryWrapper.WrapperLookup wrapperLookup) {
valueLookupBuilder(TagKey.of(RegistryKeys.BLOCK, CrystallineSky.id("sky_light_emitters"))) getOrCreateTagBuilder(TagKey.of(RegistryKeys.BLOCK, CrystallineSky.id("sky_light_emitters")))
.add(CrystallineBlocks.SKY) .add(CrystallineBlocks.SKY)
.add(CrystallineBlocks.SKY_LIGHT) .add(CrystallineBlocks.SKY_LIGHT)
.add(CrystallineBlocks.WEEPING_SKY) .add(CrystallineBlocks.WEEPING_SKY)
.add(CrystallineBlocks.WEEPING_SKY_LIGHT); .add(CrystallineBlocks.WEEPING_SKY_LIGHT);
valueLookupBuilder(BlockTags.CRYSTAL_SOUND_BLOCKS) getOrCreateTagBuilder(BlockTags.CRYSTAL_SOUND_BLOCKS)
.add(CrystallineBlocks.SKY) .add(CrystallineBlocks.SKY)
.add(CrystallineBlocks.WEEPING_SKY); .add(CrystallineBlocks.WEEPING_SKY);
} }
@@ -2,22 +2,25 @@ package io.github.slimeistdev.crystalline_sky.datagen.providers;
import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks; import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks;
import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems;
import net.fabricmc.fabric.api.client.datagen.v1.provider.FabricModelProvider;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.LightBlock; import net.minecraft.data.client.BlockStateModelGenerator;
import net.minecraft.client.data.*; import net.minecraft.data.client.BlockStateVariant;
import net.minecraft.client.render.item.model.ItemModel; import net.minecraft.data.client.BlockStateVariantMap;
import net.minecraft.client.render.model.json.WeightedVariant; import net.minecraft.data.client.ItemModelGenerator;
import net.minecraft.data.client.ModelIds;
import net.minecraft.data.client.Models;
import net.minecraft.data.client.TextureMap;
import net.minecraft.data.client.VariantSettings;
import net.minecraft.data.client.VariantsBlockStateSupplier;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.state.property.Properties; import net.minecraft.state.property.Properties;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import java.util.HashMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import static net.minecraft.client.data.BlockStateModelGenerator.createWeightedVariant; //import static net.minecraft.client.data.BlockStateModelGenerator.createWeightedVariant;
@SuppressWarnings("SameParameterValue") @SuppressWarnings("SameParameterValue")
public class CrystallineSkyModelProvider extends FabricModelProvider { public class CrystallineSkyModelProvider extends FabricModelProvider {
@@ -41,26 +44,25 @@ public class CrystallineSkyModelProvider extends FabricModelProvider {
} }
private void registerSkyLightBlock(BlockStateModelGenerator gen, Block block, Item item) { private void registerSkyLightBlock(BlockStateModelGenerator gen, Block block, Item item) {
ItemModel.Unbaked fallback = ItemModels.basic(gen.uploadItemModel(item)); BlockStateVariantMap.SingleProperty<Integer> singleProperty = BlockStateVariantMap.create(Properties.LEVEL_15);
Map<Integer, ItemModel.Unbaked> itemModels = new HashMap<>(16);
BlockStateVariantMap.SingleProperty<WeightedVariant, Integer> levelProp = BlockStateVariantMap.models(Properties.LEVEL_15);
for (int level = 0; level <= 15; level++) { for (int level = 0; level <= 15; level++) {
String suffix = String.format(Locale.ROOT, "_%02d", level); String suffix = String.format(Locale.ROOT, "_%02d", level);
Identifier texture = TextureMap.getSubId(item, suffix); Identifier texture = TextureMap.getSubId(item, suffix);
levelProp.register(level, createWeightedVariant(Models.PARTICLE.upload(block, suffix, TextureMap.particle(texture), gen.modelCollector))); singleProperty.register(level, BlockStateVariant.create().put(
VariantSettings.MODEL,
ItemModel.Unbaked levelItemModel = ItemModels.basic(Models.GENERATED.upload( Models.PARTICLE.upload(block, suffix, TextureMap.particle(texture), gen.modelCollector))
);
Models.GENERATED.upload(
ModelIds.getItemSubModelId(item, suffix), ModelIds.getItemSubModelId(item, suffix),
TextureMap.layer0(texture), TextureMap.layer0(texture),
gen.modelCollector gen.modelCollector
)); );
itemModels.put(level, levelItemModel);
} }
gen.itemModelOutput.accept(item, ItemModels.select(LightBlock.LEVEL_15, fallback, itemModels)); // TODO generate root-level item model itself
gen.blockStateCollector.accept(VariantsBlockModelDefinitionCreator.of(block).with(levelProp)); gen.blockStateCollector.accept(VariantsBlockStateSupplier.create(block).coordinate(singleProperty));
} }
@Override @Override
@@ -1,11 +0,0 @@
package io.github.slimeistdev.crystalline_sky.extenders_cove;
import com.chocohead.mm.api.ClassTinkerers;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.render.BlockRenderLayer;
public class BlockRenderLayerExt {
@Environment(EnvType.CLIENT)
public static final BlockRenderLayer CRYSTALLINE_SKY_SKY = ClassTinkerers.getEnum(BlockRenderLayer.class, "CRYSTALLINE_SKY_SKY");
}
@@ -1,8 +0,0 @@
package io.github.slimeistdev.crystalline_sky.extenders_cove;
import com.chocohead.mm.api.ClassTinkerers;
import net.minecraft.client.render.BlockRenderLayerGroup;
public class BlockRenderLayerGroupExt {
public static final BlockRenderLayerGroup CRYSTALLINE_SKY_SKY = ClassTinkerers.getEnum(BlockRenderLayerGroup.class, "CRYSTALLINE_SKY_SKY");
}
@@ -1,16 +0,0 @@
package io.github.slimeistdev.crystalline_sky.extenders_cove;
import net.fabricmc.api.EnvType;
import net.fabricmc.loader.api.FabricLoader;
import java.util.function.Supplier;
public class CrystallineSkyEarlyRiser implements Runnable {
@Override
@SuppressWarnings({"Convert2MethodRef", "TrivialFunctionalExpressionUsage"})
public void run() {
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
((Supplier<Runnable>) (() -> () -> CrystallineSkyEarlyRiserClient.runClient())).get().run();
}
}
}
@@ -1,38 +0,0 @@
package io.github.slimeistdev.crystalline_sky.extenders_cove;
import com.chocohead.mm.api.ClassTinkerers;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderPipelines;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.MappingResolver;
import net.minecraft.client.render.BlockRenderLayer;
class CrystallineSkyEarlyRiserClient {
@Environment(EnvType.CLIENT)
static void runClient() {
MappingResolver remapper = FabricLoader.getInstance().getMappingResolver();
// net.minecraft.client.render.BlockRenderLayer
String blockRenderLayer = remapper.mapClassName("intermediary", "net.minecraft.class_11515");
// RenderPipeline is not obfuscated
ClassTinkerers.enumBuilder(blockRenderLayer, "Lcom/mojang/blaze3d/pipeline/RenderPipeline;", "I", "Z", "Z")
.addEnum("CRYSTALLINE_SKY_SKY", () -> new Object[]{
CrystallineRenderPipelines.SKY_PIPELINE,
1536,
false,
false
})
.build();
// net.minecraft.client.render.BlockRenderLayerGroup
String blockRenderLayerGroup = remapper.mapClassName("intermediary", "net.minecraft.class_11531");
ClassTinkerers.enumBuilder(blockRenderLayerGroup, "[L"+blockRenderLayer+";")
.addEnum("CRYSTALLINE_SKY_SKY", () -> new Object[] {
new BlockRenderLayer[] {BlockRenderLayerExt.CRYSTALLINE_SKY_SKY}
})
.build();
}
}
@@ -54,7 +54,7 @@ public class MutableWeepingScanner implements WeepingStorage.WeepingScanner {
while (bottomPos.getY() >= minY) { while (bottomPos.getY() >= minY) {
BlockState bottomState = blockView.getBlockState(bottomPos); BlockState bottomState = blockView.getBlockState(bottomPos);
if (faceBlocksLight(topState, bottomState)) { if (faceBlocksLight(blockView, topState, bottomState, topPos, bottomPos)) {
return transformOutputY(bottomPos.getY()); return transformOutputY(bottomPos.getY());
} }
@@ -85,7 +85,7 @@ public class MutableWeepingScanner implements WeepingStorage.WeepingScanner {
return transformOutputY(bottomPos.getY()); return transformOutputY(bottomPos.getY());
} }
if (faceBlocksLight(topState, bottomState)) { if (faceBlocksLight(blockView, topState, bottomState, topPos, bottomPos)) {
return -1; return -1;
} }
@@ -107,15 +107,15 @@ public class MutableWeepingScanner implements WeepingStorage.WeepingScanner {
BlockState upper = blockView.getBlockState(reusablePos1); BlockState upper = blockView.getBlockState(reusablePos1);
BlockState lower = blockView.getBlockState(reusablePos2); BlockState lower = blockView.getBlockState(reusablePos2);
return faceBlocksLight(upper, lower); return faceBlocksLight(blockView, upper, lower, reusablePos1, reusablePos2);
} }
private static boolean faceBlocksLight(BlockState upper, BlockState lower) { private static boolean faceBlocksLight(BlockView world, BlockState upper, BlockState lower, BlockPos upperPos, BlockPos lowerPos) {
if (lower.getOpacity() != 0) { if (lower.getOpacity(world, lowerPos) != 0) {
return true; return true;
} else { } else {
VoxelShape voxelShape = ChunkLightProvider.getOpaqueShape(upper, Direction.DOWN); VoxelShape voxelShape = ChunkLightProvider.getOpaqueShape(world, upperPos, upper, Direction.DOWN);
VoxelShape voxelShape2 = ChunkLightProvider.getOpaqueShape(lower, Direction.UP); VoxelShape voxelShape2 = ChunkLightProvider.getOpaqueShape(world, lowerPos, lower, Direction.UP);
return VoxelShapes.unionCoversFullCube(voxelShape, voxelShape2); return VoxelShapes.unionCoversFullCube(voxelShape, voxelShape2);
} }
} }
@@ -1,28 +0,0 @@
package io.github.slimeistdev.crystalline_sky.mixin.client;
import com.mojang.blaze3d.textures.GpuTextureView;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DefaultFramebufferSet_Duck;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.Framebuffer;
import net.minecraft.client.render.BlockRenderLayer;
import net.minecraft.client.render.DefaultFramebufferSet;
import net.minecraft.client.util.Handle;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(BlockRenderLayer.class)
public class BlockRenderLayerMixin {
@Inject(method = "getTextureView", at = @At("HEAD"), cancellable = true)
private void shatterTheSky(CallbackInfoReturnable<GpuTextureView> cir) {
if (((Object) this) == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) {
MinecraftClient mc = MinecraftClient.getInstance();
DefaultFramebufferSet framebuffers = ((WorldRendererAccessor) mc.worldRenderer).crystalline_sky$getFramebufferSet();
Handle<Framebuffer> skyFramebuffer = ((DefaultFramebufferSet_Duck) framebuffers).crystalline_sky$getSkyFramebuffer();
cir.setReturnValue(skyFramebuffer.get().getColorAttachmentView());
}
}
}
@@ -3,7 +3,6 @@ package io.github.slimeistdev.crystalline_sky.mixin.client;
import io.github.slimeistdev.crystalline_sky.infrastructure.client.WeepingSkyDebugRenderer; import io.github.slimeistdev.crystalline_sky.infrastructure.client.WeepingSkyDebugRenderer;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DebugRenderer_Duck; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DebugRenderer_Duck;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.Frustum;
import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.debug.DebugRenderer; import net.minecraft.client.render.debug.DebugRenderer;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
@@ -42,7 +41,7 @@ public class DebugRendererMixin implements DebugRenderer_Duck {
} }
@Inject(method = "render", at = @At("RETURN")) @Inject(method = "render", at = @At("RETURN"))
private void render(MatrixStack matrices, Frustum frustum, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { private void render(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) {
if (crystalline_sky$weepingSkyMode != 0) { if (crystalline_sky$weepingSkyMode != 0) {
crystalline_sky$weepingSkyDebugRenderer.setLitMode(crystalline_sky$weepingSkyMode == 1); crystalline_sky$weepingSkyDebugRenderer.setLitMode(crystalline_sky$weepingSkyMode == 1);
crystalline_sky$weepingSkyDebugRenderer.render(matrices, vertexConsumers, cameraX, cameraY, cameraZ); crystalline_sky$weepingSkyDebugRenderer.render(matrices, vertexConsumers, cameraX, cameraY, cameraZ);
@@ -1,49 +0,0 @@
package io.github.slimeistdev.crystalline_sky.mixin.client;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DefaultFramebufferSet_Duck;
import net.minecraft.client.gl.Framebuffer;
import net.minecraft.client.render.DefaultFramebufferSet;
import net.minecraft.client.util.Handle;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(DefaultFramebufferSet.class)
public class DefaultFramebufferSetMixin implements DefaultFramebufferSet_Duck {
@Unique
private Handle<Framebuffer> crystalline_sky$skyFramebuffer = Handle.empty();
@Override
public Handle<Framebuffer> crystalline_sky$getSkyFramebuffer() {
return crystalline_sky$skyFramebuffer;
}
@Override
public void crystalline_sky$setSkyFramebuffer(Handle<Framebuffer> framebuffer) {
crystalline_sky$skyFramebuffer = framebuffer;
}
@Inject(method = "set", at = @At("HEAD"), cancellable = true)
private void setSky(Identifier id, Handle<Framebuffer> framebuffer, CallbackInfo ci) {
if (id.equals(crystalline_sky$SKY_FRAMEBUFFER)) {
crystalline_sky$skyFramebuffer = framebuffer;
ci.cancel();
}
}
@Inject(method = "get", at = @At("HEAD"), cancellable = true)
private void getSky(Identifier id, CallbackInfoReturnable<Handle<Framebuffer>> cir) {
if (id.equals(crystalline_sky$SKY_FRAMEBUFFER)) {
cir.setReturnValue(crystalline_sky$skyFramebuffer);
}
}
@Inject(method = "clear", at = @At("HEAD"))
private void clearSky(CallbackInfo ci) {
crystalline_sky$skyFramebuffer = Handle.empty();
}
}
@@ -1,18 +1,17 @@
package io.github.slimeistdev.crystalline_sky.mixin.client; package io.github.slimeistdev.crystalline_sky.mixin.client;
import com.mojang.blaze3d.platform.GlConst;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.textures.GpuTexture;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.Framebuffer_Duck; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.Framebuffer_Duck;
import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.gl.Framebuffer;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@Mixin(Framebuffer.class) @Mixin(Framebuffer.class)
public class FramebufferMixin implements Framebuffer_Duck { public class FramebufferMixin implements Framebuffer_Duck {
@Shadow @Shadow
@Nullable protected int colorAttachment;
protected GpuTexture colorAttachment;
@Shadow @Shadow
public int textureWidth; public int textureWidth;
@@ -20,17 +19,25 @@ public class FramebufferMixin implements Framebuffer_Duck {
@Shadow @Shadow
public int textureHeight; public int textureHeight;
@Shadow
public int fbo;
@Override @Override
public void crystalline_sky$copyColorFrom(Framebuffer framebuffer) { public void crystalline_sky$copyColorFrom(Framebuffer framebuffer) {
RenderSystem.assertOnRenderThread(); RenderSystem.assertOnRenderThread();
if (this.colorAttachment == null) { if (this.colorAttachment == -1) {
throw new IllegalStateException("Trying to copy color texture to a RenderTarget without a color texture"); throw new IllegalStateException("Trying to copy color texture to a RenderTarget without a color texture");
} else if (framebuffer.getColorAttachment() == null) { } else if (framebuffer.getColorAttachment() == -1) {
throw new IllegalStateException("Trying to copy color texture from a RenderTarget without a color texture"); throw new IllegalStateException("Trying to copy color texture from a RenderTarget without a color texture");
} else { } else {
RenderSystem.getDevice() GlStateManager._glBindFramebuffer(GlConst.GL_READ_FRAMEBUFFER, framebuffer.fbo);
.createCommandEncoder() GlStateManager._glBindFramebuffer(GlConst.GL_DRAW_FRAMEBUFFER, this.fbo);
.copyTextureToTexture(framebuffer.getColorAttachment(), this.colorAttachment, 0, 0, 0, 0, 0, this.textureWidth, this.textureHeight); GlStateManager._glBlitFrameBuffer(
0, 0, framebuffer.textureWidth, framebuffer.textureHeight,
0, 0, this.textureWidth, this.textureHeight,
256, GlConst.GL_NEAREST
);
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, 0);
} }
} }
} }
@@ -0,0 +1,35 @@
package io.github.slimeistdev.crystalline_sky.mixin.client;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.mojang.datafixers.util.Pair;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineShaderPrograms;
import net.minecraft.client.gl.ShaderProgram;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.resource.ResourceFactory;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import java.io.IOException;
import java.util.List;
import java.util.function.Consumer;
@Mixin(GameRenderer.class)
public class GameRendererMixin {
@SuppressWarnings("InvalidInjectorMethodSignature")
@WrapOperation(method = "loadPrograms", at = @At(value = "INVOKE", target = "Ljava/util/List;add(Ljava/lang/Object;)Z", ordinal = 0))
private <E extends Pair<ShaderProgram, Consumer<ShaderProgram>>> boolean loadSkyProgram(
List<E> instance,
E e,
Operation<Boolean> original,
ResourceFactory factory
) throws IOException {
original.call(instance, Pair.of(new ShaderProgram(
factory,
"crystalline_sky_rendertype_sky",
VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL
), (Consumer<ShaderProgram>) program -> CrystallineShaderPrograms.renderTypeSkyProgram = program));
return original.call(instance, e);
}
}
@@ -0,0 +1,21 @@
package io.github.slimeistdev.crystalline_sky.mixin.client;
import com.google.common.collect.ImmutableList;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.minecraft.client.render.RenderLayer;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@Mixin(RenderLayer.class)
public class RenderLayerMixin {
@WrapOperation(method = "<clinit>", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/RenderLayer;BLOCK_LAYERS:Lcom/google/common/collect/ImmutableList;", opcode = Opcodes.PUTSTATIC))
private static void addSkyToBlockLayers(ImmutableList<RenderLayer> value, Operation<Void> original) {
original.call(ImmutableList.<RenderLayer>builder()
.addAll(value)
.add(CrystallineRenderLayers.SKY)
.build());
}
}
@@ -1,12 +0,0 @@
package io.github.slimeistdev.crystalline_sky.mixin.client;
import net.minecraft.client.render.DefaultFramebufferSet;
import net.minecraft.client.render.WorldRenderer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(WorldRenderer.class)
public interface WorldRendererAccessor {
@Accessor("framebufferSet")
DefaultFramebufferSet crystalline_sky$getFramebufferSet();
}
@@ -1,22 +1,22 @@
package io.github.slimeistdev.crystalline_sky.mixin.client; package io.github.slimeistdev.crystalline_sky.mixin.client;
import com.llamalad7.mixinextras.sugar.Local; import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerGroupExt;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DefaultFramebufferSet_Duck;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.Framebuffer_Duck; import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.Framebuffer_Duck;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.WorldRenderer_Duck;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.gl.Framebuffer;
import net.minecraft.client.gl.SimpleFramebufferFactory; import net.minecraft.client.gl.SimpleFramebuffer;
import net.minecraft.client.option.CloudRenderMode; import net.minecraft.client.render.Camera;
import net.minecraft.client.render.*; import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.util.Handle; import net.minecraft.client.render.LightmapTextureManager;
import net.minecraft.client.util.ObjectAllocator; import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderTickCounter;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.util.profiler.Profiler;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.joml.Matrix4f; import org.joml.Matrix4f;
import org.joml.Vector4f;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@@ -25,14 +25,8 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Optional;
@Mixin(WorldRenderer.class) @Mixin(WorldRenderer.class)
public abstract class WorldRendererMixin { public abstract class WorldRendererMixin implements WorldRenderer_Duck {
@Shadow
@Final
private DefaultFramebufferSet framebufferSet;
@Shadow @Shadow
@Final @Final
private MinecraftClient client; private MinecraftClient client;
@@ -43,33 +37,73 @@ public abstract class WorldRendererMixin {
@Shadow @Shadow
private int ticks; private int ticks;
@Shadow
@Final
private CloudRenderer cloudRenderer;
@Shadow @Shadow
protected abstract boolean hasBlindnessOrDarkness(Camera camera); protected abstract boolean hasBlindnessOrDarkness(Camera camera);
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;getTransparencyPostEffectProcessor()Lnet/minecraft/client/gl/PostEffectProcessor;")) @Shadow
private void setupSkyBuffer(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline, protected abstract void renderLayer(RenderLayer renderLayer, double x, double y, double z, Matrix4f matrix4f, Matrix4f positionMatrix);
Camera camera, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice fog,
Vector4f fogColor, boolean shouldRenderSky, CallbackInfo ci,
@Local FrameGraphBuilder frameGraphBuilder,
@Local SimpleFramebufferFactory factory) {
Handle<Framebuffer> framebuffer = frameGraphBuilder.createResourceHandle("crystalline_sky:sky_framebuffer", factory);
((DefaultFramebufferSet_Duck) framebufferSet).crystalline_sky$setSkyFramebuffer(framebuffer);
}
@Unique @Unique
private Handle<Framebuffer> crystalline_sky$transferSkyBuffer(FramePass pass) { @Nullable
Handle<Framebuffer> skyFramebuffer = pass.transfer( private Framebuffer crystalline_sky$skyBuffer;// = new SimpleFramebuffer(0, 0, false, MinecraftClient.IS_SYSTEM_MAC);
((DefaultFramebufferSet_Duck) framebufferSet).crystalline_sky$getSkyFramebuffer());
((DefaultFramebufferSet_Duck) framebufferSet).crystalline_sky$setSkyFramebuffer(skyFramebuffer); @Override
return skyFramebuffer; public Framebuffer crystalline_sky$getSkyFramebuffer() {
if (crystalline_sky$skyBuffer == null) {
var fb = client.getFramebuffer();
crystalline_sky$skyBuffer = new SimpleFramebuffer(fb.textureWidth, fb.textureHeight, false, MinecraftClient.IS_SYSTEM_MAC);
}
return crystalline_sky$skyBuffer;
} }
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderMain(Lnet/minecraft/client/render/FrameGraphBuilder;Lnet/minecraft/client/render/Frustum;Lnet/minecraft/client/render/Camera;Lorg/joml/Matrix4f;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;ZZLnet/minecraft/client/render/RenderTickCounter;Lnet/minecraft/util/profiler/Profiler;)V")) @Inject(
private void copyAfterSky(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline, method = "render",
at = @At(
value = "INVOKE_STRING",
target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V",
args = "ldc=clear",
shift = At.Shift.AFTER
)
)
private void setupSkyBuffer(RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera,
GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager,
Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci) {
crystalline_sky$getSkyFramebuffer();
}
@Inject(method = "onResized", at = @At("RETURN"))
private void resizeSkyBuffer(int width, int height, CallbackInfo ci) {
if (crystalline_sky$skyBuffer != null) {
crystalline_sky$skyBuffer.resize(width, height, MinecraftClient.IS_SYSTEM_MAC);
}
}
@Inject(method = "close", at = @At("RETURN"))
private void closeSkyBuffer(CallbackInfo ci) {
if (crystalline_sky$skyBuffer != null) {
crystalline_sky$skyBuffer.delete();
crystalline_sky$skyBuffer = null;
}
}
@Inject(
method = "render",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/render/WorldRenderer;renderSky(Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;FLnet/minecraft/client/render/Camera;ZLjava/lang/Runnable;)V",
shift = At.Shift.AFTER
)
)
private void copyAfterSky(RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera,
GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager,
Matrix4f matrix4f, Matrix4f matrix4f2, CallbackInfo ci) {
var skyBuffer = crystalline_sky$getSkyFramebuffer();
((Framebuffer_Duck) skyBuffer).crystalline_sky$copyColorFrom(client.getFramebuffer());
// TODO: render clouds
}
/* @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;renderMain(Lnet/minecraft/client/render/FrameGraphBuilder;Lnet/minecraft/client/render/Frustum;Lnet/minecraft/client/render/Camera;Lorg/joml/Matrix4f;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;ZZLnet/minecraft/client/render/RenderTickCounter;Lnet/minecraft/util/profiler/Profiler;)V"))
private void copyAfterSky2(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline,
Camera camera, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice fog, Camera camera, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice fog,
Vector4f fogColor, boolean shouldRenderSky, CallbackInfo ci, Vector4f fogColor, boolean shouldRenderSky, CallbackInfo ci,
@Local FrameGraphBuilder frameGraphBuilder) { @Local FrameGraphBuilder frameGraphBuilder) {
@@ -111,31 +145,20 @@ public abstract class WorldRendererMixin {
} }
} }
} }
} }*/
@Inject(method = "renderMain", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/FramePass;transfer(Lnet/minecraft/client/util/Handle;)Lnet/minecraft/client/util/Handle;", ordinal = 0)) // after solid, cutoutMipped, and cutout
private void transferCrystallineSky(FrameGraphBuilder frameGraphBuilder, Frustum frustum, Camera camera, @WrapOperation(
Matrix4f positionMatrix, GpuBufferSlice fog, boolean renderBlockOutline, method = "render",
boolean renderEntityOutline, RenderTickCounter tickCounter, Profiler profiler,
CallbackInfo ci, @Local FramePass framePass) {
crystalline_sky$transferSkyBuffer(framePass);
}
// renderMain : framePass.setRenderer(@{() -> ...});
@Inject(
method = "method_62214",
at = @At( at = @At(
value = "INVOKE", value = "INVOKE",
target = "Lnet/minecraft/client/render/SectionRenderState;renderSection(Lnet/minecraft/client/render/BlockRenderLayerGroup;)V", target = "Lnet/minecraft/client/render/WorldRenderer;renderLayer(Lnet/minecraft/client/render/RenderLayer;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V",
ordinal = 0, ordinal = 2
shift = At.Shift.AFTER
) )
) )
private void renderCrystallineSky(GpuBufferSlice fog, RenderTickCounter tickCounter, Camera camera, private void renderCrystallineSky(WorldRenderer instance, RenderLayer renderLayer, double x, double y, double z,
Profiler profiler, Matrix4f positionMatrix, Handle<Framebuffer> itemEntityFramebuffer, Matrix4f matrix4f, Matrix4f positionMatrix, Operation<Void> original) {
Handle<Framebuffer> entityOutlineFramebuffer, boolean renderBlockOutline, Frustum frustum, original.call(instance, renderLayer, x, y, z, matrix4f, positionMatrix);
Handle<Framebuffer> translucentFramebuffer, Handle<Framebuffer> mainFramebuffer, CallbackInfo ci, renderLayer(CrystallineRenderLayers.SKY, x, y, z, matrix4f, positionMatrix);
@Local SectionRenderState sectionRenderState) {
sectionRenderState.renderSection(BlockRenderLayerGroupExt.CRYSTALLINE_SKY_SKY);
} }
} }
@@ -2,20 +2,19 @@ package io.github.slimeistdev.crystalline_sky.mixin.client;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.systems.RenderSystem;
import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin;
import io.github.slimeistdev.crystalline_sky.compat.Mods; import io.github.slimeistdev.crystalline_sky.compat.Mods;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt;
import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems; import io.github.slimeistdev.crystalline_sky.registry.CrystallineItems;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.DynamicUniforms; import net.minecraft.client.gl.ShaderProgram;
import net.minecraft.client.render.BlockRenderLayer; import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.WorldRenderer; import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.util.Window;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import org.joml.Matrix4fc; import org.joml.Matrix4f;
import org.joml.Vector3fc;
import org.joml.Vector4f;
import org.joml.Vector4fc;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
@@ -31,26 +30,29 @@ public class WorldRenderer_NoSodium_Mixin {
@Shadow @Shadow
private int ticks; private int ticks;
@WrapOperation(method = "renderBlockLayers", at = @At(value = "NEW", target = "net/minecraft/client/gl/DynamicUniforms$UniformValue")) @WrapOperation(method = "renderLayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gl/ShaderProgram;initializeUniforms(Lnet/minecraft/client/render/VertexFormat$DrawMode;Lorg/joml/Matrix4f;Lorg/joml/Matrix4f;Lnet/minecraft/client/util/Window;)V"))
private DynamicUniforms.UniformValue tintSkyBlocks(Matrix4fc modelView, Vector4fc colorModulator, private void tintSkyBlocks(ShaderProgram instance, VertexFormat.DrawMode drawMode, Matrix4f viewMatrix,
Vector3fc modelOffset, Matrix4fc textureMatrix, float lineWidth, Matrix4f projectionMatrix, Window window, Operation<Void> original,
Operation<DynamicUniforms.UniformValue> original, RenderLayer renderLayer) {
@Local BlockRenderLayer blockRenderLayer) { original.call(instance, drawMode, viewMatrix, projectionMatrix, window);
if (blockRenderLayer == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY
if (renderLayer == CrystallineRenderLayers.SKY
&& instance.colorModulator != null
&& client.player != null && client.player != null
&& (client.player.getMainHandStack().isOf(CrystallineItems.SKY) && (client.player.getMainHandStack().isOf(CrystallineItems.SKY)
|| client.player.getOffHandStack().isOf(CrystallineItems.SKY) || client.player.getOffHandStack().isOf(CrystallineItems.SKY)
|| client.player.getMainHandStack().isOf(CrystallineItems.WEEPING_SKY) || client.player.getMainHandStack().isOf(CrystallineItems.WEEPING_SKY)
|| client.player.getOffHandStack().isOf(CrystallineItems.WEEPING_SKY))) { || client.player.getOffHandStack().isOf(CrystallineItems.WEEPING_SKY))) {
float f = ticks + client.getRenderTickCounter().getTickProgress(true); float f = ticks + client.getRenderTickCounter().getTickDelta(true);
float alpha = (MathHelper.sin(f / 10.0f) + 1.0f) / 2.0f; float alpha = (MathHelper.sin(f / 10.0f) + 1.0f) / 2.0f;
// remap alpha from [0, 1] to [0, 0.75] // remap alpha from [0, 1] to [0, 0.75]
float maxAlpha = 1.0f - 0.25f; float maxAlpha = 1.0f - 0.25f;
alpha = alpha * maxAlpha; alpha = alpha * maxAlpha;
colorModulator = new Vector4f(1.0f, 1.0f, 1.0f, alpha).mul(colorModulator);
}
return original.call(modelView, colorModulator, modelOffset, textureMatrix, lineWidth); float[] colorModulator = RenderSystem.getShaderColor().clone();
colorModulator[3] *= alpha;
instance.colorModulator.set(colorModulator);
}
} }
} }
@@ -3,8 +3,8 @@ package io.github.slimeistdev.crystalline_sky.mixin.client.compat.axiom;
import com.moulberry.axiom.render.ChunkRenderOverrider; import com.moulberry.axiom.render.ChunkRenderOverrider;
import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin;
import io.github.slimeistdev.crystalline_sky.compat.Mods; import io.github.slimeistdev.crystalline_sky.compat.Mods;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.minecraft.client.render.BlockRenderLayer; import net.minecraft.client.render.RenderLayer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@@ -13,9 +13,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@ConditionalMixin(mods = Mods.AXIOM) @ConditionalMixin(mods = Mods.AXIOM)
@Mixin(ChunkRenderOverrider.AxiomChunkOverrideLayer.class) @Mixin(ChunkRenderOverrider.AxiomChunkOverrideLayer.class)
public class ChunkRenderOverrider_AxiomChunkOverrideLayerMixin { public class ChunkRenderOverrider_AxiomChunkOverrideLayerMixin {
@Inject(method = "fromVanilla", at = @At(value = "NEW", target = "()Ljava/lang/IncompatibleClassChangeError;"), cancellable = true) @Inject(method = "fromVanilla", at = @At("HEAD"), cancellable = true)
private static void unexplodeSky(BlockRenderLayer layer, CallbackInfoReturnable<ChunkRenderOverrider.AxiomChunkOverrideLayer> cir) { private static void unexplodeSky(RenderLayer layer, CallbackInfoReturnable<ChunkRenderOverrider.AxiomChunkOverrideLayer> cir) {
if (layer == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) { if (layer == CrystallineRenderLayers.SKY) {
cir.setReturnValue(ChunkRenderOverrider.AxiomChunkOverrideLayer.CUTOUT_MIPPED); cir.setReturnValue(ChunkRenderOverrider.AxiomChunkOverrideLayer.CUTOUT_MIPPED);
} }
} }
@@ -1,13 +1,13 @@
package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium; package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium;
import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt;
import io.github.slimeistdev.crystalline_sky.compat.Mods; import io.github.slimeistdev.crystalline_sky.compat.Mods;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.Material;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.parameters.AlphaCutoffParameter;
import net.minecraft.client.render.BlockRenderLayer; import net.minecraft.client.render.RenderLayer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -23,16 +23,16 @@ public class DefaultMaterialsMixin {
@SuppressWarnings("OptionalGetWithoutIsPresent") @SuppressWarnings("OptionalGetWithoutIsPresent")
private static final Material crystalline_sky$SKY = new Material( private static final Material crystalline_sky$SKY = new Material(
Arrays.stream(DefaultTerrainRenderPasses.ALL) Arrays.stream(DefaultTerrainRenderPasses.ALL)
.filter(pass -> ((TerrainRenderPassAccessor) pass).crystalline_sky$getRenderLayer() == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) .filter(pass -> ((TerrainRenderPassAccessor) pass).crystalline_sky$getRenderLayer() == CrystallineRenderLayers.SKY)
.findFirst() .findFirst()
.get(), .get(),
AlphaCutoffParameter.ZERO, AlphaCutoffParameter.ZERO,
false false
); );
@Inject(method = "forChunkLayer", at = @At(value = "NEW", target = "(Ljava/lang/String;Ljava/lang/Throwable;)Ljava/lang/MatchException;"), cancellable = true) @Inject(method = "forRenderLayer", at = @At(value = "NEW", target = "(Ljava/lang/String;)Ljava/lang/IllegalArgumentException;"), cancellable = true)
private static void addCrystallineSkyMaterial(BlockRenderLayer layer, CallbackInfoReturnable<Material> cir) { private static void addCrystallineSkyMaterial(RenderLayer layer, CallbackInfoReturnable<Material> cir) {
if (layer == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) { if (layer == CrystallineRenderLayers.SKY) {
cir.setReturnValue(crystalline_sky$SKY); cir.setReturnValue(crystalline_sky$SKY);
} }
} }
@@ -1,8 +1,8 @@
package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium; package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium;
import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt;
import io.github.slimeistdev.crystalline_sky.compat.Mods; import io.github.slimeistdev.crystalline_sky.compat.Mods;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.DefaultTerrainRenderPasses;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
@@ -25,7 +25,7 @@ public class DefaultTerrainRenderPassesMixin {
private static void addCrystallineSkyPass(CallbackInfo ci) { private static void addCrystallineSkyPass(CallbackInfo ci) {
var ALL$ = new TerrainRenderPass[ALL.length + 1]; var ALL$ = new TerrainRenderPass[ALL.length + 1];
System.arraycopy(ALL, 0, ALL$, 0, ALL.length); System.arraycopy(ALL, 0, ALL$, 0, ALL.length);
ALL$[ALL.length] = new TerrainRenderPass(BlockRenderLayerExt.CRYSTALLINE_SKY_SKY, false, true); ALL$[ALL.length] = new TerrainRenderPass(CrystallineRenderLayers.SKY, false, true);
ALL = ALL$; ALL = ALL$;
} }
} }
@@ -5,7 +5,7 @@ import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin;
import io.github.slimeistdev.crystalline_sky.compat.Mods; import io.github.slimeistdev.crystalline_sky.compat.Mods;
import io.github.slimeistdev.crystalline_sky.compat.sodium.SkyShaderInterface; import io.github.slimeistdev.crystalline_sky.compat.sodium.SkyShaderInterface;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt; import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.caffeinemc.mods.sodium.client.gl.shader.GlProgram; import net.caffeinemc.mods.sodium.client.gl.shader.GlProgram;
import net.caffeinemc.mods.sodium.client.render.chunk.ShaderChunkRenderer; import net.caffeinemc.mods.sodium.client.render.chunk.ShaderChunkRenderer;
import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderInterface; import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderInterface;
@@ -23,7 +23,7 @@ import java.util.function.Function;
public class ShaderChunkRendererMixin { public class ShaderChunkRendererMixin {
@WrapOperation(method = "compileProgram", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/ShaderChunkRenderer;createShader(Ljava/lang/String;Lnet/caffeinemc/mods/sodium/client/render/chunk/shader/ChunkShaderOptions;)Lnet/caffeinemc/mods/sodium/client/gl/shader/GlProgram;"), remap = false) @WrapOperation(method = "compileProgram", at = @At(value = "INVOKE", target = "Lnet/caffeinemc/mods/sodium/client/render/chunk/ShaderChunkRenderer;createShader(Ljava/lang/String;Lnet/caffeinemc/mods/sodium/client/render/chunk/shader/ChunkShaderOptions;)Lnet/caffeinemc/mods/sodium/client/gl/shader/GlProgram;"), remap = false)
private GlProgram<ChunkShaderInterface> createSkyShader(ShaderChunkRenderer instance, String path, ChunkShaderOptions options, Operation<GlProgram<ChunkShaderInterface>> original) { private GlProgram<ChunkShaderInterface> createSkyShader(ShaderChunkRenderer instance, String path, ChunkShaderOptions options, Operation<GlProgram<ChunkShaderInterface>> original) {
if (options.pass() == DefaultMaterials.forChunkLayer(BlockRenderLayerExt.CRYSTALLINE_SKY_SKY).pass) { if (options.pass() == DefaultMaterials.forRenderLayer(CrystallineRenderLayers.SKY).pass) {
return original.call(instance, "sodium_compat/block_layer_sky", options); return original.call(instance, "sodium_compat/block_layer_sky", options);
} }
@@ -1,14 +1,13 @@
package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium; package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium;
import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerGroupExt;
import io.github.slimeistdev.crystalline_sky.compat.Mods; import io.github.slimeistdev.crystalline_sky.compat.Mods;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer; import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer;
import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices; import net.caffeinemc.mods.sodium.client.render.chunk.ChunkRenderMatrices;
import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionManager; import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionManager;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.material.DefaultMaterials;
import net.minecraft.client.render.BlockRenderLayerGroup; import net.minecraft.client.render.RenderLayer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -22,9 +21,9 @@ public class SodiumWorldRendererMixin {
private RenderSectionManager renderSectionManager; private RenderSectionManager renderSectionManager;
@Inject(method = "drawChunkLayer", at = @At("RETURN")) @Inject(method = "drawChunkLayer", at = @At("RETURN"))
private void drawCrystallineLayer(BlockRenderLayerGroup group, ChunkRenderMatrices matrices, double x, double y, double z, CallbackInfo ci) { private void drawCrystallineLayer(RenderLayer renderLayer, ChunkRenderMatrices matrices, double x, double y, double z, CallbackInfo ci) {
if (group != BlockRenderLayerGroupExt.CRYSTALLINE_SKY_SKY) return; if (renderLayer != CrystallineRenderLayers.SKY) return;
renderSectionManager.renderLayer(matrices, DefaultMaterials.forChunkLayer(BlockRenderLayerExt.CRYSTALLINE_SKY_SKY).pass, x, y, z); renderSectionManager.renderLayer(matrices, DefaultMaterials.forRenderLayer(CrystallineRenderLayers.SKY).pass, x, y, z);
} }
} }
@@ -3,7 +3,7 @@ package io.github.slimeistdev.crystalline_sky.mixin.client.compat.sodium;
import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin; import io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin;
import io.github.slimeistdev.crystalline_sky.compat.Mods; import io.github.slimeistdev.crystalline_sky.compat.Mods;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass; import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass;
import net.minecraft.client.render.BlockRenderLayer; import net.minecraft.client.render.RenderLayer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Accessor;
@@ -11,5 +11,5 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(TerrainRenderPass.class) @Mixin(TerrainRenderPass.class)
public interface TerrainRenderPassAccessor { public interface TerrainRenderPassAccessor {
@Accessor("renderType") @Accessor("renderType")
BlockRenderLayer crystalline_sky$getRenderLayer(); RenderLayer crystalline_sky$getRenderLayer();
} }
@@ -1,13 +0,0 @@
package io.github.slimeistdev.crystalline_sky.mixin_ducks.client;
import io.github.slimeistdev.crystalline_sky.CrystallineSky;
import net.minecraft.client.gl.Framebuffer;
import net.minecraft.client.util.Handle;
import net.minecraft.util.Identifier;
public interface DefaultFramebufferSet_Duck {
Identifier crystalline_sky$SKY_FRAMEBUFFER = CrystallineSky.id("sky");
Handle<Framebuffer> crystalline_sky$getSkyFramebuffer();
void crystalline_sky$setSkyFramebuffer(Handle<Framebuffer> framebuffer);
}
@@ -0,0 +1,7 @@
package io.github.slimeistdev.crystalline_sky.mixin_ducks.client;
import net.minecraft.client.gl.Framebuffer;
public interface WorldRenderer_Duck {
Framebuffer crystalline_sky$getSkyFramebuffer();
}
@@ -54,7 +54,7 @@ public class CrystallineBlocks {
private static <T extends Block> T register(String id, Function<Settings, T> factory, Settings settings) { private static <T extends Block> T register(String id, Function<Settings, T> factory, Settings settings) {
RegistryKey<Block> key = CrystallineSky.key(RegistryKeys.BLOCK, id); RegistryKey<Block> key = CrystallineSky.key(RegistryKeys.BLOCK, id);
return Registry.register(Registries.BLOCK, key, factory.apply(settings.registryKey(key))); return Registry.register(Registries.BLOCK, key, factory.apply(settings));
} }
public static boolean isCrystallineSky(BlockState state) { public static boolean isCrystallineSky(BlockState state) {
@@ -2,6 +2,7 @@ package io.github.slimeistdev.crystalline_sky.registry;
import io.github.slimeistdev.crystalline_sky.CrystallineSky; import io.github.slimeistdev.crystalline_sky.CrystallineSky;
import net.minecraft.component.ComponentType; import net.minecraft.component.ComponentType;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.registry.Registries; import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry; import net.minecraft.registry.Registry;
import net.minecraft.util.Unit; import net.minecraft.util.Unit;
@@ -12,7 +13,7 @@ public class CrystallineDataComponentTypes {
public static final ComponentType<Unit> WEEPING_SKY_DEBUG_COLUMN_TOOL = register( public static final ComponentType<Unit> WEEPING_SKY_DEBUG_COLUMN_TOOL = register(
"weeping_sky_debug_column_tool", "weeping_sky_debug_column_tool",
b -> b b -> b
.packetCodec(Unit.PACKET_CODEC) .packetCodec(PacketCodec.unit(Unit.INSTANCE))
.codec(Unit.CODEC) .codec(Unit.CODEC)
); );
@@ -3,14 +3,20 @@ package io.github.slimeistdev.crystalline_sky.registry;
import io.github.slimeistdev.crystalline_sky.content.blocks.SkyLightBlock; import io.github.slimeistdev.crystalline_sky.content.blocks.SkyLightBlock;
import io.github.slimeistdev.crystalline_sky.content.items.WeepingSkyBlockItem; import io.github.slimeistdev.crystalline_sky.content.items.WeepingSkyBlockItem;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.block.Block;
import net.minecraft.block.LightBlock; import net.minecraft.block.LightBlock;
import net.minecraft.component.DataComponentTypes; import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.BlockStateComponent; import net.minecraft.component.type.BlockStateComponent;
import net.minecraft.item.*; import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroups;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Rarity; import net.minecraft.util.Rarity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.BiFunction;
public class CrystallineItems { public class CrystallineItems {
public static final Item SKY = Items.register( public static final Item SKY = Items.register(
@@ -18,7 +24,7 @@ public class CrystallineItems {
settings -> settings.rarity(Rarity.EPIC) settings -> settings.rarity(Rarity.EPIC)
); );
public static final Item WEEPING_SKY = Items.register( public static final Item WEEPING_SKY = register(
CrystallineBlocks.WEEPING_SKY, CrystallineBlocks.WEEPING_SKY,
(block, settings) -> new WeepingSkyBlockItem(block, settings.rarity(Rarity.EPIC)) (block, settings) -> new WeepingSkyBlockItem(block, settings.rarity(Rarity.EPIC))
); );
@@ -34,6 +40,11 @@ public class CrystallineItems {
settings -> settings.rarity(Rarity.EPIC) settings -> settings.rarity(Rarity.EPIC)
); );
@SuppressWarnings("SameParameterValue")
private static Item register(Block block, BiFunction<Block, Item.Settings, BlockItem> factory) {
return Items.register(factory.apply(block, new Item.Settings()));
}
public static void init() { public static void init() {
ItemGroupEvents.modifyEntriesEvent(ItemGroups.OPERATOR).register(entries -> { ItemGroupEvents.modifyEntriesEvent(ItemGroups.OPERATOR).register(entries -> {
if (!entries.getContext().hasPermissions()) return; if (!entries.getContext().hasPermissions()) return;
@@ -0,0 +1,44 @@
package io.github.slimeistdev.crystalline_sky.registry.client;
import com.mojang.blaze3d.systems.RenderSystem;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.WorldRenderer_Duck;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderPhase;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import static net.minecraft.client.render.RenderLayer.of;
import static net.minecraft.client.render.RenderPhase.ENABLE_LIGHTMAP;
@Environment(EnvType.CLIENT)
public class CrystallineRenderLayers {
private static final RenderPhase.TextureBase SKY_TEXTURE = new SkyBufferTexture();
private static final RenderPhase.ShaderProgram SKY_PROGRAM = new RenderPhase.ShaderProgram(CrystallineShaderPrograms::getRenderTypeSkyProgram);
public static final RenderLayer SKY = of(
"crystalline_sky_sky",
VertexFormats.POSITION_COLOR_TEXTURE_LIGHT_NORMAL,
VertexFormat.DrawMode.QUADS,
4194304,
true,
false,
RenderLayer.MultiPhaseParameters.builder()
.lightmap(ENABLE_LIGHTMAP)
.program(SKY_PROGRAM)
.texture(SKY_TEXTURE)
.build(true)
);
private static class SkyBufferTexture extends RenderPhase.TextureBase {
public SkyBufferTexture() {
super(() -> {
MinecraftClient mc = MinecraftClient.getInstance();
var fb = ((WorldRenderer_Duck) mc.worldRenderer).crystalline_sky$getSkyFramebuffer();
RenderSystem.setShaderTexture(0, fb.getColorAttachment());
}, () -> {});
}
}
}
@@ -1,19 +0,0 @@
package io.github.slimeistdev.crystalline_sky.registry.client;
import com.mojang.blaze3d.pipeline.RenderPipeline;
import io.github.slimeistdev.crystalline_sky.CrystallineSky;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gl.RenderPipelines;
@Environment(EnvType.CLIENT)
public class CrystallineRenderPipelines {
public static final RenderPipeline SKY_PIPELINE = RenderPipelines.register(
RenderPipeline.builder(RenderPipelines.TERRAIN_SNIPPET)
.withFragmentShader(CrystallineSky.id("core/terrain_sky"))
.withVertexShader(CrystallineSky.id("core/terrain_sky"))
.withLocation(CrystallineSky.id("pipeline/sky"))
.withShaderDefine("BAYER_BIAS", 0.03125f)
.build()
);
}
@@ -0,0 +1,14 @@
package io.github.slimeistdev.crystalline_sky.registry.client;
import net.minecraft.client.gl.ShaderProgram;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
public class CrystallineShaderPrograms {
@ApiStatus.Internal
public static @Nullable ShaderProgram renderTypeSkyProgram;
public static @Nullable ShaderProgram getRenderTypeSkyProgram() {
return renderTypeSkyProgram;
}
}
@@ -15,13 +15,12 @@
"SkyLightStorageAccessor" "SkyLightStorageAccessor"
], ],
"client": [ "client": [
"client.BlockRenderLayerMixin",
"client.ClientWorldMixin", "client.ClientWorldMixin",
"client.DebugRendererMixin", "client.DebugRendererMixin",
"client.DefaultFramebufferSetMixin",
"client.FramebufferMixin", "client.FramebufferMixin",
"client.GameRendererMixin",
"client.RenderLayerMixin",
"client.WorldRenderer_NoSodium_Mixin", "client.WorldRenderer_NoSodium_Mixin",
"client.WorldRendererAccessor",
"client.WorldRendererMixin", "client.WorldRendererMixin",
"client.compat.axiom.ChunkRenderOverrider_AxiomChunkOverrideLayerMixin", "client.compat.axiom.ChunkRenderOverrider_AxiomChunkOverrideLayerMixin",
"client.compat.sodium.DefaultMaterialsMixin", "client.compat.sodium.DefaultMaterialsMixin",
-3
View File
@@ -36,9 +36,6 @@
], ],
"fabric-datagen": [ "fabric-datagen": [
"io.github.slimeistdev.crystalline_sky.datagen.CrystallineSkyDataGenerator" "io.github.slimeistdev.crystalline_sky.datagen.CrystallineSkyDataGenerator"
],
"mm:early_risers": [
"io.github.slimeistdev.crystalline_sky.extenders_cove.CrystallineSkyEarlyRiser"
] ]
} }
} }