1
0
Fork 0

Add materials

This commit is contained in:
Meoweg 2015-11-07 13:13:03 +00:00
parent 7942ac6a63
commit fa26f3b61c
1 changed files with 56 additions and 22 deletions

View File

@ -1,5 +1,4 @@
#include <cstdlib> #include <cstdlib>
#include <vector> #include <vector>
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
@ -40,6 +39,26 @@ private:
GLuint _id; GLuint _id;
}; };
class Texture
{
public:
Texture(const char *filename);
void use() const;
private:
GLuint _id;
};
class Material
{
public:
Material(const char *filename);
void use() const;
private:
Texture *_texture;
};
class Model class Model
{ {
public: public:
@ -59,6 +78,8 @@ private:
std::vector<GLushort> elements; std::vector<GLushort> elements;
GLuint id; GLuint id;
Material *_material;
static GLuint create_array_buffer(GLenum type, GLsizeiptr size, const GLvoid *data); static GLuint create_array_buffer(GLenum type, GLsizeiptr size, const GLvoid *data);
}; };
@ -75,16 +96,6 @@ private:
const Model &_model; const Model &_model;
}; };
class Texture
{
public:
Texture(const char *filename);
void use() const;
private:
GLuint _id;
};
static Program build_program(); static Program build_program();
static void iterate(); static void iterate();
@ -92,7 +103,8 @@ static void iterate();
static GLFWCALL void on_key(int key, int action); static GLFWCALL void on_key(int key, int action);
static EM_BOOL on_em_mousemove(int event_type, const EmscriptenMouseEvent *mouse_event, void *user_data); static EM_BOOL on_em_mousemove(int event_type, const EmscriptenMouseEvent *mouse_event, void *user_data);
static GLuint mvp_id; static GLuint mvp_uniform;
static GLuint texture_uniform;
static bool keys[GLFW_KEY_LAST]; static bool keys[GLFW_KEY_LAST];
@ -135,7 +147,10 @@ int main()
Program program = build_program(); Program program = build_program();
program.use(); program.use();
mvp_id = program.get_uniform_location("mvp"); mvp_uniform = program.get_uniform_location("mvp");
texture_uniform = program.get_uniform_location("texture");
glUniform1i(texture_uniform, 0);
suzanne = new Model("/data/models/suzanne.obj"); suzanne = new Model("/data/models/suzanne.obj");
teapot = new Model("/data/models/teapot.obj"); teapot = new Model("/data/models/teapot.obj");
@ -152,13 +167,6 @@ int main()
bunny1 = new Object(*bunny); bunny1 = new Object(*bunny);
bunny1->position.x = 2.0; bunny1->position.x = 2.0;
suzanne_tex = new Texture("/data/textures/suzanne.png");
teapot_tex = new Texture("/data/textures/teapot.png");
bunny_tex = new Texture("/data/textures/bunny.png");
GLint u_texture = program.get_uniform_location("texture");
glUniform1i(u_texture, 0);
glViewport(0, 0, 640, 480); glViewport(0, 0, 640, 480);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
@ -285,6 +293,11 @@ Model::Model(const char *const filename)
elements.push_back(index++); elements.push_back(index++);
} }
} }
else
if (line.substr(0, 7) == "mtllib ")
{
_material = new Material(line.substr(7).c_str());
}
} }
positions_id = create_array_buffer(GL_ARRAY_BUFFER, 3 * positions.size() * sizeof(GLfloat), positions.data()); positions_id = create_array_buffer(GL_ARRAY_BUFFER, 3 * positions.size() * sizeof(GLfloat), positions.data());
@ -310,6 +323,8 @@ GLuint Model::create_array_buffer(const GLenum type, const GLsizeiptr size, cons
void Model::draw() const void Model::draw() const
{ {
_material->use();
glBindBuffer(GL_ARRAY_BUFFER, positions_id); glBindBuffer(GL_ARRAY_BUFFER, positions_id);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<const GLvoid*>(0)); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, reinterpret_cast<const GLvoid*>(0));
@ -337,14 +352,14 @@ void Object::draw(const glm::mat4 &mvp) const
* glm::rotate(glm::mat4(1.0f), glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)) * glm::rotate(glm::mat4(1.0f), glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f))
* glm::rotate(glm::mat4(1.0f), glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); * glm::rotate(glm::mat4(1.0f), glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f));
glUniformMatrix4fv(mvp_id, 1, GL_FALSE, glm::value_ptr(transform)); glUniformMatrix4fv(mvp_uniform, 1, GL_FALSE, glm::value_ptr(transform));
_model.draw(); _model.draw();
} }
Texture::Texture(const char *const filename) Texture::Texture(const char *const filename)
{ {
SDL_Surface *surface = IMG_Load(filename); SDL_Surface *surface = IMG_Load((std::string("/data/textures/") + filename).c_str());
glGenTextures(1, &_id); glGenTextures(1, &_id);
glBindTexture(GL_TEXTURE_2D, _id); glBindTexture(GL_TEXTURE_2D, _id);
@ -359,6 +374,25 @@ void Texture::use() const
glBindTexture(GL_TEXTURE_2D, _id); glBindTexture(GL_TEXTURE_2D, _id);
} }
Material::Material(const char *const filename)
{
std::ifstream file(std::string("/data/materials/") + filename, std::ios::in);
std::string line;
while (std::getline(file, line))
{
if (line.substr(0, 7) == "map_Kd ")
{
_texture = new Texture(line.substr(7).c_str());
}
}
}
void Material::use() const
{
_texture->use();
}
Program build_program() Program build_program()
{ {
const Shader vertex_shader = Shader(GL_VERTEX_SHADER, "/data/shaders/vertex.glsl"); const Shader vertex_shader = Shader(GL_VERTEX_SHADER, "/data/shaders/vertex.glsl");