Branimir Karadžić 8 years ago
parent
commit
cbc86d49b5
3 changed files with 69 additions and 321 deletions
  1. 25 309
      examples/common/imgui/imgui.cpp
  2. 1 2
      examples/common/imgui/imgui.h
  3. 43 10
      examples/common/imgui/ocornut_imgui.cpp

+ 25 - 309
examples/common/imgui/imgui.cpp

@@ -3,27 +3,6 @@
  * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
  * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
  */
  */
 
 
-// This code is based on:
-//
-// Copyright (c) 2009-2010 Mikko Mononen [email protected]
-//
-// This software is provided 'as-is', without any express or implied
-// warranty.  In no event will the authors be held liable for any damages
-// arising from the use of this software.
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-// 1. The origin of this software must not be misrepresented; you must not
-//    claim that you wrote the original software. If you use this software
-//    in a product, an acknowledgment in the product documentation would be
-//    appreciated but is not required.
-// 2. Altered source versions must be plainly marked as such, and must not be
-//    misrepresented as being the original software.
-// 3. This notice may not be removed or altered from any source distribution.
-//
-// Source altered and distributed from https://github.com/AdrienHerubel/imgui
-
-#include <stdio.h>
 #include <bx/string.h>
 #include <bx/string.h>
 #include <bx/uint32_t.h>
 #include <bx/uint32_t.h>
 #include <bx/fpumath.h>
 #include <bx/fpumath.h>
@@ -35,38 +14,6 @@
 #include "../bgfx_utils.h"
 #include "../bgfx_utils.h"
 #include "../nanovg/nanovg.h"
 #include "../nanovg/nanovg.h"
 
 
-#include <bgfx/embedded_shader.h>
-
-// embedded shaders
-#include "vs_imgui_color.bin.h"
-#include "fs_imgui_color.bin.h"
-#include "vs_imgui_texture.bin.h"
-#include "fs_imgui_texture.bin.h"
-#include "vs_imgui_cubemap.bin.h"
-#include "fs_imgui_cubemap.bin.h"
-#include "vs_imgui_latlong.bin.h"
-#include "fs_imgui_latlong.bin.h"
-#include "vs_imgui_image.bin.h"
-#include "fs_imgui_image.bin.h"
-#include "fs_imgui_image_swizz.bin.h"
-
-static const bgfx::EmbeddedShader s_embeddedShaders[] =
-{
-	BGFX_EMBEDDED_SHADER(vs_imgui_color),
-	BGFX_EMBEDDED_SHADER(fs_imgui_color),
-	BGFX_EMBEDDED_SHADER(vs_imgui_texture),
-	BGFX_EMBEDDED_SHADER(fs_imgui_texture),
-	BGFX_EMBEDDED_SHADER(vs_imgui_cubemap),
-	BGFX_EMBEDDED_SHADER(fs_imgui_cubemap),
-	BGFX_EMBEDDED_SHADER(vs_imgui_latlong),
-	BGFX_EMBEDDED_SHADER(fs_imgui_latlong),
-	BGFX_EMBEDDED_SHADER(vs_imgui_image),
-	BGFX_EMBEDDED_SHADER(fs_imgui_image),
-	BGFX_EMBEDDED_SHADER(fs_imgui_image_swizz),
-
-	BGFX_EMBEDDED_SHADER_END()
-};
-
 BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4244); // warning C4244: '=' : conversion from '' to '', possible loss of data
 BX_PRAGMA_DIAGNOSTIC_IGNORED_MSVC(4244); // warning C4244: '=' : conversion from '' to '', possible loss of data
 
 
 void* imguiMalloc(size_t _size, void*);
 void* imguiMalloc(size_t _size, void*);
@@ -213,135 +160,8 @@ namespace
 		_u = 1.0f - _v - _w;
 		_u = 1.0f - _v - _w;
 	}
 	}
 
 
