added another fire effect, more realistic, with particles

This commit is contained in:
Sylvain PILLOT 2023-12-29 18:23:55 +01:00
parent dd889cfe98
commit 37d074eebc
9 changed files with 169 additions and 5 deletions

View File

@ -44,6 +44,7 @@ set(SOURCES
src/effects/dotball.cpp
src/effects/fire.cpp
src/effects/wormhole.cpp
src/effects/fire2.cpp
)
set(ASSETS_cg
@ -81,6 +82,7 @@ set(ASSETS_cg
assets-cg/Miniatures/DotBall.png
assets-cg/Miniatures/Worm.png
assets-cg/Miniatures/Fire.png
assets-cg/Miniatures/ParticuleFire.png
)
fxconv_declare_assets(${ASSETS_cg} WITH_METADATA)

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -101,4 +101,9 @@ Worm.png:
Fire.png:
type: bopti-image
profile: p4
name: Fireflams
name: Fireflams
ParticuleFire.png:
type: bopti-image
profile: p4
name: PartFire

View File

@ -93,6 +93,24 @@ void Blur( bopti_image_t *screen )
}
}
void Decay( bopti_image_t *screen )
{
int8_t *dest = (int8_t *)screen->data;
int8_t temp;
uint32_t offset = 0;
for( int y=0; y<MAXHEIGHT; y++)
{
for( int x=0; x<DWIDTH; x++)
{
if (dest[offset + x ]>-125)
dest[offset + x ]-=3;
}
offset += screen->stride;
}
}
void Blur2( bopti_image_t *screen )

View File

@ -21,7 +21,7 @@ void getpixel( bopti_image_t *screen, uint16_t sx, uint16_t sy, int8_t *color );
void Blur( bopti_image_t *screen );
void Blur2( bopti_image_t *screen );
void MotionBlur( bopti_image_t *screen );
void Decay( bopti_image_t *screen );

View File

