diff --git a/assets/shaders/font.fs b/assets/shaders/font.fs new file mode 100644 index 0000000..4eedf4f --- /dev/null +++ b/assets/shaders/font.fs @@ -0,0 +1,22 @@ +#version 330 core + +out vec4 FragColor; +in vec3 vPos; +in vec2 vTexCoord; + +uniform sampler2D fontTex; +uniform int charIndex; + +// Main + +void main() { + int x = (charIndex-32) % 16; + int y = (charIndex-32) / 16; + + float fx = float(x) / 16; + float fy = float(y) / 8; + + vec4 color = texture(fontTex, vec2(fx, fy) + vTexCoord * vec2(1.f/32, 1.f/16)); + FragColor = vec3(color) == vec3(0, 0, 0) ? vec4(0, 0, 0, 0) : color; +// FragColor = color; +} \ No newline at end of file diff --git a/assets/shaders/font.vs b/assets/shaders/font.vs new file mode 100644 index 0000000..b6c200f --- /dev/null +++ b/assets/shaders/font.vs @@ -0,0 +1,12 @@ +#version 330 core +in vec3 aPos; +in vec2 aTexCoord; + +out vec3 vPos; +out vec2 vTexCoord; +void main() +{ + gl_Position = vec4(aPos, 1.0); + vPos = aPos; + vTexCoord = aTexCoord; +} diff --git a/assets/textures/NOTE.txt b/assets/textures/NOTE.txt new file mode 100644 index 0000000..7c93e18 --- /dev/null +++ b/assets/textures/NOTE.txt @@ -0,0 +1 @@ +debugfnt.bmp is Iosevka NFM Thin generated via CBFG diff --git a/assets/textures/debugfnt.bmp b/assets/textures/debugfnt.bmp new file mode 100644 index 0000000..437dac9 Binary files /dev/null and b/assets/textures/debugfnt.bmp differ diff --git a/core/src/rendering/debug/debugrenderer.cpp b/core/src/rendering/debug/debugrenderer.cpp new file mode 100644 index 0000000..6c8030c --- /dev/null +++ b/core/src/rendering/debug/debugrenderer.cpp @@ -0,0 +1,45 @@ +#include "rendering/shader.h" +#include "rendering/texture3d.h" +#include +#include + +extern int viewportWidth, viewportHeight; +extern Texture3D* fontTexture; +extern Shader* fontShader; + +void renderChar(char c, int x, int y, float scale=1.f) { + fontShader->use(); + fontTexture->activate(1); + fontShader->set("fontTex", 1); + + fontShader->set("charIndex", (int)c); + + // https://stackoverflow.com/a/10631263 + int tex = fontShader->getAttribute("aTexCoord"); + + y = viewportHeight - y - 16*scale; + float x0 = float(x)/viewportWidth, y0 = float(y)/viewportHeight, x1 = ((float)x + 8*scale)/viewportWidth, y1 = ((float)y + 16*scale)/viewportHeight; + x0 *= 2, y0 *= 2, x1 *= 2, y1 *= 2; + x0 -= 1, y0 -= 1, x1 -= 1, y1 -= 1; + + glBegin(GL_QUADS); + glVertex3f(x0, y0, 0); glVertexAttrib2f(tex, 1, 1); + glVertex3f(x1, y0, 0); glVertexAttrib2f(tex, 1, 0); + glVertex3f(x1, y1, 0); glVertexAttrib2f(tex, 0, 0); + glVertex3f(x0, y1, 0); glVertexAttrib2f(tex, 0, 1); + glEnd(); +} + +void renderString(std::string str, int x, int y, float scale=1.f) { + for (int i = 0; i < (int)str.length(); i++) { + char c = str[i]; + renderChar(c, x+i*8*scale, y, scale); + } +} + +// Draws debug info window +// Including info about framerates, etc. +void renderDebugInfo() { + // renderString("Hello, test!", 50, 50, 2); + renderString("Hello, test!", 0, 0, 1); +} \ No newline at end of file diff --git a/core/src/rendering/renderer.cpp b/core/src/rendering/renderer.cpp index 8854453..b403e8a 100644 --- a/core/src/rendering/renderer.cpp +++ b/core/src/rendering/renderer.cpp @@ -21,6 +21,7 @@ #include "math_helper.h" #include "objects/service/selection.h" #include "partassembly.h" +#include "rendering/texture.h" #include "rendering/torus.h" #include "shader.h" #include "mesh.h" @@ -41,13 +42,18 @@ Shader* identityShader = NULL; Shader* ghostShader = NULL; Shader* wireframeShader = NULL; Shader* outlineShader = NULL; +Shader* fontShader = NULL; extern Camera camera; Skybox* skyboxTexture = NULL; Texture3D* studsTexture = NULL; +Texture* fontTexture = NULL; +bool debugRendererEnabled = false; bool wireframeRendering = false; -static int viewportWidth, viewportHeight; +int viewportWidth, viewportHeight; + +void renderDebugInfo(); void renderInit(GLFWwindow* window, int width, int height) { viewportWidth = width, viewportHeight = height; @@ -60,6 +66,8 @@ void renderInit(GLFWwindow* window, int width, int height) { glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + fontTexture = new Texture("assets/textures/debugfnt.bmp", GL_RGB); + skyboxTexture = new Skybox({ "assets/textures/skybox/null_plainsky512_lf.jpg", "assets/textures/skybox/null_plainsky512_rt.jpg", @@ -79,6 +87,7 @@ void renderInit(GLFWwindow* window, int width, int height) { ghostShader = new Shader("assets/shaders/ghost.vs", "assets/shaders/ghost.fs"); wireframeShader = new Shader("assets/shaders/wireframe.vs", "assets/shaders/wireframe.fs"); outlineShader = new Shader("assets/shaders/outline.vs", "assets/shaders/outline.fs"); + fontShader = new Shader("assets/shaders/font.vs", "assets/shaders/font.fs"); } void renderParts() { @@ -639,10 +648,16 @@ void render(GLFWwindow* window) { renderRotationArcs(); if (wireframeRendering) renderWireframe(); + if (debugRendererEnabled) + renderDebugInfo(); // TODO: Make this a debug flag // renderAABB(); } void setViewport(int width, int height) { viewportWidth = width, viewportHeight = height; +} + +void setDebugRendererEnabled(bool enabled) { + debugRendererEnabled = enabled; } \ No newline at end of file diff --git a/core/src/rendering/renderer.h b/core/src/rendering/renderer.h index 5aa33bb..7e0b5ae 100644 --- a/core/src/rendering/renderer.h +++ b/core/src/rendering/renderer.h @@ -3,10 +3,12 @@ extern bool wireframeRendering; -namespace Data { class CFrame; class Color3; }; +class CFrame; +class Color3; void renderInit(GLFWwindow* window, int width, int height); void render(GLFWwindow* window); void setViewport(int width, int height); void addDebugRenderCFrame(CFrame); -void addDebugRenderCFrame(CFrame, Color3); \ No newline at end of file +void addDebugRenderCFrame(CFrame, Color3); +void setDebugRendererEnabled(bool enabled); \ No newline at end of file diff --git a/core/src/rendering/shader.cpp b/core/src/rendering/shader.cpp index efdfd81..0ed676b 100644 --- a/core/src/rendering/shader.cpp +++ b/core/src/rendering/shader.cpp @@ -106,4 +106,8 @@ void Shader::set(std::string key, glm::mat3 value) { void Shader::set(std::string key, glm::mat4 value) { glUniformMatrix4fv(glGetUniformLocation(id, key.c_str()), 1, GL_FALSE, glm::value_ptr(value)); -} \ No newline at end of file +} + +int Shader::getAttribute(std::string key) { + return glGetAttribLocation(id, key.c_str()); +} diff --git a/core/src/rendering/shader.h b/core/src/rendering/shader.h index 77aa5b6..897b275 100644 --- a/core/src/rendering/shader.h +++ b/core/src/rendering/shader.h @@ -21,4 +21,6 @@ public: void set(std::string key, glm::vec3 value); void set(std::string key, glm::mat3 value); void set(std::string key, glm::mat4 value); + + int getAttribute(std::string key); }; \ No newline at end of file diff --git a/editor/mainglwidget.cpp b/editor/mainglwidget.cpp index d40cef3..725ffc7 100755 --- a/editor/mainglwidget.cpp +++ b/editor/mainglwidget.cpp @@ -524,6 +524,12 @@ void MainGLWidget::keyPressEvent(QKeyEvent* evt) { lastPart->name = "Part" + std::to_string(partId++); M_mainWindow->undoManager.PushState({ UndoStateInstanceCreated { lastPart, gWorkspace() } }); } + + if (evt->key() == Qt::Key_BracketLeft) { + static bool debugRenderEnabled; + debugRenderEnabled = !debugRenderEnabled; + setDebugRendererEnabled(debugRenderEnabled); + } } void MainGLWidget::keyReleaseEvent(QKeyEvent* evt) {