From 83ef67ad2840e700a3607bfaf2adafa634e374e0 Mon Sep 17 00:00:00 2001 From: PoliEcho Date: Sun, 17 Aug 2025 14:37:30 +0200 Subject: [PATCH] fix rockets a bit --- .gitignore | 1 - assets/rocket.bmp | Bin 1242 -> 1242 bytes assets/rocket.xcf | Bin 3965 -> 3781 bytes assets/rocket_orig.bmp | Bin 0 -> 1326 bytes src/UEFI_fireworks/UefiMain.c | 6 +-- src/UEFI_fireworks/drawing.c | 78 ++++++++++++++++++++-------------- src/UEFI_fireworks/drawing.h | 2 +- src/UEFI_fireworks/types.h | 6 +-- 8 files changed, 54 insertions(+), 39 deletions(-) create mode 100644 assets/rocket_orig.bmp diff --git a/.gitignore b/.gitignore index 5fa985f..cbc9d2a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ build/ .cache/ compile_commands.json -assets/rocket_orig.bmp src/UEFI_fireworks/rocket.c \ No newline at end of file diff --git a/assets/rocket.bmp b/assets/rocket.bmp index e9c991a8cbf2083682b96eaf518b817b0267829a..82d9b919d1fc0b3b8d9ccae5ad8b8e5f56c8eef4 100644 GIT binary patch literal 1242 zcmZ?ry~V-+24+A~1BkhSSP_UB86L3<6&m>i>gCAe-So zk}QM?6oDz@5K;ok<4^-u22_Ac4NUw$el^I-aM^`q0@!)zj)n*#TZF~U$QHraXa=E} zfJ+U~k@R$r+N!=V7746g#XG6(}f0sxJr_3r=x literal 1242 zcmdVZJqiLb5Cz~7#KuOju@cnA%2Kwr_X1wV%Xli!VISWlYvL}TIwKx2mzX=unQaiw9@sye%FGFbo2@a-k|$O#yC;u+rE!bR$jtV>RL1uJlqq@K z{@E~7y=nyjWw=q-aHFzr-<=yN6B>1UAsJY=S72SUO^eE~XiaFOOki!DKm9)Z*y`Q+ zw<`1N?}Pf^hM%=zaHb+eDWU;x_p_`R@_Bc1-nm)x-SOn>x_yb;~R}ZNl;AsUvLA(jMc@y!Z(jV{- zyh%Yy4CACt#3EE1c(ZS2cHZnGW%qIC_9fP4oR8z4(#c)^-q}^zCjq<$#RW~MVpFCG zPly$^z`ldh!$&A2!nZJ;o$wkTHG{V@t-#zy!6L@7iq6CVz6PCR^LwR+*YBJdxbezRn8K}pU!eXLA7^cVD56R#Zz`meW z^SzpfxAa=4ui?`4%}8p!sy@KzJUpA>Q6$-q&s<5eA&{3s%^N14pR?HXBr#9n%pU&M dJgDcIDSII-5mcM&p1lcnebd_e=2E6k_zO%glvw}( delta 827 zcmb`Gy-EW?6ot>su11sH*+NJo8^~y9X%hso61MXV1i>ziq;r}c@neD^h(Tmjgp zg$?gDoF7JyGQQ8>ql4J;jYA?l;gPr1=r|z!_|zFMZCZ~e>VO*7zB=bIUes;=93TCv cdDBf!8ST(~tENbD!M~!bl50LypA|#*4fC|Dv;Y7A diff --git a/assets/rocket_orig.bmp b/assets/rocket_orig.bmp new file mode 100644 index 0000000000000000000000000000000000000000..aa9f6cf0b21c2f19ba892bdee5634a38a54d85db GIT binary patch literal 1326 zcmdUsy$-@a2*=T=Y0|}Xaxzi(&YinBx%eusChk6mkLZqnxZI~l<5EEc{LDnv^=tm%%D zHyFefuoxd_INmR7B`LwIS}A5Ri04?PmVTRJ6~?zQmwxuV32j?<&o6H7E5|B#4~6^? xDvVFfWj_DY5B4&BFl` #include EFI_GRAPHICS_OUTPUT_BLT_PIXEL night_sky = - COLOR_FROM_HEX(0x11095e); // this cannot be const becose EDK2 said so + COLOR_FROM_HEX(0x090531); // this cannot be const becose EDK2 said so firework_instance create_firework(); EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL; @@ -135,7 +135,7 @@ firework_instance create_firework() { firework_instance firework; UINT32 random; fill_random_bytes(&random, sizeof(random)); - firework.max_r = (random % 200) + 1; // 1 to 200, avoiding 0 + firework.max_r = (random % 190) + 10; // 10 to 200, for (UINT8 i = 0; i < ARRAY_SIZE(firework.color); i++) { fill_random_bytes(&firework.color[i], @@ -152,6 +152,6 @@ firework_instance create_firework() { firework.rocket.x = firework.x + rocket_asset.width / 2; firework.rocket.y = GraphicsOutput->Mode->Info->VerticalResolution; - firework.status = LAUNCHING; // TODO set to LAUNCHING when implemented + firework.status = LAUNCHING; return firework; } \ No newline at end of file diff --git a/src/UEFI_fireworks/drawing.c b/src/UEFI_fireworks/drawing.c index 8a154bc..8a4a210 100644 --- a/src/UEFI_fireworks/drawing.c +++ b/src/UEFI_fireworks/drawing.c @@ -1,19 +1,23 @@ #include "Base.h" +#include "Library/BaseMemoryLib.h" +#include "Library/MemoryAllocationLib.h" #include "Library/UefiLib.h" #include "ProcessorBind.h" #include "bmp.h" #include "const.h" #include "global.h" +#include "time.h" #include "types.h" #include <../MdeModulePkg/Include/Library/BmpSupportLib.h> #include #include +#include void draw_pixel(const UINT32 x, const UINT32 y, const EFI_GRAPHICS_OUTPUT_BLT_PIXEL pixel) { - if (x > GraphicsOutput->Mode->Info->HorizontalResolution || - y > GraphicsOutput->Mode->Info - ->VerticalResolution) { // ignore when out of bounds + if (x >= GraphicsOutput->Mode->Info->HorizontalResolution || + y >= GraphicsOutput->Mode->Info + ->VerticalResolution) { // ignore when out of bounds return; } UINTN framebuffer_offset = @@ -109,9 +113,10 @@ BOOLEAN step_firework(firework_instance *firework) { } rocket_blt rocket_asset; -EFI_GRAPHICS_OUTPUT_BLT_PIXEL **mask_stack; BOOLEAN **rocket_alfa_mask; +UINT32 *rocket_clean_up_mask; + void init_rocket_blt() { EFI_STATUS Status = TranslateBmpToGopBlt( assets_rocket_bmp, assets_rocket_bmp_len, &rocket_asset.blt, @@ -120,38 +125,49 @@ void init_rocket_blt() { Print(L"Failed to load rocket asset: %r\n", Status); Exit(Status); } + rocket_clean_up_mask = AllocatePool(rocket_asset.width * sizeof(location)); + rocket_alfa_mask = AllocateZeroPool(rocket_asset.height * sizeof(BOOLEAN *)); + for (UINT32 i = 0; i < rocket_asset.height; i++) { + rocket_alfa_mask[i] = AllocatePool(rocket_asset.width * sizeof(BOOLEAN)); + for (UINT32 j = 0; j < rocket_asset.width; j++) { + if (rocket_asset.blt[i * rocket_asset.width + j].Blue == 0 && + rocket_asset.blt[i * rocket_asset.width + j].Green == 0 && + rocket_asset.blt[i * rocket_asset.width + j].Red == 0) { + rocket_alfa_mask[i][j] = FALSE; + } else { + rocket_alfa_mask[i][j] = TRUE; + rocket_clean_up_mask[j] = i + 1; // build the cleanup mask + } + } + } +} +void draw_rocket(location *rocket) { + for (UINT32 i = 0; i < rocket_asset.width; i++) { + for (UINT32 j = 0; j < rocket_asset.height; j++) { + if (rocket_alfa_mask[j][i]) { + draw_pixel(i + rocket->x, j + rocket->y, + rocket_asset.blt[j * rocket_asset.width + i]); + } + } + } } -BOOLEAN step_rocket(rocket_instance *rocket, UINT32 max_y) { - GraphicsOutput->Blt(GraphicsOutput, - rocket_asset.blt, // BltBuffer - EfiBltBufferToVideo, // BltOperation - 0, // src X - 0, // src Y - rocket->x, // dst X - rocket->y, // dst Y - rocket_asset.width, rocket_asset.height, - 0 // unused Delta - ); - +BOOLEAN step_rocket(location *rocket, UINT32 max_y) { + draw_rocket(rocket); + for (UINT8 i = 0; i < rocket_asset.width; i++) { + draw_pixel(rocket->x + i, rocket->y + rocket_clean_up_mask[i], night_sky); + } if (rocket->y <= max_y) { - GraphicsOutput->Blt( - GraphicsOutput, - &night_sky, // BltBuffer - EfiBltVideoFill, // BltOperation - 0, // SourceX - 0, // SourceY - rocket->x, // DestinationX - rocket->y, // DestinationY - rocket_asset.width, // Width - rocket_asset.height + 1, // Height // remove trail from previous frame - 0 // Delta (not used for fill operations) - ); + // remove rocket + for (UINT32 i = 0; i < rocket_asset.width; i++) { + for (UINT32 j = 0; j < rocket_asset.height; j++) { + if (rocket_alfa_mask[j][i]) { + draw_pixel(i + rocket->x, j + rocket->y, night_sky); + } + } + } return FALSE; } else { - for (UINT8 i = 0; i < rocket_asset.width; i++) { - draw_pixel(rocket->x + i, rocket->y + rocket_asset.height, night_sky); - } rocket->y--; return TRUE; } diff --git a/src/UEFI_fireworks/drawing.h b/src/UEFI_fireworks/drawing.h index cbb8d5d..74d5088 100644 --- a/src/UEFI_fireworks/drawing.h +++ b/src/UEFI_fireworks/drawing.h @@ -6,4 +6,4 @@ void draw_circle(int xc, int yc, int r, void clear_screen(); BOOLEAN step_firework(firework_instance *firework); void init_rocket_blt(); -BOOLEAN step_rocket(rocket_instance *rocket, UINT32 max_y); \ No newline at end of file +BOOLEAN step_rocket(location *rocket, UINT32 max_y); \ No newline at end of file diff --git a/src/UEFI_fireworks/types.h b/src/UEFI_fireworks/types.h index eae1714..df5b71b 100644 --- a/src/UEFI_fireworks/types.h +++ b/src/UEFI_fireworks/types.h @@ -7,7 +7,7 @@ typedef struct { UINT32 x; UINT32 y; -} rocket_instance; +} location; typedef struct { enum firework_status status; // IF INACTIVE can be overwriten @@ -17,7 +17,7 @@ typedef struct { UINT16 r[3]; EFI_GRAPHICS_OUTPUT_BLT_PIXEL color[3]; UINT16 cleanup_r; - rocket_instance rocket; + location rocket; } firework_instance; typedef struct { @@ -25,4 +25,4 @@ typedef struct { UINTN blt_size; UINTN height; UINTN width; -} rocket_blt; \ No newline at end of file +} rocket_blt;