public override void OnGUI(Rect rect)
    {
        //GUILayout.Label("Popup Options Example", EditorStyles.boldLabel);
        startIndex  = EditorGUILayout.IntField("Insert at index", startIndex);
        numElements = EditorGUILayout.IntField("Num Elements", numElements);
        startCoord  = EditorGUILayout.Vector3Field("Initial position", startCoord);
        spacing     = EditorGUILayout.Vector3Field("Spacing", spacing);

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Key", GUILayout.MinWidth(30));
        key = (DrumSequence.DrumKey)EditorGUILayout.EnumPopup(key);
        EditorGUILayout.EndHorizontal();

        if (GUILayout.Button("Autofill to build from last coord"))
        {
            startIndex = sequence.keys.Count;
            startCoord = sequence.coords[startIndex - 1] + spacing;
        }

        if (GUILayout.Button("Generate!"))
        {
            sequence = GenerateAtIndex(startIndex);
            //Some sort of callback to reassign the new Sequence to the asset it came from?
            //Nope! since it's a reference type,
        }
    }
Example #2
0
 public virtual void Initialize(
     DrumSequence firstSequence,
     int selfIndex,
     OnSequenceComplete sequenceCallback,
     List <Color> colorMap)
 {
 }
Example #3
0
 protected void LabelDrumPrompts(DrumSequence next)
 {
     for (int i = 0; i < prompts.Count; i++)
     {
         prompts[i].SetText(((int)next.keys[i]).ToString());
     }
 }
    private int DrawListSizeField(DrumSequence sequence, int listSize)
    {
        EditorGUILayout.PrefixLabel("Num elements");
        EditorGUI.BeginChangeCheck();
        listSize = EditorGUILayout.DelayedIntField(listSize);
        if (EditorGUI.EndChangeCheck())
        {
            while (sequence.keys.Count < listSize)
            {
                sequence.keys.Add(DrumSequence.DrumKey.One);
            }

            while (sequence.keys.Count > listSize)
            {
                sequence.keys.RemoveAt(sequence.keys.Count - 1);
            }

            while (sequence.coords.Count < listSize)
            {
                sequence.coords.Add(Vector3.zero);
            }

            while (sequence.coords.Count > listSize)
            {
                sequence.coords.RemoveAt(sequence.coords.Count - 1);
            }
        }

        return(listSize);
    }
 private static void DrawIndexColumn(DrumSequence sequence)
 {
     for (int i = 0; i < sequence.keys.Count; i++)
     {
         EditorGUILayout.LabelField($"{i}", GUILayout.MinWidth(50));
     }
 }
Example #6
0
 public void LoadSequence(DrumSequence next)
 {
     //NOTE: ForceNotify is very useful here, in case [next] is the same as the current sequence!
     //We may need to add many more ForceNotify calls around these managers
     //Bruce says making the sequence an Observable instead of a ReactiveProperty would also work
     reactiveSequence.SetValueAndForceNotify(next);
     sequenceIndex.SetValueAndForceNotify(0);
 }
 private static void DrawCoordinatesColumn(DrumSequence sequence)
 {
     EditorGUILayout.PrefixLabel("Coords");
     for (int i = 0; i < sequence.coords.Count; i++)
     {
         sequence.coords[i] = EditorGUILayout.Vector3Field("", sequence.coords[i], GUILayout.MinWidth(80));
     }
 }
 private static void DrawKeySelectionColumn(DrumSequence sequence)
 {
     EditorGUILayout.LabelField("Keys", GUILayout.MinWidth(20));
     for (int i = 0; i < sequence.keys.Count; i++)
     {
         sequence.keys[i] = (DrumSequence.DrumKey)EditorGUILayout.EnumPopup(sequence.keys[i], GUILayout.Width(80));
     }
 }
