ScreenSaver/src/effects/spline.cpp

114 lines
2.9 KiB
C++

#include "effects.h"
#include <num/num.h>
#include "../utilities/fast_trig.h"
#include <cstring>
#include <gint/rtc.h>
#include "../utilities/trajectory.h"
Trajectory MySpline;
#define MAXPT 10
libnum::num32 xPointsOrigin[MAXPT];
libnum::num32 yPointsOrigin[MAXPT];
libnum::num32 xPointsVel[MAXPT];
libnum::num32 yPointsVel[MAXPT];
static int current_morph_frame;
int random_between( int lower, int upper )
{
int number = (rand() % (upper - lower + 1)) + lower;
return number;
}
void spline_init( bopti_image_t *screen )
{
for( int i=0; i<MAXPT; i++ )
{
xPointsOrigin[i] = libnum::num32( DWIDTH/2 );
yPointsOrigin[i] = libnum::num32( MAXHEIGHT/2 );
xPointsVel[i] = libnum::num32( random_between( -2, 2 ) ) / libnum::num32(5);
yPointsVel[i] = libnum::num32( random_between( -2, 2 ) ) / libnum::num32(5);
}
for( int u=0; u<MAXPT; u++ )
{
Vector2D *p = new Vector2D( xPointsOrigin[u], yPointsOrigin[u] );
MySpline.AddPoint( p );
}
for(int u = 0; u<64; u++)
{
screen->palette[u] = C_RGB( 0, 0, 0 );
screen->palette[u+64] = C_RGB( 0, 0, u/2 );
screen->palette[u+128] = C_RGB( 0, u/2, 31 );
screen->palette[u+192] = C_RGB( u/2, 31, 31 );
}
}
void spline_update( bopti_image_t *screen, [[Maybe_unused]] float dt )
{
MySpline.RemovePoints();
for( int u=0; u<MAXPT; u++ )
{
xPointsOrigin[u] += xPointsVel[u];
if (xPointsOrigin[u]<libnum::num32(10)) xPointsOrigin[u] = 10, xPointsVel[u] = -xPointsVel[u];
else if (xPointsOrigin[u]>=libnum::num32(DWIDTH-10)) xPointsOrigin[u] = DWIDTH-11, xPointsVel[u] = -xPointsVel[u];
yPointsOrigin[u] += yPointsVel[u];
if (yPointsOrigin[u]<libnum::num32(10)) yPointsOrigin[u] = 10, yPointsVel[u] = -yPointsVel[u];
else if (yPointsOrigin[u]>=libnum::num32(MAXHEIGHT-10)) yPointsOrigin[u] = MAXHEIGHT-11, yPointsVel[u] = -yPointsVel[u];
Vector2D *p = new Vector2D( xPointsOrigin[u], yPointsOrigin[u] );
MySpline.AddPoint( p );
}
}
void spline_render( bopti_image_t *screen )
{
image_fill( screen, -128 );
float accumulatedTime = 0.0f;
libnum::num32 x0, y0, x1, y1, x2, y2;
MySpline.CalculatePosition( &accumulatedTime, 0.0f, 0.0f, true, &x0, &y0 );
for( int u=0; u<MAXPT*10; u++ )
{
MySpline.CalculatePosition( &accumulatedTime, 0.0f, 1.0f, true, &x1, &y1 );
accumulatedTime = (float) u * 0.1f;
MySpline.CalculatePosition( &accumulatedTime, 0.0f, 1.0f, true, &x2, &y2 );
drawline( screen, (int) x1, (int) y1, (int) x2, (int) y2, 127 );
}
drawline( screen, (int) x2, (int) y2, (int) x0, (int) y0, 127 );
dimage( 0, 0, screen );
}
void spline_deinit( bopti_image_t *screen )
{
MySpline.RemovePoints();
}
char spline_TextToRender[100] = "Spline Distorsion > _\0";
char *spline_text( void )
{
return spline_TextToRender;
}