From aea2950aab53fa171d073d5e001e0419098ab82d Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 12 Jun 2021 02:12:22 +0200 Subject: Add drop shadow --- TODO | 3 ++- include/RoundedRectangle.hpp | 1 + src/RoundedRectangle.cpp | 62 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/TODO b/TODO index 8248225..c1b56b8 100644 --- a/TODO +++ b/TODO @@ -163,4 +163,5 @@ Update item height when it switches from not being merged with previous to being Reload youtube video url if the video is idle for too long. The video url is only valid for a specific amount of time (the valid duration is in the json). Improve live stream startup time by downloading the video formats in parts instead of the hls manifest? Add youtube chapters. -Faster seeking for long youtube videos. \ No newline at end of file +Faster seeking for long youtube videos. +Disable drop shadow on pinephone. \ No newline at end of file diff --git a/include/RoundedRectangle.hpp b/include/RoundedRectangle.hpp index 2106634..3bdb38f 100644 --- a/include/RoundedRectangle.hpp +++ b/include/RoundedRectangle.hpp @@ -25,6 +25,7 @@ namespace QuickMedia { sf::Vector2f pos; sf::Vector2f size; sf::Vertex vertices[4]; + sf::Vertex drop_shadow_vertices[16]; sf::Shader *rounded_rectangle_shader; sf::Vector2f band_pos; sf::Vector2f band_size; diff --git a/src/RoundedRectangle.cpp b/src/RoundedRectangle.cpp index 4aad699..596d980 100644 --- a/src/RoundedRectangle.cpp +++ b/src/RoundedRectangle.cpp @@ -8,17 +8,38 @@ namespace QuickMedia { radius(radius), pos(0.0f, 0.0f), size(size), rounded_rectangle_shader(rounded_rectangle_shader), band_color(sf::Color::Transparent) { assert(rounded_rectangle_shader); - vertices[0].color = color; - vertices[1].color = color; - vertices[2].color = color; - vertices[3].color = color; - vertices[0].texCoords = sf::Vector2f(0.0f, 0.0f); vertices[1].texCoords = sf::Vector2f(1.0f, 0.0f); vertices[2].texCoords = sf::Vector2f(1.0f, 1.0f); vertices[3].texCoords = sf::Vector2f(0.0f, 1.0f); - + set_color(color); set_size(size); + + const sf::Color shadow_color(0, 0, 0, 50); + + // Top + drop_shadow_vertices[0].color = sf::Color(shadow_color.r, shadow_color.g, shadow_color.b, 0); + drop_shadow_vertices[1].color = sf::Color(shadow_color.r, shadow_color.g, shadow_color.b, 0); + drop_shadow_vertices[2].color = shadow_color; + drop_shadow_vertices[3].color = shadow_color; + + // Bottom + drop_shadow_vertices[4].color = shadow_color; + drop_shadow_vertices[5].color = shadow_color; + drop_shadow_vertices[6].color = sf::Color(shadow_color.r, shadow_color.g, shadow_color.b, 0); + drop_shadow_vertices[7].color = sf::Color(shadow_color.r, shadow_color.g, shadow_color.b, 0); + + // Left + drop_shadow_vertices[8].color = sf::Color(shadow_color.r, shadow_color.g, shadow_color.b, 0); + drop_shadow_vertices[9].color = sf::Color(shadow_color.r, shadow_color.g, shadow_color.b, 0); + drop_shadow_vertices[10].color = shadow_color; + drop_shadow_vertices[11].color = shadow_color; + + // Right + drop_shadow_vertices[12].color = sf::Color(shadow_color.r, shadow_color.g, shadow_color.b, 0); + drop_shadow_vertices[13].color = sf::Color(shadow_color.r, shadow_color.g, shadow_color.b, 0); + drop_shadow_vertices[14].color = shadow_color; + drop_shadow_vertices[15].color = shadow_color; } void RoundedRectangle::set_position(sf::Vector2f pos) { @@ -27,6 +48,33 @@ namespace QuickMedia { vertices[1].position = pos + sf::Vector2f(size.x, 0.0f); vertices[2].position = pos + sf::Vector2f(size.x, size.y); vertices[3].position = pos + sf::Vector2f(0.0f, size.y); + + const sf::Color shadow_color(0, 0, 0, 50); + const float shadow_radius = 5.0f; + + // Top + drop_shadow_vertices[0].position = pos + sf::Vector2f(radius*0.5f, 0.0f) - sf::Vector2f(0.0f, shadow_radius); + drop_shadow_vertices[1].position = pos + sf::Vector2f(size.x - radius*0.5f, 0.0f) - sf::Vector2f(0.0f, shadow_radius); + drop_shadow_vertices[2].position = pos + sf::Vector2f(size.x - radius*0.5f, 0.0f); + drop_shadow_vertices[3].position = pos + sf::Vector2f(radius*0.5f, 0.0f); + + // Bottom + drop_shadow_vertices[4].position = pos + sf::Vector2f(radius*0.5f, size.y); + drop_shadow_vertices[5].position = pos + size - sf::Vector2f(radius*0.5f, 0.0f); + drop_shadow_vertices[6].position = pos + size - sf::Vector2f(radius*0.5f, 0.0f) + sf::Vector2f(0.0f, shadow_radius); + drop_shadow_vertices[7].position = pos + sf::Vector2f(radius*0.5f, size.y) + sf::Vector2f(0.0f, shadow_radius); + + // Left + drop_shadow_vertices[8].position = pos + sf::Vector2f(-shadow_radius, size.y - radius*0.5f); + drop_shadow_vertices[9].position = pos + sf::Vector2f(-shadow_radius, radius*0.5f); + drop_shadow_vertices[10].position = pos + sf::Vector2f(0.0f, radius*0.5f); + drop_shadow_vertices[11].position = pos + sf::Vector2f(0.0f, size.y - radius*0.5f); + + // Right + drop_shadow_vertices[12].position = pos + sf::Vector2f(size.x + shadow_radius, radius*0.5f); + drop_shadow_vertices[13].position = pos + sf::Vector2f(size.x + shadow_radius, size.y - radius*0.5f); + drop_shadow_vertices[14].position = pos + sf::Vector2f(size.x, size.y - radius*0.5f); + drop_shadow_vertices[15].position = pos + sf::Vector2f(size.x, radius*0.5f); } void RoundedRectangle::set_size(sf::Vector2f size) { @@ -59,6 +107,8 @@ namespace QuickMedia { } void RoundedRectangle::draw(sf::RenderTarget &target) { + target.draw(drop_shadow_vertices, 16, sf::Quads); + // TODO: Remove these for optimizations. Also do the same in other places where setUniform is called rounded_rectangle_shader->setUniform("radius", radius); rounded_rectangle_shader->setUniform("band_pos", band_pos); -- cgit v1.2.3