/*
 * 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 */
