added rest of the openGL implementation theoreticaly the engine can render now

This commit is contained in:
2026-01-17 23:04:56 +01:00
parent 0f8c21278a
commit 551b790243
31 changed files with 1648 additions and 6 deletions

View File

@@ -0,0 +1,137 @@
#include "Shader.hpp"
#include "GL/gl3w.h"
#include "Debug.hpp"
TSE::uint TSE::GLFW::Shader::activeProgramID = 0;
void TSE::GLFW::Shader::Bind() const
{
Enable(true);
}
void TSE::GLFW::Shader::Unbind() const
{
Disable(true);
}
void TSE::GLFW::Shader::Enable(bool notify) const
{
activeProgramID = programID;
glUseProgram(programID);
if(notify) OnEnable();
}
void TSE::GLFW::Shader::Disable(bool notify) const
{
activeProgramID = 0;
glUseProgram(0);
if(notify) OnDisable();
}
void TSE::GLFW::Shader::Flush()
{
OnFlush();
}
void TSE::GLFW::Shader::DrawCall(int indexCount)
{
OnDrawCall(indexCount);
}
void TSE::GLFW::Shader::Submit(const Transformable &t, float *&target, TransformationStack &stack, void (*restartDrawcall)(IRenderer &), IRenderer &rnd)
{
OnSubmit(t, target, stack, restartDrawcall, rnd);
}
bool TSE::GLFW::Shader::IsEnabled() const
{
return programID == activeProgramID;
}
int TSE::GLFW::Shader::packageSize()
{
return PackageSize;
}
TSE::GLFW::Shader::Shader(const std::vector<std::unique_ptr<ShaderPart>> &parts)
{
programID = glCreateProgram();
for (const auto& part : parts) {
glAttachShader(programID, part->shaderPartID);
}
glLinkProgram(programID);
int success;
glGetProgramiv(programID, GL_LINK_STATUS, &success);
if(!success)
{
char log[512];
glGetProgramInfoLog(programID, 512, nullptr, log);
TSE_ERROR(log);
}
for (const auto& part : parts) {
glDetachShader(programID, part->shaderPartID);
}
}
TSE::GLFW::Shader::~Shader()
{
glDeleteProgram(programID);
}
int TSE::GLFW::Shader::GetUniformLocation(const char *name)
{
auto it = uniformLocations.find(name);
if (it != uniformLocations.end()) return it->second;
int loc = glGetUniformLocation(programID, name);
uniformLocations[name] = loc;
return loc;
}
void TSE::GLFW::Shader::SetUniform(const char *name, int value)
{
glUniform1i(GetUniformLocation(name), value);
}
void TSE::GLFW::Shader::SetUniform(const char *name, const int *value, const int count)
{
glUniform1iv(GetUniformLocation(name), count, value);
}
void TSE::GLFW::Shader::SetUniform(const char *name, const Matrix4x4 *value)
{
float colmbMajor[16];
value->ToArrayColumnMajor(colmbMajor);
glUniformMatrix4fv(GetUniformLocation(name),1, false, colmbMajor);
}
void TSE::GLFW::Shader::SetUniform(const char *name, float value)
{
glUniform1f(GetUniformLocation(name), value);
}
void TSE::GLFW::Shader::SetUniform(const char *name, const float *value, const int count)
{
glUniform1fv(GetUniformLocation(name), count, value);
}
void TSE::GLFW::Shader::SetUniform(const char *name, const Vector2 *value)
{
glUniform2f(GetUniformLocation(name), value->x, value->y);
}
void TSE::GLFW::Shader::SetUniform(const char *name, const Vector3 *value)
{
glUniform3f(GetUniformLocation(name), value->x, value->y, value->z);
}
void TSE::GLFW::Shader::SetUniform(const char *name, const Vector4 *value)
{
glUniform4f(GetUniformLocation(name), value->x, value->y, value->z, value->w);
}