Vital
Loading...
Searching...
No Matches
wave_window_editor.cpp
Go to the documentation of this file.
2
3#include "skin.h"
4#include "synth_constants.h"
5#include "shaders.h"
6#include "utils.h"
7
8WaveWindowEditor::WaveWindowEditor() : OpenGlLineRenderer(kTotalPoints), edit_bars_(4, Shaders::kColorFragment) {
9 edit_bars_.setTargetComponent(this);
10
11 hovering_ = kNone;
12 editing_ = kNone;
13 left_position_ = 0.0f;
14 right_position_ = 1.0f;
15 window_shape_ = WaveWindowModifier::kCos;
16
17 setPoints();
18}
19
21
25 setPoints();
26
27 edit_bars_.setColor(findColour(Skin::kLightenScreen, true).withMultipliedAlpha(0.5f));
28}
29
30void WaveWindowEditor::mouseDown(const MouseEvent& e) {
31 OpenGlLineRenderer::mouseDown(e);
32
33 editing_ = getHover(e.getPosition());
34 changeValues(e);
35}
36
37void WaveWindowEditor::mouseUp(const MouseEvent& e) {
38 OpenGlLineRenderer::mouseUp(e);
39
40 if (editing_ != kNone)
41 notifyWindowChanged(true);
42
43 editing_ = kNone;
44 setEditingQuads();
45}
46
47void WaveWindowEditor::mouseMove(const MouseEvent& e) {
48 OpenGlLineRenderer::mouseMove(e);
49
50 WaveWindowEditor::ActiveSide hover = getHover(e.getPosition());
51 if (hovering_ != hover) {
52 hovering_ = hover;
53 setEditingQuads();
54 }
55}
56
57void WaveWindowEditor::mouseExit(const MouseEvent& e) {
58 OpenGlLineRenderer::mouseExit(e);
59 hovering_ = kNone;
60 setEditingQuads();
61}
62
63void WaveWindowEditor::mouseDrag(const MouseEvent& e) {
64 OpenGlLineRenderer::mouseDrag(e);
65
66 changeValues(e);
67}
68
69void WaveWindowEditor::notifyWindowChanged(bool mouse_up) {
70 for (Listener* listener : listeners_)
71 listener->windowChanged(editing_ == kLeft, mouse_up);
72}
73
74void WaveWindowEditor::changeValues(const MouseEvent& e) {
75 if (editing_ == kNone)
76 return;
77
78 float position = (1.0f * e.getPosition().x) / getWidth();
79 if (editing_ == kLeft)
80 left_position_ = vital::utils::clamp(position, 0.0f, right_position_);
81 else if (editing_ == kRight)
82 right_position_ = vital::utils::clamp(position, left_position_, 1.0f);
83
84 notifyWindowChanged(false);
85 setPoints();
86}
87
88void WaveWindowEditor::setEditingQuads() {
89 if (editing_ == kLeft)
90 edit_bars_.setQuad(2, edit_bars_.getQuadX(0), -1.0f, 2.0f * kGrabRadius, 2.0f);
91 else if (editing_ == kRight)
92 edit_bars_.setQuad(2, edit_bars_.getQuadX(1), -1.0f, 2.0f * kGrabRadius, 2.0f);
93 else
94 edit_bars_.setQuad(2, -2.0f, -2.0f, 0.0f, 0.0f);
95
96 if (hovering_ == kLeft)
97 edit_bars_.setQuad(3, edit_bars_.getQuadX(0), -1.0f, 2.0f * kGrabRadius, 2.0f);
98 else if (hovering_ == kRight)
99 edit_bars_.setQuad(3, edit_bars_.getQuadX(1), -1.0f, 2.0f * kGrabRadius, 2.0f);
100 else
101 edit_bars_.setQuad(3, -2.0f, -2.0f, 0.0f, 0.0f);
102}
103
104void WaveWindowEditor::setPoints() {
105 edit_bars_.setQuad(0, left_position_ * 2.0f - 1.0f - kGrabRadius, -1.0f, 2.0f * kGrabRadius, 2.0f);
106 edit_bars_.setQuad(1, right_position_ * 2.0f - 1.0f - kGrabRadius, -1.0f, 2.0f * kGrabRadius, 2.0f);
107 setEditingQuads();
108
109 float width = getWidth();
110 float half_height = 0.5f * getHeight();
111 float left_gl_x = left_position_ * width;
112
113 // Populate left side of window
114 for (int i = 0; i < kPointsPerSection; ++i) {
115 float t = i / (kPointsPerSection - 1.0f);
116 float x = vital::utils::interpolate(0.0f, left_gl_x, t);
117 float y = WaveWindowModifier::applyWindow(window_shape_, t) * half_height;
118
119 setXAt(i, x);
120 setYAt(i, half_height + y);
121 setXAt(kTotalPoints - i - 1, x);
122 setYAt(kTotalPoints - i - 1, half_height - y);
123 }
124
125 float right_gl_x = right_position_ * width;
126 // Populate right side of window
127 for (int i = 0; i < kPointsPerSection; ++i) {
128 float t = i / (kPointsPerSection - 1.0f);
129 float x = vital::utils::interpolate(right_gl_x, width, t);
130 float y = WaveWindowModifier::applyWindow(window_shape_, 1.0f - t) * half_height;
131
132 int index = kPointsPerSection + i;
133 setXAt(index, x);
134 setYAt(index, half_height + y);
135 setXAt(kTotalPoints - index - 1, x);
136 setYAt(kTotalPoints - index - 1, half_height - y);
137 }
138}
139
141 float window_left_x = left_position_ * getWidth();
142 float delta_left = fabsf(window_left_x - position.x);
143 float window_right_x = right_position_ * getWidth();
144 float delta_right = fabsf(window_right_x - position.x);
145
146 bool choose_left = delta_left < delta_right || (delta_left == delta_right && position.x < window_left_x);
147 if (delta_left < kGrabRadius * getWidth() && choose_left)
148 return kLeft;
149 if (delta_right < kGrabRadius * getWidth())
150 return kRight;
151 return kNone;
152}
virtual void resized() override
Called when the component is resized.
Definition open_gl_component.cpp:121
float findValue(Skin::ValueId value_id)
Finds a float value from the skin associated with this component's parent.
Definition open_gl_component.cpp:173
A component for rendering lines with optional filling and boost effects using OpenGL.
Definition open_gl_line_renderer.h:16
force_inline void setYAt(int index, float val)
Sets the y-coordinate of a point, marking data as dirty.
Definition open_gl_line_renderer.h:98
force_inline void setXAt(int index, float val)
Sets the x-coordinate of a point, marking data as dirty.
Definition open_gl_line_renderer.h:105
force_inline void setLineWidth(float width)
Sets the line width in pixels.
Definition open_gl_line_renderer.h:66
void setQuad(int i, float x, float y, float w, float h)
Sets the position and size of a quad in normalized device space.
Definition open_gl_multi_quad.h:313
void setTargetComponent(Component *target_component)
Sets a target component to help position the quads.
Definition open_gl_multi_quad.h:358
force_inline void setColor(Colour color)
Sets the base color for the quads.
Definition open_gl_multi_quad.h:102
force_inline float getQuadX(int i) const
Gets the x-position of a specified quad.
Definition open_gl_multi_quad.h:175
Manages and provides access to vertex and fragment shaders used by the OpenGL rendering pipeline.
Definition shaders.h:19
@ kWidgetLineWidth
Definition skin.h:105
@ kLightenScreen
Definition skin.h:141
void mouseMove(const MouseEvent &e) override
Handles mouse move events, updating hover states over handles.
Definition wave_window_editor.cpp:47
WaveWindowEditor()
Constructs a WaveWindowEditor instance.
Definition wave_window_editor.cpp:8
ActiveSide
Enum representing which side (left or right) is being edited or hovered.
Definition wave_window_editor.h:30
@ kRight
Definition wave_window_editor.h:33
@ kLeft
Definition wave_window_editor.h:32
@ kNone
Definition wave_window_editor.h:31
static constexpr float kGrabRadius
Definition wave_window_editor.h:20
void mouseUp(const MouseEvent &e) override
Handles mouse up events, finalizing changes if a handle was being moved.
Definition wave_window_editor.cpp:37
ActiveSide getHover(Point< int > position)
Determines which handle (left or right) is being hovered based on a position.
Definition wave_window_editor.cpp:140
virtual ~WaveWindowEditor()
Destructor.
Definition wave_window_editor.cpp:20
void resized() override
Called when the component is resized. Updates the rendering and layout.
Definition wave_window_editor.cpp:22
static constexpr int kPointsPerSection
Definition wave_window_editor.h:22
void mouseDrag(const MouseEvent &e) override
Handles mouse drag events, adjusting the window boundaries.
Definition wave_window_editor.cpp:63
void mouseDown(const MouseEvent &e) override
Handles mouse down events, determining which side (if any) is selected.
Definition wave_window_editor.cpp:30
void mouseExit(const MouseEvent &e) override
Handles mouse exit events, resetting hover states.
Definition wave_window_editor.cpp:57
static constexpr int kTotalPoints
Definition wave_window_editor.h:24
static float applyWindow(WindowShape window_shape, float t)
Applies the chosen window shape to a given normalized position.
Definition wave_window_modifier.cpp:10
@ kCos
A cosine-based window (smooth rise/fall).
Definition wave_window_modifier.h:26
force_inline poly_float clamp(poly_float value, mono_float min, mono_float max)
Clamps each lane of a vector to [min, max].
Definition poly_utils.h:306
force_inline poly_float interpolate(poly_float from, poly_float to, mono_float t)
Performs a linear interpolation between two poly_floats using a scalar t in [0..1].
Definition poly_utils.h:182
Provides various utility functions, classes, and constants for audio, math, and general-purpose opera...