26static std::vector<uint32_t>
pixel;
27static std::vector<uint32_t>
back;
45const std::array<const GoomState,STATES_NB>
kStates {{
46 {.m_drawIfs=1, .m_drawPoints=0, .m_drawTentacle=0, .m_drawScope=1,
47 .m_farScope=4, .m_rangeMin=000, .m_rangeMax=100},
48 {.m_drawIfs=1, .m_drawPoints=0, .m_drawTentacle=0, .m_drawScope=1,
49 .m_farScope=1, .m_rangeMin=101, .m_rangeMax=140},
50 {.m_drawIfs=1, .m_drawPoints=0, .m_drawTentacle=0, .m_drawScope=1,
51 .m_farScope=2, .m_rangeMin=141, .m_rangeMax=200},
52 {.m_drawIfs=0, .m_drawPoints=1, .m_drawTentacle=0, .m_drawScope=1,
53 .m_farScope=2, .m_rangeMin=201, .m_rangeMax=260},
54 {.m_drawIfs=0, .m_drawPoints=1, .m_drawTentacle=0, .m_drawScope=1,
55 .m_farScope=0, .m_rangeMin=261, .m_rangeMax=330},
56 {.m_drawIfs=0, .m_drawPoints=1, .m_drawTentacle=1, .m_drawScope=1,
57 .m_farScope=4, .m_rangeMin=331, .m_rangeMax=400},
58 {.m_drawIfs=0, .m_drawPoints=0, .m_drawTentacle=1, .m_drawScope=1,
59 .m_farScope=5, .m_rangeMin=401, .m_rangeMax=450},
60 {.m_drawIfs=0, .m_drawPoints=0, .m_drawTentacle=1, .m_drawScope=1,
61 .m_farScope=1, .m_rangeMin=451, .m_rangeMax=510}
72void choose_a_goom_line (
float *param1,
float *param2,
int *couleur,
int *mode,
float *amplitude,
int far);
74void goom_init (uint32_t resx, uint32_t resy,
int cinemascope) {
76 printf (
"GOOM: init (%d, %d);\n", resx, resy);
126 p1 = (uint32_t *)
pixel.data();
127 p2 = (uint32_t *)
back.data();
136 static int s_lockVar = 0;
137 static int s_totalGoom = 0;
138 static int s_aGoom = 0;
139 static int s_aBigGoom = 0;
140 static int s_speedVar = 0;
143 static constexpr int DRAWLINES { 80 };
144 static int s_lineMode = DRAWLINES;
145 static int s_nombreCddc = 0;
146 static int s_accelVar=0;
147 static int s_stopLines = 0;
150 static int s_ifsIncr = 1;
151 static int s_decayIfs = 0;
152 static int s_recayIfs = 0;
154 static constexpr float SWITCHMULT { 29.0F/30.0F };
155 static constexpr int SWITCHINCR { 0x7f };
156 static float s_switchMult = 1.0F;
157 static int s_switchIncr = SWITCHINCR;
159 static char s_goomLimit = 2;
161 .
vitesse=127, .pertedec=8, .sqrtperte=16,
162 .middleX=1, .middleY=1, .reverse=
false, .mode=
NORMAL_MODE,
163 .hPlaneEffect=0, .vPlaneEffect=0, .waveEffect=
false,
164 .hypercosEffect=
false, .noisify=0
170 uint32_t pointWidth = (
resolx * 2) / 5;
171 uint32_t pointHeight = (
c_resoly * 2) / 5;
175 for (
int i = 0; i < 512; i++) {
176 incvar = std::max<int>(incvar, data[0][i]);
180 s_accelVar = incvar / 1000;
182 if (s_speedVar > 5) {
186 s_speedVar = std::min(s_speedVar, 40);
193 s_speedVar += (s_speedVar + (i/2));
195 if (s_speedVar && (
cycle%9==0)) {
198 if (s_speedVar && (
cycle%5==0)) {
199 s_speedVar = (s_speedVar*7)/8;
208 float largfactor = (((float) s_speedVar / 40.0F) + ((float) incvar / 50000.0F)) / 1.5F;
209 largfactor = std::min(largfactor, 1.5F);
221 if ((s_recayIfs == 0)&&(s_ifsIncr<=0))
229 for (i = 1; i * 15 <= s_speedVar + 15; i++) {
230 static int s_loopVar = 0;
231 s_loopVar += (s_speedVar*2/3) + 1;
234 (((pointWidth - 6.0F) * largfactor) + 5.0F),
235 (((pointHeight - 6.0F) * largfactor) + 5.0F),
236 i * 152.0F, 128.0F, s_loopVar + (i * 2032));
238 (((pointWidth / 2.0F) * largfactor) / i) + (10.0F * i),
239 (((pointHeight / 2.0F) * largfactor) / i) + (10.0F * i),
240 96.0F, i * 80.0F, s_loopVar / i);
242 ((((pointHeight / 3.0F) + 5.0F) * largfactor) / i) + (10.0F * i),
243 ((((pointHeight / 3.0F) + 5.0F) * largfactor) / i) + (10.0F * i),
244 i + 122.0F, 134.0F, s_loopVar / i);
246 (((pointHeight / 3.0F) * largfactor) + 20.0F),
247 (((pointHeight / 3.0F) * largfactor) + 20.0F),
248 58.0F, i * 66.0F, s_loopVar / i);
250 ((pointHeight * largfactor) + (10.0F * i)) / i,
251 ((pointHeight * largfactor) + (10.0F * i)) / i,
252 66.0F, 74.0F, s_loopVar + (i * 500)); }
262 if (forceMode != 0) {
263 printf (
"forcemode = %d\n", forceMode);
281 if (--s_aBigGoom < 0)
284 if ((!s_aBigGoom) && (s_speedVar > 4) && (s_goomLimit > 4) &&
285 ((s_accelVar > (s_goomLimit*9/8)+7)||(s_accelVar < (-s_goomLimit*9/8)-7))) {
286 static int s_couleur =
293 for (
int j=0;j<size;j++)
298 if ((s_accelVar > s_goomLimit) || (s_accelVar < -s_goomLimit) || (forceMode > 0)
393 if (s_lockVar == 0) {
396 if ((s_accelVar > s_goomLimit) || (s_accelVar < -s_goomLimit)) {
397 static int s_rndn = 0;
398 static int s_blocker = 0;
411 auto goodstate = [&](
auto state)
412 {
return (s_rndn >= state.m_rangeMin) &&
413 (s_rndn <= state.m_rangeMax); };
415 std::ranges::find_if(std::as_const(
kStates), goodstate);
429 s_lineMode = DRAWLINES;
435 uint32_t newvit =
STOP_SPEED + 1 - (4.0F * log10f(s_speedVar+1));
538 if (newvit < (uint32_t)s_zfd.
vitesse)
554 if (s_lockVar > 150) {
555 s_switchIncr = SWITCHINCR;
566 s_switchIncr = SWITCHINCR;
601 if ((forceMode > 0) && (forceMode <=
NB_FX)) {
603 pzfd->
mode = forceMode - 1;
606 if (forceMode == -1) {
613 if (pzfd !=
nullptr) {
614 static int s_exvit = 128;
618 s_switchIncr = SWITCHINCR;
620 int dif = s_zfd.
vitesse - s_exvit;
625 s_switchIncr *= (dif + 2) / 2;
630 if (((s_accelVar > s_goomLimit) && (s_totalGoom < 2)) || (forceMode > 0)) {
632 s_switchMult = SWITCHMULT;
648 printf (
"GOOM: pzfd->mode = %d\n", pzfd->
mode);
725 float amplitude = NAN;
734 s_stopLines &= 0x0fff;
740 if (s_lineMode != DRAWLINES) {
742 if (s_lineMode == -1)
751 if ((
cycle % 120 == 0)
754 if (s_lineMode == 0) {
755 s_lineMode = DRAWLINES;
756 }
else if (s_lineMode == DRAWLINES) {
759 float amplitude = NAN;
767 couleur2 = 5-couleur1;
782 if ((s_lineMode != 0) || (s_aGoom > 15)) {
789 && ((s_lineMode == 0) || (s_lineMode == DRAWLINES))) {
792 float amplitude = NAN;
798 couleur2 = 5-couleur1;
810 uint32_t *return_val =
p1;
823 if (s_totalGoom > 4) {
826 if (s_totalGoom > 7) {
830 if ((s_totalGoom == 0) && (s_goomLimit > 1))
832 if ((s_totalGoom == 1) && (s_goomLimit > 1))
849void choose_a_goom_line (
float *param1,
float *param2,
int *couleur,
int *mode,
float *amplitude,
int far) {
855 *param1 = *param2 = 0.47F;
860 *param1 = *param2 = 0;
868 *param1 = *param2 =
c_resoly * 0.35F;
877 *param1 = *param2 =
c_resoly / 2.0F;
884 *param2 = 6.0F *
resolx / 7.0F;
887 *param1 = *param2 =
resolx / 2.0F;
void zoomFilterFastRGB(unsigned int *pix1, unsigned int *pix2, ZoomFilterData *zf, unsigned int resx, unsigned int resy, int switchIncr, float switchMult)
void pointFilter(unsigned int *pix1, Color c, float t1, float t2, float t3, float t4, unsigned int cycle)
uint32_t * goom_update(GoomDualData &data, int forceMode)
static std::vector< uint32_t > back
void goom_init(uint32_t resx, uint32_t resy, int cinemascope)
void goom_set_resolution(uint32_t resx, uint32_t resy, int cinemascope)
static constexpr size_t STATES_NB
static constexpr int16_t TIME_BTW_CHG
static std::vector< uint32_t > pixel
--------------------------------------------------—**
const GoomState * curGState
void choose_a_goom_line(float *param1, float *param2, int *couleur, int *mode, float *amplitude, int far)
const std::array< const GoomState, STATES_NB > kStates
static constexpr int32_t STOP_SPEED
static constexpr uint16_t STATES_RANGEMAX
static constexpr int8_t NB_FX
std::array< GoomSingleData, 2 > GoomDualData
@ ROUGE
position des composantes
void init_ifs(int width, int height)
void ifs_update(uint32_t *data, const uint32_t *back, int width, int height, int increment)
void goom_lines_set_res(GMLine *gml, int rx, int ry)
GMLine * goom_lines_init(int rx, int ry, int IDsrc, float paramS, int coulS, int IDdest, float paramD, int coulD)
void goom_lines_switch_to(GMLine *gml, int IDdest, float param, float amplitude, int col)
void goom_lines_draw(GMLine *line, const GoomSingleData &data, unsigned int *p)
void goom_lines_free(GMLine **l)
Convenience inline random number generator functions.
int MythRandomTriangularInt(int x)
Generate a random signed int over a symmetric triangular distribution with a minimum of -x,...
int MythRandomInt(int min, int max)
generate a uniformly distributed random signed int in the closed interval [min, max].
uint32_t MythRandom()
generate 32 random bits
bool rand_bool(uint32_t chance=2)
return a random bool with P(true) = 1/chance
static eu8 clamp(eu8 value, eu8 low, eu8 high)
void tentacle_update(int *buf, int *back, int W, int H, GoomDualData &data, float rapport, int drawit)