60 lines
1.4 KiB
C++
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
|