-	struct PosColorVertex
-	{
-		float m_x;
-		float m_y;
-		uint32_t m_abgr;
-
-		static void init()
-		{
-			ms_decl
-				.begin()
-				.add(bgfx::Attrib::Position, 2, bgfx::AttribType::Float)
-				.add(bgfx::Attrib::Color0,   4, bgfx::AttribType::Uint8, true)
-				.end();
-		}
-
-		static bgfx::VertexDecl ms_decl;
-	};
-
-	bgfx::VertexDecl PosColorVertex::ms_decl;
-
-	struct PosColorUvVertex
-	{
-		float m_x;
-		float m_y;
-		float m_u;
-		float m_v;
-		uint32_t m_abgr;
-
-		static void init()
-		{
-			ms_decl
-				.begin()
-				.add(bgfx::Attrib::Position,  2, bgfx::AttribType::Float)
-				.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float)
-				.add(bgfx::Attrib::Color0,    4, bgfx::AttribType::Uint8, true)
-				.end();
-		}
-
-		static bgfx::VertexDecl ms_decl;
-	};
-
-	bgfx::VertexDecl PosColorUvVertex::ms_decl;
-
-	struct PosUvVertex
-	{
-		float m_x;
-		float m_y;
-		float m_u;
-		float m_v;
-
-		static void init()
-		{
-			ms_decl
-				.begin()
-				.add(bgfx::Attrib::Position,  2, bgfx::AttribType::Float)
-				.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float)
-				.end();
-		}
-
-		static bgfx::VertexDecl ms_decl;
-	};
-
-	bgfx::VertexDecl PosUvVertex::ms_decl;
-
-	struct PosNormalVertex
-	{
-		float m_x;
-		float m_y;
-		float m_z;
-		float m_nx;
-		float m_ny;
-		float m_nz;
-
-		static void init()
-		{
-			ms_decl.begin()
-				   .add(bgfx::Attrib::Position,  3, bgfx::AttribType::Float)
-				   .add(bgfx::Attrib::Normal,    3, bgfx::AttribType::Float)
-				   .end();
-		}
-
-		void set(float _x, float _y, float _z, float _nx, float _ny, float _nz)
-		{
-			m_x = _x;
-			m_y = _y;
-			m_z = _z;
-			m_nx = _nx;
-			m_ny = _ny;
-			m_nz = _nz;
-		}
-
-		static bgfx::VertexDecl ms_decl;
-	};
-
-	bgfx::VertexDecl PosNormalVertex::ms_decl;
-
 } // namespace
 } // namespace
 
 
