diff options
Diffstat (limited to 'frontend/_wasm/wasm.cpp')
-rw-r--r-- | frontend/_wasm/wasm.cpp | 124 |
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; +} |