1
0
Fork 0
This repository has been archived on 2023-03-27. You can view files and clone it, but cannot push or open issues or pull requests.
matabstrix/src/main.cpp

187 lines
4.4 KiB
C++
Raw Normal View History

2015-11-07 14:06:53 +00:00
#include "gl.hpp"
2015-11-07 13:56:06 +00:00
#include "program.hpp"
#include "object.hpp"
2015-11-07 19:38:26 +00:00
#include "transformation.hpp"
2015-11-07 13:56:06 +00:00
2015-11-03 15:40:20 +00:00
#include <cstdlib>
2015-11-04 04:48:27 +00:00
#include <glm/glm.hpp>
2015-11-04 18:38:02 +00:00
#include <glm/gtc/matrix_transform.hpp>
2015-11-04 04:48:27 +00:00
2015-11-03 15:40:20 +00:00
#include <emscripten/emscripten.h>
2015-11-04 18:38:02 +00:00
#include <emscripten/html5.h>
2015-11-05 19:17:04 +00:00
static Program build_program();
static void iterate();
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);
2015-11-07 14:06:53 +00:00
GLuint mvp_uniform;
GLuint local_modelview_uniform;
2015-11-07 13:13:03 +00:00
static GLuint texture_uniform;
2015-11-05 19:17:04 +00:00
static bool keys[GLFW_KEY_LAST];
2015-11-07 19:38:26 +00:00
static Transformation camera;
2015-11-05 00:24:06 +00:00
2015-11-05 19:17:04 +00:00
static Model *suzanne;
static Model *teapot;
static Model *bunny;
static Object *suzanne1;
static Object *teapot1;
static Object *bunny1;
2015-11-04 19:39:44 +00:00
2015-11-03 11:46:05 +00:00
int main()
{
2015-11-03 15:40:20 +00:00
if (!glfwInit())
exit(EXIT_FAILURE);
if (!glfwOpenWindow(640, 480, 8, 8, 8, 8, 16, 0, GLFW_WINDOW))
{
glfwTerminate();
exit(EXIT_FAILURE);
}
2015-11-03 19:00:55 +00:00
if (glewInit() != GLEW_OK)
{
glfwCloseWindow();
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwSetKeyCallback(on_key);
2015-11-04 18:38:02 +00:00
emscripten_set_mousemove_callback(nullptr, nullptr, false, on_em_mousemove);
2015-11-05 19:17:04 +00:00
Program program = build_program();
program.use();
2015-11-03 19:00:55 +00:00
2015-11-07 13:13:03 +00:00
mvp_uniform = program.get_uniform_location("mvp");
local_modelview_uniform = program.get_uniform_location("local_modelview");
2015-11-07 13:13:03 +00:00
texture_uniform = program.get_uniform_location("texture");
glUniform1i(texture_uniform, 0);
2015-11-05 19:17:04 +00:00
2015-11-07 19:38:26 +00:00
camera.position.y = -4;
camera.position.z = 2;
2015-11-05 19:17:04 +00:00
suzanne = new Model("/data/models/suzanne.obj");
teapot = new Model("/data/models/teapot.obj");
bunny = new Model("/data/models/bunny.obj");
suzanne1 = new Object(*suzanne);
2015-11-07 12:03:52 +00:00
suzanne1->position.y = 2;
suzanne1->position.z = 2;
2015-11-05 16:50:43 +00:00
2015-11-05 19:17:04 +00:00
teapot1 = new Object(*teapot);
2015-11-07 12:03:52 +00:00
teapot1->position.x = -2.0;
2015-11-07 15:52:07 +00:00
teapot1->position.z = 1.0;
teapot1->angles.z = 45;
2015-11-03 19:42:02 +00:00
2015-11-05 19:17:04 +00:00
bunny1 = new Object(*bunny);
2015-11-07 12:03:52 +00:00
bunny1->position.x = 2.0;
2015-11-05 14:28:18 +00:00
2015-11-03 19:00:55 +00:00
glViewport(0, 0, 640, 480);
2015-11-04 19:39:44 +00:00
glEnable(GL_DEPTH_TEST);
2015-11-06 22:47:24 +00:00
glClearColor(1, 1, 1, 0);
2015-11-03 19:00:55 +00:00
emscripten_set_main_loop(iterate, 0, 1);
}
2015-11-05 19:17:04 +00:00
Program build_program()
{
const Shader vertex_shader = Shader(GL_VERTEX_SHADER, "/data/shaders/vertex.glsl");
const Shader fragment_shader = Shader(GL_FRAGMENT_SHADER, "/data/shaders/fragment.glsl");
Program program;
program.attach_shader(vertex_shader);
program.attach_shader(fragment_shader);
program.bind_attrib_location(0, "position");
program.bind_attrib_location(1, "tex_coord");
2015-11-05 22:47:06 +00:00
program.bind_attrib_location(2, "normal");
2015-11-05 19:17:04 +00:00
program.link();
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
2015-11-05 22:47:06 +00:00
glEnableVertexAttribArray(2);
2015-11-05 19:17:04 +00:00
return program;
}
2015-11-03 15:40:20 +00:00
void iterate()
{
2015-11-04 21:33:53 +00:00
if (keys['W'])
{
2015-11-07 19:38:26 +00:00
camera.position.x += 0.1 * sin(glm::radians(camera.angles.z));
camera.position.y += 0.1 * cos(glm::radians(camera.angles.z));
2015-11-04 21:33:53 +00:00
}
if (keys['S'])
{
2015-11-07 19:38:26 +00:00
camera.position.x -= 0.1 * sin(glm::radians(camera.angles.z));
camera.position.y -= 0.1 * cos(glm::radians(camera.angles.z));
2015-11-04 21:33:53 +00:00
}
if (keys['A'])
{
2015-11-07 19:38:26 +00:00
camera.position.x -= 0.1 * cos(glm::radians(camera.angles.z));
camera.position.y += 0.1 * sin(glm::radians(camera.angles.z));
2015-11-04 21:33:53 +00:00
}
if (keys['D'])
{
2015-11-07 19:38:26 +00:00
camera.position.x += 0.1 * cos(glm::radians(camera.angles.z));
camera.position.y -= 0.1 * sin(glm::radians(camera.angles.z));
2015-11-04 21:33:53 +00:00
}
suzanne1->angles.y = glfwGetTime() * 360 / 4;
teapot1->angles.x = glfwGetTime() * 360 / 6;
bunny1->angles.z = glfwGetTime() * 360 / 2;
2015-11-07 15:52:07 +00:00
2015-11-04 19:39:44 +00:00
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
2015-11-03 19:00:55 +00:00
2015-11-07 19:38:26 +00:00
const glm::mat4 model = glm::translate(glm::mat4(1.0f), -camera.position);
const glm::mat4 view = glm::mat4(1.0f)
2015-11-07 19:38:26 +00:00
* glm::rotate(glm::mat4(1.0f), glm::radians(camera.angles.x - 90), glm::vec3(1.0f, 0.0f, 0.0f))
* glm::rotate(glm::mat4(1.0f), glm::radians(camera.angles.z), glm::vec3(0.0f, 0.0f, 1.0f));
2015-11-04 18:38:02 +00:00
const glm::mat4 projection = glm::perspective(45.0f, (float)640 / (float)480, 0.1f, 10.0f);
const glm::mat4 mvp = projection * view * model;
2015-11-05 19:17:04 +00:00
suzanne1->draw(mvp);
teapot1->draw(mvp);
bunny1->draw(mvp);
2015-11-03 11:46:05 +00:00
}
2015-11-04 18:38:02 +00:00
GLFWCALL void on_key(int key, int action)
{
keys[key] = action != GLFW_RELEASE;
}
2015-11-04 18:38:02 +00:00
EM_BOOL on_em_mousemove(int event_type, const EmscriptenMouseEvent *mouse_event, void *user_data)
{
2015-11-07 19:38:26 +00:00
camera.angles.z += mouse_event->movementX;
camera.angles.x += mouse_event->movementY;
2015-11-04 18:38:02 +00:00
2015-11-07 19:38:26 +00:00
if (camera.angles.z < 0)
camera.angles.z = 359;
2015-11-04 18:38:02 +00:00
else
2015-11-07 19:38:26 +00:00
if (camera.angles.z >= 360)
camera.angles.z = 0;
2015-11-04 18:38:02 +00:00
2015-11-07 19:38:26 +00:00
if (camera.angles.x < -90)
camera.angles.x = -90;
2015-11-04 18:38:02 +00:00
else
2015-11-07 19:38:26 +00:00
if (camera.angles.x > 90)
camera.angles.x = 90;
2015-11-04 18:38:02 +00:00
return true;
}