First version of updated of ModelLoader, mostly works.

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

No files matched your search

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