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, } }
public virtual void Initialize( DrumSequence firstSequence, int selfIndex, OnSequenceComplete sequenceCallback, List <Color> colorMap) { }
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)); } }
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)); } }
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); } }
private DrumSequence DeleteFromIndex(int firstIndex) { DrumSequence newCopy = sequence.Clone(); newCopy.keys.RemoveRange(firstIndex, numElements); newCopy.coords.RemoveRange(firstIndex, numElements); return(newCopy); }
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); } }
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); }
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); }
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; }
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 }
public DrumSequenceGenerationPopup(DrumSequence sequence) { this.sequence = sequence; }
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); } }
protected virtual void SpawnAndArrangePrompts(DrumSequence next) { }
protected void SetHiddenState(DrumSequence next) { isVisible.Value = (next.keys.Count > 0 || next.repetitions > 0); }
public DrumSequenceDeletionPopup(DrumSequence sequence) { this.sequence = sequence; }
protected override void SetRepeatsValue(DrumSequence next) { repeatsRemaining.Value = next.repetitions; }
protected virtual void SetRepeatsValue(DrumSequence next) { }