[API] Add imgui-app and example modules
This commit is contained in:
1 parent
0ed291cb0f
commit
46f74381aa
8 files changed
+408
No files matched your search
@@ -0,0 +1,186 @@
|
||||
package imgui.app;
|
||||
|
||||
import imgui.ImGui;
|
||||
import imgui.flag.ImGuiConfigFlags;
|
||||
import imgui.gl3.ImGuiImplGl3;
|
||||
import imgui.glfw.ImGuiImplGlfw;
|
||||
import org.lwjgl.glfw.Callbacks;
|
||||
import org.lwjgl.glfw.GLFW;
|
||||
import org.lwjgl.glfw.GLFWErrorCallback;
|
||||
import org.lwjgl.glfw.GLFWVidMode;
|
||||
import org.lwjgl.opengl.GL;
|
||||
import org.lwjgl.opengl.GL32;
|
||||
import org.lwjgl.system.MemoryStack;
|
||||
import org.lwjgl.system.MemoryUtil;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.nio.IntBuffer;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Low-level abstraction, which creates application window and starts the main loop.
|
||||
* It's recommended to use {@link Application}, but this class could be extended directly as well.
|
||||
* Take a note, that in this case you need to call all application loop methods ({@link #init(Configuration)}, {@link #run()}, {@link #dispose()}) manually.
|
||||
*/
|
||||
public abstract class Window {
|
||||
private final ImGuiImplGlfw imGuiGlfw = new ImGuiImplGlfw();
|
||||
private final ImGuiImplGl3 imGuiGl3 = new ImGuiImplGl3();
|
||||
|
||||
private String glslVersion = null;
|
||||
|
||||
/**
|
||||
* Pointer to native GLFW window.
|
||||
*/
|
||||
protected long handle;
|
||||
/**
|
||||
* Background color of the window.
|
||||
*/
|
||||
protected Color colorBg = Color.GRAY;
|
||||
|
||||
/**
|
||||
* Method to initialize application.
|
||||
*
|
||||
* @param config configuration object with basic window information
|
||||
*/
|
||||
protected final void init(final Configuration config) {
|
||||
initWindow(config);
|
||||
initImGui(config);
|
||||
imGuiGlfw.init(handle, true);
|
||||
imGuiGl3.init(glslVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to dispose all used application resources and destroy its window.
|
||||
*/
|
||||
protected final void dispose() {
|
||||
imGuiGl3.dispose();
|
||||
imGuiGlfw.dispose();
|
||||
disposeImGui();
|
||||
disposeWindow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to create and initialize GLFW window.
|
||||
*
|
||||
* @param config configuration object with basic window information
|
||||
*/
|
||||
protected void initWindow(final Configuration config) {
|
||||
GLFWErrorCallback.createPrint(System.err).set();
|
||||
|
||||
if (!GLFW.glfwInit()) {
|
||||
throw new IllegalStateException("Unable to initialize GLFW");
|
||||
}
|
||||
|
||||
decideGlGlslVersions();
|
||||
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_VISIBLE, GLFW.GLFW_FALSE);
|
||||
handle = GLFW.glfwCreateWindow(config.getWidth(), config.getHeight(), config.getTitle(), MemoryUtil.NULL, MemoryUtil.NULL);
|
||||
|
||||
if (handle == MemoryUtil.NULL) {
|
||||
throw new RuntimeException("Failed to create the GLFW window");
|
||||
}
|
||||
|
||||
try (MemoryStack stack = MemoryStack.stackPush()) {
|
||||
final IntBuffer pWidth = stack.mallocInt(1); // int*
|
||||
final IntBuffer pHeight = stack.mallocInt(1); // int*
|
||||
|
||||
GLFW.glfwGetWindowSize(handle, pWidth, pHeight);
|
||||
|
||||
final GLFWVidMode vidmode = Objects.requireNonNull(GLFW.glfwGetVideoMode(GLFW.glfwGetPrimaryMonitor()));
|
||||
|
||||
GLFW.glfwSetWindowPos(handle, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight.get(0)) / 2);
|
||||
}
|
||||
|
||||
GLFW.glfwMakeContextCurrent(handle);
|
||||
GLFW.glfwSwapInterval(GLFW.GLFW_TRUE);
|
||||
GLFW.glfwShowWindow(handle);
|
||||
|
||||
if (config.isFullScreen()) {
|
||||
GLFW.glfwMaximizeWindow(handle);
|
||||
}
|
||||
|
||||
GL.createCapabilities();
|
||||
}
|
||||
|
||||
private void decideGlGlslVersions() {
|
||||
final boolean isMac = System.getProperty("os.name").toLowerCase().contains("mac");
|
||||
if (isMac) {
|
||||
glslVersion = "#version 150";
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MINOR, 2);
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_OPENGL_PROFILE, GLFW.GLFW_OPENGL_CORE_PROFILE); // 3.2+ only
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_OPENGL_FORWARD_COMPAT, GLFW.GLFW_TRUE); // Required on Mac
|
||||
} else {
|
||||
glslVersion = "#version 130";
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
GLFW.glfwWindowHint(GLFW.GLFW_CONTEXT_VERSION_MINOR, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to initialize Dear ImGui context. Could be overridden to do custom Dear ImGui setup before application start.
|
||||
*
|
||||
* @param config configuration object with basic window information
|
||||
*/
|
||||
protected void initImGui(final Configuration config) {
|
||||
ImGui.createContext();
|
||||
}
|
||||
|
||||
/**
|
||||
* Main application loop.
|
||||
*/
|
||||
protected final void run() {
|
||||
while (!GLFW.glfwWindowShouldClose(handle)) {
|
||||
startFrame();
|
||||
process();
|
||||
endFrame();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to be overridden by user to provide main application logic.
|
||||
*/
|
||||
public abstract void process();
|
||||
|
||||
private void startFrame() {
|
||||
if (colorBg != null) {
|
||||
GL32.glClearColor(colorBg.getRed() / 255f, colorBg.getGreen() / 255f, colorBg.getBlue() / 255f, colorBg.getAlpha() / 255f);
|
||||
}
|
||||
|
||||
GL32.glClear(GL32.GL_COLOR_BUFFER_BIT | GL32.GL_DEPTH_BUFFER_BIT);
|
||||
imGuiGlfw.newFrame();
|
||||
ImGui.newFrame();
|
||||
}
|
||||
|
||||
private void endFrame() {
|
||||
ImGui.render();
|
||||
imGuiGl3.renderDrawData(ImGui.getDrawData());
|
||||
|
||||
if (ImGui.getIO().hasConfigFlags(ImGuiConfigFlags.ViewportsEnable)) {
|
||||
final long backupWindowPtr = GLFW.glfwGetCurrentContext();
|
||||
ImGui.updatePlatformWindows();
|
||||
ImGui.renderPlatformWindowsDefault();
|
||||
GLFW.glfwMakeContextCurrent(backupWindowPtr);
|
||||
}
|
||||
|
||||
GLFW.glfwSwapBuffers(handle);
|
||||
GLFW.glfwPollEvents();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to destroy Dear ImGui context.
|
||||
*/
|
||||
protected void disposeImGui() {
|
||||
ImGui.destroyContext();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to destroy GLFW window.
|
||||
*/
|
||||
protected void disposeWindow() {
|
||||
Callbacks.glfwFreeCallbacks(handle);
|
||||
GLFW.glfwDestroyWindow(handle);
|
||||
GLFW.glfwTerminate();
|
||||
Objects.requireNonNull(GLFW.glfwSetErrorCallback(null)).free();
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user