/* * 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. */ #include #include namespace android { namespace renderengine { Mesh::Mesh(Primitive primitive, size_t vertexCount, size_t vertexSize, size_t texCoordSize, size_t cropCoordsSize, size_t shadowColorSize, size_t shadowParamsSize, size_t indexCount) : mVertexCount(vertexCount), mVertexSize(vertexSize), mTexCoordsSize(texCoordSize), mCropCoordsSize(cropCoordsSize), mShadowColorSize(shadowColorSize), mShadowParamsSize(shadowParamsSize), mPrimitive(primitive), mIndexCount(indexCount) { if (vertexCount == 0) { mVertices.resize(1); mVertices[0] = 0.0f; mStride = 0; return; } size_t stride = vertexSize + texCoordSize + cropCoordsSize + shadowColorSize + shadowParamsSize; size_t remainder = (stride * vertexCount) / vertexCount; // Since all of the input parameters are unsigned, if stride is less than // either vertexSize or texCoordSize, it must have overflowed. remainder // will be equal to stride as long as stride * vertexCount doesn't overflow. if ((stride < vertexSize) || (remainder != stride)) { ALOGE("Overflow in Mesh(..., %zu, %zu, %zu, %zu, %zu, %zu)", vertexCount, vertexSize, texCoordSize, cropCoordsSize, shadowColorSize, shadowParamsSize); mVertices.resize(1); mVertices[0] = 0.0f; mVertexCount = 0; mVertexSize = 0; mTexCoordsSize = 0; mCropCoordsSize = 0; mShadowColorSize = 0; mShadowParamsSize = 0; mStride = 0; return; } mVertices.resize(stride * vertexCount); mStride = stride; mIndices.resize(indexCount); } Mesh::Primitive Mesh::getPrimitive() const { return mPrimitive; } float const* Mesh::getPositions() const { return mVertices.data(); } float* Mesh::getPositions() { return mVertices.data(); } float const* Mesh::getTexCoords() const { return mVertices.data() + mVertexSize; } float* Mesh::getTexCoords() { return mVertices.data() + mVertexSize; } float const* Mesh::getCropCoords() const { return mVertices.data() + mVertexSize + mTexCoordsSize; } float* Mesh::getCropCoords() { return mVertices.data() + mVertexSize + mTexCoordsSize; } float const* Mesh::getShadowColor() const { return mVertices.data() + mVertexSize + mTexCoordsSize + mCropCoordsSize; } float* Mesh::getShadowColor() { return mVertices.data() + mVertexSize + mTexCoordsSize + mCropCoordsSize; } float const* Mesh::getShadowParams() const { return mVertices.data() + mVertexSize + mTexCoordsSize + mCropCoordsSize + mShadowColorSize; } float* Mesh::getShadowParams() { return mVertices.data() + mVertexSize + mTexCoordsSize + mCropCoordsSize + mShadowColorSize; } uint16_t const* Mesh::getIndices() const { return mIndices.data(); } uint16_t* Mesh::getIndices() { return mIndices.data(); } size_t Mesh::getVertexCount() const { return mVertexCount; } size_t Mesh::getVertexSize() const { return mVertexSize; } size_t Mesh::getTexCoordsSize() const { return mTexCoordsSize; } size_t Mesh::getShadowColorSize() const { return mShadowColorSize; } size_t Mesh::getShadowParamsSize() const { return mShadowParamsSize; } size_t Mesh::getByteStride() const { return mStride * sizeof(float); } size_t Mesh::getStride() const { return mStride; } size_t Mesh::getIndexCount() const { return mIndexCount; } } // namespace renderengine } // namespace android