Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions samples/ViewTypesSample/src/ViewTypesSampleApp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,13 @@ void ViewTypesSampleApp::setup() {
strokedRoundedRectView->getTimeline()->apply(&strokedRoundedRectView->getCornerRadius(), 50.0f, 2.5f, easeInOutQuad).loop(true).pingPong(true);
addViewSample(strokedRoundedRectView, "StrokedRoundedRectView");

// Uncomment the following lines to tween corners individually
//strokedRoundedRectView->useUniformCorners(false);
//strokedRoundedRectView->getTimeline()->apply(&strokedRoundedRectView->getTopLeftCornerRadius(), 0.0f, 2.5f, easeInOutQuad).loop(true).pingPong(true);
//strokedRoundedRectView->getTimeline()->apply(&strokedRoundedRectView->getTopRightCornerRadius(), 15.0f, 2.5f, easeInOutQuad).loop(true).pingPong(true);
//strokedRoundedRectView->getTimeline()->apply(&strokedRoundedRectView->getBottomRightCornerRadius(), 35.0f, 2.5f, easeInOutQuad).loop(true).pingPong(true);
//strokedRoundedRectView->getTimeline()->apply(&strokedRoundedRectView->getBottomLeftCornerRadius(), 50.0f, 2.5f, easeInOutQuad).loop(true).pingPong(true);

//==================================================
// EllipseView with variably smooth edges
//
Expand Down
49 changes: 46 additions & 3 deletions src/bluecadet/views/StrokedRoundedRectView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@ void StrokedRoundedRectView::cancelAnimations() {
mStrokeWidth.stop();
}

void StrokedRoundedRectView::setCornerRadii(float topLeft, float topRight, float bottomRight, float bottomLeft) {
mTopLeftRadius = topLeft;
mTopRightRadius = topRight;
mBottomRightRadius = bottomRight;
mBottomLeftRadius = bottomLeft;
useUniformCorners(false);
invalidate(false, true);
}

void StrokedRoundedRectView::draw() {
const auto & strokeColor = mStrokeColor.value() * getDrawColor();
const auto & bgColor = getBackgroundColor().value() * getDrawColor();
Expand All @@ -36,9 +45,13 @@ void StrokedRoundedRectView::draw() {
prog->uniform("uSmoothness", mSmoothness);
prog->uniform("uStrokeWidth", mStrokeWidth);
prog->uniform("uStrokeColor", strokeColor);
prog->uniform("uCornerRadius", mCornerRadius);
prog->uniform("uSize", size);

prog->uniform("uCornerRadius", mCornerRadius);
prog->uniform("uUseUniformCorners", mUniformCorners ? 1 : 0);
prog->uniform("uTopLeftRadius", mTopLeftRadius);
prog->uniform("uTopRightRadius", mTopRightRadius);
prog->uniform("uBottomRightRadius", mBottomRightRadius);
prog->uniform("uBottomLeftRadius", mBottomLeftRadius);
batch->draw();
}

Expand All @@ -51,6 +64,8 @@ ci::gl::BatchRef StrokedRoundedRectView::getSharedBatch() {
return batch;
}



ci::gl::GlslProgRef StrokedRoundedRectView::getSharedProg() {
static ci::gl::GlslProgRef prog = nullptr;
if (!prog) {
Expand Down Expand Up @@ -80,6 +95,13 @@ ci::gl::GlslProgRef StrokedRoundedRectView::getSharedProg() {
uniform float uSmoothness = 1.0;
uniform float uStrokeWidth = 1.0;
uniform float uCornerRadius = 0.0;

uniform int uUseUniformCorners = 1;
uniform float uTopLeftRadius = 0.0;
uniform float uTopRightRadius = 0.0;
uniform float uBottomRightRadius = 0.0;
uniform float uBottomLeftRadius = 0.0;

out vec4 oColor;

float rectSdf(vec2 p, vec2 b, float r) {
Expand All @@ -93,7 +115,28 @@ ci::gl::GlslProgRef StrokedRoundedRectView::getSharedProg() {
vec2 halfSize = uSize / 2.0 - vec2(halfStrokeWidth);
vec2 centerPos = (vPosition.xy - uSize.xy * 0.5);

float fieldDistance = rectSdf(centerPos, halfSize, uCornerRadius - halfStrokeWidth);
float cornerRad;
if (uUseUniformCorners) {
cornerRad = uCornerRadius;
} else {
if (vPosition.y > halfSize.y) {
//Bottom
if (vPosition.x < halfSize.x) {
cornerRad = uBottomLeftRadius;
} else {
cornerRad = uBottomRightRadius;
}
} else {
//Top
if (vPosition.x < halfSize.x) {
cornerRad = uTopLeftRadius;
} else {
cornerRad = uTopRightRadius;
}
}
}

float fieldDistance = rectSdf(centerPos, halfSize, cornerRad - halfStrokeWidth);

vec4 fromColor = uBackgroundColor;
vec4 toColor = vec4(0.0);
Expand Down
27 changes: 23 additions & 4 deletions src/bluecadet/views/StrokedRoundedRectView.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,36 @@ class StrokedRoundedRectView : public BaseView {
//! Cancels StrokedRoundedRectView animations in addition to BaseView animations.
void cancelAnimations() override;

//! Set view to accept different radii for each corner
inline void useUniformCorners(bool useUniform) { mUniformCorners = useUniform; }

inline ci::Anim<float> & getTopLeftCornerRadius() { return mTopLeftRadius; }
inline ci::Anim<float> & getTopRightCornerRadius() { return mTopRightRadius; }
inline ci::Anim<float> & getBottomRightCornerRadius() { return mBottomRightRadius; }
inline ci::Anim<float> & getBottomLeftCornerRadius() { return mBottomLeftRadius; }
inline void setTopLeftCornerRadius(const float value) { mTopLeftRadius = value; invalidate(false, true); }
inline void setTopRightCornerRadius(const float value) { mTopRightRadius = value; invalidate(false, true); }
inline void setBottomRightCornerRadius(const float value) { mBottomRightRadius = value; invalidate(false, true); }
inline void setBottomLeftCornerRadius(const float value) { mBottomLeftRadius = value; invalidate(false, true); }
void setCornerRadii(const float topLeft, const float topRight, const float bottomRight, const float bottomLeft);


protected:
void draw() override;

static ci::gl::BatchRef getSharedBatch();
static ci::gl::GlslProgRef getSharedProg();

ci::Anim<ci::ColorA> mStrokeColor = ci::ColorA::white();
ci::Anim<float> mSmoothness = 1.0f;
ci::Anim<float> mStrokeWidth = 1.0f;
ci::Anim<float> mCornerRadius = 0.0f;
ci::Anim<ci::ColorA> mStrokeColor = ci::ColorA::white();
ci::Anim<float> mSmoothness = 1.0f;
ci::Anim<float> mStrokeWidth = 1.0f;
ci::Anim<float> mCornerRadius = 0.0f;

bool mUniformCorners = true;
ci::Anim<float> mTopLeftRadius = 0.0f;
ci::Anim<float> mTopRightRadius = 0.0f;
ci::Anim<float> mBottomRightRadius = 0.0f;
ci::Anim<float> mBottomLeftRadius = 0.0f;
};

}
Expand Down