|
@ -1,5 +1,12 @@ |
|
|
/**
|
|
|
/**
|
|
|
* Routines for drawing patterns generated by fixed point math functions. |
|
|
* \defgroup fixedpoint Fixed-point based animated plasma patterns. |
|
|
|
|
|
*/ |
|
|
|
|
|
/*@{*/ |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @file fpmath_patterns.c |
|
|
|
|
|
* @brief Routines for drawing patterns generated by fixed-point math functions. |
|
|
|
|
|
* @author Christian Kroll |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
#include <assert.h> |
|
|
#include <assert.h> |
|
@ -10,10 +17,6 @@ |
|
|
#include "../util.h" |
|
|
#include "../util.h" |
|
|
#include "fpmath_patterns.h" |
|
|
#include "fpmath_patterns.h" |
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* \defgroup fixedpoint Fixed-point based animated plasma patterns. |
|
|
|
|
|
*/ |
|
|
|
|
|
/*@{*/ |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Double buffering helps in reducing the effect of visibly redrawing every |
|
|
* Double buffering helps in reducing the effect of visibly redrawing every |
|
@ -52,26 +55,26 @@ |
|
|
#ifdef LOW_PRECISION |
|
|
#ifdef LOW_PRECISION |
|
|
/** This is the type we expect ordinary integers to be. */ |
|
|
/** This is the type we expect ordinary integers to be. */ |
|
|
typedef int16_t ordinary_int_t; |
|
|
typedef int16_t ordinary_int_t; |
|
|
/** This is the type which we use for fixed point values. */ |
|
|
/** This is the type which we use for fixed-point values. */ |
|
|
typedef int16_t fixp_t; |
|
|
typedef int16_t fixp_t; |
|
|
/** This type covers arguments of fixSin() and fixCos(). */ |
|
|
/** This type covers arguments of fixSin() and fixCos(). */ |
|
|
typedef int16_t fixp_trig_t; |
|
|
typedef int16_t fixp_trig_t; |
|
|
/** This type covers interim results of fixed point operations. */ |
|
|
/** This type covers interim results of fixed-point operations. */ |
|
|
typedef uint32_t fixp_interim_t; |
|
|
typedef uint32_t fixp_interim_t; |
|
|
/** This type covers interim results of the fixed point sqrt() function. */ |
|
|
/** This type covers interim results of the fixSqrt() function. */ |
|
|
typedef uint16_t ufixp_interim_t; |
|
|
typedef uint16_t ufixp_interim_t; |
|
|
/** Amount of bits the fixed point sqrt() function can handle. */ |
|
|
/** Number of bits the fixSqrt() function can handle. */ |
|
|
#define SQRT_BITS 16 |
|
|
#define SQRT_BITS 16 |
|
|
|
|
|
|
|
|
// NOTE: If you change the following values, don't forget to adapt the sine
|
|
|
// NOTE: If you change the following values, don't forget to adapt the sine
|
|
|
// lookup table as well!
|
|
|
// lookup table as well!
|
|
|
|
|
|
|
|
|
/** Multiply a number by this factor to convert it to a fixed point value.*/ |
|
|
/** Multiply a number by this factor to convert it to a fixed-point value.*/ |
|
|
#define FIX 32 |
|
|
#define FIX 32 |
|
|
/** Amount of fractional bits of a value (i.e. ceil(log_2(FIX))). */ |
|
|
/** Number of fractional bits of a value (i.e. ceil(log_2(FIX))). */ |
|
|
#define FIX_FRACBITS 5 |
|
|
#define FIX_FRACBITS 5 |
|
|
/**
|
|
|
/**
|
|
|
* The amount of temporal quantization steps of the sine lookup table. It |
|
|
* The number of temporal quantization steps of the sine lookup table. It |
|
|
* must be a divisor of (FIX * 2 * pi) and this divisor must be divisable by |
|
|
* must be a divisor of (FIX * 2 * pi) and this divisor must be divisable by |
|
|
* 4 itself. Approximate this value as close as possible to keep rounding |
|
|
* 4 itself. Approximate this value as close as possible to keep rounding |
|
|
* errors at a minimum. |
|
|
* errors at a minimum. |
|
@ -99,26 +102,26 @@ |
|
|
#else |
|
|
#else |
|
|
/** This is the type we expect ordinary integers to be. */ |
|
|
/** This is the type we expect ordinary integers to be. */ |
|
|
typedef int16_t ordinary_int_t; |
|
|
typedef int16_t ordinary_int_t; |
|
|
/** This is the type which we use for fixed point values. */ |
|
|
/** This is the type which we use for fixed-point values. */ |
|
|
typedef int16_t fixp_t; |
|
|
typedef int16_t fixp_t; |
|
|
/** This type covers arguments of fixSin() and fixCos(). */ |
|
|
/** This type covers arguments of fixSin() and fixCos(). */ |
|
|
typedef int32_t fixp_trig_t; |
|
|
typedef int32_t fixp_trig_t; |
|
|
/** This type covers interim results of fixed point operations. */ |
|
|
/** This type covers interim results of fixed-point operations. */ |
|
|
typedef int32_t fixp_interim_t; |
|
|
typedef int32_t fixp_interim_t; |
|
|
/** This type covers interim results of the fixed point sqrt() function. */ |
|
|
/** This type covers interim results of the fixSqrt() function. */ |
|
|
typedef uint32_t ufixp_interim_t; |
|
|
typedef uint32_t ufixp_interim_t; |
|
|
/** Amount of bits the fixed point sqrt() function can handle. */ |
|
|
/** Number of bits the fixSqrt() function can handle. */ |
|
|
#define SQRT_BITS 32 |
|
|
#define SQRT_BITS 32 |
|
|
|
|
|
|
|
|
// NOTE: If you change the following values, don't forget to adapt the sine
|
|
|
// NOTE: If you change the following values, don't forget to adapt the sine
|
|
|
// lookup table as well!
|
|
|
// lookup table as well!
|
|
|
|
|
|
|
|
|
/** Multiply a number by this factor to convert it to a fixed point value.*/ |
|
|
/** Multiply a number by this factor to convert it to a fixed-point value.*/ |
|
|
#define FIX 256 |
|
|
#define FIX 256 |
|
|
/** Amount of fractional bits of a value (i.e. ceil(log_2(FIX))). */ |
|
|
/** Number of fractional bits of a value (i.e. ceil(log_2(FIX))). */ |
|
|
#define FIX_FRACBITS 8 |
|
|
#define FIX_FRACBITS 8 |
|
|
/**
|
|
|
/**
|
|
|
* The amount of temporal quantization steps of the sine lookup table. It |
|
|
* The number of temporal quantization steps of the sine lookup table. It |
|
|
* must be a divisor of (FIX * 2 * pi) and this divisor must be divisable by |
|
|
* must be a divisor of (FIX * 2 * pi) and this divisor must be divisable by |
|
|
* 4 itself. Approximate this value as close as possible to keep rounding |
|
|
* 4 itself. Approximate this value as close as possible to keep rounding |
|
|
* errors at a minimum. |
|
|
* errors at a minimum. |
|
@ -149,18 +152,18 @@ |
|
|
|
|
|
|
|
|
/** The ordinary pi constant. */ |
|
|
/** The ordinary pi constant. */ |
|
|
#define PI 3.14159265358979323846 |
|
|
#define PI 3.14159265358979323846 |
|
|
/** Fixed point version of (pi / 2). */ |
|
|
/** Fixed-point version of (pi / 2). */ |
|
|
#define FIX_PI_2 ((fixp_t)(PI * FIX / 2)) |
|
|
#define FIX_PI_2 ((fixp_t)(PI * FIX / 2)) |
|
|
/** Fixed point version of pi. */ |
|
|
/** Fixed-point version of pi. */ |
|
|
#define FIX_PI ((fixp_t)(PI * FIX)) |
|
|
#define FIX_PI ((fixp_t)(PI * FIX)) |
|
|
/** Fixed point version of (2 * pi). */ |
|
|
/** Fixed-point version of (2 * pi). */ |
|
|
#define FIX_2PI ((fixp_t)(2 * PI * FIX)) |
|
|
#define FIX_2PI ((fixp_t)(2 * PI * FIX)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Scales an ordinary integer up to its fixed point format. |
|
|
* Scales an ordinary integer up to its fixed-point format. |
|
|
* @param a an ordinary integer to be scaled up |
|
|
* @param a An ordinary integer to be scaled up. |
|
|
* @return The given value in fixed point format. |
|
|
* @return The given value in fixed-point format. |
|
|
*/ |
|
|
*/ |
|
|
inline static fixp_t fixScaleUp(ordinary_int_t a) |
|
|
inline static fixp_t fixScaleUp(ordinary_int_t a) |
|
|
{ |
|
|
{ |
|
@ -169,10 +172,10 @@ inline static fixp_t fixScaleUp(ordinary_int_t a) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Scales a fixed point value down to an ordinary integer (omitting the |
|
|
* Scales a fixed-point value down to an ordinary integer (omitting the |
|
|
* fractional part). |
|
|
* fractional part). |
|
|
* @param a fixed point value to be scaled down |
|
|
* @param a Fixed-point value to be scaled down to an integer. |
|
|
* @return The given value in fixed point format. |
|
|
* @return The given value as an integer. |
|
|
*/ |
|
|
*/ |
|
|
inline static ordinary_int_t fixScaleDown(fixp_t const a) |
|
|
inline static ordinary_int_t fixScaleDown(fixp_t const a) |
|
|
{ |
|
|
{ |
|
@ -181,9 +184,9 @@ inline static ordinary_int_t fixScaleDown(fixp_t const a) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Multiplies two fixed point values. |
|
|
* Multiplies two fixed-point values. |
|
|
* @param a operand a |
|
|
* @param a A multiplicand. |
|
|
* @param b operand b |
|
|
* @param b A multiplying factor. |
|
|
* @return Product of a and b. |
|
|
* @return Product of a and b. |
|
|
*/ |
|
|
*/ |
|
|
inline static fixp_interim_t fixMul(fixp_t const a, fixp_t const b) |
|
|
inline static fixp_interim_t fixMul(fixp_t const a, fixp_t const b) |
|
@ -193,9 +196,9 @@ inline static fixp_interim_t fixMul(fixp_t const a, fixp_t const b) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Divides two fixed point values. |
|
|
* Divides two fixed-point values. |
|
|
* @param a operand a |
|
|
* @param a A dividend. |
|
|
* @param b operand b |
|
|
* @param b A divisor. |
|
|
* @return Quotient of a and b. |
|
|
* @return Quotient of a and b. |
|
|
*/ |
|
|
*/ |
|
|
inline static fixp_t fixDiv(fixp_interim_t const a, fixp_interim_t const b) |
|
|
inline static fixp_t fixDiv(fixp_interim_t const a, fixp_interim_t const b) |
|
@ -205,13 +208,13 @@ inline static fixp_t fixDiv(fixp_interim_t const a, fixp_interim_t const b) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Fixed point variant of the sine function which receives a fixed point angle |
|
|
* Fixed-point variant of the sine function which receives a fixed-point angle |
|
|
* (radian). It uses a lookup table which models the first quarter of a full |
|
|
* (radian). It uses a lookup table which models the first quarter of a full |
|
|
* sine period and calculates the rest from that quarter. |
|
|
* sine period and calculates the rest from that quarter. |
|
|
* @param angle fixed point radian value |
|
|
* @param fAngle A fixed-point value in radian. |
|
|
* @return Result of the sine function normalized to a range from -FIX to FIX. |
|
|
* @return Result of the sine function normalized to a range from -FIX to FIX. |
|
|
*/ |
|
|
*/ |
|
|
static fixp_t fixSin(fixp_t fAngle) |
|
|
static fixp_t fixSin(fixp_trig_t fAngle) |
|
|
{ |
|
|
{ |
|
|
// convert given fixed-point angle to its corresponding quantization step
|
|
|
// convert given fixed-point angle to its corresponding quantization step
|
|
|
int8_t nSign = 1; |
|
|
int8_t nSign = 1; |
|
@ -251,22 +254,22 @@ static fixp_t fixSin(fixp_t fAngle) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Fixed point variant of the cosine function which takes a fixed point angle |
|
|
* Fixed-point variant of the cosine function which takes a fixed-point angle |
|
|
* (radian). It adds FIX_PI_2 to the given angle and consults the fixSin() |
|
|
* (radian). It adds FIX_PI_2 to the given angle and consults the fixSin() |
|
|
* function for the final result. |
|
|
* function for the final result. |
|
|
* @param angle fixed point radian value |
|
|
* @param fAngle A fixed-point value in radian. |
|
|
* @return Result of the cosine function normalized to a range from -FIX to FIX. |
|
|
* @return Result of the cosine function normalized to a range from -FIX to FIX. |
|
|
*/ |
|
|
*/ |
|
|
static fixp_t fixCos(fixp_t const angle) |
|
|
static fixp_t fixCos(fixp_trig_t const fAngle) |
|
|
{ |
|
|
{ |
|
|
return fixSin(angle + FIX_PI_2); |
|
|
return fixSin(fAngle + FIX_PI_2); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Fixed point square root algorithm as proposed by Ken Turkowski: |
|
|
* Fixed-point square root algorithm as proposed by Ken Turkowski: |
|
|
* http://www.realitypixels.com/turk/computergraphics/FixedSqrt.pdf
|
|
|
* http://www.realitypixels.com/turk/computergraphics/FixedSqrt.pdf
|
|
|
* @param radicant we want the square root of |
|
|
* @param a The radicant we want the square root of. |
|
|
* @return The square root of the given value. |
|
|
* @return The square root of the given value. |
|
|
*/ |
|
|
*/ |
|
|
static fixp_t fixSqrt(ufixp_interim_t const a) |
|
|
static fixp_t fixSqrt(ufixp_interim_t const a) |
|
@ -295,11 +298,11 @@ static fixp_t fixSqrt(ufixp_interim_t const a) |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Calculates the distance between two points. |
|
|
* Calculates the distance between two points. |
|
|
* @param x1 x coordinate of the first point |
|
|
* @param x1 x-coordinate of the first point |
|
|
* @param y1 y coordinate of the first point |
|
|
* @param y1 y-coordinate of the first point |
|
|
* @param x2 x coordinate of the second point |
|
|
* @param x2 x-coordinate of the second point |
|
|
* @param y2 y coordinate of the second point |
|
|
* @param y2 y-coordinate of the second point |
|
|
* @return The distance between the given coordinates. |
|
|
* @return The distance between the given points. |
|
|
*/ |
|
|
*/ |
|
|
static fixp_t fixDist(fixp_t const x1, |
|
|
static fixp_t fixDist(fixp_t const x1, |
|
|
fixp_t const y1, |
|
|
fixp_t const y1, |
|
@ -312,12 +315,12 @@ static fixp_t fixDist(fixp_t const x1, |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* This pointer type covers functions which return a brightness value for the |
|
|
* This pointer type covers functions which return a brightness value for the |
|
|
* given coordinates and a "step" value. This actually results in a more or less |
|
|
* given coordinates and a "step" value. Applied to all coordinates of the |
|
|
* "beautiful" pattern. |
|
|
* borg's display this actually results in a more or less beautiful pattern. |
|
|
* @param x x-coordinate |
|
|
* @param x x-coordinate |
|
|
* @param y y-coordinate |
|
|
* @param y y-coordinate |
|
|
* @param t step value which changes for each frame, allowing for animations |
|
|
* @param t A step value which changes for each frame, allowing for animations. |
|
|
* @param r pointer to persistent data required by the pattern function |
|
|
* @param r A pointer to persistent data required by the pattern function. |
|
|
* @return The brightness value (0 < n <= NUM_PLANES) of the given coordinate. |
|
|
* @return The brightness value (0 < n <= NUM_PLANES) of the given coordinate. |
|
|
*/ |
|
|
*/ |
|
|
typedef unsigned char (*fpmath_pattern_func_t)(unsigned char const x, |
|
|
typedef unsigned char (*fpmath_pattern_func_t)(unsigned char const x, |
|
@ -334,12 +337,12 @@ typedef unsigned char (*fpmath_pattern_func_t)(unsigned char const x, |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Draws an animated two dimensional graph for a given function f(x, y, t). |
|
|
* Draws an animated two dimensional graph for a given function f(x, y, t). |
|
|
* @param t_start start value for the function's step variable |
|
|
* @param t_start A start value for the function's step variable. |
|
|
* @param t_stop stop value for the function's step variable |
|
|
* @param t_stop A stop value for the function's step variable. |
|
|
* @param t_delta value by which the function's step variable gets incremented |
|
|
* @param t_delta Value by which the function's step variable gets incremented. |
|
|
* @param frame_delay frame delay in milliseconds |
|
|
* @param frame_delay The frame delay in milliseconds. |
|
|
* @param fpPattern function which generates a pattern depending on x, y and t |
|
|
* @param fpPattern Function which generates a pattern depending on x, y and t. |
|
|
* @param r pointer to persistent data required by the fpPattern function |
|
|
* @param r A pointer to persistent data required by the fpPattern function. |
|
|
*/ |
|
|
*/ |
|
|
static void fixPattern(fixp_t const t_start, |
|
|
static void fixPattern(fixp_t const t_start, |
|
|
fixp_t const t_stop, |
|
|
fixp_t const t_stop, |
|
@ -387,22 +390,42 @@ static void fixPattern(fixp_t const t_start, |
|
|
/**
|
|
|
/**
|
|
|
* This type maintains values relevant for the Plasma animation which need to be |
|
|
* This type maintains values relevant for the Plasma animation which need to be |
|
|
* persistent over consecutive invocations. |
|
|
* persistent over consecutive invocations. |
|
|
|
|
|
* @see fixAnimPlasma() |
|
|
*/ |
|
|
*/ |
|
|
typedef struct fixp_plasma_s |
|
|
typedef struct fixp_plasma_s |
|
|
{ |
|
|
{ |
|
|
fixp_t fFunc1[NUM_COLS]; /**< Result of 1st trig. func. depending on x. */ |
|
|
/**
|
|
|
fixp_t fFunc2CosArg; /**< Arg. of 2st trig. func. depending on the frame. */ |
|
|
* This array holds column dependent results of the first internal pattern |
|
|
fixp_t fFunc2SinArg; /**< Arg. of 2st trig. func. depending on the frame. */ |
|
|
* function. Those results only need to be calculated for the first row of |
|
|
|
|
|
* the current frame and are then reused for the remaining rows. |
|
|
|
|
|
*/ |
|
|
|
|
|
fixp_t fFunc1[NUM_COLS]; |
|
|
|
|
|
/**
|
|
|
|
|
|
* This value is part of the formula for the second internal pattern |
|
|
|
|
|
* function. It needs to be calculated only once per frame. |
|
|
|
|
|
*/ |
|
|
|
|
|
fixp_t fFunc2CosArg; |
|
|
|
|
|
/**
|
|
|
|
|
|
* This value is part of the formula for the second internal pattern |
|
|
|
|
|
* function. It needs to be calculated only once per frame. |
|
|
|
|
|
*/ |
|
|
|
|
|
fixp_t fFunc2SinArg; |
|
|
} fixp_plasma_t; |
|
|
} fixp_plasma_t; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Draws a plasma like pattern (sort of... four shades of grey are pretty |
|
|
* Draws a plasma like pattern (sort of... four shades of grey are pretty |
|
|
* scarce for a neat plasma animation). |
|
|
* scarce for a neat plasma animation). This is realized by superimposing two |
|
|
|
|
|
* functions which generate independent patterns for themselves. |
|
|
|
|
|
* |
|
|
|
|
|
* The first function draws horizontally moving waves and the second function |
|
|
|
|
|
* draws zoomed-in radiating curls. Together they create a wobbly, plasma like |
|
|
|
|
|
* pattern. |
|
|
|
|
|
* |
|
|
* @param x x-coordinate |
|
|
* @param x x-coordinate |
|
|
* @param y y-coordinate |
|
|
* @param y y-coordinate |
|
|
* @param t step value which changes for each frame, allowing for animations |
|
|
* @param t A Step value which changes for each frame, allowing for animations. |
|
|
* @param r pointer to persistent interim results |
|
|
* @param r A pointer to persistent interim results. |
|
|
* @return The brightness value (0 < n <= NUM_PLANES) of the given coordinate. |
|
|
* @return The brightness value (0 < n <= NUM_PLANES) of the given coordinate. |
|
|
*/ |
|
|
*/ |
|
|
static unsigned char fixAnimPlasma(unsigned char const x, |
|
|
static unsigned char fixAnimPlasma(unsigned char const x, |
|
@ -439,7 +462,9 @@ static unsigned char fixAnimPlasma(unsigned char const x, |
|
|
return nRes; |
|
|
return nRes; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Starting point for the Plasma animation. |
|
|
|
|
|
*/ |
|
|
void plasma(void) |
|
|
void plasma(void) |
|
|
{ |
|
|
{ |
|
|
fixp_plasma_t r; |
|
|
fixp_plasma_t r; |
|
@ -461,9 +486,9 @@ void plasma(void) |
|
|
*/ |
|
|
*/ |
|
|
typedef struct fixp_psychedelic_s |
|
|
typedef struct fixp_psychedelic_s |
|
|
{ |
|
|
{ |
|
|
fixp_t fCos; /** column factor for the circle calculation */ |
|
|
fixp_t fCos; /**< One of the column factors of the curl. */ |
|
|
fixp_t fSin; /** row factor for the circle calculation */ |
|
|
fixp_t fSin; /**< One of the row factors of the curl. */ |
|
|
fixp_interim_t ft10; /** value involved in rotating the animation's center*/ |
|
|
fixp_interim_t ft10; /**< A value involved in rotating the curl's center. */ |
|
|
} fixp_psychedelic_t; |
|
|
} fixp_psychedelic_t; |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -471,8 +496,8 @@ typedef struct fixp_psychedelic_s |
|
|
* Draws flowing circular waves with a rotating center. |
|
|
* Draws flowing circular waves with a rotating center. |
|
|
* @param x x-coordinate |
|
|
* @param x x-coordinate |
|
|
* @param y y-coordinate |
|
|
* @param y y-coordinate |
|
|
* @param t step value which changes for each frame, allowing for animations |
|
|
* @param t A step value which changes for each frame, allowing for animations. |
|
|
* @param r pointer to persistent interim results |
|
|
* @param r A pointer to persistent interim results. |
|
|
* @return The brightness value (0 < n <= NUM_PLANES) of the given coordinate. |
|
|
* @return The brightness value (0 < n <= NUM_PLANES) of the given coordinate. |
|
|
*/ |
|
|
*/ |
|
|
static unsigned char fixAnimPsychedelic(unsigned char const x, |
|
|
static unsigned char fixAnimPsychedelic(unsigned char const x, |
|
@ -500,6 +525,10 @@ static unsigned char fixAnimPsychedelic(unsigned char const x, |
|
|
return nResult; |
|
|
return nResult; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Starting point for the Psychedelic animation. |
|
|
|
|
|
*/ |
|
|
void psychedelic(void) |
|
|
void psychedelic(void) |
|
|
{ |
|
|
{ |
|
|
fixp_psychedelic_t r; |
|
|
fixp_psychedelic_t r; |
|
|