Ok it now fucking works but oh god is it ever slow

This commit is contained in:
Stepland 2023-03-17 01:49:34 +01:00
parent d4aa0f3532
commit 71bfa5ba42
9 changed files with 46 additions and 29 deletions

View File

@ -9,7 +9,6 @@
#include <variant> #include <variant>
#include "linear_view_colors.hpp" #include "linear_view_colors.hpp"
#include "linear_view_mode.hpp"
#include "marker.hpp" #include "marker.hpp"
#include "nowide/fstream.hpp" #include "nowide/fstream.hpp"
#include "variant_visitor.hpp" #include "variant_visitor.hpp"

View File

@ -728,8 +728,8 @@ void EditorState::display_file_properties() {
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) { if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) {
ImGui::BeginTooltip(); ImGui::BeginTooltip();
ImGui::TextUnformatted( ImGui::TextUnformatted(
"You must define a time selection in the vertical view first !\n" "You must define a time selection in the linear view first !\n"
"Open up 'View' > 'Vertical View' then use the Tab key to set the start, then the end" "Open up 'View' > 'Linear View' then use the Tab key to set the start, then the end"
); );
ImGui::EndTooltip(); ImGui::EndTooltip();
} }
@ -980,10 +980,18 @@ void EditorState::display_linear_view() {
if (chart_state) { if (chart_state) {
auto header_height = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2.f; auto header_height = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2.f;
ImGui::SetCursorPos({0, header_height}); ImGui::SetCursorPos({0, header_height});
const auto waveform = [&, this]() -> std::optional<waveform::Cache::const_reference_type> {
const auto full_path = this->full_audio_path();
if (not full_path) {
return {};
} else {
return waveform_cache.get(*full_path);
}
}();
LinearView::DrawArgs draw_args { LinearView::DrawArgs draw_args {
ImGui::GetWindowDrawList(), ImGui::GetWindowDrawList(),
*chart_state, *chart_state,
waveform_cache.get(song.metadata.audio), waveform,
*applicable_timing, *applicable_timing,
current_exact_beats(), current_exact_beats(),
beats_at(editable_range.end), beats_at(editable_range.end),
@ -1409,6 +1417,14 @@ void EditorState::reload_jacket() {
} }
}; };
std::optional<std::filesystem::path> EditorState::full_audio_path() {
if (not song_path.has_value() or song.metadata.audio.empty()) {
return {};
} else {
return song_path->parent_path() / song.metadata.audio;
}
}
/* /*
* Reloads music from what's indicated in the "music path" field of the song * Reloads music from what's indicated in the "music path" field of the song
* Resets the music state in case anything fails * Resets the music state in case anything fails
@ -1416,15 +1432,14 @@ void EditorState::reload_jacket() {
*/ */
void EditorState::reload_music() { void EditorState::reload_music() {
const auto status_before = get_status(); const auto status_before = get_status();
if (not song_path.has_value() or song.metadata.audio.empty()) { const auto absolute_music_path = full_audio_path();
if (not absolute_music_path) {
clear_music(); clear_music();
return; return;
} }
const auto absolute_music_path = song_path->parent_path() / song.metadata.audio;
try { try {
music.emplace(std::make_shared<OpenMusic>(absolute_music_path)); music.emplace(std::make_shared<OpenMusic>(*absolute_music_path));
waveform_cache.async_emplace(song.metadata.audio); waveform_cache.async_emplace(*absolute_music_path);
} catch (const std::exception& e) { } catch (const std::exception& e) {
clear_music(); clear_music();
} }

View File

@ -259,6 +259,8 @@ private:
TimingOrigin timing_origin(); TimingOrigin timing_origin();
std::filesystem::path assets; std::filesystem::path assets;
std::optional<std::filesystem::path> full_audio_path();
}; };
namespace feis { namespace feis {

View File

@ -2,7 +2,7 @@
#include "variant_visitor.hpp" #include "variant_visitor.hpp"
namespace linear_view { namespace linear_view::mode {
Mode load_from_v1_0_0_table(const toml::table& linear_view) { Mode load_from_v1_0_0_table(const toml::table& linear_view) {
const auto mode_string = linear_view["mode"].value<std::string>(); const auto mode_string = linear_view["mode"].value<std::string>();
if (not mode_string) { if (not mode_string) {

View File

@ -13,8 +13,8 @@ namespace linear_view {
using Mode = std::variant<mode::Beats, mode::Waveform>; using Mode = std::variant<mode::Beats, mode::Waveform>;
namespace mode { namespace mode {
linear_view::Mode load_from_v1_0_0_table(const toml::table& linear_view); Mode load_from_v1_0_0_table(const toml::table& linear_view);
void dump_as_v1_0_0(const linear_view::Mode& mode, toml::table& linear_view); void dump_as_v1_0_0(const Mode& mode, toml::table& linear_view);
} }
const Mode default_mode = mode::Beats{}; const Mode default_mode = mode::Beats{};

View File

@ -19,6 +19,7 @@ sources += files(
'imgui_extras.cpp', 'imgui_extras.cpp',
'json_decimal_handling.cpp', 'json_decimal_handling.cpp',
'linear_view_colors.cpp', 'linear_view_colors.cpp',
'linear_view_mode.cpp',
'linear_view_sizes.cpp', 'linear_view_sizes.cpp',
'ln_marker.cpp', 'ln_marker.cpp',
'long_note_dummy.cpp', 'long_note_dummy.cpp',

View File

@ -41,8 +41,8 @@ namespace linear_view {
using LaneOrder = std::variant<lane_order::Default, lane_order::Vertical, lane_order::Custom>; using LaneOrder = std::variant<lane_order::Default, lane_order::Vertical, lane_order::Custom>;
namespace lane_order { namespace lane_order {
linear_view::LaneOrder load_from_v1_0_0_table(const toml::table& linear_view); LaneOrder load_from_v1_0_0_table(const toml::table& linear_view);
void dump_as_v1_0_0(const linear_view::LaneOrder& lane_order, toml::table& linear_view); void dump_as_v1_0_0(const LaneOrder& lane_order, toml::table& linear_view);
} }
const LaneOrder default_lane_order = lane_order::Default{}; const LaneOrder default_lane_order = lane_order::Default{};

View File

@ -42,6 +42,7 @@ void SelectionRectangle::reset() {
} }
LinearView::LinearView(std::filesystem::path assets, config::Config& config_) : LinearView::LinearView(std::filesystem::path assets, config::Config& config_) :
mode(config_.linear_view.mode),
colors(config_.linear_view.colors), colors(config_.linear_view.colors),
sizes(config_.linear_view.sizes), sizes(config_.linear_view.sizes),
collision_zone(config_.editor.collision_zone), collision_zone(config_.editor.collision_zone),
@ -273,13 +274,14 @@ void LinearView::draw_in_waveform_mode(LinearView::DrawArgs& args) {
] = args; ] = args;
const auto computed_sizes = linear_view::compute_sizes(window_size, sizes); const auto computed_sizes = linear_view::compute_sizes(window_size, sizes);
if ( if (not opt_ref_to_an_opt_waveform) {
not opt_ref_to_an_opt_waveform
or not opt_ref_to_an_opt_waveform.value().get()
) {
feis::CenteredText("Loading ..."); feis::CenteredText("Loading ...");
return; return;
} }
if (not opt_ref_to_an_opt_waveform.value().get()) {
feis::CenteredText("Error while loading waveform");
}
const auto waveform = opt_ref_to_an_opt_waveform.value().get().value(); const auto waveform = opt_ref_to_an_opt_waveform.value().get().value();
if (waveform.channels_per_chunk_size.empty()) { if (waveform.channels_per_chunk_size.empty()) {
feis::CenteredText("No data ???"); feis::CenteredText("No data ???");
@ -729,11 +731,11 @@ void LinearView::set_zoom(int newZoom) {
} }
void LinearView::display_settings() { void LinearView::display_settings() {
if (ImGui::Begin("Vertical View Settings", &shouldDisplaySettings)) { if (ImGui::Begin("Linear View Settings", &shouldDisplaySettings)) {
if (ImGui::SliderInt("Zoom##Vertical View Settings", &zoom, -10, 10, "%d")) { if (ImGui::SliderInt("Zoom##Linear View Settings", &zoom, -10, 10, "%d")) {
set_zoom(zoom); set_zoom(zoom);
} }
if (ImGui::BeginCombo("Mode##Vertical View Settings", mode_name().c_str())) { if (ImGui::BeginCombo("Mode##Linear View Settings", mode_name().c_str())) {
if (ImGui::Selectable( if (ImGui::Selectable(
"Beats", "Beats",
std::holds_alternative<linear_view::mode::Beats>(mode) std::holds_alternative<linear_view::mode::Beats>(mode)
@ -748,7 +750,7 @@ void LinearView::display_settings() {
} }
ImGui::EndCombo(); ImGui::EndCombo();
} }
if (ImGui::CollapsingHeader("Notes##Vertical View Settings")) { if (ImGui::CollapsingHeader("Notes##Linear View Settings")) {
ImGui::Checkbox("Colored Quantization", &use_quantization_colors); ImGui::Checkbox("Colored Quantization", &use_quantization_colors);
if (use_quantization_colors) { if (use_quantization_colors) {
for (auto& [quant, color] : quantization_colors.palette) { for (auto& [quant, color] : quantization_colors.palette) {
@ -766,7 +768,7 @@ void LinearView::display_settings() {
} }
} }
} }
if (ImGui::CollapsingHeader("Lanes##Vertical View Settings")) { if (ImGui::CollapsingHeader("Lanes##Linear View Settings")) {
if (ImGui::BeginCombo("Order", lane_order_name().c_str())) { if (ImGui::BeginCombo("Order", lane_order_name().c_str())) {
if (ImGui::Selectable( if (ImGui::Selectable(
"Default", "Default",
@ -800,8 +802,8 @@ void LinearView::display_settings() {
LaneOrderPreview(order.lane_to_button); LaneOrderPreview(order.lane_to_button);
} }
} }
if (ImGui::CollapsingHeader("Colors##Vertical View Settings")) { if (ImGui::CollapsingHeader("Colors##Linear View Settings")) {
if (ImGui::Button("Reset##Colors##Vertical View Settings")) { if (ImGui::Button("Reset##Colors##Linear View Settings")) {
colors = linear_view::default_colors; colors = linear_view::default_colors;
} }
feis::ColorEdit4("Cursor", colors.cursor); feis::ColorEdit4("Cursor", colors.cursor);
@ -839,8 +841,8 @@ void LinearView::display_settings() {
ImGui::TreePop(); ImGui::TreePop();
} }
} }
if (ImGui::CollapsingHeader("Metrics##Vertical View Settings")) { if (ImGui::CollapsingHeader("Metrics##Linear View Settings")) {
if (ImGui::Button("Reset##Metrics##Vertical View Settings")) { if (ImGui::Button("Reset##Metrics##Linear View Settings")) {
sizes = linear_view::default_sizes; sizes = linear_view::default_sizes;
} }
ImGui::DragInt("Cursor Height", &sizes.cursor_height); ImGui::DragInt("Cursor Height", &sizes.cursor_height);

View File

@ -41,8 +41,6 @@ const std::map<unsigned int, sf::Color> reference_note_colors = {{
}}; }};
const sf::Color reference_note_grey = {134, 110, 116}; const sf::Color reference_note_grey = {134, 110, 116};
namespace linear_view { namespace linear_view {
struct ComputedSizes { struct ComputedSizes {
int x; int x;