All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.pepsoft.worldpainter.objects.WPObjectRenderer Maven / Gradle / Ivy

There is a newer version: 2.23.2
Show newest version
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.pepsoft.worldpainter.objects;

import org.pepsoft.minecraft.Constants;
import org.pepsoft.minecraft.Material;
import org.pepsoft.worldpainter.ColourScheme;
import org.pepsoft.worldpainter.layers.bo2.Bo2Object;

import javax.swing.*;
import javax.vecmath.Point3i;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
 *
 * @author pepijn
 */
public class WPObjectRenderer {
    public WPObjectRenderer(WPObject object, ColourScheme colourScheme, int blockSize) {
        this.object = object;
        dim = object.getDimensions();
        this.colourScheme = colourScheme;
        this.blockSize = blockSize;
        width = getImageCoordinates(dim.x - 1, 0, 0).x + 2 * blockSize;
        height = -getImageCoordinates(dim.x - 1, dim.y - 1, dim.z - 1).y;
    }
    
    public BufferedImage render() {
        final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        final Graphics2D g2 = image.createGraphics();
        try {
            for (int z = 0; z < dim.z; z++) {
                for (int y = dim.y - 1; y >= 0; y--) {
                    for (int x = dim.x - 1; x >= 0; x--) {
                        if (object.getMask(x, dim.y - y - 1, z)) {
                            final Material material = object.getMaterial(x, dim.y - y - 1, z);
                            if (material != Material.AIR) {
                                final Point coords = getImageCoordinates(x, y, z);
                                final int blockType = material.blockType;
                                final int alpha = ((blockType == Constants.BLK_LEAVES) || (blockType == Constants.BLK_LEAVES2)) ? 192 : 255;
                                paintBlock(g2,  coords.x, coords.y, material, alpha);
                            }
                        }
                    }
                }
            }
        } finally {
            g2.dispose();
        }
        return image;
    }

    private void paintBlock(Graphics2D g2, int x, int y, Material material, int alpha) {
        Color colour;
        if (alpha < 255) {
            colour = new Color(colourScheme.getColour(material) | (alpha << 24), true);
            g2.setColor(new Color(colour.brighter().getRGB() | (alpha << 24), true));
        } else {
            colour = new Color(colourScheme.getColour(material));
            g2.setColor(colour.brighter());
        }
        for (int dx = 0; dx < blockSize; dx++) {
            g2.drawLine(x + dx, y + blockSize + dx, x + dx, y + blockSize * 2 - 1 + dx);
        }
        if (alpha < 255) {
            g2.setColor(new Color(colour.darker().getRGB() | (alpha << 24), true));
        } else {
            g2.setColor(colour.darker());
        }
        for (int dx = 0; dx < blockSize; dx++) {
            g2.drawLine(x + blockSize * 2 - 1 - dx, y + blockSize + dx, x + blockSize * 2 - 1 - dx, y + blockSize * 2 - 1 + dx);
        }
        g2.setColor(colour);
        for (int i = 0; i < blockSize; i++) {
            g2.drawLine(x + blockSize - 1 - i, y + i, x + blockSize + i, y + i);
            if (i < (blockSize - 1)) {
                g2.drawLine(x + blockSize - 1 - i, y + (blockSize - 1) * 2 - i, x + blockSize + i, y + (blockSize - 1) * 2 - i);
            }
        }
    }
    
    private Point getImageCoordinates(int x, int y, int z) {
        return new Point(
            (x + dim.y - 1 - y) * blockSize,
            height - 1 - ((y + x + z + 3) * blockSize - 2));
    }
    
    public static void main(String[] args) throws IOException {
        WPObject object = Bo2Object.load(new File("/home/pepijn/NetBeansProjects/Minecraft/BOBPlugins/wessex_tallredwood.bo2"));
//        WPObject object = new WPObject() {
//            public Point3i getDimensions() {
//                return new Point3i(3, 3, 1);
//            }
//
//            public Point3i getOrigin() {
//                return new Point3i(1, 1, 0);
//            }
//
//            public int getBlockID(int x, int y, int z) {
////                if (x == 2 - y) {
//                    return Constants.BLK_STONE;
////                } else {
////                    return Constants.BLK_AIR;
////                }
//            }
//
//            public int getData(int x, int y, int z) {
//                return 0;
//            }
//
//            public boolean getMask(int x, int y, int z) {
////                return (x == 2 - y);
//                return true;
//            }
//        };
        ColourScheme colourScheme = ColourScheme.DEFAULT;
        WPObjectRenderer renderer = new WPObjectRenderer(object, colourScheme, 10);
        BufferedImage image = renderer.render();
        ImageIcon icon = new ImageIcon(image);
        JLabel label = new JLabel(icon);
        JFrame frame = new JFrame("WPObjectRenderer Test");
        frame.getContentPane().add(label, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    
    private final WPObject object;
    private final Point3i dim;
    private final int width, height;
    private final ColourScheme colourScheme;
    private final int blockSize;
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy