mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-04 15:11:05 +01:00 
			
		
		
		
	Examples: OpenGL3: Added a way to override the glsl version number through the Init call. (#1667, #1466)
This commit is contained in:
		@@ -13,6 +13,7 @@
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
// (minor and older changes stripped away, please see git history for details)
 | 
			
		||||
//  2018-03-06: OpenGL: Added const char* glsl_version parameter to ImGui_ImplGlfwGL3_Init() so user can override the GLSL version e.g. "#version 150".
 | 
			
		||||
//  2018-02-23: OpenGL: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context.
 | 
			
		||||
//  2018-02-20: Inputs: Added support for mouse cursors (ImGui::GetMouseCursor() value and WM_SETCURSOR message handling).
 | 
			
		||||
//  2018-02-20: Inputs: Renamed GLFW callbacks exposed in .h to not include GL3 in their name.
 | 
			
		||||
@@ -31,6 +32,10 @@
 | 
			
		||||
//  2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle.
 | 
			
		||||
//  2016-04-30: OpenGL: Fixed save and restore of current GL_ACTIVE_TEXTURE.
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
 | 
			
		||||
#define _CRT_SECURE_NO_WARNINGS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "imgui.h"
 | 
			
		||||
#include "imgui_impl_glfw_gl3.h"
 | 
			
		||||
 | 
			
		||||
@@ -51,6 +56,7 @@ static bool         g_MouseJustPressed[3] = { false, false, false };
 | 
			
		||||
static GLFWcursor*  g_MouseCursors[ImGuiMouseCursor_COUNT] = { 0 };
 | 
			
		||||
 | 
			
		||||
// OpenGL3 data
 | 
			
		||||
static char         g_GlslVersion[32] = "#version 150";
 | 
			
		||||
static GLuint       g_FontTexture = 0;
 | 
			
		||||
static int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0;
 | 
			
		||||
static int          g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0;
 | 
			
		||||
@@ -258,8 +264,7 @@ bool ImGui_ImplGlfwGL3_CreateDeviceObjects()
 | 
			
		||||
    glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
 | 
			
		||||
    glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
 | 
			
		||||
 | 
			
		||||
    const GLchar *vertex_shader =
 | 
			
		||||
        "#version 150\n"
 | 
			
		||||
    const GLchar* vertex_shader =
 | 
			
		||||
        "uniform mat4 ProjMtx;\n"
 | 
			
		||||
        "in vec2 Position;\n"
 | 
			
		||||
        "in vec2 UV;\n"
 | 
			
		||||
@@ -274,7 +279,6 @@ bool ImGui_ImplGlfwGL3_CreateDeviceObjects()
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    const GLchar* fragment_shader =
 | 
			
		||||
        "#version 150\n"
 | 
			
		||||
        "uniform sampler2D Texture;\n"
 | 
			
		||||
        "in vec2 Frag_UV;\n"
 | 
			
		||||
        "in vec4 Frag_Color;\n"
 | 
			
		||||
@@ -284,11 +288,14 @@ bool ImGui_ImplGlfwGL3_CreateDeviceObjects()
 | 
			
		||||
        "	Out_Color = Frag_Color * texture( Texture, Frag_UV.st);\n"
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    const GLchar* vertex_shader_with_version[2] = { g_GlslVersion, vertex_shader };
 | 
			
		||||
    const GLchar* fragment_shader_with_version[2] = { g_GlslVersion, fragment_shader };
 | 
			
		||||
 | 
			
		||||
    g_ShaderHandle = glCreateProgram();
 | 
			
		||||
    g_VertHandle = glCreateShader(GL_VERTEX_SHADER);
 | 
			
		||||
    g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER);
 | 
			
		||||
    glShaderSource(g_VertHandle, 1, &vertex_shader, 0);
 | 
			
		||||
    glShaderSource(g_FragHandle, 1, &fragment_shader, 0);
 | 
			
		||||
    glShaderSource(g_VertHandle, 2, vertex_shader_with_version, NULL);
 | 
			
		||||
    glShaderSource(g_FragHandle, 2, fragment_shader_with_version, NULL);
 | 
			
		||||
    glCompileShader(g_VertHandle);
 | 
			
		||||
    glCompileShader(g_FragHandle);
 | 
			
		||||
    glAttachShader(g_ShaderHandle, g_VertHandle);
 | 
			
		||||
