Scrolling into the distance

- Import models from Kryppers
- Add scrolling animation to belts on large bogeys
- Duplicate scrolling instance to extend TransformedInstance so it can
  actually be used in a bogey
This commit is contained in:
Jozufozu 2025-02-05 21:26:11 -08:00
parent 8bdb6a662f
commit 5f1c96d3c8
14 changed files with 557 additions and 1184 deletions

View file

@ -158,6 +158,7 @@ public class AllPartialModels {
BOGEY_FRAME = block("track/bogey/bogey_frame"), SMALL_BOGEY_WHEELS = block("track/bogey/bogey_wheel"),
BOGEY_PIN = block("track/bogey/bogey_drive_wheel_pin"), BOGEY_PISTON = block("track/bogey/bogey_drive_piston"),
BOGEY_DRIVE = block("track/bogey/bogey_drive"), LARGE_BOGEY_WHEELS = block("track/bogey/bogey_drive_wheel"),
BOGEY_DRIVE_BELT = block("track/bogey/bogey_drive_belt"),
TRAIN_COUPLING_HEAD = block("track/bogey/coupling_head"),
TRAIN_COUPLING_CABLE = block("track/bogey/coupling_cable"),

View file

@ -94,6 +94,8 @@ public class AllSpriteShifts {
ANDESIDE_BELT_CASING = get("block/belt/brass_belt_casing", "block/belt/andesite_belt_casing"),
CRAFTER_THINGIES = get("block/crafter_thingies", "block/crafter_thingies");
public static final SpriteShiftEntry BOGEY_BELT = get("block/bogey/belt", "block/bogey/belt_scroll");
static {
populateMaps();
}

View file

@ -0,0 +1,63 @@
package com.simibubi.create.content.processing.burner;
import org.joml.Quaternionf;
import org.joml.Quaternionfc;
import dev.engine_room.flywheel.api.instance.InstanceHandle;
import dev.engine_room.flywheel.api.instance.InstanceType;
import dev.engine_room.flywheel.lib.instance.TransformedInstance;
import net.createmod.catnip.render.SpriteShiftEntry;
import net.minecraft.core.Vec3i;
public class ScrollTransformedInstance extends TransformedInstance {
public float speedU;
public float speedV;
public float offsetU;
public float offsetV;
public float diffU;
public float diffV;
public float scaleU;
public float scaleV;
public ScrollTransformedInstance(InstanceType<? extends TransformedInstance> type, InstanceHandle handle) {
super(type, handle);
}
public ScrollTransformedInstance setSpriteShift(SpriteShiftEntry spriteShift) {
return setSpriteShift(spriteShift, 0.5f, 0.5f);
}
public ScrollTransformedInstance setSpriteShift(SpriteShiftEntry spriteShift, float factorU, float factorV) {
float spriteWidth = spriteShift.getTarget()
.getU1()
- spriteShift.getTarget()
.getU0();
float spriteHeight = spriteShift.getTarget()
.getV1()
- spriteShift.getTarget()
.getV0();
scaleU = spriteWidth * factorU;
scaleV = spriteHeight * factorV;
diffU = spriteShift.getTarget().getU0() - spriteShift.getOriginal().getU0();
diffV = spriteShift.getTarget().getV0() - spriteShift.getOriginal().getV0();
return this;
}
public ScrollTransformedInstance speed(float speedU, float speedV) {
this.speedU = speedU;
this.speedV = speedV;
return this;
}
public ScrollTransformedInstance offset(float offsetU, float offsetV) {
this.offsetU = offsetU;
this.offsetV = offsetV;
return this;
}
}

View file

@ -4,6 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.AllSpriteShifts;
import com.simibubi.create.content.kinetics.simpleRelays.ShaftBlock;
import net.createmod.catnip.render.CachedBuffers;
@ -14,6 +15,7 @@ import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.Blocks;
public class StandardBogeyRenderer implements BogeyRenderer {
@ -59,6 +61,9 @@ public class StandardBogeyRenderer implements BogeyRenderer {
}
public static class Large extends StandardBogeyRenderer {
public static final float BELT_RADIUS_PX = 5f;
public static final float BELT_RADIUS_IN_UV_SPACE = BELT_RADIUS_PX / 16f;
@Override
public void render(CompoundTag bogeyData, float wheelAngle, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int light, int overlay, boolean inContraption) {
super.render(bogeyData, wheelAngle, partialTick, poseStack, bufferSource, light, overlay, inContraption);
@ -83,6 +88,22 @@ public class StandardBogeyRenderer implements BogeyRenderer {
.overlay(overlay)
.renderInto(poseStack, buffer);
float spriteSize = AllSpriteShifts.BOGEY_BELT.getTarget()
.getV1()
- AllSpriteShifts.BOGEY_BELT.getTarget()
.getV0();
float scroll = BELT_RADIUS_IN_UV_SPACE * Mth.DEG_TO_RAD * wheelAngle;
scroll = scroll - Mth.floor(scroll);
scroll = scroll * spriteSize * 0.5f;
CachedBuffers.partial(AllPartialModels.BOGEY_DRIVE_BELT, Blocks.AIR.defaultBlockState())
.scale(1 - 1 / 512f)
.light(light)
.overlay(overlay)
.shiftUVScrolling(AllSpriteShifts.BOGEY_BELT, scroll)
.renderInto(poseStack, buffer);
CachedBuffers.partial(AllPartialModels.BOGEY_PISTON, Blocks.AIR.defaultBlockState())
.translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle)))
.light(light)

View file

@ -6,6 +6,9 @@ import org.jetbrains.annotations.Nullable;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllPartialModels;
import com.simibubi.create.AllSpriteShifts;
import com.simibubi.create.content.processing.burner.ScrollTransformedInstance;
import com.simibubi.create.foundation.render.AllInstanceTypes;
import dev.engine_room.flywheel.api.instance.Instance;
import dev.engine_room.flywheel.api.visualization.VisualizationContext;
@ -15,6 +18,7 @@ import dev.engine_room.flywheel.lib.model.Models;
import net.createmod.catnip.math.AngleHelper;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.Mth;
public class StandardBogeyVisual implements BogeyVisual {
private final TransformedInstance shaft1;
@ -139,6 +143,7 @@ public class StandardBogeyVisual implements BogeyVisual {
private final TransformedInstance secondaryShaft1;
private final TransformedInstance secondaryShaft2;
private final TransformedInstance drive;
private final ScrollTransformedInstance belt;
private final TransformedInstance piston;
private final TransformedInstance wheels;
private final TransformedInstance pin;
@ -152,6 +157,9 @@ public class StandardBogeyVisual implements BogeyVisual {
drive = ctx.instancerProvider()
.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.BOGEY_DRIVE))
.createInstance();
belt = ctx.instancerProvider()
.instancer(AllInstanceTypes.SCROLLING_TRANSFORMED, Models.partial(AllPartialModels.BOGEY_DRIVE_BELT))
.createInstance();
piston = ctx.instancerProvider()
.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.BOGEY_PISTON))
.createInstance();
@ -161,6 +169,8 @@ public class StandardBogeyVisual implements BogeyVisual {
pin = ctx.instancerProvider()
.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.BOGEY_PIN))
.createInstance();
belt.setSpriteShift(AllSpriteShifts.BOGEY_BELT);
}
@Override
@ -183,6 +193,10 @@ public class StandardBogeyVisual implements BogeyVisual {
drive.setTransform(poseStack)
.scale(1 - 1/512f)
.setChanged();
belt.offset(0, StandardBogeyRenderer.Large.BELT_RADIUS_IN_UV_SPACE * Mth.DEG_TO_RAD * wheelAngle)
.setTransform(poseStack)
.scale(1 - 1/512f)
.setChanged();
piston.setTransform(poseStack)
.translate(0, 0, 1 / 4f * Math.sin(AngleHelper.rad(wheelAngle)))
.setChanged();
@ -205,6 +219,7 @@ public class StandardBogeyVisual implements BogeyVisual {
secondaryShaft2.setZeroTransform().setChanged();
wheels.setZeroTransform().setChanged();
drive.setZeroTransform().setChanged();
belt.setZeroTransform().setChanged();
piston.setZeroTransform().setChanged();
pin.setZeroTransform().setChanged();
}
@ -216,6 +231,7 @@ public class StandardBogeyVisual implements BogeyVisual {
secondaryShaft2.light(packedLight).setChanged();
wheels.light(packedLight).setChanged();
drive.light(packedLight).setChanged();
belt.light(packedLight).setChanged();
piston.light(packedLight).setChanged();
pin.light(packedLight).setChanged();
}
@ -227,6 +243,7 @@ public class StandardBogeyVisual implements BogeyVisual {
consumer.accept(secondaryShaft2);
consumer.accept(wheels);
consumer.accept(drive);
consumer.accept(belt);
consumer.accept(piston);
consumer.accept(pin);
}
@ -238,6 +255,7 @@ public class StandardBogeyVisual implements BogeyVisual {
secondaryShaft2.delete();
wheels.delete();
drive.delete();
belt.delete();
piston.delete();
pin.delete();
}

View file

@ -6,6 +6,7 @@ import org.lwjgl.system.MemoryUtil;
import com.simibubi.create.content.kinetics.base.RotatingInstance;
import com.simibubi.create.content.processing.burner.ScrollInstance;
import com.simibubi.create.content.processing.burner.ScrollTransformedInstance;
import dev.engine_room.flywheel.api.instance.InstanceType;
import dev.engine_room.flywheel.api.layout.FloatRepr;
@ -87,6 +88,41 @@ public class AllInstanceTypes {
})
.build();
// TODO: Switch everything to this? Right now it's only used for bogey belts.
// It takes a decent few more bytes to represent but perhaps it can be packed
// down into 96 by sacrificing precision
public static final InstanceType<ScrollTransformedInstance> SCROLLING_TRANSFORMED = SimpleInstanceType.builder(ScrollTransformedInstance::new)
.cullShader(asResource("instance/cull/scrolling_transformed.glsl"))
.vertexShader(asResource("instance/scrolling_transformed.vert"))
.layout(LayoutBuilder.create()
.matrix("pose", FloatRepr.FLOAT, 4)
.vector("color", FloatRepr.NORMALIZED_UNSIGNED_BYTE, 4)
.vector("light", IntegerRepr.SHORT, 2)
.vector("overlay", IntegerRepr.SHORT, 2)
.vector("speed", FloatRepr.FLOAT, 2)
.vector("diff", FloatRepr.FLOAT, 2)
.vector("scale", FloatRepr.FLOAT, 2)
.vector("offset", FloatRepr.FLOAT, 2)
.build())
.writer((ptr, instance) -> {
ExtraMemoryOps.putMatrix4f(ptr, instance.pose);
MemoryUtil.memPutByte(ptr + 64, instance.red);
MemoryUtil.memPutByte(ptr + 65, instance.green);
MemoryUtil.memPutByte(ptr + 66, instance.blue);
MemoryUtil.memPutByte(ptr + 67, instance.alpha);
ExtraMemoryOps.put2x16(ptr + 68, instance.light);
ExtraMemoryOps.put2x16(ptr + 72, instance.overlay);
MemoryUtil.memPutFloat(ptr + 76, instance.speedU);
MemoryUtil.memPutFloat(ptr + 80, instance.speedV);
MemoryUtil.memPutFloat(ptr + 84, instance.diffU);
MemoryUtil.memPutFloat(ptr + 88, instance.diffV);
MemoryUtil.memPutFloat(ptr + 92, instance.scaleU);
MemoryUtil.memPutFloat(ptr + 96, instance.scaleV);
MemoryUtil.memPutFloat(ptr + 100, instance.offsetU);
MemoryUtil.memPutFloat(ptr + 104, instance.offsetV);
})
.build();
public static void init() {
// noop
}

