159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.texture;
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.List;
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level;
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This class implements a Texture array
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * warning, this feature is only supported on opengl 3.0 version.
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * To check if a hardware supports TextureArray check :
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * renderManager.getRenderer().getCaps().contains(Caps.TextureArray)
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author phate666
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class TextureArray extends Texture {
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private WrapMode wrapS = WrapMode.EdgeClamp;
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    private WrapMode wrapT = WrapMode.EdgeClamp;
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Construct a TextureArray
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * warning, this feature is only supported on opengl 3.0 version.
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * To check if a hardware supports TextureArray check :
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * renderManager.getRenderer().getCaps().contains(Caps.TextureArray)
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public TextureArray() {
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super();
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * Construct a TextureArray from the given list of images
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * warning, this feature is only supported on opengl 3.0 version.
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * To check if a hardware supports TextureArray check :
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * renderManager.getRenderer().getCaps().contains(Caps.TextureArray)
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * @param images
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public TextureArray(List<Image> images) {
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        super();
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int width = images.get(0).getWidth();
3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        int height = images.get(0).getHeight();
4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        Image arrayImage = new Image(images.get(0).getFormat(), width, height,
4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                null);
4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        for (Image img : images) {
4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            if (img.getHeight() != height || img.getWidth() != width) {
4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                Logger.getLogger(TextureArray.class.getName()).log(
4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        Level.WARNING,
4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                        "all images must have the same width/height");
4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                continue;
4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            }
5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            arrayImage.addData(img.getData(0));
5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        setImage(arrayImage);
5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Texture createSimpleClone() {
5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        TextureArray clone = new TextureArray();
5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        createSimpleClone(clone);
5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return clone;
6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Texture createSimpleClone(Texture rVal) {
6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        rVal.setWrap(WrapAxis.S, wrapS);
6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        rVal.setWrap(WrapAxis.T, wrapT);
6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return super.createSimpleClone(rVal);
6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public Type getType() {
7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        return Type.TwoDimensionalArray;
7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public WrapMode getWrap(WrapAxis axis) {
7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        switch (axis) {
7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case S:
7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return wrapS;
7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case T:
8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                return wrapT;
8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            default:
8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                throw new IllegalArgumentException("invalid WrapAxis: " + axis);
8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setWrap(WrapAxis axis, WrapMode mode) {
8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (mode == null) {
8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throw new IllegalArgumentException("mode can not be null.");
9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        } else if (axis == null) {
9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throw new IllegalArgumentException("axis can not be null.");
9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        switch (axis) {
9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case S:
9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                this.wrapS = mode;
9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            case T:
9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                this.wrapT = mode;
9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                break;
10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            default:
10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta                throw new IllegalArgumentException("Not applicable for 2D textures");
10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    @Override
10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    public void setWrap(WrapMode mode) {
10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        if (mode == null) {
10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta            throw new IllegalArgumentException("mode can not be null.");
10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        }
11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.wrapS = mode;
11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta        this.wrapT = mode;
11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    }
11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}