コード例 #1
0
        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));
        }
コード例 #2
0
        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.");
            }
        }
コード例 #3
0
        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));
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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();
        }
コード例 #6
0
ファイル: RuntimeContext.cs プロジェクト: Calebsem/YALCT
 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);
 }
コード例 #7
0
ファイル: Ui.cs プロジェクト: darkfriend77/wom
 /// <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));
 }
コード例 #8
0
ファイル: RenderSettingsView.cs プロジェクト: ybwsfl/OpenSAGE
        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;
            }
        }
コード例 #9
0
        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();
            }
        }
コード例 #10
0
ファイル: MainForm.cs プロジェクト: josh-fisher/OpenSAGE
        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();
            }
        }
コード例 #11
0
ファイル: MainForm.cs プロジェクト: netdebug/OpenSAGE
        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();
            }
        }
コード例 #12
0
        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));
            }
        }