private void Start() { toggle = GetComponentInChildren <Toggle>(); patternHandler = GetComponentInParent <PatternHandler>(); EventTrigger trigger = toggle.gameObject.AddComponent <EventTrigger>(); EventTrigger.Entry entry1 = new EventTrigger.Entry { eventID = EventTriggerType.PointerEnter }; entry1.callback.AddListener((data) => { OnMouseEnter_fun((PointerEventData)data); }); print(trigger); print(trigger.triggers); print(entry1); trigger.triggers.Add(entry1); EventTrigger.Entry entry2 = new EventTrigger.Entry(); entry2.eventID = EventTriggerType.PointerExit; entry2.callback.AddListener((data) => { OnMouseExit_fun(); }); trigger.triggers.Add(entry2); toggle.onValueChanged.AddListener(delegate { patternHandler.SetSequencerNote(toggle); }); }
protected override void RenderToCanvas(CommandList cl) { cl.SetFramebuffer(Canvas.FrameBuffer); cl.ClearColorTarget(0, RgbaFloat.Clear); Matrix4x4 mvp = Matrix4x4.Identity * Matrix4x4.CreateScale(2, 2, 1) * Matrix4x4.CreateScale(1.0f / this.Canvas.Width, 1.0f / this.Canvas.Height, 1) * Matrix4x4.CreateTranslation(-1, -1, 0) * Matrix4x4.CreateScale(1, -1, 1); GraphicsDevice.UpdateBuffer(ProjMatrix, 0, ref mvp); cl.SetPipeline(Pipeline); cl.SetGraphicsResourceSet(0, MainResourceSet); foreach (var x in Buffers) { x.Reset(); } PatternHandler.Update(); var viewFrame = PatternHandler.ViewFrame; var canvasSize = ImGui.GetItemRectSize(); Rectangle ScaleRectSides(Rectangle rect) { return(new Rectangle( (float)(viewFrame.TransformYToOutside(rect.Top) * canvasSize.Y), (float)(viewFrame.TransformXToOutside(rect.Right) * canvasSize.X), (float)(viewFrame.TransformYToOutside(rect.Bottom) * canvasSize.Y), (float)(viewFrame.TransformXToOutside(rect.Left) * canvasSize.X) )); } bool QuadVisible(Rectangle rect) { return(rect.Top < canvasSize.Y && rect.Bottom > 0 && rect.Left < canvasSize.X && rect.Right > 0); } void PushQuad(int bufferIdx, Rectangle rect, RgbaFloat col) { if (!QuadVisible(rect)) { return; } float top = (float)rect.Top, bottom = (float)rect.Bottom, left = (float)rect.Left, right = (float)rect.Right; var buffer = Buffers[bufferIdx]; buffer.Push(cl, new VertexPositionColor(new Vector2(left, top), col)); buffer.Push(cl, new VertexPositionColor(new Vector2(right, top), col)); buffer.Push(cl, new VertexPositionColor(new Vector2(right, bottom), col)); buffer.Push(cl, new VertexPositionColor(new Vector2(left, bottom), col)); } void PushSelectionRectangle(Rectangle rect) { var scaled = ScaleRectSides(rect); PushQuad(0, scaled, new RgbaFloat(0.8f, 0.2f, 0.2f, 0.7f)); } void PushNote(int note, Rectangle rect, RgbaFloat col) { var borderCol = new RgbaFloat(col.ToVector4() * new Vector4(0.4f, 0.4f, 0.4f, 1)); rect = ScaleRectSides(rect); PushQuad(note + 1, rect, borderCol); rect.Top += 1; rect.Bottom -= 1; rect.Right -= 1; rect.Left += 1; if (rect.IsValid) { PushQuad(note + 1, rect, col); } } var pattern = PatternHandler.Pattern; var nc = 0; var renderLeft = viewFrame.EaseLeft; Parallel.For(0, pattern.Notes.Length, key => { var noteKey = pattern.Notes[key]; int noteOffset = FirstRenderNote[key]; if (LastRenderLeft > renderLeft) { for (noteOffset = 0; noteOffset < noteKey.Count; noteOffset++) { if (noteKey[noteOffset].End > renderLeft) { break; } } FirstRenderNote[key] = noteOffset; } else if (LastRenderLeft < renderLeft) { for (; noteOffset < noteKey.Count; noteOffset++) { if (noteKey[noteOffset].End > renderLeft) { break; } } FirstRenderNote[key] = noteOffset; } //foreach(var note in noteKey) if (viewFrame.TransformYToOutside(key + 1) < 0 || viewFrame.TransformYToOutside(key) > 1) { return; } for (int i = noteOffset; i < noteKey.Count; i++) { var note = noteKey[i]; var rect = new Rectangle(key, (float)note.End, key + 1, (float)note.Start); if (viewFrame.TransformXToOutside(rect.Left) > 1) { break; } if (viewFrame.TransformXToOutside(rect.Right) < 0) { continue; } // Don't render selected notes yet, render them in the next pass if (PatternHandler.IsNoteSelected(note)) { continue; } var isSelected = false; if (PatternHandler.IsNoteInSelectionRectangle(note, key)) { isSelected = true; } var noteCol = new RgbaFloat(0.2f, 0.2f, 0.9f, 1); if (isSelected) { noteCol = new RgbaFloat(0.9f, 0.2f, 0.2f, 1); } Interlocked.Increment(ref nc); PushNote(key, rect, noteCol); } }); LastRenderLeft = renderLeft; var selectionPosOffset = PatternHandler.SelectionPosOffset; foreach (var selected in PatternHandler.SelectedNotes) { var note = selected.Note; var key = selected.Key; var noteCol = new RgbaFloat(0.9f, 0.2f, 0.2f, 1); PushNote(key, new Rectangle(key, (float)note.End, key + 1, (float)note.Start).OffsetBy(selectionPosOffset), noteCol); } if (PatternHandler.SelectionRectangle != null) { nc++; PushSelectionRectangle(PatternHandler.SelectionRectangle ?? new Rectangle()); } foreach (var x in Buffers) { x.Flush(cl); } ImGui.SetCursorPos(ImGui.GetCursorStartPos()); ImGui.Text($"Notes rendering: {nc}"); ImGui.Text($"Selected notes: {PatternHandler.SelectedNotes.Count()}"); }
// Use this for initialization void Start() { patternHandler = GetComponentInParent <PatternHandler>(); }