Example #9
0
 protected void ColorDrumPrompts(DrumSequence next)
 {
     for (int i = 0; i < prompts.Count; i++)
     {
         int keyCode = (int)next.keys[i] - 1; //Enum is 1-indexed
         prompts[i].SetColor(colorMap[keyCode]);
     }
 }
    public override void Initialize(DrumSequence firstSequence, int selfIndex, OnSequenceComplete sequenceCallback, List <Color> colorMap)
    {
        this.selfIndex           = selfIndex;
        sequenceCompleteCallback = sequenceCallback;

        uiParent = transform.GetChild(0).gameObject;

        mainCamera             = Camera.main;
        originalCameraPosition = mainCamera.transform.localPosition;

        segmentHighlighter.Initialize();

        prompts = new List <DrumGamePrompt>();
        promptPrefab.SetActive(false);

        this.colorMap = colorMap;

        reactiveSequence = new ReactiveProperty <DrumSequence>(firstSequence);
        sequenceIndex    = new IntReactiveProperty(0);

        isVisible = new BoolReactiveProperty();
        isActive  = new BoolReactiveProperty();

        isActive.Subscribe(active => ToggleActivePromptHighlight(active));
        isActive.Subscribe(active => firstFrameActive = active);
        isActive.Subscribe(active => SetCamToOriginOnDisable(active));

        isVisible.Subscribe(visible => SetVisibility(visible));

        reactiveSequence.Subscribe(sequence => SetHiddenState(sequence));
        reactiveSequence.Subscribe(sequence => SpawnAndArrangePrompts(sequence));
        reactiveSequence.Subscribe(sequence => LabelDrumPrompts(sequence));
        reactiveSequence.Subscribe(sequence => ColorDrumPrompts(sequence));
        reactiveSequence.Subscribe(sequence => SetRepeatsValue(sequence));
        reactiveSequence.Subscribe(delegate { if (cameraZoomingOutCoroutine != null)
                                              {
                                                  StopCoroutine(cameraZoomingOutCoroutine);
                                              }
                                   });
        if (lineEditor != null)
        {
            reactiveSequence.Subscribe(sequence => lineEditor.SetSequence(sequence));
        }

        sequenceIndex.Subscribe(index => SetPromptHighlight(index));
        sequenceIndex.Subscribe(index => AnimateCameraFollow(index));

        var toggleEditStream = Observable.EveryUpdate().Where(_ => Input.GetKeyDown(toggleEditingKey));

        toggleEditStream.Subscribe(_ => editing = !editing);
        toggleEditStream.Subscribe(_ => lineEditor.isEditing.Value = editing);
        toggleEditStream.Subscribe(_ => Debug.Log($"Line mode Editing set to {editing}"));

        if (lineEditor != null)
        {
            lineEditor.SetPromptsRef(prompts);
        }
    }
Example #11
0
    private DrumSequence DeleteFromIndex(int firstIndex)
    {
        DrumSequence newCopy = sequence.Clone();

        newCopy.keys.RemoveRange(firstIndex, numElements);
        newCopy.coords.RemoveRange(firstIndex, numElements);

        return(newCopy);
    }
Example #12
0
    public override void OnGUI(Rect rect)
    {
        startIndex  = EditorGUILayout.IntField("Start index", startIndex);
        numElements = EditorGUILayout.IntField("Num elements", numElements);

        if (GUILayout.Button("Delete!"))
        {
            sequence = DeleteFromIndex(startIndex);
        }
    }
Example #13
0
    private void InitializeLineManager()
    {
        //Valid but empty state so the LineManager hides itself until loaded
        DrumSequence nullSequence = new DrumSequence();

        nullSequence.keys        = new List <DrumSequence.DrumKey>();
        nullSequence.repetitions = 0;
        nullSequence.coords      = new List <Vector3> {
            Vector3.zero
        };

        lineManager.Initialize(nullSequence, -1, OnSequenceComplete, colorMap);

        lineManager.SetEventTriggerCallbacks(InvokeOnProgress, InvokeOnFinishRepetition, InvokeOnMistake);
    }
Example #14
0
    public DrumSequence Clone()
    {
        //Need to make sure these are all treated as value types... Lists of enums??
        //If not we need some more mojo to deep copy the lists and their elements
        DrumSequence clone = ScriptableObject.Instantiate(this);

        clone.type            = this.type;
        clone.keys            = this.keys;
        clone.repetitions     = this.repetitions;
        clone.coords          = this.coords;
        clone.zoomoutPosition = this.zoomoutPosition;
        clone.showLine        = this.showLine;

        return(clone);
    }
