Skybox II

better fabric model loading, clean up shaders
This commit is contained in:
techno-sam
2026-04-25 13:27:28 +02:00
parent bad5f29b4e
commit e130a9d47c
15 changed files with 160 additions and 57 deletions
@@ -2,7 +2,7 @@ package io.github.slimeistdev.crystalline_sky.fabric;
import io.github.slimeistdev.crystalline_sky.CrystallineSkyClient;
import io.github.slimeistdev.crystalline_sky.fabric.events.RegisterMaterialAtlasesEvent;
import io.github.slimeistdev.crystalline_sky.fabric.render_tmp.SkyboxModelLoadingPlugin;
import io.github.slimeistdev.crystalline_sky.fabric.skybox_model.SkyboxModelLoadingPlugin;
import io.github.slimeistdev.crystalline_sky.multiloader.fabric.ItemGroupRegistrationEventImpl;
import io.github.slimeistdev.crystalline_sky.registry.CrystallineBlocks;
import io.github.slimeistdev.crystalline_sky.registry.client.CrystallineAtlases;
@@ -16,8 +16,10 @@ import net.minecraft.data.models.blockstates.PropertyDispatch;
import net.minecraft.data.models.blockstates.Variant;
import net.minecraft.data.models.blockstates.VariantProperties;
import net.minecraft.data.models.model.ModelLocationUtils;
import net.minecraft.data.models.model.ModelTemplate;
import net.minecraft.data.models.model.ModelTemplates;
import net.minecraft.data.models.model.TextureMapping;
import net.minecraft.data.models.model.TextureSlot;
import net.minecraft.data.models.model.TexturedModel;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
@@ -25,7 +27,9 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import java.util.Locale;
import java.util.Optional;
import static net.minecraft.data.models.model.TextureMapping.getBlockTexture;
import static net.minecraft.data.models.model.TexturedModel.createDefault;
@SuppressWarnings("SameParameterValue")
@@ -35,9 +39,16 @@ public class CrystallineSkyModelProvider extends FabricModelProvider {
return resourceLocation.withPrefix("crystalline_sky_skybox/");
}
private static ModelTemplate create(String blockModelLocation, TextureSlot... requiredSlots) {
return new ModelTemplate(Optional.of(ResourceLocation.withDefaultNamespace("block/" + blockModelLocation)), Optional.empty(), requiredSlots);
}
private static final ModelTemplate CUBE_ALL_PARTICLE = create("cube_all", TextureSlot.ALL, TextureSlot.PARTICLE);
private static final TexturedModel.Provider SKYBOX_CUBE = createDefault(
block -> TextureMapping.cube(getSkyboxBlockTexture(block)),
ModelTemplates.CUBE_ALL
block -> TextureMapping.cube(getSkyboxBlockTexture(block))
.put(TextureSlot.PARTICLE, getBlockTexture(block)),
CUBE_ALL_PARTICLE
);
public CrystallineSkyModelProvider(FabricDataOutput output) {
@@ -1,4 +1,4 @@
package io.github.slimeistdev.crystalline_sky.fabric.render_tmp;
package io.github.slimeistdev.crystalline_sky.fabric.skybox_model;
import net.fabricmc.fabric.api.renderer.v1.Renderer;
import net.fabricmc.fabric.api.renderer.v1.RendererAccess;
@@ -61,25 +61,6 @@ public class SkyboxBakedModel extends ForwardingBakedModel {
// copied from net.fabricmc.fabric.impl.renderer.VanillaModelEncoder.emitBlockQuads
@Override
public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) {
/*TextureAtlasSprite sprite = getParticleIcon();
float u0 = sprite.getU0();
float v0 = sprite.getV0();
int u1 = (int) (sprite.getU1() * 0xffff);
int v1 = (int) (sprite.getV1() * 0xffff);
int color = (u1 << 16) | v1;
var emitter = context.getEmitter()
.square(Direction.UP, 0, 0, 1, 1, 0)
.material(FULLBRIGHT_MATERIAL);
for (int i = 0; i < 4; i++) {
emitter
.color(i, color)
.lightmap(i, LightTexture.FULL_BRIGHT)
.normal(i, 0, 1, 0)
.uv(i, u0, v0);
}
emitter.emit();*/
QuadEmitter emitter = context.getEmitter();
for (int i = 0; i <= ModelHelper.NULL_FACE_ID; i++) {
@@ -93,7 +74,7 @@ public class SkyboxBakedModel extends ForwardingBakedModel {
final List<BakedQuad> quads = getQuads(state, cullFace, randomSupplier.get());
for (final BakedQuad q : quads) {
emitter.fromVanilla(q, FULL_BRIGHT_MATERIAL, cullFace); // fixme view bobbing breaks projection, use TextureMatrix to pass a view projection matrix along :)
emitter.fromVanilla(q, FULL_BRIGHT_MATERIAL, cullFace);
TextureAtlasSprite sprite = q.getSprite();
float u0 = sprite.getU0();
float v0 = sprite.getV0();
@@ -1,8 +1,7 @@
package io.github.slimeistdev.crystalline_sky.fabric.render_tmp;
package io.github.slimeistdev.crystalline_sky.fabric.skybox_model;
import io.github.slimeistdev.crystalline_sky.CrystallineSky;
import io.github.slimeistdev.crystalline_sky.mixin_ducks.client.SimpleBakedModel_Duck;
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin;
import net.minecraft.resources.ResourceLocation;
public class SkyboxModelLoadingPlugin implements ModelLoadingPlugin {
private SkyboxModelLoadingPlugin() {}
@@ -10,15 +9,10 @@ public class SkyboxModelLoadingPlugin implements ModelLoadingPlugin {
@Override
public void onInitializeModelLoader(Context pluginContext) {
pluginContext.modifyModelAfterBake().register((model, ctx) -> {
if (model == null) return null;
if (model instanceof SimpleBakedModel_Duck duck && duck.crystalline_sky$isSkybox())
return new SkyboxBakedModel(model);
ResourceLocation id = ctx.resourceId();
if (id == null) {
id = ctx.topLevelId().id();
}
if (!id.equals(CrystallineSky.id("block/skybox_test"))) return model;
return new SkyboxBakedModel(model);
return model;
});
}