From 2910df30785b196f53dea8ce726207efb1b90691 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 15 May 2021 22:22:33 +0300 Subject: [PATCH] Change models loading (WIP) --- .../ru/betterend/blocks/basis/BarkBlock.java | 7 +++- .../ru/betterend/blocks/basis/BlockBase.java | 18 ++++++-- .../betterend/blocks/basis/EndAnvilBlock.java | 30 +++---------- .../blocks/basis/EndBarrelBlock.java | 30 ++++++++++++- .../blocks/basis/EndPillarBlock.java | 42 +++++++++++++++++-- .../mixin/client/ModelLoaderMixin.java | 12 +++--- .../patterns/BlockModelProvider.java | 22 ++++++++-- .../java/ru/betterend/patterns/Patterns.java | 9 ++++ 8 files changed, 129 insertions(+), 41 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/BarkBlock.java b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java index c821fab8..61edb06b 100644 --- a/src/main/java/ru/betterend/blocks/basis/BarkBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/BarkBlock.java @@ -2,6 +2,7 @@ package ru.betterend.blocks.basis; import java.io.Reader; +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.MultiVariant; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -26,8 +27,12 @@ public class BarkBlock extends EndPillarBlock { } @Override - public MultiVariant getModelVariant(BlockState blockState) { + public BlockModel getBlockModel(BlockState blockState) { + return null; + } + @Override + public MultiVariant getModelVariant(ResourceLocation resourceLocation, BlockState blockState) { return null; } diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBase.java b/src/main/java/ru/betterend/blocks/basis/BlockBase.java index 62f039c0..49bcdebf 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBase.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBase.java @@ -4,8 +4,10 @@ import java.io.Reader; import java.util.Collections; import java.util.List; +import com.mojang.math.Transformation; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.MultiVariant; +import net.minecraft.client.renderer.block.model.Variant; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -34,12 +36,12 @@ public class BlockBase extends Block implements BlockModelProvider { @Override public String getModelString(String block) { ResourceLocation blockId = Registry.BLOCK.getKey(this); - return Patterns.createJson(Patterns.BLOCK_BASE, blockId.getPath(), blockId.getPath()); + return Patterns.createBlockSimple(blockId.getPath()); } @Override public BlockModel getModel() { - return getModelVariant(defaultBlockState()); + return getBlockModel(defaultBlockState()); } @Override @@ -48,7 +50,15 @@ public class BlockBase extends Block implements BlockModelProvider { } @Override - public MultiVariant getModelVariant(BlockState blockState) { - return BlockModel.fromString(getModelString("")); + public BlockModel getBlockModel(BlockState blockState) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + String pattern = Patterns.createBlockSimple(blockId.getPath()); + return BlockModelProvider.createBlockModel(blockId, pattern); + } + + @Override + public MultiVariant getModelVariant(ResourceLocation resourceLocation, BlockState blockState) { + Variant variant = new Variant(resourceLocation, Transformation.identity(), false, 1); + return new MultiVariant(Collections.singletonList(variant)); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index 49089638..bea99ff7 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -24,8 +24,6 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.level.storage.loot.LootContext; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.commons.lang3.tuple.Triple; import ru.betterend.blocks.BlockProperties; import ru.betterend.patterns.BlockModelProvider; import ru.betterend.patterns.Patterns; @@ -91,38 +89,22 @@ public class EndAnvilBlock extends AnvilBlock implements BlockModelProvider { @Override public BlockModel getModel() { - return null; + return getBlockModel(defaultBlockState()); } @Override - public Pair getBlockModel(BlockState blockState) { - Direction facing = blockState.getValue(FACING); + public BlockModel getBlockModel(BlockState blockState) { int destruction = blockState.getValue(DESTRUCTION); ResourceLocation blockId = Registry.BLOCK.getKey(this); - ResourceLocation modelId = createModelId(blockId, facing, destruction); Map map = Maps.newHashMap(); map.put("%anvil%", blockId.getPath()); map.put("%top%", "_top_" + destruction); - String jsonString = Patterns.createJson(Patterns.BLOCK_ANVIL, map); - BlockModel blockModel = BlockModel.fromString(jsonString); - - return Pair.of(modelId, blockModel); + String pattern = Patterns.createJson(Patterns.BLOCK_ANVIL, map); + return BlockModelProvider.createBlockModel(blockId, pattern); } @Override - public MultiVariant getModelVariant(BlockState blockState) { - Direction facing = blockState.getValue(FACING); - int destruction = blockState.getValue(DESTRUCTION); - ResourceLocation blockId = Registry.BLOCK.getKey(this); - ResourceLocation modelId = createModelId(blockId, facing, destruction); - Transformation transform = new Transformation(null, facing.getRotation(), null, null); - Variant variant = new Variant(modelId, transform, false, 1); - - return new MultiVariant(Collections.singletonList(variant)); - } - - protected ResourceLocation createModelId(ResourceLocation blockId, Direction facing, int destruction) { - return new ResourceLocation(blockId.getNamespace(), - blockId.getPath() + "/" + facing + "/destruction_" + destruction); + public MultiVariant getModelVariant(ResourceLocation resourceLocation, BlockState blockState) { + return BlockModelProvider.createFacingModel(resourceLocation, blockState.getValue(FACING)); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java index af0fcda4..304ae177 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java @@ -5,6 +5,8 @@ import java.util.List; import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.renderer.block.model.MultiVariant; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; @@ -102,9 +104,35 @@ public class EndBarrelBlock extends BarrelBlock implements BlockModelProvider { } return Patterns.createJson(Patterns.BLOCK_BOTTOM_TOP, texture, texture); } - + + @Override + public BlockModel getModel() { + return getBlockModel(defaultBlockState()); + } + @Override public ResourceLocation statePatternId() { return Patterns.STATE_BARREL; } + + @Override + public BlockModel getBlockModel(BlockState blockState) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + String texture = blockId.getPath(); + String pattern; + if (blockState.getValue(OPEN)) { + pattern = Patterns.createJson(Patterns.BLOCK_BARREL_OPEN, texture, texture); + } else { + pattern = Patterns.createJson(Patterns.BLOCK_BOTTOM_TOP, texture, texture); + } + if (pattern != null) { + return BlockModelProvider.createBlockModel(blockId, pattern); + } + return null; + } + + @Override + public MultiVariant getModelVariant(ResourceLocation resourceLocation, BlockState blockState) { + return BlockModelProvider.createFacingModel(resourceLocation, blockState.getValue(FACING)); + } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java index 279d225a..68c4afd8 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java @@ -4,8 +4,13 @@ import java.io.Reader; import java.util.Collections; import java.util.List; +import com.mojang.math.Transformation; +import com.mojang.math.Vector3f; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.renderer.block.model.MultiVariant; +import net.minecraft.client.renderer.block.model.Variant; +import net.minecraft.core.Direction; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -16,7 +21,7 @@ import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.patterns.BlockModelProvider; import ru.betterend.patterns.Patterns; -public abstract class EndPillarBlock extends RotatedPillarBlock implements BlockModelProvider { +public class EndPillarBlock extends RotatedPillarBlock implements BlockModelProvider { public EndPillarBlock(Properties settings) { super(settings); } @@ -43,12 +48,43 @@ public abstract class EndPillarBlock extends RotatedPillarBlock implements Block @Override public String getModelString(String block) { - String texture = Registry.BLOCK.getKey(this).getPath(); - return Patterns.createJson(Patterns.BLOCK_PILLAR, texture, texture); + return createBlockPattern(); } @Override public ResourceLocation statePatternId() { return Patterns.STATE_PILLAR; } + + @Override + public BlockModel getBlockModel(BlockState blockState) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + BlockModel model = BlockModel.fromString(createBlockPattern()); + ResourceLocation modelLoc = new ResourceLocation(blockId.getNamespace(), "blocks/" + blockId.getPath()); + model.name = modelLoc.toString(); + return model; + } + + @Override + public MultiVariant getModelVariant(ResourceLocation resourceLocation, BlockState blockState) { + Direction.Axis axis = blockState.getValue(AXIS); + Transformation transform = Transformation.identity(); + switch (axis) { + case X: { + transform = new Transformation(null, Vector3f.ZP.rotationDegrees(90), null, null); + break; + } + case Z: { + transform = new Transformation(null, Vector3f.XP.rotationDegrees(90), null, null); + break; + } + } + Variant variant = new Variant(resourceLocation, transform, false, 1); + return new MultiVariant(Collections.singletonList(variant)); + } + + private String createBlockPattern() { + String texture = Registry.BLOCK.getKey(this).getPath(); + return Patterns.createBlockPillar(texture); + } } diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 168454e0..273390a4 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -79,12 +79,14 @@ public abstract class ModelLoaderMixin { Block block = Registry.BLOCK.get(clearLoc); if (block instanceof BlockModelProvider) { block.getStateDefinition().getPossibleStates().forEach(blockState -> { - MultiVariant modelVariant = ((BlockModelProvider) block).getModelVariant(blockState); - Pair modelData = ((BlockModelProvider) block).getBlockModel(blockState); - if (modelVariant != null) { - ModelResourceLocation stateLoc = BlockModelShaper.stateToModelLocation(clearLoc, blockState); + ModelResourceLocation stateLoc = BlockModelShaper.stateToModelLocation(clearLoc, blockState); + MultiVariant modelVariant = ((BlockModelProvider) block).getModelVariant(stateLoc, blockState); + BlockModel blockModel = ((BlockModelProvider) block).getBlockModel(blockState); + if (modelVariant != null && blockModel != null) { cacheAndQueueDependencies(stateLoc, modelVariant); - unbakedCache.put(modelData.getLeft(), modelData.getRight()); + unbakedCache.put(stateLoc, blockModel); + } else { + BetterEnd.LOGGER.warning("Error loading models for {}", clearLoc); } }); info.cancel(); diff --git a/src/main/java/ru/betterend/patterns/BlockModelProvider.java b/src/main/java/ru/betterend/patterns/BlockModelProvider.java index 50fb5012..72366f08 100644 --- a/src/main/java/ru/betterend/patterns/BlockModelProvider.java +++ b/src/main/java/ru/betterend/patterns/BlockModelProvider.java @@ -1,16 +1,32 @@ package ru.betterend.patterns; import java.io.Reader; +import java.util.Collections; +import com.mojang.math.Transformation; import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.MultiVariant; +import net.minecraft.client.renderer.block.model.Variant; +import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockState; -import org.apache.commons.lang3.tuple.Pair; public interface BlockModelProvider extends ModelProvider { String getStatesPattern(Reader data); ResourceLocation statePatternId(); - Pair getBlockModel(BlockState blockState); - MultiVariant getModelVariant(BlockState blockState); + BlockModel getBlockModel(BlockState blockState); + MultiVariant getModelVariant(ResourceLocation resourceLocation, BlockState blockState); + + static BlockModel createBlockModel(ResourceLocation blockId, String pattern) { + BlockModel model = BlockModel.fromString(pattern); + ResourceLocation modelLoc = new ResourceLocation(blockId.getNamespace(), "blocks/" + blockId.getPath()); + model.name = modelLoc.toString(); + return model; + } + + static MultiVariant createFacingModel(ResourceLocation resourceLocation, Direction facing) { + Transformation transform = new Transformation(null, facing.getRotation(), null, null); + Variant variant = new Variant(resourceLocation, transform, false, 1); + return new MultiVariant(Collections.singletonList(variant)); + } } diff --git a/src/main/java/ru/betterend/patterns/Patterns.java b/src/main/java/ru/betterend/patterns/Patterns.java index db992c48..9e0ea886 100644 --- a/src/main/java/ru/betterend/patterns/Patterns.java +++ b/src/main/java/ru/betterend/patterns/Patterns.java @@ -12,6 +12,7 @@ import java.util.stream.Collectors; import com.google.common.collect.Maps; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.ResourceManager; import org.jetbrains.annotations.Nullable; @@ -121,6 +122,13 @@ public class Patterns { public static String createItemGenerated(String name) { return createJson(ITEM_GENERATED, name); } + + public static String createBlockSimple(String name) { + return Patterns.createJson(Patterns.BLOCK_BASE, name, name); + } + public static String createBlockPillar(String name) { + return Patterns.createJson(Patterns.BLOCK_PILLAR, name, name); + } public static String createJson(Reader data, String parent, String block) { try (BufferedReader buffer = new BufferedReader(data)) { @@ -160,4 +168,5 @@ public class Patterns { return ""; } } + }