ScreenSaver/src/effects/splineblur.cpp

137 lines
4.0 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 MySplineBlured;
#define MAXPOINT 12
int scalespline = 0, rotate = 0;
void splineblur_init( bopti_image_t *screen )
{
libnum::num32 scalenum = libnum::num32(1)+ FastCosInt(scalespline);
rotate = 0;
for( int u=0; u<MAXPOINT; u++ )
{
int angle = u*30;
Vector2D *p = new Vector2D( libnum::num32( DWIDTH/2 ) + scalenum*FastCosInt(angle+rotate)*libnum::num32(50),
libnum::num32( MAXHEIGHT/2 ) + scalenum*FastSinInt(angle+rotate)*libnum::num32(50) );
MySplineBlured.AddPoint( p );
Vector2D *p2 = new Vector2D( libnum::num32( DWIDTH/2 ) + (libnum::num32(2)-scalenum)*FastCosInt(angle+15+rotate)*libnum::num32(25),
libnum::num32( MAXHEIGHT/2 ) + (libnum::num32(2)-scalenum)*FastSinInt(angle+15+rotate)*libnum::num32(25) );
MySplineBlured.AddPoint( p2 );
}
for(int u = 0; u<32; u++)
{
screen->palette[u] = C_RGB( 0, 0, 0 );
screen->palette[u+32] = C_RGB( 0, 0, 0 );
screen->palette[u+64] = C_RGB( 0, 0, 0 );
screen->palette[u+96] = C_RGB( 0, 0, 0 );
screen->palette[u+128] = C_RGB( 0, 0, 0 );
screen->palette[u+160] = C_RGB( u, 0, 0 );
screen->palette[u+192] = C_RGB( 31, u, 0 );
screen->palette[u+224] = C_RGB( 31, 31, u );
}
image_fill( screen, -128 );
}
void splineblur_update( bopti_image_t *screen, [[Maybe_unused]] float dt )
{
MySplineBlured.RemovePoints();
scalespline += 1;
rotate += 1;
scalespline = scalespline % 360;
rotate = rotate % 360;
libnum::num32 scalenum = libnum::num32(1) + FastCosInt(scalespline);
for( int u=0; u<MAXPOINT; u++ )
{
int angle = u*30;
Vector2D *p = new Vector2D( libnum::num32( DWIDTH/2 ) + scalenum*FastCosInt(angle+rotate)*libnum::num32(50),
libnum::num32( MAXHEIGHT/2 ) + scalenum*FastSinInt(angle+rotate)*libnum::num32(50) );
MySplineBlured.AddPoint( p );
Vector2D *p2 = new Vector2D( libnum::num32( DWIDTH/2 ) + (libnum::num32(2)-scalenum)*FastCosInt(angle+15+rotate)*libnum::num32(25),
libnum::num32( MAXHEIGHT/2 ) + (libnum::num32(2)-scalenum)*FastSinInt(angle+15+rotate)*libnum::num32(25) );
MySplineBlured.AddPoint( p2 );
}
}
void Blur2( bopti_image_t *screen )
{
int8_t *dest = (int8_t *)screen->data;
int16_t temp;
uint32_t offset = screen->stride; // pixel(x,y)
for( int index = 2; index < MAXHEIGHT-2; index++ )
{
for( int x = 2; x < screen->width - 2; x++ )
{
temp = dest[ offset + x - 1 ] + // pixel(x-1,y)
dest[ offset + x + 1 ] + // pixel(x+1,y)
dest[ offset + x + screen->stride ] + // pixel(x,y+1)
dest[ offset + x - screen->stride ]; // pixel(x,y-1)
dest[offset + x] = temp >> 2;
}
offset += screen->stride;
}
}
void splineblur_render( bopti_image_t *screen )
{
float accumulatedTime = 0.0f;
libnum::num32 x1, y1, x2, y2;
for( int u=0; u<MAXPOINT*2*10; u++ )
{
MySplineBlured.CalculatePosition( &accumulatedTime, 0.0f, 1.0f, true, &x1, &y1 );
accumulatedTime = (float) u * 0.1f;
MySplineBlured.CalculatePosition( &accumulatedTime, 0.0f, 1.0f, true, &x2, &y2 );
drawline( screen, (int) x1, (int) y1, (int) x2, (int) y2, 127 );
}
Blur2( screen );
dimage( 0, 0, screen );
}
void splineblur_deinit( bopti_image_t *screen )
{
MySplineBlured.RemovePoints();
}
char splineblur_TextToRender[100] = "Spline Distorsion > _\0";
char *splineblur_text( void )
{
return splineblur_TextToRender;
}