package com.brackeen.javagamebook.bsp2D;

import com.brackeen.javagamebook.math3D.*;

/**
    Klasa BSPPolygon jest rozszerzeniem klasy TexturedPolygon3D
    z dodatkowymi stałymi typu (TYPE_FLOOR, TYPE_WALL lub 
    TYPE_PASSABLE_WALL), wartością intensywności światła
    otoczenia i obiektem klasy BSPLine (jeśli typem ściany jest
    TYPE_WALL lub TYPE_PASSABLE_WALL).
*/
public class BSPPolygon extends TexturedPolygon3D {

    public static final int TYPE_FLOOR = 0;
    public static final int TYPE_WALL = 1;
    public static final int TYPE_PASSABLE_WALL = 2;

    /**
        Definiuje odległość, w jakiej musi się znajdować ściana, by
        potwóry i gracze mogli ją przekraczać.
    */
    public static final int PASSABLE_WALL_THRESHOLD = 32;

    /**
        Definiuje wysokość przejścia, która umożliwia potwórom i graczom
        jego pokonywanie.
    */
    public static final int PASSABLE_ENTRYWAY_THRESHOLD = 128;


    private int type;
    private float ambientLightIntensity;
    private BSPLine line;

    /**
        Tworzy nowy obiekt BSPPolygon dla przekazanych wierzchołków
        i typu (TYPE_FLOOR, TYPE_WALL lub TYPE_PASSABLE_WALL).
    */
    public BSPPolygon(Vector3D[] vertices, int type) {
        super(vertices);
        this.type = type;
        ambientLightIntensity = 0.5f;
        if (isWall()) {
            line = new BSPLine(this);
        }
    }


    /**
        Powiela ten wielokąt, jednak z innym zbiorem wierzchołków.
    */
    public BSPPolygon clone(Vector3D[] vertices) {
        BSPPolygon clone = new BSPPolygon(vertices, type);
        clone.setNormal(getNormal());
        clone.setAmbientLightIntensity(getAmbientLightIntensity());
        if (getTexture() != null) {
            clone.setTexture(getTexture(), getTextureBounds());
        }
        return clone;
    }


    /**
        Zwraca true, jeśli ten obiekt BSPPolygon reprezentuje ścianę.
    */
    public boolean isWall() {
        return (type == TYPE_WALL) || (type == TYPE_PASSABLE_WALL);
    }


    /**
        Zwraca true, jeśli ten obiekt BSPPolygon reprezentuje ścianę
        uniemożliwiającą przejście.
    */
    public boolean isSolidWall() {
        return type == TYPE_WALL;
    }


    /**
        Zwraca linię reprezentującą ten obiekt BSPPolygon. Zwraca null,
        jeśli ten obiekt BSPPolygon nie jest ścianą.
    */
    public BSPLine getLine() {
        return line;
    }


    public void setAmbientLightIntensity(float a) {
        ambientLightIntensity = a;
    }


    public float getAmbientLightIntensity() {
        return ambientLightIntensity;
    }

}
