1
0
mirror of https://github.com/GeyserMC/Rainbow.git synced 2025-12-19 14:59:16 +00:00

Bedrock geometry codecs

This commit is contained in:
Eclipse
2025-07-04 13:28:54 +00:00
parent dcce9d3722
commit 947c97f7a9
2 changed files with 87 additions and 2 deletions

View File

@@ -5,7 +5,6 @@ import com.google.common.collect.MultimapBuilder;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.component.DataComponents;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.ProblemReporter; import net.minecraft.util.ProblemReporter;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
@@ -18,7 +17,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
public class GeyserMappings { public class GeyserMappings {

View File

@@ -0,0 +1,87 @@
package org.geysermc.packgenerator.pack.geometry;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.Direction;
import net.minecraft.util.ExtraCodecs;
import org.geysermc.packgenerator.pack.BedrockVersion;
import org.joml.Vector2f;
import org.joml.Vector3f;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public record BedrockGeometry(BedrockVersion formatVersion, List<GeometryDefinition> definitions) {
public static final Vector3f VECTOR3F_ZERO = new Vector3f();
public static final Codec<BedrockGeometry> CODEC = RecordCodecBuilder.create(instance ->
instance.group(
BedrockVersion.STRING_CODEC.fieldOf("format_version").forGetter(BedrockGeometry::formatVersion),
GeometryDefinition.CODEC.listOf(1, Integer.MAX_VALUE).fieldOf("minecraft:geometry").forGetter(BedrockGeometry::definitions)
).apply(instance, BedrockGeometry::new)
);
public record GeometryDefinition(GeometryInfo info, List<Bone> bones) {
public static final Codec<GeometryDefinition> CODEC = RecordCodecBuilder.create(instance ->
instance.group(
GeometryInfo.CODEC.fieldOf("description").forGetter(GeometryDefinition::info),
Bone.CODEC.listOf().optionalFieldOf("bones", List.of()).forGetter(GeometryDefinition::bones)
).apply(instance, GeometryDefinition::new)
);
}
public record GeometryInfo(String identifier, Optional<Float> visibleBoundsWidth, Optional<Float> visibleBoundsHeight, Optional<Vector3f> visibleBoundsOffset,
Optional<Integer> textureWidth, Optional<Integer> textureHeight) {
public static final Codec<GeometryInfo> CODEC = RecordCodecBuilder.create(instance ->
instance.group(
Codec.STRING.fieldOf("identifier").forGetter(GeometryInfo::identifier),
Codec.FLOAT.optionalFieldOf("visible_bounds_width").forGetter(GeometryInfo::visibleBoundsWidth),
Codec.FLOAT.optionalFieldOf("visible_bounds_height").forGetter(GeometryInfo::visibleBoundsHeight),
ExtraCodecs.VECTOR3F.optionalFieldOf("visible_bounds_offset").forGetter(GeometryInfo::visibleBoundsOffset),
Codec.INT.optionalFieldOf("texture_width").forGetter(GeometryInfo::textureWidth),
Codec.INT.optionalFieldOf("texture_height").forGetter(GeometryInfo::textureHeight)
).apply(instance, GeometryInfo::new)
);
}
public record Bone(String name, Optional<String> parent, Vector3f pivot, Vector3f rotation, boolean mirror,
float inflate, List<Cube> cubes) {
public static final Codec<Bone> CODEC = RecordCodecBuilder.create(instance ->
instance.group(
Codec.STRING.fieldOf("name").forGetter(Bone::name),
Codec.STRING.optionalFieldOf("parent").forGetter(Bone::parent),
ExtraCodecs.VECTOR3F.optionalFieldOf("pivot", VECTOR3F_ZERO).forGetter(Bone::pivot),
ExtraCodecs.VECTOR3F.optionalFieldOf("rotation", VECTOR3F_ZERO).forGetter(Bone::rotation),
Codec.BOOL.optionalFieldOf("mirror", false).forGetter(Bone::mirror),
Codec.FLOAT.optionalFieldOf("inflate", 0.0F).forGetter(Bone::inflate),
Cube.CODEC.listOf().optionalFieldOf("cubes", List.of()).forGetter(Bone::cubes)
).apply(instance, Bone::new)
);
}
public record Cube(Vector3f origin, Vector3f size, Vector3f rotation, Vector3f pivot, float inflate, boolean mirror,
Map<Direction, Face> faces) {
private static final Codec<Map<Direction, Face>> FACE_MAP_CODEC = Codec.unboundedMap(Direction.CODEC, Face.CODEC);
public static final Codec<Cube> CODEC = RecordCodecBuilder.create(instance ->
instance.group(
ExtraCodecs.VECTOR3F.fieldOf("origin").forGetter(Cube::origin),
ExtraCodecs.VECTOR3F.fieldOf("size").forGetter(Cube::size),
ExtraCodecs.VECTOR3F.optionalFieldOf("rotation", VECTOR3F_ZERO).forGetter(Cube::size),
ExtraCodecs.VECTOR3F.optionalFieldOf("pivot", VECTOR3F_ZERO).forGetter(Cube::pivot),
Codec.FLOAT.optionalFieldOf("inflate", 0.0F).forGetter(Cube::inflate),
Codec.BOOL.optionalFieldOf("mirror", false).forGetter(Cube::mirror),
FACE_MAP_CODEC.optionalFieldOf("uv", Map.of()).forGetter(Cube::faces)
).apply(instance, Cube::new)
);
}
public record Face(Vector2f origin, Vector2f size) {
public static final Codec<Face> CODEC = RecordCodecBuilder.create(instance ->
instance.group(
ExtraCodecs.VECTOR2F.fieldOf("uv").forGetter(Face::origin),
ExtraCodecs.VECTOR2F.fieldOf("uv_size").forGetter(Face::size)
).apply(instance, Face::new)
);
}
}