@ -66,9 +66,13 @@ void fire_init( [[maybe_unused]] bopti_image_t *screen )
screen->palette[i+224] = Palette4( 255, 255, 224+i );
}
image_fill( screen, -128 );
}
#define FIRE_HEIGHT 6
#define FIRE_CHAOS 6
void fire_update( [[maybe_unused]] bopti_image_t *screen, [[maybe_unused]] float dt )
{
@ -83,7 +87,7 @@ void fire_update( [[maybe_unused]] bopti_image_t *screen, [[maybe_unused]] float
fire2[(h-1)*DWIDTH+2*x] = a;
fire2[(h-1)*DWIDTH+2*x+1] = a;
}
for( int y=120; y<h-1; y++ )
for( int x=0; x<w; x++ )

131
src/effects/fire2.cpp Normal file
View File

@ -0,0 +1,131 @@
#include "effects.h"
#include <num/num.h>
#include "../utilities/fast_trig.h"
#include "../utilities/3Dtransform.h"
#include "../utilities/utilities.h"
#include <cstring>
#include <gint/rtc.h>
#include "../module.h"
char *fire2_text( void );
bopti_image_t *fire2_miniature( void );
void fire2_init( bopti_image_t *screen );
void fire2_update( bopti_image_t *screen, float dt );
void fire2_render( bopti_image_t *screen );
void fire2_deinit( void );
Module_Register fire2_effect = { &fire2_text,
&fire2_init,
&fire2_update,
&fire2_render,
&fire2_deinit,
&fire2_miniature};
uint16_t Palette5( uint8_t R, uint8_t G, uint8_t B )
{
return C_RGB( R/8, G/8, B/8 );
}
extern bopti_image_t PartFire;
bopti_image_t* fire2_miniature( void )
{
return &PartFire;
}
typedef struct
{
libnum::num32 x,y;
int angle;
libnum::num32 size;
libnum::num32 sx,sy;
} Particle;
#define NB_PARTICLES 100
Particle MyParticles[NB_PARTICLES];
void randomize_particle( int nb_part )
{
MyParticles[nb_part].x = libnum::num32(RANDOM( 396 ));
MyParticles[nb_part].y = libnum::num32(224-RANDOM(5));
MyParticles[nb_part].angle = RANDOM(180);
MyParticles[nb_part].size = libnum::num32(RANDOM(5));
MyParticles[nb_part].sx = - MyParticles[nb_part].size * FastCosInt( MyParticles[nb_part].angle );
MyParticles[nb_part].sy = - MyParticles[nb_part].size * FastSinInt( MyParticles[nb_part].angle );
}
void update_particle( int nb_part )
{
MyParticles[nb_part].x += MyParticles[nb_part].sx;
MyParticles[nb_part].y += MyParticles[nb_part].sy;
MyParticles[nb_part].size -= libnum::num32(1);
if (MyParticles[nb_part].size < libnum::num32(0))
randomize_particle( nb_part );
}
void fire2_init( [[maybe_unused]] bopti_image_t *screen )
{
srand( rtc_ticks() );
for(int u = 0; u<64; u++)
{
screen->palette[u] = C_RGB( 0, 0, 0 );
screen->palette[u+64] = C_RGB( u/2, 0, 0 );
screen->palette[u+128] = C_RGB( 31, u/2, 0 );
screen->palette[u+192] = C_RGB( 31, 31, u/2 );
}
for (int j = 0; j < NB_PARTICLES; j++)
randomize_particle( j );
image_fill( screen, -128 );
}
void fire2_update( [[maybe_unused]] bopti_image_t *screen, [[maybe_unused]] float dt )
{
for (int j = 0; j < NB_PARTICLES; j++)
update_particle( j );
}
void fire2_render( [[maybe_unused]] bopti_image_t *screen )
{
for (int j = 0; j < NB_PARTICLES; j++)
drawline( screen, (int) MyParticles[j].x, (int) MyParticles[j].y,
(int) (MyParticles[j].x+MyParticles[j].sx), (int) (MyParticles[j].y+MyParticles[j].sy), 127 );
Blur( screen );
Decay( screen );
dimage( 0, 0, screen );
}
void fire2_deinit( void )
{
}
char fire3_TextToRender[100] = "Particuled Fire > _\0";
char *fire2_text( void )
{
return fire3_TextToRender;
}

View File

@ -16,6 +16,8 @@
#define TEXTURE_WIDTH 15
#define TEXTURE_HEIGHT 15
// unsigned char *WormHoleData;
unsigned char WormHoleData[] = { 224, 209, 209, 194, 179, 179, 179, 164, 150, 135, 120, 120, 120, 105, 105, 105, 76, 76, 76, 76, 46, 46, 46, 31, 32, 17, 17, 2, 2, 2, 212, 213, 213, 198, 183,
183, 183, 168, 169, 154, 139, 139, 139, 139, 124, 124, 125, 110, 95, 95, 95, 80, 80, 81, 81, 51, 51, 51, 51, 51, 37, 37, 37, 7, 7, 7, 7, 217, 218,
218, 218, 188, 188, 188, 189, 189, 174, 174, 174, 174, 159, 145, 145, 145, 145, 130, 115, 116, 116, 116, 101, 101, 101, 102, 102, 87, 72, 72, 72, 73, 73, 58, 58,
@ -2750,7 +2752,7 @@ void wormhole_deinit( void )
}
char Wormhole_TextToRender[100] = "WormHole > _\0";
char Wormhole_TextToRender[100] = "Worm Hole Effect > _\0";
char *wormhole_text( void )
{

View File

@ -29,7 +29,7 @@
#define TOTAL_NB_EFFECT 21
#define TOTAL_NB_EFFECT 22
extern Module_Register intro_effect;
extern Module_Register dotball_effect;
@ -52,9 +52,11 @@ extern Module_Register morphfire_effect;
extern Module_Register raindrops_effect;
extern Module_Register fire_effect;
extern Module_Register wormhole_effect;
extern Module_Register fire2_effect;
Module_Register* Modules[] = {
&intro_effect,
&fire2_effect,
&wormhole_effect,
&dotball_effect,
&dotflag_effect,