View file

@ -0,0 +1,5 @@
#include "flywheel:util/matrix.glsl"
void flw_transformBoundingSphere(in FlwInstance i, inout vec3 center, inout float radius) {
transformBoundingSphere(i.pose, center, radius);
}

View file

@ -0,0 +1,12 @@
#include "flywheel:util/matrix.glsl"
void flw_instanceVertex(in FlwInstance instance) {
flw_vertexPos = instance.pose * flw_vertexPos;
flw_vertexNormal = mat3(transpose(inverse(instance.pose))) * flw_vertexNormal;
vec2 scroll = fract(instance.speed * flw_renderTicks + instance.offset) * instance.scale;
flw_vertexTexCoord = flw_vertexTexCoord + instance.diff + scroll;
flw_vertexOverlay = instance.overlay;
flw_vertexLight = max(vec2(instance.light) / 256., flw_vertexLight);
}

View file

@ -1,8 +1,5 @@
# Blender MTL File: 'Bogey.blend'
# Material Count: 4
newmtl Belts
map_Kd #belt
# Blender 4.3.2 MTL File: 'Bogey.blend'
# www.blender.org
newmtl Bogey_Body
map_Kd #bogey

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/track/bogey/textures",
"loader": "forge:obj",
"flip_v": true,
"model": "create:models/block/track/bogey/bogey_drive_belt.obj"
}

