#include "../../../include/RenderBackend/OpenGL/VertexShader.hpp" #include "../../../include/RenderBackend/OpenGL/opengl.hpp" #include "../../../include/RenderBackend/OpenGL/CompiledShader.hpp" namespace amalgine { VertexShader::VertexShader() { glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxAttribs); } void VertexShader::defineMain(VertexShaderMainFunc mainFunc) { if(mainFuncDefined) throw ShaderFunctionAlreadyDefined("main"); writeBody("void main() {\n"); ShaderVec4 glPosition = mainFunc(); mainFuncDefined = true; writeBody("gl_Position = "); writeBody(glPosition.getOutput()); writeBody(";\n}\n\n"); } Result VertexShader::compile() { GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER); std::string verterShaderSource = build(); const char *verterShaderSourcePtr = verterShaderSource.c_str(); printf("Vertex shader:\n%s\n", verterShaderSourcePtr); glShaderSource(vertexShaderId, 1, &verterShaderSourcePtr, NULL); glCompileShader(vertexShaderId); GLint status; glGetShaderiv(vertexShaderId, GL_COMPILE_STATUS, &status); std::string compileLog = getShaderCompileLog((u32)vertexShaderId); if(status == GL_TRUE) { if(!compileLog.empty()) printf("Vertex shader compile log:\n%s", compileLog.c_str()); return Result::Ok(new CompiledVertexShader(vertexShaderId)); } else return Result::Err(compileLog); } }