Search in sources :

Example 51 with BakedQuad

use of net.minecraft.client.renderer.block.model.BakedQuad in project ImmersiveEngineering by BluSunrize.

the class ClientUtils method renderModelTESRFancy.

/**
 * Renders the given quads. Uses the local and neighbour brightnesses to calculate lighting
 *
 * @param quads     the quads to render
 * @param renderer  the BufferBuilder to render to
 * @param world     the world the model is in. Will be used to obtain lighting information
 * @param pos       the position that this model is in. Use the position the the quads are actually in, not the rendering block
 * @param useCached Whether to use cached information for world local data. Set to true if the previous call to this method was in the same tick and for the same world+pos
 */
public static void renderModelTESRFancy(List<BakedQuad> quads, BufferBuilder renderer, World world, BlockPos pos, boolean useCached) {
    // TODO include matrix transformations?, cache normals?
    if (Config.IEConfig.disableFancyTESR)
        renderModelTESRFast(quads, renderer, world, pos);
    else {
        if (!useCached) {
            // Calculate surrounding brighness and split into block and sky light
            for (EnumFacing f : EnumFacing.VALUES) {
                int val = world.getCombinedLight(pos.offset(f), 0);
                neighbourBrightness[0][f.getIndex()] = (val >> 16) & 255;
                neighbourBrightness[1][f.getIndex()] = val & 255;
            }
            // calculate the different correction factors for all 8 possible light vectors
            for (int type = 0; type < 2; type++) for (int i = 0; i < 8; i++) {
                float sSquared = 0;
                if ((i & 1) != 0)
                    sSquared += scaledSquared(neighbourBrightness[type][5], 255F);
                else
                    sSquared += scaledSquared(neighbourBrightness[type][4], 255F);
                if ((i & 2) != 0)
                    sSquared += scaledSquared(neighbourBrightness[type][1], 255F);
                else
                    sSquared += scaledSquared(neighbourBrightness[type][0], 255F);
                if ((i & 4) != 0)
                    sSquared += scaledSquared(neighbourBrightness[type][3], 255F);
                else
                    sSquared += scaledSquared(neighbourBrightness[type][2], 255F);
                normalizationFactors[type][i] = (float) Math.sqrt(sSquared);
            }
        }
        int localBrightness = world.getCombinedLight(pos, 0);
        for (BakedQuad quad : quads) {
            int[] vData = quad.getVertexData();
            VertexFormat format = quad.getFormat();
            int size = format.getIntegerSize();
            int uv = format.getUvOffsetById(0) / 4;
            // extract position info from the quad
            for (int i = 0; i < 4; i++) {
                quadCoords[i][0] = Float.intBitsToFloat(vData[size * i]);
                quadCoords[i][1] = Float.intBitsToFloat(vData[size * i + 1]);
                quadCoords[i][2] = Float.intBitsToFloat(vData[size * i + 2]);
            }
            // generate the normal vector
            side1.x = quadCoords[1][0] - quadCoords[3][0];
            side1.y = quadCoords[1][1] - quadCoords[3][1];
            side1.z = quadCoords[1][2] - quadCoords[3][2];
            side2.x = quadCoords[2][0] - quadCoords[0][0];
            side2.y = quadCoords[2][1] - quadCoords[0][1];
            side2.z = quadCoords[2][2] - quadCoords[0][2];
            Vector3f.cross(side1, side2, normal);
            normal.normalise();
            // calculate the final light values and do the rendering
            int l1 = getLightValue(neighbourBrightness[0], normalizationFactors[0], (localBrightness >> 16) & 255);
            int l2 = getLightValue(neighbourBrightness[1], normalizationFactors[1], localBrightness & 255);
            for (int i = 0; i < 4; ++i) {
                renderer.pos(quadCoords[i][0], quadCoords[i][1], quadCoords[i][2]).color(255, 255, 255, 255).tex(Float.intBitsToFloat(vData[size * i + uv]), Float.intBitsToFloat(vData[size * i + uv + 1])).lightmap(l1, l2).endVertex();
            }
        }
    }
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) UnpackedBakedQuad(net.minecraftforge.client.model.pipeline.UnpackedBakedQuad) VertexFormat(net.minecraft.client.renderer.vertex.VertexFormat)

