FastLED 3.9.15
Loading...
Searching...
No Matches
blend.cpp
Go to the documentation of this file.
1/*
2Fx2d class that allows to blend multiple Fx2d layers together.
3The bottom layer is always drawn at full capacity. Upper layers
4are blended by the the max luminance of the components.
5*/
6
7#include "blend.h"
8#include "pixelset.h"
9#include "colorutils.h"
10
11#include <stdint.h>
12
13namespace fl {
14
16 // Warning, the xyMap will be the final transrformation applied to the
17 // frame. If the delegate Fx2d layers have their own transformation then
18 // both will be applied.
19 mFrame = FramePtr::New(mXyMap.getTotal());
20 mFrameTransform = FramePtr::New(mXyMap.getTotal());
21}
22
24 fl::Str out = "LayeredFx2d(";
25 for (size_t i = 0; i < mLayers.size(); ++i) {
26 out += mLayers[i].fx->fxName();
27 if (i != mLayers.size() - 1) {
28 out += ",";
29 }
30 }
31 out += ")";
32 return out;
33}
34
35void Blend2d::add(Fx2dPtr layer, const Params& p) {
36 uint8_t blurAmount = p.blur_amount;
37 uint8_t blurPasses = p.blur_passes;
38 Entry entry(layer, blurAmount, blurPasses);
39 mLayers.push_back(entry);
40}
41
42void Blend2d::add(Fx2d &layer, const Params& p) {
43 Fx2dPtr fx = Fx2dPtr::NoTracking(layer);
44 this->add(fx, p);
45}
46
48 mFrame->clear();
49 mFrameTransform->clear();
50
51 // Draw each layer in reverse order and applying the blending.
52 bool first = true;
53 for (auto it = mLayers.begin(); it != mLayers.end(); ++it) {
54 DrawContext tmp_ctx = context;
55 tmp_ctx.leds = mFrame->rgb();
56 auto &fx = it->fx;
57 fx->draw(tmp_ctx);
60 first = false;
61 // Apply the blur effect per effect.
62 uint8_t blur_amount = it->blur_amount;
63 if (blur_amount > 0) {
64 const XYMap &xyMap = fx->getXYMap();
65 uint8_t blur_passes = MAX(1, it->blur_passes);
66 for (uint8_t i = 0; i < blur_passes; ++i) {
67 // Apply the blur effect
68 blur2d(mFrame->rgb(), mXyMap.getWidth(), mXyMap.getHeight(),
69 blur_amount, xyMap);
70 }
71 }
72 mFrame->draw(mFrameTransform->rgb(), mode);
73 }
74
75 if (mGlobalBlurAmount > 0) {
76 // Apply the blur effect
77 uint16_t width = mXyMap.getWidth();
78 uint16_t height = mXyMap.getHeight();
79 XYMap rect = XYMap::constructRectangularGrid(width, height);
80 CRGB *rgb = mFrameTransform->rgb();
81 uint8_t blur_passes = MAX(1, mGlobalBlurPasses);
82 for (uint8_t i = 0; i < blur_passes; ++i) {
83 // Apply the blur effect
84 blur2d(rgb, width, height, mGlobalBlurAmount, rect);
85 }
86 }
87
88 // Copy the final result to the output
89 // memcpy(mFrameTransform->rgb(), context.leds, sizeof(CRGB) *
90 // mXyMap.getTotal());
91 mFrameTransform->drawXY(context.leds, mXyMap,
93}
94
95void Blend2d::clear() { mLayers.clear(); }
96
97bool Blend2d::setParams(Fx2dPtr fx, const Params& p) {
98 uint8_t blur_amount = p.blur_amount;
99 uint8_t blur_passes = p.blur_passes;
100 for (auto &layer : mLayers) {
101 if (layer.fx == fx) {
102 layer.blur_amount = blur_amount;
103 layer.blur_passes = blur_passes;
104 return true;
105 }
106 }
107
108 FASTLED_WARN("Fx2d not found in Blend2d::setBlurParams");
109 return false;
110}
111
112bool Blend2d::setParams(Fx2d &fx, const Params& p) {
113
114 Fx2dPtr fxPtr = Fx2dPtr::NoTracking(fx);
115 return setParams(fxPtr, p);
116}
117
118} // namespace fl
XYMap xymap(WIDTH, HEIGHT, SERPENTINE)
UISlider blurAmount("Global Blur Amount", 0, 0, 172, 1)
UISlider blurPasses("Global Blur Passes", 1, 1, 10, 1)
uint8_t mGlobalBlurPasses
Definition blend.h:61
fl::Str fxName() const override
Definition blend.cpp:23
Blend2d(const XYMap &xymap)
Definition blend.cpp:15
Blend2dParams Params
Definition blend.h:30
void add(Fx2dPtr layer, const Params &p=Params())
Definition blend.cpp:35
FramePtr mFrame
Definition blend.h:58
uint8_t mGlobalBlurAmount
Definition blend.h:60
bool setParams(Fx2dPtr fx, const Params &p)
Definition blend.cpp:97
FramePtr mFrameTransform
Definition blend.h:59
HeapVector< Entry > mLayers
Definition blend.h:57
void draw(DrawContext context) override
Definition blend.cpp:47
void clear()
Definition blend.cpp:95
XYMap mXyMap
Definition fx2d.h:29
uint16_t xyMap(uint16_t x, uint16_t y) const
Definition fx2d.h:20
Fx2d(const XYMap &xyMap)
Definition fx2d.h:19
_DrawContext DrawContext
Definition fx.h:21
Definition str.h:368
static XYMap constructRectangularGrid(uint16_t width, uint16_t height, uint16_t offset=0)
Definition xymap.cpp:35
Utility functions for color fill, palettes, blending, and more.
#define MAX(a, b)
Definition math_macros.h:4
void blur2d(CRGB *leds, uint8_t width, uint8_t height, fract8 blur_amount, const XYMap &xymap)
Two-dimensional blur filter.
DrawMode
Definition frame.h:17
@ DRAW_MODE_BLEND_BY_BLACK
Definition frame.h:19
@ DRAW_MODE_OVERWRITE
Definition frame.h:18
Implements a simple red square effect for 2D LED grids.
Definition crgb.h:16
static FASTLED_NAMESPACE_BEGIN uint8_t const p[]
Definition noise.cpp:56
Declares classes for managing logical groups of LEDs.
Representation of an RGB pixel (Red, Green, Blue)
Definition crgb.h:54
Definition blend.h:48
#define FASTLED_WARN
Definition warn.h:7