blob: ea56c5746f8fe6015866161f91931dde4e44ea2f [file] [log] [blame]
/*
* (c) Copyright 1993, Silicon Graphics, Inc.
* Copyright © 2012 Linaro Limited
*
* This file is part of the glmark2 OpenGL (ES) 2.0 benchmark.
*
* glmark2 is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* glmark2 is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* glmark2. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Jesse Barker
*/
#ifndef CHARACTERS_H_
#define CHARACTERS_H_
#include <vector>
#include "vec.h"
#include "gl-headers.h"
class PrimitiveState
{
public:
PrimitiveState(unsigned int type, unsigned int count, unsigned int offset) :
type_(type),
count_(count),
bufferOffset_(offset) {}
~PrimitiveState() {}
void issue() const
{
glDrawElements(type_, count_, GL_UNSIGNED_SHORT,
reinterpret_cast<const GLvoid*>(bufferOffset_));
}
private:
PrimitiveState();
unsigned int type_; // Primitive type (e.g. GL_TRIANGLE_STRIP)
unsigned int count_; // Number of primitives
unsigned int bufferOffset_; // Offset into the element array buffer
};
struct Character
{
void draw()
{
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects_[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects_[1]);
glVertexAttribPointer(vertexIndex_, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(vertexIndex_);
for (std::vector<PrimitiveState>::const_iterator primIt = primVec_.begin();
primIt != primVec_.end();
primIt++)
{
primIt->issue();
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
void init(int vertexAttribIndex)
{
vertexIndex_ = vertexAttribIndex;
// We need 2 buffers for our work here. One for the vertex data.
// and one for the index data.
glGenBuffers(2, &bufferObjects_[0]);
// First, setup the vertex data by binding the first buffer object,
// allocating its data store, and filling it in with our vertex data.
glBindBuffer(GL_ARRAY_BUFFER, bufferObjects_[0]);
glBufferData(GL_ARRAY_BUFFER, vertexData_.size() * sizeof(LibMatrix::vec2),
&vertexData_.front(), GL_STATIC_DRAW);
// Finally, setup the pointer to our vertex data and enable this
// attribute array.
glVertexAttribPointer(vertexIndex_, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(vertexIndex_);
// Now repeat for our index data.
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects_[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,
indexData_.size() * sizeof(unsigned short), &indexData_.front(),
GL_STATIC_DRAW);
// Unbind our vertex buffer objects so that their state isn't affected
// by other objects.
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
~Character()
{
glDeleteBuffers(2, &bufferObjects_[0]);
}
Character() :
vertexIndex_(0),
vertexArray_(0) {}
unsigned int bufferObjects_[2];
std::vector<LibMatrix::vec2> vertexData_;
std::vector<unsigned short> indexData_;
int vertexIndex_;
unsigned int vertexArray_;
std::vector<PrimitiveState> primVec_;
};
struct LetterI : Character
{
LetterI();
};
struct LetterD : Character
{
LetterD();
};
struct LetterE : Character
{
LetterE();
};
struct LetterA : Character
{
LetterA();
};
struct LetterS : Character
{
LetterS();
};
struct LetterN : Character
{
LetterN();
};
struct LetterM : Character
{
LetterM();
};
struct LetterO : Character
{
LetterO();
};
struct LetterT : Character
{
LetterT();
};
#endif // CHARACTERS_H_