Fixed perspective transformation handling for fluid models, changed inventory fluid model to use unrotated still texture.

This commit is contained in:
RainWarrior 2016-01-04 13:54:45 +03:00
parent 826b1d20f8
commit 856a9c3cdd
2 changed files with 34 additions and 22 deletions

View File

@ -5,6 +5,7 @@ import java.util.Collections;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.List; import java.util.List;
import javax.vecmath.Matrix4f;
import javax.vecmath.Vector4f; import javax.vecmath.Vector4f;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
@ -27,6 +28,8 @@ import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fml.common.FMLLog; import net.minecraftforge.fml.common.FMLLog;
import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Optional; import com.google.common.base.Optional;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
@ -64,12 +67,7 @@ public class ModelFluid implements IModelCustomData
public IFlexibleBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) public IFlexibleBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter)
{ {
ImmutableMap<TransformType, TRSRTransformation> map = IPerspectiveAwareModel.MapWrapper.getTransforms(state); ImmutableMap<TransformType, TRSRTransformation> map = IPerspectiveAwareModel.MapWrapper.getTransforms(state);
IFlexibleBakedModel ret = new BakedFluid(state.apply(Optional.<IModelPart>absent()), format, fluid.getColor(), bakedTextureGetter.apply(fluid.getStill()), bakedTextureGetter.apply(fluid.getFlowing()), fluid.isGaseous()); return new BakedFluid(state.apply(Optional.<IModelPart>absent()), map, format, fluid.getColor(), bakedTextureGetter.apply(fluid.getStill()), bakedTextureGetter.apply(fluid.getFlowing()), fluid.isGaseous(), Optional.absent());
if(map.isEmpty())
{
return ret;
}
return new IPerspectiveAwareModel.MapWrapper(ret, map);
} }
public IModelState getDefaultState() public IModelState getDefaultState()
@ -97,7 +95,7 @@ public class ModelFluid implements IModelCustomData
} }
} }
public static class BakedFluid implements IFlexibleBakedModel, ISmartBlockModel public static class BakedFluid implements IFlexibleBakedModel, ISmartBlockModel, IPerspectiveAwareModel
{ {
private static final int x[] = { 0, 0, 1, 1 }; private static final int x[] = { 0, 0, 1, 1 };
private static final int z[] = { 0, 1, 1, 0 }; private static final int z[] = { 0, 1, 1, 0 };
@ -116,11 +114,12 @@ public class ModelFluid implements IModelCustomData
key >>>= 10; key >>>= 10;
} }
int flowRound = (int)(key & 0x7FF) - 1024; int flowRound = (int)(key & 0x7FF) - 1024;
return new BakedFluid(transformation, format, color, still, flowing, gas, statePresent, cornerRound, flowRound); return new BakedFluid(transformation, transforms, format, color, still, flowing, gas, statePresent, cornerRound, flowRound);
} }
}); });
private final Optional<TRSRTransformation> transformation; private final Optional<TRSRTransformation> transformation;
private final ImmutableMap<TransformType, TRSRTransformation> transforms;
private final VertexFormat format; private final VertexFormat format;
private final int color; private final int color;
private final TextureAtlasSprite still, flowing; private final TextureAtlasSprite still, flowing;
@ -134,7 +133,12 @@ public class ModelFluid implements IModelCustomData
public BakedFluid(Optional<TRSRTransformation> transformation, VertexFormat format, int color, TextureAtlasSprite still, TextureAtlasSprite flowing, boolean gas, Optional<IExtendedBlockState> stateOption) public BakedFluid(Optional<TRSRTransformation> transformation, VertexFormat format, int color, TextureAtlasSprite still, TextureAtlasSprite flowing, boolean gas, Optional<IExtendedBlockState> stateOption)
{ {
this(transformation, format, color, still, flowing, gas, stateOption.isPresent(), getCorners(stateOption), getFlow(stateOption)); this(transformation, ImmutableMap.of(), format, color, still, flowing, gas, stateOption);
}
public BakedFluid(Optional<TRSRTransformation> transformation, ImmutableMap<TransformType, TRSRTransformation> transforms, VertexFormat format, int color, TextureAtlasSprite still, TextureAtlasSprite flowing, boolean gas, Optional<IExtendedBlockState> stateOption)
{
this(transformation, transforms, format, color, still, flowing, gas, stateOption.isPresent(), getCorners(stateOption), getFlow(stateOption));
} }
private static int[] getCorners(Optional<IExtendedBlockState> stateOption) private static int[] getCorners(Optional<IExtendedBlockState> stateOption)
@ -163,9 +167,10 @@ public class ModelFluid implements IModelCustomData
return flowRound; return flowRound;
} }
public BakedFluid(Optional<TRSRTransformation> transformation, VertexFormat format, int color, TextureAtlasSprite still, TextureAtlasSprite flowing, boolean gas, boolean statePresent, int[] cornerRound, int flowRound) public BakedFluid(Optional<TRSRTransformation> transformation, ImmutableMap<TransformType, TRSRTransformation> transforms, VertexFormat format, int color, TextureAtlasSprite still, TextureAtlasSprite flowing, boolean gas, boolean statePresent, int[] cornerRound, int flowRound)
{ {
this.transformation = transformation; this.transformation = transformation;
this.transforms = transforms;
this.format = format; this.format = format;
this.color = color; this.color = color;
this.still = still; this.still = still;
@ -278,8 +283,8 @@ public class ModelFluid implements IModelCustomData
putVertex( putVertex(
builder, EnumFacing.UP, builder, EnumFacing.UP,
z[i], x[i], 0, z[i], x[i], 0,
still.getInterpolatedU(x[i] * 16), still.getInterpolatedU(z[i] * 16),
still.getInterpolatedV(z[i] * 16)); still.getInterpolatedV(x[i] * 16));
} }
faceQuads.put(EnumFacing.SOUTH, ImmutableList.<BakedQuad>of(builder.build())); faceQuads.put(EnumFacing.SOUTH, ImmutableList.<BakedQuad>of(builder.build()));
} }
@ -293,7 +298,7 @@ public class ModelFluid implements IModelCustomData
{ {
case POSITION: case POSITION:
float[] data = new float[]{ x - side.getDirectionVec().getX() * eps, y, z - side.getDirectionVec().getZ() * eps, 1 }; float[] data = new float[]{ x - side.getDirectionVec().getX() * eps, y, z - side.getDirectionVec().getZ() * eps, 1 };
if(transformation.isPresent()) if(transformation.isPresent() && transformation.get() != TRSRTransformation.identity())
{ {
Vector4f vec = new Vector4f(data); Vector4f vec = new Vector4f(data);
transformation.get().getMatrix().transform(vec); transformation.get().getMatrix().transform(vec);
@ -383,6 +388,12 @@ public class ModelFluid implements IModelCustomData
} }
return this; return this;
} }
@Override
public Pair<? extends IFlexibleBakedModel, Matrix4f> handlePerspective(TransformType type)
{
return IPerspectiveAwareModel.MapWrapper.handlePerspective(this, transforms, type);
}
} }
@Override @Override

View File

@ -1,17 +1,18 @@
{ {
"forge_marker": 1, "forge_marker": 1,
"defaults": {
"model": "forge:fluid",
"transform": "forge:default-item"
},
"variants": { "variants": {
"fluid": { "fluid": [{
"model": "forge:fluid",
"custom": { "fluid": "testfluid" } "custom": { "fluid": "testfluid" }
}, }],
"gas": { "gas": [{
"model": "forge:fluid",
"custom": { "fluid": "testgas" } "custom": { "fluid": "testgas" }
}, }],
"milk": { "milk": [{
"model": "forge:fluid",
"custom": { "fluid": "milk" } "custom": { "fluid": "milk" }
} }]
} }
} }