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