15 fl::u32 X = (fl::u32)
x << Q;
16 fl::u32
y = (1u << Q);
19 for (
int i = 0; i < 4; i++) {
20 y = (
y + (X /
y)) >> 1;
22 return static_cast<fl::i16
>(
y) >> 8;
83 for (u32 j = 0; j < mult; ++j) {
84 for (u32 i = 0; i < mult; ++i) {
85 u32 xx =
x * mult + i;
86 u32 yy =
y * mult + j;
87 i32 pt =
mSim->geti16(xx, yy);
101 i16 out =
static_cast<i16
>(sum / (mult * mult));
110 for (u32 j = 0; j < mult; ++j) {
111 for (u32 i = 0; i < mult; ++i) {
113 mSim->geti16Previous(
x * mult + i,
y * mult + j);
116 i16 out =
static_cast<i16
>(sum / (mult * mult));
121 i16 *prev, i16 *diff)
const {
126 *diff = *curr - *prev;
136 if (
mSim->getHalfDuplex()) {
137 u16 v2 =
static_cast<u16
>(value);
140 return half_duplex_blend_linear(v2);
142 return half_duplex_blend_sqrt_q15(v2);
145 return static_cast<u8>(((
static_cast<u16
>(value) + 32768)) >> 8);
159 int rad =
static_cast<int>(mult) / 2;
161 for (fl::size j = 0; j < mult; ++j) {
162 for (fl::size i = 0; i < mult; ++i) {
164 int dx =
static_cast<int>(i) - rad;
165 int dy =
static_cast<int>(j) - rad;
167 if (
ABS(dx) +
ABS(dy) > rad) {
170 fl::size xx =
x * mult + i;
171 fl::size yy =
y * mult + j;
172 if (
mSim->has(xx, yy)) {
179 const bool sign_matches = (pt >= 0) == (v16 >= 0);
186 u16 abs_pt =
static_cast<u16
>(
ABS(pt));
187 u16 abs_v16 =
static_cast<u16
>(
ABS(v16));
188 if (abs_v16 > abs_pt) {
195 mSim->seti16(xx, yy, v16);
214 const bool has_updates = min_max !=
vec2<i16>(0, 0);
220 for (u32
x = 0;
x < w; ++
x) {
221 for (u32
y = 0;
y < h; ++
y) {
296 for (u32 i = 0; i < mult; ++i) {
297 sum +=
mSim->getf(
x * mult + i);
299 return sum /
static_cast<float>(mult);
307 for (u32 i = 0; i < mult; ++i) {
308 sum +=
mSim->geti16(
x * mult + i);
310 return static_cast<i16
>(sum / mult);
318 for (u32 i = 0; i < mult; ++i) {
319 sum +=
mSim->geti16Previous(
x * mult + i);
321 return static_cast<i16
>(sum / mult);
330 *diff = *curr - *prev;
355 if (
mSim->getHalfDuplex()) {
356 u16 v2 =
static_cast<u16
>(value);
359 return half_duplex_blend_linear(v2);
361 return half_duplex_blend_sqrt_q15(v2);
364 return static_cast<u8>(((
static_cast<u16
>(value) + 32768)) >> 8);
374 for (u32 i = 0; i < mult; ++i) {
375 mSim->set(
x * mult + i, value);
float getf(fl::size x) const
fl::unique_ptr< WaveSimulation1D_Real > mSim
void setExtraFrames(u8 extra)
i16 geti16Previous(fl::size x) const
int getDampenening() const
void setSpeed(float speed)
void setDampening(int damp)
bool geti16All(fl::size x, i16 *curr, i16 *prev, i16 *diff) const
u8 getu8(fl::size x) const
void init(u32 length, SuperSample factor, float speed, int dampening)
WaveSimulation1D(u32 length, SuperSample factor=SuperSample::SUPER_SAMPLE_NONE, float speed=0.16f, int dampening=6)
i8 geti8(fl::size x) const
void setf(fl::size x, float value)
bool has(fl::size x) const
i16 geti16(fl::size x) const
i8 geti8(fl::size x, fl::size y) const
WaveSimulation2D(u32 W, u32 H, SuperSample factor=SuperSample::SUPER_SAMPLE_NONE, float speed=0.16f, float dampening=6.0f)
void seti16(fl::size x, fl::size y, i16 value)
i16 geti16(fl::size x, fl::size y) const
int getDampenening() const
fl::Grid< i16 > mChangeGrid
void setExtraFrames(u8 extra)
float getf(fl::size x, fl::size y) const
i16 geti16Previous(fl::size x, fl::size y) const
void setSpeed(float speed)
bool geti16All(fl::size x, fl::size y, i16 *curr, i16 *prev, i16 *diff) const
void setf(fl::size x, fl::size y, float value)
bool has(fl::size x, fl::size y) const
void setDampening(int damp)
u8 getu8(fl::size x, fl::size y) const
void init(u32 width, u32 height, SuperSample factor, float speed, int dampening)
fl::unique_ptr< WaveSimulation2D_Real > mSim
void setUseChangeGrid(bool enabled)
UISlider length("Length", 1.0f, 0.0f, 1.0f, 0.01f)
UISlider dampening("Dampening", 6.0f, 0.0f, 10.0f, 0.1f)
Implements the FastLED namespace macros.
fl::u8 half_duplex_blend_sqrt_q15(fl::u16 x)
fl::u8 half_duplex_blend_linear(fl::u16 x)
i16 float_to_fixed(float f)
FASTLED_FORCE_INLINE T clamp(T value, T min, T max)