summaryrefslogtreecommitdiff
path: root/frontend/_wasm/wasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/_wasm/wasm.cpp')
-rw-r--r--frontend/_wasm/wasm.cpp124
1 files changed, 98 insertions, 26 deletions
diff --git a/frontend/_wasm/wasm.cpp b/frontend/_wasm/wasm.cpp
index 91d440f..8673c80 100644
--- a/frontend/_wasm/wasm.cpp
+++ b/frontend/_wasm/wasm.cpp
@@ -1,6 +1,7 @@
#include <cstdio>
#include <cstdlib>
#include <cstring>
+#include <sys/time.h>
#include <emscripten.h>
#include <emscripten/html5.h>
#include <GLES2/gl2.h>
@@ -50,6 +51,7 @@ struct OrthographicVertex {
// Create a triangle
struct TriangleObject {
OrthographicVertex vertices[3];
+ Vector2 velocity;
GLuint mVao;
GLuint mVbo;
Mat4x4 model;
@@ -88,6 +90,28 @@ struct TriangleObject {
};
+struct Scene {
+ Mat4x4 projection;
+ TriangleObject triangleObject;
+ OrthographicProgramData programData;
+ bool isTerminated = false;
+};
+
+long long timeInMilliseconds(void) {
+ struct timeval tv;
+
+ gettimeofday(&tv,NULL);
+ return (((long long)tv.tv_sec)*1000)+(tv.tv_usec/1000);
+}
+
+long elapsedTime = 0;
+long lastTime = 0;
+int numFrames = 0;
+
+EM_BOOL update(double time, void* userData);
+EM_BOOL runScene(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData);
+EM_BOOL terminateScene(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData);
+
int main() {
printf("Initializing the canvas...\n");
emscripten_set_canvas_element_size( "#wasm_canvas", 640, 480 );
@@ -111,35 +135,83 @@ int main() {
}
emscripten_webgl_make_context_current(context);
printf("Canvas ready.\n");
-
- printf("Compiling shaders...\n");
- GLuint shader = loadShader(orthographicVertex, orthographicFragment);
- useShader(shader);
- OrthographicProgramData programData;
- programData.shader = shader;
- programData.attributes.position = getShaderAttribute(shader, "position");
- programData.attributes.color = getShaderAttribute(shader, "color");
- programData.uniformVariables.projection = getShaderUniform(shader, "projection");
- programData.uniformVariables.model = getShaderUniform(shader, "model");
- printf("Compiling ready.\n");
-
- TriangleObject triangle;
- triangle.vertices[0] = { Vector2 { 50, 50 }, Vector4 { 1.f, 0.f, 0.f, 1.f }};
- triangle.vertices[1] = { Vector2 { 150, 300 }, Vector4 { 0.f, 1.f, 0.f, 1.f }};
- triangle.vertices[2] = { Vector2 { 250, 50 }, Vector4 { 0.f, 0.f, 1.f, 1.f }};
- triangle.initialize(&programData);
-
- Mat4x4 projection = Mat4x4().getOrthographicMatrix(0, 480, 0, 640);
-
- glEnable(GL_DEPTH_TEST);
+
+ emscripten_set_click_callback("#wasm_canvas_play_button", NULL, false, runScene);
+ emscripten_set_click_callback("#wasm_canvas_stop_button", NULL, false, terminateScene);
+ return EXIT_SUCCESS;
+}
+
+Scene scene;
+
+EM_BOOL runScene(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData) {
+ printf("Compiling shaders...\n");
+ scene.programData.shader = loadShader(orthographicVertex, orthographicFragment);
+ printf("Shaders compiled.\n");
+
+
+ printf("Initializing scene...\n");
+ useShader(scene.programData.shader);
+ scene.programData.attributes.position = getShaderAttribute(scene.programData.shader, "position");
+ scene.programData.attributes.color = getShaderAttribute(scene.programData.shader, "color");
+ scene.programData.uniformVariables.projection = getShaderUniform(scene.programData.shader, "projection");
+ scene.programData.uniformVariables.model = getShaderUniform(scene.programData.shader, "model");
+
+ scene.triangleObject.vertices[0] = { Vector2 { 220, 365 }, Vector4 { 1.f, 0.f, 0.f, 1.f }};
+ scene.triangleObject.vertices[1] = { Vector2 { 320, 480 }, Vector4 { 0.f, 1.f, 0.f, 1.f }};
+ scene.triangleObject.vertices[2] = { Vector2 { 420, 365 }, Vector4 { 0.f, 0.f, 1.f, 1.f }};
+ scene.triangleObject.initialize(&scene.programData);
+
+ scene.projection = Mat4x4().getOrthographicMatrix(0, 640, 0, 480);
+ scene.isTerminated = false;
+ printf("Scene initialized.\n");
+
+ emscripten_request_animation_frame_loop(update, &scene);
+ return true;
+}
+
+EM_BOOL update(double time, void* userData) {
+ Scene* scene = (Scene*)userData;
+ if (scene->isTerminated) {
+ return false;
+ }
+
+ if (lastTime == 0) {
+ lastTime = time;
+ return true;
+ }
+
+ long deltaTime = time - lastTime;
+ lastTime = time;
+ elapsedTime += deltaTime;
+ numFrames++;
+
+ if (elapsedTime >= 1000.0) {
+ printf("Frames Per Second: %d\n", numFrames);
+ numFrames = 0;
+ elapsedTime = 0.0;
+ }
+
+ float deltaTimeSeconds = static_cast<float>(deltaTime) / 1000.f;
+
+ // Update
+ scene->triangleObject.velocity = scene->triangleObject.velocity + Vector2 { 0, static_cast<float>(-9.8 * deltaTimeSeconds) };
+ scene->triangleObject.model = scene->triangleObject.model.translateByVec2(scene->triangleObject.velocity * deltaTimeSeconds);
+
+ // Render
+ glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glDepthMask(GL_TRUE);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- useShader(shader);
- setShaderMat4(programData.uniformVariables.projection, projection);
- triangle.render(&programData);
+ useShader(scene->programData.shader);
+ setShaderMat4(scene->programData.uniformVariables.projection, scene->projection);
+ scene->triangleObject.render(&scene->programData);
- return EXIT_SUCCESS;
-} \ No newline at end of file
+ return true;
+}
+
+EM_BOOL terminateScene(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData) {
+ scene.isTerminated = true;
+ return true;
+}