From d186ead9ff7d202685960f42b40344ad9c272a9c Mon Sep 17 00:00:00 2001 From: Forairaaaaa Date: Sat, 30 Mar 2024 00:53:11 +0800 Subject: [PATCH] add simple water wave generator --- .../water_wave_generator.cpp | 58 +++++++++++++++++++ .../water_wave_generator.h | 48 +++++++++++++++ src/smooth_ui_toolkit.h | 2 + 3 files changed, 108 insertions(+) create mode 100644 src/misc/water_wave_generator/water_wave_generator.cpp create mode 100644 src/misc/water_wave_generator/water_wave_generator.h diff --git a/src/misc/water_wave_generator/water_wave_generator.cpp b/src/misc/water_wave_generator/water_wave_generator.cpp new file mode 100644 index 0000000..7a56cfa --- /dev/null +++ b/src/misc/water_wave_generator/water_wave_generator.cpp @@ -0,0 +1,58 @@ +/** + * @file water_wave_generator.cpp + * @author Forairaaaaa + * @brief + * @version 0.1 + * @date 2024-03-30 + * + * @copyright Copyright (c) 2024 + * + */ +#include "water_wave_generator.h" +#include "../../utils/fpm/fixed.hpp" +#include "../../utils/fpm/math.hpp" + +using namespace SmoothUIToolKit::Misc; + +void WaterWaveGenerator::init(size_t waveLenght) +{ + if (waveLenght == 0) + return; + + // Resize + _data.wave_a_buffer.reSize(waveLenght); + _data.wave_b_buffer.reSize(waveLenght); + + // Fill it up + for (int i = 0; i < waveLenght; i++) + { + _data.wave_a_buffer.put(_wave_a_formula(i)); + _data.wave_b_buffer.put(_wave_b_formula(i)); + } + _data.wave_x = waveLenght; +} + +void WaterWaveGenerator::update() +{ + // Put wave b twice to make it faster + _data.wave_a_buffer.put(_wave_a_formula(_data.wave_x)); + _data.wave_b_buffer.put(_wave_b_formula(_data.wave_x)); + _data.wave_b_buffer.put(_wave_b_formula(_data.wave_x)); + _data.wave_x++; +} + +// Just simple sine +// https://www.desmos.com/calculator/dvzez1v6gr +int WaterWaveGenerator::_wave_a_formula(const int& x) +{ + fpm::fixed_16_16 fx{x}; + fx = fpm::sin(fx / 60) * 10; + return static_cast(fx); +} + +int WaterWaveGenerator::_wave_b_formula(const int& x) +{ + fpm::fixed_16_16 fx{x - 20}; + fx = fpm::sin(fx / 60) * 13 - 10; + return static_cast(fx); +} diff --git a/src/misc/water_wave_generator/water_wave_generator.h b/src/misc/water_wave_generator/water_wave_generator.h new file mode 100644 index 0000000..7aa406a --- /dev/null +++ b/src/misc/water_wave_generator/water_wave_generator.h @@ -0,0 +1,48 @@ +/** + * @file water_wave_generator.h + * @author Forairaaaaa + * @brief + * @version 0.1 + * @date 2024-03-30 + * + * @copyright Copyright (c) 2024 + * + */ +#pragma once +#include "../../core/types/types.h" +#include "../../utils/ring_buffer/ring_buffer.h" +#include +#include + +namespace SmoothUIToolKit +{ + namespace Misc + { + /** + * @brief Provide two dynamic sine curves, to simulate waving water surface. + * + */ + class WaterWaveGenerator + { + private: + struct Data_t + { + RingBuffer wave_a_buffer; + RingBuffer wave_b_buffer; + uint16_t wave_x = 0; + }; + Data_t _data; + + protected: + virtual int _wave_a_formula(const int& x); + virtual int _wave_b_formula(const int& x); + + public: + void init(size_t waveLenght); + virtual void update(); + inline RingBuffer& getWaveA() { return _data.wave_a_buffer; } + inline RingBuffer& getWaveB() { return _data.wave_b_buffer; } + }; + + } // namespace Misc +} // namespace SmoothUIToolKit diff --git a/src/smooth_ui_toolkit.h b/src/smooth_ui_toolkit.h index 2b5c5c8..50f0eb2 100644 --- a/src/smooth_ui_toolkit.h +++ b/src/smooth_ui_toolkit.h @@ -26,3 +26,5 @@ #include "utils/ring_buffer/ring_buffer.h" #include "widgets/base/base.h" + +#include "misc/water_wave_generator/water_wave_generator.h"