diff --git a/gradle.properties b/gradle.properties index c420c269d..e23efe403 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,7 +23,7 @@ use_parchment = true # dependency versions registrate_version = MC1.20-1.3.3 flywheel_minecraft_version = 1.20.1 -flywheel_version = 1.0.0-alpha-67 +flywheel_version = 1.0.0-alpha-78 jei_minecraft_version = 1.20.1 jei_version = 15.2.0.22 curios_minecraft_version = 1.20.1 diff --git a/src/main/java/com/simibubi/create/content/contraptions/render/ActorVisual.java b/src/main/java/com/simibubi/create/content/contraptions/render/ActorVisual.java index 1742fb225..f2f003061 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/render/ActorVisual.java +++ b/src/main/java/com/simibubi/create/content/contraptions/render/ActorVisual.java @@ -35,11 +35,6 @@ public abstract class ActorVisual implements Visual { public void update(float partialTick) { } - @Override - public boolean shouldReset() { - return false; - } - protected abstract void _delete(); @Override diff --git a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java index 477d7d74f..9e6684e6f 100644 --- a/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java +++ b/src/main/java/com/simibubi/create/content/kinetics/waterwheel/WaterWheelVisual.java @@ -1,11 +1,16 @@ package com.simibubi.create.content.kinetics.waterwheel; +import java.util.function.Consumer; + +import com.jozufozu.flywheel.api.instance.Instance; import com.jozufozu.flywheel.api.model.Model; import com.jozufozu.flywheel.api.visualization.VisualizationContext; import com.jozufozu.flywheel.lib.model.ModelCache; import com.jozufozu.flywheel.lib.model.baked.BakedModelBuilder; import com.mojang.blaze3d.vertex.PoseStack; -import com.simibubi.create.content.kinetics.base.SingleRotatingVisual; +import com.simibubi.create.content.kinetics.base.KineticBlockEntityVisual; +import com.simibubi.create.content.kinetics.base.RotatingInstance; +import com.simibubi.create.foundation.render.AllInstanceTypes; import com.simibubi.create.foundation.render.CachedBufferer; import net.minecraft.client.resources.model.BakedModel; @@ -13,16 +18,16 @@ import net.minecraft.core.Direction; import net.minecraft.core.Direction.AxisDirection; import net.minecraft.world.level.block.state.BlockState; -public class WaterWheelVisual extends SingleRotatingVisual { +public class WaterWheelVisual extends KineticBlockEntityVisual { private static final ModelCache MODEL_CACHE = new ModelCache<>(WaterWheelVisual::createModel); protected final boolean large; - protected final WaterWheelModelKey key; + protected BlockState lastMaterial; + protected RotatingInstance rotatingModel; public WaterWheelVisual(VisualizationContext context, T blockEntity, boolean large) { super(context, blockEntity); this.large = large; - key = new WaterWheelModelKey(large, blockState, blockEntity.material); } public static WaterWheelVisual standard(VisualizationContext context, T blockEntity) { @@ -34,13 +39,41 @@ public class WaterWheelVisual extends SingleRot } @Override - public boolean shouldReset() { - return super.shouldReset() || key.material() != blockEntity.material; + public void init(float pt) { + setupInstance(); + super.init(pt); + } + + private void setupInstance() { + lastMaterial = blockEntity.material; + rotatingModel = instancerProvider.instancer(AllInstanceTypes.ROTATING, MODEL_CACHE.get(new WaterWheelModelKey(large, blockState, blockEntity.material))) + .createInstance(); + setup(rotatingModel); } @Override - protected Model model() { - return MODEL_CACHE.get(key); + public void update(float pt) { + if (lastMaterial != blockEntity.material) { + rotatingModel.delete(); + setupInstance(); + } + + updateRotation(rotatingModel); + } + + @Override + public void updateLight() { + relight(pos, rotatingModel); + } + + @Override + protected void _delete() { + rotatingModel.delete(); + } + + @Override + public void collectCrumblingInstances(Consumer consumer) { + consumer.accept(rotatingModel); } private static Model createModel(WaterWheelModelKey key) { diff --git a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java index c1c63b287..711e11e69 100644 --- a/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java +++ b/src/main/java/com/simibubi/create/content/logistics/tunnel/BeltTunnelVisual.java @@ -17,7 +17,6 @@ import com.jozufozu.flywheel.lib.visual.SimpleDynamicVisual; import com.simibubi.create.AllPartialModels; import com.simibubi.create.content.logistics.flwdata.FlapInstance; import com.simibubi.create.foundation.render.AllInstanceTypes; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.core.Direction; @@ -25,35 +24,35 @@ import net.minecraft.world.level.LightLayer; public class BeltTunnelVisual extends AbstractBlockEntityVisual implements SimpleDynamicVisual { - private final Map> tunnelFlaps; + private final Map> tunnelFlaps = new EnumMap<>(Direction.class); public BeltTunnelVisual(VisualizationContext context, BeltTunnelBlockEntity blockEntity) { super(context, blockEntity); + } - tunnelFlaps = new EnumMap<>(Direction.class); + private void setupFlaps(float partialTick) { + Instancer model = instancerProvider.instancer(AllInstanceTypes.FLAPS, Models.partial(AllPartialModels.BELT_TUNNEL_FLAP)); - Instancer model = instancerProvider.instancer(AllInstanceTypes.FLAPS, Models.partial(AllPartialModels.BELT_TUNNEL_FLAP)); + int blockLight = level.getBrightness(LightLayer.BLOCK, pos); + int skyLight = level.getBrightness(LightLayer.SKY, pos); - int blockLight = level.getBrightness(LightLayer.BLOCK, pos); - int skyLight = level.getBrightness(LightLayer.SKY, pos); + blockEntity.flaps.forEach((direction, flapValue) -> { - blockEntity.flaps.forEach((direction, flapValue) -> { + float flapness = flapValue.getValue(partialTick); - float flapness = flapValue.getValue(AnimationTickHolder.getPartialTicks()); + float horizontalAngle = direction.getOpposite().toYRot(); - float horizontalAngle = direction.getOpposite().toYRot(); + float flapScale = direction.getAxis() == Direction.Axis.X ? 1 : -1; - float flapScale = direction.getAxis() == Direction.Axis.X ? 1 : -1; + ArrayList flaps = new ArrayList<>(4); - ArrayList flaps = new ArrayList<>(4); + for (int segment = 0; segment <= 3; segment++) { + float intensity = segment == 3 ? 1.5f : segment + 1; + float segmentOffset = -3.05f / 16f * segment + 0.075f / 16f; - for (int segment = 0; segment <= 3; segment++) { - float intensity = segment == 3 ? 1.5f : segment + 1; - float segmentOffset = -3.05f / 16f * segment + 0.075f / 16f; + FlapInstance key = model.createInstance(); - FlapInstance key = model.createInstance(); - - key.setPosition(getVisualPosition()) + key.setPosition(getVisualPosition()) .setSegmentOffset(segmentOffset, 0, 0) .setBlockLight(blockLight) .setSkyLight(skyLight) @@ -64,19 +63,29 @@ public class BeltTunnelVisual extends AbstractBlockEntityVisual { LerpedFloat lerpedFloat = blockEntity.flaps.get(direction); diff --git a/src/main/resources/assets/create/flywheel/instance/flap.vert b/src/main/resources/assets/create/flywheel/instance/flap.vert index ec8928a45..2ad5e1226 100644 --- a/src/main/resources/assets/create/flywheel/instance/flap.vert +++ b/src/main/resources/assets/create/flywheel/instance/flap.vert @@ -18,8 +18,8 @@ float getFlapAngle(float flapness, float intensity, float scale) { void flw_instanceVertex(in FlwInstance flap) { float flapAngle = getFlapAngle(flap.flapness, flap.intensity, flap.flapScale); - vec4 orientation = quaternion(vec3(0., 1., 0.), -flap.horizontalAngle); - vec4 flapRotation = quaternion(vec3(1., 0., 0.), flapAngle); + vec4 orientation = quaternionDegrees(vec3(0., 1., 0.), -flap.horizontalAngle); + vec4 flapRotation = quaternionDegrees(vec3(1., 0., 0.), flapAngle); vec3 rotated = rotateByQuaternion(flw_vertexPos.xyz - flap.pivot, flapRotation) + flap.pivot + flap.segmentOffset;