use of net.minecraft.client.renderer.block.model.BakedQuad in project MinecraftForge by MinecraftForge.
the class BakedQuadBuilder method build.
public BakedQuad build() {
if (!full) {
throw new IllegalStateException("not enough data");
}
if (texture == null) {
throw new IllegalStateException("texture not set");
}
if (contractUVs) {
float tX = texture.getWidth() / (texture.getU1() - texture.getU0());
float tY = texture.getHeight() / (texture.getV1() - texture.getV0());
float tS = tX > tY ? tX : tY;
float ep = 1f / (tS * 0x100);
int uve = 0;
ImmutableList<VertexFormatElement> elements = DefaultVertexFormat.BLOCK.getElements();
while (uve < elements.size()) {
VertexFormatElement e = elements.get(uve);
if (e.getUsage() == VertexFormatElement.Usage.UV && e.getIndex() == 0) {
break;
}
uve++;
}
if (uve == elements.size()) {
throw new IllegalStateException("Can't contract UVs: format doesn't contain UVs");
}
float[] uvc = new float[4];
for (int v = 0; v < 4; v++) {
for (int i = 0; i < 4; i++) {
uvc[i] += unpackedData[v][uve][i] / 4;
}
}
for (int v = 0; v < 4; v++) {
for (int i = 0; i < 4; i++) {
float uo = unpackedData[v][uve][i];
float un = uo * (1 - eps) + uvc[i] * eps;
float ud = uo - un;
float aud = ud;
if (aud < 0)
aud = -aud;
if (// not moving a fraction of a pixel
aud < ep) {
float udc = uo - uvc[i];
if (udc < 0)
udc = -udc;
if (// center is closer than 2 fractions of a pixel, don't move too close
udc < 2 * ep) {
un = (uo + uvc[i]) / 2;
} else // move at least by a fraction
{
un = uo + (ud < 0 ? ep : -ep);
}
}
unpackedData[v][uve][i] = un;
}
}
}
int[] packed = new int[DefaultVertexFormat.BLOCK.getIntegerSize() * 4];
for (int v = 0; v < 4; v++) {
for (int e = 0; e < SIZE; e++) {
LightUtil.pack(unpackedData[v][e], packed, DefaultVertexFormat.BLOCK, v, e);
}
}
return new BakedQuad(packed, tint, orientation, texture, applyDiffuseLighting);
}
use of net.minecraft.client.renderer.block.model.BakedQuad in project MinecraftForge by MinecraftForge.
the class ItemLayerModel method getQuadsForSprite.
public static ImmutableList<BakedQuad> getQuadsForSprite(int tint, TextureAtlasSprite sprite, Transformation transform, boolean fullbright) {
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
int uMax = sprite.getWidth();
int vMax = sprite.getHeight();
FaceData faceData = new FaceData(uMax, vMax);
boolean translucent = false;
for (int f = 0; f < sprite.getFrameCount(); f++) {
boolean ptu;
boolean[] ptv = new boolean[uMax];
Arrays.fill(ptv, true);
for (int v = 0; v < vMax; v++) {
ptu = true;
for (int u = 0; u < uMax; u++) {
int alpha = sprite.getPixelRGBA(f, u, vMax - v - 1) >> 24 & 0xFF;
boolean t = alpha / 255f <= 0.1f;
if (!t && alpha < 255) {
translucent = true;
}
if (// left - transparent, right - opaque
ptu && !t) {
faceData.set(Direction.WEST, u, v);
}
if (// left - opaque, right - transparent
!ptu && t) {
faceData.set(Direction.EAST, u - 1, v);
}
if (// up - transparent, down - opaque
ptv[u] && !t) {
faceData.set(Direction.UP, u, v);
}
if (// up - opaque, down - transparent
!ptv[u] && t) {
faceData.set(Direction.DOWN, u, v - 1);
}
ptu = t;
ptv[u] = t;
}
if (// last - opaque
!ptu) {
faceData.set(Direction.EAST, uMax - 1, v);
}
}
// last line
for (int u = 0; u < uMax; u++) {
if (!ptv[u]) {
faceData.set(Direction.DOWN, u, vMax - 1);
}
}
}
// horizontal quads
for (Direction facing : HORIZONTALS) {
for (int v = 0; v < vMax; v++) {
int uStart = 0, uEnd = uMax;
boolean building = false;
for (int u = 0; u < uMax; u++) {
boolean face = faceData.get(facing, u, v);
if (!translucent) {
if (face) {
if (!building) {
building = true;
uStart = u;
}
uEnd = u + 1;
}
} else {
if (// finish current quad
building && !face) {
// make quad [uStart, u]
int off = facing == Direction.DOWN ? 1 : 0;
builder.add(buildSideQuad(transform, facing, tint, sprite, uStart, v + off, u - uStart, fullbright));
building = false;
} else if (// start new quad
!building && face) {
building = true;
uStart = u;
}
}
}
if (// build remaining quad
building) {
// make quad [uStart, uEnd]
int off = facing == Direction.DOWN ? 1 : 0;
builder.add(buildSideQuad(transform, facing, tint, sprite, uStart, v + off, uEnd - uStart, fullbright));
}
}
}
// vertical quads
for (Direction facing : VERTICALS) {
for (int u = 0; u < uMax; u++) {
int vStart = 0, vEnd = vMax;
boolean building = false;
for (int v = 0; v < vMax; v++) {
boolean face = faceData.get(facing, u, v);
if (!translucent) {
if (face) {
if (!building) {
building = true;
vStart = v;
}
vEnd = v + 1;
}
} else {
if (// finish current quad
building && !face) {
// make quad [vStart, v]
int off = facing == Direction.EAST ? 1 : 0;
builder.add(buildSideQuad(transform, facing, tint, sprite, u + off, vStart, v - vStart, fullbright));
building = false;
} else if (// start new quad
!building && face) {
building = true;
vStart = v;
}
}
}
if (// build remaining quad
building) {
// make quad [vStart, vEnd]
int off = facing == Direction.EAST ? 1 : 0;
builder.add(buildSideQuad(transform, facing, tint, sprite, u + off, vStart, vEnd - vStart, fullbright));
}
}
}
// front
builder.add(buildQuad(transform, Direction.NORTH, sprite, tint, fullbright, 0, 0, 7.5f / 16f, sprite.getU0(), sprite.getV1(), 0, 1, 7.5f / 16f, sprite.getU0(), sprite.getV0(), 1, 1, 7.5f / 16f, sprite.getU1(), sprite.getV0(), 1, 0, 7.5f / 16f, sprite.getU1(), sprite.getV1()));
// back
builder.add(buildQuad(transform, Direction.SOUTH, sprite, tint, fullbright, 0, 0, 8.5f / 16f, sprite.getU0(), sprite.getV1(), 1, 0, 8.5f / 16f, sprite.getU1(), sprite.getV1(), 1, 1, 8.5f / 16f, sprite.getU1(), sprite.getV0(), 0, 1, 8.5f / 16f, sprite.getU0(), sprite.getV0()));
return builder.build();
}
use of net.minecraft.client.renderer.block.model.BakedQuad in project BetterWithAddons by DaedalusGame.
the class ModelToolShardInner method bake.
@Override
public IBakedModel bake(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) {
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
Optional<TRSRTransformation> transform = state.apply(Optional.<IModelPart>absent());
for (int i = 0; i < textures.size(); i++) {
ResourceLocation tex = textures.get(i);
if (tex.toString().equals("minecraft:missingno"))
continue;
TextureAtlasSprite sprite = bakedTextureGetter.apply(tex);
String breakLocation = new ResourceLocation(Reference.MOD_ID, "items/breakmask").toString();
TextureAtlasSprite breakTemplate = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(breakLocation);
builder.addAll(getQuadsForSprite(i, breakTemplate, sprite, format, transform));
// builder.addAll(ItemTextureQuadConverter.convertTexture(format, transform, breakTemplate, sprite, NORTH_Z + Z_OFFSET * i, EnumFacing.NORTH, 0xffffffff));
// builder.addAll(ItemTextureQuadConverter.convertTexture(format, transform, breakTemplate, sprite, SOUTH_Z - Z_OFFSET * i, EnumFacing.SOUTH, 0xffffffff));
}
TextureAtlasSprite particle = bakedTextureGetter.apply(textures.isEmpty() ? new ResourceLocation("missingno") : textures.get(0));
ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> map = IPerspectiveAwareModel.MapWrapper.getTransforms(state);
return new BakedItemModel(builder.build(), particle, map, null);
}
use of net.minecraft.client.renderer.block.model.BakedQuad in project SilentGems by SilentChaos512.
the class ModelHelper method renderModel.
public static void renderModel(IBakedModel model, int color) {
Tessellator tessellator = Tessellator.getInstance();
VertexBuffer buffer = tessellator.getBuffer();
// don't ask me why this fixes it...
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.ITEM);
List<BakedQuad> quads = model.getQuads(null, null, 0);
for (BakedQuad bakedQuad : quads) {
LightUtil.renderQuadColor(buffer, bakedQuad, color);
}
tessellator.draw();
}
use of net.minecraft.client.renderer.block.model.BakedQuad in project MorePlanets by SteveKunG.
the class ClientRendererUtils method renderModelBrightnessColorQuads.
private static void renderModelBrightnessColorQuads(float brightness, float red, float green, float blue, List<BakedQuad> listQuads) {
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder vertexbuffer = tessellator.getBuffer();
int i = 0;
for (int j = listQuads.size(); i < j; ++i) {
BakedQuad bakedquad = listQuads.get(i);
vertexbuffer.begin(GLConstants.QUADS, DefaultVertexFormats.ITEM);
vertexbuffer.addVertexData(bakedquad.getVertexData());
if (bakedquad.hasTintIndex()) {
ClientRendererUtils.putColorRGB_F4(vertexbuffer, red * brightness, green * brightness, blue * brightness);
} else {
ClientRendererUtils.putColorRGB_F4(vertexbuffer, brightness, brightness, brightness);
}
Vec3i vec3i = bakedquad.getFace().getDirectionVec();
vertexbuffer.putNormal(vec3i.getX(), vec3i.getY(), vec3i.getZ());
tessellator.draw();
}
}
Aggregations