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