View file

@ -0,0 +1,5 @@
# Blender 4.3.2 MTL File: 'Bogey.blend'
# www.blender.org
newmtl Belts
map_Kd #belt

View file

@ -0,0 +1,130 @@
# Blender 4.3.2
# www.blender.org
mtllib bogey_drive_belt.mtl
o Cube.030
v 0.500000 1.000000 -1.062500
v 0.687500 1.000000 -1.062500
v 0.500000 1.310930 -0.311848
v 0.687500 1.310930 -0.311848
v -0.500000 1.000000 -1.062500
v -0.687500 1.000000 -1.062500
v -0.500000 1.310930 -0.311848
v -0.687500 1.310930 -0.311848
v 0.500000 1.000000 1.062500
v 0.687500 1.000000 1.062500
v 0.500000 1.310930 0.311848
v 0.687500 1.310930 0.311848
v -0.500000 1.000000 1.062500
v -0.687500 1.000000 1.062500
v -0.500000 1.310930 0.311848
v -0.687500 1.310930 0.311848
v 0.500000 0.656250 0.939394
v 0.687500 0.656250 0.939394
v 0.500000 0.656250 -1.060606
v 0.687500 0.656250 -1.060606
v 0.500000 0.656250 -0.060606
v 0.687500 0.656250 -0.060606
v -0.500000 0.593750 0.939394
v -0.687500 0.593750 0.939394
v -0.500000 0.593750 -1.060606
v -0.687500 0.593750 -1.060606
v -0.500000 0.593750 -0.060606
v -0.687500 0.593750 -0.060606
v 0.500000 0.942259 -1.038583
v 0.687500 0.942259 -1.038583
v 0.500000 1.253189 -0.287931
v 0.687500 1.253189 -0.287931
v -0.500000 0.942259 -1.038583
v -0.687500 0.942259 -1.038583
v -0.500000 1.253189 -0.287931
v -0.687500 1.253189 -0.287931
v 0.500000 0.942259 1.038583
v 0.687500 0.942259 1.038583
v 0.500000 1.253189 0.287931
v 0.687500 1.253189 0.287931
v -0.500000 0.942259 1.038583
v -0.687500 0.942259 1.038583
v -0.500000 1.253189 0.287931
v -0.687500 1.253189 0.287931
v 0.500000 0.593750 0.939394
v 0.687500 0.593750 0.939394
v 0.500000 0.593750 -1.060606
v 0.687500 0.593750 -1.060606
v 0.500000 0.593750 -0.060606
v 0.687500 0.593750 -0.060606
v -0.500000 0.531250 0.939394
v -0.687500 0.531250 0.939394
v -0.500000 0.531250 -1.060606
v -0.687500 0.531250 -1.060606
v -0.500000 0.531250 -0.060606
v -0.687500 0.531250 -0.060606
vn -0.0000 0.9239 -0.3827
vn -0.0000 0.9239 0.3827
vn -0.0000 1.0000 -0.0000
vn -0.0000 -0.9239 0.3827
vn -0.0000 -0.9239 -0.3827
vn -0.0000 -1.0000 -0.0000
vn -0.0000 -0.3827 -0.9239
vn -0.0000 0.3827 0.9239
vn 1.0000 -0.0000 -0.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.3827 0.9239
vn -0.0000 0.3827 -0.9239
vn -0.0000 -0.0000 1.0000
vn -0.0000 -0.0000 -1.0000
vt 0.312500 0.187500
vt 0.312500 1.000000
vt 0.125000 1.000000
vt 0.125000 0.187500
vt 0.687500 0.187500
vt 0.875000 0.187500
vt 0.875000 1.000000
vt 0.687500 1.000000
vt 0.312500 0.000000
vt 0.125000 0.000000
s 0
usemtl Belts
f 1/1/1 3/2/1 4/3/1 2/4/1
f 5/5/1 6/6/1 8/7/1 7/8/1
f 9/2/2 10/3/2 12/4/2 11/1/2
f 13/8/2 15/5/2 16/6/2 14/7/2
f 21/9/3 22/10/3 20/3/3 19/2/3
f 17/9/3 18/10/3 22/3/3 21/2/3
f 27/9/3 25/2/3 26/10/3 28/3/3
f 23/9/3 27/2/3 28/3/3 24/10/3
f 29/1/4 30/4/4 32/3/4 31/2/4
f 33/5/4 35/8/4 36/7/4 34/6/4
f 37/2/5 39/1/5 40/4/5 38/3/5
f 41/8/5 42/7/5 44/6/5 43/5/5
f 49/9/6 47/2/6 48/3/6 50/10/6
f 45/9/6 49/2/6 50/3/6 46/10/6
f 55/9/6 56/3/6 54/10/6 53/2/6
f 51/9/6 52/10/6 56/3/6 55/2/6
f 1/1/7 2/4/7 30/4/7 29/1/7
f 4/3/8 3/2/8 31/2/8 32/3/8
f 2/4/9 4/3/9 32/3/9 30/4/9
f 3/2/10 1/1/10 29/1/10 31/2/10
f 6/6/7 5/5/7 33/5/7 34/6/7
f 7/8/8 8/7/8 36/7/8 35/8/8
f 8/7/10 6/6/10 34/6/10 36/7/10
f 5/5/9 7/8/9 35/8/9 33/5/9
f 10/3/11 9/2/11 37/2/11 38/3/11
f 11/1/12 12/4/12 40/4/12 39/1/12
f 12/4/9 10/3/9 38/3/9 40/4/9
f 9/2/10 11/1/10 39/1/10 37/2/10
f 13/8/11 14/7/11 42/7/11 41/8/11
f 16/6/12 15/5/12 43/5/12 44/6/12
f 14/7/10 16/6/10 44/6/10 42/7/10
f 15/5/9 13/8/9 41/8/9 43/5/9
f 17/9/10 21/2/10 49/2/10 45/9/10
f 18/10/13 17/9/13 45/9/13 46/10/13
f 20/3/9 22/10/9 50/10/9 48/3/9
f 19/2/14 20/3/14 48/3/14 47/2/14
f 21/9/10 19/2/10 47/2/10 49/9/10
f 22/3/9 18/10/9 46/10/9 50/3/9
f 27/2/9 23/9/9 51/9/9 55/2/9
f 23/9/13 24/10/13 52/10/13 51/9/13
f 28/3/10 26/10/10 54/10/10 56/3/10
f 26/10/14 25/2/14 53/2/14 54/10/14
f 25/2/9 27/9/9 55/9/9 53/2/9
f 24/10/10 28/3/10 56/3/10 52/10/10

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B