protected System.IntPtr NewImage(string path) { var ist = new ImageSharpTexture(path); Texture t = ist.CreateDeviceTexture(_gd, _gd.ResourceFactory); //_newImguiTex.Add(path, t); return(_ren.GetOrCreateImGuiBinding(_gd.ResourceFactory, t)); }
protected override void DrawOverride(ref bool isGameViewFocused) { var windowPos = ImGui.GetCursorScreenPos(); var availableSize = ImGui.GetContentRegionAvail(); availableSize.Y -= ImGui.GetTextLineHeightWithSpacing(); if (availableSize.X <= 0 || availableSize.Y <= 0) { return; } Game.Panel.EnsureFrame( new Mathematics.Rectangle( (int)windowPos.X, (int)windowPos.Y, (int)availableSize.X, (int)availableSize.Y)); var inputMessages = isGameViewFocused ? ImGuiUtility.TranslateInputMessages(Game.Panel.Frame, Window.MessageQueue) : Array.Empty <InputMessage>(); Game.Update(inputMessages); Game.Render(); var imagePointer = ImGuiRenderer.GetOrCreateImGuiBinding( Game.GraphicsDevice.ResourceFactory, Game.Panel.Framebuffer.ColorTargets[0].Target); if (ImGui.ImageButton( imagePointer, availableSize, Vector2.Zero, Vector2.One, 0, Vector4.Zero, Vector4.One)) { isGameViewFocused = true; } if (isGameViewFocused) { ImGui.TextColored( new Vector4(1.0f, 0.0f, 0.0f, 1.0f), "Press [ESC] to unfocus the game view."); } else { ImGui.Text("Click in the game view to capture mouse input."); } }
public static unsafe IntPtr Create(Image <Rgba32> image) { lock (lockObject) { Texture texture = GraphicsDevice.ResourceFactory.CreateTexture(TextureDescription.Texture2D((uint)image.Width, (uint)image.Height, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.Sampled)); fixed(void *pin = &MemoryMarshal.GetReference(image.GetPixelSpan())) { GraphicsDevice.UpdateTexture(texture, (IntPtr)pin, (uint)(4 * image.Width * image.Height), 0, 0, 0, (uint)image.Width, (uint)image.Height, 1, 0, 0); } return(Controller.GetOrCreateImGuiBinding(GraphicsDevice.ResourceFactory, texture)); } }
public override void Draw() { ImGui.BeginChild("mip level", new Vector2(150, 0), true, 0); for (var i = 0u; i < _texture.MipLevels; i++) { if (ImGui.Selectable($"MipMap {i}", i == _mipLevel)) { _mipLevel = i; } } ImGui.EndChild(); ImGui.SameLine(); var textureViewDescription = new TextureViewDescription(_texture, _mipLevel, 1, 0, 1); if (!_textureViews.TryGetValue(textureViewDescription, out var textureView)) { _textureViews.Add(textureViewDescription, textureView = AddDisposable(_graphicsDevice.ResourceFactory.CreateTextureView(ref textureViewDescription))); } var imagePointer = _imguiRenderer.GetOrCreateImGuiBinding( _graphicsDevice.ResourceFactory, textureView); var availableSize = ImGui.GetContentRegionAvail(); var size = SizeF.CalculateSizeFittingAspectRatio( new SizeF(_texture.Width, _texture.Height), new Size((int)availableSize.X, (int)availableSize.Y)); ImGui.Image( imagePointer, new Vector2(size.Width, size.Height), Vector2.Zero, Vector2.One, Vector4.One, Vector4.Zero); }
private void Resize(Vector2 newSize) { if (newSize.X <= 0.0f || newSize.Y <= 0.0f) { return; } if (bindingHandle != IntPtr.Zero) { ImGuiRenderer.RemoveImGuiBinding(targetColor); } var oldTargetColor = targetColor; var oldTargetDepth = targetDepth; var oldFramebuffer = Framebuffer; onceBeforeContent.Next += () => { // delaying the disposal works around a freeze bug related to Vulkan oldTargetColor?.Dispose(); oldTargetDepth?.Dispose(); oldFramebuffer?.Dispose(); }; targetColor = Factory.CreateTexture(new TextureDescription( (uint)newSize.X, (uint)newSize.Y, 1, 1, 1, PixelFormat.R8_G8_B8_A8_UNorm, TextureUsage.RenderTarget | TextureUsage.Sampled, TextureType.Texture2D)); targetDepth = Factory.CreateTexture(new TextureDescription( (uint)newSize.X, (uint)newSize.Y, 1, 1, 1, PixelFormat.D24_UNorm_S8_UInt, TextureUsage.DepthStencil, TextureType.Texture2D)); Framebuffer = Factory.CreateFramebuffer(new FramebufferDescription(targetDepth, targetColor)); bindingHandle = ImGuiRenderer.GetOrCreateImGuiBinding(Factory, targetColor); IsDirty = true; OnResize(); }
public bool LoadTexture(YALCTFilePickerItem item) { try { ImageSharpTexture imageSharpTex = new ImageSharpTexture(item.FullPath); Texture texture = imageSharpTex.CreateDeviceTexture(graphicsDevice, factory); TextureView textureView = factory.CreateTextureView(texture); textureView.Name = item.Name; // as per https://github.com/mellinoe/veldrid/issues/188 TextureView imguiTextureView = factory.CreateTextureView(new TextureViewDescription(texture, PixelFormat.R8_G8_B8_A8_UNorm_SRgb)); imguiTextureView.Name = item.Name; IntPtr imguiBinding = imGuiRenderer.GetOrCreateImGuiBinding(factory, imguiTextureView); textures.Add(texture); textureViews.Add(textureView); imguiTextureViews.Add(imguiTextureView); imguiTextures.Add(new YALCTShaderResource(item, new Vector2(texture.Width, texture.Height), imguiBinding)); } catch (Exception e) { uiController.SetError(e.Message); return(false); } return(true); }
/// <summary> /// Gets or creates a handle for a texture to be drawn with ImGui. /// Pass the returned handle to Image() or ImageButton(). /// </summary> public IntPtr GetOrCreateImGuiBinding(ResourceFactory factory, TextureView textureView) { return(_imguiRenderer.GetOrCreateImGuiBinding(factory, textureView)); }
protected override void DrawOverride(ref bool isGameViewFocused) { if (Game.Scene3D == null) { ImGui.Text("Render settings are only available when a map has been loaded."); return; } var lighting = Game.Scene3D.Lighting; ImGui.Text("Time of day"); { foreach (var timeOfDay in GetTimesOfDay()) { if (ImGui.RadioButton(timeOfDay.ToString(), lighting.TimeOfDay == timeOfDay)) { lighting.TimeOfDay = timeOfDay; } } } ImGui.Separator(); var shadowSettings = Game.Scene3D.Shadows; ImGui.Text("Shadows"); { foreach (var shadowsType in GetShadowsTypes()) { if (ImGui.RadioButton(shadowsType.ToString(), shadowSettings.ShadowsType == shadowsType)) { shadowSettings.ShadowsType = shadowsType; } } } if (shadowSettings.ShadowsType != ShadowsType.None) { ImGui.Separator(); var currentShadowMapSizeIndex = _shadowMapSizes.IndexOf(shadowSettings.ShadowMapSize); ImGui.Combo("Shadow map size", ref currentShadowMapSizeIndex, _shadowMapSizeNames, _shadowMapSizes.Count); shadowSettings.ShadowMapSize = _shadowMapSizes[currentShadowMapSizeIndex]; ImGui.Text("Shadow cascades"); { foreach (var cascadeType in GetShadowCascades()) { if (ImGui.RadioButton(cascadeType.ToString(), shadowSettings.ShadowMapCascades == cascadeType)) { shadowSettings.ShadowMapCascades = cascadeType; } } } ImGui.Separator(); var shadowDistance = shadowSettings.ShadowDistance; if (ImGui.SliderFloat("Shadow distance", ref shadowDistance, 10, 2000)) { shadowSettings.ShadowDistance = shadowDistance; } var stabilizeShadows = shadowSettings.StabilizeShadowCascades; if (ImGui.Checkbox("Stabilize shadows", ref stabilizeShadows)) { shadowSettings.StabilizeShadowCascades = stabilizeShadows; } var visualizeCascades = shadowSettings.VisualizeCascades; if (ImGui.Checkbox("Visualize shadow cascades", ref visualizeCascades)) { shadowSettings.VisualizeCascades = visualizeCascades; } if (Game.Graphics.ShadowMap != null) { for (var i = 0; i < (int)Game.Graphics.ShadowMap.ArrayLayers; i++) { var shadowMapTuple = Tuple.Create(Game.Graphics.ShadowMap, i); if (!_cachedTextureViews.TryGetValue(shadowMapTuple, out var shadowMapView)) { shadowMapView = AddDisposable(Game.GraphicsDevice.ResourceFactory.CreateTextureView( new TextureViewDescription(Game.Graphics.ShadowMap, 0, 1, (uint)i, 1))); _cachedTextureViews.Add(shadowMapTuple, shadowMapView); } var imagePointer = ImGuiRenderer.GetOrCreateImGuiBinding( Game.GraphicsDevice.ResourceFactory, shadowMapView); ImGui.Image( imagePointer, new Vector2(250, 250), Game.GetTopLeftUV(), Game.GetBottomRightUV(), Vector4.One); } } } ImGui.Separator(); var enableCloudShadows = lighting.EnableCloudShadows; if (ImGui.Checkbox("Enable cloud shadows", ref enableCloudShadows)) { lighting.EnableCloudShadows = enableCloudShadows; } }
private void DrawTextureWindow(Sdl2Window window) { Vector2 pos = Vector2.One; pos.X = 500 + 350 - 1; pos.Y = 18; ImGui.SetNextWindowPos(pos, ImGuiCond.Always, Vector2.Zero); ImGui.SetNextWindowSize(new Vector2(window.Width - pos.X, window.Height - 18), ImGuiCond.Always); if (ImGui.Begin("##texture_window", ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.NoTitleBar)) { AlfModule levelModule = Alf.Modules[SelectedEntry]; AlfModule textureModule = Alf.Modules[SelectedEntry + 1]; AlfEntry selectedTexture = textureModule.Entries[SelectedTexture]; ImGui.Text($"Texture: {selectedTexture.Name}"); if (!HasImage && ImGui.Button("View me")) { byte[] paletteData = levelModule.Entries.Find(e => e.Name.EndsWith("PAL")).GetContents(); var br = new BinaryReader(new MemoryStream(paletteData)); Palette p = Palette.LoadFromPal(br); byte[] imageData = selectedTexture.GetContents(); ImageData temp = PixExtractor.ExtractImage(imageData, p); Texture img = Gd.ResourceFactory.CreateTexture(new TextureDescription { Height = (uint)temp.Height, Width = (uint)temp.Width, Format = PixelFormat.R8_G8_B8_A8_UNorm_SRgb, Type = TextureType.Texture2D, Usage = TextureUsage.Sampled, MipLevels = 1, Depth = 1, ArrayLayers = 1 }); GCHandle pinnedArray = GCHandle.Alloc(temp.PixelData, GCHandleType.Pinned); IntPtr pointer = pinnedArray.AddrOfPinnedObject(); Gd.UpdateTexture(img, pointer, (uint)temp.PixelData.Length, 0, 0, 0, (uint)temp.Width, (uint)temp.Height, 1, 0, 0); pinnedArray.Free(); CurrentImage = img; HasImage = true; ZoomFactor = 1; } if (HasImage && CurrentImage != null) { if (ImGui.Button("Close me")) { HasImage = false; CurrentImage.Dispose(); } ImGui.SameLine(); if (ImGui.Button("+")) { ZoomFactor++; } ImGui.SameLine(); if (ImGui.Button("-")) { ZoomFactor = ZoomFactor == 1 ? 1 : ZoomFactor - 1; } ImGui.Text($"Image Size: {CurrentImage.Width}x{CurrentImage.Height}"); ImGui.Image(ImGuiRenderer.GetOrCreateImGuiBinding(Gd.ResourceFactory, CurrentImage), new Vector2(CurrentImage.Width * ZoomFactor, CurrentImage.Height * ZoomFactor)); } ImGui.End(); } }
private void DrawMainUi(ref bool isGameViewFocused) { if (ImGui.BeginMenuBar()) { if (ImGui.BeginMenu("Installation")) { foreach (var installation in _installations) { if (ImGui.MenuItem(installation.Game.DisplayName, null, _selectedInstallation == installation, true)) { ChangeInstallation(installation); } } ImGui.EndMenu(); } if (ImGui.BeginMenu("Preferences")) { bool isVSyncEnabled = _isVSyncEnabled; if (ImGui.MenuItem("VSync", null, ref isVSyncEnabled, true)) { SetVSync(isVSyncEnabled); } ImGui.EndMenu(); } ImGui.EndMenuBar(); } ImGui.BeginChild("sidebar", new Vector2(250, 0), true, 0); if (_launcherImage != null) { var availableSize = ImGui.GetContentRegionAvail(); var launcherImageSize = SizeF.CalculateSizeFittingAspectRatio( new SizeF(_launcherImage.Width, _launcherImage.Height), new Size((int)availableSize.X, (int)availableSize.Y)); ImGui.Image( _imGuiRenderer.GetOrCreateImGuiBinding(_gameWindow.GraphicsDevice.ResourceFactory, _launcherImage), new Vector2(launcherImageSize.Width, launcherImageSize.Height), Vector2.Zero, Vector2.One, Vector4.One, Vector4.Zero); } ImGui.PushItemWidth(-1); ImGuiUtility.InputText("##search", _searchTextBuffer, out var searchText); UpdateSearch(searchText); ImGui.PopItemWidth(); ImGui.BeginChild("files list", Vector2.Zero, true); for (var i = 0; i < _files.Count; i++) { var entry = _files[i]; if (ImGui.Selectable(entry.FilePath, i == _currentFile)) { _currentFile = i; RemoveAndDispose(ref _contentView); _game.ContentManager.Unload(); _contentView = AddDisposable(new ContentView( new Views.AssetViewContext(_game, _gamePanel, _imGuiRenderer, entry))); } ImGuiUtility.DisplayTooltipOnHover(entry.FilePath); } ImGui.EndChild(); ImGui.EndChild(); ImGui.SameLine(); if (_contentView != null) { ImGui.BeginChild("content"); ImGui.Text(_contentView.DisplayName); if (isGameViewFocused) { var message = "Press [ESC] to unfocus the 3D view."; ImGui.SameLine(ImGui.GetWindowWidth() - ImGui.CalcTextSize(message).X); ImGui.TextColored(new Vector4(1.0f, 0.0f, 0.0f, 1.0f), message); } ImGui.BeginChild("content view"); _contentView.Draw(ref isGameViewFocused); ImGui.EndChild(); ImGui.EndChild(); } }
private void DrawMainUi(ref bool isGameViewFocused) { if (ImGui.BeginMenuBar()) { if (ImGui.BeginMenu("Installation")) { foreach (var installation in _installations) { if (ImGui.MenuItem(installation.Game.DisplayName, null, _selectedInstallation == installation, true)) { ChangeInstallation(installation); } } ImGui.EndMenu(); } ImGui.EndMenuBar(); } ImGui.BeginChild("sidebar", new Vector2(250, 0), true, 0); if (_launcherImage != null) { var availableSize = ImGui.GetContentRegionAvailable(); var launcherImageSize = SizeF.CalculateSizeFittingAspectRatio( new SizeF(_launcherImage.Width, _launcherImage.Height), new Size((int)availableSize.X, (int)availableSize.Y)); ImGui.Image( _imGuiRenderer.GetOrCreateImGuiBinding(_gameWindow.GraphicsDevice.ResourceFactory, _launcherImage), new Vector2(launcherImageSize.Width, launcherImageSize.Height), Vector2.Zero, Vector2.One, Vector4.One, Vector4.Zero); } ImGui.PushItemWidth(-1); ImGuiUtility.InputText("##search", _searchTextBuffer, out var searchText); ImGui.PopItemWidth(); ImGui.BeginChild("files list", true, 0); for (var i = 0; i < _files.Count; i++) { var entry = _files[i]; if (!string.IsNullOrEmpty(searchText) && entry.FilePath.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) < 0) { continue; } if (ImGui.Selectable(entry.FilePath, i == _currentFile)) { _currentFile = i; RemoveAndDispose(ref _contentView); _game.ContentManager.Unload(); _contentView = AddDisposable(new ContentView( new Views.AssetViewContext(_game, _gamePanel, _imGuiRenderer, entry))); } var shouldOpenSaveDialog = false; if (ImGui.BeginPopupContextItem("context" + i)) { _currentFile = i; if (ImGui.Selectable("Export...")) { shouldOpenSaveDialog = true; } ImGui.EndPopup(); } var exportId = "Export##ExportDialog" + i; if (shouldOpenSaveDialog) { ImGui.OpenPopup(exportId); } if (ImGui.BeginPopupModal(exportId, WindowFlags.AlwaysAutoResize)) { ImGuiUtility.InputText("File Path", _filePathBuffer, out var filePath); if (ImGui.Button("Save")) { using (var entryStream = entry.Open()) { using (var fileStream = File.OpenWrite(filePath)) { entryStream.CopyTo(fileStream); } } ImGui.CloseCurrentPopup(); } ImGui.SetItemDefaultFocus(); ImGui.SameLine(); if (ImGui.Button("Cancel")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } } ImGui.EndChild(); ImGui.EndChild(); ImGui.SameLine(); if (_contentView != null) { ImGui.BeginChild("content"); ImGui.Text(_contentView.DisplayName); ImGui.BeginChild("content view"); _contentView.Draw(ref isGameViewFocused); ImGui.EndChild(); ImGui.EndChild(); } }
private void DrawImageViewer(string imageType) { ImGui.Text("I'm an viewable image"); if (!HasImage && ImGui.Button("View me")) { byte[] data = Alf.Entries[SelectedEntry].GetContents(); if (imageType == "AIF") { CurrentImages = new List <ImageData> { AifExtractor.ExtractImage(data) }; CurrentImageIndex = 0; } else if (imageType == "NVF") { // special handling of DUALPICS.NVF if (Alf.Entries[SelectedEntry].Name == "DUALPICS.NVF") { byte[] dualPals = Alf.Entries.First(p => p.Name == "DUALPALS.DAT").GetContents(); var extraPalettes = new List <Palette>(); for (int i = 0; i < 13; i++) { var span = new ReadOnlySpan <byte>(dualPals, i * 96, 96); var p = new Palette(span.ToArray(), 32); extraPalettes.Add(p); } CurrentImages = NvfExtractor.ExtractImage(data, extraPalettes); } else { CurrentImages = NvfExtractor.ExtractImage(data); } CurrentImageIndex = 0; } else if (imageType == "ACE") { try { CurrentImages = AceExtractor.ExtractImage(data).Animations[0].Images; CurrentImageIndex = 0; } catch (NotImplementedException e) { Console.WriteLine(e.Message); } } else { throw new NotSupportedException($"format {imageType} is not yet supported"); } if (CurrentImages != null) { LoadImage(); } } if (HasImage && CurrentImage != null) { if (ImGui.Button("Close me")) { HasImage = false; CurrentImage.Dispose(); } ImGui.SameLine(); if (ImGui.Button("+")) { ZoomFactor++; } ImGui.SameLine(); if (ImGui.Button("-")) { ZoomFactor = ZoomFactor == 1 ? 1 : ZoomFactor - 1; } ImGui.Text($"Image Size: {CurrentImage.Width}x{CurrentImage.Height}"); ImGui.Text($"Image {CurrentImageIndex + 1}/{CurrentImages.Count}"); ImGui.SameLine(); if (ImGui.Button("Next") && CurrentImageIndex < CurrentImages.Count - 1) { CurrentImageIndex++; LoadImage(true); } ImGui.SameLine(); if (ImGui.Button("Last") && CurrentImageIndex > 0) { CurrentImageIndex--; LoadImage(true); } ImGui.Image(ImGuiRenderer.GetOrCreateImGuiBinding(Gd.ResourceFactory, CurrentImage), new Vector2(CurrentImage.Width * ZoomFactor, CurrentImage.Height * ZoomFactor)); } }