Removed face doubles from item models.

This commit is contained in:
RainWarrior 2015-11-21 08:09:38 +03:00
parent b5af11a89d
commit 0d06ea6758
1 changed files with 20 additions and 6 deletions

View File

@ -1,6 +1,7 @@
package net.minecraftforge.client.model; package net.minecraftforge.client.model;
import java.util.Arrays; import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -146,6 +147,7 @@ public class ItemLayerModel implements IRetexturableModel {
int uMax = sprite.getIconWidth(); int uMax = sprite.getIconWidth();
int vMax = sprite.getIconHeight(); int vMax = sprite.getIconHeight();
BitSet faces = new BitSet((uMax + 1) * (vMax + 1) * 4);
for(int f = 0; f < sprite.getFrameCount(); f++) for(int f = 0; f < sprite.getFrameCount(); f++)
{ {
int[] pixels = sprite.getFrameTextureData(f)[0]; int[] pixels = sprite.getFrameTextureData(f)[0];
@ -160,26 +162,26 @@ public class ItemLayerModel implements IRetexturableModel {
boolean t = isTransparent(pixels, uMax, vMax, u, v); boolean t = isTransparent(pixels, uMax, vMax, u, v);
if(ptu && !t) // left - transparent, right - opaque if(ptu && !t) // left - transparent, right - opaque
{ {
builder.add(buildSideQuad(format, transform, EnumFacing.WEST, tint, sprite, u, v)); addSideQuad(builder, faces, format, transform, EnumFacing.WEST, tint, sprite, uMax, vMax, u, v);
} }
if(!ptu && t) // left - opaque, right - transparent if(!ptu && t) // left - opaque, right - transparent
{ {
builder.add(buildSideQuad(format, transform, EnumFacing.EAST, tint, sprite, u, v)); addSideQuad(builder, faces, format, transform, EnumFacing.EAST, tint, sprite, uMax, vMax, u, v);
} }
if(ptv[u] && !t) // up - transparent, down - opaque if(ptv[u] && !t) // up - transparent, down - opaque
{ {
builder.add(buildSideQuad(format, transform, EnumFacing.UP, tint, sprite, u, v)); addSideQuad(builder, faces, format, transform, EnumFacing.UP, tint, sprite, uMax, vMax, u, v);
} }
if(!ptv[u] && t) // up - opaque, down - transparent if(!ptv[u] && t) // up - opaque, down - transparent
{ {
builder.add(buildSideQuad(format, transform, EnumFacing.DOWN, tint, sprite, u, v)); addSideQuad(builder, faces, format, transform, EnumFacing.DOWN, tint, sprite, uMax, vMax, u, v);
} }
ptu = t; ptu = t;
ptv[u] = t; ptv[u] = t;
} }
if(!ptu) // last - opaque if(!ptu) // last - opaque
{ {
builder.add(buildSideQuad(format, transform, EnumFacing.EAST, tint, sprite, uMax, v)); addSideQuad(builder, faces, format, transform, EnumFacing.EAST, tint, sprite, uMax, vMax, uMax, v);
} }
} }
// last line // last line
@ -187,7 +189,7 @@ public class ItemLayerModel implements IRetexturableModel {
{ {
if(!ptv[u]) if(!ptv[u])
{ {
builder.add(buildSideQuad(format, transform, EnumFacing.DOWN, tint, sprite, u, vMax)); addSideQuad(builder, faces, format, transform, EnumFacing.DOWN, tint, sprite, uMax, vMax, u, vMax);
} }
} }
} }
@ -213,6 +215,18 @@ public class ItemLayerModel implements IRetexturableModel {
return (pixels[u + (vMax - 1 - v) * uMax] >> 24 & 0xFF) == 0; return (pixels[u + (vMax - 1 - v) * uMax] >> 24 & 0xFF) == 0;
} }
private static void addSideQuad(ImmutableList.Builder<BakedQuad> builder, BitSet faces, VertexFormat format, TRSRTransformation transform, EnumFacing side, int tint, TextureAtlasSprite sprite, int uMax, int vMax, int u, int v)
{
int si = side.ordinal();
if(si > 4) si -= 2;
int index = (vMax + 1) * ((uMax + 1) * si + u) + v;
if(!faces.get(index))
{
faces.set(index);
builder.add(buildSideQuad(format, transform, side, tint, sprite, u, v));
}
}
private static BakedQuad buildSideQuad(VertexFormat format, TRSRTransformation transform, EnumFacing side, int tint, TextureAtlasSprite sprite, int u, int v) private static BakedQuad buildSideQuad(VertexFormat format, TRSRTransformation transform, EnumFacing side, int tint, TextureAtlasSprite sprite, int u, int v)
{ {
final float eps0 = 30e-5f; final float eps0 = 30e-5f;