From cc05fdc7396532b329f30decde5583853da92a44 Mon Sep 17 00:00:00 2001 From: Matthew Kosarek Date: Sat, 27 Mar 2021 20:54:27 -0400 Subject: Drawing an ellipse --- frontend/shared_cpp/OrthographicRenderer.cpp | 47 +++++++++++++++++++++++++- frontend/shared_cpp/OrthographicRenderer.h | 49 +++++----------------------- frontend/shared_cpp/WebglContext.h | 6 +++- frontend/shared_cpp/mathlib.h | 22 ++++++++++++- frontend/shared_cpp/types.h | 2 ++ 5 files changed, 82 insertions(+), 44 deletions(-) (limited to 'frontend/shared_cpp') 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 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 -void OrthographicShape::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 -void OrthographicShape::render(OrthographicRenderer* renderer) { - setShaderMat4(renderer->uniforms.model, model); - - glBindVertexArray(vao); - glDrawArrays(GL_TRIANGLES, 0, 3); - glBindVertexArray(0); -} - -template -void OrthographicShape::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 -- cgit v1.2.1