/*
* Copyright (C) 2011 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.
*/
#ifndef GLES_POINTER_H
#define GLES_POINTER_H

#include <GLES/gl.h>
#include "GLESbuffer.h"

class GLESpointer {
public:
    GLenum getType() const;
    GLint getSize() const;
    GLsizei getStride() const;
    const GLvoid* getArrayData() const;
    GLvoid* getBufferData() const;
    GLuint getBufferName() const;
    GLboolean getNormalized() const { return m_normalize ? GL_TRUE : GL_FALSE; }
    const GLvoid* getData() const;
    unsigned int getBufferOffset() const;
    void redirectPointerData();
    void getBufferConversions(const RangeList& rl, RangeList& rlOut);
    bool bufferNeedConversion() { return !m_buffer->fullyConverted(); }
    void setArray(GLint size,
                  GLenum type,
                  GLsizei stride,
                  const GLvoid* data,
                  bool normalize = false);
    void setBuffer(GLint size,
                   GLenum type,
                   GLsizei stride,
                   GLESbuffer* buf,
                   GLuint bufferName,
                   int offset,
                   bool normalize = false);
    bool isEnable() const;
    bool isNormalize() const;
    bool isVBO() const;
    void enable(bool b);

private:
    GLint m_size = 4;
    GLenum m_type = GL_FLOAT;
    GLsizei m_stride = 0;
    bool m_enabled = false;
    bool m_normalize = false;
    bool m_isVBO = false;
    const GLvoid* m_data = nullptr;
    GLESbuffer* m_buffer = nullptr;
    GLuint m_bufferName = 0;
    unsigned int m_buffOffset = 0;
};
#endif
