2015-11-14 21:07:08 -05:00
|
|
|
#include "../src/store.hpp"
|
|
|
|
#include "../src/scene.hpp"
|
|
|
|
#include "../src/camera.hpp"
|
|
|
|
#include "../src/light/sun.hpp"
|
|
|
|
#include "../src/model/raw.hpp"
|
|
|
|
#include "../src/model/static.hpp"
|
|
|
|
#include "../src/object/with_model.hpp"
|
2015-11-07 08:56:06 -05:00
|
|
|
|
2015-11-03 10:40:20 -05:00
|
|
|
#include <cstdlib>
|
|
|
|
|
2015-11-03 23:48:27 -05:00
|
|
|
#include <glm/glm.hpp>
|
2015-11-04 13:38:02 -05:00
|
|
|
#include <glm/gtc/matrix_transform.hpp>
|
2015-11-03 23:48:27 -05:00
|
|
|
|
2015-11-03 10:40:20 -05:00
|
|
|
#include <emscripten/emscripten.h>
|
2015-11-04 13:38:02 -05:00
|
|
|
#include <emscripten/html5.h>
|
|
|
|
|
2015-11-11 15:21:28 -05:00
|
|
|
static Store store;
|
|
|
|
|
2015-11-05 14:17:04 -05:00
|
|
|
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);
|
|
|
|
|
|
|
|
static bool keys[GLFW_KEY_LAST];
|
|
|
|
|
2015-11-10 12:28:49 -05:00
|
|
|
static Scene scene;
|
|
|
|
|
2015-11-14 03:10:22 -05:00
|
|
|
static Lights::Sun sun;
|
|
|
|
|
2015-11-10 12:36:33 -05:00
|
|
|
static Camera camera(scene);
|
2015-11-11 20:16:44 -05:00
|
|
|
|
|
|
|
static float camera_angles_y = 0;
|
2015-11-10 16:51:25 -05:00
|
|
|
static float camera_angles_x = 0;
|
|
|
|
|
2015-11-11 12:28:11 -05:00
|
|
|
static const Model *protagonist;
|
2015-11-11 19:57:08 -05:00
|
|
|
static const Model *car;
|
2015-11-11 12:28:11 -05:00
|
|
|
static const Model *suzanne;
|
|
|
|
static const Model *teapot;
|
|
|
|
static const Model *bunny;
|
2015-11-12 01:24:27 -05:00
|
|
|
static const Model *untitled;
|
2015-11-05 14:17:04 -05:00
|
|
|
|
2015-11-10 15:34:40 -05:00
|
|
|
static Object *protagonist1;
|
2015-11-11 19:57:08 -05:00
|
|
|
static Object *car1;
|
2015-11-05 14:17:04 -05:00
|
|
|
static Object *suzanne1;
|
|
|
|
static Object *teapot1;
|
|
|
|
static Object *bunny1;
|
2015-11-12 01:24:27 -05:00
|
|
|
static Object *untitled1;
|
2015-11-04 14:39:44 -05:00
|
|
|
|
2015-11-11 20:16:44 -05:00
|
|
|
static bool in_car = false;
|
|
|
|
|
|
|
|
static float car_vel = 0.0;
|
|
|
|
|
2015-11-03 06:46:05 -05:00
|
|
|
int main()
|
|
|
|
{
|
2015-11-03 10:40:20 -05: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 14:00:55 -05:00
|
|
|
if (glewInit() != GLEW_OK)
|
|
|
|
{
|
|
|
|
glfwCloseWindow();
|
|
|
|
glfwTerminate();
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
2015-11-04 15:54:47 -05:00
|
|
|
glfwSetKeyCallback(on_key);
|
2015-11-04 13:38:02 -05:00
|
|
|
emscripten_set_mousemove_callback(nullptr, nullptr, false, on_em_mousemove);
|
|
|
|
|
2015-11-14 03:10:22 -05:00
|
|
|
sun.ambient = glm::vec3(0.2, 0.2, 0.2);
|
|
|
|
sun.diffuse = glm::vec3(1.0, 1.0, 1.0);
|
|
|
|
sun.specular = glm::vec3(1.0, 1.0, 1.0);
|
|
|
|
sun.direction = glm::vec3(0.0, 0.0, -1.0);
|
|
|
|
|
2015-11-11 19:57:08 -05:00
|
|
|
camera.projection = glm::perspective(45.0f, (float)640 / (float)480, 0.1f, 100.0f);
|
2015-11-07 14:38:26 -05:00
|
|
|
|
2015-11-11 23:43:23 -05:00
|
|
|
protagonist = store.load<Models::Static>("protagonist.obj");
|
|
|
|
car = store.load<Models::Static>("car.obj");
|
|
|
|
suzanne = store.load<Models::Static>("suzanne.obj");
|
|
|
|
teapot = store.load<Models::Static>("teapot.obj");
|
|
|
|
bunny = store.load<Models::Static>("bunny.obj");
|
2015-11-12 01:24:27 -05:00
|
|
|
untitled = store.load<Models::Raw>("untitled.raw");
|
2015-11-05 14:17:04 -05:00
|
|
|
|
2015-11-14 20:50:46 -05:00
|
|
|
protagonist1 = new Objects::WithModel(*protagonist);
|
2015-11-10 15:34:40 -05:00
|
|
|
protagonist1->position.z = 4;
|
|
|
|
|
2015-11-14 20:50:46 -05:00
|
|
|
car1 = new Objects::WithModel(*car);
|
2015-11-11 19:57:08 -05:00
|
|
|
car1->position.z = -10;
|
|
|
|
|
2015-11-14 20:50:46 -05:00
|
|
|
suzanne1 = new Objects::WithModel(*suzanne);
|
2015-11-07 22:00:12 -05:00
|
|
|
suzanne1->position.z = -2;
|
2015-11-07 07:03:52 -05:00
|
|
|
suzanne1->position.y = 2;
|
2015-11-05 11:50:43 -05:00
|
|
|
|
2015-11-14 20:50:46 -05:00
|
|
|
teapot1 = new Objects::WithModel(*teapot);
|
2015-11-07 07:03:52 -05:00
|
|
|
teapot1->position.x = -2.0;
|
2015-11-07 22:00:12 -05:00
|
|
|
teapot1->position.y = 1.0;
|
|
|
|
teapot1->angles.y = 45;
|
2015-11-03 14:42:02 -05:00
|
|
|
|
2015-11-14 20:50:46 -05:00
|
|
|
bunny1 = new Objects::WithModel(*bunny);
|
2015-11-07 07:03:52 -05:00
|
|
|
bunny1->position.x = 2.0;
|
2015-11-05 09:28:18 -05:00
|
|
|
|
2015-11-14 20:50:46 -05:00
|
|
|
untitled1 = new Objects::WithModel(*untitled);
|
2015-11-12 01:24:27 -05:00
|
|
|
untitled1->position.x = -6;
|
|
|
|
|
2015-11-14 03:10:22 -05:00
|
|
|
scene << &sun
|
|
|
|
<< protagonist1
|
2015-11-11 19:57:08 -05:00
|
|
|
<< car1
|
2015-11-10 15:34:40 -05:00
|
|
|
<< suzanne1
|
|
|
|
<< teapot1
|
2015-11-12 01:24:27 -05:00
|
|
|
<< bunny1
|
|
|
|
<< untitled1;
|
2015-11-10 12:28:49 -05:00
|
|
|
|
2015-11-10 17:41:28 -05:00
|
|
|
glViewport(0, 0, 640, 480);
|
|
|
|
|
2015-11-04 14:39:44 -05:00
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
|
2015-11-06 17:47:24 -05:00
|
|
|
glClearColor(1, 1, 1, 0);
|
2015-11-03 14:00:55 -05:00
|
|
|
|
|
|
|
emscripten_set_main_loop(iterate, 0, 1);
|
|
|
|
}
|
|
|
|
|
2015-11-03 10:40:20 -05:00
|
|
|
void iterate()
|
|
|
|
{
|
2015-11-11 20:16:44 -05:00
|
|
|
if (in_car)
|
2015-11-04 16:33:53 -05:00
|
|
|
{
|
2015-11-11 20:16:44 -05:00
|
|
|
protagonist1->position = car1->position;
|
|
|
|
|
|
|
|
if (keys[(unsigned char)'W'])
|
|
|
|
car_vel += 0.1;
|
|
|
|
|
|
|
|
if (keys[(unsigned char)'S'])
|
|
|
|
car_vel -= 0.1;
|
|
|
|
|
|
|
|
if (car_vel > 2.0)
|
|
|
|
car_vel = 2.0;
|
|
|
|
else
|
|
|
|
if (car_vel < -1.0)
|
|
|
|
car_vel = -1.0;
|
|
|
|
|
|
|
|
if (keys[(unsigned char)'A'])
|
|
|
|
car1->angles.y += 0.5 * car_vel;
|
|
|
|
|
|
|
|
if (keys[(unsigned char)'D'])
|
|
|
|
car1->angles.y -= 0.5 * car_vel;
|
2015-11-04 16:33:53 -05:00
|
|
|
|
2015-11-11 20:16:44 -05:00
|
|
|
if (car1->angles.y < 0)
|
|
|
|
car1->angles.y = 359;
|
|
|
|
if (car1->angles.y >= 360)
|
|
|
|
car1->angles.y = 0;
|
|
|
|
}
|
|
|
|
else
|
2015-11-04 16:33:53 -05:00
|
|
|
{
|
2015-11-11 20:16:44 -05:00
|
|
|
car_vel *= 0.99;
|
|
|
|
|
|
|
|
protagonist1->angles.y = camera_angles_y;
|
|
|
|
|
|
|
|
if (keys[(unsigned char)'W'])
|
|
|
|
{
|
|
|
|
protagonist1->position.x -= 0.1 * sin(glm::radians(protagonist1->angles.y));
|
|
|
|
protagonist1->position.z -= 0.1 * cos(glm::radians(protagonist1->angles.y));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (keys[(unsigned char)'S'])
|
|
|
|
{
|
|
|
|
protagonist1->position.x += 0.1 * sin(glm::radians(protagonist1->angles.y));
|
|
|
|
protagonist1->position.z += 0.1 * cos(glm::radians(protagonist1->angles.y));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (keys[(unsigned char)'D'])
|
|
|
|
{
|
|
|
|
protagonist1->position.x += 0.1 * cos(glm::radians(protagonist1->angles.y));
|
|
|
|
protagonist1->position.z -= 0.1 * sin(glm::radians(protagonist1->angles.y));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (keys[(unsigned char)'A'])
|
|
|
|
{
|
|
|
|
protagonist1->position.x -= 0.1 * cos(glm::radians(protagonist1->angles.y));
|
|
|
|
protagonist1->position.z += 0.1 * sin(glm::radians(protagonist1->angles.y));
|
|
|
|
}
|
2015-11-04 16:33:53 -05:00
|
|
|
}
|
|
|
|
|
2015-11-11 20:16:44 -05:00
|
|
|
car1->position.x += car_vel * 0.1 * sin(glm::radians(car1->angles.y));
|
|
|
|
car1->position.z += car_vel * 0.1 * cos(glm::radians(car1->angles.y));
|
|
|
|
|
|
|
|
if (in_car)
|
2015-11-04 16:33:53 -05:00
|
|
|
{
|
2015-11-11 20:16:44 -05:00
|
|
|
camera.base = car1->transformation()
|
|
|
|
* glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 1.0f, 0.0f))
|
|
|
|
* glm::rotate(glm::mat4(1.0f), glm::radians(camera_angles_y), glm::vec3(0.0f, 1.0f, 0.0f))
|
|
|
|
* glm::rotate(glm::mat4(1.0f), glm::radians(camera_angles_x), glm::vec3(1.0f, 0.0f, 0.0f));
|
|
|
|
camera.position.z = 8;
|
2015-11-04 16:33:53 -05:00
|
|
|
}
|
2015-11-11 20:16:44 -05:00
|
|
|
else
|
2015-11-04 16:33:53 -05:00
|
|
|
{
|
2015-11-11 20:16:44 -05:00
|
|
|
camera.base = protagonist1->transformation()
|
|
|
|
* glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 2.0f, 0.0f))
|
|
|
|
* glm::rotate(glm::mat4(1.0f), glm::radians(camera_angles_x), glm::vec3(1.0f, 0.0f, 0.0f));
|
|
|
|
camera.position.z = 2;
|
2015-11-04 16:33:53 -05:00
|
|
|
}
|
2015-11-04 15:54:47 -05:00
|
|
|
|
2015-11-07 22:00:12 -05:00
|
|
|
suzanne1->angles.z = glfwGetTime() * 360 / 4;
|
2015-11-07 12:30:34 -05:00
|
|
|
teapot1->angles.x = glfwGetTime() * 360 / 6;
|
2015-11-07 22:00:12 -05:00
|
|
|
bunny1->angles.y = glfwGetTime() * 360 / 2;
|
2015-11-07 10:52:07 -05:00
|
|
|
|
2015-11-04 14:39:44 -05:00
|
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
2015-11-03 14:00:55 -05:00
|
|
|
|
2015-11-10 12:36:33 -05:00
|
|
|
camera.draw();
|
2015-11-03 06:46:05 -05:00
|
|
|
}
|
2015-11-04 13:38:02 -05:00
|
|
|
|
2015-11-04 15:54:47 -05:00
|
|
|
GLFWCALL void on_key(int key, int action)
|
|
|
|
{
|
|
|
|
keys[key] = action != GLFW_RELEASE;
|
2015-11-11 20:16:44 -05:00
|
|
|
|
|
|
|
if (key == 'E' && action == GLFW_PRESS)
|
|
|
|
{
|
|
|
|
if (in_car)
|
|
|
|
{
|
|
|
|
in_car = false;
|
|
|
|
protagonist1->visible = true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if (glm::distance(protagonist1->position, car1->position) <= 1.0)
|
|
|
|
{
|
|
|
|
in_car = true;
|
|
|
|
protagonist1->visible = false;
|
|
|
|
}
|
|
|
|
}
|
2015-11-04 15:54:47 -05:00
|
|
|
}
|
|
|
|
|
2015-11-09 17:57:11 -05:00
|
|
|
EM_BOOL on_em_mousemove(__attribute__((unused)) int event_type,
|
|
|
|
const EmscriptenMouseEvent *mouse_event,
|
|
|
|
__attribute__((unused)) void *user_data)
|
2015-11-04 13:38:02 -05:00
|
|
|
{
|
2015-11-11 20:16:44 -05:00
|
|
|
camera_angles_y -= mouse_event->movementX;
|
2015-11-10 16:51:25 -05:00
|
|
|
camera_angles_x -= mouse_event->movementY;
|
2015-11-04 13:38:02 -05:00
|
|
|
|
2015-11-11 20:16:44 -05:00
|
|
|
if (camera_angles_y < 0)
|
|
|
|
camera_angles_y = 359;
|
2015-11-04 13:38:02 -05:00
|
|
|
else
|
2015-11-11 20:16:44 -05:00
|
|
|
if (camera_angles_y >= 360)
|
|
|
|
camera_angles_y = 0;
|
2015-11-04 13:38:02 -05:00
|
|
|
|
2015-11-10 16:51:25 -05:00
|
|
|
if (camera_angles_x < -90)
|
|
|
|
camera_angles_x = -90;
|
2015-11-04 13:38:02 -05:00
|
|
|
else
|
2015-11-10 16:51:25 -05:00
|
|
|
if (camera_angles_x > 90)
|
|
|
|
camera_angles_x = 90;
|
2015-11-04 13:38:02 -05:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|