Example #15
0
    private DrumSequence GenerateAtIndex(int firstIndex)
    {
        //Treating these as immutable gives us quick access to Undo functionality which we probably want
        //List<DrumSequence.DrumKey> newKeys = new List<DrumSequence.DrumKey>(sequence.keys.Count);
        //List<Vector3> newCoords = new List<Vector3>(sequence.coords.Count);

        //newKeys = (List<DrumSequence.DrumKey>)sequence.keys.Select(_ => sequence.Clone().keys);
        //newCoords = (List<Vector3>)sequence.coords.Select(_ => sequence.Clone().coords);

        DrumSequence newCopy = sequence.Clone();

        for (int i = 0; i < numElements; i++)
        {
            Vector3 coordinate = startCoord + (spacing * i);
            newCopy.keys.Insert(firstIndex + i, key);
            newCopy.coords.Insert(firstIndex + i, coordinate);
        }

        return(newCopy);
    }
    private IntReactiveProperty repeatsRemaining; //iterations left before advancing levelIndex

    public override void Initialize(DrumSequence firstSequence, int selfIndex, OnSequenceComplete sequenceCallback, List <Color> colorMap)
    {
        this.selfIndex           = selfIndex;
        sequenceCompleteCallback = sequenceCallback;

        uiParent = transform.GetChild(0).gameObject;

        prompts = new List <DrumGamePrompt>();
        promptPrefab.SetActive(false);

        this.colorMap = colorMap;

        arcHighlighter.Initialize();

        reactiveSequence = new ReactiveProperty <DrumSequence>(firstSequence);
        repeatsRemaining = new IntReactiveProperty(reactiveSequence.Value.repetitions);
        sequenceIndex    = new IntReactiveProperty(0);

        isVisible = new BoolReactiveProperty();
        isActive  = new BoolReactiveProperty();

        isActive.Subscribe(active => ToggleActivePromptHighlight(active));
        isActive.Subscribe(active => firstFrameActive = active);
        isVisible.Subscribe(visible => SetVisibility(visible));

        reactiveSequence.Subscribe(sequence => SetHiddenState(sequence));
        reactiveSequence.Subscribe(sequence => SpawnAndArrangePrompts(sequence));
        reactiveSequence.Subscribe(sequence => LabelDrumPrompts(sequence));
        reactiveSequence.Subscribe(sequence => ColorDrumPrompts(sequence));
        reactiveSequence.Subscribe(sequence => SetRepeatsValue(sequence));
        reactiveSequence.Subscribe(sequence => arcHighlighter.DrawArcs(sequence.keys.Count));

        sequenceIndex.Subscribe(index => SetPromptHighlight(index));

        repeatsRemaining.Subscribe(remaining => SetRepeatsText(remaining));

        baseX = highlightPivotT.rotation.eulerAngles.x;
        baseY = highlightPivotT.rotation.eulerAngles.y;
    }
