mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-26 10:41:10 +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.2       150       "#version 150" | ||||||
| //  3.3       330 | //  3.3       330 | ||||||
| //  4.0       400 | //  4.0       400 | ||||||
| //  4.1       410 | //  4.1       410       "#version 410 core" | ||||||
| //  4.2       420 | //  4.2       420 | ||||||
| //  4.3       430 | //  4.3       430 | ||||||
| //  ES 2.0    100       "#version 100" | //  ES 2.0    100       "#version 100" | ||||||
| @@ -57,7 +57,11 @@ | |||||||
| #include <stdint.h>     // intptr_t | #include <stdint.h>     // intptr_t | ||||||
| #endif | #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 <glew.h> | ||||||
| //#include <glext.h> | //#include <glext.h> | ||||||
| //#include <glad/glad.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_sampler; glGetIntegerv(GL_SAMPLER_BINDING, &last_sampler); | ||||||
|     GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); |     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_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_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); | ||||||
|     GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); |     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); |     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_CULL_FACE); | ||||||
|     glDisable(GL_DEPTH_TEST); |     glDisable(GL_DEPTH_TEST); | ||||||
|     glEnable(GL_SCISSOR_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 |     // 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. |     // 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_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_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); |     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]); |     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]); |     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" |         "    gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" | ||||||
|         "}\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 = |     const GLchar* fragment_shader_glsl_120 = | ||||||
|         "#ifdef GL_ES\n" |         "#ifdef GL_ES\n" | ||||||
|         "    precision mediump float;\n" |         "    precision mediump float;\n" | ||||||
| @@ -362,10 +401,41 @@ bool    ImGui_ImplOpenGL3_CreateDeviceObjects() | |||||||
|         "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" |         "    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" | ||||||
|         "}\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 |     // Select shaders matching our GLSL versions | ||||||
|     const GLchar* vertex_shader = NULL; |     const GLchar* vertex_shader = NULL; | ||||||
|     const GLchar* fragment_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; |         vertex_shader = vertex_shader_glsl_120; | ||||||
|         fragment_shader = fragment_shader_glsl_120; |         fragment_shader = fragment_shader_glsl_120; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user