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;
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.registry.CrystallineBlocks;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
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.keybinding.v1.KeyBindingHelper;
import net.fabricmc.fabric.api.client.rendering.v1.BlockRenderLayerMap;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.screen.ScreenTexts;
@@ -17,8 +17,8 @@ import org.lwjgl.glfw.GLFW;
public class CrystallineSkyClient implements ClientModInitializer {
@Override
public void onInitializeClient() {
BlockRenderLayerMap.putBlock(CrystallineBlocks.SKY, BlockRenderLayerExt.CRYSTALLINE_SKY_SKY);
BlockRenderLayerMap.putBlock(CrystallineBlocks.WEEPING_SKY, BlockRenderLayerExt.CRYSTALLINE_SKY_SKY);
BlockRenderLayerMap.INSTANCE.putBlock(CrystallineBlocks.SKY, CrystallineRenderLayers.SKY);
BlockRenderLayerMap.INSTANCE.putBlock(CrystallineBlocks.WEEPING_SKY, CrystallineRenderLayers.SKY);
var weepingSkyKeybind = KeyBindingHelper.registerKeyBinding(new KeyBinding(
"crystalline_sky.key.toggle_weeping_sky_debug",
@@ -1,17 +1,18 @@
package io.github.slimeistdev.crystalline_sky.compat.sodium;
import com.mojang.blaze3d.opengl.GlStateManager;
import com.mojang.blaze3d.textures.GpuTextureView;
import com.mojang.blaze3d.platform.GlStateManager;
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.GlUniformFloat4v;
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.render.chunk.shader.*;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass;
import net.caffeinemc.mods.sodium.client.util.FogParameters;
import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderFogComponent;
import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderInterface;
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.texture.GlTexture;
import net.minecraft.util.math.MathHelper;
import org.joml.Matrix4fc;
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
private final ChunkShaderFogComponent fogShader;
private final float[] colorModulator = new float[] {1.0f, 1.0f, 1.0f, 1.0f};
public SkyShaderInterface(ShaderBindingContext context, ChunkShaderOptions options) {
this.uniformModelViewMatrix = context.bindUniform("u_ModelViewMatrix", 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);
}
@Override // the shader interface should not modify pipeline state
public void setupState(TerrainRenderPass pass, FogParameters parameters) {
this.bindTexture(ChunkShaderTextureSlot.BLOCK, pass.getAtlas());
@Override
public void setupState() {
this.bindTexture(ChunkShaderTextureSlot.BLOCK, TextureUtil.getBlockTextureId());
MinecraftClient client = MinecraftClient.getInstance();
if (client.world != null
@@ -55,17 +58,18 @@ public class SkyShaderInterface implements ChunkShaderInterface {
|| client.player.getMainHandStack().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;
// remap alpha from [0, 1] to [0, 0.75]
float maxAlpha = 1.0f - 0.25f;
alpha = alpha * maxAlpha;
this.uniformColorModulator.set(1.0f, 1.0f, 1.0f, alpha);
colorModulator[3] = alpha;
} 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
@@ -73,16 +77,14 @@ public class SkyShaderInterface implements ChunkShaderInterface {
// This is used by alternate implementations.
}
@Deprecated(forRemoval = true) // should be handled properly in GFX instead.
private void bindTexture(ChunkShaderTextureSlot slot, GpuTextureView textureView) {
GlTexture tex = (GlTexture) textureView.texture();
/** @deprecated */
@Deprecated(
forRemoval = true
)
private void bindTexture(ChunkShaderTextureSlot slot, int textureId) {
GlStateManager._activeTexture(GL32C.GL_TEXTURE0 + slot.ordinal());
GlStateManager._bindTexture(tex.getGlId());
GlStateManager._texParameter(GL32C.GL_TEXTURE_2D, 33084, textureView.baseMipLevel());
GlStateManager._texParameter(GL32C.GL_TEXTURE_2D, 33085, textureView.baseMipLevel() + textureView.mipLevels() - 1);
tex.checkDirty(GL32C.GL_TEXTURE_2D);
var uniform = this.uniformTextures.get(slot);
GlStateManager._bindTexture(textureId);
GlUniformInt uniform = this.uniformTextures.get(slot);
uniform.setInt(slot.ordinal());
}
@@ -1,7 +1,11 @@
package io.github.slimeistdev.crystalline_sky.content.blocks;
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.Fluids;
import net.minecraft.state.StateManager;
@@ -9,12 +13,10 @@ import net.minecraft.state.property.BooleanProperty;
import net.minecraft.state.property.Properties;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.random.Random;
import net.minecraft.util.shape.VoxelShape;
import net.minecraft.util.shape.VoxelShapes;
import net.minecraft.world.BlockView;
import net.minecraft.world.WorldView;
import net.minecraft.world.tick.ScheduledTickView;
import net.minecraft.world.WorldAccess;
public class WeepingSkyLightBlock extends Block implements Waterloggable {
public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED;
@@ -35,7 +37,7 @@ public class WeepingSkyLightBlock extends Block implements Waterloggable {
}
@Override
protected boolean isTransparent(BlockState state) {
protected boolean isTransparent(BlockState state, BlockView world, BlockPos pos) {
return state.getFluidState().isEmpty();
}
@@ -52,19 +54,17 @@ public class WeepingSkyLightBlock extends Block implements Waterloggable {
@Override
protected BlockState getStateForNeighborUpdate(
BlockState state,
WorldView world,
ScheduledTickView tickView,
BlockPos pos,
Direction direction,
BlockPos neighborPos,
BlockState neighborState,
Random random
WorldAccess world,
BlockPos pos,
BlockPos neighborPos
) {
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
@@ -8,6 +8,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsageContext;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.ColumnPos;
import net.minecraft.world.World;
@@ -32,13 +33,13 @@ public class WeepingSkyBlockItem extends BlockItem {
}
@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);
if (stack.get(CrystallineDataComponentTypes.WEEPING_SKY_DEBUG_COLUMN_TOOL) != null) {
if (world.isClient) {
WeepingSkyBlockItemClient.setSelectedColumn(null);
}
return ActionResult.SUCCESS;
return TypedActionResult.success(stack);
}
return super.use(world, user, hand);
@@ -18,13 +18,13 @@ public class CrystallineSkyBlockTagProvider extends FabricTagProvider.BlockTagPr
@Override
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_LIGHT)
.add(CrystallineBlocks.WEEPING_SKY)
.add(CrystallineBlocks.WEEPING_SKY_LIGHT);
valueLookupBuilder(BlockTags.CRYSTAL_SOUND_BLOCKS)
getOrCreateTagBuilder(BlockTags.CRYSTAL_SOUND_BLOCKS)
.add(CrystallineBlocks.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.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.provider.FabricModelProvider;
import net.minecraft.block.Block;
import net.minecraft.block.LightBlock;
import net.minecraft.client.data.*;
import net.minecraft.client.render.item.model.ItemModel;
import net.minecraft.client.render.model.json.WeightedVariant;
import net.minecraft.data.client.BlockStateModelGenerator;
import net.minecraft.data.client.BlockStateVariant;
import net.minecraft.data.client.BlockStateVariantMap;
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.state.property.Properties;
import net.minecraft.util.Identifier;
import java.util.HashMap;
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")
public class CrystallineSkyModelProvider extends FabricModelProvider {
@@ -41,26 +44,25 @@ public class CrystallineSkyModelProvider extends FabricModelProvider {
}
private void registerSkyLightBlock(BlockStateModelGenerator gen, Block block, Item item) {
ItemModel.Unbaked fallback = ItemModels.basic(gen.uploadItemModel(item));
Map<Integer, ItemModel.Unbaked> itemModels = new HashMap<>(16);
BlockStateVariantMap.SingleProperty<WeightedVariant, Integer> levelProp = BlockStateVariantMap.models(Properties.LEVEL_15);
BlockStateVariantMap.SingleProperty<Integer> singleProperty = BlockStateVariantMap.create(Properties.LEVEL_15);
for (int level = 0; level <= 15; level++) {
String suffix = String.format(Locale.ROOT, "_%02d", level);
Identifier texture = TextureMap.getSubId(item, suffix);
levelProp.register(level, createWeightedVariant(Models.PARTICLE.upload(block, suffix, TextureMap.particle(texture), gen.modelCollector)));
ItemModel.Unbaked levelItemModel = ItemModels.basic(Models.GENERATED.upload(
singleProperty.register(level, BlockStateVariant.create().put(
VariantSettings.MODEL,
Models.PARTICLE.upload(block, suffix, TextureMap.particle(texture), gen.modelCollector))
);
Models.GENERATED.upload(
ModelIds.getItemSubModelId(item, suffix),
TextureMap.layer0(texture),
gen.modelCollector
));
itemModels.put(level, levelItemModel);
);
}
gen.itemModelOutput.accept(item, ItemModels.select(LightBlock.LEVEL_15, fallback, itemModels));
gen.blockStateCollector.accept(VariantsBlockModelDefinitionCreator.of(block).with(levelProp));
// TODO generate root-level item model itself
gen.blockStateCollector.accept(VariantsBlockStateSupplier.create(block).coordinate(singleProperty));
}
@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) {
BlockState bottomState = blockView.getBlockState(bottomPos);
if (faceBlocksLight(topState, bottomState)) {
if (faceBlocksLight(blockView, topState, bottomState, topPos, bottomPos)) {
return transformOutputY(bottomPos.getY());
}
@@ -85,7 +85,7 @@ public class MutableWeepingScanner implements WeepingStorage.WeepingScanner {
return transformOutputY(bottomPos.getY());
}
if (faceBlocksLight(topState, bottomState)) {
if (faceBlocksLight(blockView, topState, bottomState, topPos, bottomPos)) {
return -1;
}
@@ -107,15 +107,15 @@ public class MutableWeepingScanner implements WeepingStorage.WeepingScanner {
BlockState upper = blockView.getBlockState(reusablePos1);
BlockState lower = blockView.getBlockState(reusablePos2);
return faceBlocksLight(upper, lower);
return faceBlocksLight(blockView, upper, lower, reusablePos1, reusablePos2);
}
private static boolean faceBlocksLight(BlockState upper, BlockState lower) {
if (lower.getOpacity() != 0) {
private static boolean faceBlocksLight(BlockView world, BlockState upper, BlockState lower, BlockPos upperPos, BlockPos lowerPos) {
if (lower.getOpacity(world, lowerPos) != 0) {
return true;
} else {
VoxelShape voxelShape = ChunkLightProvider.getOpaqueShape(upper, Direction.DOWN);
VoxelShape voxelShape2 = ChunkLightProvider.getOpaqueShape(lower, Direction.UP);
VoxelShape voxelShape = ChunkLightProvider.getOpaqueShape(world, upperPos, upper, Direction.DOWN);
VoxelShape voxelShape2 = ChunkLightProvider.getOpaqueShape(world, lowerPos, lower, Direction.UP);
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.mixin_ducks.client.DebugRenderer_Duck;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.Frustum;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.debug.DebugRenderer;
import net.minecraft.client.util.math.MatrixStack;
@@ -42,7 +41,7 @@ public class DebugRendererMixin implements DebugRenderer_Duck {
}
@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) {
crystalline_sky$weepingSkyDebugRenderer.setLitMode(crystalline_sky$weepingSkyMode == 1);
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;
import com.mojang.blaze3d.platform.GlConst;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.textures.GpuTexture;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.Framebuffer_Duck;
import net.minecraft.client.gl.Framebuffer;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@Mixin(Framebuffer.class)
public class FramebufferMixin implements Framebuffer_Duck {
@Shadow
@Nullable
protected GpuTexture colorAttachment;
protected int colorAttachment;
@Shadow
public int textureWidth;
@@ -20,17 +19,25 @@ public class FramebufferMixin implements Framebuffer_Duck {
@Shadow
public int textureHeight;
@Shadow
public int fbo;
@Override
public void crystalline_sky$copyColorFrom(Framebuffer framebuffer) {
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");
} 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");
} else {
RenderSystem.getDevice()
.createCommandEncoder()
.copyTextureToTexture(framebuffer.getColorAttachment(), this.colorAttachment, 0, 0, 0, 0, 0, this.textureWidth, this.textureHeight);
GlStateManager._glBindFramebuffer(GlConst.GL_READ_FRAMEBUFFER, framebuffer.fbo);
GlStateManager._glBindFramebuffer(GlConst.GL_DRAW_FRAMEBUFFER, this.fbo);
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;
import com.llamalad7.mixinextras.sugar.Local;
import com.mojang.blaze3d.buffers.GpuBufferSlice;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerGroupExt;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.DefaultFramebufferSet_Duck;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
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.gl.Framebuffer;
import net.minecraft.client.gl.SimpleFramebufferFactory;
import net.minecraft.client.option.CloudRenderMode;
import net.minecraft.client.render.*;
import net.minecraft.client.util.Handle;
import net.minecraft.client.util.ObjectAllocator;
import net.minecraft.client.gl.SimpleFramebuffer;
import net.minecraft.client.render.Camera;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.render.LightmapTextureManager;
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.util.profiler.Profiler;
import org.jetbrains.annotations.Nullable;
import org.joml.Matrix4f;
import org.joml.Vector4f;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
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.callback.CallbackInfo;
import java.util.Optional;
@Mixin(WorldRenderer.class)
public abstract class WorldRendererMixin {
@Shadow
@Final
private DefaultFramebufferSet framebufferSet;
public abstract class WorldRendererMixin implements WorldRenderer_Duck {
@Shadow
@Final
private MinecraftClient client;
@@ -43,33 +37,73 @@ public abstract class WorldRendererMixin {
@Shadow
private int ticks;
@Shadow
@Final
private CloudRenderer cloudRenderer;
@Shadow
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;"))
private void setupSkyBuffer(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline,
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);
}
@Shadow
protected abstract void renderLayer(RenderLayer renderLayer, double x, double y, double z, Matrix4f matrix4f, Matrix4f positionMatrix);
@Unique
private Handle<Framebuffer> crystalline_sky$transferSkyBuffer(FramePass pass) {
Handle<Framebuffer> skyFramebuffer = pass.transfer(
((DefaultFramebufferSet_Duck) framebufferSet).crystalline_sky$getSkyFramebuffer());
((DefaultFramebufferSet_Duck) framebufferSet).crystalline_sky$setSkyFramebuffer(skyFramebuffer);
return skyFramebuffer;
@Nullable
private Framebuffer crystalline_sky$skyBuffer;// = new SimpleFramebuffer(0, 0, false, MinecraftClient.IS_SYSTEM_MAC);
@Override
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"))
private void copyAfterSky(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline,
@Inject(
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,
Vector4f fogColor, boolean shouldRenderSky, CallbackInfo ci,
@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))
private void transferCrystallineSky(FrameGraphBuilder frameGraphBuilder, Frustum frustum, Camera camera,
Matrix4f positionMatrix, GpuBufferSlice fog, boolean renderBlockOutline,
boolean renderEntityOutline, RenderTickCounter tickCounter, Profiler profiler,
CallbackInfo ci, @Local FramePass framePass) {
crystalline_sky$transferSkyBuffer(framePass);
}
// renderMain : framePass.setRenderer(@{() -> ...});
@Inject(
method = "method_62214",
// after solid, cutoutMipped, and cutout
@WrapOperation(
method = "render",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/render/SectionRenderState;renderSection(Lnet/minecraft/client/render/BlockRenderLayerGroup;)V",
ordinal = 0,
shift = At.Shift.AFTER
target = "Lnet/minecraft/client/render/WorldRenderer;renderLayer(Lnet/minecraft/client/render/RenderLayer;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V",
ordinal = 2
)
)
private void renderCrystallineSky(GpuBufferSlice fog, RenderTickCounter tickCounter, Camera camera,
Profiler profiler, Matrix4f positionMatrix, Handle<Framebuffer> itemEntityFramebuffer,
Handle<Framebuffer> entityOutlineFramebuffer, boolean renderBlockOutline, Frustum frustum,
Handle<Framebuffer> translucentFramebuffer, Handle<Framebuffer> mainFramebuffer, CallbackInfo ci,
@Local SectionRenderState sectionRenderState) {
sectionRenderState.renderSection(BlockRenderLayerGroupExt.CRYSTALLINE_SKY_SKY);
private void renderCrystallineSky(WorldRenderer instance, RenderLayer renderLayer, double x, double y, double z,
Matrix4f matrix4f, Matrix4f positionMatrix, Operation<Void> original) {
original.call(instance, renderLayer, x, y, z, matrix4f, positionMatrix);
renderLayer(CrystallineRenderLayers.SKY, x, y, z, matrix4f, positionMatrix);
}
}
@@ -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.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.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.client.CrystallineRenderLayers;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.DynamicUniforms;
import net.minecraft.client.render.BlockRenderLayer;
import net.minecraft.client.gl.ShaderProgram;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.util.Window;
import net.minecraft.util.math.MathHelper;
import org.joml.Matrix4fc;
import org.joml.Vector3fc;
import org.joml.Vector4f;
import org.joml.Vector4fc;
import org.joml.Matrix4f;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@@ -31,26 +30,29 @@ public class WorldRenderer_NoSodium_Mixin {
@Shadow
private int ticks;
@WrapOperation(method = "renderBlockLayers", at = @At(value = "NEW", target = "net/minecraft/client/gl/DynamicUniforms$UniformValue"))
private DynamicUniforms.UniformValue tintSkyBlocks(Matrix4fc modelView, Vector4fc colorModulator,
Vector3fc modelOffset, Matrix4fc textureMatrix, float lineWidth,
Operation<DynamicUniforms.UniformValue> original,
@Local BlockRenderLayer blockRenderLayer) {
if (blockRenderLayer == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY
@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 void tintSkyBlocks(ShaderProgram instance, VertexFormat.DrawMode drawMode, Matrix4f viewMatrix,
Matrix4f projectionMatrix, Window window, Operation<Void> original,
RenderLayer renderLayer) {
original.call(instance, drawMode, viewMatrix, projectionMatrix, window);
if (renderLayer == CrystallineRenderLayers.SKY
&& instance.colorModulator != null
&& client.player != null
&& (client.player.getMainHandStack().isOf(CrystallineItems.SKY)
|| client.player.getOffHandStack().isOf(CrystallineItems.SKY)
|| client.player.getMainHandStack().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;
// remap alpha from [0, 1] to [0, 0.75]
float maxAlpha = 1.0f - 0.25f;
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 io.github.slimeistdev.crystalline_sky.annotation.mixin.ConditionalMixin;
import io.github.slimeistdev.crystalline_sky.compat.Mods;
import io.github.slimeistdev.crystalline_sky.extenders_cove.BlockRenderLayerExt;
import net.minecraft.client.render.BlockRenderLayer;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineRenderLayers;
import net.minecraft.client.render.RenderLayer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -13,9 +13,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@ConditionalMixin(mods = Mods.AXIOM)
@Mixin(ChunkRenderOverrider.AxiomChunkOverrideLayer.class)
public class ChunkRenderOverrider_AxiomChunkOverrideLayerMixin {
@Inject(method = "fromVanilla", at = @At(value = "NEW", target = "()Ljava/lang/IncompatibleClassChangeError;"), cancellable = true)
private static void unexplodeSky(BlockRenderLayer layer, CallbackInfoReturnable<ChunkRenderOverrider.AxiomChunkOverrideLayer> cir) {
if (layer == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) {
@Inject(method = "fromVanilla", at = @At("HEAD"), cancellable = true)
private static void unexplodeSky(RenderLayer layer, CallbackInfoReturnable<ChunkRenderOverrider.AxiomChunkOverrideLayer> cir) {
if (layer == CrystallineRenderLayers.SKY) {
cir.setReturnValue(ChunkRenderOverrider.AxiomChunkOverrideLayer.CUTOUT_MIPPED);
}
}
@@ -1,13 +1,13 @@
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.extenders_cove.BlockRenderLayerExt;
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.material.DefaultMaterials;
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.minecraft.client.render.BlockRenderLayer;
import net.minecraft.client.render.RenderLayer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
@@ -23,16 +23,16 @@ public class DefaultMaterialsMixin {
@SuppressWarnings("OptionalGetWithoutIsPresent")
private static final Material crystalline_sky$SKY = new Material(
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()
.get(),
AlphaCutoffParameter.ZERO,
false
);
@Inject(method = "forChunkLayer", at = @At(value = "NEW", target = "(Ljava/lang/String;Ljava/lang/Throwable;)Ljava/lang/MatchException;"), cancellable = true)
private static void addCrystallineSkyMaterial(BlockRenderLayer layer, CallbackInfoReturnable<Material> cir) {
if (layer == BlockRenderLayerExt.CRYSTALLINE_SKY_SKY) {
@Inject(method = "forRenderLayer", at = @At(value = "NEW", target = "(Ljava/lang/String;)Ljava/lang/IllegalArgumentException;"), cancellable = true)
private static void addCrystallineSkyMaterial(RenderLayer layer, CallbackInfoReturnable<Material> cir) {
if (layer == CrystallineRenderLayers.SKY) {
cir.setReturnValue(crystalline_sky$SKY);
}
}
@@ -1,8 +1,8 @@
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.extenders_cove.BlockRenderLayerExt;
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.TerrainRenderPass;
import org.spongepowered.asm.mixin.Final;
@@ -25,7 +25,7 @@ public class DefaultTerrainRenderPassesMixin {
private static void addCrystallineSkyPass(CallbackInfo ci) {
var ALL$ = new TerrainRenderPass[ALL.length + 1];
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$;
}
}
@@ -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.compat.Mods;
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.render.chunk.ShaderChunkRenderer;
import net.caffeinemc.mods.sodium.client.render.chunk.shader.ChunkShaderInterface;
@@ -23,7 +23,7 @@ import java.util.function.Function;
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)
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);
}
@@ -1,14 +1,13 @@
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.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.registry.client.CrystallineRenderLayers;
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.RenderSectionManager;
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.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@@ -22,9 +21,9 @@ public class SodiumWorldRendererMixin {
private RenderSectionManager renderSectionManager;
@Inject(method = "drawChunkLayer", at = @At("RETURN"))
private void drawCrystallineLayer(BlockRenderLayerGroup group, ChunkRenderMatrices matrices, double x, double y, double z, CallbackInfo ci) {
if (group != BlockRenderLayerGroupExt.CRYSTALLINE_SKY_SKY) return;
private void drawCrystallineLayer(RenderLayer renderLayer, ChunkRenderMatrices matrices, double x, double y, double z, CallbackInfo ci) {
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.compat.Mods;
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.gen.Accessor;
@@ -11,5 +11,5 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(TerrainRenderPass.class)
public interface TerrainRenderPassAccessor {
@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) {
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) {
@@ -2,6 +2,7 @@ package io.github.slimeistdev.crystalline_sky.registry;
import io.github.slimeistdev.crystalline_sky.CrystallineSky;
import net.minecraft.component.ComponentType;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.util.Unit;
@@ -12,7 +13,7 @@ public class CrystallineDataComponentTypes {
public static final ComponentType<Unit> WEEPING_SKY_DEBUG_COLUMN_TOOL = register(
"weeping_sky_debug_column_tool",
b -> b
.packetCodec(Unit.PACKET_CODEC)
.packetCodec(PacketCodec.unit(Unit.INSTANCE))
.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.items.WeepingSkyBlockItem;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;
import net.minecraft.block.Block;
import net.minecraft.block.LightBlock;
import net.minecraft.component.DataComponentTypes;
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 java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
public class CrystallineItems {
public static final Item SKY = Items.register(
@@ -18,7 +24,7 @@ public class CrystallineItems {
settings -> settings.rarity(Rarity.EPIC)
);
public static final Item WEEPING_SKY = Items.register(
public static final Item WEEPING_SKY = register(
CrystallineBlocks.WEEPING_SKY,
(block, settings) -> new WeepingSkyBlockItem(block, settings.rarity(Rarity.EPIC))
);
@@ -34,6 +40,11 @@ public class CrystallineItems {
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() {
ItemGroupEvents.modifyEntriesEvent(ItemGroups.OPERATOR).register(entries -> {
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"
],
"client": [
"client.BlockRenderLayerMixin",
"client.ClientWorldMixin",
"client.DebugRendererMixin",
"client.DefaultFramebufferSetMixin",
"client.FramebufferMixin",
"client.GameRendererMixin",
"client.RenderLayerMixin",
"client.WorldRenderer_NoSodium_Mixin",
"client.WorldRendererAccessor",
"client.WorldRendererMixin",
"client.compat.axiom.ChunkRenderOverrider_AxiomChunkOverrideLayerMixin",
"client.compat.sodium.DefaultMaterialsMixin",
-3
View File
@@ -36,9 +36,6 @@
],
"fabric-datagen": [
"io.github.slimeistdev.crystalline_sky.datagen.CrystallineSkyDataGenerator"
],
"mm:early_risers": [
"io.github.slimeistdev.crystalline_sky.extenders_cove.CrystallineSkyEarlyRiser"
]
}
}