mirror of
https://github.com/GeyserMC/Rainbow.git
synced 2025-12-19 14:59:16 +00:00
Bedrock geometry mapper
This commit is contained in:
@@ -0,0 +1,64 @@
|
|||||||
|
package org.geysermc.packgenerator.mapping.geometry;
|
||||||
|
|
||||||
|
import net.minecraft.client.renderer.block.model.BlockElement;
|
||||||
|
import net.minecraft.client.renderer.block.model.BlockElementFace;
|
||||||
|
import net.minecraft.client.renderer.block.model.BlockElementRotation;
|
||||||
|
import net.minecraft.client.renderer.block.model.SimpleUnbakedGeometry;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
|
import org.geysermc.packgenerator.pack.geometry.BedrockGeometry;
|
||||||
|
import org.joml.Vector2f;
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class GeometryMapper {
|
||||||
|
|
||||||
|
public static BedrockGeometry mapGeometry(String identifier, SimpleUnbakedGeometry geometry) {
|
||||||
|
BedrockGeometry.Builder builder = BedrockGeometry.builder(identifier);
|
||||||
|
BedrockGeometry.Bone.Builder bone = BedrockGeometry.bone(identifier);
|
||||||
|
|
||||||
|
for (BlockElement element : geometry.elements()) {
|
||||||
|
bone.withCube(mapBlockElement(element));
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO texture size, etc.
|
||||||
|
return builder.withBone(bone).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static BedrockGeometry.Cube.Builder mapBlockElement(BlockElement element) {
|
||||||
|
BedrockGeometry.Cube.Builder builder = BedrockGeometry.cube(new Vector3f(element.from()), element.to().sub(element.from(), new Vector3f()));
|
||||||
|
|
||||||
|
for (Map.Entry<Direction, BlockElementFace> faceEntry : element.faces().entrySet()) {
|
||||||
|
// TODO texture key
|
||||||
|
Direction direction = faceEntry.getKey();
|
||||||
|
BlockElementFace face = faceEntry.getValue();
|
||||||
|
|
||||||
|
Vector2f uvOrigin;
|
||||||
|
Vector2f uvSize;
|
||||||
|
BlockElementFace.UVs uvs = face.uvs();
|
||||||
|
if (uvs != null) {
|
||||||
|
uvOrigin = new Vector2f(uvs.minU(), uvs.minV());
|
||||||
|
uvSize = new Vector2f(uvs.maxU() - uvs.minU(), uvs.maxV() - uvs.minV());
|
||||||
|
} else {
|
||||||
|
uvOrigin = new Vector2f();
|
||||||
|
uvSize = new Vector2f();
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.withFace(direction, uvOrigin, uvSize, face.rotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockElementRotation rotation = element.rotation();
|
||||||
|
if (rotation != null) {
|
||||||
|
builder.withPivot(rotation.origin());
|
||||||
|
|
||||||
|
Vector3f bedrockRotation = switch (rotation.axis()) {
|
||||||
|
case X -> new Vector3f(rotation.angle(), 0.0F, 0.0F);
|
||||||
|
case Y -> new Vector3f(0.0F, rotation.angle(), 0.0F);
|
||||||
|
case Z -> new Vector3f(0.0F, 0.0F, rotation.angle());
|
||||||
|
};
|
||||||
|
builder.withRotation(bedrockRotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.geysermc.packgenerator.pack.geometry;
|
package org.geysermc.packgenerator.pack.geometry;
|
||||||
|
|
||||||
|
import com.mojang.math.Quadrant;
|
||||||
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.Direction;
|
import net.minecraft.core.Direction;
|
||||||
@@ -247,25 +248,30 @@ public record BedrockGeometry(BedrockVersion formatVersion, List<GeometryDefinit
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder withFace(Direction direction, Vector2f uvOrigin, Vector2f uvSize) {
|
public Builder withFace(Direction direction, Vector2f uvOrigin, Vector2f uvSize, Quadrant uvRotation) {
|
||||||
if (faces.containsKey(direction)) {
|
if (faces.containsKey(direction)) {
|
||||||
throw new IllegalArgumentException("Already added a face for direction " + direction);
|
throw new IllegalArgumentException("Already added a face for direction " + direction);
|
||||||
}
|
}
|
||||||
faces.put(direction, new Face(uvOrigin, uvSize));
|
faces.put(direction, new Face(uvOrigin, uvSize, uvRotation));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder withFace(Direction direction, Vector2f uvOrigin, Vector2f uvSize) {
|
||||||
|
return withFace(direction, uvOrigin, uvSize, Quadrant.R0);
|
||||||
|
}
|
||||||
|
|
||||||
public Cube build() {
|
public Cube build() {
|
||||||
return new Cube(origin, size, rotation, pivot, inflate, mirror, Map.copyOf(faces));
|
return new Cube(origin, size, rotation, pivot, inflate, mirror, Map.copyOf(faces));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public record Face(Vector2f uvOrigin, Vector2f uvSize) {
|
public record Face(Vector2f uvOrigin, Vector2f uvSize, Quadrant uvRotation) {
|
||||||
public static final Codec<Face> CODEC = RecordCodecBuilder.create(instance ->
|
public static final Codec<Face> CODEC = RecordCodecBuilder.create(instance ->
|
||||||
instance.group(
|
instance.group(
|
||||||
ExtraCodecs.VECTOR2F.fieldOf("uv").forGetter(Face::uvOrigin),
|
ExtraCodecs.VECTOR2F.fieldOf("uv").forGetter(Face::uvOrigin),
|
||||||
ExtraCodecs.VECTOR2F.fieldOf("uv_size").forGetter(Face::uvSize)
|
ExtraCodecs.VECTOR2F.fieldOf("uv_size").forGetter(Face::uvSize),
|
||||||
|
Quadrant.CODEC.optionalFieldOf("uv_rotation", Quadrant.R0).forGetter(Face::uvRotation)
|
||||||
).apply(instance, Face::new)
|
).apply(instance, Face::new)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user