#include "../../shared_cpp/Renderer3d.h" #include "../../shared_cpp/RenderShared.h" #include "../../shared_cpp/Camera3d.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 #include #include struct Rigidbody3d { Vector3 velocity; Vector3 position; void update(float32 dtSeconds) { } }; struct Cube { Mesh3d mesh; void load(Renderer3d* renderer) { Vertex3d cubeVertices[] = { { Vector3 { 1.f, 1.f, 1.f }, Vector3(), colorFromHex(255.f, 0.f, 0.f, 255.f) }, { Vector3 { -1.f, 1.f, 1.f }, Vector3(), colorFromHex(0.f, 255.f, 0.f, 255.f) }, { Vector3 { -1.f, 1.f, -1.f }, Vector3(), colorFromHex(0.f, 0.f, 255.f, 255.f) }, { Vector3 { 1.f, 1.f, -1.f }, Vector3(), colorFromHex(255.f, 0.f, 255.f, 255.f) }, { Vector3 { 1.f, -1.f, 1.f }, Vector3(), colorFromHex(255.f, 255.f, 0.f, 255.f) }, { Vector3 { -1.f, -1.f, 1.f }, Vector3(), colorFromHex(255.f, 0.f, 0.f, 255.f) }, { Vector3 { -1.f, -1.f, -1.f }, Vector3(), colorFromHex(0.f, 0.f, 255.f, 255.f) }, { Vector3 { 1.f, -1.f, -1.f }, Vector3(), colorFromHex(255.f, 255.f, 0.f, 255.f) } }; uint32 cubeIndices[] = { 0, 1, 3, //top 1 3, 1, 2, //top 2 2, 6, 7, //front 1 7, 3, 2, //front 2 7, 6, 5, //bottom 1 5, 4, 7, //bottom 2 5, 1, 4, //back 1 4, 1, 0, //back 2 4, 3, 7, //right 1 3, 4, 0, //right 2 5, 6, 2, //left 1 5, 1, 2 //left 2 }; mesh.load(&cubeVertices[0], 8, cubeIndices, 36, renderer); } void update(float32 dtSeconds) { float32 multiplier = (PI / 8.f) * dtSeconds; Vector3 currentRotation = Vector3 { multiplier, multiplier, multiplier }; mesh.model = mesh.model.rotate(currentRotation.x, currentRotation.y, currentRotation.z); } void render(Renderer3d* renderer) { mesh.render(renderer); } void unload() { mesh.unload(); } }; EM_BOOL onPlayClicked(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData); EM_BOOL onStopClicked(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData); void load(); void update(float32 time, void* userData); void unload(); WebglContext context; Renderer3d renderer; Camera3d camera; MainLoop mainLoop; bool isIntersectingPointer = false; Cube cube; 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; } void load() { renderer.load(&context); cube.load(&renderer); camera.projection = Mat4x4().getPerspectiveProjection(0.1f, 100.f, PI / 2.f, 800.f / 600.f); camera.view = Mat4x4().translate({ 0, 0, -10 }); mainLoop.run(update); } void update(float32 deltaTimeSeconds, void* userData) { cube.update(deltaTimeSeconds); // Renderer renderer.render(&camera); cube.render(&renderer); } void unload() { mainLoop.stop(); renderer.unload(); cube.unload(); } // // Interactions with DOM handled below // EM_BOOL onPlayClicked(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData) { printf("Play clicked\n"); load(); return true; } EM_BOOL onStopClicked(int eventType, const EmscriptenMouseEvent* mouseEvent, void* userData) { printf("Stop clicked\n"); unload(); return true; }