FastLED 3.9.15
Loading...
Searching...
No Matches
perlin_q16.h
Go to the documentation of this file.
1#pragma once
2
3// 2D Perlin noise Q16 implementation
4// Extracted from animartrix_detail.hpp
5//
6// Q16 variant: Uses 16 fractional bits instead of 24 for faster arithmetic.
7// Trades internal precision for speed: i32 ops instead of i64, smaller LUT.
8
11
12namespace fl {
13
14struct perlin_q16 {
15 static constexpr int HP_BITS = 16;
16 static constexpr fl::i32 HP_ONE = static_cast<fl::i32>(1) << HP_BITS; // 65536 = 1.0
17
18 // Build 257-entry Perlin fade LUT in Q16 format (16 fractional bits).
19 static void init_fade_lut(fl::i32 *table);
20
21 // 2D Perlin noise. Input s16x16, output s16x16 approx [-1, 1].
23 const fl::i32 *fade_lut,
24 const fl::u8 *perm);
25
26 // Raw i32 version using Q16 internal precision.
27 static fl::i32 pnoise2d_raw(fl::i32 fx_raw, fl::i32 fy_raw,
28 const fl::i32 *fade_lut,
29 const fl::u8 *perm);
30
31 private:
32 static constexpr int FP_BITS = fl::s16x16::FRAC_BITS;
33 static constexpr fl::i32 FP_ONE = static_cast<fl::i32>(1) << FP_BITS;
34
35 // Decompose s16x16 raw value into integer floor and Q16 fractional part.
36 static FASTLED_FORCE_INLINE void floor_frac(fl::i32 fp16, int &ifloor,
37 fl::i32 &frac16);
38
39 // LUT fade: 1 lookup + 1 lerp replaces 5 multiplies.
40 static FASTLED_FORCE_INLINE fl::i32 fade(fl::i32 t, const fl::i32 *table);
41
42 static FASTLED_FORCE_INLINE fl::i32 lerp(fl::i32 t, fl::i32 a, fl::i32 b);
43
44 // z=0 gradient via branchless coefficient LUT (Q16 format).
45 static FASTLED_FORCE_INLINE fl::i32 grad(int hash, fl::i32 x, fl::i32 y);
46};
47
48} // namespace fl
static constexpr int FRAC_BITS
Definition s16x16.h:22
unsigned char u8
Definition s16x16x4.h:132
Base definition for an LED controller.
Definition crgb.hpp:179
#define FASTLED_FORCE_INLINE
static constexpr int HP_BITS
Definition perlin_q16.h:15
static FASTLED_FORCE_INLINE fl::i32 grad(int hash, fl::i32 x, fl::i32 y)
static fl::i32 pnoise2d_raw(fl::i32 fx_raw, fl::i32 fy_raw, const fl::i32 *fade_lut, const fl::u8 *perm)
static FASTLED_FORCE_INLINE fl::i32 lerp(fl::i32 t, fl::i32 a, fl::i32 b)
static constexpr fl::i32 FP_ONE
Definition perlin_q16.h:33
static constexpr int FP_BITS
Definition perlin_q16.h:32
static void init_fade_lut(fl::i32 *table)
static FASTLED_FORCE_INLINE fl::i32 fade(fl::i32 t, const fl::i32 *table)
static constexpr fl::i32 HP_ONE
Definition perlin_q16.h:16
static FASTLED_FORCE_INLINE void floor_frac(fl::i32 fp16, int &ifloor, fl::i32 &frac16)
static fl::s16x16 pnoise2d(fl::s16x16 fx, fl::s16x16 fy, const fl::i32 *fade_lut, const fl::u8 *perm)