Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <cmath>
- #include "imgui.h"
- namespace ImGui {
- static void PlotTimeLine(AudioManager *audioManager) {
- DWORD i;
- float markerTimePosition;
- static float timeLineHorizontalPosition = 0.0f;
- static float timescale = 10.0;
- DWORD marksCount = audioManager->getMidiEvents()->getMarkersCount();
- DWORD roundedTotalPlayTime = (DWORD) round(audioManager->getAudio()->getTotalTime());
- BASS_MIDI_MARK *marks = audioManager->getMidiEvents()->getMarkers();
- float time = (float) audioManager->getAudio()->getTime();
- ImDrawList *draw_list = ImGui::GetWindowDrawList();
- ImVec2 canvasPosition = ImGui::GetCursorScreenPos();
- ImVec2 canvasSize = ImGui::GetContentRegionAvail();
- draw_list->PushClipRect(ImVec4(canvasPosition.x, canvasPosition.y, canvasPosition.x + canvasSize.x, canvasPosition.y + canvasSize.y));
- timeLineHorizontalPosition = -(time * timescale) + (canvasSize.x / 2.0f);
- ImGui::InvisibleButton("canvas", canvasSize);
- if (ImGui::IsItemHovered()) {
- timescale += ImGui::GetIO().MouseWheel;
- timescale = fmaxf(2.0f, timescale);
- }
- // MIDI event markers
- for (i = 0; i < marksCount; i++) {
- markerTimePosition = timescale * (float) audioManager->getAudio()->getTimeFromPosition(marks[i].pos);
- markerTimePosition += timeLineHorizontalPosition;
- draw_list->AddLine(
- ImVec2(canvasPosition.x + markerTimePosition, canvasPosition.y + 15),
- ImVec2(canvasPosition.x + markerTimePosition, canvasPosition.y + 100),
- ImColor(255, 255, 255, 255),
- 1.0f
- );
- if (ImGui::IsItemHovered()) {
- float offset = (i % 2 == 0 ? 20.0f : 0.0f);
- draw_list->AddText(
- ImVec2(canvasPosition.x + markerTimePosition, canvasPosition.y + 100 + offset),
- ImColor(255, 255, 255, 255),
- marks[i].text
- );
- }
- }
- // Current time bar
- draw_list->AddLine(ImVec2((canvasSize.x / 2) + canvasPosition.x, canvasPosition.y + 15),
- ImVec2((canvasSize.x / 2) + canvasPosition.x, canvasPosition.y + 100), ImColor(0, 255, 0, 255),
- 0.8f);
- // Time bars
- for (i = 0; i <= roundedTotalPlayTime; i++) {
- if (i % 10) {
- //every second
- draw_list->AddLine(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 15),
- ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 50),
- ImColor(255, 255, 0, 255), 0.8f);
- }
- else if (i % 60 == 0) {
- //every 60 seconds
- char str[10];
- snprintf(str, 10, "%d", i);
- draw_list->AddText(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition - 5, canvasPosition.y),
- ImColor(255, 255, 255, 255), str);
- draw_list->AddLine(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 15),
- ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 100),
- ImColor(255, 0, 0, 255), 0.8f);
- }
- else {
- //every 10 seconds
- char str[10];
- snprintf(str, 10, "%d", i);
- draw_list->AddText(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition - 5, canvasPosition.y),
- ImColor(255, 255, 255, 255), str);
- draw_list->AddLine(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 15),
- ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 75),
- ImColor(255, 255, 0, 255), 0.8f);
- }
- }
- draw_list->PopClipRect();
- }
- static void Timeline(bool *isOpen, AudioManager *audioManager) {
- //ImGui::SetNextWindowSize(ImVec2(100, 0), ImGuiSetCond_FirstUseEver);
- if (ImGui::Begin("Timeline", isOpen)) {
- PlotTimeLine(audioManager);
- }
- ImGui::End();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement