mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-12 16:27:47 +00:00
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:
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
|
||||
}
|
||||
|
||||
|
||||
+1
-2
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user