From bbb75838cd6cfa0012618416dd0848f2a16c86b7 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sun, 2 Apr 2023 23:21:31 +0200 Subject: [PATCH] first unoptimized version of blitSprite & grabSprite --- examples/curlywas/sprites.cwa | 21 ++++++++++++ examples/include/microw8-api.cwa | 2 ++ examples/include/microw8-api.wat | 2 ++ platform/bin/loader.wasm | Bin 1269 -> 1282 bytes platform/bin/platform.uw8 | Bin 3892 -> 4028 bytes platform/src/platform.cwa | 54 +++++++++++++++++++++++++++++++ uw8-tool/src/base_module.rs | 15 +++++++++ 7 files changed, 94 insertions(+) create mode 100644 examples/curlywas/sprites.cwa diff --git a/examples/curlywas/sprites.cwa b/examples/curlywas/sprites.cwa new file mode 100644 index 0000000..4515026 --- /dev/null +++ b/examples/curlywas/sprites.cwa @@ -0,0 +1,21 @@ +include "../include/microw8-api.cwa" + +const SPRITE = 0x20000; + +export fn upd() { + cls(0); + let t = time(); + let i: i32; + loop spriteLoop { + let inline x = sin(t * -1.3 + i as f32 / 8_f) * 180_f + 160_f; + let inline y = sin(t * 1.7 + i as f32 / 9_f) * 140_f + 120_f; + blitSprite(SPRITE, 16, x as i32, y as i32, 0x100); + branch_if (i +:= 1) < 200: spriteLoop; + } +} + +start fn start() { + printChar('OO'); + circle(8_f, 8_f, 6_f, 75); + grabSprite(SPRITE, 16, 0, 0, 0); +} diff --git a/examples/include/microw8-api.cwa b/examples/include/microw8-api.cwa index c537642..60c9478 100644 --- a/examples/include/microw8-api.cwa +++ b/examples/include/microw8-api.cwa @@ -35,6 +35,8 @@ import "env.circle_outline" fn circle_outline(f32, f32, f32, i32); import "env.exp" fn exp(f32) -> f32; import "env.playNote" fn playNote(i32, i32); import "env.sndGes" fn sndGes(i32) -> f32; +import "env.blitSprite" fn blitSprite(i32, i32, i32, i32, i32); +import "env.grabSprite" fn grabSprite(i32, i32, i32, i32, i32); const TIME_MS = 0x40; const GAMEPAD = 0x44; diff --git a/examples/include/microw8-api.wat b/examples/include/microw8-api.wat index 04bd403..e006e59 100644 --- a/examples/include/microw8-api.wat +++ b/examples/include/microw8-api.wat @@ -35,6 +35,8 @@ (import "env" "exp" (func $exp (param f32) (result f32))) (import "env" "playNote" (func $playNote (param i32) (param i32))) (import "env" "sndGes" (func $sndGes (param i32) (result f32))) +(import "env" "blitSprite" (func $blitSprite (param i32) (param i32) (param i32) (param i32) (param i32))) +(import "env" "grabSprite" (func $grabSprite (param i32) (param i32) (param i32) (param i32) (param i32))) ;; to use defines, include this file with a preprocessor ;; like gpp (https://logological.org/gpp). diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index 83425e2095c469579b1e332e8906775cf66e5800..0055ae6e59db4d745a7fd862e19853f030cd623d 100644 GIT binary patch delta 512 zcmV+b0{{K>34#i+4FiAk0|5X*01NB`75~@wM{$MsE2p94?FNZt7`A*A-Vpm%ALKH1 z0x>oekB~`cUHrFeCcoBaIt4`(%E~T7!+_HnnSij^r2;KXXWX6dlOBV?c?CAtuq8!w z2N5Ge5l!>kfq-T|-J#7wn~tl@J@m)!6|0{BeCfH4^VG57Yw&-AFqm(CQzCeawdE*R z+~#A6Fw$TX;l0=5m?c`?=|dEgfqrn09VM==^x`LL7sj`{M~O&7t=T!Ct%)%N>I+ft z)|IX+XcvLHi>+Mt%qp%Dvap!4zt|2M+2SWMY!|{6Fx?v5XO^;^)EH85f6|PQ&*g@c z_1NWy7cnO3eG2k5d{7r^#Idrq5Z-m4tdvCk(=+St$8++^lt6^%JT3Ukrl+mxbceOZ#>0WeR8atoO3+Bu(M&on$ zH5$F`dlg}trV@agd0DK0mRm;QUv5UVp3sU^cSWi6at2!B7qI;mUo{v3-H&3^{I~jl C009yJ delta 499 zcmVzH<&UgS-0dkIF0MM)4 zSb0XAUT-`6EC3gR40+3EzqN}RhmER*S6&yN@3hgfyodIB>AZh2VqIbQ&74UVVAjVnx_QqP2R8#07MfZWR=gD>I$R8yd<`5h2q zE$s{i$>Ayz#GtY+%lmQm`3hf{3zBZLoJ5tFA`Vgr92$iVS5rj}X9Ssfdd(RQVI|#Y zhnUS&1H>M9{AzzTwjy)5pLG4i1Xa09tWnxBcXCgcUr^n_!(%o=B*nAJG*h0bW`8HW zfzMtag^b^=f8Pr7P}*QktoG6(F@EV?QBbS0&h(YYRobFpse5)eSG*!HOTMDELw4BF&{} z0q?H&ERO-%%+Xt?j^uZDbZ0K!e9Y$aOWTk+&ho~l*Mc!S*`vR71aEXRy(Azq2(bCy p=~l7Y6i!G{NmSr~@S6xvvp~{~1CX^Ow7I2=f>A5*>z(1UsQOh|`eFb8 diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index 2425d513c13e60795216e9ef3226b268e9486756..d19e1a901aa1fb7ece9eccebcdd816db94fda4ad 100644 GIT binary patch literal 4028 zcmV;t4@2+*Dc`Wd&Gq;iwcw`JdmO^_4jh_?W0@6OOsjT2Bgt^7I#6xE3+;4UIM+di zwh;)bdci;0ry^~2`>ydWR(vO6c0?sEB=VSR-{fUDGr>ANpV$84E23$dWav0UCkdRq z&H4HNFW);RU7V3}Wyh@qgs;($!Zo6yy#lR2k!AyNqoze;k+&}%#0~uFS7yPM_*E}M zIJnQVluGOzK?!L&9 zRt(+DxiUkfnxH4xGZ(OeVig;v7ua@cPThZuVD21yhzY{$X3K(92s;xF+Q>c>Hr*}a z79L->KM9~cnjuNVeVYsqa1PTE_{PF-lx8;Y zZEtE?;yZseJI4p~U0adUPJ&e0l

W_GCQ!7rEs}A@nm3m9n|OMK4CxMr7+@T;qN^ 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 C>cf8k diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index c6e37fd..db1e2f9 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -352,6 +352,60 @@ export fn line(x1: f32, y1: f32, x2: f32, y2: f32, col: i32) { setPixel(i32.trunc_sat_f32_s(x1 + f * dx), i32.trunc_sat_f32_s(y1 + f * dy), col); } +export fn blitSprite(sprite: i32, size: i32, x: i32, y: i32, control: i32) { + let width = size & 65535; + let height = select(size >> 16, size >> 16, width); + let trans = (control & 511) - 256; + let flip_x = 1 - ((control >> 8) & 2); + let flip_y = 1 - ((control >> 9) & 2); + if flip_x < 0 { + sprite += width - 1; + } + if flip_y < 0 { + sprite += (height - 1) * width; + } + + let ly = 0; + loop yloop { + let lx = 0; + loop xloop { + let col = (sprite + lx * flip_x + ly * flip_y * height)?0; + if col != trans { + setPixel(x + lx, y + ly, col); + } + branch_if (lx +:= 1) < width: xloop; + } + branch_if (ly +:= 1) < height: yloop; + } +} + +export fn grabSprite(sprite: i32, size: i32, x: i32, y: i32, control: i32) { + let width = size & 65535; + let height = select(size >> 16, size >> 16, width); + let trans = (control & 511) - 256; + let flip_x = 1 - ((control >> 8) & 2); + let flip_y = 1 - ((control >> 9) & 2); + if flip_x < 0 { + sprite += width - 1; + } + if flip_y < 0 { + sprite += (height - 1) * width; + } + + let ly = 0; + loop yloop { + let lx = 0; + loop xloop { + let col = getPixel(x + lx, y + ly); + if col != trans { + (sprite + lx * flip_x + ly * flip_y * height)?0 = col; + } + branch_if (lx +:= 1) < width: xloop; + } + branch_if (ly +:= 1) < height: yloop; + } +} + ////////// // TEXT // ////////// diff --git a/uw8-tool/src/base_module.rs b/uw8-tool/src/base_module.rs index 9b86735..afcf077 100644 --- a/uw8-tool/src/base_module.rs +++ b/uw8-tool/src/base_module.rs @@ -169,6 +169,21 @@ impl BaseModule { add_function(&mut functions, &type_map, "playNote", &[I32, I32], None); add_function(&mut functions, &type_map, "sndGes", &[I32], Some(F32)); + add_function( + &mut functions, + &type_map, + "blitSprite", + &[I32, I32, I32, I32, I32], + None, + ); + add_function( + &mut functions, + &type_map, + "grabSprite", + &[I32, I32, I32, I32, I32], + None, + ); + for i in functions.len()..64 { add_function( &mut functions,