diff --git a/examples/directx9_example/main.cpp b/examples/directx9_example/main.cpp index 017a3a91..36be8a62 100644 --- a/examples/directx9_example/main.cpp +++ b/examples/directx9_example/main.cpp @@ -203,17 +203,6 @@ HRESULT InitD3D(HWND hWnd) if (g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice) < 0) return E_FAIL; - // Create the vertex buffer. - if (g_pd3dDevice->CreateVertexBuffer(10000 * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) < 0) - return E_FAIL; - - // Load font texture - const void* png_data; - unsigned int png_size; - ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); - if (D3DXCreateTextureFromFileInMemory(g_pd3dDevice, png_data, png_size, &g_pTexture) < 0) - return E_FAIL; - return S_OK; } @@ -247,9 +236,11 @@ LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) io.MouseDown[1] = false; return true; case WM_MOUSEWHEEL: + // Mouse wheel: -1,0,+1 io.MouseWheel = GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? +1 : -1; return true; case WM_MOUSEMOVE: + // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) io.MousePos.x = (signed short)(lParam); io.MousePos.y = (signed short)(lParam >> 16); return true; @@ -274,9 +265,10 @@ void InitImGui() GetClientRect(hWnd, &rect); ImGuiIO& io = ImGui::GetIO(); - io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top)); - io.DeltaTime = 1.0f/60.0f; - io.KeyMap[ImGuiKey_Tab] = VK_TAB; + io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top)); // Display size, in pixels. For clamping windows positions. + io.DeltaTime = 1.0f/60.0f; // Time elapsed since last frame, in seconds (in this sample app we'll override this every frame because our timestep is variable) + io.PixelCenterOffset = 0.0f; // Align Direct3D Texels + io.KeyMap[ImGuiKey_Tab] = VK_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime. io.KeyMap[ImGuiKey_LeftArrow] = VK_LEFT; io.KeyMap[ImGuiKey_RightArrow] = VK_RIGHT; io.KeyMap[ImGuiKey_UpArrow] = VK_UP; @@ -293,11 +285,28 @@ void InitImGui() io.KeyMap[ImGuiKey_X] = 'X'; io.KeyMap[ImGuiKey_Y] = 'Y'; io.KeyMap[ImGuiKey_Z] = 'Z'; - io.PixelCenterOffset = 0.0f; io.RenderDrawListsFn = ImImpl_RenderDrawLists; io.SetClipboardTextFn = ImImpl_SetClipboardTextFn; io.GetClipboardTextFn = ImImpl_GetClipboardTextFn; + + + // Create the vertex buffer + if (g_pd3dDevice->CreateVertexBuffer(10000 * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL) < 0) + { + IM_ASSERT(0); + return; + } + + // Load font texture + const void* png_data; + unsigned int png_size; + ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); + if (D3DXCreateTextureFromFileInMemory(g_pd3dDevice, png_data, png_size, &g_pTexture) < 0) + { + IM_ASSERT(0); + return; + } } int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, int) diff --git a/examples/opengl_example/main.cpp b/examples/opengl_example/main.cpp index 2d23a746..f6a026de 100644 --- a/examples/opengl_example/main.cpp +++ b/examples/opengl_example/main.cpp @@ -217,58 +217,6 @@ void InitGL() glewInit(); GLenum err = GL_NO_ERROR; - GLint status = GL_TRUE; - err = glGetError(); IM_ASSERT(err == GL_NO_ERROR); - - // Create and compile the vertex shader - vertexShader = glCreateShader(GL_VERTEX_SHADER); - glShaderSource(vertexShader, 1, &vertexSource, NULL); - glCompileShader(vertexShader); - glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); - if (status != GL_TRUE) - { - char buffer[512]; - glGetShaderInfoLog(vertexShader, 1024, NULL, buffer); - printf("%s", buffer); - IM_ASSERT(status == GL_TRUE); - } - - // Create and compile the fragment shader - fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(fragmentShader, 1, &fragmentSource, NULL); - glCompileShader(fragmentShader); - glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); - IM_ASSERT(status == GL_TRUE); - - // Link the vertex and fragment shader into a shader program - shaderProgram = glCreateProgram(); - glAttachShader(shaderProgram, vertexShader); - glAttachShader(shaderProgram, fragmentShader); - glBindFragDataLocation(shaderProgram, 0, "o_col"); - glLinkProgram(shaderProgram); - glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status); - IM_ASSERT(status == GL_TRUE); - - uniMVP = glGetUniformLocation(shaderProgram, "MVP"); - uniClipRect = glGetUniformLocation(shaderProgram, "ClipRect"); - - // Create Vertex Buffer Objects & Vertex Array Objects - glGenBuffers(1, &vbo); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - - GLint posAttrib = glGetAttribLocation(shaderProgram, "i_pos"); - glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), 0); - glEnableVertexAttribArray(posAttrib); - - GLint uvAttrib = glGetAttribLocation(shaderProgram, "i_uv"); - glEnableVertexAttribArray(uvAttrib); - glVertexAttribPointer(uvAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (void*)(2*sizeof(float))); - - GLint colAttrib = glGetAttribLocation(shaderProgram, "i_col"); - glVertexAttribPointer(colAttrib, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (void*)(4*sizeof(float))); - glEnableVertexAttribArray(colAttrib); err = glGetError(); IM_ASSERT(err == GL_NO_ERROR); } @@ -278,9 +226,10 @@ void InitImGui() glfwGetWindowSize(window, &w, &h); ImGuiIO& io = ImGui::GetIO(); - io.DisplaySize = ImVec2((float)w, (float)h); - io.DeltaTime = 1.0f/60.0f; - io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB; + io.DisplaySize = ImVec2((float)w, (float)h); // Display size, in pixels. For clamping windows positions. + io.DeltaTime = 1.0f/60.0f; // Time elapsed since last frame, in seconds (in this sample app we'll override this every frame because our timestep is variable) + io.PixelCenterOffset = 0.5f; // Align OpenGL texels + io.KeyMap[ImGuiKey_Tab] = GLFW_KEY_TAB; // Keyboard mapping. ImGui will use those indices to peek into the io.KeyDown[] array that we will update during the application lifetime. io.KeyMap[ImGuiKey_LeftArrow] = GLFW_KEY_LEFT; io.KeyMap[ImGuiKey_RightArrow] = GLFW_KEY_RIGHT; io.KeyMap[ImGuiKey_UpArrow] = GLFW_KEY_UP; @@ -297,12 +246,68 @@ void InitImGui() io.KeyMap[ImGuiKey_X] = GLFW_KEY_X; io.KeyMap[ImGuiKey_Y] = GLFW_KEY_Y; io.KeyMap[ImGuiKey_Z] = GLFW_KEY_Z; - io.PixelCenterOffset = 0.5f; io.RenderDrawListsFn = ImImpl_RenderDrawLists; io.SetClipboardTextFn = ImImpl_SetClipboardTextFn; io.GetClipboardTextFn = ImImpl_GetClipboardTextFn; + + // Setup graphics backend + GLint status = GL_TRUE; + GLenum err = GL_NO_ERROR; + err = glGetError(); IM_ASSERT(err == GL_NO_ERROR); + + // Create and compile the vertex shader + vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexSource, NULL); + glCompileShader(vertexShader); + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); + if (status != GL_TRUE) + { + char buffer[512]; + glGetShaderInfoLog(vertexShader, 1024, NULL, buffer); + printf("%s", buffer); + IM_ASSERT(status == GL_TRUE); + } + + // Create and compile the fragment shader + fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentSource, NULL); + glCompileShader(fragmentShader); + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &status); + IM_ASSERT(status == GL_TRUE); + + // Link the vertex and fragment shader into a shader program + shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glBindFragDataLocation(shaderProgram, 0, "o_col"); + glLinkProgram(shaderProgram); + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status); + IM_ASSERT(status == GL_TRUE); + + uniMVP = glGetUniformLocation(shaderProgram, "MVP"); + uniClipRect = glGetUniformLocation(shaderProgram, "ClipRect"); + + // Create Vertex Buffer Objects & Vertex Array Objects + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + + GLint posAttrib = glGetAttribLocation(shaderProgram, "i_pos"); + glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), 0); + glEnableVertexAttribArray(posAttrib); + + GLint uvAttrib = glGetAttribLocation(shaderProgram, "i_uv"); + glEnableVertexAttribArray(uvAttrib); + glVertexAttribPointer(uvAttrib, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (void*)(2*sizeof(float))); + + GLint colAttrib = glGetAttribLocation(shaderProgram, "i_col"); + glVertexAttribPointer(colAttrib, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (void*)(4*sizeof(float))); + glEnableVertexAttribArray(colAttrib); + err = glGetError(); IM_ASSERT(err == GL_NO_ERROR); + // Load font texture glGenTextures(1, &fontTex); glBindTexture(GL_TEXTURE_2D, fontTex); @@ -348,10 +353,10 @@ int main(int argc, char** argv) time = current_time; double mouse_x, mouse_y; glfwGetCursorPos(window, &mouse_x, &mouse_y); - io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); + io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) io.MouseDown[0] = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) != 0; io.MouseDown[1] = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) != 0; - io.MouseWheel = (mouse_wheel != 0) ? mouse_wheel > 0.0f ? 1 : - 1 : 0; + io.MouseWheel = (mouse_wheel != 0) ? mouse_wheel > 0.0f ? 1 : - 1 : 0; // Mouse wheel: -1,0,+1 mouse_wheel = 0.0f; ImGui::NewFrame(); diff --git a/imgui.h b/imgui.h index d2e90417..8f7bf80c 100644 --- a/imgui.h +++ b/imgui.h @@ -381,7 +381,7 @@ struct ImGuiIO void (*SetClipboardTextFn)(const char* text, const char* text_end); // Required for clipboard support (nb- the string is *NOT* zero-terminated at 'text_end') // Input - Fill before calling NewFrame() - ImVec2 MousePos; // Mouse position (set to -1,-1 if no mouse / on another screen, etc.) + ImVec2 MousePos; // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.) bool MouseDown[2]; // Mouse buttons int MouseWheel; // Mouse wheel: -1,0,+1 bool KeyCtrl; // Keyboard modifier pressed: Control