2013-05-10 18:59:30 +02:00
|
|
|
#ifndef MESH_HPP__
|
|
|
|
#define MESH_HPP__
|
|
|
|
|
|
|
|
#include "gl.hpp"
|
|
|
|
#include "shader.hpp"
|
|
|
|
#include "texture.hpp"
|
|
|
|
#include <vector>
|
|
|
|
#include <cstddef>
|
|
|
|
#include <memory>
|
|
|
|
#include "glm/glm.hpp"
|
|
|
|
#include "glm/gtc/matrix_transform.hpp"
|
2013-05-10 22:33:22 +02:00
|
|
|
#include "glm/gtc/type_ptr.hpp"
|
2013-05-11 19:03:51 +02:00
|
|
|
#include "shared.hpp"
|
2013-05-10 18:59:30 +02:00
|
|
|
|
|
|
|
namespace GL
|
|
|
|
{
|
|
|
|
struct Vertex
|
|
|
|
{
|
2013-05-10 22:33:22 +02:00
|
|
|
glm::vec3 vert;
|
|
|
|
glm::vec3 normal;
|
|
|
|
glm::vec2 tex;
|
2013-05-10 18:59:30 +02:00
|
|
|
};
|
|
|
|
|
2013-05-12 01:36:39 +02:00
|
|
|
struct Material
|
|
|
|
{
|
|
|
|
Material() :
|
2013-05-13 01:37:14 +02:00
|
|
|
ambient(0, 0, 0),
|
|
|
|
diffuse(0, 0, 0),
|
2013-05-12 02:46:07 +02:00
|
|
|
specular(0, 0, 0),
|
2013-05-12 13:20:33 +02:00
|
|
|
specular_power(60.0),
|
2013-05-12 02:46:07 +02:00
|
|
|
alpha_mod(1.0f)
|
2013-05-12 01:36:39 +02:00
|
|
|
{}
|
|
|
|
|
|
|
|
glm::vec3 ambient;
|
|
|
|
glm::vec3 diffuse;
|
2013-05-12 02:46:07 +02:00
|
|
|
glm::vec3 specular;
|
2013-05-12 13:20:33 +02:00
|
|
|
float specular_power;
|
2013-05-12 02:46:07 +02:00
|
|
|
float alpha_mod;
|
2013-05-12 01:36:39 +02:00
|
|
|
std1::shared_ptr<Texture> diffuse_map;
|
2013-05-12 13:28:39 +02:00
|
|
|
std1::shared_ptr<Texture> ambient_map;
|
2013-05-12 01:36:39 +02:00
|
|
|
};
|
|
|
|
|
2013-05-10 18:59:30 +02:00
|
|
|
class Mesh
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Mesh();
|
|
|
|
~Mesh();
|
|
|
|
|
2013-05-18 00:31:25 +02:00
|
|
|
std1::shared_ptr<std::vector<Vertex> > get_vertex() const { return vertex; }
|
2013-05-14 02:33:51 +02:00
|
|
|
const Material& get_material() const { return material; }
|
|
|
|
|
2013-05-10 22:33:22 +02:00
|
|
|
void set_vertices(std::vector<Vertex> vertex);
|
2013-05-12 01:36:39 +02:00
|
|
|
void set_vertices(const std1::shared_ptr<std::vector<Vertex> >& vertex);
|
2013-05-10 22:33:22 +02:00
|
|
|
void set_vertex_type(GLenum type);
|
2013-05-12 01:36:39 +02:00
|
|
|
void set_material(const Material& material);
|
2013-05-12 21:46:08 +02:00
|
|
|
void set_blank(const std1::shared_ptr<Texture>& blank);
|
2013-05-12 01:36:39 +02:00
|
|
|
void set_shader(const std1::shared_ptr<Shader>& shader);
|
2013-05-10 18:59:30 +02:00
|
|
|
|
|
|
|
void set_model(const glm::mat4& model);
|
|
|
|
void set_view(const glm::mat4& view);
|
|
|
|
void set_projection(const glm::mat4& projection);
|
2013-05-14 02:07:53 +02:00
|
|
|
void set_eye(const glm::vec3& eye_pos);
|
2013-05-10 18:59:30 +02:00
|
|
|
|
2013-05-14 02:07:53 +02:00
|
|
|
void set_light_pos(const glm::vec3& light_pos);
|
2013-05-12 01:36:39 +02:00
|
|
|
void set_light_ambient(const glm::vec3& light_ambient);
|
|
|
|
|
2013-05-10 18:59:30 +02:00
|
|
|
void render();
|
|
|
|
|
|
|
|
private:
|
|
|
|
GLuint vbo;
|
|
|
|
GLenum vertex_type;
|
2013-05-12 01:36:39 +02:00
|
|
|
std1::shared_ptr<std::vector<Vertex> > vertex;
|
|
|
|
std1::shared_ptr<Shader> shader;
|
2013-05-12 21:46:08 +02:00
|
|
|
std1::shared_ptr<Texture> blank;
|
2013-05-12 01:36:39 +02:00
|
|
|
|
|
|
|
Material material;
|
2013-05-14 02:07:53 +02:00
|
|
|
glm::vec3 light_pos;
|
2013-05-12 01:36:39 +02:00
|
|
|
glm::vec3 light_ambient;
|
2013-05-14 02:07:53 +02:00
|
|
|
glm::vec3 eye_pos;
|
2013-05-10 18:59:30 +02:00
|
|
|
|
|
|
|
glm::mat4 model;
|
|
|
|
glm::mat4 view;
|
|
|
|
glm::mat4 projection;
|
|
|
|
glm::mat4 mvp;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|