/*
 * Copyright (c) 2009-2012 jMonkeyEngine
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
 *   may be used to endorse or promote products derived from this software
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.jme3.terrain.geomipmap;

import com.jme3.scene.VertexBuffer.Type;
import java.nio.Buffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;

/**
 * Stores a terrain patch's details so the LOD background thread can update
 * the actual terrain patch back on the ogl thread.
 *
 * @author Brent Owens
 *
 */
public class UpdatedTerrainPatch {

    private TerrainPatch updatedPatch;
    private int newLod;
    private int previousLod;
    private int rightLod,topLod,leftLod,bottomLod;
    private Buffer newIndexBuffer;
    //private boolean reIndexNeeded = false;
    private boolean fixEdges = false;

    public UpdatedTerrainPatch(TerrainPatch updatedPatch) {
        this.updatedPatch = updatedPatch;
    }

    public UpdatedTerrainPatch(TerrainPatch updatedPatch, int newLod) {
        this.updatedPatch = updatedPatch;
        this.newLod = newLod;
    }

    public String getName() {
        return updatedPatch.getName();
    }

    protected boolean lodChanged() {
        if ( previousLod != newLod)
            return true;
        else
            return false;
    }

    protected TerrainPatch getUpdatedPatch() {
        return updatedPatch;
    }

    protected void setUpdatedPatch(TerrainPatch updatedPatch) {
        this.updatedPatch = updatedPatch;
    }

    protected int getNewLod() {
        return newLod;
    }
    
    public void setNewLod(int newLod) {
        this.newLod = newLod;
        if (this.newLod < 0)
            throw new IllegalArgumentException("newLod cannot be less than zero, was: "+newLod);
    }

    /*protected IntBuffer getNewIndexBuffer() {
        return newIndexBuffer;
    }*/

    protected void setNewIndexBuffer(Buffer newIndexBuffer) {
        this.newIndexBuffer = newIndexBuffer;
    }


    protected int getRightLod() {
        return rightLod;
    }


    protected void setRightLod(int rightLod) {
        this.rightLod = rightLod;
    }


    protected int getTopLod() {
        return topLod;
    }


    protected void setTopLod(int topLod) {
        this.topLod = topLod;
    }


    protected int getLeftLod() {
        return leftLod;
    }


    protected void setLeftLod(int leftLod) {
        this.leftLod = leftLod;
    }


    protected int getBottomLod() {
        return bottomLod;
    }


    protected void setBottomLod(int bottomLod) {
        this.bottomLod = bottomLod;
    }

    public boolean isReIndexNeeded() {
        if (lodChanged() || isFixEdges())
            return true;
        //if (leftLod != newLod || rightLod != newLod || bottomLod != newLod || topLod != newLod)
        //    return true;
        return false;
    }

    /*public void setReIndexNeeded(boolean reIndexNeeded) {
        this.reIndexNeeded = reIndexNeeded;
    }*/

    public boolean isFixEdges() {
        return fixEdges;
    }

    public void setFixEdges(boolean fixEdges) {
        this.fixEdges = fixEdges;
    }

    /*public int getPreviousLod() {
        return previousLod;
    }*/

    public void setPreviousLod(int previousLod) {
        this.previousLod = previousLod;
    }

    public void updateAll() {
        updatedPatch.setLod(newLod);
        updatedPatch.setLodRight(rightLod);
        updatedPatch.setLodTop(topLod);
        updatedPatch.setLodLeft(leftLod);
        updatedPatch.setLodBottom(bottomLod);
        if (newIndexBuffer != null && isReIndexNeeded()) {
            updatedPatch.setPreviousLod(previousLod);
            updatedPatch.getMesh().clearBuffer(Type.Index);
            if (newIndexBuffer instanceof IntBuffer)
                updatedPatch.getMesh().setBuffer(Type.Index, 3, (IntBuffer)newIndexBuffer);
            else if (newIndexBuffer instanceof ShortBuffer)
                updatedPatch.getMesh().setBuffer(Type.Index, 3, (ShortBuffer)newIndexBuffer);
        }
    }
    
}
