Beispiel #1
0
        public void Draw(AptSceneManager manager)
        {
            if (ImGui.Begin("Scene transform", ImGuiWindowFlags.AlwaysAutoResize))
            {
                var scale       = manager.CurrentScale;
                var scaleFactor = MathF.Log(scale, 2);
                ImGui.SliderFloat("Scale Exponent", ref scaleFactor, -4, 4);
                scale = MathF.Pow(2, scaleFactor);
                ImGui.InputFloat("Scale (does not work for now)", ref scale);
                ImGui.Spacing();

                var windowSize = manager.Game.Window.ClientBounds;
                var offset     = manager.CurrentOffset;
                var x          = offset.X;
                var y          = offset.Y;
                ImGui.SliderFloat("SceneView Offset X", ref x, MathF.Min(0, x) - 100, MathF.Max(windowSize.Width, x) + 100);
                ImGui.SliderFloat("SceneView Offset Y", ref y, MathF.Min(0, y) - 100, MathF.Max(windowSize.Height, y) + 100);
                ImGui.Spacing();

                var previousColor = manager.DisplayBackgroundColor;
                var color         = new Vector3(previousColor.R, previousColor.G, previousColor.B);
                ImGui.ColorEdit3("Background (display only)", ref color);

                manager.CurrentScale  = scale;
                manager.CurrentOffset = new Vector2(x, y);
                manager.ChangeDisplayBackgroundColor(new ColorRgbaF(color.X, color.Y, color.Z, 1));
            }
            ImGui.End();
        }
Beispiel #2
0
        public void Draw(AptSceneManager manager)
        {
            if (_utilities?.Manager != manager.AptManager)
            {
                _lastSelectedCharacter = -1;
                _decidingExportName    = string.Empty;
                _utilities             = manager.AptManager is null
                    ? null
                    : new CharacterUtilities(manager.AptManager);
            }

            if (_utilities is null)
            {
                return;
            }

            if (ImGui.Begin("Characters"))
            {
                ImGui.Text("Characters");

                ImGui.PushID(1);
                DrawCharacterCreationForm();
                ImGui.PopID();

                ImGui.PushID(2);
                ListCharacterDescription(manager);
                ImGui.PopID();
            }
            ImGui.End();
        }
        public static FrameItemUtilities?Reset(AptSceneManager manager, FrameItemUtilities?current)
        {
            if (manager.IsCurrentCharacterImported)
            {
                return(null);
            }

            if (manager.CurrentCharacter is not Playable p)
            {
                return(null);
            }

            if (manager.CurrentFrameWrapped is not int frameNumber)
            {
                return(null);
            }

            var currentFrame = p.Frames[frameNumber];

            if (ReferenceEquals(p, current?._character) &&
                ReferenceEquals(currentFrame, current?._storedFrame))
            {
                return(current);
            }

            return(new FrameItemUtilities(p, manager, currentFrame));
        }
Beispiel #4
0
        public void Draw(AptSceneManager manager)
        {
            if (_frameListUtilities.Reset(manager))
            {
                // if this is a different frame (imply _utilities.Active == true)
                ImGui.SetNextWindowSize(Vector2.Zero);
                _inputFrameNumber = manager.CurrentFrame;
                _playing          = false;
                _playSpeed        = 1f;
            }
            else if (!_frameListUtilities.Active)
            {
                return;
            }

            if (ImGui.Begin(Name))
            {
                ImGui.InputFloat("Speed multiplier", ref _playSpeed);
                ImGui.Text($"Current Frame: {manager.CurrentFrameWrapped}");
                ProcessPlay(manager);

                ImGui.Separator();

                ImGui.InputInt($" / {manager.NumberOfFrames}", ref _inputFrameNumber);
                _inputFrameNumber = Math.Abs(_inputFrameNumber);
                if (ImGui.Button("Play to frame"))
                {
                    manager.PlayToFrame(_inputFrameNumber);
                }

                ImGui.Separator();

                if (ImGui.BeginChild("Real Frame List"))
                {
                    var digits = 1;
                    if (manager.NumberOfFrames > 10)
                    {
                        digits = (int)Math.Log10(manager.NumberOfFrames - 1) + 1;
                    }
                    for (var i = 0; i < manager.NumberOfFrames; ++i)
                    {
                        var selected = (i == manager.CurrentFrameWrapped);
                        ImGui.Selectable($"Frame {i.ToString($"D{digits}")}", ref selected);
                        if (selected && i != manager.CurrentFrameWrapped)
                        {
                            manager.PlayToFrame(i);
                            _inputFrameNumber = i;
                        }
                    }
                }
                ImGui.EndChild();
            }
            ImGui.End();
        }
