137 lines
4.0 KiB
C++
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;
|
|
} |