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#include "Mesh.h" 183f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 19ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza#include <utils/Log.h> 20ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza 213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiannamespace android { 223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias AgopianMesh::Mesh(Primitive primitive, size_t vertexCount, size_t vertexSize, size_t texCoordSize) 243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian : mVertexCount(vertexCount), mVertexSize(vertexSize), mTexCoordsSize(texCoordSize), 253f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mPrimitive(primitive) 263f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian{ 27ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza if (vertexCount == 0) { 28ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mVertices = new float[1]; 29ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mVertices[0] = 0.0f; 30ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mStride = 0; 31ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza return; 32ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza } 33ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza 34ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza size_t stride = vertexSize + texCoordSize; 35ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza size_t remainder = (stride * vertexCount) / vertexCount; 36ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza // Since all of the input parameters are unsigned, if stride is less than 37ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza // either vertexSize or texCoordSize, it must have overflowed. remainder 38ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza // will be equal to stride as long as stride * vertexCount doesn't overflow. 39ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza if ((stride < vertexSize) || (remainder != stride)) { 40ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza ALOGE("Overflow in Mesh(..., %zu, %zu, %zu)", vertexCount, vertexSize, 41ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza texCoordSize); 42ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mVertices = new float[1]; 43ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mVertices[0] = 0.0f; 44ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mVertexCount = 0; 45ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mVertexSize = 0; 46ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mTexCoordsSize = 0; 47ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mStride = 0; 48ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza return; 49ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza } 50ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza 51ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mVertices = new float[stride * vertexCount]; 52ab79e33ef3a21a2b14bf15bc4c85aef247b4ad95Dan Stoza mStride = stride; 533f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 543f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 553f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias AgopianMesh::~Mesh() { 563f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian delete [] mVertices; 573f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 583f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 593f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias AgopianMesh::Primitive Mesh::getPrimitive() const { 603f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mPrimitive; 613f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 623f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 633f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 645cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopianfloat const* Mesh::getPositions() const { 653f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mVertices; 663f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 675cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopianfloat* Mesh::getPositions() { 683f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mVertices; 693f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 703f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 713f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianfloat const* Mesh::getTexCoords() const { 723f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mVertices + mVertexSize; 733f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 743f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianfloat* Mesh::getTexCoords() { 753f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mVertices + mVertexSize; 763f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 773f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 783f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 793f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiansize_t Mesh::getVertexCount() const { 803f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mVertexCount; 813f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 823f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 833f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiansize_t Mesh::getVertexSize() const { 843f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mVertexSize; 853f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 863f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 873f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiansize_t Mesh::getTexCoordsSize() const { 883f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mTexCoordsSize; 893f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 903f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 913f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiansize_t Mesh::getByteStride() const { 923f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mStride*sizeof(float); 933f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 943f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 953f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopiansize_t Mesh::getStride() const { 963f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian return mStride; 973f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} 983f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 993f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian} /* namespace android */ 100