114 lines
2.9 KiB
C++
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;
|
|
} |