/*
 * Copyright 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SF_RENDER_ENGINE_MESH_H
#define SF_RENDER_ENGINE_MESH_H

#include <stdint.h>

namespace android {

class Mesh {
public:
    enum Primitive {
        TRIANGLES       = 0x0004,       // GL_TRIANGLES
        TRIANGLE_STRIP  = 0x0005,       // GL_TRIANGLE_STRIP
        TRIANGLE_FAN    = 0x0006        // GL_TRIANGLE_FAN
    };

    Mesh(Primitive primitive, size_t vertexCount, size_t vertexSize, size_t texCoordsSize = 0);
    ~Mesh();

    /*
     * VertexArray handles the stride automatically.
     */
    template <typename TYPE>
    class VertexArray {
        friend class Mesh;
        float* mData;
        size_t mStride;
        VertexArray(float* data, size_t stride) : mData(data), mStride(stride) { }
    public:
        TYPE& operator[](size_t index) {
            return *reinterpret_cast<TYPE*>(&mData[index*mStride]);
        }
        TYPE const& operator[](size_t index) const {
            return *reinterpret_cast<TYPE const*>(&mData[index*mStride]);
        }
    };

    template <typename TYPE>
    VertexArray<TYPE> getPositionArray() { return VertexArray<TYPE>(getPositions(), mStride); }

    template <typename TYPE>
    VertexArray<TYPE> getTexCoordArray() { return VertexArray<TYPE>(getTexCoords(), mStride); }

    Primitive getPrimitive() const;

    // returns a pointer to the vertices positions
    float const* getPositions() const;

    // returns a pointer to the vertices  texture coordinates
    float const* getTexCoords() const;

    // number of vertices in this mesh
    size_t getVertexCount() const;

    // dimension of vertices
    size_t getVertexSize() const;

    // dimension of texture coordinates
    size_t getTexCoordsSize() const;

    // return stride in bytes
    size_t getByteStride() const;

    // return stride in floats
    size_t getStride() const;

private:
    Mesh(const Mesh&);
    Mesh& operator = (const Mesh&);
    Mesh const& operator = (const Mesh&) const;

    float* getPositions();
    float* getTexCoords();
    float* mVertices;
    size_t mVertexCount;
    size_t mVertexSize;
    size_t mTexCoordsSize;
    size_t mStride;
    Primitive mPrimitive;
};


} /* namespace android */
#endif /* SF_RENDER_ENGINE_MESH_H */
