Ejemplo n.º 1
0
        public bool MoveToBottom(EditorStoryboardLayer layer)
        {
            var index = layers.IndexOf(layer);

            if (index != -1)
            {
                if (index == layers.Count - 1)
                {
                    return(false);
                }
                while (index < layers.Count - 1 && layer.CompareTo(layers[index + 1]) == 0)
                {
                    var otherLayer = layers[index + 1];
                    layers[index + 1] = layer;
                    layers[index]     = otherLayer;
                    ++index;
                }
            }
            else
            {
                throw new InvalidOperationException($"Cannot move layer '{layer.Name}'");
            }
            OnLayersChanged?.Invoke(this, EventArgs.Empty);
            return(true);
        }
Ejemplo n.º 2
0
 public void Remove(EditorStoryboardLayer layer)
 {
     if (layers.Remove(layer))
     {
         layer.OnChanged -= layer_OnChanged;
         OnLayersChanged?.Invoke(this, EventArgs.Empty);
     }
 }
Ejemplo n.º 3
0
        public override StoryboardLayer GetLayer(string identifier)
        {
            var layer = EditorLayers.Find(l => l.Identifier == identifier);

            if (layer == null)
            {
                EditorLayers.Add(layer = new EditorStoryboardLayer(identifier, effect));
            }
            return(layer);
        }
Ejemplo n.º 4
0
        public override void AddPlaceholder(EditorStoryboardLayer layer)
        {
            if (placeHolderLayer != null)
            {
                layers.Remove(placeHolderLayer);
                Project.LayerManager.Remove(placeHolderLayer);
                placeHolderLayer = null;
            }
            layers.Add(layer);
            refreshLayerNames();

            Project.LayerManager.Add(layer);
        }
Ejemplo n.º 5
0
        public void MoveToOsbLayer(EditorStoryboardLayer layer, OsbLayer osbLayer)
        {
            var firstLayer = layers.FirstOrDefault(l => l.OsbLayer == osbLayer);

            if (firstLayer != null)
            {
                MoveToLayer(layer, firstLayer);
            }
            else
            {
                layer.OsbLayer = osbLayer;
            }
        }
Ejemplo n.º 6
0
        public ScriptedEffect(Project project, ScriptContainer <StoryboardObjectGenerator> scriptContainer) : base(project)
        {
            statusStopwatch.Start();

            this.scriptContainer = scriptContainer;
            name = project.GetUniqueEffectName(BaseName);

            layers = new List <EditorStoryboardLayer>();
            layers.Add(placeHolderLayer = new EditorStoryboardLayer(string.Empty, this));
            refreshLayerNames();

            Project.LayerManager.Add(placeHolderLayer);

            scriptContainer.OnScriptChanged += scriptContainer_OnScriptChanged;
        }
Ejemplo n.º 7
0
        private int findLayerIndex(EditorStoryboardLayer layer)
        {
            var index = layers.BinarySearch(layer);

            if (index >= 0)
            {
                while (index < layers.Count && layer.CompareTo(layers[index]) == 0)
                {
                    index++;
                }
                return(index);
            }
            else
            {
                return(~index);
            }
        }
Ejemplo n.º 8
0
        public void Replace(EditorStoryboardLayer oldLayer, EditorStoryboardLayer newLayer)
        {
            var index = layers.IndexOf(oldLayer);

            if (index != -1)
            {
                newLayer.CopySettings(oldLayer, copyGuid: true);
                newLayer.OnChanged += layer_OnChanged;
                oldLayer.OnChanged -= layer_OnChanged;
                layers[index]       = newLayer;
            }
            else
            {
                throw new InvalidOperationException($"Cannot replace layer '{oldLayer.Name}' with '{newLayer.Name}', old layer not found");
            }
            OnLayersChanged?.Invoke(this, EventArgs.Empty);
        }
Ejemplo n.º 9
0
        public void MoveToLayer(EditorStoryboardLayer layerToMove, EditorStoryboardLayer toLayer)
        {
            layerToMove.OsbLayer = toLayer.OsbLayer;

            var fromIndex = layers.IndexOf(layerToMove);
            var toIndex   = layers.IndexOf(toLayer);

            if (fromIndex != -1 && toIndex != -1)
            {
                layers.Move(fromIndex, toIndex);
                sortLayer(layerToMove);
            }
            else
            {
                throw new InvalidOperationException($"Cannot move layer '{layerToMove.Name}' to the position of '{layerToMove.Name}'");
            }
        }
Ejemplo n.º 10
0
        public void Replace(EditorStoryboardLayer oldLayer, List <EditorStoryboardLayer> newLayers)
        {
            var index = layers.IndexOf(oldLayer);

            if (index != -1)
            {
                foreach (var newLayer in newLayers)
                {
                    newLayer.CopySettings(oldLayer, copyGuid: false);
                    newLayer.OnChanged += layer_OnChanged;
                }
                layers.InsertRange(index, newLayers);

                oldLayer.OnChanged -= layer_OnChanged;
                layers.Remove(oldLayer);
            }
            else
            {
                throw new InvalidOperationException($"Cannot replace layer '{oldLayer.Name}' with multiple layers, old layer not found");
            }
            OnLayersChanged?.Invoke(this, EventArgs.Empty);
        }
