summaryrefslogtreecommitdiff
path: root/frontend/2d/_collisions/pill_line/main.cpp
blob: df20fa01c77d2bd1dcb4abcc145323a7e4f0b8ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#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 <cstdio>
#include <emscripten/html5.h>
#include <unistd.h>
#include <pthread.h>
#include <cmath>

//
// 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<uint32>(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;
}