yeah a BE was the way to go

This commit is contained in:
petrak@ 2023-02-16 00:40:35 -06:00
parent 88a0234cec
commit 99e32ac84e
10 changed files with 150 additions and 84 deletions

View file

@ -1,69 +0,0 @@
package at.petrak.hexcasting;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.ItemOverrides;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class GaslightingModel implements BakedModel {
private static int GASLIGHTING_AMOUNT = 0;
private static boolean HAS_RENDERED_THIS_FRAME = false;
private final List<BakedModel> variants;
private final BakedModel wrapped;
public GaslightingModel(List<BakedModel> variants) {
this.variants = variants;
this.wrapped = this.variants.get(0);
}
@Override
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction direction, RandomSource random) {
HAS_RENDERED_THIS_FRAME = true;
var idx = Math.abs(GASLIGHTING_AMOUNT % this.variants.size());
return this.variants.get(idx).getQuads(state, direction, random);
}
public boolean useAmbientOcclusion() {
return this.wrapped.useAmbientOcclusion();
}
public boolean isGui3d() {
return this.wrapped.isGui3d();
}
public boolean usesBlockLight() {
return this.wrapped.usesBlockLight();
}
public boolean isCustomRenderer() {
return this.wrapped.isCustomRenderer();
}
public TextureAtlasSprite getParticleIcon() {
return this.wrapped.getParticleIcon();
}
public ItemTransforms getTransforms() {
return this.wrapped.getTransforms();
}
public ItemOverrides getOverrides() {
return this.wrapped.getOverrides();
}
public static void postFrameCheckRendered() {
if (!HAS_RENDERED_THIS_FRAME) {
GASLIGHTING_AMOUNT += 1;
}
HAS_RENDERED_THIS_FRAME = false;
}
}

View file

@ -1,6 +1,6 @@
package at.petrak.hexcasting.client; package at.petrak.hexcasting.client;
import at.petrak.hexcasting.GaslightingModel; import at.petrak.hexcasting.client.be.BlockEntityQuenchedAllayRenderer;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
public class ClientTickCounter { public class ClientTickCounter {
@ -19,7 +19,7 @@ public class ClientTickCounter {
if (!Minecraft.getInstance().isPaused()) { if (!Minecraft.getInstance().isPaused()) {
++ticksInGame; ++ticksInGame;
partialTicks = 0.0F; partialTicks = 0.0F;
GaslightingModel.postFrameCheckRendered(); BlockEntityQuenchedAllayRenderer.postFrameCheckRendered();
} }
} }
} }

View file