@@ -347,12 +354,20 @@ static void ImGui_ImplGlfw_InstallCallbacks(GLFWwindow* window)
 | 
			
		||||
    glfwSetCharCallback(window, ImGui_ImplGlfw_CharCallback);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool    ImGui_ImplGlfwGL3_Init(GLFWwindow* window, bool install_callbacks)
 | 
			
		||||
bool    ImGui_ImplGlfwGL3_Init(GLFWwindow* window, bool install_callbacks, const char* glsl_version)
 | 
			
		||||
{
 | 
			
		||||
    g_Window = window;
 | 
			
		||||
 | 
			
		||||
    // Store GL version string so we can refer to it later in case we recreate shaders.
 | 
			
		||||
    if (glsl_version == NULL)
 | 
			
		||||
        glsl_version = "#version 150";
 | 
			
		||||
    IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(g_GlslVersion));
 | 
			
		||||
    strcpy(g_GlslVersion, glsl_version);
 | 
			
		||||
    strcat(g_GlslVersion, "\n");
 | 
			
		||||
 | 
			
		||||
    // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB;                         // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
 | 
			
		||||
    io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB;
 | 
			
		||||
    io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT;
 | 
			
		||||
    io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT;
 | 
			
		||||
    io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP;
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
 | 
			
		||||
struct GLFWwindow;
 | 
			
		||||
 | 
			
		||||
IMGUI_API bool        ImGui_ImplGlfwGL3_Init(GLFWwindow* window, bool install_callbacks);
 | 
			
		||||
IMGUI_API bool        ImGui_ImplGlfwGL3_Init(GLFWwindow* window, bool install_callbacks, const char* glsl_version = NULL);
 | 
			
		||||
IMGUI_API void        ImGui_ImplGlfwGL3_Shutdown();
 | 
			
		||||
IMGUI_API void        ImGui_ImplGlfwGL3_NewFrame();
 | 
			
		||||
IMGUI_API void        ImGui_ImplGlfwGL3_RenderDrawData(ImDrawData* draw_data);
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@
 | 
			
		||||
 | 
			
		||||
// CHANGELOG
 | 
			
		||||
// (minor and older changes stripped away, please see git history for details)
 | 
			
		||||
//  2018-03-06: OpenGL: Added const char* glsl_version parameter to ImGui_ImplSdlGL3_Init() so user can override the GLSL version e.g. "#version 150".
 | 
			
		||||
//  2018-02-23: OpenGL: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context.
 | 
			
		||||
//  2018-02-16: Inputs: Added support for mouse cursors, honoring ImGui::GetMouseCursor() value.
 | 
			
		||||
//  2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplSdlGL3_RenderDrawData() in the .h file so you can call it yourself.
 | 
			
		||||
@@ -31,6 +32,10 @@
 | 
			
		||||
//  2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle.
 | 
			
		||||
//  2016-07-29: OpenGL: Explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it. (#752)
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
 | 
			
		||||
#define _CRT_SECURE_NO_WARNINGS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "imgui.h"
 | 
			
		||||
#include "imgui_impl_sdl_gl3.h"
 | 
			
		||||
 | 
			
		||||
@@ -45,6 +50,7 @@ static bool         g_MousePressed[3] = { false, false, false };
 | 
			
		||||
static SDL_Cursor*  g_MouseCursors[ImGuiMouseCursor_COUNT] = { 0 };
 | 
			
		||||
 | 
			
		||||
// OpenGL data
 | 
			
		||||
static char         g_GlslVersion[32] = "#version 150";
 | 
			
		||||
static GLuint       g_FontTexture = 0;
 | 
			
		||||
static int          g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0;
 | 
			
		||||
static int          g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0;
 | 
			
		||||
