public void RenderTask(TaskHistoryData data, float startingTime)
    {
        if (data == null)
        {
            return;
        }

        float currentTime = Time.timeSinceLevelLoad;

        float startTimeSnapToWindow = Mathf.Max(data.startTime, startingTime);
        float startingPixel         = (startTimeSnapToWindow - startingTime) * pixelPerSecond;

        float elpasedTime = data.endTime - startTimeSnapToWindow;

        if (data.endTime == 0)
        {
            elpasedTime = currentTime - startTimeSnapToWindow;
        }

        float width = elpasedTime * pixelPerSecond;

        GUI.contentColor = Color.white;
        GUI.Box(new Rect(
                    horizontalOffset + startingPixel,
                    10 + taskHeight * data.priority,
                    width,
                    taskHeight
                    ), data.name);
    }
    public void RegisterTask(int ID, string name, int priority, string origin, TaskType type)
    {
        // Debugging data
        TaskHistoryData historyTaskData = new TaskHistoryData();

        historyTaskData.ID        = ID;
        historyTaskData.name      = name;
        historyTaskData.startTime = Time.timeSinceLevelLoad;
        historyTaskData.priority  = priority;
        historyTaskData.origin    = origin;
        historyTaskData.taskType  = type;
        historyData.Add(historyTaskData);
    }
    public TaskHistoryData GetActiveTaskAtTime(float time)
    {
        int             highestPriorityTask = -1;
        TaskHistoryData activeTask          = null;

        foreach (TaskHistoryData data in historyData)
        {
            if (time > data.startTime && (time < data.endTime || data.endTime == 0))
            {
                if (data.priority > highestPriorityTask)
                {
                    highestPriorityTask = data.priority;
                    activeTask          = data;
                }
            }
        }

        return(activeTask);
    }
    public void OnGUI()
    {
        // Task debugger
        if (UnityEditor.Selection.activeGameObject != mGameObject)
        {
            return;
        }

        float currentTime  = Time.timeSinceLevelLoad;
        float startingTime = currentTime;

        foreach (TaskHistoryData data in historyData)
        {
            if (data.startTime < startingTime)
            {
                startingTime = data.startTime;
            }
        }


        float timeFitsOnScreen = (Screen.width - horizontalOffset * 2) / pixelPerSecond;
        float maxStartingTime  = currentTime - timeFitsOnScreen;

        startingTime = Mathf.Max(maxStartingTime, startingTime);

        int maxPriority = 0;

        foreach (TaskHistoryData data in historyData)
        {
            if (data.endTime > 0 && data.endTime < startingTime)
            {
                continue;
            }

            if (data.priority > maxPriority)
            {
                maxPriority = data.priority;
            }

            RenderTask(data, startingTime);
        }

        float verticalOffset = 0.0f;

        foreach (SignalHistoryData data in signalData)
        {
            if (data.time < startingTime)
            {
                continue;
            }

            RenderSignal(data, startingTime, verticalOffset);

            verticalOffset += 60.0f;
            if (verticalOffset >= 300.0f)
            {
                verticalOffset = 0.0f;
            }
        }

        // Draw basic lines
        GUI.DrawTexture(new Rect(horizontalOffset, 10, timeFitsOnScreen * pixelPerSecond, 3), Texture2D.whiteTexture, ScaleMode.StretchToFill);
        GUI.DrawTexture(new Rect(horizontalOffset, 10, 3, taskHeight * 5), Texture2D.whiteTexture, ScaleMode.StretchToFill);

        GUI.DrawTexture(new Rect(horizontalOffset + (currentTime - startingTime) * pixelPerSecond, 10, 1, taskHeight * 5), Texture2D.whiteTexture, ScaleMode.StretchToFill);

        // Draw mouse line
        Vector2 screenPos       = Event.current.mousePosition;
        Vector2 convertedGUIPos = GUIUtility.ScreenToGUIPoint(screenPos);

        convertedGUIPos.x = Mathf.Clamp(convertedGUIPos.x, horizontalOffset, Screen.width - horizontalOffset * 2);

        GUI.DrawTexture(new Rect(convertedGUIPos.x, 10, 1, taskHeight * 8), Texture2D.whiteTexture, ScaleMode.StretchToFill);

        // Draw active task at mouse time
        float           timeAtMouse = startingTime + (convertedGUIPos.x - horizontalOffset) / pixelPerSecond;
        TaskHistoryData taskAtMouse = GetActiveTaskAtTime(timeAtMouse);

        RenderTask(taskAtMouse, startingTime);

        // Draw timestamp
        TimeSpan timeSpan   = TimeSpan.FromSeconds(timeAtMouse);
        string   timeAsText = String.Format("{0:00}:{1:00}:{2:000}", timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds);

        if (taskAtMouse != null)
        {
            timeAsText += "\n" + taskAtMouse.name + "\nOrigin: " + taskAtMouse.origin + "\nEnd: " + taskAtMouse.end;;
        }

        GUI.contentColor = Color.black;
        GUI.Label(new Rect(convertedGUIPos.x, taskHeight * 8 + 10, 600, 100), timeAsText);
    }