/
Tias
/
UIToolkit
Обзор
Документация
Войти
/
Tias
/
UIToolkit
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
src/core/render/Program.cpp
92 строки
2 KB
Tias
add scaling and translating to meshes
28 июн 2025, 20:40
28 июн 2025, 20:40
f3c308b
Код
Авторство
О чём код?
#include "core/render/Program.hpp" #include "IBindable.hpp" #include "core/OpenGLHeaders.hpp" #include "core/render/IProgram.hpp" #include "utils/error.hpp" #include <fstream> #include <memory> #include <string> using namespace core::render; Program::Program(std::string filename) { std::ifstream file(filename); if (!file.is_open()) utils::error() << "Can't open file [" << filename << "]"; std::string line, text; std::getline(file, line); if (line != "// vertex") utils::error() << "Shader file: expected [// vertex] at the first line"; while (std::getline(file, line) && line != "// fragment") text += line + '\n'; if (!file) utils::error() << "Shader file: header of fragment shader [// fragment] not found"; std::cout << text << std::endl; vertexShader_.init(text); text = ""; while (std::getline(file, line)) text += line + '\n'; std::cout << "......................" << std::endl; std::cout << text << std::endl; fragmentShader_.init(text); id_ = glCreateProgram(); vertexShader_.linkTo(*this); fragmentShader_.linkTo(*this); glLinkProgram(id_); GLint linkStatus, logLength; glGetProgramiv(id_, GL_LINK_STATUS, &linkStatus); if(linkStatus == GL_TRUE) return; glGetProgramiv(id_, GL_INFO_LOG_LENGTH, &logLength); auto buffer = std::make_unique<char[]>(logLength); glGetProgramInfoLog(id_, logLength, NULL, buffer.get()); utils::error() << "Linking program failed. Reason:" << std::endl << buffer; } Program::~Program() { glDeleteProgram(id_); } void Program::linkShader(GLuint shaderId) { glAttachShader(id_, shaderId); } GLint Program::getUniformLocation(const std::string & name) const { return glGetUniformLocation(id_, name.c_str()); } GLint Program::getAttribLocation(const std::string & name) const { return glGetAttribLocation(id_, name.c_str()); } IBindable<GLuint> & Program::bind() { glUseProgram(id_); return *this; } IBindable<GLuint> & Program::unbind(GLuint oldBind) { glUseProgram(oldBind); return *this; } GLuint Program::getCurrentBind() { GLint result; glGetIntegerv(GL_CURRENT_PROGRAM, &result); return result; } void Program::setUniform(uniform_setter setter) { bind(); setter(id_); unbind(); }