Example of Rendering UI done.

This commit is contained in:
2023-12-12 13:40:50 -06:00
parent debe4146eb
commit d9278414c5
15 changed files with 218 additions and 118 deletions

View File

@ -208,7 +208,7 @@ namespace Dawn {
assertNoGLError();
glBufferData(
GL_UNIFORM_BUFFER,
structure.size,
structure.size * structure.count,
(void*)((size_t)&this->data + (size_t)structure.offset),
GL_STATIC_DRAW
);

View File

@ -16,7 +16,7 @@ namespace Dawn {
size_t offset;
enum ShaderOpenGLStructureType structureType;
size_t size;
// size_t count;
size_t count;
std::vector<struct ShaderParameter> parameters;
GLint location = -1;
GLuint buffer = -1;
@ -46,12 +46,14 @@ namespace Dawn {
const enum ShaderOpenGLStructureType structureType,
std::function<
void(const T&, std::vector<struct ShaderParameter>&)
> getParameters
> getParameters,
size_t count = 1
) {
this->structureName = structureName;
this->offset = (size_t)offset;
this->structureType = structureType;
this->size = sizeof(T);
this->count = count;
this->parameters = std::vector<struct ShaderParameter>();
T dummy;

View File

@ -4,6 +4,7 @@
// https://opensource.org/licenses/MIT
#include "display/shader/UIShader.hpp"
#include "util/Macro.hpp"
using namespace Dawn;
@ -28,10 +29,50 @@ void UIShader::getStages(
"uniform mat4 u_Projection;\n"
"uniform mat4 u_View;\n"
"uniform mat4 u_Model;\n"
"struct UIShaderQuad {\n"
"mat4 transform;\n"
"vec4 quad;\n"
"vec4 uv;\n"
"vec4 color;\n"
"};\n"
"layout (std140) uniform ub_Quad {\n"
"UIShaderQuad quads[" MACRO_STRINGIFY(UI_SHADER_QUAD_COUNT) "];\n"
"};\n"
"out vec2 o_TextCoord;\n"
"out vec4 v_Color;\n"
"void main() {\n"
"gl_Position = u_Projection * u_View * u_Model * vec4(aPos, 1.0);\n"
"o_TextCoord = vec2(aTexCoord.x, aTexCoord.y);\n"
"vec4 pos;\n"
"vec2 coord;\n"
"int index = int(aPos.z);\n"
"int quadIndex = index / 4;\n"
"int vertexIndex = index % 4;\n"
"struct UIShaderQuad quad = quads[quadIndex];\n"
"if(vertexIndex == 0) {\n"
"pos.x = quad.quad.x;\n"
"pos.y = quad.quad.y;\n"
"coord.x = quad.uv.x;\n"
"coord.y = quad.uv.y;\n"
"} else if(vertexIndex == 1) {\n"
"pos.x = quad.quad.z;\n"
"pos.y = quad.quad.y;\n"
"coord.x = quad.uv.z;\n"
"coord.y = quad.uv.y;\n"
"} else if(vertexIndex == 2) {\n"
"pos.y = quad.quad.w;\n"
"pos.x = quad.quad.x;\n"
"coord.x = quad.uv.x;\n"
"coord.y = quad.uv.w;\n"
"} else if(vertexIndex == 3) {\n"
"pos.x = quad.quad.z;\n"
"pos.y = quad.quad.w;\n"
"coord.x = quad.uv.z;\n"
"coord.y = quad.uv.w;\n"
"}\n"
"pos.z = 0;\n"
"pos.w = 1;\n"
"gl_Position = u_Projection * u_View * u_Model * quad.transform * pos;\n"
"o_TextCoord = coord;\n"
"v_Color = quad.color;\n"
"}"
);
@ -39,14 +80,10 @@ void UIShader::getStages(
ShaderStageType::FRAGMENT,
"#version 330 core\n"
"in vec2 o_TextCoord;\n"
"layout (std140) uniform ub_Color {\n"
"vec4 first;\n"
"vec3 random;\n"
"vec4 second;\n"
"};\n"
"in vec4 v_Color;\n"
"out vec4 o_Color;\n"
"void main() {\n"
"o_Color = second;\n"
"o_Color = v_Color;\n"
"}\n"
);
break;
@ -78,28 +115,35 @@ void UIShader::getStages(
ShaderParameterType::MAT4
));
structures.push_back(ShaderStructure<struct TestStruct>(
"ub_Color",
&rel->test,
structures.push_back(ShaderStructure<struct UIShaderQuad>(
"ub_Quad",
&rel->quads,
ShaderOpenGLStructureType::STD140,
[&](const struct TestStruct &rel, std::vector<struct ShaderParameter> &parameters) {
[&](const struct UIShaderQuad &rel, std::vector<struct ShaderParameter> &parameters) {
parameters.push_back(ShaderParameter(
"first",
&rel.first,
"u_Transform",
&rel.transform,
ShaderParameterType::MAT4
));
parameters.push_back(ShaderParameter(
"u_Quad",
&rel.quad,
ShaderParameterType::VEC4
));
parameters.push_back(ShaderParameter(
"u_UV",
&rel.uv,
ShaderParameterType::VEC4
));
parameters.push_back(ShaderParameter(
"u_Color",
&rel.color,
ShaderParameterType::COLOR
));
parameters.push_back(ShaderParameter(
"random",
&rel.random,
ShaderParameterType::VEC3
));
parameters.push_back(ShaderParameter(
"second",
&rel.second,
ShaderParameterType::COLOR
));
}
},
2
));
}

View File

@ -7,18 +7,20 @@
#include "display/shader/Shader.hpp"
namespace Dawn {
struct TestStruct {
struct Color first;
glm::vec3 random;
float_t padded;
struct Color second;
#define UI_SHADER_QUAD_COUNT 32
struct UIShaderQuad {
glm::mat4 transform;
glm::vec4 quad;
glm::vec4 uv;
struct Color color;
};
struct UIShaderData {
glm::mat4 projection;
glm::mat4 view;
glm::mat4 model;
struct TestStruct test;
struct UIShaderQuad quads[UI_SHADER_QUAD_COUNT];
};
class UIShader : public Shader<UIShaderData> {