Search in sources :

Example 1 with PixelBuffer

use of com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer in project DynamicTrees by DynamicTreesTeam.

the class ThickRingTextureAtlasSprite method getDeltaBorderVsCenterColor.

/**
 * This compares the color of the sprite border with the color of the sprite middle and returns a the RGB delta
 * squared.
 *
 * @param sprite The sprite to generate the delta
 * @return RGB delta squared
 */
private int getDeltaBorderVsCenterColor(TextureAtlasSprite sprite) {
    PixelBuffer pixbuf = new PixelBuffer(sprite);
    int u = pixbuf.w / 16;
    PixelBuffer wide = new PixelBuffer(u * 14, u * 1);
    PixelBuffer tall = new PixelBuffer(u * 1, u * 14);
    int[] samples = new int[4];
    // Sample top and bottom border
    pixbuf.blit(wide, u * -1, u * -0);
    samples[0] = wide.averageColor();
    pixbuf.blit(wide, u * -1, u * -15);
    samples[1] = wide.averageColor();
    // Sample left and right border
    pixbuf.blit(tall, u * -0, u * -1);
    samples[2] = tall.averageColor();
    pixbuf.blit(tall, u * -15, u * -1);
    samples[3] = tall.averageColor();
    int borderColor = TextureUtils.avgColors(samples);
    // Sample 4 lines that don't contain the pixels on the left/right border
    for (int i = 0; i < 4; i++) {
        // Lines 3, 6, 9, 12
        pixbuf.blit(wide, u * -1, u * -(i * 3 + 3));
        samples[i] = wide.averageColor();
    }
    int innerColor = TextureUtils.avgColors(samples);
    // Decompose pixels into an RGBA array
    int[] cA = TextureUtils.decompose(borderColor);
    int[] cB = TextureUtils.decompose(innerColor);
    // Find the delta of the rgb components between the border and the middle, ingore alpha channel
    int delR = cB[0] - cA[0];
    int delG = cB[1] - cA[1];
    int delB = cB[2] - cA[2];
    // Get the distance squared of the 2 colors in RGB(3D) space
    return delR * delR + delG * delG + delB * delB;
}
Also used : PixelBuffer(com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer)

Example 2 with PixelBuffer

use of com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer in project DynamicTrees by DynamicTreesTeam.

the class ThickRingTextureAtlasSprite method load.

@Override
public boolean load(IResourceManager manager, ResourceLocation location, Function<ResourceLocation, TextureAtlasSprite> textureGetter) {
    TextureAtlasSprite baseTexture = textureGetter.apply(solveRingTexture(textureGetter));
    int srcWidth = baseTexture.getIconWidth();
    int srcHeight = baseTexture.getIconHeight();
    this.width = srcWidth * 3;
    this.height = srcHeight * 3;
    PixelBuffer basePixbuf = new PixelBuffer(baseTexture);
    PixelBuffer majPixbuf = createMajorTexture(basePixbuf);
    // Load the pixels into the TextureAtlasSprite
    int mipmapLevels = baseTexture.getFrameTextureData(0).length;
    int[][] textureData = new int[mipmapLevels][];
    // only generate texture data for the first mipmap level, let Minecraft handle the rest
    textureData[0] = majPixbuf.pixels;
    this.setFramesTextureData(Lists.<int[][]>newArrayList(textureData));
    return false;
}
Also used : PixelBuffer(com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer) TextureAtlasSprite(net.minecraft.client.renderer.texture.TextureAtlasSprite)

Example 3 with PixelBuffer

use of com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer in project DynamicTrees by DynamicTreesTeam.

the class ThickRingTextureAtlasSprite method createMajorTexture.

private PixelBuffer createMajorTexture(PixelBuffer baseBuffer) {
    int w = baseBuffer.w * 3;
    int h = baseBuffer.h * 3;
    int scale = baseBuffer.w / 16;
    PixelBuffer antPixbuf = createBarklessAntecedent(baseBuffer);
    PixelBuffer majPixbuf = new PixelBuffer(w, h);
    // Compile a set of texture component pieces from the antecedent
    PixelBuffer[] corners = new PixelBuffer[4];
    PixelBuffer[] edges = new PixelBuffer[4];
    for (int i = 0; i < 4; i++) {
        corners[i] = new PixelBuffer(6 * scale, 6 * scale);
        edges[i] = new PixelBuffer(4 * scale, 6 * scale);
        antPixbuf.blit(corners[i], 0, 0, i);
        antPixbuf.blit(edges[i], -6 * scale, 0, i);
    }
    // Fill in the rest of the rings
    int centerX = 24;
    int centerY = 24;
    for (int nesting = 0; nesting < 3; nesting++) {
        int edge = 2;
        int pixbufSel = 0;
        for (EnumFacing dir : EnumFacing.HORIZONTALS) {
            // SWNE
            EnumFacing out = dir;
            EnumFacing ovr = dir.rotateY();
            int offX = out.getFrontOffsetX();
            int offY = out.getFrontOffsetZ();
            int compX = (offX == 1 ? -6 : 0) + (dir.getAxis() == Axis.Z ? -2 : 0);
            int compY = (offY == 1 ? -6 : 0) + (dir.getAxis() == Axis.X ? -2 : 0);
            int startX = offX * (14 + nesting * 6);
            int startY = offY * (14 + nesting * 6);
            for (int way = -1; way <= 1; way += 2) {
                for (int i = 0; i < 4 + nesting; i++) {
                    int rowX = ovr.getFrontOffsetX() * i * way * 4;
                    int rowY = ovr.getFrontOffsetZ() * i * way * 4;
                    int realX = centerX + startX + compX + rowX;
                    int realY = centerY + startY + compY + rowY;
                    edges[((pixbufSel++ * 13402141) >> 1) & 3].blit(majPixbuf, realX * scale, realY * scale, edge);
                }
            }
            edge++;
        }
    }
    // Create corners
    int[] cornerX = new int[] { -1, 1, 1, -1 };
    int[] cornerY = new int[] { -1, -1, 1, 1 };
    antPixbuf.blit(majPixbuf, 16 * scale, 16 * scale);
    for (int nesting = 1; nesting < 4; nesting++) {
        for (int corner = 0; corner < 4; corner++) {
            PixelBuffer cornerPixels = corners[(corner + nesting) & 0x3];
            int cX = cornerX[corner];
            int cY = cornerY[corner];
            int offX = cX * 6 * nesting + cX * 5;
            int offY = cY * 6 * nesting + cY * 5;
            int realX = 16 + 5 + offX;
            int realY = 16 + 5 + offY;
            cornerPixels.blit(majPixbuf, realX * scale, realY * scale, corner);
        }
    }
    // Compile a set of bark texture component pieces from the antecedent
    for (int i = 0; i < 4; i++) {
        corners[i] = new PixelBuffer(scale, scale);
        edges[i] = new PixelBuffer(14 * scale, scale);
        baseBuffer.blit(corners[i], 0, 0, i);
        baseBuffer.blit(edges[i], -1 * scale, 0, i);
    }
    // Create bark border
    int pixbufSel = 0;
    for (int row = 0; row < 4; row++) {
        PixelBuffer edge = edges[((pixbufSel++ * 13402141) >> 1) & 3];
        int span = edge.w;
        edge.blit(majPixbuf, (1 + row * span) * scale, 0, 0);
        edge.blit(majPixbuf, (majPixbuf.w - edge.h) * scale, (1 + row * span) * scale, 1);
        edge.blit(majPixbuf, (majPixbuf.w - 1 - span - row * span) * scale, (majPixbuf.h - edge.h) * scale, 2);
        edge.blit(majPixbuf, 0, (majPixbuf.h - 1 - edge.w - row * span) * scale, 3);
    }
    for (int corner = 0; corner < 4; corner++) {
        int cX = (cornerX[corner] + 1) >> 1;
        int cY = (cornerY[corner] + 1) >> 1;
        PixelBuffer cornerPixels = corners[corner];
        cornerPixels.blit(majPixbuf, cX * (majPixbuf.w - cornerPixels.w) * scale, cY * (majPixbuf.h - cornerPixels.h) * scale, corner);
    }
    return majPixbuf;
}
Also used : PixelBuffer(com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer) EnumFacing(net.minecraft.util.EnumFacing)

Example 4 with PixelBuffer

use of com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer in project DynamicTrees by DynamicTreesTeam.

the class ClientProxy method discoverWoodColors.

private void discoverWoodColors() {
    Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter = location -> Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(location.toString());
    for (TreeFamily family : Species.REGISTRY.getValuesCollection().stream().map(s -> s.getFamily()).distinct().collect(Collectors.toList())) {
        // For roots
        family.woodColor = 0xFFF1AE;
        if (family != TreeFamily.NULLFAMILY) {
            IBlockState state = family.getPrimitiveLog();
            if (state.getBlock() != Blocks.AIR) {
                IModel model = QuadManipulator.getModelForState(state);
                ResourceLocation resloc = QuadManipulator.getModelTexture(model, bakedTextureGetter, state, EnumFacing.UP);
                if (resloc != null) {
                    PixelBuffer pixbuf = new PixelBuffer(bakedTextureGetter.apply(resloc));
                    int u = pixbuf.w / 16;
                    PixelBuffer center = new PixelBuffer(u * 8, u * 8);
                    pixbuf.blit(center, u * -8, u * -8);
                    family.woodColor = center.averageColor();
                }
            }
        }
    }
}
Also used : com.ferreusveritas.dynamictrees.models.loaders(com.ferreusveritas.dynamictrees.models.loaders) TreeFamily(com.ferreusveritas.dynamictrees.trees.TreeFamily) Random(java.util.Random) ModelResourceLocation(net.minecraft.client.renderer.block.model.ModelResourceLocation) ColorizerFoliage(net.minecraft.world.ColorizerFoliage) ModelHelper(com.ferreusveritas.dynamictrees.api.client.ModelHelper) TextureGenerationHandler(com.ferreusveritas.dynamictrees.event.TextureGenerationHandler) Block(net.minecraft.block.Block) ModItems(com.ferreusveritas.dynamictrees.ModItems) RenderFallingTree(com.ferreusveritas.dynamictrees.render.RenderFallingTree) ITreePart(com.ferreusveritas.dynamictrees.api.treedata.ITreePart) ModelLoaderRegistry(net.minecraftforge.client.model.ModelLoaderRegistry) Collectors(java.util.stream.Collectors) IModel(net.minecraftforge.client.model.IModel) EnumParticleTypes(net.minecraft.util.EnumParticleTypes) com.ferreusveritas.dynamictrees.blocks(com.ferreusveritas.dynamictrees.blocks) ModTrees(com.ferreusveritas.dynamictrees.ModTrees) Blocks(net.minecraft.init.Blocks) Species(com.ferreusveritas.dynamictrees.trees.Species) Function(java.util.function.Function) ILeavesProperties(com.ferreusveritas.dynamictrees.api.treedata.ILeavesProperties) PixelBuffer(com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer) EntityFallingTree(com.ferreusveritas.dynamictrees.entities.EntityFallingTree) ModBlocks(com.ferreusveritas.dynamictrees.ModBlocks) Minecraft(net.minecraft.client.Minecraft) RenderingRegistry(net.minecraftforge.fml.client.registry.RenderingRegistry) FMLPreInitializationEvent(net.minecraftforge.fml.common.event.FMLPreInitializationEvent) FMLInitializationEvent(net.minecraftforge.fml.common.event.FMLInitializationEvent) ModelLoader(net.minecraftforge.client.model.ModelLoader) IBlockAccess(net.minecraft.world.IBlockAccess) TextureAtlasSprite(net.minecraft.client.renderer.texture.TextureAtlasSprite) Entity(net.minecraft.entity.Entity) IMimic(com.ferreusveritas.dynamictrees.blocks.MimicProperty.IMimic) DendroPotion(com.ferreusveritas.dynamictrees.items.DendroPotion) World(net.minecraft.world.World) EnumFacing(net.minecraft.util.EnumFacing) BlockPos(net.minecraft.util.math.BlockPos) TreeHelper(com.ferreusveritas.dynamictrees.api.TreeHelper) QuadManipulator(com.ferreusveritas.dynamictrees.client.QuadManipulator) ModConstants(com.ferreusveritas.dynamictrees.ModConstants) BlockColors(net.minecraft.client.renderer.color.BlockColors) BlockColorMultipliers(com.ferreusveritas.dynamictrees.client.BlockColorMultipliers) IBlockState(net.minecraft.block.state.IBlockState) MinecraftForge(net.minecraftforge.common.MinecraftForge) BlockBreakAnimationClientHandler(com.ferreusveritas.dynamictrees.event.BlockBreakAnimationClientHandler) ResourceLocation(net.minecraft.util.ResourceLocation) Particle(net.minecraft.client.particle.Particle) StateMap(net.minecraft.client.renderer.block.statemap.StateMap) ModelBakeEventListener(com.ferreusveritas.dynamictrees.event.ModelBakeEventListener) IModel(net.minecraftforge.client.model.IModel) IBlockState(net.minecraft.block.state.IBlockState) PixelBuffer(com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer) TextureAtlasSprite(net.minecraft.client.renderer.texture.TextureAtlasSprite) ModelResourceLocation(net.minecraft.client.renderer.block.model.ModelResourceLocation) ResourceLocation(net.minecraft.util.ResourceLocation) TreeFamily(com.ferreusveritas.dynamictrees.trees.TreeFamily)

