Fix bucket model. Some mask textures were not added to the repository, and the bucket override generation was broken.

Fix OBJ loading crash due to a float value being parsed as int.
Fixes 6377
This commit is contained in:
David Quintana committed 2019-12-20 02:44:27 +01:00
1 parent 40de19f16e
commit 503d277033
15 files changed
+70 -82

No files matched your search

@@ -19,17 +19,18 @@
package net.minecraftforge.client.model;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.mojang.datafixers.util.Pair;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.model.*;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraftforge.client.model.geometry.IModelGeometry;
import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.geometry.IModelGeometry;
import net.minecraftforge.client.model.pipeline.IVertexConsumer;
import net.minecraftforge.client.model.pipeline.TRSRTransformer;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
@@ -38,12 +39,10 @@ import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.EnumMap;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
/**
* Forge reimplementation of vanilla {@link ItemModelGenerator}, i.e. builtin/generated models,
* with the following changes:
@@ -86,19 +85,24 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function<Material, TextureAtlasSprite> spriteGetter, IModelTransform sprite, ItemOverrideList overrides, ResourceLocation modelLocation)
{
//TODO: Verify
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
TransformationMatrix transform = sprite.func_225615_b_();
boolean identity = transform.isIdentity();
for(int i = 0; i < textures.size(); i++)
{
TextureAtlasSprite tas = spriteGetter.apply(textures.get(i));
builder.addAll(getQuadsForSprite(i, tas, DefaultVertexFormats.BLOCK, transform));
}
ImmutableList<BakedQuad> quads = getQuadsForSprites(textures, DefaultVertexFormats.BLOCK, transform, spriteGetter);
TextureAtlasSprite particle = spriteGetter.apply(
owner.isTexturePresent("particle") ? owner.resolveTexture("particle") : textures.get(0)
);
ImmutableMap<TransformType, TransformationMatrix> map = PerspectiveMapWrapper.getTransforms(sprite);
return new BakedItemModel(builder.build(), particle, map, overrides, identity);
return new BakedItemModel(quads, particle, map, overrides, transform.isIdentity());
}
public static ImmutableList<BakedQuad> getQuadsForSprites(List<Material> textures, VertexFormat format, TransformationMatrix transform, Function<Material, TextureAtlasSprite> spriteGetter)
{
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
for(int i = 0; i < textures.size(); i++)
{
TextureAtlasSprite tas = spriteGetter.apply(textures.get(i));
builder.addAll(getQuadsForSprite(i, tas, format, transform));
}
return builder.build();
}
public static ImmutableList<BakedQuad> getQuadsForSprite(int tint, TextureAtlasSprite sprite, VertexFormat format, TransformationMatrix transform)
@@ -19,13 +19,10 @@
package net.minecraftforge.client.model;
import java.io.IOException;
import java.util.*;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.google.common.collect.*;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject;
import com.mojang.datafixers.util.Pair;
@@ -34,7 +31,9 @@ import net.minecraft.client.renderer.Quaternion;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.model.*;
import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.texture.*;
import net.minecraft.client.renderer.texture.MissingTextureSprite;
import net.minecraft.client.renderer.texture.PngSizeInfo;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.entity.LivingEntity;
@@ -48,19 +47,23 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.geometry.IModelGeometry;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.resource.IResourceType;
import net.minecraftforge.resource.VanillaResourceType;
import net.minecraftforge.versions.forge.ForgeVersion;
import net.minecraftforge.common.model.TransformationHelper;
import net.minecraftforge.fluids.FluidUtil;
import java.util.function.Function;
import java.util.function.Predicate;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
public final class ModelDynBucket implements IModelGeometry<ModelDynBucket>
{
private static final Logger LOGGER = LogManager.getLogger();
@@ -123,7 +126,7 @@ public final class ModelDynBucket implements IModelGeometry<ModelDynBucket>
}
@Override
public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function<Material, TextureAtlasSprite> spriteGetter, IModelTransform sprite, ItemOverrideList overrides, ResourceLocation modelLocation)
public IBakedModel bake(IModelConfiguration owner, ModelBakery bakery, Function<Material, TextureAtlasSprite> spriteGetter, IModelTransform modelTransform, ItemOverrideList overrides, ResourceLocation modelLocation)
{
Material particleLocation = owner.resolveTexture("particle");
if (MissingTextureSprite.getLocation().toString().equals(particleLocation))
@@ -152,35 +155,30 @@ public final class ModelDynBucket implements IModelGeometry<ModelDynBucket>
IModelTransform transformsFromModel = owner.getCombinedTransform();
IModelTransform state = sprite;
ImmutableMap<TransformType, TransformationMatrix> transformMap = transformsFromModel != null ?
PerspectiveMapWrapper.getTransforms(new ModelTransformComposition(transformsFromModel, state)) :
PerspectiveMapWrapper.getTransforms(state);
PerspectiveMapWrapper.getTransforms(new ModelTransformComposition(transformsFromModel, modelTransform)) :
PerspectiveMapWrapper.getTransforms(modelTransform);
TextureAtlasSprite particleSprite = particleLocation != null ? spriteGetter.apply(particleLocation) : null;
// if the fluid is lighter than air, will manipulate the initial state to be rotated 180deg to turn it upside down
if (flipGas && fluid != Fluids.EMPTY && fluid.getAttributes().isLighterThanAir())
{
sprite = new ModelTransformComposition(state, new SimpleModelTransform(new TransformationMatrix(null, new Quaternion(0, 0, 1, 0), null, null).blockCenterToCorner()));
state = sprite;
modelTransform = new ModelTransformComposition(modelTransform, new SimpleModelTransform(new TransformationMatrix(null, new Quaternion(0, 0, 1, 0), null, null)));
}
TransformationMatrix transform = state.func_225615_b_();
TransformationMatrix transform = modelTransform.func_225615_b_();
TextureAtlasSprite fluidSprite = fluid != Fluids.EMPTY ? spriteGetter.apply(ForgeHooksClient.getBlockMaterial(fluid.getAttributes().getStillTexture())) : null;
if (particleSprite == null) particleSprite = fluidSprite;
Random random = new Random();
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
if (baseLocation != null)
{
// build base (insidest)
IBakedModel model = new ItemLayerModel(ImmutableList.of(baseLocation)).bake(owner, bakery, spriteGetter, sprite, ItemOverrideList.EMPTY, modelLocation);
random.setSeed(42);
builder.addAll(model.getQuads(null, null, random));
builder.addAll(ItemLayerModel.getQuadsForSprites(ImmutableList.of(baseLocation), DefaultVertexFormats.BLOCK, transform, spriteGetter));
}
if (fluidMaskLocation != null && fluidSprite != null)
@@ -218,7 +216,7 @@ public final class ModelDynBucket implements IModelGeometry<ModelDynBucket>
}
}
return new BakedDynBucket(bakery, owner, this, builder.build(), particleSprite, DefaultVertexFormats.BLOCK, Maps.immutableEnumMap(transformMap), Maps.newHashMap(), transform.isIdentity());
return new BakedDynBucket(bakery, owner, this, builder.build(), particleSprite, DefaultVertexFormats.BLOCK, Maps.immutableEnumMap(transformMap), Maps.newHashMap(), transform.isIdentity(), modelTransform);
}
@Override
@@ -418,7 +416,7 @@ public final class ModelDynBucket implements IModelGeometry<ModelDynBucket>
if (!model.cache.containsKey(name))
{
ModelDynBucket parent = model.parent.withFluid(fluid);
IBakedModel bakedModel = parent.bake(model.owner, bakery, ModelLoader.defaultTextureGetter(), new SimpleModelTransform(model.transforms), model.getOverrides(), new ResourceLocation("forge:bucket_override"));
IBakedModel bakedModel = parent.bake(model.owner, bakery, ModelLoader.defaultTextureGetter(), model.originalTransform, model.getOverrides(), new ResourceLocation("forge:bucket_override"));
model.cache.put(name, bakedModel);
return bakedModel;
}
@@ -437,6 +435,7 @@ public final class ModelDynBucket implements IModelGeometry<ModelDynBucket>
private final ModelDynBucket parent;
private final Map<String, IBakedModel> cache; // contains all the baked models since they'll never change
private final VertexFormat format;
private final IModelTransform originalTransform;
BakedDynBucket(ModelBakery bakery,
IModelConfiguration owner, ModelDynBucket parent,
@@ -445,13 +444,15 @@ public final class ModelDynBucket implements IModelGeometry<ModelDynBucket>
VertexFormat format,
ImmutableMap<TransformType, TransformationMatrix> transforms,
Map<String, IBakedModel> cache,
boolean untransformed)
boolean untransformed,
IModelTransform originalTransform)
{
super(quads, particle, transforms, new BakedDynBucketOverrideHandler(bakery), untransformed);
this.owner = owner;
this.format = format;
this.parent = parent;
this.cache = cache;
this.originalTransform = originalTransform;
}
}
@@ -77,7 +77,7 @@ public class PerspectiveMapWrapper implements IBakedModel
{
if (transforms.hasCustomTransform(type))
{
map.put(type, TransformationHelper.toTransformation(transforms.getTransform(type)).blockCenterToCorner());
map.put(type, TransformationHelper.toTransformation(transforms.getTransform(type)));
}
}
return ImmutableMap.copyOf(map);
@@ -96,7 +96,7 @@ public class PerspectiveMapWrapper implements IBakedModel
}
else if (transforms.hasCustomTransform(type))
{
map.put(type, TransformationHelper.toTransformation(transforms.getTransform(type)).blockCenterToCorner());
map.put(type, TransformationHelper.toTransformation(transforms.getTransform(type)));
}
}
return ImmutableMap.copyOf(map);
@@ -107,9 +107,7 @@ public class PerspectiveMapWrapper implements IBakedModel
TransformationMatrix tr = transforms.getOrDefault(cameraTransformType, TransformationMatrix.func_227983_a_());
if (!tr.isIdentity())
{
// Push to the matrix to make it not empty and indicate that we want to transform things
mat.func_227860_a_();
mat.func_227866_c_().func_227870_a_().func_226595_a_(tr.blockCornerToCenter().func_227988_c_());
tr.push(mat);
}
return model;
}
@@ -119,9 +117,7 @@ public class PerspectiveMapWrapper implements IBakedModel
TransformationMatrix tr = state.getPartTransformation(cameraTransformType);
if (!tr.isIdentity())
{
// Push to the matrix to make it not empty and indicate that we want to transform things
mat.func_227860_a_();
mat.func_227866_c_().func_227870_a_().func_226595_a_(tr.blockCornerToCenter().func_227988_c_());
tr.push(mat);
}
return model;
}
@@ -49,7 +49,7 @@ public class QuadTransformer
private void processVertices(int[] inData, int[] outData)
{
// TODO: Extract rotation matrix and fix NORMALs if present.
int stride = format.getSize() / 4;
int stride = format.getIntegerSize();
for (int i=0;i<4;i++)
{
int offset = positionOffset + i * stride;
@@ -75,7 +75,7 @@ public class MaterialLibrary
break;
case "Ns":
currentMaterial.specularHighlight = Integer.parseInt(line[1]);
currentMaterial.specularHighlight = Float.parseFloat(line[1]);
break;
case "map_Ks":
@@ -58,7 +58,7 @@ public class UnpackedBakedQuad extends BakedQuad
return vertexData;
}
//@Override
@Override
public void pipe(IVertexConsumer consumer)
{
int[] eMap = LightUtil.mapFormats(consumer.getVertexFormat(), format);