Vital
Loading...
Searching...
No Matches
bar_renderer.h
Go to the documentation of this file.
1#pragma once
2
3#include "JuceHeader.h"
4
5#include "common.h"
6#include "open_gl_component.h"
8
19public:
21 static constexpr float kScaleConstant = 5.0f;
22
24 static constexpr int kFloatsPerVertex = 3;
25
27 static constexpr int kVerticesPerBar = 4;
28
31
33 static constexpr int kTriangleIndicesPerBar = 6;
34
36 static constexpr int kCornerFloatsPerVertex = 2;
37
40
46 BarRenderer(int num_points, bool vertical = true);
47
51 virtual ~BarRenderer();
52
57 virtual void init(OpenGlWrapper& open_gl) override;
58
64 virtual void render(OpenGlWrapper& open_gl, bool animate) override;
65
70 virtual void destroy(OpenGlWrapper& open_gl) override;
71
76 void setColor(const Colour& color) { color_ = color; }
77
82 void setScale(float scale) { scale_ = scale; }
83
88 void setOffset(float offset) { offset_ = offset; }
89
94 void setBarWidth(float bar_width) { bar_width_ = bar_width; }
95
100 void setNumPoints(int num_points) { num_points_ = num_points; }
101
106 float getBarWidth() { return bar_width_; }
107
113 inline float xAt(int index) { return bar_data_[kFloatsPerBar * index]; }
114
120 inline float rightAt(int index) { return bar_data_[kFloatsPerBar * index + kFloatsPerVertex]; }
121
127 inline float yAt(int index) { return bar_data_[kFloatsPerBar * index + 1]; }
128
134 inline float bottomAt(int index) { return bar_data_[kFloatsPerBar * index + 2 * kFloatsPerVertex + 1]; }
135
141 force_inline void setX(int index, float val) {
142 bar_data_[kFloatsPerBar * index] = val;
143 bar_data_[kFloatsPerBar * index + 2 * kFloatsPerVertex] = val;
145 bar_data_[kFloatsPerBar * index + 3 * kFloatsPerVertex] = val;
146 dirty_ = true;
147 }
148
154 force_inline void setY(int index, float val) {
155 bar_data_[kFloatsPerBar * index + 1] = val;
156 bar_data_[kFloatsPerBar * index + kFloatsPerVertex + 1] = val;
157 dirty_ = true;
158 }
159
165 force_inline void setBottom(int index, float val) {
166 bar_data_[kFloatsPerBar * index + 2 * kFloatsPerVertex + 1] = val;
167 bar_data_[kFloatsPerBar * index + 3 * kFloatsPerVertex + 1] = val;
168 dirty_ = true;
169 }
170
179 inline void positionBar(int index, float x, float y, float width, float height) {
180 bar_data_[kFloatsPerBar * index] = x;
181 bar_data_[kFloatsPerBar * index + 1] = y;
182
183 bar_data_[kFloatsPerBar * index + kFloatsPerVertex] = x + width;
184 bar_data_[kFloatsPerBar * index + kFloatsPerVertex + 1] = y;
185
186 bar_data_[kFloatsPerBar * index + 2 * kFloatsPerVertex] = x;
187 bar_data_[kFloatsPerBar * index + 2 * kFloatsPerVertex + 1] = y + height;
188
189 bar_data_[kFloatsPerBar * index + 3 * kFloatsPerVertex] = x + width;
190 bar_data_[kFloatsPerBar * index + 3 * kFloatsPerVertex + 1] = y + height;
191 dirty_ = true;
192 }
193
197 void setBarSizes();
198
203 void setPowerScale(bool scale);
204
209 void setSquareScale(bool scale);
210
218 force_inline float scaledYAt(int index) {
219 float value = yAt(index) * 0.5f + 0.5f;
220 if (square_scale_)
221 value *= value;
222 if (power_scale_)
223 value /= std::max(index, 1) / kScaleConstant;
224
225 return value;
226 }
227
236 force_inline void setScaledY(int index, float val) {
237 float value = val;
238
239 if (power_scale_)
240 value *= std::max(index, 1) / kScaleConstant;
241 if (square_scale_)
242 value = sqrtf(value);
243
244 setY(index, 2.0f * value - 1.0f);
245 }
246
251 force_inline void setAdditiveBlending(bool additive_blending) { additive_blending_ = additive_blending; }
252
253protected:
258 void drawBars(OpenGlWrapper& open_gl);
259
260 OpenGLShaderProgram* shader_;
261 std::unique_ptr<OpenGLShaderProgram::Uniform> color_uniform_;
262 std::unique_ptr<OpenGLShaderProgram::Uniform> dimensions_uniform_;
263 std::unique_ptr<OpenGLShaderProgram::Uniform> offset_uniform_;
264 std::unique_ptr<OpenGLShaderProgram::Uniform> scale_uniform_;
265 std::unique_ptr<OpenGLShaderProgram::Uniform> width_percent_uniform_;
266 std::unique_ptr<OpenGLShaderProgram::Attribute> position_;
267 std::unique_ptr<OpenGLShaderProgram::Attribute> corner_;
268
269 Colour color_;
271 float scale_;
272 float offset_;
276
279 bool dirty_;
282 std::unique_ptr<float[]> bar_data_;
283 std::unique_ptr<float[]> bar_corner_data_;
284 std::unique_ptr<int[]> bar_indices_;
285 GLuint bar_buffer_;
288
289 JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(BarRenderer)
290};
A renderer for drawing a series of bars using OpenGL.
Definition bar_renderer.h:18
void setColor(const Colour &color)
Sets the color of the bars.
Definition bar_renderer.h:76
void positionBar(int index, float x, float y, float width, float height)
Positions a bar at a specific rectangle.
Definition bar_renderer.h:179
void setOffset(float offset)
Sets an offset applied to the bar positions.
Definition bar_renderer.h:88
bool additive_blending_
If true, uses additive blending for rendering.
Definition bar_renderer.h:274
void setPowerScale(bool scale)
Enables or disables power scaling of bar heights.
Definition bar_renderer.cpp:197
float bottomAt(int index)
Gets the y-position of the bottom-left vertex of the given bar.
Definition bar_renderer.h:134
BarRenderer(int num_points, bool vertical=true)
Constructs a BarRenderer.
Definition bar_renderer.cpp:8
force_inline void setX(int index, float val)
Sets the x-position for all vertices of a specific bar.
Definition bar_renderer.h:141
float yAt(int index)
Gets the y-position of the top-left vertex of the given bar.
Definition bar_renderer.h:127
std::unique_ptr< OpenGLShaderProgram::Attribute > position_
Attribute for vertex position.
Definition bar_renderer.h:266
std::unique_ptr< OpenGLShaderProgram::Uniform > dimensions_uniform_
Uniform for viewport dimensions.
Definition bar_renderer.h:262
force_inline float scaledYAt(int index)
Gets the scaled y-value of a bar at a given index.
Definition bar_renderer.h:218
float bar_width_
Relative width of each bar.
Definition bar_renderer.h:273
std::unique_ptr< float[]> bar_corner_data_
Bar corner coordinate data.
Definition bar_renderer.h:283
Colour color_
Current color of the bars.
Definition bar_renderer.h:269
float rightAt(int index)
Gets the x-position of the top-right vertex of the given bar.
Definition bar_renderer.h:120
OpenGLShaderProgram * shader_
The shader program used for rendering.
Definition bar_renderer.h:260
bool power_scale_
True if power scaling is applied to bar heights.
Definition bar_renderer.h:277
force_inline void setBottom(int index, float val)
Sets the bottom y-position of a specific bar.
Definition bar_renderer.h:165
force_inline void setAdditiveBlending(bool additive_blending)
Enables or disables additive blending for the bar rendering.
Definition bar_renderer.h:251
std::unique_ptr< float[]> bar_data_
Raw bar vertex position data.
Definition bar_renderer.h:282
static constexpr int kCornerFloatsPerVertex
Number of corner floats per vertex (used to determine corner coordinates).
Definition bar_renderer.h:36
void setSquareScale(bool scale)
Enables or disables square scaling of bar heights.
Definition bar_renderer.cpp:212
std::unique_ptr< int[]> bar_indices_
Triangle index data for bars.
Definition bar_renderer.h:284
void setNumPoints(int num_points)
Updates the number of points (bars) to display.
Definition bar_renderer.h:100
float getBarWidth()
Gets the current bar width factor.
Definition bar_renderer.h:106
force_inline void setScaledY(int index, float val)
Sets the scaled y-value at a specific index.
Definition bar_renderer.h:236
void setScale(float scale)
Sets the scaling factor for the bars.
Definition bar_renderer.h:82
std::unique_ptr< OpenGLShaderProgram::Uniform > width_percent_uniform_
Uniform for bar width factor.
Definition bar_renderer.h:265
static constexpr int kFloatsPerBar
Number of floats per bar (4 vertices * 3 floats each).
Definition bar_renderer.h:30
float display_scale_
Additional scaling factor applied to bar sizes.
Definition bar_renderer.h:275
void setBarWidth(float bar_width)
Sets the relative width of each bar.
Definition bar_renderer.h:94
float offset_
Offset applied to bar positions.
Definition bar_renderer.h:272
void setBarSizes()
Updates the bar sizes based on their positions and scaling.
Definition bar_renderer.cpp:171
virtual void destroy(OpenGlWrapper &open_gl) override
Destroys any allocated OpenGL resources.
Definition bar_renderer.cpp:153
std::unique_ptr< OpenGLShaderProgram::Uniform > scale_uniform_
Uniform for scaling factor.
Definition bar_renderer.h:264
static constexpr int kCornerFloatsPerBar
Number of corner floats per bar.
Definition bar_renderer.h:39
bool vertical_
True if bars are rendered vertically.
Definition bar_renderer.h:270
virtual void init(OpenGlWrapper &open_gl) override
Initializes the renderer with an OpenGL context.
Definition bar_renderer.cpp:57
int num_points_
Number of bars to render.
Definition bar_renderer.h:280
float xAt(int index)
Gets the x-position of the top-left vertex of the given bar.
Definition bar_renderer.h:113
virtual void render(OpenGlWrapper &open_gl, bool animate) override
Renders the bars using the current OpenGL context.
Definition bar_renderer.cpp:149
static constexpr int kTriangleIndicesPerBar
Number of triangle indices per bar (each bar represented as two triangles).
Definition bar_renderer.h:33
bool dirty_
True if bar data needs to be re-uploaded to the GPU.
Definition bar_renderer.h:279
std::unique_ptr< OpenGLShaderProgram::Uniform > offset_uniform_
Uniform for position offset.
Definition bar_renderer.h:263
float scale_
Scale factor for bar dimensions.
Definition bar_renderer.h:271
void drawBars(OpenGlWrapper &open_gl)
Draws the bars to the currently active OpenGL context.
Definition bar_renderer.cpp:93
std::unique_ptr< OpenGLShaderProgram::Uniform > color_uniform_
Uniform for bar color.
Definition bar_renderer.h:261
static constexpr float kScaleConstant
A scaling constant used when applying power scaling.
Definition bar_renderer.h:21
std::unique_ptr< OpenGLShaderProgram::Attribute > corner_
Attribute for corner coordinates.
Definition bar_renderer.h:267
force_inline void setY(int index, float val)
Sets the top y-position of a specific bar.
Definition bar_renderer.h:154
virtual ~BarRenderer()
Destructor.
Definition bar_renderer.cpp:55
GLuint bar_indices_buffer_
OpenGL buffer object for bar indices.
Definition bar_renderer.h:287
int total_points_
Total number of allocated points (bars).
Definition bar_renderer.h:281
static constexpr int kFloatsPerVertex
Number of float values per vertex (x, y, [and potentially other attributes]).
Definition bar_renderer.h:24
GLuint bar_corner_buffer_
OpenGL buffer object for bar corners.
Definition bar_renderer.h:286
bool square_scale_
True if square scaling is applied to bar heights.
Definition bar_renderer.h:278
static constexpr int kVerticesPerBar
Number of vertices per bar.
Definition bar_renderer.h:27
GLuint bar_buffer_
OpenGL buffer object for bar positions.
Definition bar_renderer.h:285
A base component class that integrates JUCE's Component with OpenGL rendering.
Definition open_gl_component.h:20
#define force_inline
Definition common.h:23
A helper struct containing references to OpenGL context, shaders, and display scale.
Definition shaders.h:174