-struct Imgui
-{
-	Imgui()
-		: m_mx(-1)
-		, m_my(-1)
-		, m_scroll(0)
-		, m_textureWidth(512)
-		, m_textureHeight(512)
-		, m_halfTexel(0.0f)
-		, m_view(255)
-		, m_surfaceWidth(0)
-		, m_surfaceHeight(0)
-		, m_viewWidth(0)
-		, m_viewHeight(0)
-	{
-		m_invTextureWidth  = 1.0f/m_textureWidth;
-		m_invTextureHeight = 1.0f/m_textureHeight;
-
-		u_imageLodEnabled.idx = bgfx::kInvalidHandle;
-		u_imageSwizzle.idx    = bgfx::kInvalidHandle;
-		s_texColor.idx        = bgfx::kInvalidHandle;
-		m_missingTexture.idx  = bgfx::kInvalidHandle;
-
-		m_colorProgram.idx      = bgfx::kInvalidHandle;
-		m_textureProgram.idx    = bgfx::kInvalidHandle;
-		m_cubeMapProgram.idx    = bgfx::kInvalidHandle;
-		m_latlongProgram.idx    = bgfx::kInvalidHandle;
-		m_imageProgram.idx      = bgfx::kInvalidHandle;
-		m_imageSwizzProgram.idx = bgfx::kInvalidHandle;
-	}
-
 	bgfx::TextureHandle genMissingTexture(uint32_t _width, uint32_t _height, float _lineWidth = 0.02f)
 	bgfx::TextureHandle genMissingTexture(uint32_t _width, uint32_t _height, float _lineWidth = 0.02f)
 	{
 	{
 		const bgfx::Memory* mem = bgfx::alloc(_width*_height*4);
 		const bgfx::Memory* mem = bgfx::alloc(_width*_height*4);
@@ -365,93 +185,33 @@ struct Imgui
 		}
 		}
 
 
 		return bgfx::createTexture2D(
 		return bgfx::createTexture2D(
-					  uint16_t(_width)
-					, uint16_t(_height)
-					, false
-					, 1
-					, bgfx::TextureFormat::BGRA8
-					, 0
-					, mem
-					);
-	}
-
-	void create(float _fontSize, bx::AllocatorI* _allocator)
-	{
-		m_allocator = _allocator;
-
-		if (NULL == _allocator)
-		{
-			static bx::DefaultAllocator allocator;
-			m_allocator = &allocator;
-		}
-
-		IMGUI_create(_fontSize, m_allocator);
-
-		PosColorVertex::init();
-		PosColorUvVertex::init();
-		PosUvVertex::init();
-		PosNormalVertex::init();
-
-		u_imageLodEnabled = bgfx::createUniform("u_imageLodEnabled", bgfx::UniformType::Vec4);
-		u_imageSwizzle    = bgfx::createUniform("u_swizzle",         bgfx::UniformType::Vec4);
-		s_texColor        = bgfx::createUniform("s_texColor",        bgfx::UniformType::Int1);
-
-		bgfx::ShaderHandle vsh;
-		bgfx::ShaderHandle fsh;
-
-		bgfx::RendererType::Enum type = bgfx::getRendererType();
-		vsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "vs_imgui_color");
-		fsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_imgui_color");
-		m_colorProgram = bgfx::createProgram(vsh, fsh);
-		bgfx::destroyShader(vsh);
-		bgfx::destroyShader(fsh);
-
-		vsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "vs_imgui_texture");
-		fsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_imgui_texture");
-		m_textureProgram = bgfx::createProgram(vsh, fsh);
-		bgfx::destroyShader(vsh);
-		bgfx::destroyShader(fsh);
-
-		vsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "vs_imgui_cubemap");
-		fsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_imgui_cubemap");
-		m_cubeMapProgram = bgfx::createProgram(vsh, fsh);
-		bgfx::destroyShader(vsh);
-		bgfx::destroyShader(fsh);
-
-		vsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "vs_imgui_latlong");
-		fsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_imgui_latlong");
-		m_latlongProgram = bgfx::createProgram(vsh, fsh);
-		bgfx::destroyShader(vsh);
-		bgfx::destroyShader(fsh);
-
-		vsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "vs_imgui_image");
-		fsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_imgui_image");
-		m_imageProgram = bgfx::createProgram(vsh, fsh);
-		bgfx::destroyShader(fsh);
-
-		// Notice: using the same vsh.
-		fsh = bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_imgui_image_swizz");
-		m_imageSwizzProgram = bgfx::createProgram(vsh, fsh);
-		bgfx::destroyShader(fsh);
-		bgfx::destroyShader(vsh);
-
-		m_missingTexture = genMissingTexture(256, 256, 0.04f);
+			  uint16_t(_width)
+			, uint16_t(_height)
+			, false
+			, 1
+			, bgfx::TextureFormat::BGRA8
+			, 0
+			, mem
+			);
 	}
 	}
 
 
-	void destroy()
+struct Imgui
+{
+	Imgui()
+		: m_mx(-1)
+		, m_my(-1)
+		, m_scroll(0)
+		, m_textureWidth(512)
+		, m_textureHeight(512)
+		, m_halfTexel(0.0f)
+		, m_view(255)
+		, m_surfaceWidth(0)
+		, m_surfaceHeight(0)
+		, m_viewWidth(0)
+		, m_viewHeight(0)
 	{
 	{
-		bgfx::destroyUniform(u_imageLodEnabled);
-		bgfx::destroyUniform(u_imageSwizzle);
-		bgfx::destroyUniform(s_texColor);
-		bgfx::destroyTexture(m_missingTexture);
-		bgfx::destroyProgram(m_colorProgram);
-		bgfx::destroyProgram(m_textureProgram);
-		bgfx::destroyProgram(m_cubeMapProgram);
-		bgfx::destroyProgram(m_latlongProgram);
-		bgfx::destroyProgram(m_imageProgram);
-		bgfx::destroyProgram(m_imageSwizzProgram);
-
-		IMGUI_destroy();
+		m_invTextureWidth  = 1.0f/m_textureWidth;
+		m_invTextureHeight = 1.0f/m_textureHeight;
 	}
 	}
 
 
 	void beginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar, uint8_t _view)
 	void beginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar, uint8_t _view)
