unsafe public MapStudioNew() { CFG.AttemptLoadOrDefault(); if (UseRenderdoc) { RenderDoc.Load(out RenderDocManager); RenderDocManager.OverlayEnabled = false; } WindowCreateInfo windowCI = new WindowCreateInfo { X = CFG.Current.GFX_Display_X, Y = CFG.Current.GFX_Display_Y, WindowWidth = CFG.Current.GFX_Display_Width, WindowHeight = CFG.Current.GFX_Display_Height, WindowInitialState = WindowState.Maximized, WindowTitle = "Dark Souls Map Studio " + _version + " by Katalash", }; GraphicsDeviceOptions gdOptions = new GraphicsDeviceOptions(false, PixelFormat.R32_Float, true, ResourceBindingModel.Improved, true, true, _colorSrgb); #if DEBUG gdOptions.Debug = true; #endif VeldridStartup.CreateWindowAndGraphicsDevice( windowCI, gdOptions, //VeldridStartup.GetPlatformDefaultBackend(), //GraphicsBackend.Metal, GraphicsBackend.Vulkan, //GraphicsBackend.Direct3D11, //GraphicsBackend.OpenGL, //GraphicsBackend.OpenGLES, out _window, out _gd); _window.Resized += () => _windowResized = true; _window.Moved += (p) => _windowMoved = true; Sdl2Native.SDL_Init(SDLInitFlags.GameController); //Sdl2ControllerTracker.CreateDefault(out _controllerTracker); var factory = _gd.ResourceFactory; TextureSamplerResourceLayout = factory.CreateResourceLayout(new ResourceLayoutDescription( new ResourceLayoutElementDescription("SourceTexture", ResourceKind.TextureReadOnly, ShaderStages.Fragment), new ResourceLayoutElementDescription("SourceSampler", ResourceKind.Sampler, ShaderStages.Fragment))); Scene.Renderer.Initialize(_gd); ImguiRenderer = new ImGuiRenderer(_gd, _gd.SwapchainFramebuffer.OutputDescription, CFG.Current.GFX_Display_Width, CFG.Current.GFX_Display_Height, ColorSpaceHandling.Legacy); MainWindowCommandList = factory.CreateCommandList(); GuiCommandList = factory.CreateCommandList(); _assetLocator = new AssetLocator(); MSBEditor = new MsbEditor.MsbEditorScreen(_window, _gd, _assetLocator); ModelEditor = new MsbEditor.ModelEditorScreen(_window, _gd, _assetLocator); ParamEditor = new MsbEditor.ParamEditorScreen(_window, _gd); TextEditor = new MsbEditor.TextEditorScreen(_window, _gd); MsbEditor.ParamBank.LoadParams(_assetLocator); MsbEditor.FMGBank.LoadFMGs(_assetLocator); MsbEditor.MtdBank.LoadMtds(_assetLocator); ImGui.GetIO().ConfigFlags |= ImGuiConfigFlags.NavEnableKeyboard; var fonts = ImGui.GetIO().Fonts; var fileJp = Path.Combine(AppContext.BaseDirectory, $@"Assets\Fonts\NotoSansCJKtc-Light.otf"); var fontJp = File.ReadAllBytes(fileJp); var fileEn = Path.Combine(AppContext.BaseDirectory, $@"Assets\Fonts\RobotoMono-Light.ttf"); var fontEn = File.ReadAllBytes(fileEn); var fileIcon = Path.Combine(AppContext.BaseDirectory, $@"Assets\Fonts\forkawesome-webfont.ttf"); var fontIcon = File.ReadAllBytes(fileIcon); //fonts.AddFontFromFileTTF($@"Assets\Fonts\NotoSansCJKtc-Medium.otf", 20.0f, null, fonts.GetGlyphRangesJapanese()); fonts.Clear(); fixed(byte *p = fontEn) { var ptr = ImGuiNative.ImFontConfig_ImFontConfig(); var cfg = new ImFontConfigPtr(ptr); cfg.GlyphMinAdvanceX = 5.0f; cfg.OversampleH = 5; cfg.OversampleV = 5; var f = fonts.AddFontFromMemoryTTF((IntPtr)p, fontEn.Length, 14.0f, cfg, fonts.GetGlyphRangesDefault()); } fixed(byte *p = fontJp) { var ptr = ImGuiNative.ImFontConfig_ImFontConfig(); var cfg = new ImFontConfigPtr(ptr); cfg.MergeMode = true; cfg.GlyphMinAdvanceX = 7.0f; cfg.OversampleH = 5; cfg.OversampleV = 5; var f = fonts.AddFontFromMemoryTTF((IntPtr)p, fontJp.Length, 16.0f, cfg, fonts.GetGlyphRangesJapanese()); } fixed(byte *p = fontIcon) { ushort[] ranges = { ForkAwesome.IconMin, ForkAwesome.IconMax, 0 }; var ptr = ImGuiNative.ImFontConfig_ImFontConfig(); var cfg = new ImFontConfigPtr(ptr); cfg.MergeMode = true; cfg.GlyphMinAdvanceX = 12.0f; cfg.OversampleH = 5; cfg.OversampleV = 5; ImFontGlyphRangesBuilder b = new ImFontGlyphRangesBuilder(); fixed(ushort *r = ranges) { var f = fonts.AddFontFromMemoryTTF((IntPtr)p, fontIcon.Length, 16.0f, cfg, (IntPtr)r); } } fonts.Build(); ImguiRenderer.RecreateFontDeviceTexture(); ImguiRenderer.OnSetupDone(); var style = ImGui.GetStyle(); style.TabBorderSize = 0; if (CFG.Current.LastProjectFile != null && CFG.Current.LastProjectFile != "") { if (File.Exists(CFG.Current.LastProjectFile)) { var project = MsbEditor.ProjectSettings.Deserialize(CFG.Current.LastProjectFile); AttemptLoadProject(project, CFG.Current.LastProjectFile, false); } } }