feat(rendering): simple font renderer

This commit is contained in:
maelstrom 2025-06-30 20:24:31 +02:00
parent 6f66b9540e
commit dd5c3a0638
10 changed files with 113 additions and 4 deletions

22
assets/shaders/font.fs Normal file
View file

@ -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;
}

12
assets/shaders/font.vs Normal file
View file

@ -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;
}

1
assets/textures/NOTE.txt Normal file
View file

@ -0,0 +1 @@
debugfnt.bmp is Iosevka NFM Thin generated via CBFG

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

View file

@ -0,0 +1,45 @@
#include "rendering/shader.h"
#include "rendering/texture3d.h"
#include <GL/glew.h>
#include <GL/gl.h>
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);
}

View file

@ -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;
}

View file

@ -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);
void addDebugRenderCFrame(CFrame, Color3);
void setDebugRendererEnabled(bool enabled);

View file

@ -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));
}
}
int Shader::getAttribute(std::string key) {
return glGetAttribLocation(id, key.c_str());
}

View file

@ -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);
};

View file

@ -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) {