package love.distributedrebirth.gdxapp; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.OrthographicCamera; import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.utils.ScreenUtils; import imgui.ImGui; import imgui.flag.ImGuiCond; import imgui.flag.ImGuiWindowFlags; import imgui.type.ImBoolean; import love.distributedrebirth.bassboonyd.BãßBȍőnAuthorInfoʸᴰ; import love.distributedrebirth.bassboonyd.BãßBȍőnCoffinOpenʸᴰ; import love.distributedrebirth.bassboonyd.jmx.DefaultEnumBaseᴶᴹˣ; import love.distributedrebirth.gdxapp.desktop.DeskApp; import love.distributedrebirth.gdxapp.desktop.DeskAppContourSection; import love.distributedrebirth.gdxapp.desktop.DeskAppRenderer; import love.distributedrebirth.gdxapp.desktop.apps.BasicConsoleApp; import love.distributedrebirth.gdxapp.desktop.apps.HebrewWalletApp; import love.distributedrebirth.gdxapp.desktop.apps.MusicPlayerApp; import love.distributedrebirth.gdxapp.desktop.apps.SystemBaseGlyphApp; import love.distributedrebirth.gdxapp.desktop.apps.SystemBasePartApp; import love.distributedrebirth.gdxapp.music.MusicManager; import love.distributedrebirth.gdxapp.music.MusicSongType; import love.distributedrebirth.gdxapp.screen.ScreenCredits; import love.distributedrebirth.gdxapp.screen.ScreenDesktop0; import love.distributedrebirth.gdxapp.screen.ScreenDesktop1; import love.distributedrebirth.gdxapp.screen.ScreenDesktop2; import love.distributedrebirth.gdxapp.screen.ScreenDesktop3; import love.distributedrebirth.gdxapp.screen.ScreenHelp; import love.distributedrebirth.gdxapp.screen.ScreenIntro; import love.distributedrebirth.gdxapp.screen.ScreenIntroMission; import love.distributedrebirth.gdxapp.screen.ScreenLoading; import love.distributedrebirth.numberxd.base2t.Base2PartsFactory; import love.distributedrebirth.numberxd.base2t.Base2Terminator; import love.distributedrebirth.numberxd.base2t.part.warp.TOSWarpCore; import love.distributedrebirth.numberxd.base2t.part.warp.TOSWarpCoreDriver; import love.distributedrebirth.numberxd.base2t.part.warp.WaterBucket; import love.distributedrebirth.numberxd.glyph.BaseGlyphSet; import net.spookygames.gdx.nativefilechooser.NativeFileChooser; /** * Main loop render dispatcher and event handling. */ @BãßBȍőnAuthorInfoʸᴰ(name = "willemtsade", copyright = "©Δ∞ 仙上主天") public class GDXAppMain extends Game { private int lazyIntCnt = 33; private List args; public NativeFileChooser fileChooser; public SpriteBatch batch; public BitmapFont font; public OrthographicCamera camera; public final int viewWidth; public final int viewHeight; public MusicManager music; private Map,Screen> screens; private List apps; private ImBoolean openWindowFlag = new ImBoolean(true); private ImBoolean showImGuiDemo = new ImBoolean(false); public GDXAppMain(List args, int viewWidth, int viewHeight, NativeFileChooser fileChooser) { this.args = args; this.viewWidth = viewWidth; this.viewHeight = viewHeight; this.fileChooser = fileChooser; } //TODO: add layer or ?? private ,DefaultAuthorInfoʸᴰ> T[] storeInstances() { @SuppressWarnings("unchecked") private > T[] coffinInstances() { return (T[]) new DefaultEnumBaseᴶᴹˣ[] { BaseGlyphSet.values()[0], Base2Terminator.INSTANCE, Base2PartsFactory.INSTANCE, TOSWarpCore.INSTANCE }; } private void lazyInit() { if (lazyIntCnt > 0) { lazyIntCnt--; return; } ImGuiSetup.init(); // ref to init System.out.println("BãßBȍőnCoffinʸᴰ init......"); for (DefaultEnumBaseᴶᴹˣ coffin:coffinInstances()) { BãßBȍőnCoffinOpenʸᴰ.lockCoffin(coffin); } System.out.println("BãßBȍőnCoffinʸᴰ init done."); try { if (args.contains("warpcore-load")) { System.out.println("warpcore-load: requested"); WaterBucket bucket = TOSWarpCoreDriver.newInstance().createReader().readFile("./warpcore.xml"); TOSWarpCore.INSTANCE.BãßArmWarpCore(bucket); } if (args.contains("warpcore-save")) { System.out.println("warpcore-save: requested"); WaterBucket bucket = TOSWarpCore.INSTANCE.BãßCurrentWarpCore(); TOSWarpCoreDriver.newInstance().createWriter().writeFile(bucket, "./warpcore.xml"); } } catch (Exception e) { throw new RuntimeException(e); } if (!args.contains("warpcore-nolock")) { System.out.println("warpcore-lock: BãßLockWarpCipher"); TOSWarpCore.INSTANCE.BãßLockWarpCipher(); } else { System.out.println("warpcore-nolock: requested"); } if (args.contains("full-screen")) { System.out.println("full-screen: requested"); Gdx.graphics.setFullscreenMode(Gdx.graphics.getDisplayMode()); } if (args.contains("intro-skip")) { System.out.println("intro-skip: requested"); selectScreen(ScreenDesktop0.class); music.play(MusicSongType.BACKGROUND); } else { selectScreen(ScreenIntro.class); } } public void create() { batch = new SpriteBatch(); font = new BitmapFont(); camera = new OrthographicCamera(); camera.setToOrtho(false, viewWidth, viewHeight); camera.update(); batch.setProjectionMatrix(camera.combined); boolean musicStop = args.contains("music-stop"); if (musicStop) { System.out.println("music-stop: requested"); } music = new MusicManager(); music.init(musicStop); screens = new HashMap<>(); apps = new ArrayList<>(); apps.add(new GDXAppLauncher("Basic Console", () -> new BasicConsoleApp())); apps.add(new GDXAppLauncher("Base Glyphs", () -> new SystemBaseGlyphApp())); apps.add(new GDXAppLauncher("Base Parts", () -> new SystemBasePartApp())); apps.add(new GDXAppLauncher("Hebrew Wallet", () -> new HebrewWalletApp())); apps.add(new GDXAppLauncher("Music Player", () -> new MusicPlayerApp(this))); putScreen(new ScreenLoading(this)); putScreen(new ScreenIntro(this)); putScreen(new ScreenIntroMission(this)); putScreen(new ScreenDesktop0(this)); putScreen(new ScreenDesktop1(this)); putScreen(new ScreenDesktop2()); putScreen(new ScreenDesktop3()); putScreen(new ScreenCredits(this)); putScreen(new ScreenHelp(this)); selectScreen(ScreenLoading.class); } @Override public void dispose() { ImGuiSetup.dispose(); for (Screen screen:screens.values()) { screen.dispose(); } music.dispose(); batch.dispose(); font.dispose(); } private void putScreen(Screen screen) { screens.put(screen.getClass(), screen); } public void selectScreen(Class screenClass) { Screen screen = screens.get(screenClass); if (screen == null) { throw new NullPointerException("Unknow screen: "+screenClass); } setScreen(screen); } @Override public void render() { ScreenUtils.clear(0f, 0f, 0f, 1f, true); if (screen == null) { return; } if (screen instanceof ScreenLoading) { screen.render(Gdx.graphics.getDeltaTime()); lazyInit(); return; } ImGuiSetup.imGuiImp.newFrame(); ImGui.newFrame(); GDXAppScreen appScreen = null; if (screen instanceof GDXAppScreen) { appScreen = GDXAppScreen.class.cast(screen); renderMenu(appScreen); } if (showImGuiDemo.get()) { ImGui.showDemoWindow(showImGuiDemo); } if (appScreen != null && appScreen.getDeskAppScreen().getCurrentDeskApp() != null) { int sizeFlags = ImGuiCond.Always; ImGui.setNextWindowPos(5, 30, sizeFlags); ImGui.setNextWindowSize(Gdx.graphics.getWidth() - 10, Gdx.graphics.getHeight() - 35, sizeFlags); int windowFlags = ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoResize; if (ImGui.begin(appScreen.getDeskAppScreen().getCurrentDeskApp().getName(), openWindowFlag, windowFlags)) { DeskAppRenderer renderer = appScreen.getDeskAppScreen().getCurrentDeskApp().getContours().getContour(DeskAppContourSection.MAIN); if (renderer != null) { renderer.render(); } } if (openWindowFlag.get() == false) { appScreen.getDeskAppScreen().setCurrentDeskApp(null); openWindowFlag.set(true); } ImGui.end(); } if (screen != null) { screen.render(Gdx.graphics.getDeltaTime()); } ImGui.render(); ImGuiSetup.imGuiGlImp.renderDrawData(ImGui.getDrawData()); } private void renderMenu(GDXAppScreen appScreen) { DeskApp deskApp = appScreen.getDeskAppScreen().getCurrentDeskApp(); ImGui.beginMainMenuBar(); if (ImGui.beginMenu("Demo")) { if (Gdx.graphics.isFullscreen()) { if (ImGui.menuItem("Window Mode")) { Gdx.graphics.setWindowedMode(viewWidth, viewHeight); } } else { if (ImGui.menuItem("Full Screen")) { Gdx.graphics.setFullscreenMode(Gdx.graphics.getDisplayMode()); } } if (ImGui.menuItem("Close")) { if (deskApp != null) { appScreen.getDeskAppScreen().removeDeskApp(deskApp); appScreen.getDeskAppScreen().setCurrentDeskApp(null); } } ImGui.separator(); if (ImGui.menuItem("Exit")) { dispose(); System.exit(0); } ImGui.endMenu(); } if (deskApp != null) { renderEditMenu(deskApp); } if (ImGui.beginMenu("Desktop")) { if (ImGui.beginMenu("Start")) { for (GDXAppLauncher launcher: apps) { if (ImGui.menuItem(launcher.getName())) { appScreen.getDeskAppScreen().addDeskApp(launcher.getLauncher().get()); } } ImGui.endMenu(); } ImGui.separator(); for (DeskApp app: appScreen.getDeskAppScreen().getDeskApps()) { if (ImGui.menuItem(app.getName())) { appScreen.getDeskAppScreen().setCurrentDeskApp(app); } } ImGui.endMenu(); } if (ImGui.beginMenu("System")) { if (ImGui.menuItem("Desktop0")) { selectScreen(ScreenDesktop0.class); } if (ImGui.menuItem("Desktop1")) { selectScreen(ScreenDesktop1.class); } if (ImGui.menuItem("Desktop2")) { selectScreen(ScreenDesktop2.class); } if (ImGui.menuItem("Desktop3")) { selectScreen(ScreenDesktop3.class); } ImGui.separator(); if (ImGui.menuItem("Credits")) { selectScreen(ScreenCredits.class); } if (ImGui.menuItem("Help")) { selectScreen(ScreenHelp.class); } ImGui.separator(); if (ImGui.menuItem("ImGui Demo")) { showImGuiDemo.set(true); } ImGui.endMenu(); } ImGui.endMainMenuBar(); } private void renderEditMenu(DeskApp deskApp) { DeskAppRenderer editUndo = deskApp.getContours().getContour(DeskAppContourSection.EDIT_UNDO); DeskAppRenderer editCopy = deskApp.getContours().getContour(DeskAppContourSection.EDIT_COPY); DeskAppRenderer editSelect = deskApp.getContours().getContour(DeskAppContourSection.EDIT_SELECT); DeskAppRenderer editFind = deskApp.getContours().getContour(DeskAppContourSection.EDIT_FIND); DeskAppRenderer editOption = deskApp.getContours().getContour(DeskAppContourSection.EDIT_OPTION); if (editUndo != null || editCopy != null || editSelect != null || editFind != null || editOption != null) { boolean first = false; if (ImGui.beginMenu("Edit")) { if (editUndo != null) { editUndo.render(); first = true; } if (editCopy != null) { if (first) { ImGui.separator(); } editCopy.render(); first = true; } if (editSelect != null) { if (first) { ImGui.separator(); } editSelect.render(); first = true; } if (editFind != null) { if (first) { ImGui.separator(); } editFind.render(); first = true; } if (editOption != null) { if (first) { ImGui.separator(); } editOption.render(); first = true; } ImGui.endMenu(); } } } }