public override void _Process(float delta)
    {
        // Zylann's example :D
        if (ZylannExample)
        {
            var time       = OS.GetTicksMsec() / 1000f;
            var box_pos    = new Vector3(0, Mathf.Sin(time * 4f), 0);
            var line_begin = new Vector3(-1, Mathf.Sin(time * 4f), 0);
            var line_end   = new Vector3(1, Mathf.Cos(time * 4f), 0);

            DebugDraw.DrawBox(box_pos, new Vector3(1, 2, 1), new Color(0, 1, 0), 0, false); // Box need to be NOT centered
            DebugDraw.DrawLine3D(line_begin, line_end, new Color(1, 1, 0));
            DebugDraw.SetText("Time", time);
            DebugDraw.SetText("Frames drawn", Engine.GetFramesDrawn());
            DebugDraw.SetText("FPS", Engine.GetFramesPerSecond());
            DebugDraw.SetText("delta", delta);
            return;
        }


        // Enable FPSGraph
        DebugDraw.FPSGraphEnabled       = true;
        DebugDraw.FPSGraphShowTextFlags = DebugDraw.FPSGraphTextFlags.Current | DebugDraw.FPSGraphTextFlags.Max | DebugDraw.FPSGraphTextFlags.Min;
        DebugDraw.FPSGraphSize          = new Vector2(200, 32);

        // Debug for debug
        DebugDraw.Freeze3DRender          = Input.IsActionPressed("ui_accept");
        DebugDraw.ForceUseCameraFromScene = Input.IsActionPressed("ui_up");
        DebugDraw.DebugEnabled            = !Input.IsActionPressed("ui_down");

        // Zones
        var col = Colors.Black;

        foreach (Spatial z in GetNode <Spatial>("Zones").GetChildren())
        {
            DebugDraw.DrawBox(z.GlobalTransform, col);
        }

        // Spheres
        {
            DebugDraw.DrawSphere(GetNode <Spatial>("SphereTransform").GlobalTransform, Colors.Crimson);
            DebugDraw.DrawSphere(GetNode <Spatial>("SpherePosition").GlobalTransform.origin, 2, Colors.BlueViolet);
        }

        // Cylinders
        {
            DebugDraw.DrawCylinder(GetNode <Spatial>("Cylinder1").GlobalTransform, Colors.Crimson);
            DebugDraw.DrawCylinder(GetNode <Spatial>("Cylinder2").GlobalTransform.origin, 1, 2, Colors.Red);
        }

        // Boxes
        {
            DebugDraw.DrawBox(GetNode <Spatial>("Box1").GlobalTransform, Colors.Purple);
            DebugDraw.DrawBox(GetNode <Spatial>("Box2").GlobalTransform.origin, Vector3.One, Colors.RebeccaPurple);
            DebugDraw.DrawBox(GetNode <Spatial>("Box3").GlobalTransform.origin, new Quat(Vector3.Up, Mathf.Pi * 0.25f), Vector3.One * 2, Colors.RosyBrown);

            var r = GetNode <Spatial>("AABB");
            DebugDraw.DrawAABB(r.GetChild <Spatial>(0).GlobalTransform.origin, r.GetChild <Spatial>(1).GlobalTransform.origin, Colors.DeepPink);

            DebugDraw.DrawAABB(new AABB(GetNode <Spatial>("AABB_fixed").GlobalTransform.origin, new Vector3(2, 1, 2)), Colors.Aqua);
        }

        // Lines
        {
            var target = GetNode <Spatial>("Lines/Target");
            DebugDraw.DrawBillboardSquare(target.GlobalTransform.origin, 0.5f, Colors.Red);

            // Normal
            {
                DebugDraw.DrawLine3D(GetNode <Spatial>("Lines/1").GlobalTransform.origin, target.GlobalTransform.origin, Colors.Fuchsia);
                DebugDraw.DrawRay3D(GetNode <Spatial>("Lines/3").GlobalTransform.origin, (target.GlobalTransform.origin - GetNode <Spatial>("Lines/3").GlobalTransform.origin).Normalized(), 3f, Colors.Crimson);
            }

            // Arrow
            {
                DebugDraw.DrawArrowLine3D(GetNode <Spatial>("Lines/2").GlobalTransform.origin, target.GlobalTransform.origin, Colors.Blue);
                DebugDraw.DrawArrowRay3D(GetNode <Spatial>("Lines/4").GlobalTransform.origin, (target.GlobalTransform.origin - GetNode <Spatial>("Lines/4").GlobalTransform.origin).Normalized(), 8f, Colors.Lavender);
            }

            // Path
            {
                DebugDraw.DrawLinePath3D(GetNode <Spatial>("LinePath")?.GetChildren().ToArray <Spatial>().Select((o) => o.GlobalTransform.origin).ToArray(), Colors.Beige);
                DebugDraw.DrawArrowPath3D(GetNode <Spatial>("LinePath")?.GetChildren().ToArray <Spatial>().Select((o) => o.GlobalTransform.origin + Vector3.Down).ToArray(), Colors.Gold);
            }

            DebugDraw.DrawLine3DHit(GetNode <Spatial>("Lines/5").GlobalTransform.origin, target.GlobalTransform.origin, true, Mathf.Abs(Mathf.Sin((float)DateTime.Now.TimeOfDay.TotalSeconds)), 0.25f, 0, Colors.Aqua);
        }

        // Misc
        {
            DebugDraw.DrawCameraFrustum(GetNode <Camera>("Camera"), Colors.DarkOrange);
            DebugDraw.DrawBillboardSquare(GetNode <Spatial>("Billboard").GlobalTransform.origin, 0.5f, Colors.Green);
            DebugDraw.DrawPosition3D(GetNode <Spatial>("Position").GlobalTransform, Colors.Brown);
        }

        // Text
        {
            DebugDraw.SetText("FPS", $"{Engine.GetFramesPerSecond():F2}", 0, Colors.Gold);

            DebugDraw.BeginTextGroup("-- First Group --", 2, Colors.ForestGreen);
            DebugDraw.SetText("Simple text");
            DebugDraw.SetText("Text", "Value", 0, Colors.Aquamarine);
            DebugDraw.SetText("Text out of order", null, -1, Colors.Silver);
            DebugDraw.BeginTextGroup("-- Second Group --", 1, Colors.Beige);
            DebugDraw.SetText("Rendered frames", $"{Engine.GetFramesDrawn()}");
            DebugDraw.EndTextGroup();

            DebugDraw.BeginTextGroup("-- Stats --", 3, Colors.Wheat);
            DebugDraw.SetText("Total rendered", DebugDraw.RenderCount.Total, 0);
            DebugDraw.SetText("Instances", DebugDraw.RenderCount.Instances, 1);
            DebugDraw.SetText("Wireframes", DebugDraw.RenderCount.Wireframes, 2);
            DebugDraw.EndTextGroup();
        }

        // Lag Test
        {
            if (!Engine.EditorHint && box != null)
            {
                box.Translation = start_pos + new Vector3(Mathf.Sin(OS.GetTicksMsec() / 100.0f) * 2.5f, 0, 0);
                DebugDraw.DrawBox(box.GlobalTransform.origin, Vector3.One * 2f);
            }
        }
    }