From de6c8f31feb94b30fd995b478161489f38853ff2 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Fri, 4 Jul 2025 21:02:43 -0500 Subject: [PATCH] add moonmountains --- cover/moonmountains.data | Bin 0 -> 32768 bytes cover/moonmountains.data.h | 15 ++++++ cover/moonmountains.png | Bin 0 -> 6075 bytes src/graphics.cpp | 47 +++++++++++++++++-- src/graphics.hpp | 2 +- src/main.cpp | 31 +++++++++---- src/playlist.cpp | 2 +- src/scene/emulator/scene.cpp | 87 +++++++++++++++++++++++++++-------- src/scene/emulator/scene.hpp | 8 ++++ src/scene/logo/scene.cpp | 31 +++++++------ src/scene/tracker/cover.cpp | 11 +++++ src/scene/tracker/cover.hpp | 1 + src/texture.cpp | 6 +++ src/texture.hpp | 1 + xm_player.mk | 3 +- 15 files changed, 198 insertions(+), 47 deletions(-) create mode 100644 cover/moonmountains.data create mode 100644 cover/moonmountains.data.h create mode 100644 cover/moonmountains.png diff --git a/cover/moonmountains.data b/cover/moonmountains.data new file mode 100644 index 0000000000000000000000000000000000000000..404e429903f58c7359793c512ca1c9b0520af04e GIT binary patch literal 32768 zcmeI3&2<|&5QMp@I1ODLi%-r$S2-0c1IM78yeQOs(+vzpr1vuG#}*z5^k1R72#i5K z_}4$bT6=w=X*_ErTW?#~(Gu-G@N%4DiKh?E>?zqg`x2o(#@U88>=_e0bm3)0DzKh9 zh{6XedZS@g6!;!n4sYydda}Y#vc~y6=P=?#6nTxB5k0cAY|pY@9EF&!zQJ95`GoR^Oc{r&baHAVPk6zAUS zY0+5sOuMdob}k}+JgFVI<<~gc{5C}C$a}+TReZF1+iS09&U7uyUkxi6A>ZrCmw7{W zW|q;ahn3Jd7CG$BjF=-HSc+J+S#KFsq!mioYz=f-Y(5V={N2vo%_O*J|C@t`Yk>>#LYq9V?0EabN#l zrS{);eVeh3_Idl-*B_5tLzLs-EkukMcqq@GPm1Q2zcm+j$MnBIxD$V(;k}Useykc|wy#6h(b_9EM zT-%(iq|N)E@#t+yHX5ru_j&cB7q8m4$n+V9y}BUawm3$X@^cOd@)gS@*2dSw?@}YrV#b#g840e6K(H zdmlvR8mTrKbwB|S^OzTc4IzETfY5l*)`jFy`y$*_#6NC@7EW-m{I4@Er;zyN=6w^ zW1mSKi4^D5vr$Lcqd#te?(fqP=jSpqPi?YOoMSzLE#qgay_!BM>(%KOY}PwlJn+e$t}xGH6!gw|w1XGg@X90X zV^4m}kgd*;cd*F&*pHsge_!uHReb1}Z_{?Z7|TocJ%-Va*FCj%+iUP@zX`0?Z`LZd z$24CxW@VqtS7UHO?@_99+kugRk(=Bt&eB%B#|Vs3yRj5iZlmTk;2nRT5YC*ZW!J)3 zHO=)pD{05)U(`RIPcxQ$f+-?=#^v;CEz;+%<``xS=#solQ*E(Ok6uXAhuzRDSy^XysN zQE!~k8)0>ZU7de9ui78!OUusRLsmHW#=@?E61Rj-U6( z*=mjT93!vbEPF4E`=5Ejj}h@&_pu+y?|z?im-qZU`y2rtk57a#f8{o^GVb@W8a@Bi z(60J9ew2AGT-Dz${=2Gf=DoQ5n*PZdU>#o7Urqm2bu;hP_1FBxKrv7Z6a&RTF;EN? z1JA_(=g_PAtJ%J)ZsxtZ{+j=}8DJe=)nCp2RdqA()%Dl>#XvDo3={*!Krv7Z6a&x2 z05?Q^kI<6FzP*^O+-`KA--+eEBzF+;i5|SQN5qo{z4I~7?3FPYQvoyQn6SzET%Y!_ zS~F{YU@7bTNx^*MZo1E!?To{F8x8ke%|A0D`TxEfLAriNw#E7W?)fdNh-jm9|J~#B zI4nm-N>dCJ1I55|Fu-&0te@|y`u=Wc&*DNq-iJpognYl4d#WIF_Z2<2E0MXUia+;W zL-uI)4_x1eeU4B0yh?aI_P*cBy;bg+hOB$4aVHkNagaXiS9eucy79iM@BH%Xsqg=< zqGlZt=#kHvDN8X>3={*!Krv7Z6a&RTF;EN?1I0iwPz)3U#XvDo3={)@Hv{|*dR6~- zvsc*{1I0iwPz)3U#XvDo3={*!Krv7Z6a&RTF;EN?1I0iwPz)3U#XvDo3={*!Krv7Z K6a)Vc2L1(HB+vi= literal 0 HcmV?d00001 diff --git a/cover/moonmountains.data.h b/cover/moonmountains.data.h new file mode 100644 index 0000000..3f930df --- /dev/null +++ b/cover/moonmountains.data.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern uint32_t _binary_cover_moonmountains_data_start __asm("_binary_cover_moonmountains_data_start"); +extern uint32_t _binary_cover_moonmountains_data_end __asm("_binary_cover_moonmountains_data_end"); +extern uint32_t _binary_cover_moonmountains_data_size __asm("_binary_cover_moonmountains_data_size"); + +#ifdef __cplusplus +} +#endif diff --git a/cover/moonmountains.png b/cover/moonmountains.png new file mode 100644 index 0000000000000000000000000000000000000000..151378e3128018584a80e8255d462da6f0793867 GIT binary patch literal 6075 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 JV&`?6{tdDB82= 1) { + if (dt * keyframes[keyframe_ix].duration * tick_div >= 1) { if (keyframe_ix < (keyframes_length - 2)) { last_tick = tick; dt = 0; keyframe_ix += 1; } } - keyframe k = interpolate(keyframes[keyframe_ix], keyframes[keyframe_ix + 1], dt); + keyframe k = interpolate(keyframes[keyframe_ix], keyframes[keyframe_ix + 1], dt, tick_div); mat4x4 trans = translate(t) @@ -245,11 +248,11 @@ namespace scene::logo { * rotate_y(k.ry) * scale((vec3){-1, -1, 1}); - bool _32_wf = tick < (10.988 * 60); - bool bit_wf = tick < (11.908 * 60); - bool jam_wf = tick < (12.825 * 60); + bool _32_wf = tick < (10.988 * tick_mul); + bool bit_wf = tick < (11.908 * tick_mul); + bool jam_wf = tick < (12.825 * tick_mul); - bool diffuse = tick >= (14.608 * 60); + bool diffuse = tick >= (14.608 * tick_mul); render_mesh(multi.op, mesh_thirty_two, trans, k.i, _32_wf, diffuse); if (keyframe_ix > 0) { @@ -271,7 +274,9 @@ namespace scene::logo { int done() { - if (tick >= (20.000 * 60)) { + float tick_mul = framebuffer.px_height == 480 ? 60 : 120; + + if (tick >= (20.000 * tick_mul)) { int scene_id = ::scene::id::tracker; printf("scene transition to tracker %d\n", scene_id); return scene_id; diff --git a/src/scene/tracker/cover.cpp b/src/scene/tracker/cover.cpp index aecba52..9fc9a05 100644 --- a/src/scene/tracker/cover.cpp +++ b/src/scene/tracker/cover.cpp @@ -105,6 +105,17 @@ namespace scene::tracker::cover { .scale = 6, .color = {0x0d, 0x1a, 0x0e}, }, + [moonmountains] = { + .texture_offset = texture::offset::moonmountains, + .texture_size = tsp_instruction_word::texture_u_size::from_int(128) + | tsp_instruction_word::texture_v_size::from_int(128), + .texture_width = 1.0f / 128.0f, + .texture_height = 1.0f / 128.0f, + .width = 72, + .height = 72, + .scale = 6, + .color = {0x00, 0x06, 0x1a}, + }, }; constexpr inline vec3 transform_position_fs(const cover& cover, diff --git a/src/scene/tracker/cover.hpp b/src/scene/tracker/cover.hpp index 0274f85..13aac6c 100644 --- a/src/scene/tracker/cover.hpp +++ b/src/scene/tracker/cover.hpp @@ -13,6 +13,7 @@ namespace scene::tracker::cover { mossycottage, clocks, tree, + moonmountains, }; void draw(ta_multiwriter& multi, float x, float y, bool zoom); diff --git a/src/texture.cpp b/src/texture.cpp index 90f690a..3ee7122 100644 --- a/src/texture.cpp +++ b/src/texture.cpp @@ -22,6 +22,7 @@ #include "cover/silvertrees.data.h" #include "cover/thebeach.data.h" #include "cover/tree.data.h" +#include "cover/moonmountains.data.h" #include "printf/printf.h" @@ -88,6 +89,11 @@ namespace texture { .size = reinterpret_cast(&_binary_cover_tree_data_size), .offset = offset::tree, }, + { + .start = reinterpret_cast(&_binary_cover_moonmountains_data_start), + .size = reinterpret_cast(&_binary_cover_moonmountains_data_size), + .offset = offset::moonmountains, + }, }; const int textures_length = (sizeof (textures)) / (sizeof (textures[0])); diff --git a/src/texture.hpp b/src/texture.hpp index 2958650..b44d46e 100644 --- a/src/texture.hpp +++ b/src/texture.hpp @@ -20,6 +20,7 @@ namespace texture { constexpr int silvertrees = redtree + 32768; constexpr int thebeach = silvertrees + 32768; constexpr int tree = thebeach + 32768; + constexpr int moonmountains= tree + 32768; }; extern struct texture textures[]; diff --git a/xm_player.mk b/xm_player.mk index c026bd5..ab3eb55 100644 --- a/xm_player.mk +++ b/xm_player.mk @@ -18,7 +18,8 @@ TEXTURE_OBJ = \ cover/redtree.data.o \ cover/silvertrees.data.o \ cover/thebeach.data.o \ - cover/tree.data.o + cover/tree.data.o \ + cover/moonmountains.data.o PCM_OBJ = \ pcm/start3.adpcm.o \