Example tweaks

This commit is contained in:
SpaiR committed 2019-12-29 23:59:36 +03:00
1 parent 51fcd63b57
commit f6e9712b38
5 files changed
+76 -22

No files matched your search

@@ -1568,6 +1568,14 @@ public class ImGui {
return Native.IsMouseHoveringRect(minX, minY, maxX, maxY, clip);
}
public static ImGuiMouseCursor GetMouseCursor() {
return ImGuiMouseCursor.valueOf(Native.GetMouseCursor());
}
public static void SetMouseCursor(ImGuiMouseCursor type) {
Native.SetMouseCursor(type.getValue());
}
// Internal methods
public static void PushMultiItemsWidths(int components, float w_full) {
@@ -1,5 +1,7 @@
package imgui;
import imgui.enums.ImGuiMouseCursor;
import java.nio.Buffer;
/**
@@ -2148,5 +2150,13 @@ class Native {
return ImGui::IsMouseHoveringRect(ImVec2(minX, minY), ImVec2(maxX, maxY), clip);
*/
static native int GetMouseCursor(); /*
return (int)ImGui::GetMouseCursor();
*/
static native void SetMouseCursor(int type); /*
ImGui::SetMouseCursor(type);
*/
// @formatter:on
}
@@ -25,4 +25,13 @@ public enum ImGuiMouseCursor {
public int getValue() {
return value;
}
public static ImGuiMouseCursor valueOf(int value) {
for (ImGuiMouseCursor cursor : values()) {
if (cursor.value == value) {
return cursor;
}
}
throw new IllegalArgumentException("Invalid cursor value: " + value);
}
}
@@ -20,8 +20,7 @@ import static org.lwjgl.opengl.GL30.*;
* It do support a backup of the current GL state before rendering and restoring of its initial state after.
* But some specific state variables may be missed (all which are hidden under '#ifdef' macros in the original 'imgui_impl_opengl3.cpp' file).
* <p>
* By default this implementation uses shaders with 130 version of GLSL (OpenGL 3.0).
* You can provide your own shaders into the {@link ImGuiImplGl3#init(CharSequence, CharSequence)} method.
* This implementation uses shaders with 130 version of GLSL (OpenGL 3.0).
*/
@SuppressWarnings("MagicNumber")
public final class ImGuiImplGl3 {
@@ -61,23 +60,9 @@ public final class ImGuiImplGl3 {
/**
* This method SHOULD be called before calling of {@link ImGuiImplGl3#render(DrawData)} method.
* By using this method shaders with 130 version of GLSL (OpenGL 3.0) will be used for render.
*/
public void init() {
final CharSequence fragShaderSource = readFromResources("default.frag");
final CharSequence vertShaderSource = readFromResources("default.vert");
prepareShader(fragShaderSource, vertShaderSource);
prepareFont();
}
/**
* This method SHOULD be called before calling of {@link ImGuiImplGl3#render(DrawData)} method.
*
* @param fragShaderSource fragment shader to use for render
* @param vertShaderSource vertex shader to use for render
*/
public void init(final CharSequence fragShaderSource, final CharSequence vertShaderSource) {
prepareShader(fragShaderSource, vertShaderSource);
prepareShader();
prepareFont();
}
@@ -187,7 +172,10 @@ public final class ImGuiImplGl3 {
glDeleteProgram(programId);
}
private void prepareShader(final CharSequence fragShaderSource, final CharSequence vertShaderSource) {
private void prepareShader() {
final CharSequence fragShaderSource = readFromResources("default.frag");
final CharSequence vertShaderSource = readFromResources("default.vert");
fragmentShaderId = loadAndCompileShader(GL_FRAGMENT_SHADER, fragShaderSource);
vertexShaderId = loadAndCompileShader(GL_VERTEX_SHADER, vertShaderSource);
@@ -3,6 +3,7 @@ import imgui.ImGuiString;
import imgui.enums.ImGuiCond;
import imgui.enums.ImGuiInputTextFlags;
import imgui.enums.ImGuiKey;
import imgui.enums.ImGuiMouseCursor;
import imgui.enums.ImGuiTreeNodeFlags;
import imgui.gl3.ImGuiImplGl3;
import org.lwjgl.glfw.GLFWErrorCallback;
@@ -24,8 +25,6 @@ public final class ImGuiGlfwExample {
private static final int DEFAULT_WIDTH = 1024;
private static final int DEFAULT_HEIGHT = 768;
private static final ImGuiString IMGUI_DEMO_LINK = new ImGuiString("https://raw.githubusercontent.com/ocornut/imgui/v1.74/imgui_demo.cpp");
private long window; // current GLFW window ID
// Those are used to track window size properties
@@ -44,8 +43,14 @@ public final class ImGuiGlfwExample {
private boolean altKeyDown;
private boolean superKeyDown;
private final long[] mouseCursors = new long[ImGuiMouseCursor.COUNT.getValue()];
private final ImGuiImplGl3 imGuiGl3 = new ImGuiImplGl3();
// Local app variables go here
private final ImGuiString imguiDemoLink = new ImGuiString("https://raw.githubusercontent.com/ocornut/imgui/v1.74/imgui_demo.cpp");
private int clickCount = 0;
public void run() {
initGlfw();
initImGui();
@@ -70,6 +75,7 @@ public final class ImGuiGlfwExample {
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable
glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE); // the window will be maximized
glfwWindowHint(GLFW_DECORATED, GLFW_TRUE); // the window will be decorated
// Create the window
window = glfwCreateWindow(DEFAULT_WIDTH, DEFAULT_HEIGHT, "ImGui+GLFW+LWJGL Example", NULL, NULL);
@@ -97,6 +103,7 @@ public final class ImGuiGlfwExample {
glfwSwapInterval(GLFW_TRUE); // Enable v-sync
glfwShowWindow(window); // Make the window visible
// IMPORTANT!!
// This line is critical for LWJGL's interoperation with GLFW's
// OpenGL context, or any context that is managed externally.
// LWJGL detects the context that is current in the current thread,
@@ -107,6 +114,7 @@ public final class ImGuiGlfwExample {
// Here we will initialize ImGui stuff.
private void initImGui() {
// IMPORTANT!!
// This line is critical for ImGui to work.
// It loads native library, creates ImGui context and does other necessary stuff.
ImGui.init();
@@ -142,6 +150,16 @@ public final class ImGuiGlfwExample {
keys[ImGuiKey.Z.code] = GLFW_KEY_Z;
ImGui.initKeyMap(keys);
// Mouse cursors mapping
mouseCursors[ImGuiMouseCursor.Arrow.getValue()] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
mouseCursors[ImGuiMouseCursor.TextInput.getValue()] = glfwCreateStandardCursor(GLFW_IBEAM_CURSOR);
mouseCursors[ImGuiMouseCursor.ResizeAll.getValue()] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
mouseCursors[ImGuiMouseCursor.ResizeNS.getValue()] = glfwCreateStandardCursor(GLFW_VRESIZE_CURSOR);
mouseCursors[ImGuiMouseCursor.ResizeEW.getValue()] = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR);
mouseCursors[ImGuiMouseCursor.ResizeNESW.getValue()] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
mouseCursors[ImGuiMouseCursor.ResizeNWSE.getValue()] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR);
mouseCursors[ImGuiMouseCursor.Hand.getValue()] = glfwCreateStandardCursor(GLFW_HAND_CURSOR);
// Here goes GLFW callbacks to update user input stuff in ImGui
glfwSetKeyCallback(window, (w, key, scancode, action, mods) -> {
final boolean isKeyDown = action == GLFW_PRESS;
@@ -210,9 +228,15 @@ public final class ImGuiGlfwExample {
ImGui.UpdateMousePos((float) mousePosX[0], (float) mousePosY[0]);
ImGui.UpdateDeltaTime((float) deltaTime);
// Update mouse cursor
final ImGuiMouseCursor imguiCursor = ImGui.GetMouseCursor();
glfwSetCursor(window, mouseCursors[imguiCursor.getValue()]);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
// Render itself starts here
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
// IMPORTANT!!
// Any ImGui code SHOULD go between NewFrame()/Render() methods
ImGui.NewFrame();
@@ -221,6 +245,14 @@ public final class ImGuiGlfwExample {
ImGui.Begin("Custom window");
ImGui.Text("Hello from Java!");
if (ImGui.Button("Click")) {
clickCount++;
}
if (ImGui.IsItemHovered()) {
ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
}
ImGui.SameLine();
ImGui.Text("Count: " + clickCount);
ImGui.Separator();
ImGui.BeginChild("##custom_window_child", 200, 50);
@@ -233,11 +265,14 @@ public final class ImGuiGlfwExample {
ImGui.Separator();
ImGui.Text("Consider to look the original ImGui demo: ");
ImGui.SetNextItemWidth(500);
ImGui.InputText("##input_to_copy_link", IMGUI_DEMO_LINK, ImGuiInputTextFlags.ReadOnly);
ImGui.InputText("##input_to_copy_link", imguiDemoLink, ImGuiInputTextFlags.ReadOnly);
if (ImGui.IsItemHovered()) {
ImGui.SetMouseCursor(ImGuiMouseCursor.TextInput);
}
ImGui.SameLine();
ImGui.Text("(?)");
if (ImGui.IsItemHovered()) {
ImGui.SetTooltip("You can copy and paste this link");
ImGui.SetTooltip("You can copy and paste this link to browser");
}
ImGui.End();
@@ -260,6 +295,10 @@ public final class ImGuiGlfwExample {
}
private void destroyGlfw() {
for (long mouseCursor : mouseCursors) {
glfwDestroyCursor(mouseCursor);
}
glfwFreeCallbacks(window);
glfwDestroyWindow(window);
glfwTerminate();