Example #17
0
    public void SetSequence(DrumSequence next)
    {
        if (next == null)
        {
            return;
        }

        currentSequence = next;

        if (currentSequence.showLine == null || currentSequence.showLine.Count != currentSequence.coords.Count)
        {
            currentSequence.showLine = new List <bool>(currentSequence.coords.Count);
            while (currentSequence.showLine.Count < currentSequence.coords.Count)
            {
                currentSequence.showLine.Add(true);
            }
        }

        //Debug.Log($"currentSequence name = {currentSequence.name}");
        //Debug.Log($"currentSequence coords count = {currentSequence.coords.Count}");
        //Debug.Log($"currentSequence showLine count = {currentSequence.showLine.Count}");
    }
    protected override void SpawnAndArrangePrompts(DrumSequence next)
    {
        if (next.type != DrumSequence.SequenceType.Circle)
        {
            return;
        }

        //Add needed prompts
        while (prompts.Count < next.keys.Count)
        {
            GameObject promptObj = Instantiate(promptPrefab, wheelPivotT);
            promptObj.SetActive(true);
            DrumGamePrompt prompt = promptObj.GetComponent <DrumGamePrompt>();
            prompt.SetHighlightVisible(false);
            prompts.Add(prompt);
        }

        //Remove extras
        while (prompts.Count > next.keys.Count)
        {
            DrumGamePrompt last = prompts[prompts.Count - 1];
            prompts.Remove(last);
            Destroy(last.gameObject);
        }

        //Arrange around a circle
        float radius = promptPrefab.transform.localPosition.y;

        for (int i = 0; i < prompts.Count; i++)
        {
            float phaseRadians = ((i / (float)prompts.Count) * 360f) * Mathf.Deg2Rad;
            float x            = radius * Mathf.Sin(phaseRadians);
            float y            = radius * Mathf.Cos(phaseRadians);

            prompts[i].transform.localPosition = new Vector3(x, y, 0);
        }
    }
    protected override void SpawnAndArrangePrompts(DrumSequence next)
    {
        if (next.type != DrumSequence.SequenceType.Line)
        {
            return;
        }

        //Add needed prompts
        while (prompts.Count < next.keys.Count)
        {
            GameObject promptObj = Instantiate(promptPrefab, this.transform);
            promptObj.SetActive(true);
            promptObj.transform.SetParent(promptParent.transform);
            DrumGamePrompt prompt = promptObj.GetComponent <DrumGamePrompt>();
            prompt.SetIndex(prompts.Count);
            prompt.SetHighlightVisible(false);
            prompts.Add(prompt);
        }

        //Remove extras
        while (prompts.Count > next.keys.Count)
        {
            DrumGamePrompt last = prompts[prompts.Count - 1];
            prompts.Remove(last);
            Destroy(last.gameObject);
        }

        //Arrange according to coordinate info

        for (int i = 0; i < prompts.Count; i++)
        {
            prompts[i].transform.localPosition = next.coords[i];
        }

        segmentHighlighter.DrawSegments(next.coords, next.showLine);
    }
 protected override void SetRepeatsValue(DrumSequence next)
 {
     //Unused by this class
 }
Example #21
0
 public DrumSequenceGenerationPopup(DrumSequence sequence)
 {
     this.sequence = sequence;
 }
Example #22
0
    public override void OnInspectorGUI()
    {
        DrumSequence sequence = (DrumSequence)target;

        if (sequence.type == DrumSequence.SequenceType.Circle)
        {
            base.OnInspectorGUI();
        }
        else
        {
            int listSize = sequence.keys.Count;

            sequence.type = (DrumSequence.SequenceType)EditorGUILayout.EnumPopup("Sequence Type", sequence.type);

            sequence.zoomoutPosition = EditorGUILayout.Vector3Field("Zoomout Position", sequence.zoomoutPosition);

            if (GUILayout.Button("Generate elements"))
            {
                PopupWindow.Show(buttonRect, new DrumSequenceGenerationPopup(sequence));
            }

            if (GUILayout.Button("Delete elements"))
            {
                PopupWindow.Show(buttonRect, new DrumSequenceDeletionPopup(sequence));
            }

            if (Event.current.type == EventType.Repaint)
            {
                buttonRect = GUILayoutUtility.GetLastRect();
            }

            //List size field

            EditorGUILayout.BeginHorizontal();
            listSize = DrawListSizeField(sequence, listSize);
            EditorGUILayout.EndHorizontal();

            //Layout and padding for 3 columns

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.BeginVertical();
            EditorGUILayout.Space();
            EditorGUILayout.Space();
            EditorGUILayout.Space();

            //Index label column

            DrawIndexColumn(sequence);
            EditorGUILayout.EndVertical();

            //Prompt key selection popup column

            EditorGUILayout.BeginVertical();
            DrawKeySelectionColumn(sequence);
            EditorGUILayout.EndVertical();

            //Coordinates column

            EditorGUILayout.BeginVertical(GUILayout.MinWidth(200));
            DrawCoordinatesColumn(sequence);

            EditorGUILayout.EndVertical();

            EditorGUILayout.EndHorizontal();
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(sequence);
        }
    }
Example #23
0
 protected virtual void SpawnAndArrangePrompts(DrumSequence next)
 {
 }
Example #24
0
 protected void SetHiddenState(DrumSequence next)
 {
     isVisible.Value = (next.keys.Count > 0 || next.repetitions > 0);
 }
Example #25
0
 public DrumSequenceDeletionPopup(DrumSequence sequence)
 {
     this.sequence = sequence;
 }
 protected override void SetRepeatsValue(DrumSequence next)
 {
     repeatsRemaining.Value = next.repetitions;
 }
Example #27
0
 protected virtual void SetRepeatsValue(DrumSequence next)
 {
 }