Beispiel #5
0
        private void ListCharacterDescription(AptSceneManager manager)
        {
            var indexColor  = new Vector4(0, 1, 1, 1);
            var typeColor   = new Vector4(0, 0.8f, 0.2f, 1);
            var exportColor = new Vector4(1, 1, 0, 1);

            foreach (var desc in _utilities !.GetActiveCharactersDescription())
            {
                var wasSelected = (_lastSelectedCharacter == desc.Index);

                if (desc.Import is Import import)
                {
                    ImGui.TextColored(indexColor, "Imported");
                    ImGui.SameLine(0, 5);
                    ImGui.Text($"{import.Movie}.{import.Name}");
                }

                if (desc.ExportedName != null)
                {
                    ImGui.TextColored(exportColor, "Exported");
                    ImGui.SameLine(0, 5);
                    ImGui.Text(desc.ExportedName);
                }

                ImGui.TextColored(indexColor, desc.Index.ToString());
                ImGui.SameLine(0, 5);
                ImGui.TextColored(typeColor, desc.Type);
                ImGui.SameLine(0, 5);


                var selected = wasSelected;
                ImGui.Selectable(desc.Name, ref selected);
                if (selected)
                {
                    _lastSelectedCharacter = desc.Index;
                    var selectedCharacter = _utilities.GetCharacterByIndex(desc.Index);
                    if (manager.CurrentCharacter != selectedCharacter)
                    {
                        System.Console.WriteLine($"Setting new character {desc.Index} {selectedCharacter.GetType().Name}");
                        manager.SetCharacter(selectedCharacter);
                        _decidingExportName = desc.ExportedName ?? desc.Name;
                    }
                    DrawSelectedCharacterDescription(desc);
                }
                ImGui.Separator();
            }
        }
Beispiel #6
0
        public void Draw(AptSceneManager manager)
        {
            if (_utilities?.Manager != manager.AptManager)
            {
                _utilities = manager.AptManager is null
                    ? null
                    : new GeometryUtilities(manager.AptManager);
                _selected     = null;
                _lastError    = null;
                _currentInput = string.Empty;
            }

            if (_utilities is null)
            {
                return;
            }

            if (ImGui.Begin("Apt Geometries"))
            {
                if (_selected.HasValue)
                {
                    ImGui.Columns(2);
                    ImGui.Value("Geometry", _selected.Value.Key);
                }

                ImGui.InputInt("New geomery id", ref _newGeometryId);
                if (_utilities.HasGeometry(_newGeometryId))
                {
                    ImGui.Text($"Geometry #{_newGeometryId} already exists.");
                }
                else if (ImGui.Button("New geometry"))
                {
                    _utilities.AddGeometry(_newGeometryId);
                }

                DrawGeometryList();

                if (_selected is KeyValuePair <int, string> selected)
                {
                    ImGui.NextColumn();
                    DrawInput(selected);
                }
            }
            ImGui.End();
        }
Beispiel #7
0
        // return true if they are new frames
        public bool Reset(AptSceneManager manager)
        {
            _manager ??= manager;
            if (_manager != manager)
            {
                throw new NotSupportedException();
            }

            var newCharacter = _manager?.CurrentCharacter as Playable;

            if (CurrentCharacter != newCharacter)
            {
                CurrentCharacter = newCharacter;
                return(CurrentCharacter != null);
            }

            return(false);
        }
Beispiel #8
0
        private void ProcessPlay(AptSceneManager manager)
        {
            if (!_playing)
            {
                if (ImGui.Button("Play"))
                {
                    _playing        = true;
                    _lastPlayUpdate = DateTime.UtcNow;
                    if (manager.CurrentFrame != _inputFrameNumber)
                    {
                        manager.PlayToFrame(0);
                        _inputFrameNumber = 0;
                    }
                }
            }
            else
            {
                if (ImGui.Button("Stop"))
                {
                    _playing = false;
                }
            }

            var now  = DateTime.UtcNow;
            var mspf = manager.MillisecondsPerFrame / _playSpeed;

            while ((now - _lastPlayUpdate).TotalMilliseconds >= mspf)
            {
                if (manager.CurrentFrame != _inputFrameNumber)
                {
                    _playing = false;
                }
                if (!_playing)
                {
                    break;
                }

                ++_inputFrameNumber;
                manager.NextFrame();
                _lastPlayUpdate += TimeSpan.FromMilliseconds(mspf);
            }

            ImGui.TextWrapped("Played frames might differ from real ones because AptEditor won't execute any actionscript.");
        }
        private FrameItemUtilities(Playable character, AptSceneManager manager, Frame currentFrame)
        {
            _character   = character;
            _manager     = manager;
            _storedFrame = currentFrame;
            foreach (var frameItem in CurrentItems)
            {
                switch (frameItem)
                {
                case PlaceObject placeObject:
                    _placeObjects.Add(placeObject.Depth, new LogicalPlaceObject(EditAndUpdate, placeObject));
                    break;

                case RemoveObject removeObject:
                    _placeObjects.Add(removeObject.Depth, null);
                    break;

                case FrameLabel frameLabel:
                    _frameLabels.Add(frameLabel);
                    break;

                case Action action:
                    _frameActions.Add(new LogicalAction(action));
                    break;

                case InitAction initAction:
                    _initActions.Add(new LogicalInitAction(initAction));
                    break;

                case BackgroundColor background:
                    _backgroundColors.Add(background);
                    break;

                default:
                    throw new NotImplementedException();
                }
            }
        }
