package codechicken.lib.lighting;

import codechicken.lib.render.CCRenderState;
import codechicken.lib.vec.BlockCoord;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.util.BlockPos;
import net.minecraft.world.IBlockAccess;

/**
 * Faster precomputed version of LightModel that only works for axis planar sides
 */
public class SimpleBrightnessModel implements CCRenderState.IVertexOperation
{
    public static final int operationIndex = CCRenderState.registerOperation();
    public static SimpleBrightnessModel instance = new SimpleBrightnessModel();

    public IBlockAccess access;
    public BlockCoord pos = new BlockCoord();

    private int sampled = 0;
    private int[] samples = new int[6];
    private BlockCoord c = new BlockCoord();

    public void locate(IBlockAccess a, int x, int y, int z) {
        access = a;
        pos.set(x, y, z);
        sampled = 0;
    }

    public int sample(int side) {
        if ((sampled & 1 << side) == 0) {
            BlockPos bp = c.set(pos).offset(side).pos();
            IBlockState b = access.getBlockState(bp);
            samples[side] = access.getCombinedLight(bp, b.getBlock().getLightValue(access, bp));
            sampled |= 1 << side;
        }
        return samples[side];
    }

    @Override
    public boolean load() {
        CCRenderState.pipeline.addDependency(CCRenderState.sideAttrib);
        return true;
    }

    @Override
    public void operate() {
        CCRenderState.setBrightness(sample(CCRenderState.side));
    }

    @Override
    public int operationID() {
        return operationIndex;
    }
}