#include "../../../shared_cpp/OrthographicRenderer.h" #include "../../../shared_cpp/types.h" #include "../../../shared_cpp/WebglContext.h" #include "../../../shared_cpp/mathlib.h" #include "../../../shared_cpp/MainLoop.h" #include #include #include #include #include // // Pill object // struct Pill { OrthographicShape shape; float32 width = 1.f; float32 height = 1.f; void load(OrthographicRenderer* renderer, float32 numSegments) { // Note that a so-called "pill" is simply an ellipse. // Equation of an ellipse is: // // x^2 / a^2 + y^2 / b^2 = 1 // // or, in parametric form: // // x = a * cos(t), y = b * sin(t) // float32 angleIncrements = (2.f * PI) / numSegments; uint32 numVertices = static_cast(numSegments * 3.f); OrthographicVertex* vertices = new OrthographicVertex[numVertices]; float32 a = width / 2.f; float32 b = height / 2.f; Vector4 color = Vector4().fromColor(243,166,207, 255); for (uint32 vertexIndex = 0; vertexIndex < numVertices; vertexIndex += 3) { // Create a single "slice" of the ellipse (like a pizza) float32 currAngle = (vertexIndex / 3.f) * angleIncrements; float32 nextAngle = (vertexIndex / 3.f + 1.f) * angleIncrements; vertices[vertexIndex].position = Vector2 { 0.f, 0.f }; vertices[vertexIndex].color = color; vertices[vertexIndex + 1].position = Vector2 { a * cosf(currAngle), b * sinf(currAngle) }; vertices[vertexIndex + 1].color = color; vertices[vertexIndex + 2].position = Vector2 { a * cosf(nextAngle), b * sinf(nextAngle) }; vertices[vertexIndex + 2].color = color; } shape.load(vertices, numVertices, renderer); } void unload() { shape.unload(); } float32 getArea() { return 0.f; } }; EM_BOOL onPlayClicked(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData); EM_BOOL onStopClicked(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData); EM_BOOL update(float time, void* userData); // Global Variables WebglContext context; OrthographicRenderer renderer; Pill pill; MainLoop mainLoop; int main() { context.init("#gl_canvas"); emscripten_set_click_callback("#gl_canvas_play", NULL, false, onPlayClicked); emscripten_set_click_callback("#gl_canvas_stop", NULL, false, onStopClicked); return 0; } EM_BOOL update(float deltaTimeSeconds, void* userData) { renderer.render(); pill.shape.render(&renderer); return true; } // // Interactions with DOM handled below // EM_BOOL onPlayClicked(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData) { printf("Play clicked\n"); renderer.load(&context); pill.width = 100.f; pill.height = 50.f; pill.shape.model = pill.shape.model.translateByVec2(Vector2 { context.width / 2.f, context.height / 2.f }); pill.load(&renderer, 64); mainLoop.run(update); return true; } EM_BOOL onStopClicked(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData) { printf("Stop clicked\n"); mainLoop.stop(); pill.unload(); renderer.unload(); return true; }