Ejemplo n.º 11
0
        private void sortLayer(EditorStoryboardLayer layer)
        {
            var initialIndex = layers.IndexOf(layer);

            if (initialIndex < 0)
            {
                new InvalidOperationException($"Layer '{layer.Name}' cannot be found");
            }

            var newIndex = initialIndex;

            while (newIndex > 0 && layer.CompareTo(layers[newIndex - 1]) < 0)
            {
                newIndex--;
            }
            while (newIndex < layers.Count - 1 && layer.CompareTo(layers[newIndex + 1]) > 0)
            {
                newIndex++;
            }

            layers.Move(initialIndex, newIndex);
            OnLayersChanged?.Invoke(this, EventArgs.Empty);
        }
Ejemplo n.º 12
0
 /// <summary>
 /// Used at load time to let the effect know about placeholder layers it should use.
 /// </summary>
 public abstract void AddPlaceholder(EditorStoryboardLayer layer);
Ejemplo n.º 13
0
        /// <summary>
        /// Should only be called by Project.QueueEffectUpdate(Effect).
        /// Doesn't run on the main thread.
        /// </summary>
        public override void Update()
        {
            if (!scriptContainer.HasScript)
            {
                return;
            }

            var newDependencyWatcher = new MultiFileWatcher();

            newDependencyWatcher.OnFileChanged += (sender, e) =>
            {
                if (IsDisposed)
                {
                    return;
                }
                Refresh();
            };

            var context = new EditorGeneratorContext(this, Project.ProjectFolderPath, Project.MapsetPath, Project.MainBeatmap, Project.MapsetManager.Beatmaps, newDependencyWatcher);
            var success = false;

            try
            {
                changeStatus(EffectStatus.Loading);
                var script = scriptContainer.CreateScript();

                changeStatus(EffectStatus.Configuring);
                Program.RunMainThread(() =>
                {
                    beatmapDependant = true;
                    if (script.Identifier != configScriptIdentifier)
                    {
                        script.UpdateConfiguration(Config);
                        configScriptIdentifier = script.Identifier;

                        RaiseConfigFieldsChanged();
                    }
                    else
                    {
                        script.ApplyConfiguration(Config);
                    }
                });

                changeStatus(EffectStatus.Updating);
                script.Generate(context);
                foreach (var layer in context.EditorLayers)
                {
                    layer.PostProcess();
                }

                success = true;
            }
            catch (RemotingException e)
            {
                Debug.Print($"Script execution failed with RemotingException, reloading {BaseName} ({e.Message})");
                changeStatus(EffectStatus.ReloadPending);
                Program.Schedule(() =>
                {
                    if (Project.IsDisposed)
                    {
                        return;
                    }
                    scriptContainer.ReloadScript();
                });
                return;
            }
            catch (ScriptCompilationException e)
            {
                Debug.Print($"Script compilation failed for {BaseName}\n{e.Message}");
                changeStatus(EffectStatus.CompilationFailed, e.Message, context.Log);
                return;
            }
            catch (ScriptLoadingException e)
            {
                Debug.Print($"Script load failed for {BaseName}\n{e.ToString()}");
                changeStatus(EffectStatus.LoadingFailed, e.InnerException != null ? $"{e.Message}: {e.InnerException.Message}" : e.Message, context.Log);
                return;
            }
            catch (Exception e)
            {
                changeStatus(EffectStatus.ExecutionFailed, getExecutionFailedMessage(e), context.Log);
                return;
            }
            finally
            {
                if (!success)
                {
                    if (dependencyWatcher != null)
                    {
                        dependencyWatcher.Watch(newDependencyWatcher.WatchedFilenames);
                        newDependencyWatcher.Dispose();
                        newDependencyWatcher = null;
                    }
                    else
                    {
                        dependencyWatcher = newDependencyWatcher;
                    }
                }
                context.DisposeResources();
            }
            changeStatus(EffectStatus.Ready, null, context.Log);

            Program.Schedule(() =>
            {
                if (IsDisposed)
                {
                    newDependencyWatcher.Dispose();
                    return;
                }

                beatmapDependant = context.BeatmapDependent;
                dependencyWatcher?.Dispose();
                dependencyWatcher = newDependencyWatcher;

                if (Project.IsDisposed)
                {
                    return;
                }

                if (placeHolderLayer != null)
                {
                    Project.LayerManager.Replace(placeHolderLayer, context.EditorLayers);
                    placeHolderLayer = null;
                }
                else
                {
                    Project.LayerManager.Replace(layers, context.EditorLayers);
                }
                layers = context.EditorLayers;
                refreshLayerNames();
                refreshEstimatedSize();
            });
        }
Ejemplo n.º 14
0
 public void Add(EditorStoryboardLayer layer)
 {
     layers.Insert(findLayerIndex(layer), layer);
     layer.OnChanged += layer_OnChanged;
     OnLayersChanged?.Invoke(this, EventArgs.Empty);
 }