@@ -469,7 +229,7 @@ struct Imgui
 
 
 		IMGUI_beginFrame(mx, my, _button, _scroll, _width, _height, _inputChar, _view);
 		IMGUI_beginFrame(mx, my, _button, _scroll, _width, _height, _inputChar, _view);
 
 
-		bgfx::setViewName(_view, "IMGUI");
+		bgfx::setViewName(_view, "ImGui");
 		bgfx::setViewMode(_view, bgfx::ViewMode::Sequential);
 		bgfx::setViewMode(_view, bgfx::ViewMode::Sequential);
 
 
 		const bgfx::HMD*  hmd  = bgfx::getHMD();
 		const bgfx::HMD*  hmd  = bgfx::getHMD();
@@ -651,7 +411,6 @@ struct Imgui
 	}
 	}
 #endif // 0
 #endif // 0
 
 
-	bx::AllocatorI* m_allocator;
 	int32_t m_mx;
 	int32_t m_mx;
 	int32_t m_my;
 	int32_t m_my;
 	int32_t m_scroll;
 	int32_t m_scroll;
@@ -667,46 +426,10 @@ struct Imgui
 	uint16_t m_surfaceHeight;
 	uint16_t m_surfaceHeight;
 	uint16_t m_viewWidth;
 	uint16_t m_viewWidth;
 	uint16_t m_viewHeight;
 	uint16_t m_viewHeight;
-
-	bgfx::UniformHandle u_imageLodEnabled;
-	bgfx::UniformHandle u_imageSwizzle;
-	bgfx::UniformHandle s_texColor;
-	bgfx::ProgramHandle m_colorProgram;
-	bgfx::ProgramHandle m_textureProgram;
-	bgfx::ProgramHandle m_cubeMapProgram;
-	bgfx::ProgramHandle m_latlongProgram;
-	bgfx::ProgramHandle m_imageProgram;
-	bgfx::ProgramHandle m_imageSwizzProgram;
-	bgfx::TextureHandle m_missingTexture;
 };
 };
 
 
 static Imgui s_imgui;
 static Imgui s_imgui;
 
 
-void* imguiMalloc(size_t _size, void*)
-{
-	return BX_ALLOC(s_imgui.m_allocator, _size);
-}
-
-void imguiFree(void* _ptr, void*)
-{
-	BX_FREE(s_imgui.m_allocator, _ptr);
-}
-
-void imguiCreate(const void*, uint32_t, float _fontSize, bx::AllocatorI* _allocator)
-{
-	s_imgui.create(_fontSize, _allocator);
-}
-
-void imguiDestroy()
-{
-	s_imgui.destroy();
-}
-
-void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar, uint8_t _view)
-{
-	s_imgui.beginFrame(_mx, _my, _button, _scroll, _width, _height, _surfaceWidth, _surfaceHeight, _inputChar, _view);
-}
-
 void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar, uint8_t _view)
 void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar, uint8_t _view)
 {
 {
 	s_imgui.beginFrame(_mx, _my, _button, _scroll, _width, _height, _width, _height, _inputChar, _view);
 	s_imgui.beginFrame(_mx, _my, _button, _scroll, _width, _height, _width, _height, _inputChar, _view);
@@ -716,10 +439,3 @@ void imguiEndFrame()
 {
 {
 	s_imgui.endFrame();
 	s_imgui.endFrame();
 }
 }
-
-bgfx::ProgramHandle imguiGetImageProgram(uint8_t _mip)
-{
-	const float lodEnabled[4] = { float(_mip), 1.0f, 0.0f, 0.0f };
-	bgfx::setUniform(s_imgui.u_imageLodEnabled, lodEnabled);
-	return s_imgui.m_imageProgram;
-}

+ 1 - 2
examples/common/imgui/imgui.h

@@ -47,11 +47,10 @@ inline uint32_t imguiRGBA(uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _a = 255)
 
 
 namespace bx { struct AllocatorI; }
 namespace bx { struct AllocatorI; }
 
 
-void imguiCreate(const void* _data = NULL, uint32_t _size = 0, float _fontSize = 18.0f, bx::AllocatorI* _allocator = NULL);
+void imguiCreate(float _fontSize = 18.0f, bx::AllocatorI* _allocator = NULL);
 void imguiDestroy();
 void imguiDestroy();
 
 
 void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar = 0, uint8_t _view = 255);
 void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, char _inputChar = 0, uint8_t _view = 255);
