Search in sources :

Example 61 with BakedQuad

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);
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) VertexFormatElement(com.mojang.blaze3d.vertex.VertexFormatElement)

Example 62 with BakedQuad

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();
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) Direction(net.minecraft.core.Direction)

Example 63 with BakedQuad

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);
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) UnpackedBakedQuad(net.minecraftforge.client.model.pipeline.UnpackedBakedQuad) TRSRTransformation(net.minecraftforge.common.model.TRSRTransformation) ImmutableList(com.google.common.collect.ImmutableList) TextureAtlasSprite(net.minecraft.client.renderer.texture.TextureAtlasSprite) ResourceLocation(net.minecraft.util.ResourceLocation) TransformType(net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType)

Example 64 with BakedQuad

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();
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) Tessellator(net.minecraft.client.renderer.Tessellator) VertexBuffer(net.minecraft.client.renderer.VertexBuffer)

Example 65 with BakedQuad

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();
    }
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) Vec3i(net.minecraft.util.math.Vec3i) Tessellator(net.minecraft.client.renderer.Tessellator) BufferBuilder(net.minecraft.client.renderer.BufferBuilder)

Aggregations

BakedQuad (net.minecraft.client.renderer.block.model.BakedQuad)130 IBakedModel (net.minecraft.client.renderer.block.model.IBakedModel)43 EnumFacing (net.minecraft.util.EnumFacing)39 TextureAtlasSprite (net.minecraft.client.renderer.texture.TextureAtlasSprite)36 ArrayList (java.util.ArrayList)27 IBlockState (net.minecraft.block.state.IBlockState)24 ResourceLocation (net.minecraft.util.ResourceLocation)23 ImmutableList (com.google.common.collect.ImmutableList)22 MutableQuad (buildcraft.lib.client.model.MutableQuad)19 UnpackedBakedQuad (net.minecraftforge.client.model.pipeline.UnpackedBakedQuad)17 TRSRTransformation (net.minecraftforge.common.model.TRSRTransformation)16 ModelResourceLocation (net.minecraft.client.renderer.block.model.ModelResourceLocation)15 TransformType (net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType)14 IExtendedBlockState (net.minecraftforge.common.property.IExtendedBlockState)14 List (java.util.List)13 IModel (net.minecraftforge.client.model.IModel)13 SideOnly (net.minecraftforge.fml.relauncher.SideOnly)13 Matrix4f (javax.vecmath.Matrix4f)12 Tessellator (net.minecraft.client.renderer.Tessellator)12 ItemLayerModel (net.minecraftforge.client.model.ItemLayerModel)12