summaryrefslogtreecommitdiff
path: root/frontend/shared_cpp
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/shared_cpp')
-rw-r--r--frontend/shared_cpp/OrthographicRenderer.cpp47
-rw-r--r--frontend/shared_cpp/OrthographicRenderer.h49
-rw-r--r--frontend/shared_cpp/WebglContext.h6
-rw-r--r--frontend/shared_cpp/mathlib.h22
-rw-r--r--frontend/shared_cpp/types.h2
5 files changed, 82 insertions, 44 deletions
diff --git a/frontend/shared_cpp/OrthographicRenderer.cpp b/frontend/shared_cpp/OrthographicRenderer.cpp
index b6bd5b6..1d62c04 100644
--- a/frontend/shared_cpp/OrthographicRenderer.cpp
+++ b/frontend/shared_cpp/OrthographicRenderer.cpp
@@ -1,4 +1,6 @@
#include "OrthographicRenderer.h"
+#include "WebglContext.h"
+#include "mathlib.h"
const char* orthographicVertex =
"attribute vec2 position; \n"
@@ -18,7 +20,7 @@ const char* orthographicFragment =
" gl_FragColor = VertexColor; \n"
"}";
-void OrthographicRenderer::load() {
+void OrthographicRenderer::load(WebglContext* context) {
printf("Compiling orthographic shader...\n");
shader = loadShader(orthographicVertex, orthographicFragment);
@@ -27,6 +29,7 @@ void OrthographicRenderer::load() {
attributes.color = getShaderAttribute(shader, "color");
uniforms.projection = getShaderUniform(shader, "projection");
uniforms.model = getShaderUniform(shader, "model");
+ projection = Mat4x4().getOrthographicMatrix(0, context->width, 0, context->height);
printf("Orthographic shader compiled.\n");
}
@@ -47,3 +50,45 @@ void OrthographicRenderer::unload() {
glClear(GL_COLOR_BUFFER_BIT);
glDeleteProgram(shader);
}
+
+
+void OrthographicShape::load(OrthographicVertex* inVertices, uint32 inNumVertices, OrthographicRenderer* renderer) {
+ vertices = inVertices;
+ numVertices = inNumVertices;
+ useShader(renderer->shader);
+
+ glGenVertexArrays(1, &vao);
+ glBindVertexArray(vao);
+
+ glGenBuffers(1, &vbo);
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, inNumVertices * sizeof(OrthographicVertex), &vertices[0], GL_STATIC_DRAW);
+
+ glEnableVertexAttribArray(renderer->attributes.position);
+ glVertexAttribPointer(renderer->attributes.position, 2, GL_FLOAT, GL_FALSE, sizeof(OrthographicVertex), (GLvoid *)0);
+
+ glEnableVertexAttribArray(renderer->attributes.color);
+ glVertexAttribPointer(renderer->attributes.color, 4, GL_FLOAT, GL_FALSE, sizeof(OrthographicVertex), (GLvoid *)offsetof(OrthographicVertex, color));
+
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindVertexArray(0);
+}
+
+void OrthographicShape::render(OrthographicRenderer* renderer) {
+ setShaderMat4(renderer->uniforms.model, model);
+
+ glBindVertexArray(vao);
+ glDrawArrays(GL_TRIANGLES, 0, numVertices);
+ glBindVertexArray(0);
+}
+
+void OrthographicShape::unload() {
+ glDeleteVertexArrays(1, &vao);
+ glDeleteBuffers(1, &vbo);
+
+ if (vertices != NULL) {
+ delete vertices;
+ }
+
+ vertices = NULL;
+} \ No newline at end of file
diff --git a/frontend/shared_cpp/OrthographicRenderer.h b/frontend/shared_cpp/OrthographicRenderer.h
index c72639e..0cdfc78 100644
--- a/frontend/shared_cpp/OrthographicRenderer.h
+++ b/frontend/shared_cpp/OrthographicRenderer.h
@@ -1,9 +1,12 @@
#pragma once
+#include "WebglContext.h"
#include "types.h"
#include "Shader.h"
#include "mathlib.h"
+struct WebglContext;
+
struct OrthographicRenderer {
Mat4x4 projection;
uint32 shader;
@@ -18,7 +21,7 @@ struct OrthographicRenderer {
int32 model;
} uniforms;
- void load();
+ void load(WebglContext* context);
void render();
void unload();
};
@@ -28,50 +31,14 @@ struct OrthographicVertex {
Vector4 color;
};
-template <uint32 N>
struct OrthographicShape {
uint32 vao;
uint32 vbo;
- OrthographicVertex vertices[N];
+ uint32 numVertices = 0;
+ OrthographicVertex* vertices = NULL;
Mat4x4 model;
- void load(OrthographicRenderer* renderer);
+ void load(OrthographicVertex* vertices, uint32 numVertices, OrthographicRenderer* renderer);
void render(OrthographicRenderer* renderer);
void unload();
-};
-
-template <uint32 N>
-void OrthographicShape<N>::load(OrthographicRenderer* renderer) {
- useShader(renderer->shader);
-
- glGenVertexArrays(1, &vao);
- glBindVertexArray(vao);
-
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, N * sizeof(OrthographicVertex), &vertices[0], GL_STATIC_DRAW);
-
- glEnableVertexAttribArray(renderer->attributes.position);
- glVertexAttribPointer(renderer->attributes.position, 2, GL_FLOAT, GL_FALSE, sizeof(OrthographicVertex), (GLvoid *)0);
-
- glEnableVertexAttribArray(renderer->attributes.color);
- glVertexAttribPointer(renderer->attributes.color, 4, GL_FLOAT, GL_FALSE, sizeof(OrthographicVertex), (GLvoid *)offsetof(OrthographicVertex, color));
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindVertexArray(0);
-}
-
-template <uint32 N>
-void OrthographicShape<N>::render(OrthographicRenderer* renderer) {
- setShaderMat4(renderer->uniforms.model, model);
-
- glBindVertexArray(vao);
- glDrawArrays(GL_TRIANGLES, 0, 3);
- glBindVertexArray(0);
-}
-
-template <uint32 N>
-void OrthographicShape<N>::unload() {
- glDeleteVertexArrays(1, &vao);
- glDeleteBuffers(1, &vbo);
-} \ No newline at end of file
+}; \ No newline at end of file
diff --git a/frontend/shared_cpp/WebglContext.h b/frontend/shared_cpp/WebglContext.h
index 1ea1c91..017498f 100644
--- a/frontend/shared_cpp/WebglContext.h
+++ b/frontend/shared_cpp/WebglContext.h
@@ -7,8 +7,12 @@
struct WebglContext {
EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context;
+ int width = 640;
+ int height = 480;
- void init(const char* query, int width = 640, int height = 480) {
+ void init(const char* query, int inWidth = 640, int inHeight = 480) {
+ width = inWidth;
+ height = inHeight;
emscripten_set_canvas_element_size( query, width, height);
EmscriptenWebGLContextAttributes attrs;
diff --git a/frontend/shared_cpp/mathlib.h b/frontend/shared_cpp/mathlib.h
index 93ddbbd..7595045 100644
--- a/frontend/shared_cpp/mathlib.h
+++ b/frontend/shared_cpp/mathlib.h
@@ -41,6 +41,10 @@ struct Vector2 {
Vector2 getPerp() {
return { -y, x };
}
+
+ void printDebug(const char* name) {
+ printf("%s=Vector2(%f, %f)\n", name, x, y);
+ }
};
struct Vector3 {
@@ -54,6 +58,22 @@ struct Vector4 {
float y = 0.f;
float z = 0.f;
float w = 0.f;
+
+ float length() {
+ return sqrtf(x * x + y * y + z * z + w * w);
+ }
+
+ Vector4 normalize() {
+ float len = length();
+ float inverseLength = len == 0 ? 1.0 : 1.0 / len;
+
+ return { x * inverseLength, y * inverseLength, z * inverseLength, w * inverseLength };
+ }
+
+ Vector4 fromColor(float r, float g, float b, float a) {
+ float scale = 1.f / 255.f;
+ return { r * scale, g * scale, b * scale, a * scale };
+ }
};
struct Mat4x4 {
@@ -123,7 +143,7 @@ struct Mat4x4 {
void print() {
printf("[ ");
for (int idx = 0; idx < 16; idx++) {
- printf("%d, ", idx);
+ printf("%f, ", m[idx]);
}
printf(" ]\n");
}
diff --git a/frontend/shared_cpp/types.h b/frontend/shared_cpp/types.h
index 7bac7f3..3739699 100644
--- a/frontend/shared_cpp/types.h
+++ b/frontend/shared_cpp/types.h
@@ -14,3 +14,5 @@ typedef unsigned long uint64;
typedef float float32;
typedef double float64;
+
+#define PI 3.14159265358979323846 \ No newline at end of file