Make TransformType enum extensible, includes the possibility to specify a fallback type for cases where models don't specify the transform explicitly. (#8566)

Makes it possible to add new perspectives.
This commit is contained in:
gigaherz authored and GitHub committed 2022-05-22 17:55:48 +01:00
1 parent aded6fb847
commit 4c09d8d774
19 files changed
+593 -61

No files matched your search

@@ -214,18 +214,18 @@ public class ModelLoaderRegistry
JsonObject transform = transformData.getAsJsonObject();
EnumMap<ItemTransforms.TransformType, Transformation> transforms = Maps.newEnumMap(ItemTransforms.TransformType.class);
deserializeTRSR(context, transforms, transform, "thirdperson", ItemTransforms.TransformType.THIRD_PERSON_RIGHT_HAND);
deserializeTRSR(context, transforms, transform, "thirdperson_righthand", ItemTransforms.TransformType.THIRD_PERSON_RIGHT_HAND);
deserializeTRSR(context, transforms, transform, "thirdperson_lefthand", ItemTransforms.TransformType.THIRD_PERSON_LEFT_HAND);
deserializeTRSR(context, transforms, transform, "firstperson", ItemTransforms.TransformType.FIRST_PERSON_RIGHT_HAND);
deserializeTRSR(context, transforms, transform, "firstperson_righthand", ItemTransforms.TransformType.FIRST_PERSON_RIGHT_HAND);
deserializeTRSR(context, transforms, transform, "firstperson_lefthand", ItemTransforms.TransformType.FIRST_PERSON_LEFT_HAND);
deserializeTRSR(context, transforms, transform, "head", ItemTransforms.TransformType.HEAD);
deserializeTRSR(context, transforms, transform, "gui", ItemTransforms.TransformType.GUI);
deserializeTRSR(context, transforms, transform, "ground", ItemTransforms.TransformType.GROUND);
deserializeTRSR(context, transforms, transform, "fixed", ItemTransforms.TransformType.FIXED);
for (var type : ItemTransforms.TransformType.values())
{
var fallbackType = type;
while (fallbackType.fallback() != null && !transform.has(fallbackType.getSerializeName())) {
fallbackType = fallbackType.fallback();
}
if(transform.has(fallbackType.getSerializeName()))
{
Transformation t = context.deserialize(transform.remove(fallbackType.getSerializeName()), Transformation.class);
transforms.put(type, t.blockCenterToCorner());
}
}
int k = transform.entrySet().size();
if(transform.has("matrix")) k--;
@@ -236,7 +236,8 @@ public class ModelLoaderRegistry
if(transform.has("origin")) k--;
if(k > 0)
{
throw new JsonParseException("transform: allowed keys: 'thirdperson', 'firstperson', 'gui', 'head', 'matrix', 'translation', 'rotation', 'scale', 'post-rotation', 'origin'");
throw new JsonParseException("transform: allowed keys: 'matrix', 'translation', 'rotation', 'scale', 'post-rotation', 'origin', "
+ Arrays.stream(ItemTransforms.TransformType.values()).map(v -> "'" + v.getSerializeName() + "'").collect(Collectors.joining(", ")));
}
Transformation base = Transformation.identity();
if(!transform.entrySet().isEmpty())
@@ -248,15 +249,6 @@ public class ModelLoaderRegistry
}
}
private static void deserializeTRSR(JsonDeserializationContext context, EnumMap<ItemTransforms.TransformType, Transformation> transforms, JsonObject transform, String name, ItemTransforms.TransformType itemCameraTransform)
{
if(transform.has(name))
{
Transformation t = context.deserialize(transform.remove(name), Transformation.class);
transforms.put(itemCameraTransform, t.blockCenterToCorner());
}
}
public static BakedModel bakeHelper(BlockModel blockModel, ModelBakery modelBakery, BlockModel otherModel, Function<Material, TextureAtlasSprite> spriteGetter, ModelState modelTransform, ResourceLocation modelLocation, boolean guiLight3d)
{
BakedModel model;
@@ -163,6 +163,7 @@ public class SeparatePerspectiveModel implements IModelGeometry<SeparatePerspect
{
public static final Loader INSTANCE = new Loader();
@Deprecated(forRemoval = true, since = "1.18.2")
public static final ImmutableBiMap<String, ItemTransforms.TransformType> PERSPECTIVES = ImmutableBiMap.<String, ItemTransforms.TransformType>builder()
.put("none", ItemTransforms.TransformType.NONE)
.put("third_person_left_hand", ItemTransforms.TransformType.THIRD_PERSON_LEFT_HAND)
@@ -175,6 +176,14 @@ public class SeparatePerspectiveModel implements IModelGeometry<SeparatePerspect
.put("fixed", ItemTransforms.TransformType.FIXED)
.build();
@Deprecated(forRemoval = true, since = "1.18.2")
private static final ImmutableBiMap<String, ItemTransforms.TransformType> BACKWARD_COMPATIBILITY = ImmutableBiMap.<String, ItemTransforms.TransformType>builder()
.put("third_person_left_hand", ItemTransforms.TransformType.THIRD_PERSON_LEFT_HAND)
.put("third_person_right_hand", ItemTransforms.TransformType.THIRD_PERSON_RIGHT_HAND)
.put("first_person_left_hand", ItemTransforms.TransformType.FIRST_PERSON_LEFT_HAND)
.put("first_person_right_hand", ItemTransforms.TransformType.FIRST_PERSON_RIGHT_HAND)
.build();
@Override
public void onResourceManagerReload(final ResourceManager p_10758_) {
@@ -187,17 +196,25 @@ public class SeparatePerspectiveModel implements IModelGeometry<SeparatePerspect
JsonObject perspectiveData = GsonHelper.getAsJsonObject(modelContents, "perspectives");
ImmutableMap.Builder<ItemTransforms.TransformType, BlockModel> perspectives = ImmutableMap.builder();
for(Map.Entry<String, ItemTransforms.TransformType> perspective : PERSPECTIVES.entrySet())
Map<ItemTransforms.TransformType, BlockModel> perspectives = new HashMap<>();
for(Map.Entry<String, ItemTransforms.TransformType> entry : BACKWARD_COMPATIBILITY.entrySet())
{
if (perspectiveData.has(perspective.getKey()))
if (perspectiveData.has(entry.getKey()))
{
BlockModel perspectiveModel = deserializationContext.deserialize(GsonHelper.getAsJsonObject(perspectiveData, perspective.getKey()), BlockModel.class);
perspectives.put(perspective.getValue(), perspectiveModel);
BlockModel perspectiveModel = deserializationContext.deserialize(GsonHelper.getAsJsonObject(perspectiveData, entry.getKey()), BlockModel.class);
perspectives.put(entry.getValue(), perspectiveModel);
}
}
for(ItemTransforms.TransformType perspective : ItemTransforms.TransformType.values())
{
if (perspectiveData.has(perspective.getSerializeName()))
{
BlockModel perspectiveModel = deserializationContext.deserialize(GsonHelper.getAsJsonObject(perspectiveData, perspective.getSerializeName()), BlockModel.class);
perspectives.put(perspective, perspectiveModel);
}
}
return new SeparatePerspectiveModel(baseModel, perspectives.build());
return new SeparatePerspectiveModel(baseModel, ImmutableMap.copyOf(perspectives));
}
}
}
@@ -8,6 +8,8 @@ package net.minecraftforge.client.model.generators;
import javax.annotation.Nonnull;
import net.minecraft.data.DataGenerator;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraftforge.common.data.ExistingFileHelper;
/**
@@ -20,6 +22,18 @@ public abstract class ItemModelProvider extends ModelProvider<ItemModelBuilder>
super(generator, modid, ITEM_FOLDER, ItemModelBuilder::new, existingFileHelper);
}
public ItemModelBuilder basicItem(Item item)
{
return basicItem(item.getRegistryName());
}
public ItemModelBuilder basicItem(ResourceLocation item)
{
return getBuilder(item.toString())
.parent(new ModelFile.UncheckedModelFile("item/generated"))
.texture("layer0", new ResourceLocation(item.getNamespace(), "item/" + item.getPath()));
}
@Nonnull
@Override
public String getName() {
@@ -214,10 +214,10 @@ public class ModelBuilder<T extends ModelBuilder<T>> extends ModelFile {
root.addProperty("gui_light", this.guiLight.getSerializedName());
}
Map<Perspective, ItemTransform> transforms = this.transforms.build();
Map<TransformType, ItemTransform> transforms = this.transforms.build();
if (!transforms.isEmpty()) {
JsonObject display = new JsonObject();
for (Entry<Perspective, ItemTransform> e : transforms.entrySet()) {
for (Entry<TransformType, ItemTransform> e : transforms.entrySet()) {
JsonObject transform = new JsonObject();
ItemTransform vec = e.getValue();
if (vec.equals(ItemTransform.NO_TRANSFORM)) continue;
@@ -230,7 +230,7 @@ public class ModelBuilder<T extends ModelBuilder<T>> extends ModelFile {
if (!vec.scale.equals(ItemTransform.Deserializer.DEFAULT_SCALE)) {
transform.add("scale", serializeVector3f(e.getValue().scale));
}
display.add(e.getKey().name, transform);
display.add(e.getKey().getSerializeName(), transform);
}
root.add("display", display);
}
@@ -599,6 +599,7 @@ public class ModelBuilder<T extends ModelBuilder<T>> extends ModelFile {
}
// Since vanilla doesn't keep the name in TransformType...
@Deprecated(forRemoval = true, since = "1.18.2")
public enum Perspective {
THIRDPERSON_RIGHT(TransformType.THIRD_PERSON_RIGHT_HAND, "thirdperson_righthand"),
@@ -622,7 +623,21 @@ public class ModelBuilder<T extends ModelBuilder<T>> extends ModelFile {
public class TransformsBuilder {
private final Map<Perspective, TransformVecBuilder> transforms = new LinkedHashMap<>();
private final Map<TransformType, TransformVecBuilder> transforms = new LinkedHashMap<>();
/**
* Begin building a new transform for the given perspective.
*
* @param type the perspective to create or return the builder for
* @return the builder for the given perspective
* @throws NullPointerException if {@code type} is {@code null}
*
* @deprecated See {@link #transform(TransformType)}
*/
@Deprecated(forRemoval = true, since = "1.18.2")
public TransformVecBuilder transform(Perspective type) {
return transform(type.vanillaType);
}
/**
* Begin building a new transform for the given perspective.
@@ -631,12 +646,12 @@ public class ModelBuilder<T extends ModelBuilder<T>> extends ModelFile {
* @return the builder for the given perspective
* @throws NullPointerException if {@code type} is {@code null}
*/
public TransformVecBuilder transform(Perspective type) {
public TransformVecBuilder transform(TransformType type) {
Preconditions.checkNotNull(type, "Perspective cannot be null");
return transforms.computeIfAbsent(type, TransformVecBuilder::new);
}
Map<Perspective, ItemTransform> build() {
Map<TransformType, ItemTransform> build() {
return this.transforms.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().build(), (k1, k2) -> { throw new IllegalArgumentException(); }, LinkedHashMap::new));
}
@@ -649,7 +664,7 @@ public class ModelBuilder<T extends ModelBuilder<T>> extends ModelFile {
private Vector3f translation = ItemTransform.Deserializer.DEFAULT_TRANSLATION.copy();
private Vector3f scale = ItemTransform.Deserializer.DEFAULT_SCALE.copy();
TransformVecBuilder(Perspective type) {
TransformVecBuilder(TransformType type) {
// param unused for functional match
}
@@ -42,9 +42,8 @@ public class SeparatePerspectiveModelBuilder<T extends ModelBuilder<T>> extends
public SeparatePerspectiveModelBuilder<T> perspective(ItemTransforms.TransformType perspective, T modelBuilder)
{
Preconditions.checkNotNull(perspective, "layer must not be null");
Preconditions.checkArgument(SeparatePerspectiveModel.Loader.PERSPECTIVES.containsValue(perspective), "perspective is not included in SeparatePerspectiveModel. New mc version?");
Preconditions.checkNotNull(modelBuilder, "modelBuilder must not be null");
childModels.put(SeparatePerspectiveModel.Loader.PERSPECTIVES.inverse().get(perspective), modelBuilder);
childModels.put(perspective.getSerializeName(), modelBuilder);
return this;
}