SparrowRenderer/imesh.h

60 lines
1.4 KiB
C++

#ifndef IMESH_H
#define IMESH_H
#include <glew/glew.h>
#include <vector>
#include <glm/vec3.hpp>
#include <glm/vec2.hpp>
class IMesh
{
protected:
enum {POSITION_BUFFER, NORMAL_BUFFER, TEXCOORD_BUFFER, TANGENT_BUFFER, INDICES_BUFFER, NB_BUFFERS};
typedef struct
{
glm::vec3 tangent;
glm::vec3 bitangent;
} Tangents;
std::vector<glm::vec3> positions;
std::vector<glm::vec3> normals;
std::vector<glm::vec2> texCoords;
std::vector<Tangents> tangents;
std::vector<unsigned int> indices;
GLuint vao;
GLuint vbo[NB_BUFFERS];
bool locked;
public:
~IMesh();
void addTriangle(int i1, int i2, int i3);
void addVertex(float x, float y, float z);
void addVertex(glm::vec3 &position);
void addVertex(glm::vec3 &position, glm::vec3 &normal);
void addVertex(glm::vec3 &position, glm::vec2 &texCoord);
void addVertex(glm::vec3 &position, glm::vec3 &normal, glm::vec2 &texCoord);
void computeFaceNormals();
void computeVertexNormals();
void computeTangents();
bool hasNormals();
bool hasTexCoords();
bool hasTangents();
/*
* When the mesh is locked, addFace and addVertex do nothing, but the mesh can be drawn
* initGL locks the mesh
* destroyGL unlocks the mesh
*/
void initGL(bool isDynamic = false);
void destroyGL();
void draw();
bool isLocked(){return locked;}
};
#endif // IMESH_H