13f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian/*
23f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * Copyright 2013 The Android Open Source Project
33f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian *
43f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
53f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * you may not use this file except in compliance with the License.
63f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * You may obtain a copy of the License at
73f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian *
83f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
93f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian *
103f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * Unless required by applicable law or agreed to in writing, software
113f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
123f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * See the License for the specific language governing permissions and
143f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian * limitations under the License.
153f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian */
163f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
173f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#ifndef SF_RENDER_ENGINE_MESH_H
183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#define SF_RENDER_ENGINE_MESH_H
193f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
203f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#include <stdint.h>
213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiannamespace android {
233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianclass Mesh {
253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianpublic:
263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    enum Primitive {
275cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        TRIANGLES       = 0x0004,       // GL_TRIANGLES
285cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        TRIANGLE_STRIP  = 0x0005,       // GL_TRIANGLE_STRIP
295cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        TRIANGLE_FAN    = 0x0006        // GL_TRIANGLE_FAN
303f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    };
313f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
323f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    Mesh(Primitive primitive, size_t vertexCount, size_t vertexSize, size_t texCoordsSize = 0);
333f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    ~Mesh();
343f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
355cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    /*
36ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian     * VertexArray handles the stride automatically.
375cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian     */
38ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    template <typename TYPE>
395cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    class VertexArray {
405cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        friend class Mesh;
415cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        float* mData;
425cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        size_t mStride;
435cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian        VertexArray(float* data, size_t stride) : mData(data), mStride(stride) { }
445cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    public:
45ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        TYPE& operator[](size_t index) {
46ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian            return *reinterpret_cast<TYPE*>(&mData[index*mStride]);
47ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        }
48ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        TYPE const& operator[](size_t index) const {
49ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian            return *reinterpret_cast<TYPE const*>(&mData[index*mStride]);
50ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian        }
515cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    };
525cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian
53ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    template <typename TYPE>
54ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    VertexArray<TYPE> getPositionArray() { return VertexArray<TYPE>(getPositions(), mStride); }
55ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian
56ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    template <typename TYPE>
57ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian    VertexArray<TYPE> getTexCoordArray() { return VertexArray<TYPE>(getTexCoords(), mStride); }
583f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
593f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    Primitive getPrimitive() const;
603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
615cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    // returns a pointer to the vertices positions
625cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    float const* getPositions() const;
633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
645cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    // returns a pointer to the vertices  texture coordinates
653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float const* getTexCoords() const;
663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
675cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    // number of vertices in this mesh
683f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    size_t getVertexCount() const;
695cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian
705cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    // dimension of vertices
713f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    size_t getVertexSize() const;
725cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian
735cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    // dimension of texture coordinates
743f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    size_t getTexCoordsSize() const;
753f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
765cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    // return stride in bytes
773f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    size_t getByteStride() const;
785cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian
795cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    // return stride in floats
803f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    size_t getStride() const;
813f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
823f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianprivate:
835cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    Mesh(const Mesh&);
845cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    Mesh& operator = (const Mesh&);
855cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    Mesh const& operator = (const Mesh&) const;
865cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian
875cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    float* getPositions();
885cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian    float* getTexCoords();
893f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    float* mVertices;
903f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    size_t mVertexCount;
913f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    size_t mVertexSize;
923f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    size_t mTexCoordsSize;
933f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    size_t mStride;
943f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian    Primitive mPrimitive;
953f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian};
963f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
973f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian
983f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} /* namespace android */
993f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif /* SF_RENDER_ENGINE_MESH_H */
100