Example 5 with PixelBuffer

use of com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer in project DynamicTrees by DynamicTreesTeam.

the class ThickRingTextureAtlasSprite method createBarklessAntecedent.

private PixelBuffer createBarklessAntecedent(PixelBuffer baseBuffer) {
    PixelBuffer antecedent = new PixelBuffer(baseBuffer);
    int scale = baseBuffer.w / 16;
    // Place the 4th pixel ring against the corners of the image.
    // Rotate 90deg to break up the pattern
    baseBuffer.blit(antecedent, 3 * scale, 3 * scale, 1);
    baseBuffer.blit(antecedent, -3 * scale, 3 * scale, 1);
    baseBuffer.blit(antecedent, 3 * scale, -3 * scale, 1);
    baseBuffer.blit(antecedent, -3 * scale, -3 * scale, 1);
    // Copy a 6 wide strip of pixels from the 4th pixel ring and place
    // it over the bark texture for all 4 edges.  Alternate the placement
    // to break up the pattern
    PixelBuffer ringStrip = new PixelBuffer(6 * scale, 1 * scale);
    baseBuffer.blit(ringStrip, -5 * scale, -3 * scale);
    ringStrip.blit(antecedent, 0 * scale, 2 * scale, -1);
    ringStrip.blit(antecedent, 15 * scale, 8 * scale, 1);
    baseBuffer.blit(ringStrip, -5 * scale, -12 * scale);
    ringStrip.blit(antecedent, 0 * scale, 8 * scale, 1);
    ringStrip.blit(antecedent, 15 * scale, 2 * scale, -1);
    ringStrip = new PixelBuffer(1 * scale, 6 * scale);
    baseBuffer.blit(ringStrip, -3 * scale, -5 * scale);
    ringStrip.blit(antecedent, 2 * scale, 0 * scale, -1);
    ringStrip.blit(antecedent, 8 * scale, 15 * scale, 1);
    baseBuffer.blit(ringStrip, -12 * scale, -5 * scale);
    ringStrip.blit(antecedent, 8 * scale, 0 * scale, 1);
    ringStrip.blit(antecedent, 2 * scale, 15 * scale, -1);
    ringStrip = null;
    // Copy the center 14x14 pixels of the original back over the result
    PixelBuffer center = new PixelBuffer(14 * scale, 14 * scale);
    baseBuffer.blit(center, -1 * scale, -1 * scale);
    center.blit(antecedent, 1 * scale, 1 * scale);
    return antecedent;
}
Also used : PixelBuffer(com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer)

Aggregations

PixelBuffer (com.ferreusveritas.dynamictrees.client.TextureUtils.PixelBuffer)5 TextureAtlasSprite (net.minecraft.client.renderer.texture.TextureAtlasSprite)2 EnumFacing (net.minecraft.util.EnumFacing)2 ModBlocks (com.ferreusveritas.dynamictrees.ModBlocks)1 ModConstants (com.ferreusveritas.dynamictrees.ModConstants)1 ModItems (com.ferreusveritas.dynamictrees.ModItems)1 ModTrees (com.ferreusveritas.dynamictrees.ModTrees)1 TreeHelper (com.ferreusveritas.dynamictrees.api.TreeHelper)1 ModelHelper (com.ferreusveritas.dynamictrees.api.client.ModelHelper)1 ILeavesProperties (com.ferreusveritas.dynamictrees.api.treedata.ILeavesProperties)1 ITreePart (com.ferreusveritas.dynamictrees.api.treedata.ITreePart)1 com.ferreusveritas.dynamictrees.blocks (com.ferreusveritas.dynamictrees.blocks)1 IMimic (com.ferreusveritas.dynamictrees.blocks.MimicProperty.IMimic)1 BlockColorMultipliers (com.ferreusveritas.dynamictrees.client.BlockColorMultipliers)1 QuadManipulator (com.ferreusveritas.dynamictrees.client.QuadManipulator)1 EntityFallingTree (com.ferreusveritas.dynamictrees.entities.EntityFallingTree)1 BlockBreakAnimationClientHandler (com.ferreusveritas.dynamictrees.event.BlockBreakAnimationClientHandler)1 ModelBakeEventListener (com.ferreusveritas.dynamictrees.event.ModelBakeEventListener)1 TextureGenerationHandler (com.ferreusveritas.dynamictrees.event.TextureGenerationHandler)1 DendroPotion (com.ferreusveritas.dynamictrees.items.DendroPotion)1