/**
 * Copyright 2014 JogAmp Community. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 *
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 *
 *    2. 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.
 *
 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``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 JogAmp Community 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.
 *
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of JogAmp Community.
 */
package jogamp.opengl.util.stereo;

import com.jogamp.opengl.util.stereo.EyeParameter;
import com.jogamp.opengl.util.stereo.generic.GenericStereoDeviceConfig;

public class DistortionMesh {
    public static interface Producer {
        /**
         * Initialize
         * @param deviceConfig
         * @param eyeReliefInMeters
         * @throws IllegalStateException if already initialized
         */
        void init(final GenericStereoDeviceConfig deviceConfig, final float[] eyeReliefInMeters) throws IllegalStateException;

        /** Distortion Mesh Producer */
        DistortionMesh create(final EyeParameter eyeParam, final int distortionBits);
    }
    public static class DistortionVertex {
        /** {@value} */
        public static final int def_pos_size = 2;
        /** {@value} */
        public static final int def_vignetteFactor_size = 1;
        /** {@value} */
        public static final int def_timewarpFactor_size = 1;
        /** {@value} */
        public static final int def_texR_size = 2;
        /** {@value} */
        public static final int def_texG_size = 2;
        /** {@value} */
        public static final int def_texB_size = 2;

        /** {@value} */
        public static final int def_total_size = def_pos_size + def_vignetteFactor_size + def_timewarpFactor_size +
                                                 def_texR_size + def_texG_size + def_texB_size;

        public DistortionVertex(final float[] data, final int pos_size,
                                final int vignetteFactor_size, final int timewarpFactor_size, final int texR_size,
                                final int texG_size, final int texB_size) {
            this.data = data;
            this.pos_size = pos_size;
            this.vignetteFactor_size = vignetteFactor_size;
            this.timewarpFactor_size = timewarpFactor_size;
            this.texR_size = texR_size;
            this.texG_size = texG_size;
            this.texB_size = texB_size;
        }
        final float[] data;

        /** Usually {@link #def_pos_size} */
        final int pos_size;
        /** Usually {@link #def_vignetteFactor_size} */
        final int vignetteFactor_size;
        /** Usually {@link #def_timewarpFactor_size} */
        final int timewarpFactor_size;
        /** Usually {@link #def_texR_size} */
        final int texR_size;
        /** Usually {@link #def_texG_size} */
        final int texG_size;
        /** Usually {@link #def_texB_size} */
        final int texB_size;
    }
    public DistortionMesh(final DistortionMesh.DistortionVertex[] vertices, final int vertexCount,
                          final short[] indices, final int indexCount) {
        this.vertices = vertices;
        this.vertexCount = vertexCount;
        this.indices = indices;
        this.indexCount = indexCount;
    }
    final DistortionMesh.DistortionVertex[] vertices;
    final int vertexCount;
    final short[] indices;
    final int indexCount;
}