Example 52 with BakedQuad

use of net.minecraft.client.renderer.block.model.BakedQuad in project ImmersiveEngineering by BluSunrize.

the class ClientUtils method getSideTexture.

public static ResourceLocation getSideTexture(@Nonnull IBlockState state, EnumFacing side) {
    IBakedModel model = mc().getBlockRendererDispatcher().getModelForState(state);
    List<BakedQuad> quads = model.getQuads(state, side, 0);
    if (// no quads for the specified side D:
    quads == null || quads.isEmpty())
        quads = model.getQuads(state, null, 0);
    if (// no quads at all D:
    quads == null || quads.isEmpty())
        return null;
    return new ResourceLocation(quads.get(0).getSprite().getIconName());
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) UnpackedBakedQuad(net.minecraftforge.client.model.pipeline.UnpackedBakedQuad) IBakedModel(net.minecraft.client.renderer.block.model.IBakedModel)

Example 53 with BakedQuad

use of net.minecraft.client.renderer.block.model.BakedQuad in project ImmersiveEngineering by BluSunrize.

the class ClientUtils method createBakedBox.

@Nonnull
public static Set<BakedQuad> createBakedBox(Vector3f from, Vector3f to, Matrix4 matrix, EnumFacing facing, Function<Vector3f[], Vector3f[]> vertexTransformer, Function<EnumFacing, TextureAtlasSprite> textureGetter, float[] colour) {
    HashSet<BakedQuad> quads = new HashSet<>();
    if (vertexTransformer == null)
        vertexTransformer = v -> v;
    Vector3f[] vertices = { new Vector3f(from.x, from.y, from.z), new Vector3f(from.x, from.y, to.z), new Vector3f(to.x, from.y, to.z), new Vector3f(to.x, from.y, from.z) };
    TextureAtlasSprite sprite = textureGetter.apply(EnumFacing.DOWN);
    if (sprite != null)
        quads.add(ClientUtils.createBakedQuad(DefaultVertexFormats.ITEM, ClientUtils.applyMatrixToVertices(matrix, vertexTransformer.apply(vertices)), Utils.rotateFacingTowardsDir(EnumFacing.DOWN, facing), sprite, new double[] { from.x * 16, 16 - from.z * 16, to.x * 16, 16 - to.z * 16 }, colour, true));
    for (Vector3f v : vertices) v.setY(to.y);
    sprite = textureGetter.apply(EnumFacing.UP);
    if (sprite != null)
        quads.add(ClientUtils.createBakedQuad(DefaultVertexFormats.ITEM, ClientUtils.applyMatrixToVertices(matrix, vertexTransformer.apply(vertices)), Utils.rotateFacingTowardsDir(EnumFacing.UP, facing), sprite, new double[] { from.x * 16, from.z * 16, to.x * 16, to.z * 16 }, colour, false));
    vertices = new Vector3f[] { new Vector3f(to.x, to.y, from.z), new Vector3f(to.x, from.y, from.z), new Vector3f(from.x, from.y, from.z), new Vector3f(from.x, to.y, from.z) };
    sprite = textureGetter.apply(EnumFacing.NORTH);
    if (sprite != null)
        quads.add(ClientUtils.createBakedQuad(DefaultVertexFormats.ITEM, ClientUtils.applyMatrixToVertices(matrix, vertexTransformer.apply(vertices)), Utils.rotateFacingTowardsDir(EnumFacing.NORTH, facing), sprite, new double[] { 16 - to.x * 16, 16 - to.y * 16, 16 - from.x * 16, 16 - from.y * 16 }, colour, false));
    for (Vector3f v : vertices) v.setZ(to.z);
    sprite = textureGetter.apply(EnumFacing.SOUTH);
    if (sprite != null)
        quads.add(ClientUtils.createBakedQuad(DefaultVertexFormats.ITEM, ClientUtils.applyMatrixToVertices(matrix, vertexTransformer.apply(vertices)), Utils.rotateFacingTowardsDir(EnumFacing.SOUTH, facing), sprite, new double[] { to.x * 16, 16 - to.y * 16, from.x * 16, 16 - from.y * 16 }, colour, true));
    vertices = new Vector3f[] { new Vector3f(from.x, to.y, to.z), new Vector3f(from.x, from.y, to.z), new Vector3f(from.x, from.y, from.z), new Vector3f(from.x, to.y, from.z) };
    sprite = textureGetter.apply(EnumFacing.WEST);
    if (sprite != null)
        quads.add(ClientUtils.createBakedQuad(DefaultVertexFormats.ITEM, ClientUtils.applyMatrixToVertices(matrix, vertexTransformer.apply(vertices)), Utils.rotateFacingTowardsDir(EnumFacing.WEST, facing), sprite, new double[] { to.z * 16, 16 - to.y * 16, from.z * 16, 16 - from.y * 16 }, colour, true));
    for (Vector3f v : vertices) v.setX(to.x);
    sprite = textureGetter.apply(EnumFacing.EAST);
    if (sprite != null)
        quads.add(ClientUtils.createBakedQuad(DefaultVertexFormats.ITEM, ClientUtils.applyMatrixToVertices(matrix, vertexTransformer.apply(vertices)), Utils.rotateFacingTowardsDir(EnumFacing.EAST, facing), sprite, new double[] { 16 - to.z * 16, 16 - to.y * 16, 16 - from.z * 16, 16 - from.y * 16 }, colour, false));
    return quads;
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) UnpackedBakedQuad(net.minecraftforge.client.model.pipeline.UnpackedBakedQuad) net.minecraft.util(net.minecraft.util) Normal(net.minecraftforge.client.model.obj.OBJModel.Normal) ModelBox(net.minecraft.client.model.ModelBox) AttenuationType(net.minecraft.client.audio.ISound.AttenuationType) FluidRegistry(net.minecraftforge.fluids.FluidRegistry) ModelRenderer(net.minecraft.client.model.ModelRenderer) I18n(net.minecraft.client.resources.I18n) Lib(blusunrize.immersiveengineering.api.Lib) ItemRailgun(blusunrize.immersiveengineering.common.items.ItemRailgun) GL11(org.lwjgl.opengl.GL11) IEProperties(blusunrize.immersiveengineering.api.IEProperties) VertexFormat(net.minecraft.client.renderer.vertex.VertexFormat) net.minecraft.util.math(net.minecraft.util.math) BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) Config(blusunrize.immersiveengineering.common.Config) Quat4d(javax.vecmath.Quat4d) Vector3f(org.lwjgl.util.vector.Vector3f) EntityPlayer(net.minecraft.entity.player.EntityPlayer) FluidStack(net.minecraftforge.fluids.FluidStack) IFluidTank(net.minecraftforge.fluids.IFluidTank) TooltipFlags(net.minecraft.client.util.ITooltipFlag.TooltipFlags) ModelBiped(net.minecraft.client.model.ModelBiped) net.minecraft.client.renderer(net.minecraft.client.renderer) IBakedModel(net.minecraft.client.renderer.block.model.IBakedModel) java.util(java.util) Connection(blusunrize.immersiveengineering.api.energy.wires.ImmersiveNetHandler.Connection) IExtendedBlockState(net.minecraftforge.common.property.IExtendedBlockState) SmartLightingQuad(blusunrize.immersiveengineering.client.models.SmartLightingQuad) Function(java.util.function.Function) DefaultVertexFormats(net.minecraft.client.renderer.vertex.DefaultVertexFormats) ItemStack(net.minecraft.item.ItemStack) IEFluid(blusunrize.immersiveengineering.common.util.IEFluid) net.minecraft.block(net.minecraft.block) Minecraft(net.minecraft.client.Minecraft) ItemRevolver(blusunrize.immersiveengineering.common.items.ItemRevolver) Nonnull(javax.annotation.Nonnull) ItemDrill(blusunrize.immersiveengineering.common.items.ItemDrill) IImmersiveConnectable(blusunrize.immersiveengineering.api.energy.wires.IImmersiveConnectable) TextureAtlasSprite(net.minecraft.client.renderer.texture.TextureAtlasSprite) Entity(net.minecraft.entity.Entity) Utils(blusunrize.immersiveengineering.common.util.Utils) World(net.minecraft.world.World) TextFormatting(net.minecraft.util.text.TextFormatting) TextureMap(net.minecraft.client.renderer.texture.TextureMap) Timer(net.minecraft.util.Timer) TextureManager(net.minecraft.client.renderer.texture.TextureManager) ModelBase(net.minecraft.client.model.ModelBase) IETileSound(blusunrize.immersiveengineering.common.util.sound.IETileSound) IBlockState(net.minecraft.block.state.IBlockState) GuiScreen(net.minecraft.client.gui.GuiScreen) FontRenderer(net.minecraft.client.gui.FontRenderer) UnpackedBakedQuad(net.minecraftforge.client.model.pipeline.UnpackedBakedQuad) Matrix4(blusunrize.immersiveengineering.common.util.chickenbones.Matrix4) Material(net.minecraft.block.material.Material) TileEntity(net.minecraft.tileentity.TileEntity) ItemChemthrower(blusunrize.immersiveengineering.common.items.ItemChemthrower) TextureAtlasSprite(net.minecraft.client.renderer.texture.TextureAtlasSprite) Vector3f(org.lwjgl.util.vector.Vector3f) Nonnull(javax.annotation.Nonnull)