Beispiel #10
0
 public void Draw(AptSceneManager manager)
 {
     if (ImGui.Begin("Instruction Editor"))
     {
         for (var i = 0; i < _instructions.Items.Count; ++i)
         {
             if (i == _editingIndex)
             {
                 _editBox.Draw();
                 ImGui.SameLine();
                 if (ImGui.Button("Done"))
                 {
                     _editingIndex = -1;
                 }
             }
             else
             {
                 ImGui.Button(_instructions.Items[i].InstructionName());
             }
         }
     }
     ImGui.End();
 }
Beispiel #11
0
        public void Draw(AptSceneManager manager)
        {
            var maybeNew = FrameItemUtilities.Reset(manager, _utilities);

            if (maybeNew is null)
            {
                return;
            }
            if (!ReferenceEquals(_utilities, maybeNew))
            {
                // if this is a different frame (imply _utilities.Active == true)
                ImGui.SetNextWindowSize(new Vector2(0, 0));
                _utilities = maybeNew;
                ResetCreatePlaceObjectForm();
            }

            if (ImGui.Begin(Name))
            {
                var id = _utilities.GetHashCode();

                // frame label
                ImGui.Text("Frame labels");
                ImGui.Button("New Frame label");
                foreach (var label in _utilities.FrameLabels)
                {
                    using var _ = new ImGuiIDHelper("Frame labels", ref id);
                    ImGui.Text($"{label.FrameId}");
                    ImGui.SameLine();
                    ImGui.TextColored(new Vector4(1, 1, 0, 1), label.Name);
                    ImGui.SameLine();
                    ImGui.Text($"{label.Flags}");
                    ImGui.SameLine(ImGui.GetWindowWidth() - 100);
                    ImGui.Button("Remove");
                    ImGui.NewLine();
                    // TODO: is frame label globally visible?
                }
                ImGui.Separator();

                // background color
                if (!_utilities.BackgroundColors.Any())
                {
                    ImGui.Button("Set background color");
                }
                foreach (var color in _utilities.BackgroundColors)
                {
                    using var _ = new ImGuiIDHelper("Background colors", ref id);
                    ImGui.Text("Background Color");
                    ImGui.SameLine();
                    ImGui.ColorButton("Background color", color.Color.ToColorRgbaF().ToVector4());
                    ImGui.SameLine(ImGui.GetWindowWidth() - 100);
                    ImGui.Button("Remove");
                }
                ImGui.Separator();

                // actions
                ImGui.Button("Add frame Action");
                foreach (var item in _utilities.FrameActions)
                {
                    using var _ = new ImGuiIDHelper("Frame actions", ref id);
                    if (ImGui.Button("Frame Action"))
                    {
                        _currentFrameAction = new InstructionEditor(item.Instructions);
                    }
                }
                ImGui.Separator();

                // initActions
                ImGui.Button("Add InitAction");
                var indexColor = new Vector4(0, 1, 1, 1);
                var typeColor  = new Vector4(0, 1, 0, 1);
                foreach (var item in _utilities.InitActions)
                {
                    using var _ = new ImGuiIDHelper("Init actions", ref id);
                    ImGui.TextColored(indexColor, $"{item.Sprite}");
                    ImGui.SameLine(35, 5);
                    if (ImGui.Button("Sprite InitAction"))
                    {
                        _currentFrameAction = new InstructionEditor(item.Instructions);
                    }
                }
                ImGui.Separator();

                // placeobjects
                ImGui.Text("Place commands");
                DrawCreatePlaceObjectForm();
                ImGui.Separator();
                ImGui.Indent(10);
                int?remove = null;
                foreach (var(depth, placeObject) in _utilities.PlaceObjects)
                {
                    using var _ = new ImGuiIDHelper("PlaceObjects", ref id);
                    ImGui.Text($"Depth: {depth}");
                    ImGui.SameLine();
                    if (ImGui.Button("Remove"))
                    {
                        remove = depth;
                    }

                    if (placeObject is null)
                    {
                        ImGui.Text("Remove character in the current depth.");
                        continue;
                    }

                    ImGui.TextColored(typeColor, "Character");

                    ProcessPlaceCharacter(placeObject);
                    ImGui.Spacing();
                    ProcessTransform(placeObject);
                    ImGui.Spacing();
                    ProcessColorTransform(placeObject);
                    ImGui.Spacing();
                    ProcessRatio(placeObject);
                    ImGui.Spacing();
                    ProcessName(placeObject);
                    ImGui.Spacing();
                    ProcessClipEvents(placeObject);
                    ImGui.Separator();
                }
                ImGui.Unindent();

                if (remove is int removeValue)
                {
                    _utilities.RemovePlaceObject(removeValue);
                }
            }
            ImGui.End();

            // Draw Frame's Action / InitAction
            _currentFrameAction?.Draw(manager);
        }