-void imguiBeginFrame(int32_t _mx, int32_t _my, uint8_t _button, int32_t _scroll, uint16_t _width, uint16_t _height, uint16_t _surfaceWidth, uint16_t _surfaceHeight, char _inputChar = 0, uint8_t _view = 255);
 void imguiEndFrame();
 void imguiEndFrame();
 
 
 namespace entry { class AppI; }
 namespace entry { class AppI; }

+ 43 - 10
examples/common/imgui/ocornut_imgui.cpp

@@ -8,7 +8,9 @@
 #include <bx/allocator.h>
 #include <bx/allocator.h>
 #include <bx/fpumath.h>
 #include <bx/fpumath.h>
 #include <bx/timer.h>
 #include <bx/timer.h>
+#include <bx/crtimpl.h>
 #include <ocornut-imgui/imgui.h>
 #include <ocornut-imgui/imgui.h>
+
 #include "imgui.h"
 #include "imgui.h"
 #include "ocornut_imgui.h"
 #include "ocornut_imgui.h"
 #include "../bgfx_utils.h"
 #include "../bgfx_utils.h"
@@ -32,6 +34,8 @@
 
 
 #include "vs_ocornut_imgui.bin.h"
 #include "vs_ocornut_imgui.bin.h"
 #include "fs_ocornut_imgui.bin.h"
 #include "fs_ocornut_imgui.bin.h"
+#include "vs_imgui_image.bin.h"
+#include "fs_imgui_image.bin.h"
 
 
 #include "roboto_regular.ttf.h"
 #include "roboto_regular.ttf.h"
 #include "robotomono_regular.ttf.h"
 #include "robotomono_regular.ttf.h"
@@ -42,6 +46,8 @@ static const bgfx::EmbeddedShader s_embeddedShaders[] =
 {
 {
 	BGFX_EMBEDDED_SHADER(vs_ocornut_imgui),
 	BGFX_EMBEDDED_SHADER(vs_ocornut_imgui),
 	BGFX_EMBEDDED_SHADER(fs_ocornut_imgui),
 	BGFX_EMBEDDED_SHADER(fs_ocornut_imgui),
+	BGFX_EMBEDDED_SHADER(vs_imgui_image),
+	BGFX_EMBEDDED_SHADER(fs_imgui_image),
 
 
 	BGFX_EMBEDDED_SHADER_END()
 	BGFX_EMBEDDED_SHADER_END()
 };
 };
@@ -131,8 +137,9 @@ struct OcornutImguiContext
 						th = texture.s.handle;
 						th = texture.s.handle;
 						if (0 != texture.s.mip)
 						if (0 != texture.s.mip)
 						{
 						{
-							extern bgfx::ProgramHandle imguiGetImageProgram(uint8_t _mip);
-							program = imguiGetImageProgram(texture.s.mip);
+							const float lodEnabled[4] = { float(texture.s.mip), 1.0f, 0.0f, 0.0f };
+							bgfx::setUniform(u_imageLodEnabled, lodEnabled);
+							program = m_imageProgram;
 						}
 						}
 					}
 					}
 					else
 					else
@@ -161,18 +168,22 @@ struct OcornutImguiContext
 
 
 	void create(float _fontSize, bx::AllocatorI* _allocator)
 	void create(float _fontSize, bx::AllocatorI* _allocator)
 	{
 	{
-		m_viewId = 255;
 		m_allocator = _allocator;
 		m_allocator = _allocator;
+
+		if (NULL == _allocator)
+		{
+			static bx::DefaultAllocator allocator;
+			m_allocator = &allocator;
+		}
+
+		m_viewId = 255;
 		m_lastScroll = 0;
 		m_lastScroll = 0;
 		m_last = bx::getHPCounter();
 		m_last = bx::getHPCounter();
 
 
 		ImGuiIO& io = ImGui::GetIO();
 		ImGuiIO& io = ImGui::GetIO();
 		io.RenderDrawListsFn = renderDrawLists;
 		io.RenderDrawListsFn = renderDrawLists;
-		if (NULL != m_allocator)
-		{
-			io.MemAllocFn = memAlloc;
-			io.MemFreeFn  = memFree;
-		}
+		io.MemAllocFn = memAlloc;
+		io.MemFreeFn  = memFree;
 
 
 		io.DisplaySize = ImVec2(1280.0f, 720.0f);
 		io.DisplaySize = ImVec2(1280.0f, 720.0f);
 		io.DeltaTime   = 1.0f / 60.0f;
 		io.DeltaTime   = 1.0f / 60.0f;
@@ -207,6 +218,13 @@ struct OcornutImguiContext
 			, true
 			, true
 			);
 			);
 
 
