File GLObject.h¶
File List > AIAC > Render > GLObject.h
Go to the documentation of this file
#pragma once
#include <vector>
#include "AIAC/GlHeader.h"
#include "glm/glm.hpp"
namespace AIAC {
enum class GLObjectType {
POINTS,
LINES,
TRIANGLES
};
class GLObject {
public:
GLObjectType type;
GLuint vertexBuf;
GLuint colorBuf;
GLsizei size; // how many objects to Draw (for glDrawArrays)
GLObject() = default;
~GLObject() {};
// copy constructor
GLObject(const GLObject &other) {
type = other.type;
vertexBuf = other.vertexBuf;
colorBuf = other.colorBuf;
size = other.size;
}
GLObject& operator=(const GLObject &other) {
type = other.type;
vertexBuf = other.vertexBuf;
colorBuf = other.colorBuf;
size = other.size;
return *this;
}
virtual void Draw() = 0;
// must be called if data is already buffered
// I didn't do this inside deconstructor because there might be multiple <GLObject> instances holding the same VBOs
// For example, when operator= or copy operator is called, it shouldn't do this delete
void DeleteVBOs();
protected:
void BindVBOs();
void BufferData(const std::vector<glm::vec3> &vertices, const std::vector<glm::vec4> &colors);
};
// ----------------- //
// GLPointObject //
// ----------------- //
class GLPointObject : public GLObject {
public:
GLPointObject() { type = GLObjectType::POINTS; }
GLPointObject(const std::vector<glm::vec3> &vertices, const std::vector<glm::vec4> &colors, GLfloat pointSize = 1.0f);
// copy constructor
GLPointObject(const GLPointObject &other) : GLObject(other) {
pointSize = other.pointSize;
}
GLPointObject& operator=(const GLPointObject &other) {
GLObject::operator=(other);
pointSize = other.pointSize;
return *this;
}
virtual void Draw();
public:
GLfloat pointSize;
};
// ----------------- //
// GLLineObject //
// ----------------- //
class GLLineObject : public GLObject {
public:
GLLineObject() { type = GLObjectType::LINES; }
GLLineObject(const std::vector<glm::vec3> &vertices, const std::vector<glm::vec4> &colors, GLfloat lineWidth = 1.0f);
// copy constructor
GLLineObject(const GLLineObject &other) : GLObject(other) {
lineWidth = other.lineWidth;
}
GLLineObject& operator=(const GLLineObject &other) {
GLObject::operator=(other);
lineWidth = other.lineWidth;
return *this;
}
virtual void Draw();
public:
GLfloat lineWidth;
};
// -------------------- //
// GLMeshObject //
// -------------------- //
class GLMeshObject : public GLObject {
public:
GLMeshObject() { type = GLObjectType::TRIANGLES; }
GLMeshObject(const std::vector<glm::vec3> &vertices, const std::vector<glm::vec4> &colors, const std::vector<uint32_t> &indices);
// copy constructor
GLMeshObject(const GLMeshObject &other) : GLObject(other) {
indexBuf = other.indexBuf;
m_Vertices = other.m_Vertices;
m_Colors = other.m_Colors;
m_Indices = other.m_Indices;
}
GLMeshObject& operator=(const GLMeshObject &other) {
GLObject::operator=(other);
indexBuf = other.indexBuf;
m_Vertices = other.m_Vertices;
m_Colors = other.m_Colors;
m_Indices = other.m_Indices;
return *this;
}
virtual void Draw();
public:
GLuint indexBuf;
std::vector<glm::vec3> m_Vertices;
std::vector<glm::vec4> m_Colors;
std::vector<uint32_t> m_Indices;
};
// --------------------- //
// Auxilary function //
// --------------------- //
glm::vec3 GetTransformed(glm::mat4 transformMat, float x, float y, float z);
std::vector< std::shared_ptr<GLObject> > CreateCylinder(const glm::vec3 &baseCenter, const glm::vec3 &topCenter, GLfloat radius, glm::vec4 color, glm::vec4 edgeColor, int sectorNum=-1);
std::vector< std::shared_ptr<GLObject> > CreateCircle(glm::vec3 center, glm::vec3 normal, float radius, glm::vec4 color, glm::vec4 edgeColor, float edgeWeight, int sectorNum = -1);
std::vector< std::shared_ptr<GLObject> > CreatePolyline(std::vector<glm::vec3> vertices, bool isClosed, glm::vec4 color, float lineWidth);
}