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;
92 for (u32 j = 0; j < mult; ++j) {
93 for (u32 i = 0; i < mult; ++i) {
94 u32 xx =
x * mult + i;
95 u32 yy =
y * mult + j;
96 i32 pt =
mSim->geti16(xx, yy);
110 i16 out =
static_cast<i16
>(sum / (mult * mult));
119 for (u32 j = 0; j < mult; ++j) {
120 for (u32 i = 0; i < mult; ++i) {
122 mSim->geti16Previous(
x * mult + i,
y * mult + j);
125 i16 out =
static_cast<i16
>(sum / (mult * mult));
135 *diff = *curr - *prev;
145 if (
mSim->getHalfDuplex()) {
146 u16 v2 =
static_cast<u16
>(
value);
149 return half_duplex_blend_linear(v2);
151 return half_duplex_blend_sqrt_q15(v2);
154 return static_cast<u8>(((
static_cast<u16
>(
value) + 32768)) >> 8);
168 int rad =
static_cast<int>(mult) / 2;
170 for (fl::size j = 0; j < mult; ++j) {
171 for (fl::size i = 0; i < mult; ++i) {
173 int dx =
static_cast<int>(i) - rad;
174 int dy =
static_cast<int>(j) - rad;
179 fl::size xx =
x * mult + i;
180 fl::size yy =
y * mult + j;
181 if (
mSim->has(xx, yy)) {
188 const bool sign_matches = (pt >= 0) == (v16 >= 0);
195 u16 abs_pt =
static_cast<u16
>(
fl::abs(pt));
196 u16 abs_v16 =
static_cast<u16
>(
fl::abs(v16));
197 if (abs_v16 > abs_pt) {
204 mSim->seti16(xx, yy, v16);
223 const bool has_updates = min_max !=
vec2<i16>(0, 0);
229 for (u32
x = 0;
x < w; ++
x) {
230 for (u32
y = 0;
y < h; ++
y) {
304 for (u32 i = 0; i < mult; ++i) {
305 sum +=
mSim->getf(
x * mult + i);
307 return sum /
static_cast<float>(mult);
315 for (u32 i = 0; i < mult; ++i) {
316 sum +=
mSim->geti16(
x * mult + i);
318 return static_cast<i16
>(sum / mult);
326 for (u32 i = 0; i < mult; ++i) {
327 sum +=
mSim->geti16Previous(
x * mult + i);
329 return static_cast<i16
>(sum / mult);
338 *diff = *curr - *prev;
363 if (
mSim->getHalfDuplex()) {
364 u16 v2 =
static_cast<u16
>(
value);
367 return half_duplex_blend_linear(v2);
369 return half_duplex_blend_sqrt_q15(v2);
372 return static_cast<u8>(((
static_cast<u16
>(
value) + 32768)) >> 8);
382 for (u32 i = 0; i < mult; ++i) {
u32 getLength() const FL_NO_EXCEPT
bool geti16All(fl::size x, i16 *curr, i16 *prev, i16 *diff) const FL_NO_EXCEPT
i16 geti16(fl::size x) const FL_NO_EXCEPT
fl::unique_ptr< WaveSimulation1D_Real > mSim
void setSpeed(float speed) FL_NO_EXCEPT
float getf(fl::size x) const FL_NO_EXCEPT
int getDampenening() const FL_NO_EXCEPT
WaveSimulation1D(u32 length, SuperSample factor=SuperSample::SUPER_SAMPLE_NONE, float speed=0.16f, int dampening=6) FL_NO_EXCEPT
void setDampening(int damp) FL_NO_EXCEPT
float getSpeed() const FL_NO_EXCEPT
i16 geti16Previous(fl::size x) const FL_NO_EXCEPT
void setf(fl::size x, float value) FL_NO_EXCEPT
i8 geti8(fl::size x) const FL_NO_EXCEPT
void setExtraFrames(u8 extra) FL_NO_EXCEPT
u8 getu8(fl::size x) const FL_NO_EXCEPT
void update() FL_NO_EXCEPT
bool has(fl::size x) const FL_NO_EXCEPT
void init(u32 length, SuperSample factor, float speed, int dampening) FL_NO_EXCEPT
bool has(fl::size x, fl::size y) const FL_NO_EXCEPT
u32 getWidth() const FL_NO_EXCEPT
i8 geti8(fl::size x, fl::size y) const FL_NO_EXCEPT
void setExtraFrames(u8 extra) FL_NO_EXCEPT
fl::Grid< i16 > mChangeGrid
void init(u32 width, u32 height, SuperSample factor, float speed, int dampening) FL_NO_EXCEPT
WaveSimulation2D(u32 W, u32 H, SuperSample factor=SuperSample::SUPER_SAMPLE_NONE, float speed=0.16f, float dampening=6.0f) FL_NO_EXCEPT
float getSpeed() const FL_NO_EXCEPT
void setUseChangeGrid(bool enabled) FL_NO_EXCEPT
int getDampenening() const FL_NO_EXCEPT
void seti16(fl::size x, fl::size y, i16 value) FL_NO_EXCEPT
i16 geti16(fl::size x, fl::size y) const FL_NO_EXCEPT
void setSpeed(float speed) FL_NO_EXCEPT
u8 getu8(fl::size x, fl::size y) const FL_NO_EXCEPT
i16 geti16Previous(fl::size x, fl::size y) const FL_NO_EXCEPT
void setf(fl::size x, fl::size y, float value) FL_NO_EXCEPT
bool geti16All(fl::size x, fl::size y, i16 *curr, i16 *prev, i16 *diff) const FL_NO_EXCEPT
u32 getHeight() const FL_NO_EXCEPT
float getf(fl::size x, fl::size y) const FL_NO_EXCEPT
void update() FL_NO_EXCEPT
fl::unique_ptr< WaveSimulation2D_Real > mSim
void setDampening(int damp) FL_NO_EXCEPT
fl::UISlider length("Length", 1.0f, 0.0f, 1.0f, 0.01f)
fl::UISlider dampening("Dampening", 6.0f, 0.0f, 10.0f, 0.1f)
fl::u8 half_duplex_blend_sqrt_q15(fl::u16 x) FL_NO_EXCEPT
fl::u8 half_duplex_blend_linear(fl::u16 x) FL_NO_EXCEPT
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NO_EXCEPT
i16 float_to_fixed(float f) FL_NO_EXCEPT
constexpr common_type_t< T, U > max(T a, U b) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
constexpr int type_rank< T >::value
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NO_EXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type clamp(T x, T lo, T hi) FL_NO_EXCEPT
void init(Context &ctx, int w, int h) FL_NO_EXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type abs(T x) FL_NO_EXCEPT
Base definition for an LED controller.