feat(rendering): simple font renderer
This commit is contained in:
parent
6f66b9540e
commit
dd5c3a0638
10 changed files with 113 additions and 4 deletions
22
assets/shaders/font.fs
Normal file
22
assets/shaders/font.fs
Normal 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
12
assets/shaders/font.vs
Normal 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
1
assets/textures/NOTE.txt
Normal file
|
@ -0,0 +1 @@
|
|||
debugfnt.bmp is Iosevka NFM Thin generated via CBFG
|
BIN
assets/textures/debugfnt.bmp
Normal file
BIN
assets/textures/debugfnt.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 192 KiB |
45
core/src/rendering/debug/debugrenderer.cpp
Normal file
45
core/src/rendering/debug/debugrenderer.cpp
Normal 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);
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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);
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
};
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue