From 649079a5c7fa9f955931b615d12f09dc5c3c25c6 Mon Sep 17 00:00:00 2001 From: James Grogan Date: Tue, 15 Nov 2022 11:50:24 +0000 Subject: [PATCH] Some opengl additions --- README.md | 2 +- src/graphics/CMakeLists.txt | 2 +- src/graphics/opengl/OpenGlPainter.cpp | 154 ++++++++++++++++-- src/graphics/opengl/OpenGlPainter.h | 9 + .../ui_interfaces/x11/XcbGlInterface.cpp | 2 + .../x11/XcbGlWindowInterface.cpp | 11 +- 6 files changed, 163 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 1863df1..99188cc 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ In `xdg-shell-protocol.cpp` - we need access to `xdg_wm_base_interface` so expor #### 3D Rendering ```bash -sudo apt-get install libgl-dev libegl1-mesa-dev +sudo apt-get install libgl-dev libegl1-mesa-dev libglu1-mesa-dev ``` #### fonts diff --git a/src/graphics/CMakeLists.txt b/src/graphics/CMakeLists.txt index 0b5526e..8cc6fe4 100644 --- a/src/graphics/CMakeLists.txt +++ b/src/graphics/CMakeLists.txt @@ -18,7 +18,7 @@ list(APPEND graphics_HEADERS set(OpenGL_GL_PREFERENCE "GLVND") find_package(OpenGL QUIET) if (OpenGL_FOUND) - list(APPEND platform_LIBS OpenGL::GL) + list(APPEND platform_LIBS OpenGL::GL OpenGL::GLU) list(APPEND graphics_LIB_INCLUDES opengl/OpenGlPainter.cpp) list(APPEND graphics_HEADERS opengl/OpenGlPainter.h) else() diff --git a/src/graphics/opengl/OpenGlPainter.cpp b/src/graphics/opengl/OpenGlPainter.cpp index 02375aa..32e9698 100644 --- a/src/graphics/opengl/OpenGlPainter.cpp +++ b/src/graphics/opengl/OpenGlPainter.cpp @@ -9,22 +9,129 @@ #include #endif +#define GL_GLEXT_PROTOTYPES #include +#include +#include #include +const char* vertexShaderSource = "#version 330 core\n" + "layout (location = 0) in vec3 aPos;\n" + "void main()\n" + "{\n" + " gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" + "}\0"; + + +const char* fragmentShaderSource = "#version 330 core\n" + "out vec4 FragColor;\n" + "void main()\n" + "{\n" + "FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" + "}\n"; + + +OpenGlPainter::OpenGlPainter() +{ + +} + +void OpenGlPainter::initialize() +{ + if (auto context = glXGetCurrentContext()) + { + std::cout << "has valid context" << std::endl; + } + else + { + std::cout << "no valid context" << std::endl; + } + + int major_version{0}; + int minor_version{0}; + glGetIntegerv(GL_MAJOR_VERSION, &major_version); + glGetIntegerv(GL_MINOR_VERSION, &minor_version); + std::cout << "Using opengl version " << major_version << "|" << minor_version << std::endl; + + std::cout << "Creating opengl painter" << std::endl; + unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr); + glCompileShader(vertexShader); + + int success; + char infoLog[512]; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + if(!success) + { + glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog); + std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED: " << std::string(infoLog) << std::endl; + + if (auto errCode = glGetError(); errCode != GL_NO_ERROR) + { + auto errString = gluErrorString(errCode); + std::cout << "Got gl error" << errString << std::endl; + } + } + else + { + std::cout << "Shader compiled ok" << std::endl; + if (auto errCode = glGetError(); errCode != GL_NO_ERROR) + { + auto errString = gluErrorString(errCode); + std::cout << "Got gl error after ok" << errString << std::endl; + } + } + + unsigned int fragmentShader; + fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr); + glCompileShader(fragmentShader); + + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); + + if(!success) + { + glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); + std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED: " << infoLog << std::endl; + } + + mShaderProgram = glCreateProgram(); + + glAttachShader(mShaderProgram, vertexShader); + glAttachShader(mShaderProgram, fragmentShader); + glLinkProgram(mShaderProgram); + + glGetProgramiv(mShaderProgram, GL_LINK_STATUS, &success); + if(!success) + { + glGetProgramInfoLog(mShaderProgram, 512, NULL, infoLog); + std::cout << "Shader linking FAILED\n" << infoLog << std::endl; + } + + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + + mInitialized = true; +} + void OpenGlPainter::paint(DrawingContext* context) { + if (!mInitialized) + { + initialize(); + } + auto surface = context->getSurface(); const auto width = double(surface->getWidth()); const auto height = double(surface->getHeight()); const auto num_mesh = context->getScene()->getNumMeshes(); glViewport(0, 0, width, height); - glOrtho(0, width, 0, height, -1.0, 1.0); - glScissor(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); + //glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); + //glScissor(0, 0, width, height); + //glMatrixMode(GL_PROJECTION); + //glLoadIdentity(); glClearColor(0.5, 0.5, 1.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); @@ -32,6 +139,30 @@ void OpenGlPainter::paint(DrawingContext* context) //glMatrixMode(GL_MODELVIEW); //glLoadIdentity(); + float vertices[] = { + -0.5f, -0.5f, 0.0f, + 0.5f, -0.5f, 0.0f, + 0.0f, 0.5f, 0.0f + }; + unsigned int vbo{0}; + glGenBuffers(1, &vbo); + + unsigned int VAO; + glGenVertexArrays(1, &VAO); + glBindVertexArray(VAO); + + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + + glUseProgram(mShaderProgram); + glBindVertexArray(VAO); + + glDrawArrays(GL_TRIANGLES, 0, 3); + + /* std::cout << "Bounds are : " << width << " | " << height << std::endl; for (std::size_t idx=0; idx #include @@ -59,6 +60,7 @@ void XcbGlInterface::setupContext(int default_screen) glXGetFBConfigAttrib(mDisplay, mConfig, GLX_VISUAL_ID, &visualID); /* Create OpenGL context */ + std::cout << "Creating opengl context" << std::endl; mContext = glXCreateNewContext(mDisplay, mConfig, GLX_RGBA_TYPE, 0, True); if (!mContext) { diff --git a/src/windows/ui_interfaces/x11/XcbGlWindowInterface.cpp b/src/windows/ui_interfaces/x11/XcbGlWindowInterface.cpp index c46e91f..5f5dd0b 100644 --- a/src/windows/ui_interfaces/x11/XcbGlWindowInterface.cpp +++ b/src/windows/ui_interfaces/x11/XcbGlWindowInterface.cpp @@ -54,17 +54,18 @@ bool XcbGlWindowInterface::initialize(xcb_window_t window) MLOG_ERROR("glXMakeContextCurrent failed"); return false; } + return true; } void XcbGlWindowInterface::resizeViewPort(unsigned width, unsigned height) { - glViewport(0, 0, width, height); - glScissor(0, 0, width, height); + //glViewport(0, 0, width, height); + //glScissor(0, 0, width, height); - glOrtho(0, width, 0, height, -1.0, 1.0); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); + //glOrtho(0, width, 0, height, -1.0, 1.0); + //glMatrixMode(GL_PROJECTION); + //glLoadIdentity(); //glMatrixMode(GL_MODELVIEW);