Example 54 with BakedQuad

use of net.minecraft.client.renderer.block.model.BakedQuad in project ImmersiveEngineering by BluSunrize.

the class ClientUtils method renderModelTESRFast.

public static void renderModelTESRFast(List<BakedQuad> quads, BufferBuilder renderer, World world, BlockPos pos) {
    int brightness = world.getCombinedLight(pos, 0);
    int l1 = (brightness >> 0x10) & 0xFFFF;
    int l2 = brightness & 0xFFFF;
    for (BakedQuad quad : quads) {
        int[] vData = quad.getVertexData();
        VertexFormat format = quad.getFormat();
        int size = format.getIntegerSize();
        int uv = format.getUvOffsetById(0) / 4;
        for (int i = 0; i < 4; ++i) {
            renderer.pos(Float.intBitsToFloat(vData[size * i]), Float.intBitsToFloat(vData[size * i + 1]), Float.intBitsToFloat(vData[size * i + 2])).color(255, 255, 255, 255).tex(Float.intBitsToFloat(vData[size * i + uv]), Float.intBitsToFloat(vData[size * i + uv + 1])).lightmap(l1, l2).endVertex();
        }
    }
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) UnpackedBakedQuad(net.minecraftforge.client.model.pipeline.UnpackedBakedQuad) VertexFormat(net.minecraft.client.renderer.vertex.VertexFormat)

Example 55 with BakedQuad

use of net.minecraft.client.renderer.block.model.BakedQuad in project ImmersiveEngineering by BluSunrize.

the class ClientUtils method renderQuads.

public static void renderQuads(Collection<BakedQuad> quads, float brightness, float red, float green, float blue) {
    Tessellator tessellator = Tessellator.getInstance();
    BufferBuilder BufferBuilder = tessellator.getBuffer();
    for (BakedQuad bakedquad : quads) {
        BufferBuilder.begin(7, DefaultVertexFormats.ITEM);
        BufferBuilder.addVertexData(bakedquad.getVertexData());
        if (bakedquad.hasTintIndex())
            BufferBuilder.putColorRGB_F4(red * brightness, green * brightness, blue * brightness);
        else
            BufferBuilder.putColorRGB_F4(brightness, brightness, brightness);
        Vec3i vec3i = bakedquad.getFace().getDirectionVec();
        BufferBuilder.putNormal((float) vec3i.getX(), (float) vec3i.getY(), (float) vec3i.getZ());
        tessellator.draw();
    }
}
Also used : BakedQuad(net.minecraft.client.renderer.block.model.BakedQuad) UnpackedBakedQuad(net.minecraftforge.client.model.pipeline.UnpackedBakedQuad)

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