+		u_imageLodEnabled = bgfx::createUniform("u_imageLodEnabled", bgfx::UniformType::Vec4);
+		m_imageProgram = bgfx::createProgram(
+			  bgfx::createEmbeddedShader(s_embeddedShaders, type, "vs_imgui_image")
+			, bgfx::createEmbeddedShader(s_embeddedShaders, type, "fs_imgui_image")
+			, true
+			);
+
 		m_decl
 		m_decl
 			.begin()
 			.begin()
 			.add(bgfx::Attrib::Position,  2, bgfx::AttribType::Float)
 			.add(bgfx::Attrib::Position,  2, bgfx::AttribType::Float)
@@ -266,6 +284,9 @@ struct OcornutImguiContext
 
 
 		bgfx::destroyUniform(s_tex);
 		bgfx::destroyUniform(s_tex);
 		bgfx::destroyTexture(m_texture);
 		bgfx::destroyTexture(m_texture);
+
+		bgfx::destroyUniform(u_imageLodEnabled);
+		bgfx::destroyProgram(m_imageProgram);
 		bgfx::destroyProgram(m_program);
 		bgfx::destroyProgram(m_program);
 
 
 		m_allocator = NULL;
 		m_allocator = NULL;
@@ -393,8 +414,10 @@ struct OcornutImguiContext
 	bx::AllocatorI*     m_allocator;
 	bx::AllocatorI*     m_allocator;
 	bgfx::VertexDecl    m_decl;
 	bgfx::VertexDecl    m_decl;
 	bgfx::ProgramHandle m_program;
 	bgfx::ProgramHandle m_program;
+	bgfx::ProgramHandle m_imageProgram;
 	bgfx::TextureHandle m_texture;
 	bgfx::TextureHandle m_texture;
 	bgfx::UniformHandle s_tex;
 	bgfx::UniformHandle s_tex;
+	bgfx::UniformHandle u_imageLodEnabled;
 	ImFont* m_font[ImGui::Font::Count];
 	ImFont* m_font[ImGui::Font::Count];
 	int64_t m_last;
 	int64_t m_last;
 	int32_t m_lastScroll;
 	int32_t m_lastScroll;
@@ -418,12 +441,12 @@ void OcornutImguiContext::renderDrawLists(ImDrawData* _drawData)
 	s_ctx.render(_drawData);
 	s_ctx.render(_drawData);
 }
 }
 
 
-void IMGUI_create(float _fontSize, bx::AllocatorI* _allocator)
+void imguiCreate(float _fontSize, bx::AllocatorI* _allocator)
 {
 {
 	s_ctx.create(_fontSize, _allocator);
 	s_ctx.create(_fontSize, _allocator);
 }
 }
 
 
-void IMGUI_destroy()
+void imguiDestroy()
 {
 {
 	s_ctx.destroy();
 	s_ctx.destroy();
 }
 }
@@ -438,6 +461,16 @@ void IMGUI_endFrame()
 	s_ctx.endFrame();
 	s_ctx.endFrame();
 }
 }
 
 
+void* imguiMalloc(size_t _size, void*)
+{
+	return BX_ALLOC(s_ctx.m_allocator, _size);
+}
+
+void imguiFree(void* _ptr, void*)
+{
+	BX_FREE(s_ctx.m_allocator, _ptr);
+}
+
 namespace ImGui
 namespace ImGui
 {
 {
 	void PushFont(Font::Enum _font)
 	void PushFont(Font::Enum _font)