mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-11-03 22:51:06 +01:00 
			
		
		
		
	Examples; imgui_impl_opengl3.cpp to work with Emscripten (#1941)
* Add some ifdefs to add emscripten specific params and includes * Update imgui_impl_opengl3.cpp * Update imgui_impl_opengl3.cpp * Update imgui_impl_opengl3.cpp * replace __EMSCRIPTEN_BUILD__ with __EMSCRIPTEN__ * replace GLFW_INCLUDE_ES3 with direct header * removing useless glfw include * Making call to glPolygonMode() optional
This commit is contained in:
		@@ -37,7 +37,7 @@
 | 
			
		||||
//  3.2       150       "#version 150"
 | 
			
		||||
//  3.3       330
 | 
			
		||||
//  4.0       400
 | 
			
		||||
//  4.1       410
 | 
			
		||||
//  4.1       410       "#version 410 core"
 | 
			
		||||
//  4.2       420
 | 
			
		||||
//  4.3       430
 | 
			
		||||
//  ES 2.0    100       "#version 100"
 | 
			
		||||
@@ -57,7 +57,11 @@
 | 
			
		||||
#include <stdint.h>     // intptr_t
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <GL/gl3w.h>    // This example is using gl3w to access OpenGL functions. You may use another OpenGL loader/header such as: glew, glext, glad, glLoadGen, etc.
 | 
			
		||||
#ifdef __EMSCRIPTEN__
 | 
			
		||||
    #include <GLES3/gl3.h>
 | 
			
		||||
#else
 | 
			
		||||
    #include <GL/gl3w.h>    // This example is using gl3w to access OpenGL functions. You may use another OpenGL loader/header such as: glew, glext, glad, glLoadGen, etc.
 | 
			
		||||
#endif
 | 
			
		||||
//#include <glew.h>
 | 
			
		||||
//#include <glext.h>
 | 
			
		||||
//#include <glad/glad.h>
 | 
			
		||||
@@ -114,7 +118,9 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
    GLint last_sampler; glGetIntegerv(GL_SAMPLER_BINDING, &last_sampler);
 | 
			
		||||
    GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
 | 
			
		||||
    GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
 | 
			
		||||
    GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
 | 
			
		||||
    #ifdef GL_POLYGON_MODE
 | 
			
		||||
        GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
 | 
			
		||||
    #endif
 | 
			
		||||
    GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
 | 
			
		||||
    GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
 | 
			
		||||
    GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb);
 | 
			
		||||
@@ -135,7 +141,9 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
    glDisable(GL_CULL_FACE);
 | 
			
		||||
    glDisable(GL_DEPTH_TEST);
 | 
			
		||||
    glEnable(GL_SCISSOR_TEST);
 | 
			
		||||
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 | 
			
		||||
    #ifdef glPolygonMode
 | 
			
		||||
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    // Setup viewport, orthographic projection matrix
 | 
			
		||||
    // Our visible imgui space lies from draw_data->DisplayPps (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps.
 | 
			
		||||
@@ -221,7 +229,9 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
 | 
			
		||||
    if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);
 | 
			
		||||
    if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
 | 
			
		||||
    if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST);
 | 
			
		||||
    glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]);
 | 
			
		||||
    #ifdef glPolygonMode
 | 
			
		||||
        glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]);
 | 
			
		||||
    #endif
 | 
			
		||||
    glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
 | 
			
		||||
    glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
 | 
			
		||||
}
 | 
			
		||||
@@ -340,6 +350,35 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects()
 | 
			
		||||
        "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    const GLchar* vertex_shader_glsl_300_es =
 | 
			
		||||
        "precision mediump float;\n"
 | 
			
		||||
        "layout (location = 0) in vec2 Position;\n"
 | 
			
		||||
        "layout (location = 1) in vec2 UV;\n"
 | 
			
		||||
        "layout (location = 2) in vec4 Color;\n"
 | 
			
		||||
        "uniform mat4 ProjMtx;\n"
 | 
			
		||||
        "out vec2 Frag_UV;\n"
 | 
			
		||||
        "out vec4 Frag_Color;\n"
 | 
			
		||||
        "void main()\n"
 | 
			
		||||
        "{\n"
 | 
			
		||||
        "    Frag_UV = UV;\n"
 | 
			
		||||
        "    Frag_Color = Color;\n"
 | 
			
		||||
        "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    const GLchar* vertex_shader_glsl_410_core =
 | 
			
		||||
        "layout (location = 0) in vec2 Position;\n"
 | 
			
		||||
        "layout (location = 1) in vec2 UV;\n"
 | 
			
		||||
        "layout (location = 2) in vec4 Color;\n"
 | 
			
		||||
        "uniform mat4 ProjMtx;\n"
 | 
			
		||||
        "out vec2 Frag_UV;\n"
 | 
			
		||||
        "out vec4 Frag_Color;\n"
 | 
			
		||||
        "void main()\n"
 | 
			
		||||
        "{\n"
 | 
			
		||||
        "    Frag_UV = UV;\n"
 | 
			
		||||
        "    Frag_Color = Color;\n"
 | 
			
		||||
        "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n"
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    const GLchar* fragment_shader_glsl_120 =
 | 
			
		||||
        "#ifdef GL_ES\n"
 | 
			
		||||
        "    precision mediump float;\n"
 | 
			
		||||
@@ -362,10 +401,41 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects()
 | 
			
		||||
        "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    const GLchar* fragment_shader_glsl_300_es =
 | 
			
		||||
        "precision mediump float;\n"
 | 
			
		||||
        "uniform sampler2D Texture;\n"
 | 
			
		||||
        "in vec2 Frag_UV;\n"
 | 
			
		||||
        "in vec4 Frag_Color;\n"
 | 
			
		||||
        "layout (location = 0) out vec4 Out_Color;\n"
 | 
			
		||||
        "void main()\n"
 | 
			
		||||
        "{\n"
 | 
			
		||||
        "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    const GLchar* fragment_shader_glsl_410_core =
 | 
			
		||||
        "in vec2 Frag_UV;\n"
 | 
			
		||||
        "in vec4 Frag_Color;\n"
 | 
			
		||||
        "uniform sampler2D Texture;\n"
 | 
			
		||||
        "layout (location = 0) out vec4 Out_Color;\n"
 | 
			
		||||
        "void main()\n"
 | 
			
		||||
        "{\n"
 | 
			
		||||
        "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n"
 | 
			
		||||
        "}\n";
 | 
			
		||||
 | 
			
		||||
    // Select shaders matching our GLSL versions
 | 
			
		||||
    const GLchar* vertex_shader = NULL;
 | 
			
		||||
    const GLchar* fragment_shader = NULL;
 | 
			
		||||
    if (glsl_version < 130)
 | 
			
		||||
    if(glsl_version == 410)
 | 
			
		||||
    {
 | 
			
		||||
        vertex_shader = vertex_shader_glsl_410_core;
 | 
			
		||||
        fragment_shader = fragment_shader_glsl_410_core;
 | 
			
		||||
    }
 | 
			
		||||
    else if(glsl_version == 300)
 | 
			
		||||
    {
 | 
			
		||||
        vertex_shader = vertex_shader_glsl_300_es;
 | 
			
		||||
        fragment_shader = fragment_shader_glsl_300_es;
 | 
			
		||||
    }
 | 
			
		||||
    else if (glsl_version < 130)
 | 
			
		||||
    {
 | 
			
		||||
        vertex_shader = vertex_shader_glsl_120;
 | 
			
		||||
        fragment_shader = fragment_shader_glsl_120;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user