From a799bbad2d2073400c5c9f327b4a07fe8dbe13da Mon Sep 17 00:00:00 2001 From: RainWarrior Date: Sun, 13 Mar 2016 12:10:50 +0300 Subject: [PATCH] First version of updated of ModelLoader, mostly works. --- .../block/model/ModelBakery.java.patch | 9 ++- .../block/model/ModelManager.java.patch | 7 +- .../client/ForgeHooksClient.java | 13 ++-- .../client/model/ForgeBlockStateV1.java | 63 ++++++++------- .../client/model/ModelLoader.java | 41 ++++++---- .../client/model/MultiModel.java | 3 +- .../client/model/TRSRTransformation.java | 78 +++++++++++++++---- src/main/resources/forge_at.cfg | 6 ++ .../debug/ModelAnimationDebug.java | 2 +- 9 files changed, 147 insertions(+), 75 deletions(-) diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/ModelBakery.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/ModelBakery.java.patch index 58f3083416..bdacc607fe 100644 --- a/patches/minecraft/net/minecraft/client/renderer/block/model/ModelBakery.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/ModelBakery.java.patch @@ -1,6 +1,13 @@ --- ../src-base/minecraft/net/minecraft/client/renderer/block/model/ModelBakery.java +++ ../src-work/minecraft/net/minecraft/client/renderer/block/model/ModelBakery.java -@@ -132,7 +132,7 @@ +@@ -126,13 +126,13 @@ + { + try + { +- this.field_177612_i.put(modelresourcelocation, modelblockdefinition.func_188004_c(modelresourcelocation.func_177518_c())); ++ this.func_177569_a(modelblockdefinition, modelresourcelocation); + } + catch (RuntimeException var12) { if (!modelblockdefinition.func_188002_b()) { diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/ModelManager.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/ModelManager.java.patch index c64c3804fb..b05f5c139c 100644 --- a/patches/minecraft/net/minecraft/client/renderer/block/model/ModelManager.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/ModelManager.java.patch @@ -1,15 +1,14 @@ --- ../src-base/minecraft/net/minecraft/client/renderer/block/model/ModelManager.java +++ ../src-work/minecraft/net/minecraft/client/renderer/block/model/ModelManager.java -@@ -24,9 +24,11 @@ +@@ -24,9 +24,10 @@ public void func_110549_a(IResourceManager p_110549_1_) { - ModelBakery modelbakery = new ModelBakery(p_110549_1_, this.field_174956_b, this.field_174957_c); -+ // FIXME: reenable after ModelLoader is fixed -+ ModelBakery modelbakery = new ModelBakery(p_110549_1_, this.field_174956_b, this.field_174957_c); //new net.minecraftforge.client.model.ModelLoader(resourceManager, this.texMap, this.modelProvider); ++ net.minecraftforge.client.model.ModelLoader modelbakery = new net.minecraftforge.client.model.ModelLoader(p_110549_1_, this.field_174956_b, this.field_174957_c); this.field_174958_a = modelbakery.func_177570_a(); this.field_174955_d = (IBakedModel)this.field_174958_a.func_82594_a(ModelBakery.field_177604_a); -+ //net.minecraftforge.client.ForgeHooksClient.onModelBake(this, this.modelRegistry, modelbakery); ++ net.minecraftforge.client.ForgeHooksClient.onModelBake(this, this.field_174958_a, modelbakery); this.field_174957_c.func_178124_c(); } diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index 45f830adef..3b6096a8a7 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -395,13 +395,16 @@ public class ForgeHooksClient { Pair pair = ((IPerspectiveAwareModel)model).handlePerspective(cameraTransformType); - Matrix4f matrix = new Matrix4f(pair.getRight()); - if(leftHandHackery) + if(pair.getRight() != null) { - matrix.mul(flipX, matrix); - matrix.mul(matrix, flipX); + Matrix4f matrix = new Matrix4f(pair.getRight()); + if(leftHandHackery) + { + matrix.mul(flipX, matrix); + matrix.mul(matrix, flipX); + } + if(pair.getRight() != null) multiplyCurrentGlMatrix(pair.getRight()); } - if(pair.getRight() != null) multiplyCurrentGlMatrix(pair.getRight()); return pair.getLeft(); } else diff --git a/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java b/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java index 95d871d17e..e178bc33aa 100644 --- a/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java +++ b/src/main/java/net/minecraftforge/client/model/ForgeBlockStateV1.java @@ -435,6 +435,15 @@ public class ForgeBlockStateV1 extends Marker throw new UnsupportedOperationException("Forge BlockStateLoader V1 does not support nested submodels."); } + private TRSRTransformation get(float tx, float ty, float tz, float ax, float ay, float az, float s) + { + return TRSRTransformation.blockCenterToCorner(new TRSRTransformation( + new Vector3f(tx / 16, ty / 16, tz / 16), + TRSRTransformation.quatFromXYZDegrees(new Vector3f(ax, ay, az)), + new Vector3f(s, s, s), + null)); + } + @Override public ForgeBlockStateV1.Variant deserialize(JsonElement element, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { @@ -476,47 +485,41 @@ public class ForgeBlockStateV1 extends Marker { String transform = json.get("transform").getAsString(); // Note: these strings might change to a full-blown resource locations in the future, and move from here to some json somewhere + // TODO: vanilla now includes from parent, deprecate? if (transform.equals("identity")) { ret.state = Optional.of(TRSRTransformation.identity()); } - /*else if (transform.equals("forge:default-block")) + // block/block + else if (transform.equals("forge:default-block")) { - TRSRTransformation thirdperson = TRSRTransformation.blockCenterToCorner(new TRSRTransformation( - new Vector3f(0, 1.5f / 16, -2.75f / 16), - TRSRTransformation.quatFromYXZDegrees(new Vector3f(10, -45, 170)), - new Vector3f(0.375f, 0.375f, 0.375f), - null)); - ret.state = Optional.of(new SimpleModelState(ImmutableMap.of(TransformType.THIRD_PERSON, thirdperson))); + ImmutableMap.Builder builder = ImmutableMap.builder(); + builder.put(TransformType.GUI, get(0, 0, 0, 30, 225, 0, 0.625f)); + builder.put( TransformType.GROUND, get(0, 3, 0, 0, 0, 0, 0.25f)); + builder.put(TransformType.FIXED, get(0, 0, 0, 0, 0, 0, 0.5f)); + builder.put(TransformType.THIRD_PERSON_RIGHT_HAND, get(0, 2.5f, 0, 75, 45, 0, 0.375f)); + builder.put( TransformType.FIRST_PERSON_RIGHT_HAND, get(0, 0, 0, 0, 45, 0, 0.4f)); + builder.put(TransformType.FIRST_PERSON_LEFT_HAND, get(0, 0, 0, 0, 255, 0, 0.4f)); + ret.state = Optional.of(new SimpleModelState(builder.build())); } + // item/generated else if (transform.equals("forge:default-item")) { - TRSRTransformation thirdperson = TRSRTransformation.blockCenterToCorner(new TRSRTransformation( - new Vector3f(0, 1f / 16, -3f / 16), - TRSRTransformation.quatFromYXZDegrees(new Vector3f(-90, 0, 0)), - new Vector3f(0.55f, 0.55f, 0.55f), - null)); - TRSRTransformation firstperson = TRSRTransformation.blockCenterToCorner(new TRSRTransformation( - new Vector3f(0, 4f / 16, 2f / 16), - TRSRTransformation.quatFromYXZDegrees(new Vector3f(0, -135, 25)), - new Vector3f(1.7f, 1.7f, 1.7f), - null)); - ret.state = Optional.of(new SimpleModelState(ImmutableMap.of(TransformType.THIRD_PERSON, thirdperson, TransformType.FIRST_PERSON, firstperson))); + ret.state = Optional.of(new SimpleModelState(ImmutableMap.of( + TransformType.GROUND, get(0, 2, 0, 0, 0, 0, 0.5f), + TransformType.HEAD, get(0, 13, 7, 0, 180, 0, 1), + TransformType.THIRD_PERSON_RIGHT_HAND, get(0, 3, 1, 0, 0, 0, 0.55f), + TransformType.FIRST_PERSON_RIGHT_HAND, get(1.13f, 3.2f, 1.13f, 0, -90, 25, 0.68f)))); } + // item/handheld else if (transform.equals("forge:default-tool")) { - TRSRTransformation thirdperson = TRSRTransformation.blockCenterToCorner(new TRSRTransformation( - new Vector3f(0, 1.25f / 16, -3.5f / 16), - TRSRTransformation.quatFromYXZDegrees(new Vector3f(0, 90, -35)), - new Vector3f(0.85f, 0.85f, 0.85f), - null)); - TRSRTransformation firstperson = TRSRTransformation.blockCenterToCorner(new TRSRTransformation( - new Vector3f(0, 4f / 16, 2f / 16), - TRSRTransformation.quatFromYXZDegrees(new Vector3f(0, -135, 25)), - new Vector3f(1.7f, 1.7f, 1.7f), - null)); - ret.state = Optional.of(new SimpleModelState(ImmutableMap.of(TransformType.THIRD_PERSON, thirdperson, TransformType.FIRST_PERSON, firstperson))); - }*/ // FIXME + ret.state = Optional.of(new SimpleModelState(ImmutableMap.of( + TransformType.THIRD_PERSON_RIGHT_HAND, get(0, 4, 0.5f, 0, -90, 55, 0.85f), + TransformType.THIRD_PERSON_LEFT_HAND, get(0, 4, 0.5f, 0, 90, -55, 0.85f), + TransformType.FIRST_PERSON_RIGHT_HAND, get(1.13f, 3.2f, 1.13f, 0, -90, 25, 0.68f), + TransformType.FIRST_PERSON_LEFT_HAND, get(1.13f, 3.2f, 1.13f, 0, 90, -25, 0.68f)))); + } else { throw new JsonParseException("transform: unknown default string: " + transform); diff --git a/src/main/java/net/minecraftforge/client/model/ModelLoader.java b/src/main/java/net/minecraftforge/client/model/ModelLoader.java index 6d2253e076..7607f133eb 100644 --- a/src/main/java/net/minecraftforge/client/model/ModelLoader.java +++ b/src/main/java/net/minecraftforge/client/model/ModelLoader.java @@ -8,7 +8,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -110,7 +109,7 @@ public class ModelLoader extends ModelBakery { isLoading = true; loadBlocks(); - loadItems(); + loadVariantItemModels(); try { missingModel = getModel(new ResourceLocation(MODEL_MISSING.getResourceDomain(), MODEL_MISSING.getResourcePath())); @@ -148,7 +147,15 @@ public class ModelLoader extends ModelBakery return bakedRegistry; } - private void loadBlocks() + // NOOP, replaced by dependency resolution + @Override + protected void loadVariantModels() {} + + // NOOP, replaced by dependency resolution + @Override + protected void loadMultipartVariantModels() {} + + /*private void loadBlocks() { Map stateMap = blockModelShapes.getBlockStateMapper().putAllStateModelLocations(); List variants = Lists.newArrayList(stateMap.values()); @@ -168,9 +175,10 @@ public class ModelLoader extends ModelBakery blockBar.step(variant.toString()); } ProgressManager.pop(blockBar); - } + }*/ // FIXME: all the new shiny multipart things + @Deprecated private void loadVariant(ModelResourceLocation variant) { try @@ -192,23 +200,20 @@ public class ModelLoader extends ModelBakery } } - // FIXME: this is probably not the hook point anymore @Override protected void registerVariant(ModelBlockDefinition definition, ModelResourceLocation location) { - // for now - super.registerVariant(definition, location); - - /*VariantList variants = null; + // TODO loader? + VariantList variants = null; try { - variants = definition.getVariants(location.getVariant()); + variants = definition.getVariant(location.getVariant()); } catch(MissingVariantException e) { missingVariants.add(location); } - if (variants != null && !variants.getVariants().isEmpty()) + if (variants != null && !variants.getVariantList().isEmpty()) { try { @@ -218,7 +223,7 @@ public class ModelLoader extends ModelBakery { throw new RuntimeException(e); } - }*/ + } } private void storeException(ResourceLocation location, Exception exception) @@ -240,7 +245,8 @@ public class ModelLoader extends ModelBakery return new ModelBlockDefinition(new ArrayList()); } - private void loadItems() + @Override + protected void loadItemModels() { // register model for the universal bucket, if it exists if(FluidRegistry.isUniversalBucketEnabled()) @@ -454,8 +460,13 @@ public class ModelLoader extends ModelBakery public Collection getDependencies() { - if(model.getParentLocation() == null || model.getParentLocation().getResourcePath().startsWith("builtin/")) return Collections.emptyList(); - return Collections.singletonList(model.getParentLocation()); + Set set = Sets.newHashSet(); + set.addAll(model.getOverrideLocations()); + if(model.getParentLocation() != null && !model.getParentLocation().getResourcePath().startsWith("builtin/")) + { + set.add(model.getParentLocation()); + } + return ImmutableSet.copyOf(set); } public Collection getTextures() diff --git a/src/main/java/net/minecraftforge/client/model/MultiModel.java b/src/main/java/net/minecraftforge/client/model/MultiModel.java index 1e6ba7b1b6..c35004f7a6 100644 --- a/src/main/java/net/minecraftforge/client/model/MultiModel.java +++ b/src/main/java/net/minecraftforge/client/model/MultiModel.java @@ -169,8 +169,7 @@ public class MultiModel implements IModel @Override public ItemOverrideList getOverrides() { - // TODO Auto-generated method stub - return null; + return ItemOverrideList.NONE; } } diff --git a/src/main/java/net/minecraftforge/client/model/TRSRTransformation.java b/src/main/java/net/minecraftforge/client/model/TRSRTransformation.java index 2cd3bef15f..06d05167b2 100644 --- a/src/main/java/net/minecraftforge/client/model/TRSRTransformation.java +++ b/src/main/java/net/minecraftforge/client/model/TRSRTransformation.java @@ -8,7 +8,6 @@ import javax.vecmath.Tuple4f; import javax.vecmath.Vector3f; import javax.vecmath.Vector4f; -import net.minecraft.client.renderer.block.model.ItemTransformVec3f; import net.minecraft.client.renderer.block.model.ModelRotation; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.Vec3i; @@ -31,7 +30,6 @@ import com.google.common.base.Optional; * should be comparable to using Matrix4f directly. * Immutable. */ -@SuppressWarnings("deprecation") public class TRSRTransformation implements IModelState, ITransformation { private final Matrix4f matrix; @@ -64,14 +62,16 @@ public class TRSRTransformation implements IModelState, ITransformation full = true; } - public TRSRTransformation(ItemTransformVec3f transform) + @Deprecated + public TRSRTransformation(net.minecraft.client.renderer.block.model.ItemTransformVec3f transform) { this(getMatrix(transform)); } - public static Matrix4f getMatrix(ItemTransformVec3f transform) + @Deprecated + public static Matrix4f getMatrix(net.minecraft.client.renderer.block.model.ItemTransformVec3f transform) { - TRSRTransformation ret = new TRSRTransformation(toVecmath(transform.translation), quatFromYXZDegrees(toVecmath(transform.rotation)), toVecmath(transform.scale), null); + TRSRTransformation ret = new TRSRTransformation(toVecmath(transform.translation), quatFromXYZDegrees(toVecmath(transform.rotation)), toVecmath(transform.scale), null); return blockCenterToCorner(ret).getMatrix(); } @@ -135,16 +135,6 @@ public class TRSRTransformation implements IModelState, ITransformation } } - public static Quat4f quatFromYXZDegrees(Vector3f yxz) - { - return quatFromYXZ((float)Math.toRadians(yxz.y), (float)Math.toRadians(yxz.x), (float)Math.toRadians(yxz.z)); - } - - public static Quat4f quatFromYXZ(Vector3f yxz) - { - return quatFromYXZ(yxz.y, yxz.x, yxz.z); - } - public static Quat4f quatFromYXZ(float y, float x, float z) { Quat4f ret = new Quat4f(0, 0, 0, 1), t = new Quat4f(); @@ -157,6 +147,28 @@ public class TRSRTransformation implements IModelState, ITransformation return ret; } + public static Quat4f quatFromXYZDegrees(Vector3f xyz) + { + return quatFromXYZ((float)Math.toRadians(xyz.x), (float)Math.toRadians(xyz.y), (float)Math.toRadians(xyz.z)); + } + + public static Quat4f quatFromXYZ(Vector3f xyz) + { + return quatFromXYZ(xyz.x, xyz.y, xyz.z); + } + + public static Quat4f quatFromXYZ(float x, float y, float z) + { + Quat4f ret = new Quat4f(0, 0, 0, 1), t = new Quat4f(); + t.set((float)Math.sin(x/2), 0, 0, (float)Math.cos(x/2)); + ret.mul(t); + t.set(0, (float)Math.sin(y/2), 0, (float)Math.cos(y/2)); + ret.mul(t); + t.set(0, 0, (float)Math.sin(z/2), (float)Math.cos(z/2)); + ret.mul(t); + return ret; + } + public static Vector3f toYXZDegrees(Quat4f q) { Vector3f yxz = toYXZ(q); @@ -187,6 +199,37 @@ public class TRSRTransformation implements IModelState, ITransformation ); } + public static Vector3f toXYZDegrees(Quat4f q) + { + Vector3f xyz = toXYZ(q); + return new Vector3f((float)Math.toDegrees(xyz.x), (float)Math.toDegrees(xyz.y), (float)Math.toDegrees(xyz.z)); + } + + // TODO check if correct + public static Vector3f toXYZ(Quat4f q) + { + float w2 = q.w * q.w; + float x2 = q.x * q.x; + float y2 = q.y * q.y; + float z2 = q.z * q.z; + float l = w2 + x2 + y2 + z2; + float sy = 2 * q.w * q.x - 2 * q.y * q.z; + float y = (float)Math.asin(sy / l); + if(Math.abs(sy) > .999f * l) + { + return new Vector3f( + 2 * (float)Math.atan2(q.x, q.w), + y, + 0 + ); + } + return new Vector3f( + (float)Math.atan2(2 * q.y * q.z + 2 * q.x * q.w, w2 - x2 - y2 + z2), + y, + (float)Math.atan2(2 * q.x * q.y + 2 * q.w * q.z, w2 + x2 - y2 - z2) + ); + } + public static Matrix4f mul(Vector3f translation, Quat4f leftRot, Vector3f scale, Quat4f rightRot) { Matrix4f res = new Matrix4f(), t = new Matrix4f(); @@ -447,9 +490,10 @@ public class TRSRTransformation implements IModelState, ITransformation /* * Don't use this if you don't need to, conversion is lossy (second rotation component is lost). */ - public ItemTransformVec3f toItemTransform() + @Deprecated + public net.minecraft.client.renderer.block.model.ItemTransformVec3f toItemTransform() { - return new ItemTransformVec3f(toLwjgl(toYXZDegrees(getLeftRot())), toLwjgl(getTranslation()), toLwjgl(getScale())); + return new net.minecraft.client.renderer.block.model.ItemTransformVec3f(toLwjgl(toXYZDegrees(getLeftRot())), toLwjgl(getTranslation()), toLwjgl(getScale())); } public Matrix4f getMatrix() diff --git a/src/main/resources/forge_at.cfg b/src/main/resources/forge_at.cfg index 534b145cd4..4281d02692 100644 --- a/src/main/resources/forge_at.cfg +++ b/src/main/resources/forge_at.cfg @@ -141,6 +141,12 @@ protected net.minecraft.client.renderer.block.model.ModelBakery func_177581_b(Ln protected net.minecraft.client.renderer.block.model.ModelBakery func_177587_c(Lnet/minecraft/client/renderer/block/model/ModelBlock;)Z # isCustomRenderer protected net.minecraft.client.renderer.block.model.ModelBakery func_177582_d(Lnet/minecraft/client/renderer/block/model/ModelBlock;)Lnet/minecraft/client/renderer/block/model/ModelBlock; # makeItemModel protected net.minecraft.client.renderer.block.model.ModelBakery func_177580_d(Lnet/minecraft/util/ResourceLocation;)Lnet/minecraft/util/ResourceLocation; # getModelLocation +protected net.minecraft.client.renderer.block.model.ModelBakery func_188640_b()V # loadBlocks +protected net.minecraft.client.renderer.block.model.ModelBakery func_177577_b()V # loadVariantItemModels +protected net.minecraft.client.renderer.block.model.ModelBakery func_177590_d()V # loadItemModels +protected net.minecraft.client.renderer.block.model.ModelBakery func_177595_c()V # loadVariantModels +protected net.minecraft.client.renderer.block.model.ModelBakery func_188637_e()V # loadMultipartVariantModels +protected net.minecraft.client.renderer.block.model.ModelBakery func_188638_a(Lnet/minecraft/client/renderer/block/model/ModelResourceLocation;Lnet/minecraft/client/renderer/block/model/VariantList;)V # loadVariantList #public net.minecraft.client.renderer.block.model.WeightedBakedModel field_177565_b # models # EnumFacing public net.minecraft.util.EnumFacing field_82609_l # VALUES diff --git a/src/test/java/net/minecraftforge/debug/ModelAnimationDebug.java b/src/test/java/net/minecraftforge/debug/ModelAnimationDebug.java index 8001c0edd0..1951cfbc03 100644 --- a/src/test/java/net/minecraftforge/debug/ModelAnimationDebug.java +++ b/src/test/java/net/minecraftforge/debug/ModelAnimationDebug.java @@ -64,7 +64,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.google.common.collect.ImmutableMap; -//@Mod(modid = ModelAnimationDebug.MODID, version = ModelAnimationDebug.VERSION) +@Mod(modid = ModelAnimationDebug.MODID, version = ModelAnimationDebug.VERSION) public class ModelAnimationDebug { public static final String MODID = "forgedebugmodelanimation";