First version of updated of ModelLoader, mostly works.

This commit is contained in:
RainWarrior 2016-03-13 12:10:50 +03:00
parent bda688b9b5
commit a799bbad2d
9 changed files with 147 additions and 75 deletions

View file

@ -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())
{

View file

@ -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();
}

View file

@ -395,13 +395,16 @@ public class ForgeHooksClient
{
Pair<? extends IBakedModel, Matrix4f> 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

View file

@ -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.<IModelState>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.<IModelState>of(new SimpleModelState(ImmutableMap.of(TransformType.THIRD_PERSON, thirdperson)));
ImmutableMap.Builder<TransformType, TRSRTransformation> 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.<IModelState>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.<IModelState>of(new SimpleModelState(ImmutableMap.of(TransformType.THIRD_PERSON, thirdperson, TransformType.FIRST_PERSON, firstperson)));
ret.state = Optional.<IModelState>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.<IModelState>of(new SimpleModelState(ImmutableMap.of(TransformType.THIRD_PERSON, thirdperson, TransformType.FIRST_PERSON, firstperson)));
}*/ // FIXME
ret.state = Optional.<IModelState>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);

View file

@ -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<IBlockState, ModelResourceLocation> stateMap = blockModelShapes.getBlockStateMapper().putAllStateModelLocations();
List<ModelResourceLocation> 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<ModelBlockDefinition>());
}
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<ResourceLocation> getDependencies()
{
if(model.getParentLocation() == null || model.getParentLocation().getResourcePath().startsWith("builtin/")) return Collections.emptyList();
return Collections.singletonList(model.getParentLocation());
Set<ResourceLocation> 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<ResourceLocation> getTextures()

View file

@ -169,8 +169,7 @@ public class MultiModel implements IModel
@Override
public ItemOverrideList getOverrides()
{
// TODO Auto-generated method stub
return null;
return ItemOverrideList.NONE;
}
}

View file

@ -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()

View file

@ -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

View file

@ -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";