14 uint32_t X = (uint32_t)
x << Q;
15 uint32_t
y = (1u << Q);
18 for (
int i = 0; i < 4; i++) {
19 y = (
y + (X /
y)) >> 1;
21 return static_cast<int16_t
>(
y) >> 8;
79 for (uint32_t j = 0; j < mult; ++j) {
80 for (uint32_t i = 0; i < mult; ++i) {
81 uint32_t xx =
x * mult + i;
82 uint32_t yy =
y * mult + j;
83 int32_t pt =
mSim->geti16(xx, yy);
93 int16_t out =
static_cast<int16_t
>(sum / (mult * mult));
102 for (uint32_t j = 0; j < mult; ++j) {
103 for (uint32_t i = 0; i < mult; ++i) {
105 mSim->geti16Previous(
x * mult + i,
y * mult + j);
108 int16_t out =
static_cast<int16_t
>(sum / (mult * mult));
113 int16_t *prev, int16_t *diff)
const {
118 *diff = *curr - *prev;
123 return static_cast<int8_t
>(
geti16(
x,
y) >> 8);
128 if (
mSim->getHalfDuplex()) {
129 uint16_t v2 =
static_cast<uint16_t
>(value);
132 return half_duplex_blend_linear(v2);
134 return half_duplex_blend_sqrt_q15(v2);
137 return static_cast<uint8_t
>(((
static_cast<uint16_t
>(value) + 32768)) >> 8);
151 int rad =
static_cast<int>(mult) / 2;
153 for (
size_t j = 0; j < mult; ++j) {
154 for (
size_t i = 0; i < mult; ++i) {
156 int dx =
static_cast<int>(i) - rad;
157 int dy =
static_cast<int>(j) - rad;
159 if (
ABS(dx) +
ABS(dy) > rad) {
162 size_t xx =
x * mult + i;
163 size_t yy =
y * mult + j;
164 if (
mSim->has(xx, yy)) {
170 const bool sign_matches = (pt >= 0) == (v16 >= 0);
177 uint16_t abs_pt =
static_cast<uint16_t
>(
ABS(pt));
178 uint16_t abs_v16 =
static_cast<uint16_t
>(
ABS(v16));
179 if (abs_v16 > abs_pt) {
206 for (uint32_t
x = 0;
x < w; ++
x) {
207 for (uint32_t
y = 0;
y < h; ++
y) {
258 for (uint32_t i = 0; i < mult; ++i) {
259 sum +=
mSim->getf(
x * mult + i);
261 return sum /
static_cast<float>(mult);
269 for (uint32_t i = 0; i < mult; ++i) {
270 sum +=
mSim->geti16(
x * mult + i);
272 return static_cast<int16_t
>(sum / mult);
280 for (uint32_t i = 0; i < mult; ++i) {
281 sum +=
mSim->geti16Previous(
x * mult + i);
283 return static_cast<int16_t
>(sum / mult);
287 int16_t *diff)
const {
292 *diff = *curr - *prev;
297 return static_cast<int8_t
>(
geti16(
x) >> 8);
317 if (
mSim->getHalfDuplex()) {
318 uint16_t v2 =
static_cast<uint16_t
>(value);
321 return half_duplex_blend_linear(v2);
323 return half_duplex_blend_sqrt_q15(v2);
326 return static_cast<uint8_t
>(((
static_cast<uint16_t
>(value) + 32768)) >> 8);
336 for (uint32_t i = 0; i < mult; ++i) {
337 mSim->set(
x * mult + i, value);
UISlider dampening("Dampening", 6.0f, 0.0f, 10.0f, 0.1f)
void setf(size_t x, float value)
fl::scoped_ptr< WaveSimulation1D_Real > mSim
void init(uint32_t length, SuperSample factor, float speed, int dampening)
WaveSimulation1D(uint32_t length, SuperSample factor=SuperSample::SUPER_SAMPLE_NONE, float speed=0.16f, int dampening=6)
int8_t geti8(size_t x) const
int16_t geti16(size_t x) const
float getf(size_t x) const
int getDampenening() const
void setSpeed(float speed)
void setDampening(int damp)
void setExtraFrames(uint8_t extra)
uint8_t getu8(size_t x) const
int16_t geti16Previous(size_t x) const
bool geti16All(size_t x, int16_t *curr, int16_t *prev, int16_t *diff) const
uint32_t getLength() const
int16_t geti16(size_t x, size_t y) const
uint32_t getWidth() const
void init(uint32_t width, uint32_t height, SuperSample factor, float speed, int dampening)
int getDampenening() const
void setExtraFrames(uint8_t extra)
uint32_t getHeight() const
int8_t geti8(size_t x, size_t y) const
fl::Grid< int16_t > mChangeGrid
fl::scoped_ptr< WaveSimulation2D_Real > mSim
void setSpeed(float speed)
bool geti16All(size_t x, size_t y, int16_t *curr, int16_t *prev, int16_t *diff) const
float getf(size_t x, size_t y) const
uint8_t getu8(size_t x, size_t y) const
void seti16(size_t x, size_t y, int16_t value)
void setf(size_t x, size_t y, float value)
bool has(size_t x, size_t y) const
void setDampening(int damp)
WaveSimulation2D(uint32_t W, uint32_t H, SuperSample factor=SuperSample::SUPER_SAMPLE_NONE, float speed=0.16f, float dampening=6.0f)
int16_t geti16Previous(size_t x, size_t y) const
UISlider length("Length", 1.0f, 0.0f, 1.0f, 0.01f)
Implements the FastLED namespace macros.
uint8_t half_duplex_blend_sqrt_q15(uint16_t x)
uint8_t half_duplex_blend_linear(uint16_t x)
int16_t float_to_fixed(float f)
FASTLED_FORCE_INLINE T clamp(T value, T min, T max)
Implements a simple red square effect for 2D LED grids.