@ -1,11 +1,11 @@
package at.petrak.hexcasting.client; package at.petrak.hexcasting.client;
import at.petrak.hexcasting.GaslightingModel;
import at.petrak.hexcasting.api.item.IotaHolderItem; import at.petrak.hexcasting.api.item.IotaHolderItem;
import at.petrak.hexcasting.api.item.MediaHolderItem; import at.petrak.hexcasting.api.item.MediaHolderItem;
import at.petrak.hexcasting.api.misc.MediaConstants; import at.petrak.hexcasting.api.misc.MediaConstants;
import at.petrak.hexcasting.api.utils.NBTHelper; import at.petrak.hexcasting.api.utils.NBTHelper;
import at.petrak.hexcasting.client.be.BlockEntityAkashicBookshelfRenderer; import at.petrak.hexcasting.client.be.BlockEntityAkashicBookshelfRenderer;
import at.petrak.hexcasting.client.be.BlockEntityQuenchedAllayRenderer;
import at.petrak.hexcasting.client.be.BlockEntitySlateRenderer; import at.petrak.hexcasting.client.be.BlockEntitySlateRenderer;
import at.petrak.hexcasting.client.entity.WallScrollRenderer; import at.petrak.hexcasting.client.entity.WallScrollRenderer;
import at.petrak.hexcasting.common.blocks.BlockQuenchedAllay; import at.petrak.hexcasting.common.blocks.BlockQuenchedAllay;
@ -27,7 +27,6 @@ import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
@ -38,6 +37,7 @@ import net.minecraft.world.level.block.entity.BlockEntityType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@ -48,6 +48,8 @@ import java.util.function.ToIntFunction;
import static at.petrak.hexcasting.api.HexAPI.modLoc; import static at.petrak.hexcasting.api.HexAPI.modLoc;
public class RegisterClientStuff { public class RegisterClientStuff {
public static List<BakedModel> QUENCHED_ALLAY_VARIANTS = new ArrayList<>();
public static void init() { public static void init() {
registerSealableDataHolderOverrides(HexItems.FOCUS, registerSealableDataHolderOverrides(HexItems.FOCUS,
stack -> HexItems.FOCUS.readIotaTag(stack) != null, stack -> HexItems.FOCUS.readIotaTag(stack) != null,
@ -204,6 +206,8 @@ public class RegisterClientStuff {
registerer.registerBlockEntityRenderer(HexBlockEntities.SLATE_TILE, BlockEntitySlateRenderer::new); registerer.registerBlockEntityRenderer(HexBlockEntities.SLATE_TILE, BlockEntitySlateRenderer::new);
registerer.registerBlockEntityRenderer(HexBlockEntities.AKASHIC_BOOKSHELF_TILE, registerer.registerBlockEntityRenderer(HexBlockEntities.AKASHIC_BOOKSHELF_TILE,
BlockEntityAkashicBookshelfRenderer::new); BlockEntityAkashicBookshelfRenderer::new);
registerer.registerBlockEntityRenderer(HexBlockEntities.QUENCHED_ALLAY_TILE,
BlockEntityQuenchedAllayRenderer::new);
} }
@FunctionalInterface @FunctionalInterface
@ -219,12 +223,10 @@ public class RegisterClientStuff {
} }
public static void onModelBake(ModelBakery loader, Map<ResourceLocation, BakedModel> map) { public static void onModelBake(ModelBakery loader, Map<ResourceLocation, BakedModel> map) {
var quenchedName = new ModelResourceLocation(modLoc("quenched_allay"), "");
var variants = new ArrayList<BakedModel>(BlockQuenchedAllay.VARIANTS);
for (int i = 0; i < BlockQuenchedAllay.VARIANTS; i++) { for (int i = 0; i < BlockQuenchedAllay.VARIANTS; i++) {
var variantLoc = modLoc("block/quenched_allay_" + i); var variantLoc = modLoc("block/quenched_allay_" + i);
variants.add(map.get(variantLoc)); var model = map.get(variantLoc);
QUENCHED_ALLAY_VARIANTS.add(model);
} }
map.put(quenchedName, new GaslightingModel(variants));
} }
} }

View file

@ -0,0 +1,70 @@
package at.petrak.hexcasting.client.be;
import at.petrak.hexcasting.client.RegisterClientStuff;
import at.petrak.hexcasting.common.blocks.BlockQuenchedAllay;
import at.petrak.hexcasting.common.blocks.entity.BlockEntityQuenchedAllay;
import at.petrak.hexcasting.mixin.accessor.client.AccessorBlockEntityRenderDispatcher;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.model.geom.EntityModelSet;
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.world.item.ItemStack;
public class BlockEntityQuenchedAllayRenderer implements BlockEntityRenderer<BlockEntityQuenchedAllay> {
private static int GASLIGHTING_AMOUNT = 0;
private static boolean HAS_RENDERED_THIS_FRAME = false;
private final BlockEntityRendererProvider.Context ctx;
public BlockEntityQuenchedAllayRenderer(BlockEntityRendererProvider.Context ctx) {
this.ctx = ctx;
}
private static void doRender(BlockRenderDispatcher dispatcher, PoseStack ps, MultiBufferSource bufSource,
int packedLight, int packedOverlay) {
HAS_RENDERED_THIS_FRAME = true;
var buffer = bufSource.getBuffer(RenderType.translucent());
var pose = ps.last();
var idx = Math.abs(BlockEntityQuenchedAllayRenderer.GASLIGHTING_AMOUNT % BlockQuenchedAllay.VARIANTS);
var model = RegisterClientStuff.QUENCHED_ALLAY_VARIANTS.get(idx);
dispatcher.getModelRenderer().renderModel(pose, buffer, null, model, 1f, 1f, 1f, packedLight, packedOverlay);
}
@Override
public void render(BlockEntityQuenchedAllay blockEntity, float partialTick, PoseStack poseStack,
MultiBufferSource bufferSource, int packedLight, int packedOverlay) {
doRender(this.ctx.getBlockRenderDispatcher(), poseStack, bufferSource, packedLight, packedOverlay);
}
public static void postFrameCheckRendered() {
if (!HAS_RENDERED_THIS_FRAME) {
GASLIGHTING_AMOUNT += 1;
}
HAS_RENDERED_THIS_FRAME = false;
}
public static class BWELRWrapper extends BlockEntityWithoutLevelRenderer {
private final BlockRenderDispatcher dispatcher;
public BWELRWrapper(BlockEntityRenderDispatcher blockEntityRenderDispatcher, EntityModelSet entityModelSet) {
super(blockEntityRenderDispatcher, entityModelSet);
this.dispatcher =
((AccessorBlockEntityRenderDispatcher) blockEntityRenderDispatcher).hex$getBlockRenderDispatcher().get();
}
@Override
public void renderByItem(ItemStack stack, ItemTransforms.TransformType transformType, PoseStack poseStack,
MultiBufferSource buffer, int packedLight, int packedOverlay) {
doRender(this.dispatcher, poseStack, buffer, packedLight, packedOverlay);
}
}
}

View file

@ -1,11 +1,29 @@
package at.petrak.hexcasting.common.blocks; package at.petrak.hexcasting.common.blocks;
import at.petrak.hexcasting.common.blocks.entity.BlockEntityQuenchedAllay;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import org.jetbrains.annotations.Nullable;
public class BlockQuenchedAllay extends Block { public class BlockQuenchedAllay extends Block implements EntityBlock {
public static final int VARIANTS = 4; public static final int VARIANTS = 4;
public BlockQuenchedAllay(Properties properties) { public BlockQuenchedAllay(Properties properties) {
super(properties); super(properties);
} }
@Nullable
@Override
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
return new BlockEntityQuenchedAllay(pos, state);
}
@Override
public RenderShape getRenderShape(BlockState state) {
return RenderShape.INVISIBLE;
}
} }

View file

@ -0,0 +1,26 @@
package at.petrak.hexcasting.common.blocks.entity;
import at.petrak.hexcasting.api.block.HexBlockEntity;
import at.petrak.hexcasting.common.lib.HexBlockEntities;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.state.BlockState;
/**
* No-op BE just to have a BER
*/
public class BlockEntityQuenchedAllay extends HexBlockEntity {
public BlockEntityQuenchedAllay(BlockPos pos, BlockState blockState) {
super(HexBlockEntities.QUENCHED_ALLAY_TILE, pos, blockState);
}
@Override
protected void saveModData(CompoundTag tag) {
}
@Override
protected void loadModData(CompoundTag tag) {
}
}

View file

@ -3,10 +3,7 @@ package at.petrak.hexcasting.common.lib;
import at.petrak.hexcasting.api.HexAPI; import at.petrak.hexcasting.api.HexAPI;
import at.petrak.hexcasting.common.blocks.akashic.BlockEntityAkashicBookshelf; import at.petrak.hexcasting.common.blocks.akashic.BlockEntityAkashicBookshelf;
import at.petrak.hexcasting.common.blocks.circles.BlockEntitySlate; import at.petrak.hexcasting.common.blocks.circles.BlockEntitySlate;
import at.petrak.hexcasting.common.blocks.entity.BlockEntityConjured; import at.petrak.hexcasting.common.blocks.entity.*;
import at.petrak.hexcasting.common.blocks.entity.BlockEntityLookingImpetus;
import at.petrak.hexcasting.common.blocks.entity.BlockEntityRightClickImpetus;
import at.petrak.hexcasting.common.blocks.entity.BlockEntityStoredPlayerImpetus;
import at.petrak.hexcasting.xplat.IXplatAbstractions; import at.petrak.hexcasting.xplat.IXplatAbstractions;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -51,6 +48,9 @@ public class HexBlockEntities {
"slate_tile", "slate_tile",
BlockEntitySlate::new, HexBlocks.SLATE); BlockEntitySlate::new, HexBlocks.SLATE);
public static final BlockEntityType<BlockEntityQuenchedAllay> QUENCHED_ALLAY_TILE = register(
"quenched_allay_tile", BlockEntityQuenchedAllay::new, HexBlocks.QUENCHED_ALLAY);
private static <T extends BlockEntity> BlockEntityType<T> register(String id, private static <T extends BlockEntity> BlockEntityType<T> register(String id,
BiFunction<BlockPos, BlockState, T> func, Block... blocks) { BiFunction<BlockPos, BlockState, T> func, Block... blocks) {
var ret = IXplatAbstractions.INSTANCE.createBlockEntityType(func, blocks); var ret = IXplatAbstractions.INSTANCE.createBlockEntityType(func, blocks);

View file

@ -147,8 +147,12 @@ public class HexBlocks {
public static final BlockAkashicLigature AKASHIC_LIGATURE = blockItem("akashic_connector", public static final BlockAkashicLigature AKASHIC_LIGATURE = blockItem("akashic_connector",
new BlockAkashicLigature(akashicWoodyHard().lightLevel(bs -> 4))); new BlockAkashicLigature(akashicWoodyHard().lightLevel(bs -> 4)));
public static final BlockQuenchedAllay QUENCHED_ALLAY = blockItem("quenched_allay", // we have to make it emit light because otherwise it occludes itself and is always dark
new BlockQuenchedAllay(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK))); public static final BlockQuenchedAllay QUENCHED_ALLAY = blockItem("quenched_allay", new BlockQuenchedAllay(
BlockBehaviour.Properties
.copy(Blocks.AMETHYST_BLOCK)
.lightLevel($ -> 4)
.noOcclusion()));
// Decoration?! // Decoration?!
public static final Block SLATE_BLOCK = blockItem("slate_block", new Block(slateish().strength(2f, 4f))); public static final Block SLATE_BLOCK = blockItem("slate_block", new Block(slateish().strength(2f, 4f)));

View file

@ -0,0 +1,14 @@
package at.petrak.hexcasting.mixin.accessor.client;
import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import java.util.function.Supplier;
@Mixin(BlockEntityRenderDispatcher.class)
public interface AccessorBlockEntityRenderDispatcher {
@Accessor("blockRenderDispatcher")
Supplier<BlockRenderDispatcher> hex$getBlockRenderDispatcher();
}

View file

@ -19,6 +19,7 @@
"accessor.CriteriaTriggersAccessor" "accessor.CriteriaTriggersAccessor"
], ],
"client": [ "client": [
"accessor.client.AccessorBlockEntityRenderDispatcher",
"accessor.client.AccessorCompositeRenderType", "accessor.client.AccessorCompositeRenderType",
"accessor.client.AccessorEmptyTextureStateShard", "accessor.client.AccessorEmptyTextureStateShard",
"accessor.client.AccessorMouseHandler", "accessor.client.AccessorMouseHandler",