CreateMod/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelInstance.java
PepperCode1 246543c76b Fix memory leaks
- Fix CopycatPanelModel using wrong state during trapdoor special case
- Update Flywheel
2023-07-03 13:53:51 -07:00

56 lines
2.2 KiB
Java

package com.simibubi.create.content.kinetics.waterwheel;
import com.jozufozu.flywheel.api.Instancer;
import com.jozufozu.flywheel.api.MaterialManager;
import com.jozufozu.flywheel.core.model.BlockModel;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.content.kinetics.base.CutoutRotatingInstance;
import com.simibubi.create.content.kinetics.base.flwdata.RotatingData;
import com.simibubi.create.foundation.render.CachedBufferer;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.AxisDirection;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
public class WaterWheelInstance<T extends WaterWheelBlockEntity> extends CutoutRotatingInstance<T> {
protected final boolean large;
protected final WaterWheelModelKey key;
public WaterWheelInstance(MaterialManager materialManager, T blockEntity, boolean large) {
super(materialManager, blockEntity);
this.large = large;
key = new WaterWheelModelKey(large, getRenderedBlockState(), blockEntity.material);
}
public static <T extends WaterWheelBlockEntity> WaterWheelInstance<T> standard(MaterialManager materialManager, T blockEntity) {
return new WaterWheelInstance<>(materialManager, blockEntity, false);
}
public static <T extends WaterWheelBlockEntity> WaterWheelInstance<T> large(MaterialManager materialManager, T blockEntity) {
return new WaterWheelInstance<>(materialManager, blockEntity, true);
}
@Override
public boolean shouldReset() {
return super.shouldReset() || key.material() != blockEntity.material;
}
@Override
protected Instancer<RotatingData> getModel() {
return getRotatingMaterial().model(key, () -> {
BakedModel model = WaterWheelRenderer.generateModel(key);
BlockState state = key.state();
Direction dir;
if (key.large()) {
dir = Direction.fromAxisAndDirection(state.getValue(LargeWaterWheelBlock.AXIS), AxisDirection.POSITIVE);
} else {
dir = state.getValue(WaterWheelBlock.FACING);
}
PoseStack transform = CachedBufferer.rotateToFaceVertical(dir).get();
return BlockModel.of(model, Blocks.AIR.defaultBlockState(), transform);
});
}
}