예제 #1
0
파일: Note.cs 프로젝트: nuang-ee/MarchCat
    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);
        });
    }
예제 #2
0
        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()}");
        }
예제 #3
0
 // Use this for initialization
 void Start()
 {
     patternHandler = GetComponentInParent <PatternHandler>();
 }