@@ -261,7 +267,6 @@ bool ImGui_ImplSdlGL3_CreateDeviceObjects()
 | 
			
		||||
    glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
 | 
			
		||||
 | 
			
		||||
    const GLchar *vertex_shader =
 | 
			
		||||
        "#version 150\n"
 | 
			
		||||
        "uniform mat4 ProjMtx;\n"
 | 
			
		||||
        "in vec2 Position;\n"
 | 
			
		||||
        "in vec2 UV;\n"
 | 
			
		||||
@@ -276,7 +281,6 @@ bool ImGui_ImplSdlGL3_CreateDeviceObjects()
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    const GLchar* fragment_shader =
 | 
			
		||||
        "#version 150\n"
 | 
			
		||||
        "uniform sampler2D Texture;\n"
 | 
			
		||||
        "in vec2 Frag_UV;\n"
 | 
			
		||||
        "in vec4 Frag_Color;\n"
 | 
			
		||||
@@ -286,11 +290,14 @@ bool ImGui_ImplSdlGL3_CreateDeviceObjects()
 | 
			
		||||
        "	Out_Color = Frag_Color * texture( Texture, Frag_UV.st);\n"
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    const GLchar* vertex_shader_with_version[2] = { g_GlslVersion, vertex_shader };
 | 
			
		||||
    const GLchar* fragment_shader_with_version[2] = { g_GlslVersion, fragment_shader };
 | 
			
		||||
 | 
			
		||||
    g_ShaderHandle = glCreateProgram();
 | 
			
		||||
    g_VertHandle = glCreateShader(GL_VERTEX_SHADER);
 | 
			
		||||
    g_FragHandle = glCreateShader(GL_FRAGMENT_SHADER);
 | 
			
		||||
    glShaderSource(g_VertHandle, 1, &vertex_shader, 0);
 | 
			
		||||
    glShaderSource(g_FragHandle, 1, &fragment_shader, 0);
 | 
			
		||||
    glShaderSource(g_VertHandle, 2, vertex_shader_with_version, NULL);
 | 
			
		||||
    glShaderSource(g_FragHandle, 2, fragment_shader_with_version, NULL);
 | 
			
		||||
    glCompileShader(g_VertHandle);
 | 
			
		||||
    glCompileShader(g_FragHandle);
 | 
			
		||||
    glAttachShader(g_ShaderHandle, g_VertHandle);
 | 
			
		||||
@@ -341,8 +348,15 @@ void    ImGui_ImplSdlGL3_InvalidateDeviceObjects()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool    ImGui_ImplSdlGL3_Init(SDL_Window* window)
 | 
			
		||||
bool    ImGui_ImplSdlGL3_Init(SDL_Window* window, const char* glsl_version)
 | 
			
		||||
{
 | 
			
		||||
    // Store GL version string so we can refer to it later in case we recreate shaders.
 | 
			
		||||
    if (glsl_version == NULL)
 | 
			
		||||
        glsl_version = "#version 150";
 | 
			
		||||
    IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(g_GlslVersion));
 | 
			
		||||
    strcpy(g_GlslVersion, glsl_version);
 | 
			
		||||
    strcat(g_GlslVersion, "\n");
 | 
			
		||||
 | 
			
		||||
    // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array.
 | 
			
		||||
    ImGuiIO& io = ImGui::GetIO();
 | 
			
		||||
    io.KeyMap[ImGuiKey_Tab] = SDL_SCANCODE_TAB;
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
struct SDL_Window;
 | 
			
		||||
typedef union SDL_Event SDL_Event;
 | 
			
		||||
 | 
			
		||||
IMGUI_API bool        ImGui_ImplSdlGL3_Init(SDL_Window* window);
 | 
			
		||||
IMGUI_API bool        ImGui_ImplSdlGL3_Init(SDL_Window* window, const char* glsl_version = NULL);
 | 
			
		||||
IMGUI_API void        ImGui_ImplSdlGL3_Shutdown();
 | 
			
		||||
IMGUI_API void        ImGui_ImplSdlGL3_NewFrame(SDL_Window* window);
 | 
			
		||||
IMGUI_API void        ImGui_ImplSdlGL3_RenderDrawData(ImDrawData* draw_data);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user