diff --git a/assets/art/after-school.avif b/assets/art/after-school.avif new file mode 100644 index 0000000..d207564 Binary files /dev/null and b/assets/art/after-school.avif differ diff --git a/assets/art/alear.avif b/assets/art/alear.avif new file mode 100644 index 0000000..96addf8 Binary files /dev/null and b/assets/art/alear.avif differ diff --git a/assets/art/bard.avif b/assets/art/bard.avif new file mode 100644 index 0000000..ffef0df Binary files /dev/null and b/assets/art/bard.avif differ diff --git a/assets/art/bathing.avif b/assets/art/bathing.avif new file mode 100644 index 0000000..5b50b88 Binary files /dev/null and b/assets/art/bathing.avif differ diff --git a/assets/art/gamingforone.avif b/assets/art/gamingforone.avif new file mode 100644 index 0000000..3510028 Binary files /dev/null and b/assets/art/gamingforone.avif differ diff --git a/assets/art/goinghome.avif b/assets/art/goinghome.avif new file mode 100644 index 0000000..9adde06 Binary files /dev/null and b/assets/art/goinghome.avif differ diff --git a/assets/art/grocery-shopping.avif b/assets/art/grocery-shopping.avif new file mode 100644 index 0000000..4b734b0 Binary files /dev/null and b/assets/art/grocery-shopping.avif differ diff --git a/assets/art/knockout-background2.avif b/assets/art/knockout-background2.avif new file mode 100644 index 0000000..8339037 Binary files /dev/null and b/assets/art/knockout-background2.avif differ diff --git a/assets/art/marchsketch.avif b/assets/art/marchsketch.avif new file mode 100644 index 0000000..56f939c Binary files /dev/null and b/assets/art/marchsketch.avif differ diff --git a/assets/art/marchsketch4.avif b/assets/art/marchsketch4.avif new file mode 100644 index 0000000..40bdbdc Binary files /dev/null and b/assets/art/marchsketch4.avif differ diff --git a/assets/art/office-date.avif b/assets/art/office-date.avif new file mode 100644 index 0000000..6aa9325 Binary files /dev/null and b/assets/art/office-date.avif differ diff --git a/assets/art/orbit-correction.avif b/assets/art/orbit-correction.avif new file mode 100644 index 0000000..31e3696 Binary files /dev/null and b/assets/art/orbit-correction.avif differ diff --git a/assets/art/short-hair.avif b/assets/art/short-hair.avif new file mode 100644 index 0000000..29b883c Binary files /dev/null and b/assets/art/short-hair.avif differ diff --git a/assets/art/sketchmarch2.avif b/assets/art/sketchmarch2.avif new file mode 100644 index 0000000..831b0e0 Binary files /dev/null and b/assets/art/sketchmarch2.avif differ diff --git a/assets/art/sword-leftlean.avif b/assets/art/sword-leftlean.avif new file mode 100644 index 0000000..f10b118 Binary files /dev/null and b/assets/art/sword-leftlean.avif differ diff --git a/assets/art/warriors.avif b/assets/art/warriors.avif new file mode 100644 index 0000000..d338649 Binary files /dev/null and b/assets/art/warriors.avif differ diff --git a/assets/art/working-out.avif b/assets/art/working-out.avif new file mode 100644 index 0000000..9e683bd Binary files /dev/null and b/assets/art/working-out.avif differ diff --git a/assets/art/workingout.avif b/assets/art/workingout.avif new file mode 100644 index 0000000..3e7b3ee Binary files /dev/null and b/assets/art/workingout.avif differ diff --git a/assets/art/xbc3.avif b/assets/art/xbc3.avif new file mode 100644 index 0000000..4f5d474 Binary files /dev/null and b/assets/art/xbc3.avif differ diff --git a/config.yaml b/config.yaml index 285ab14..6087eaa 100644 --- a/config.yaml +++ b/config.yaml @@ -45,14 +45,16 @@ permalinks: art: 'art/:year/:month/:slugorfilename' arttags: 'art/tags/:title' characters: 'art/characters/:title' - characters_listpath: "art/characters/" tags: 'blog/tags/:title' + series: 'blog/series/:title' + projtags: 'software/tags/:title' taxonomies: series: 'series' tag: 'tags' arttag: 'arttags' character: 'characters' + projtag: 'projtags' menu: main: diff --git a/content/blog/_index.md b/content/blog/_index.md index b882174..df315ad 100644 --- a/content/blog/_index.md +++ b/content/blog/_index.md @@ -12,3 +12,5 @@ Rambles and writings usually consisting of [Linux](/blog/tags/linux/), [KDE](/bl If you're interested, you can follow this blog using [RSS](/blog/index.xml). _Warning_: most of it is mindlessly technical. + +{{< blog-featured >}} diff --git a/content/blog/astra-0.4.0-release.md b/content/blog/astra-0.4.0-release.md index 491a403..3154f60 100644 --- a/content/blog/astra-0.4.0-release.md +++ b/content/blog/astra-0.4.0-release.md @@ -4,6 +4,8 @@ date: 2022-05-04 draft: false aliases: - /notes/astra-0.4.0-release/ +tags: +- Astra --- I'm very sorry about the delay, but a new release of Astra is upon us! diff --git a/content/blog/breakdown-gallery/index.md b/content/blog/breakdown-gallery/index.md index 35eb27a..7f239e3 100644 --- a/content/blog/breakdown-gallery/index.md +++ b/content/blog/breakdown-gallery/index.md @@ -1,6 +1,8 @@ --- title: "Breakdown of my static art gallery" date: "2023-04-26" +tags: +- Website --- I realized today that I had inadvertently created a static art gallery. I think my system is interesting, so I wanted to write down how it works. diff --git a/content/blog/drawing-simple-cubes/index.md b/content/blog/drawing-simple-cubes/index.md index c823abe..a8229cc 100644 --- a/content/blog/drawing-simple-cubes/index.md +++ b/content/blog/drawing-simple-cubes/index.md @@ -1,17 +1,19 @@ --- -title: "Drawing simple cubes" -date: 2023-06-10 +title: "Graphics Dump: Drawing debug cubes" +date: 2023-06-27 draft: true summary: "When working on my engine, I wanted to clean up my debug gizmos a bit. The first thing to tackle is drawing bounding boxes!" tags: - C++ +- Graphics Dump +- Math +series: +- Graphics Dump --- If you are writing graphical tools, one of the most common shapes you draw is boxes. They can represent areas (like the affected area of an environment capture) or a box collision. One common problem that I run into, is dealing with these diagonals: -Of course this is natural due to the way that GPUs work, they work in triangles and when drawing the wireframe of a cube doesn't just draw the edges but everything in-between: - - +I found a pretty neat trick for removing these diagonals without having to change the vertex data. This doesn't work for anything that isn't a cube (I think), but whatever. diff --git a/content/blog/figure3/index.md b/content/blog/figure3/index.md index 0b5fec3..16d87e7 100644 --- a/content/blog/figure3/index.md +++ b/content/blog/figure3/index.md @@ -1,6 +1,6 @@ --- title: "Figure Review: Atelier Ryza 2" -date: 2022-10-05 +date: 2023-06-23 draft: true tags: - Figures diff --git a/content/blog/future-of-silica-viewer/index.md b/content/blog/future-of-silica-viewer/index.md index 5147f70..78339ca 100644 --- a/content/blog/future-of-silica-viewer/index.md +++ b/content/blog/future-of-silica-viewer/index.md @@ -3,6 +3,9 @@ title: "Future of Silica Viewer" date: 2023-03-27 draft: false summary: "Silica Viewer is leaving the App Store." +tags: +- Procreate +- Apple --- I will not be renewing my Apple Developer License for various reasons [I've already discussed elsewhere]({{}}). It is due to expire sometime in the summer, so there's still a couple of months before it disappears off the App Store. I'm actually _losing_ money by selling my software on the App Store, and I don't really work on a Mac anymore. Plus more fun problems related to Apple infrastructure: @@ -11,6 +14,6 @@ I will not be renewing my Apple Developer License for various reasons [I've alre If you already bought Silica Viewer, nothing will change - you can continue to re-download it into perpetuity. This just means you can't pay money for it now, although I wouldn't want you to because I don't keep up with active development. As always, Silica Viewer is open source and free to use still. -![Screenshot of Silicate](macos.png) +![Screenshot of Silicate](macos.webp) For people looking for alternative software, check out [Silicate](https://github.com/Avarel/silicate) by [Avarel](http://antran.io/). It works on more platforms than Silica Viewer, and has a better rendering engine, along with other cool features! Thank you all who have supported by using my software, as always :) diff --git a/content/blog/future-of-silica-viewer/macos.png b/content/blog/future-of-silica-viewer/macos.png deleted file mode 100644 index 8a3f04c..0000000 Binary files a/content/blog/future-of-silica-viewer/macos.png and /dev/null differ diff --git a/content/blog/future-of-silica-viewer/macos.webp b/content/blog/future-of-silica-viewer/macos.webp new file mode 100644 index 0000000..8b89b63 Binary files /dev/null and b/content/blog/future-of-silica-viewer/macos.webp differ diff --git a/content/blog/gentoo-fail2ban.md b/content/blog/gentoo-fail2ban.md index 449cdf2..ada9a66 100644 --- a/content/blog/gentoo-fail2ban.md +++ b/content/blog/gentoo-fail2ban.md @@ -2,7 +2,7 @@ title: "Making fail2ban work on systemd Gentoo" date: 2022-11-03 draft: false -tags: +blogtags: - Linux - Gentoo --- @@ -43,4 +43,4 @@ before = paths-arch.conf ``` I used `paths-arch.conf` since it's a systemd distribution, and it seems to work fine. I plan on modifying the [fail2ban -wiki page](https://wiki.gentoo.org/wiki/Fail2ban) on the Gentoo wiki to mention this, but I wanted to share my discovery here :-) \ No newline at end of file +wiki page](https://wiki.gentoo.org/wiki/Fail2ban) on the Gentoo wiki to mention this, but I wanted to share my discovery here :-) diff --git a/content/blog/graphics-dump-dof/index.md b/content/blog/graphics-dump-dof/index.md new file mode 100644 index 0000000..5ad9f29 --- /dev/null +++ b/content/blog/graphics-dump-dof/index.md @@ -0,0 +1,17 @@ +--- +title: "Graphics Dump: Bokeh depth of field" +date: 2023-05-27 +draft: true +series: +- Graphics Dump +--- + +Today I implemented Bart Wronski's fantastic Bokeh depth of field effect. + +# Pitfalls + +Here's some of the pitfalls I ran into while implementing this: + +## Make sure the bokeh image doesn't repeat, or else it will start bleeding on the edge of triangles. + +## Make sure your aperture texture has a black background. diff --git a/content/blog/hosting-your-own-server/index.md b/content/blog/hosting-your-own-server/index.md index 3d5b954..b0fdb07 100644 --- a/content/blog/hosting-your-own-server/index.md +++ b/content/blog/hosting-your-own-server/index.md @@ -3,6 +3,8 @@ title: "Retrospective on three years of self-hosting" date: 2023-03-27 draft: false summary: "I've been hosting my own infrastructure for almost three years now!" +tags: +- Website --- This website has been running almost non-stop [since November 2020](https://web.archive.org/web/20201101074137/https://redstrate.com/), according to archive.org. Since then, I have been running this website and related services myself - not physically but still taking care of admin tasks.[^1] diff --git a/content/blog/infra-review/bear.webp b/content/blog/infra-review/bear.webp new file mode 100644 index 0000000..e10e7f1 Binary files /dev/null and b/content/blog/infra-review/bear.webp differ diff --git a/content/blog/infra-review/environment.webp b/content/blog/infra-review/environment.webp new file mode 100644 index 0000000..2827c6b Binary files /dev/null and b/content/blog/infra-review/environment.webp differ diff --git a/content/blog/infra-review/index.md b/content/blog/infra-review/index.md new file mode 100644 index 0000000..8dbc797 --- /dev/null +++ b/content/blog/infra-review/index.md @@ -0,0 +1,79 @@ +--- +title: "Game Review: INFRA" +date: 2023-06-28 +draft: true +tags: +- Review +- Gaming +series: +- Game Reviews +--- + +A little while ago, people suggested that I play INFRA. The premise is simple, you are +a man walking around and taking pictures. I won't spoil plot details of the +game, but I will show screenshots from several places in the game. So if you wish +to go in blind, I _highly_ suggest playing the game first. + +--- + +The thing I absolutely love about this game is the environments, like the office +in the beginning of the game. INFRA is made in [Source](https://developer.valvesoftware.com/wiki/Source) (although I'm not sure +what branch it is) and the fantastic art direction combined with the outdated +Source lighting gives the game a unique vibe. + +![Your office.](office.webp) + +You are "Markku Siltanen", but called "Mark" by your coworkers. As part of a +consulting group, you are equipped with the gripping task of _"structural survey"_. +What this really means is taking an obscene amount of pictures on your camera +with a battery that only lasts five seconds if you leave it on. While there +is dialogue in typical Source game fashion there is not a wealth of cutscenes +and you'll have control of your character for a large part of the game. In +some sections, there are visible NPCs but you'll be lonely for most of the +game except for the occasional phone or radio call. + +![Some office workers.](npcs.webp) + +As you progress through the game you'll enter farther and farther into the +depths of the city. The gradual exploration aspect is really fascinating, and +there is a wealth of nature but also grimy underground facilities. + +![A forest.](pretty2.webp) +![Abandoned facility.](pretty1.webp) + +The game is not always a "walking simulator", but that's what you do for most +of the game. There is small puzzles here and there, and some segments +that are timed. At least for me, some of the obstacles were not straightforward +and I needed a walkthrough for later parts of the game. I never felt frustrated +though, but the game definitely does not hold your hand. + +![Another overgrown facility.](sky.webp) + +I'm not sure if the environments are supposed to be liminal, but it gives +off that feeling through most of the game. The sound design is also fantastic, +and I felt really immersed while playing. A lot of the game is not "signposted" +(as in, it warns you what's about to happen) so there is some intentional and +unintentional jumpscares. That's on top of the general creepiness. One of my +favorite locations is the metro, which is empty once you get there of course. + +![One of the metro lines.](metro.webp) + +The later half of the game puts you (mostly) above ground, with a lot of city +and urban environments in a stark contrast to the first half of the game. I also +loved the gradual transistion into night time as well, which just added to the +creepiness and unease. + +![Getting closer to the city.](environment.webp) + +Despite being a Source game, the environment art is so good it really carries +the graphics - although it looks dated in some spots. For example, reflections +are really simple and some environments almost look like they have no lighting. +It's just a minor gripe though, this game released a while ago and probably +started development even farther back. + +![One of the less pretty environments.](reflections.webp) + +If you're a fan of Source games, and urban exploration (like I am) then this +game is definitely up your alley. You can buy it [on Steam](https://store.steampowered.com/app/251110/INFRA/). Enjoy! + +![Bye!](bear.webp) diff --git a/content/blog/infra-review/metro.webp b/content/blog/infra-review/metro.webp new file mode 100644 index 0000000..b78c940 Binary files /dev/null and b/content/blog/infra-review/metro.webp differ diff --git a/content/blog/infra-review/npcs.webp b/content/blog/infra-review/npcs.webp new file mode 100644 index 0000000..3b1145f Binary files /dev/null and b/content/blog/infra-review/npcs.webp differ diff --git a/content/blog/infra-review/office.webp b/content/blog/infra-review/office.webp new file mode 100644 index 0000000..21c10fa Binary files /dev/null and b/content/blog/infra-review/office.webp differ diff --git a/content/blog/infra-review/pretty1.webp b/content/blog/infra-review/pretty1.webp new file mode 100644 index 0000000..c46edcb Binary files /dev/null and b/content/blog/infra-review/pretty1.webp differ diff --git a/content/blog/infra-review/pretty2.webp b/content/blog/infra-review/pretty2.webp new file mode 100644 index 0000000..13907d4 Binary files /dev/null and b/content/blog/infra-review/pretty2.webp differ diff --git a/content/blog/infra-review/reflections.webp b/content/blog/infra-review/reflections.webp new file mode 100644 index 0000000..d514b78 Binary files /dev/null and b/content/blog/infra-review/reflections.webp differ diff --git a/content/blog/infra-review/sky.jpg b/content/blog/infra-review/sky.jpg new file mode 100755 index 0000000..f50cab4 Binary files /dev/null and b/content/blog/infra-review/sky.jpg differ diff --git a/content/blog/infra-review/sky.webp b/content/blog/infra-review/sky.webp new file mode 100644 index 0000000..fc74f05 Binary files /dev/null and b/content/blog/infra-review/sky.webp differ diff --git a/content/blog/kde-april2023/character-count.png b/content/blog/kde-april2023/character-count.png deleted file mode 100644 index 7596497..0000000 Binary files a/content/blog/kde-april2023/character-count.png and /dev/null differ diff --git a/content/blog/kde-april2023/character-count.webp b/content/blog/kde-april2023/character-count.webp new file mode 100644 index 0000000..d93c59d Binary files /dev/null and b/content/blog/kde-april2023/character-count.webp differ diff --git a/content/blog/kde-april2023/index.md b/content/blog/kde-april2023/index.md index ae7351c..93aa4b9 100644 --- a/content/blog/kde-april2023/index.md +++ b/content/blog/kde-april2023/index.md @@ -8,6 +8,8 @@ tags: - KDE - Qt toc: true +series: +- My Work in KDE --- Here's my KDE contributions for this month! It's a little bit shorter than I'd like, but I'm still trying to find a nice balance between **$work** and KDE. @@ -37,21 +39,21 @@ I finally [merged the improved dark mode I started a while ago](https://invent.k I added [support for the new Maximize component](https://invent.kde.org/network/tokodon/-/merge_requests/200), which doesn't change anything functionality-wise but makes our code leaner: -![Screenshot of the Maximize component in action!](maximize.png) +![Screenshot of the Maximize component in action!](maximize.webp) I also [pushed along the MR to use the SearchPopupField component](https://invent.kde.org/network/tokodon/-/merge_requests/144) from Kirigami Add-ons too, which is another change that doesn't change anything functionally but will make the code much leaner. [Interaction icons were overhauled, not just visually but also their layout has improved](https://invent.kde.org/network/tokodon/-/merge_requests/211). Below is a screenshot of a mobile sized window, where the icons now spread out which will make them easier to tap (I plan on increasing the size on mobile too!) -![Screenshot of the new icons in mobile layout](new-icons.png) +![Screenshot of the new icons in mobile layout](new-icons.webp) The [amount of characters you have left is now shown in the composer](https://invent.kde.org/network/tokodon/-/merge_requests/212), which should load from your server (I don't have anything but a 500-char limit to test with though): -![The character count shows up in the bottom-left](character-count.png) +![The character count shows up in the bottom-left](character-count.webp) It's not merged yet, but I'm adding [overhauling how you view posts on profile pages](https://invent.kde.org/network/tokodon/-/merge_requests/214)! It has the usual separation of _"Posts"_, _"Replies"_ and _"Media"_ tabs but you can hide boosts too: -![The new profile tabs and post options](profile-posts.png) +![The new profile tabs and post options](profile-posts.webp) As a cherry on top, [I added icons to some of the menus](https://invent.kde.org/network/tokodon/-/merge_requests/217) which makes them easier to quickly navigate: @@ -66,7 +68,7 @@ Some more minor changes: I did some touching up work for Keysmith late this month: I fixed [a bunch of binding loops](https://invent.kde.org/utilities/keysmith/-/merge_requests/112), and added better keyboard navigation. I also [added a passive notification when you copy the code to your clipboard](https://invent.kde.org/utilities/keysmith/-/merge_requests/113) too: -![Example of the notification](passive.png) +![Example of the notification](passive.webp) There doesn't appear to be an active maintainer, so I'll get another reviewer and merge them next month. I also cleaned up some duplicate bugs, and moved some spam off of the tracker. diff --git a/content/blog/kde-april2023/maximize.png b/content/blog/kde-april2023/maximize.png deleted file mode 100644 index 81a6bc3..0000000 Binary files a/content/blog/kde-april2023/maximize.png and /dev/null differ diff --git a/content/blog/kde-april2023/maximize.webp b/content/blog/kde-april2023/maximize.webp new file mode 100644 index 0000000..d154c45 Binary files /dev/null and b/content/blog/kde-april2023/maximize.webp differ diff --git a/content/blog/kde-april2023/new-icons.png b/content/blog/kde-april2023/new-icons.png deleted file mode 100644 index abd8ed1..0000000 Binary files a/content/blog/kde-april2023/new-icons.png and /dev/null differ diff --git a/content/blog/kde-april2023/new-icons.webp b/content/blog/kde-april2023/new-icons.webp new file mode 100644 index 0000000..5d39fbc Binary files /dev/null and b/content/blog/kde-april2023/new-icons.webp differ diff --git a/content/blog/kde-april2023/passive.png b/content/blog/kde-april2023/passive.png deleted file mode 100644 index dcdff89..0000000 Binary files a/content/blog/kde-april2023/passive.png and /dev/null differ diff --git a/content/blog/kde-april2023/passive.webp b/content/blog/kde-april2023/passive.webp new file mode 100644 index 0000000..7464eaa Binary files /dev/null and b/content/blog/kde-april2023/passive.webp differ diff --git a/content/blog/kde-april2023/profile-posts.png b/content/blog/kde-april2023/profile-posts.png deleted file mode 100644 index b7f78a5..0000000 Binary files a/content/blog/kde-april2023/profile-posts.png and /dev/null differ diff --git a/content/blog/kde-april2023/profile-posts.webp b/content/blog/kde-april2023/profile-posts.webp new file mode 100644 index 0000000..8617ea9 Binary files /dev/null and b/content/blog/kde-april2023/profile-posts.webp differ diff --git a/content/blog/kde-feb2023/adding-polls.png b/content/blog/kde-feb2023/adding-polls.png deleted file mode 100644 index c78ed49..0000000 Binary files a/content/blog/kde-feb2023/adding-polls.png and /dev/null differ diff --git a/content/blog/kde-feb2023/adding-polls.webp b/content/blog/kde-feb2023/adding-polls.webp new file mode 100644 index 0000000..bd8c8a0 Binary files /dev/null and b/content/blog/kde-feb2023/adding-polls.webp differ diff --git a/content/blog/kde-feb2023/broken-toolbar.png b/content/blog/kde-feb2023/broken-toolbar.png deleted file mode 100644 index 45441d5..0000000 Binary files a/content/blog/kde-feb2023/broken-toolbar.png and /dev/null differ diff --git a/content/blog/kde-feb2023/broken-toolbar.webp b/content/blog/kde-feb2023/broken-toolbar.webp new file mode 100644 index 0000000..eaf59d4 Binary files /dev/null and b/content/blog/kde-feb2023/broken-toolbar.webp differ diff --git a/content/blog/kde-feb2023/fixed-toolbar.png b/content/blog/kde-feb2023/fixed-toolbar.png deleted file mode 100644 index 55a0d27..0000000 Binary files a/content/blog/kde-feb2023/fixed-toolbar.png and /dev/null differ diff --git a/content/blog/kde-feb2023/fixed-toolbar.webp b/content/blog/kde-feb2023/fixed-toolbar.webp new file mode 100644 index 0000000..48a9423 Binary files /dev/null and b/content/blog/kde-feb2023/fixed-toolbar.webp differ diff --git a/content/blog/kde-feb2023/index.md b/content/blog/kde-feb2023/index.md index 8e81dc4..1c163e6 100644 --- a/content/blog/kde-feb2023/index.md +++ b/content/blog/kde-feb2023/index.md @@ -8,6 +8,8 @@ tags: - KDE - Qt toc: true +series: +- My Work in KDE --- # New Gamepad KCM @@ -53,7 +55,7 @@ See the [merge request](https://invent.kde.org/network/tokodon/-/merge_requests/ You can now select the language you're posting in! You can't view a post's language or filter them from within Tokodon yet, but it's a start[^1]. Your preferred languages (chosen through the Languages & Formats KCM if you're using KDE) is shown at the top of the list. -![Screenshot of the language combo box](post-lang.png) +![Screenshot of the language combo box](post-lang.webp) See the [merge request](https://invent.kde.org/network/tokodon/-/merge_requests/156). @@ -61,7 +63,7 @@ See the [merge request](https://invent.kde.org/network/tokodon/-/merge_requests/ Tokodon has supported viewing polls already, but not posting them. Now you can create polls! All of your usual options are exposed, including some not even shown on Mastodon Web. This is not merged yet, but will be soon. -![Screenshot of creating a poll](adding-polls.png) +![Screenshot of creating a poll](adding-polls.webp) See the [merge request]https://invent.kde.org/network/tokodon/-/merge_requests/152). @@ -84,7 +86,7 @@ Now the badge will actually update based on your current notification count, hur Last month I redid the Window Decoration KCM, and this month I did the same for the PulseAudio KCM, although the changes needed where much smaller. -![The "new" PulseAudio KCM](pulse-pa.png) +![The "new" PulseAudio KCM](pulse-pa.webp) See the [merge request](https://invent.kde.org/plasma/plasma-pa/-/merge_requests/157). @@ -100,11 +102,11 @@ For qqc2-desktop-style, I [fixed an odd case where you could select text in Text Oliver landed the Plasma Welcome redesign for 6.0, which looks _wonderful_. As with all great features, this has had it's fair share of technical issues which I had the pleasure of helping with, including fixing this bug: -![Broken Plasma Welcome Toolbar](broken-toolbar.png) +![Broken Plasma Welcome Toolbar](broken-toolbar.webp) Embedded KCMs create and manage their own QML engine. Objects like `Kirigami.ApplicationWindow` are separated though, because that exists in Plasma Welcome's engine and not the KCMs, which breaks a lot of things including the global toolbar. I figured out that you can inject your own QML engine to KDeclarative, which will fix most of the issues. While doing this, I also simplified embedded KCMs in Plasma Welcome which will help developers creating their custom pages. -![Fixed Plasma Welcome Toolbar](fixed-toolbar.png) +![Fixed Plasma Welcome Toolbar](fixed-toolbar.webp) There's one lingering issue -- KDeclarative get's a little bit too greedy with the engine we give it and will try to destroy it to due to `std::shared_ptr` shenanigans, but fixing it will require changes to the framework. Right now we work around the issue by not assigning a parent, but I want to look into changing that soon. @@ -138,13 +140,13 @@ See the [new repository](https://invent.kde.org/websites/kdevelop-org). I opened an MR to update the matrix.to redirector hosted at [go.kde.org](go.kde.org/matrix) which should include a link to open in NeoChat! Once it's merged, I plan on replacing the links on the KDE Community Wiki with these instead of the WebChat links we have now. -See the [merge request](https://invent.kde.org/websites/go-kde-org/-/merge_requests/1). + # Changing Notification History Order This is something that's been sitting on my backlog, but I'm super annoyed about the ordering of notification history. Whenever I miss a notification[^4] I scroll through my notification history. However, it's ordered seemingly randomly, because it's sorted by "type and urgency". That's not too helpful because neither criteria is really exposed in the UI. I propose changing it to "Date" which makes way more sense for a history view of notifications. -![The new, much more improved notification order](notifications.png) +![The new, much more improved notification order](notifications.webp) See the [merge request](https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/2659). diff --git a/content/blog/kde-feb2023/notifications.png b/content/blog/kde-feb2023/notifications.png deleted file mode 100644 index 2e91f30..0000000 Binary files a/content/blog/kde-feb2023/notifications.png and /dev/null differ diff --git a/content/blog/kde-feb2023/notifications.webp b/content/blog/kde-feb2023/notifications.webp index 8b0cdbd..95a4b38 100644 Binary files a/content/blog/kde-feb2023/notifications.webp and b/content/blog/kde-feb2023/notifications.webp differ diff --git a/content/blog/kde-feb2023/post-lang.png b/content/blog/kde-feb2023/post-lang.png deleted file mode 100644 index 0ff7103..0000000 Binary files a/content/blog/kde-feb2023/post-lang.png and /dev/null differ diff --git a/content/blog/kde-feb2023/post-lang.webp b/content/blog/kde-feb2023/post-lang.webp new file mode 100644 index 0000000..ec54bf1 Binary files /dev/null and b/content/blog/kde-feb2023/post-lang.webp differ diff --git a/content/blog/kde-feb2023/pulse-pa.png b/content/blog/kde-feb2023/pulse-pa.png deleted file mode 100644 index 8c917ad..0000000 Binary files a/content/blog/kde-feb2023/pulse-pa.png and /dev/null differ diff --git a/content/blog/kde-feb2023/pulse-pa.webp b/content/blog/kde-feb2023/pulse-pa.webp new file mode 100644 index 0000000..9ac61b8 Binary files /dev/null and b/content/blog/kde-feb2023/pulse-pa.webp differ diff --git a/content/blog/kde-jan2023/index.md b/content/blog/kde-jan2023/index.md index 3f242bb..771f9eb 100644 --- a/content/blog/kde-jan2023/index.md +++ b/content/blog/kde-jan2023/index.md @@ -8,6 +8,8 @@ tags: - KDE - Qt toc: true +series: +- My Work in KDE --- This is a non-comprehensive list of all of the major work I've done for KDE this month of January. I think I got a lot done this month! I also was accepted as a KDE Developer near the start of the month, so I'm pretty happy about that. diff --git a/content/blog/kde-june2023/index.md b/content/blog/kde-june2023/index.md new file mode 100644 index 0000000..139b1c2 --- /dev/null +++ b/content/blog/kde-june2023/index.md @@ -0,0 +1,62 @@ +--- +title: "My work in KDE for June 2023" +date: 2023-06-30 +draft: false +tags: +- Linux +- Open Source +- KDE +- Qt +toc: true +series: +- My Work in KDE +--- + +We're over halfway through year! This update is a bit smaller than usual, and more focused on applications than Plasma. This isn't for lack of time or trying, but I made a conceited effort to clear out my MR backlog - fixing more issues than piling on features. This uh... didn't really work out and I'll be trying the same goal next month. I'm also going to explain a little bit of the reasoning behind this month's changes, so maybe it could inspire or help someone. + +# Tokodon + +The Android build (and CI) for Tokodon was broken ever since I replaced the video player with libmpv, so I spent a good chunk of this month making sure it's working again. This was quite a doozy, but I feel much more confident about improving Craft blueprints in the future. + +To anyone who is not familiar with Craft, it's a meta build system created by KDE which is also used for the GitLab CI. Craft and it's blueprints are written in Python. Blueprints describe how to build the application or library, and has easy utilities for working with existing build systems (AutoTools, CMake, Meson, etc). It may be a little daunting, but these blueprints are extremely easy to write and maintain. More importantly, Craft enables easy cross-compilation since it contains blueprints for the underlying libraries for KDE applications: OpenSSL, zlib, and so on. + +The problem is that Tokodon is - to my knowledge - the first KDE application to use libmpv on Android so I needed to break a lot of new ground to make this happen. + +## zlib + +zlib is already included in the Android NDK, but for some reason they don't ship pkgconfig files for it (for anything, really). This is troublesome, not for libraries or applications that link to zlib directly but as it turns out, other pkgconfig files. Libraries like freetype declare dependencies for zlib, and in turn pkgconfig will complain that it can't "find zlib" although the library itself exists, but not the pkgconfig file for it. Very annoying, I have some ideas on how we could solve this but for now, we now build it again on Android. + +## kirigami-addons + +This is a really simple fix, QtMultimedia was missing as a dependency for this library. The new FullscreenMaximizeDelegate component uses QtMultimedia under the hood to display video, but it wasn't declared in the blueprint. + +## libarchive + +When using libarchive for Android, you might encounter this error when including any of it's header: + +``` + +``` + +But a quick search revels that this bug has been known and fixed, but there wasn't a new enough version in it's blueprint. Now it's bumped to 3.6.2, which includes the fix. + +## ffmpeg + +Tokodon uses libmpv to display videos from Mastodon and other services, which are served over HTTPS. libmpv uses ffmpeg to fetch video data along with playback, but the blueprint for ffmpeg did not enable any TLS backend yet. Now it enables the OpenSSL backend, since we already build it. + +## fribidi and mpv + +Here's probably the weirdest and honestly harder-than-it-should-be error I had to fix. + +Here's a rundown of the necessary changes: +* Enable zlib on Android. This is necessary because Android NDK doesn't ship a pkgconfig for their built-in zlib. +* Kirigami-addons needed the QtMultimedia dependency (because of the new FullscreenImageDelegate component). +* libarchive needs to be bumped to 3.6.2, because of an Android build bug fixed in more recent versions. +* Enable OpenSSL support in ffmpeg, so there is HTTPs playback support. +* Build fribidi and mpv statically. + +# Gamepad KCM + +# Misc + +* Two sticker fixes stickers in NeoChat diff --git a/content/blog/kde-march2023/image.png b/content/blog/kde-march2023/image.png deleted file mode 100644 index 7772d87..0000000 Binary files a/content/blog/kde-march2023/image.png and /dev/null differ diff --git a/content/blog/kde-march2023/image.webp b/content/blog/kde-march2023/image.webp new file mode 100644 index 0000000..6c471c5 Binary files /dev/null and b/content/blog/kde-march2023/image.webp differ diff --git a/content/blog/kde-march2023/index.md b/content/blog/kde-march2023/index.md index 48887a2..6750d6a 100644 --- a/content/blog/kde-march2023/index.md +++ b/content/blog/kde-march2023/index.md @@ -8,6 +8,8 @@ tags: - KDE - Qt toc: true +series: +- My Work in KDE --- Another month in the year, another collection of bugfixes and features I contributed to KDE! @@ -25,7 +27,7 @@ too, although I haven't gotten around to opening up a merge request for that. I opened a doxyqml[^1] [merge request to make it's output more useful](https://invent.kde.org/sdk/doxyqml/-/merge_requests/16), by automatically adding import statement hints to the page: -![Example of the new doxyqml output](image.png) +![Example of the new doxyqml output](image.webp) # Plasma 6 Porting diff --git a/content/blog/kde-may2023/bad-docs.png b/content/blog/kde-may2023/bad-docs.png deleted file mode 100644 index d41f923..0000000 Binary files a/content/blog/kde-may2023/bad-docs.png and /dev/null differ diff --git a/content/blog/kde-may2023/bad-docs.webp b/content/blog/kde-may2023/bad-docs.webp new file mode 100644 index 0000000..8b187d5 Binary files /dev/null and b/content/blog/kde-may2023/bad-docs.webp differ diff --git a/content/blog/kde-may2023/better-qr-text.png b/content/blog/kde-may2023/better-qr-text.png deleted file mode 100644 index d965925..0000000 Binary files a/content/blog/kde-may2023/better-qr-text.png and /dev/null differ diff --git a/content/blog/kde-may2023/better-qr-text.webp b/content/blog/kde-may2023/better-qr-text.webp new file mode 100644 index 0000000..572a6dd Binary files /dev/null and b/content/blog/kde-may2023/better-qr-text.webp differ diff --git a/content/blog/kde-may2023/close-action.png b/content/blog/kde-may2023/close-action.png deleted file mode 100644 index 9041cbe..0000000 Binary files a/content/blog/kde-may2023/close-action.png and /dev/null differ diff --git a/content/blog/kde-may2023/close-action.webp b/content/blog/kde-may2023/close-action.webp new file mode 100644 index 0000000..8a9dde5 Binary files /dev/null and b/content/blog/kde-may2023/close-action.webp differ diff --git a/content/blog/kde-may2023/concept.PNG b/content/blog/kde-may2023/concept.PNG deleted file mode 100644 index 5f825bb..0000000 Binary files a/content/blog/kde-may2023/concept.PNG and /dev/null differ diff --git a/content/blog/kde-may2023/cuttlefish-select.png b/content/blog/kde-may2023/cuttlefish-select.png deleted file mode 100644 index 2f440ea..0000000 Binary files a/content/blog/kde-may2023/cuttlefish-select.png and /dev/null differ diff --git a/content/blog/kde-may2023/cuttlefish-select.webp b/content/blog/kde-may2023/cuttlefish-select.webp new file mode 100644 index 0000000..c7d097f Binary files /dev/null and b/content/blog/kde-may2023/cuttlefish-select.webp differ diff --git a/content/blog/kde-may2023/gnome-tokodon.png b/content/blog/kde-may2023/gnome-tokodon.png deleted file mode 100644 index b22af87..0000000 Binary files a/content/blog/kde-may2023/gnome-tokodon.png and /dev/null differ diff --git a/content/blog/kde-may2023/gnome-tokodon.webp b/content/blog/kde-may2023/gnome-tokodon.webp new file mode 100644 index 0000000..e1573c2 Binary files /dev/null and b/content/blog/kde-may2023/gnome-tokodon.webp differ diff --git a/content/blog/kde-may2023/good-docs.png b/content/blog/kde-may2023/good-docs.png deleted file mode 100644 index 7772d87..0000000 Binary files a/content/blog/kde-may2023/good-docs.png and /dev/null differ diff --git a/content/blog/kde-may2023/good-docs.webp b/content/blog/kde-may2023/good-docs.webp new file mode 100644 index 0000000..113e87b Binary files /dev/null and b/content/blog/kde-may2023/good-docs.webp differ diff --git a/content/blog/kde-may2023/index.md b/content/blog/kde-may2023/index.md index 81cfe8c..6eeeeec 100644 --- a/content/blog/kde-may2023/index.md +++ b/content/blog/kde-may2023/index.md @@ -8,6 +8,8 @@ tags: - KDE - Qt toc: true +series: +- My Work in KDE --- I can't believe it's already the end of May! This month turned out a little meatier than last month I think, but I still have a large backlog of merge requests and TODOs to go through. @@ -16,19 +18,19 @@ I can't believe it's already the end of May! This month turned out a little meat Now when there isn't enough space to display the QR code in the clipboard applet, there [is a clearer message of what to do next](https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/2952). -![Screenshot of the new message in action.](better-qr-text.png) +![Screenshot of the new message in action.](better-qr-text.webp) On the topic of QR codes, the menu [is now a menu of radio buttons and not checkboxes](https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/2953) which didn't make sense because it's an exclusive option. -![You can't have two different codes being displayed after all.](qr-radio.png) +![You can't have two different codes being displayed after all.](qr-radio.webp) There [is now a separator above the "Close" action](https://invent.kde.org/plasma/kwin/-/merge_requests/4132) in the window menu! -![It now matches other context menus with this action, e.g. the Task Manager](close-action.png) +![It now matches other context menus with this action, e.g. the Task Manager](close-action.webp) I added [a metadata extractor for Krita files](https://invent.kde.org/frameworks/kfilemetadata/-/merge_requests/97), which means certain information about your Krita artwork can show up in Dolphin, Baloo and other programs that can take advantage of it! This includes helpful information such as canvas width, height and creation date. -![A slightly outdated screenshot, but showing off some of the metadata it can extract](krita-extract.png) +![A slightly outdated screenshot, but showing off some of the metadata it can extract](krita-extract.webp) Soon, the Language and Region settings [will support the `$LANGUAGE` environment variable](https://invent.kde.org/plasma/plasma-workspace/-/merge_requests/2946). This only affects users who did not configure the language explicitly from KDE, like those coming from another computing environment. We already supported loading your pre-existing language from `$LANG`. Included in that merge request is a fix that stops an erroneous warning message telling you that your language isn't supported, even though it clearly is. @@ -43,7 +45,7 @@ An applet name or path must be specified, e.g. --applet org.kde.plasma.analogclo I proposed [making the icon name selectable](https://invent.kde.org/plasma/plasma-sdk/-/merge_requests/76), because I can't stop myself from clicking on it! -![Screenshot of selecting the icon name in Cuttlefish.](cuttlefish-select.png) +![Screenshot of selecting the icon name in Cuttlefish.](cuttlefish-select.webp) ## Gamepad KCM @@ -63,7 +65,7 @@ Playing videos and GIFs should be less crashy, but with worse scrolling performa You can now [change certain account preferences](https://invent.kde.org/network/tokodon/-/merge_requests/238), but the selection is limited due to lack of a proper API. These are preferences that were supported before, but now you can change them from within Tokodon. -![The preferences you can tweak in Tokodon](tokodon-prefs.png) +![The preferences you can tweak in Tokodon](tokodon-prefs.webp) And a whole slew of smaller stuff, some which are appearing in the next bugfix release: @@ -72,7 +74,7 @@ And a whole slew of smaller stuff, some which are appearing in the next bugfix r * The duplicate account [bug should _finally_ be fixed](https://invent.kde.org/network/tokodon/-/merge_requests/229)! * [Fix icons on non-KDE environments, such as GNOME](https://invent.kde.org/network/tokodon/-/merge_requests/228). -![Tokodon on GNOME!](gnome-tokodon.png) +![Tokodon on GNOME!](gnome-tokodon.webp) For the current and future contributors, I started working on better and more detailed documentation. The first two areas I covered was [timeline models](https://invent.kde.org/network/tokodon/-/merge_requests/237) and the [account classes](https://invent.kde.org/network/tokodon/-/merge_requests/236)! @@ -101,17 +103,17 @@ I started [replacing the old foreach macro](https://invent.kde.org/education/kit The [go.kde.org Matrix redirector update](https://invent.kde.org/websites/go-kde-org/-/merge_requests/1) is now merged, which I started in February. This means NeoChat is now preferred right below Element Web (which is still pointed towards https://webchat.kde.org/). Thanks to Thiago Sueto, [the Community Wiki has been updated already](https://invent.kde.org/teams/web/wiki-sites/-/issues/2#note_652483) and I sent two merge requests to update [kde.org](https://invent.kde.org/websites/kde-org/-/merge_requests/200) and the [footer](https://invent.kde.org/websites/hugo-kde/-/merge_requests/4). -![The updated matrix.to redirector!](webchat-matrix.png) +![The updated matrix.to redirector!](webchat-matrix.webp) To finish off more February work, I got around to working on the two big pieces of API documentation improvements for KDE Frameworks 6. If you don't remember, I wanted to add import statements for components meant to be used in Qt Quick. Doxygen already gives us hints for C++ headers, so QML users shouldn't be left in the dust. For example, how are you even supposed to use this component? -![This is a real example. Not all components are like this, fortunately.](bad-docs.png) +![This is a real example. Not all components are like this, fortunately.](bad-docs.webp) In order to accomplish this, subclasses of `QQuickItem` need to have their doc comments modified. The first library to get this treatment is plasma-framework, see the merge requests for [PlasmaCore](https://invent.kde.org/frameworks/plasma-framework/-/merge_requests/783), [PlasmaQuick](https://invent.kde.org/frameworks/plasma-framework/-/merge_requests/785) and [hiding ToolTipDialog](https://invent.kde.org/frameworks/plasma-framework/-/merge_requests/786). For regular QML-based components, doxyqml (the tool to auto-generate QML documentation, because Doxygen lacks support for the language) needed to spit these out too. The [merge request to add import statements](https://invent.kde.org/sdk/doxyqml/-/merge_requests/16) is cleaned up, the tests fixed and ready for final review! -![Ah! I had to import that module!](good-docs.png) +![Ah! I had to import that module!](good-docs.webp) I also spent some time cleaning up [the Community wiki](https://community.kde.org/), which just means I roam around and make sure links aren't dead and the formatting looks nice. If you're interested in some wiki improvement, join us in [#kde-www](https://go.kde.org/matrix/#/#kde-www:kde.org) and the [Issue board](https://invent.kde.org/teams/web/wiki-sites/-/issues)! diff --git a/content/blog/kde-may2023/krita-extract.png b/content/blog/kde-may2023/krita-extract.png deleted file mode 100644 index 891c6a6..0000000 Binary files a/content/blog/kde-may2023/krita-extract.png and /dev/null differ diff --git a/content/blog/kde-may2023/krita-extract.webp b/content/blog/kde-may2023/krita-extract.webp new file mode 100644 index 0000000..0f5a7a3 Binary files /dev/null and b/content/blog/kde-may2023/krita-extract.webp differ diff --git a/content/blog/kde-may2023/qr-radio.png b/content/blog/kde-may2023/qr-radio.png deleted file mode 100644 index 2d8af8e..0000000 Binary files a/content/blog/kde-may2023/qr-radio.png and /dev/null differ diff --git a/content/blog/kde-may2023/qr-radio.webp b/content/blog/kde-may2023/qr-radio.webp new file mode 100644 index 0000000..fb5c5af Binary files /dev/null and b/content/blog/kde-may2023/qr-radio.webp differ diff --git a/content/blog/kde-may2023/tokodon-prefs.png b/content/blog/kde-may2023/tokodon-prefs.png deleted file mode 100644 index 89bd48c..0000000 Binary files a/content/blog/kde-may2023/tokodon-prefs.png and /dev/null differ diff --git a/content/blog/kde-may2023/tokodon-prefs.webp b/content/blog/kde-may2023/tokodon-prefs.webp new file mode 100644 index 0000000..cab20d1 Binary files /dev/null and b/content/blog/kde-may2023/tokodon-prefs.webp differ diff --git a/content/blog/kde-may2023/webchat-matrix.png b/content/blog/kde-may2023/webchat-matrix.png deleted file mode 100644 index 855dde0..0000000 Binary files a/content/blog/kde-may2023/webchat-matrix.png and /dev/null differ diff --git a/content/blog/kde-may2023/webchat-matrix.webp b/content/blog/kde-may2023/webchat-matrix.webp new file mode 100644 index 0000000..88f69e9 Binary files /dev/null and b/content/blog/kde-may2023/webchat-matrix.webp differ diff --git a/content/blog/level-csg/banner.webp b/content/blog/level-csg/banner.webp new file mode 100644 index 0000000..5c49b43 Binary files /dev/null and b/content/blog/level-csg/banner.webp differ diff --git a/content/blog/level-csg/cube-render.webp b/content/blog/level-csg/cube-render.webp new file mode 100644 index 0000000..d1f4936 Binary files /dev/null and b/content/blog/level-csg/cube-render.webp differ diff --git a/content/blog/level-csg/cube-viewport.webp b/content/blog/level-csg/cube-viewport.webp new file mode 100644 index 0000000..f586ccf Binary files /dev/null and b/content/blog/level-csg/cube-viewport.webp differ diff --git a/content/blog/level-csg/hammer.webp b/content/blog/level-csg/hammer.webp new file mode 100644 index 0000000..ca89e40 Binary files /dev/null and b/content/blog/level-csg/hammer.webp differ diff --git a/content/blog/level-csg/index.md b/content/blog/level-csg/index.md new file mode 100644 index 0000000..caa44c9 --- /dev/null +++ b/content/blog/level-csg/index.md @@ -0,0 +1,340 @@ +--- +title: "Graphics Dump: Easy level building with tiny_csg" +date: 2023-06-25 +draft: true +summary: "Have you ever played Half-Life 2 and infatuated with it's odd, cubic level design like I am? Well, you can use it at home!" +tags: +- C++- Math +toc: true +series: +- Graphics Dump +--- + +I've always been fascinated with CSG, as someone who has spent some time messing around in Valve's Hammer and Unreal Editor. However, when trying to implement CSG level geometry in my engine there's surprisingly little information! Here's a CSG tutorial I wish existed, so maybe it can help you too. + +![My CSG example level.](banner.webp) + +Much of the example code is ripped out of my engine, but this should give you a good enough walk-through to replicate it on your own. + +# Constructive Solid Geometry + +CSG stands for [Constructive Solid Geometry](https://en.wikipedia.org/wiki/Constructive_solid_geometry), a helpful technique to create complex geometry using simple primitives and boolean operators. Using CSG, it's possible to create a model in a procedural, non-destructive fashion and has been a popular tool in game engines (and CAD applications). + +![A cube being cut by a boolean operation in Blender.](cube-viewport.webp) +![Finished result.](cube-render.webp) + +I like video games, so naturally my first-hand experience with CSG is Source games. This is how much of the level geometry was built in those games: + +![Hammer level editor, from the ["Valve Hammer Editor - Change level tutorial"](https://www.youtube.com/watch?v=VcEnQYJjeSU).](hammer.webp) + +# Integration + +I wanted to use CSG in my game engine, but searching online you'll get very few tutorials or even discussion about integrating it. If you have the enough prerequisite math knowledge, you might be able to get something going but I was hoping for a ready-made solution I could integrate. + +Fortunately, there is one fantastic and almost-all-batteries-included library created by [Luka Aleksić](https://github.com/laleksic) called [tiny_csg](https://github.com/laleksic/tiny_csg). It's written in C++, and is perfect for the brush building tooling I wanted. Since the library uses CMake, it was easy enough to vendor into my source tree as well. + +## Defining brushes + +Before we can start using tiny_csg, we need some way to define the brushes in our map first. Brushes are defined by a list of planes that enclose a primitive. I'm focusing on cube primitives in this article, so we only need to worry about six planes: _front, back, left, right, bottom and top_. + +Let's define an array of eight points, which correspond to each corner of the cube. Here is the points visualized: + +![Points of the cube, visualized.](positions.webp) + +And it can be defined like this in C++: + +```cpp +std::array points = { + float3{1, 1, -1}, // A + float3{1, 1, 1}, // B + float3{-1, 1, 1}, // C + float3{-1, 1, -1}, // D + float3{1, -1, -1}, // E + float3{1, -1, 1}, // F + float3{-1, -1, 1}, // G + float3{-1, -1, -1}, // H +}; +``` + +Now that we have the points of our cube well-defined, let's move onto defining each plane that we need. Here is a list of the planes, and the points they contain: + +* **Front:** B, A, E, F +* **Back:** D, C, G, H +* **Top:** A, B, C, D +* **Bottom:** H, G, F, E +* **Right:**: C, B, F, G +* **Left:** A, D, H, E + +(Note that the ordering is important, and should be _counter-clockwise_.) + +Using a group of these four points, you can calculate the center of a plane: + +```cpp +center = (a + b + c + d) / 4.0f; +``` + +However a plane isn't defined by only a center, you also need to calculate a normal which is used to find the face direction. This is easy to do however, first you need a function that gives you the normal of a triangle: + +```cpp +float3 triangle_normal(float3 p1, float3 p2, float3 p3) { + return normalize(cross(p1 - p2, p1 - p3)); +} +``` + +Given a plane (a, b, c, d), you can calculate two triangles: (c, b, a) and (a, d, c). Finally, average the normals of those two triangles and you completed the plane! + +## Using tiny_csg + +Now that we have our list of planes defined, we can start building the level geometry using tiny_csg. This library will do the heavy lifting for us, and give us a list of triangles to render with. + +First, create the world and set the void volume: + +```cpp +csg::world_t world{}; +world.set_void_volume(AIR); +``` + +There is no predefined volume types, so you need to define your own: + +```cpp +constexpr csg::volume_t AIR = 0; +constexpr csg::volume_t SOLID = 1; +constexpr csg::volume_t WATER = 2; +... +``` + +Create a brush_t with `csg::world_t::add()` and set the planes and the kind of volume it is: + +```cpp +auto brush = world.add(); +brush->set_planes(get_planes()); // a list of the planes we created earlier. +brush->set_volume_operation(csg::make_fill_operation(SOLID)); +``` + +Next, call `world_t::rebuild()` to begin the level building process. The result is faces and fragments we can then use to rasterize the brushes! It's a linked list, so to iterate it start with `world_t::first()` and get the next brush in the list using `world_t::next()`: + +```cpp +csg::brush_t* brush = world.first(); +if (brush) { + while (brush) { + ... + brush = world.next(brush); + } +} +``` + +To start looping through the triangles, use `brush_t::get_faces()` and loop through the faces, and then the fragments of said faces: + +```cpp +auto faces = brush->get_faces(); +for (csg::face_t& face : faces) { + for (csg::fragment_t& fragment : face.fragments) { + const auto triangles = csg::triangulate(fragment); + + // process the triangles... + } +} +``` + +You'll want to discard any fragments that are touching two of the same volume type. For example, air touching air would contribute a lot of unnecessary geometry: + +```cpp +const csg::volume_t front = fragment.front_volume; +const csg::volume_t back = fragment.back_volume; + +// Discard air/air and solid/solid polygons +if (front == back) + continue; +``` + +Now let's deep dive into how to process these triangles, and some pitfalls you might run into. + +## Triangulation + +tiny_csg will triangulate the brush fragments for you, but it's up to you to calculate things like texture coordinates, normal, tangents/bitangents and more. Those are all pretty easy though, so let's start with normals. + +### Normals + +To calculate normals, you can just take the normal of the plane the face is part of: + +```cpp +for (auto triangle : triangles) { + float3 normal = face.plane->normal; + + ... +} +``` + +However, make sure that when the back is a void volume (like `AIR`), that you _flip_ the normal: + +```cpp +for (auto triangle : triangles) { + float3 normal = face.plane->normal; + if (back == AIR) { + normal = -normal; + } + ... +} +``` + +When you intersect a solid with a void brush, the new geometry created to fill the hole is calculated _from_ the void brush - meaning that the normals are facing the wrong direction. It's technically correct for the void brush, but not the hole. + +If you are building an index list, I think you also want to flip it as well but it might not be needed. + +### Texture coordinates + +Texture coordinates are relatively easy to calculate as well, first set up a loop iterating through all the triangles. + +```cpp +for (std::size_t i = 0; i < indices.size(); i += 3) { + const float3 v1 = vertices[indices[i]].position; + const float3 v2 = ...; + const float3 v3 = ...; +} +``` + +Calculate a face normal, and also check if all of the components do not equal zero: + +```cpp +float3 normal = cross(v3 - v1, v2 - v1); +if (normal.x == 0.0f && normal.y == 0.0f && normal.z == 0.0f) { + continue; +} +``` + +Next we want to create a rotation that looks "towards" this normal: + +``` +Quaternion rotation = look_rotation(float3{0, 0, 1}, normal); +``` + +Then for each vertex in this triangle, we can multiply it component-wise to create a pretty nice distribution. I included an extra `scale` variable that I can adjust on the whole brush. + +```cpp +vertices[indices[i]].uv = float2{(rotation * v1).x, (rotation * v1).y} * scale; +vertices[indices[i + 1]].uv = float2{(rotation * v2).x, (rotation * v2).y} * scale; +vertices[indices[i + 2]].uv = float2{(rotation * v3).x, (rotation * v3).y} * scale; +``` + +## Tangents and bitangents + +This one is a little bit more difficult, and I ended up going with a widely used library called Mikktspace to calculate these. It's interface is a little obtuse at first too. You need to create a `SMikkTSpaceInterface` and assign a bunch of functions it will use to grab and store triangle data. I used lambdas for these, and assigning userdata: + +```cpp +SMikkTSpaceInterface iface = {}; +iface.m_getNumFaces = [](const SMikkTSpaceContext *ctx) -> int { + const CSGMesh *m = static_cast(ctx->m_pUserData); + return m->indices.size() / 3; +}; + +iface.m_getNumVerticesOfFace = [](const SMikkTSpaceContext *, const int) -> int { + return 3; +}; + +iface.m_getNormal = [](const SMikkTSpaceContext *ctx, float normals[], + const int iface, const int ivert) { + const CSGMesh *m = static_cast(ctx->m_pUserData); + + int i = iface * 3 + ivert; + memcpy(normals, m->vertices[i].normal.ptr(), sizeof(float3)); +}; + +iface.m_getTexCoord = [](const SMikkTSpaceContext *ctx, float texcoords[], + const int iface, const int ivert) { + const CSGMesh *m = static_cast(ctx->m_pUserData); + + int i = iface * 3 + ivert; + memcpy(texcoords, m->vertices[i].uv.ptr(), sizeof(float2)); +}; +iface.m_getPosition = [](const SMikkTSpaceContext *ctx, float position[], + const int iface, const int ivert) { + const CSGMesh *m = static_cast(ctx->m_pUserData); + + int i = iface * 3 + ivert; + memcpy(position, m->vertices[i].position.ptr(), sizeof(float3)); +}; +iface.m_setTSpaceBasic = [](const SMikkTSpaceContext *ctx, const float tangent[], const float sign, + const int iface, const int ivert) { + const CSGMesh *m = static_cast(ctx->m_pUserData); + + int i = iface * 3 + ivert; + float4 t{tangent[0], tangent[1], tangent[2], sign}; + memcpy(m->vertices[i].tangent.ptr(), t.ptr(), sizeof(float4)); +}; +``` +(This code could absolutely be improved!) + +After you created your interface, you can then create a context and assign your userdata and then start the tangent process. + +```cpp +SMikkTSpaceContext ctx; +ctx.m_pUserData = &cgMesh; +ctx.m_pInterface = &iface; +genTangSpaceDefault(&ctx); +``` + +## Bullet + +It's also really easy to plug the triangle data straight into Bullet too, if that's the physics engine you're using. Here's the snippet if you also want Bullet integration: + +```cpp +csg::brush_t* brush = scene.world->first(); +if (brush != nullptr) { + while (brush) { + auto faces = brush->get_faces(); + for (csg::face_t& face : faces) { + for (csg::fragment_t& fragment : face.fragments) { + const csg::volume_t front = fragment.front_volume; + const csg::volume_t back = fragment.back_volume; + + if (front == back) // discard air/air and solid/solid polygons. + continue; + + const auto triangles = csg::triangulate(fragment); + + for (auto triangle : triangles) { + brushes_positions.push_back(fragment.vertices[triangle.i].position.x); + brushes_positions.push_back(fragment.vertices[triangle.i].position.y); + brushes_positions.push_back(fragment.vertices[triangle.i].position.z); + brushes_indices.push_back(brushes_indices.size()); + + brushes_positions.push_back(fragment.vertices[triangle.j].position.x); + brushes_positions.push_back(fragment.vertices[triangle.j].position.y); + brushes_positions.push_back(fragment.vertices[triangle.j].position.z); + brushes_indices.push_back(brushes_indices.size()); + + brushes_positions.push_back(fragment.vertices[triangle.k].position.x); + brushes_positions.push_back(fragment.vertices[triangle.k].position.y); + brushes_positions.push_back(fragment.vertices[triangle.k].position.z); + brushes_indices.push_back(brushes_indices.size()); + } + } + } + brush = scene.world->next(brush); + } +} + +auto *index_vertex_array = new btTriangleIndexVertexArray(brushes_indices.size() / 3, + const_cast(reinterpret_cast(brushes_indices.data())), + sizeof(int) * 3, + brushes_positions.size(), + const_cast(brushes_positions.data()), + sizeof(btScalar) * 3); + +const bool quantized_aabb_compression = false; +auto *shape = new btBvhTriangleMeshShape(index_vertex_array, quantized_aabb_compression); +``` + +# Results + +The result is pretty amazing, here is a quick walk-through of a level I made using CSG: + +{{< tube "https://tube.ryne.moe/videos/embed/b11d3bb5-cec9-4109-8a01-bc9b0e60d92c" >}} + +# Credits + +* Luka Aleksić for the amazing tiny_csg library! +* This [StackExchange answer](https://gamedev.stackexchange.com/a/147030) by "DMGregory" which suggested using Mikktspace for creating tangent and bitangent vectors. +* This [StackExchange answer](https://gamedev.stackexchange.com/a/139955) by "DMGregory" again which suggested how to calculate texture coordinates for arbitrary triangles. + + diff --git a/content/blog/level-csg/positions.webp b/content/blog/level-csg/positions.webp new file mode 100644 index 0000000..ae38d5b Binary files /dev/null and b/content/blog/level-csg/positions.webp differ diff --git a/content/blog/linux-graphics-stack.md b/content/blog/linux-graphics-stack.md index 7c43d57..2a0151e 100644 --- a/content/blog/linux-graphics-stack.md +++ b/content/blog/linux-graphics-stack.md @@ -2,10 +2,9 @@ title: "Graphics Dump: Mesa, Vulkan and DRM" date: 2022-11-15 draft: false -tags: +blogtags: - Vulkan - Linux -- Graphics Dump - KDE comments: host: mastodon.art diff --git a/content/blog/linux-windowing.md b/content/blog/linux-windowing.md index a8227b5..64d2da7 100644 --- a/content/blog/linux-windowing.md +++ b/content/blog/linux-windowing.md @@ -1,10 +1,11 @@ --- -title: "Graphics Dump" +title: "Graphics Dump: The Linux desktop" date: 2022-11-15 draft: true tags: - Vulkan - Linux +series: - Graphics Dump --- diff --git a/content/blog/matrix-update.md b/content/blog/matrix-update.md index 140ced9..7d594eb 100644 --- a/content/blog/matrix-update.md +++ b/content/blog/matrix-update.md @@ -2,6 +2,8 @@ title: "Matrix Update" date: 2022-06-29 draft: false +tags: +- Website --- If any Matrix admins are reading this, I have a quick update at what's happening to my two old matrix servers: redstrate.com and ryne.moe. These servers are now _defunct_ and if you are seeing any users from them, I recommend either blacklisting the servers on an ACL or just kicking them - but there's no current Synapse server actually backing them so they shouldn't be able to perform any actions anyway. diff --git a/content/blog/moving-away-from-github.md b/content/blog/moving-away-from-github.md index b870e09..5889431 100644 --- a/content/blog/moving-away-from-github.md +++ b/content/blog/moving-away-from-github.md @@ -3,6 +3,7 @@ title: "Moving away from GitHub" tags: - GitHub - sourcehut +- Open Source draft: false date: 2022-06-23 aliases: diff --git a/content/blog/moving-to-sourcehut-followup.md b/content/blog/moving-to-sourcehut-followup.md index 8206cf3..204a947 100644 --- a/content/blog/moving-to-sourcehut-followup.md +++ b/content/blog/moving-to-sourcehut-followup.md @@ -5,6 +5,7 @@ draft: false tags: - GitHub - sourcehut +- Open Source aliases: - /notes/moving-to-sourcehut-followup/ --- diff --git a/content/blog/obscure-qt1.md b/content/blog/obscure-qt1.md index 0a4a4a5..b8eb2bd 100644 --- a/content/blog/obscure-qt1.md +++ b/content/blog/obscure-qt1.md @@ -4,6 +4,8 @@ date: 2023-04-19 draft: false tags: - Qt +series: +- Obscure Qt --- I decided to start a short series of describing weird, obscure Qt behavior! Because of my new job, I'm working with Qt even more than I did before. As I'm finding new and undocumented behavior, I feel that it's too useful to be posted on something like Mastodon and then forgotten. diff --git a/content/blog/obscure-qt2/bad.png b/content/blog/obscure-qt2/bad.png deleted file mode 100644 index 557bc1b..0000000 Binary files a/content/blog/obscure-qt2/bad.png and /dev/null differ diff --git a/content/blog/obscure-qt2/bad.webp b/content/blog/obscure-qt2/bad.webp new file mode 100644 index 0000000..39f6d6f Binary files /dev/null and b/content/blog/obscure-qt2/bad.webp differ diff --git a/content/blog/obscure-qt2/good.png b/content/blog/obscure-qt2/good.png deleted file mode 100644 index 680eee3..0000000 Binary files a/content/blog/obscure-qt2/good.png and /dev/null differ diff --git a/content/blog/obscure-qt2/good.webp b/content/blog/obscure-qt2/good.webp new file mode 100644 index 0000000..e2c8711 Binary files /dev/null and b/content/blog/obscure-qt2/good.webp differ diff --git a/content/blog/obscure-qt2/index.md b/content/blog/obscure-qt2/index.md index 5a21322..db46387 100644 --- a/content/blog/obscure-qt2/index.md +++ b/content/blog/obscure-qt2/index.md @@ -4,11 +4,13 @@ date: 2023-05-02 draft: false tags: - Qt +series: +- Obscure Qt --- Outside of Qt Creator, GDB has a hard time understanding Qt times and you'll regularly get garbage or unusable debugging output. -![An example of CLion (which uses GDB) trying to show the contents of a QList.](bad.png) +![An example of CLion (which uses GDB) trying to show the contents of a QList.](bad.webp) Luckily, [GDB has a system where you can use Python scripts](https://github.com/ruediger/Boost-Pretty-Printer/blob/master/HACKING.org) to print information from custom types[^1]. The printers we're using is [Ezike Ebuka's GDB_Printers](https://invent.kde.org/ebuka/gdb_printers). First clone the repository, and extract it somewhere where you won't accidentally delete it. Here I copy it into my Development folder: @@ -35,7 +37,7 @@ set print pretty on Now if you run GDB again, you'll get pretty prints for a lot of Qt types! This includes QString, QVector, and of course QList: -![The same m_attachments variable, but it's actually useful for debugging now!](good.png) +![The same m_attachments variable, but it's actually useful for debugging now!](good.webp) If you want a full list of supported types, take a look in [qtprinters.py](https://invent.kde.org/ebuka/gdb_printers/-/blob/master/printers/qtprinters.py). diff --git a/content/blog/opening-addresses/index.md b/content/blog/opening-addresses/index.md index 29fba91..49373ac 100644 --- a/content/blog/opening-addresses/index.md +++ b/content/blog/opening-addresses/index.md @@ -16,7 +16,7 @@ But I learned that [KDE Marble](https://marble.kde.org/) exists, a native KDE ap 1. We set the "Show Address" to open an "External Application", this is where we'll call our python script `geo.py`: -![KAddressBook settings](kaddressbook-settings.png) +![KAddressBook settings](kaddressbook-settings.webp) The full command is: @@ -46,7 +46,7 @@ This is actually quite interesting, as I would think KAddressBook would have thi So this is where Nominatim comes in, which as said before - is a service run by OpenStreetMap. Its API is extremely simple, which is perfect. I originally tried to only do this in Shell and CURL, but it turned out to be much easier just to use GeoPy and Python. -![KDE Marble without the extra arguments](kdemarble-faraway.png) +![KDE Marble without the extra arguments](kdemarble-faraway.webp) Then, you'll notice if you don't add any extra arguments to Marble, it'll open up super far away and also in a weird default view that's not suitable for viewing addresses. Luckily, the developers already added some nice arguments to allow us to change this default behavior: @@ -54,4 +54,4 @@ Then, you'll notice if you don't add any extra arguments to Marble, it'll open u This will set the initial distance to "0 km" and also changes the map view to OpenStreetMap, perfect! -![KDE Marble in it's ideal view for streets](kdemarble-fixed.png) +![KDE Marble in it's ideal view for streets](kdemarble-fixed.webp) diff --git a/content/blog/opening-addresses/kaddressbook-settings.png b/content/blog/opening-addresses/kaddressbook-settings.png deleted file mode 100644 index 51e4a13..0000000 Binary files a/content/blog/opening-addresses/kaddressbook-settings.png and /dev/null differ diff --git a/content/blog/opening-addresses/kaddressbook-settings.webp b/content/blog/opening-addresses/kaddressbook-settings.webp new file mode 100644 index 0000000..7ffb30b Binary files /dev/null and b/content/blog/opening-addresses/kaddressbook-settings.webp differ diff --git a/content/blog/opening-addresses/kdemarble-faraway.png b/content/blog/opening-addresses/kdemarble-faraway.png deleted file mode 100644 index cac6781..0000000 Binary files a/content/blog/opening-addresses/kdemarble-faraway.png and /dev/null differ diff --git a/content/blog/opening-addresses/kdemarble-faraway.webp b/content/blog/opening-addresses/kdemarble-faraway.webp new file mode 100644 index 0000000..696a9c2 Binary files /dev/null and b/content/blog/opening-addresses/kdemarble-faraway.webp differ diff --git a/content/blog/opening-addresses/kdemarble-fixed.png b/content/blog/opening-addresses/kdemarble-fixed.png deleted file mode 100644 index 3c47f2f..0000000 Binary files a/content/blog/opening-addresses/kdemarble-fixed.png and /dev/null differ diff --git a/content/blog/opening-addresses/kdemarble-fixed.webp b/content/blog/opening-addresses/kdemarble-fixed.webp new file mode 100644 index 0000000..4a5bbbb Binary files /dev/null and b/content/blog/opening-addresses/kdemarble-fixed.webp differ diff --git a/content/blog/ps2-bios/fit_2048.webp b/content/blog/ps2-bios/fit_2048.webp new file mode 100644 index 0000000..fd04e94 Binary files /dev/null and b/content/blog/ps2-bios/fit_2048.webp differ diff --git a/content/blog/ps2-bios/index.md b/content/blog/ps2-bios/index.md new file mode 100644 index 0000000..08dfc9b --- /dev/null +++ b/content/blog/ps2-bios/index.md @@ -0,0 +1,101 @@ +--- +title: "Dumping and repacking the Playstation 2 DVD Player" +date: 2023-06-26 +draft: true +summary: "Earlier this year, me and my partner got a Playstation 2 as a gift. Of course I wanted to softmod it! " +tags: +- Emulation +- Reverse Engineering +- Playstation +--- + +**Context:** Earlier this year, me and my partner got a Playstation 2 as a gift. Of course I wanted to softmod it! The console came with firmware 1.10U, an especially odd and early firmware version that did not work with the FreeDVDBoot exploit. I didn't know [FreeHDBoot](https://israpps.github.io/FreeMcBoot-Installer/test/FHDB-TUTO.html) when researching and writing this, which I ended up going with in the end. I gave up on this exploit port, and didn't succeed. I think there's still some value in this post anyway. + +--- + +If you aren't familiar with [FreeDVDBoot](https://github.com/CTurt/FreeDVDBoot), it's an exploit developed by [CTurt](http://cturt.github.io/) who is a well known hacker also known for shogihax, PS4 hacking and other things. FreeDVDBoot is theoretically simple, it takes advantage of buffer overflow exploits in the DVD firmware of the Playstation 2 console. + +![The PS2 in question.](fit_2048.webp) + +Me and my partner were gifted a Playstation 2 on Christmas, and I found out it's _extremely easy to mod_! I have a "phat" version of the console, so it's exploitable using [FreeMCBoot](https://israpps.github.io/FreeMcBoot-Installer/) or FreeDVDBoot. Unfortunately, to use FreeMCBoot you need an exploited memory card - the only way to get one is to write one yourself from an already exploited console (or a memory card writer) and I didn't want to spend any extra money. FreeDVDBoot works, but has only had builds for DVD firmware 2.00 and up. Well it's good thing mine is: + +Huh... **1.10U**!? It looks like my console was a really early US model (_SCPH-30001_). Unfortunately, the only way one of these models could have a higher firmware is flashing via a update disc that comes with the PS2 DVD Control Remote. Again, didn't want to spend any extra money, so I didn't want to go online and buy it. + +Luckily, CTurt has mentioned in the FreeDVDBoot README that the exploit should _technically_ work on any DVD firmware from 1.00-2.10. So that's exactly what I'm setting out to do, after all there are traces of 1.10 support in the code. + +> "It's still early in terms of support for different versions, check back here later. Hopefully over time other developers from the scene will also contribute support for additional DVD Player versions. The new exploit for 2.10 should be possible to port to all firmwares between 1.00 - 2.13 (Sony actually patched this one in 2.14 lol)." + +At first I tried burning DVD-Rs, but it was a real hassle and also a waste since these aren't reusable. However, CTurst mentions that it's possible to force PCXS2 to load the DVD firmware needed to exploit: + +> "I'd like to thank krHacken for helping me out with that first roadblock. It turns out that PCSX2 does support the DVD player; it just can't load it automatically since it's located in encrypted storage and PCSX2 does not support the decryption. There are public tools which can decrypt and extract the DVD player from EROM storage. It can then be repacked into an ELF for easy loading into PCSX2." + +Being able to test it on a computer would speed things up greatly, so I decided to try loading the regular DVD firmware first. However, if you try to naively load a DVD into PCSX2, it will prompt that the "DVD Player is not set up". You can check the GitHub issue [here](https://github.com/PCSX2/pcsx2/issues/1981) discussing DVD player compatibility, but to sum it up - PCSX2 won't try to initialize or use the DVD player at all. + +However, it is possible to load the DVD player ELF file (PCSX2 can easy load ELF files from the emulator menu) so let's figure out how to extract it from the firmware. + +# Figuring out BIOS files + +The PS2 BIOS is actually made up of numerous BIOS files. _"EROM"_, _"BIN"_, _"ROM0"_, _"ROM1"_, _"ROM2"_, _"MEC"_, _"NVM"_ and so on. People seem to get these mixed up online, so I believe this is what they actually are. You can't believe how hard it was to find a single source for this information, a lot of it is spread between forum posts and GitHub. + +* **ROM0 [4MB]** is the main PS2 BIOS. +* **ROM1 [512KB]** contains languages and other DVD player gubbins. +* **ROM2 [512KB]** is extra language fonts, such as for Chinese characters. +* **EROM [3MB]** stands for "encrypted rom" and contains the encrypted playback software for DVDs[^1]. +* **NVM [512KB]** is BIOS settings, which can be generated by a real PS2 or PCSX2. + +However there are also _"BIN"_ files - which as far as I can tell - are actually **ROM0** files. There is another hiccup to look out for: why is **EROM** and **ROM1** separated, despite both dealing to the DVD player? This [GitHub PR](https://github.com/PCSX2/pcsx2/pull/6719) mentions that **ROM1** contains **EROM**, but was separated historically. So if you see a BIOS dump like this: + +* **ROM0 [4MB]** +* **ROM1 [4MB]** +* **ROM2 [512KB]** + +That it's also a valid dump. I wonder why BIOS dumping tools separated the **EROM** in the first place? + +# Extracting the EROM + +As the name implies, _"Encrypted ROM"_ means that EROM is encrypted. Luckily, [Michaël Jimenez](https://github.com/jimmikaelkael) developed a tool called [eromdir](https://github.com/jimmikaelkael/eromdir) that lets us extract the files contained in the EROM[^2]. + +Taking a look inside EROM, it looks like something like this: + +``` +$ ./eromdir -l dump.erom +erom size (hex): 0x001c0000 magic_token: ' J K L' +number of erom files: 2 +DVDELF - 575984 bytes +UDFIO - 28681 bytes +``` + +If you're wondering why the file listing is different between models, eromdir's README has this to say: + +> "Looking at late Playstation 2 models Encrypted ROM (7000x BIOS and above) will +list around 50 files, some files contains binary code for the DVDplayer, some +other files are gzip compressed resources. +Older models only had 2 files in their Encrypted ROM: DVDELF and UDFIO driver." + +On the note of encprytion, you might be wondering how this is even "encrypted" if we didn't need to provide any keys? I took a cursory glance, and it looks Sony used XOR encryption and eromdir reverses the weak obfuscation it provides. + +Now that we can extract DVDELF, it isn't a valid ELF file yet. It's an encrypted elf (KELF) and we need to feed it into [kelftool](https://github.com/xfwcfw/kelftool) to further decrypt it: + +``` +$ ./kelftool.elf decrypt DVDELF dvd.elf +``` + +# Running the DVD player in PCSX2 + +Now that we have the ELF, we can use the "Run ELF" function in PCSX2 and see if we can load up the DVD player: + +Nothing? That's weird... oh wait - why would the PS2 _natively_ read ELF files? I found a tool called [ps2-packer](https://github.com/ps2dev/ps2-packer) which repacks the ELF into something the Playstation 2 can actually read. Doing that and using a real DVD to test, we can find that: + +It still doesn't work. Hm. To make sure it isn't the fault of the CDVD plugin I'm using, I'll try booting a real PS2 game too: + +Huh, no that worked. So why is it refusing to load my ELF still? Maybe it was due to the old build I was using of ps2-packer, so I attempted to use the Docker version: + +Still no-go there. Time to start delving into forum posts! I came across a certain pastebin (FWZuKcs9) that has already rebuilt DVD ELF files. So I'll be using those instead, since mine were not playing nice with me. If someone knows how to properly repack DVD elfs, please [contact me](/contact) and I'll edit it into the article. + +What's nice about the "legally acquired ELF files" that I have, is that it covers all DVD firmware versions so now it will be extremely easy to test! Here's one DVD elf showing that it does in fact, play back real DVDs inside of PCSX2: + +One more problem, FreeDVDBoot doesn't seem to work inside of PCSX2. + +[^1]: Why this is encrypted in the first place is unclear, this might be because the DVD format is proprietary and the standard is paywalled. + +[^2]: You may have trouble building eromdir depending on how recent your autotools version is. If you have `bootstrap` yelling at you that it's too old, simply change line 37 and add your major version of autotools. diff --git a/content/blog/silica-release.md b/content/blog/silica-release.md index a6e0201..e9c61ed 100644 --- a/content/blog/silica-release.md +++ b/content/blog/silica-release.md @@ -4,6 +4,8 @@ date: 2021-09-15 draft: false aliases: - /notes/silica-release/ +tags: +- Apple --- "Silica Viewer" just landed on the macOS App Store today! You can check out more information diff --git a/content/blog/steam-offline-achivements.md b/content/blog/steam-offline-achivements.md index 727f5b2..30fdc5c 100644 --- a/content/blog/steam-offline-achivements.md +++ b/content/blog/steam-offline-achivements.md @@ -4,6 +4,7 @@ date: 2022-10-05 draft: true tags: - Steam +- Gaming --- If you've been paying attention these last couple of months, the Steam Deck is now in people's hands diff --git a/content/blog/trinity-rerelease.md b/content/blog/trinity-rerelease.md index c485928..3f54742 100644 --- a/content/blog/trinity-rerelease.md +++ b/content/blog/trinity-rerelease.md @@ -4,6 +4,8 @@ date: 2021-07-21 draft: false aliases: - /notes/trinity-rerelease/ +tags: +- Trinity --- So around 2018 I was busy writing my own Matrix client, as anyone does. It was called Trinity, and it featured a Discord-like interface. diff --git a/content/blog/why-you-need-a-gallery.md b/content/blog/why-you-need-a-gallery.md index 4471380..89bfdc4 100644 --- a/content/blog/why-you-need-a-gallery.md +++ b/content/blog/why-you-need-a-gallery.md @@ -6,6 +6,8 @@ comments: host: mastodon.art username: redstrate id: 109354491225553675 +tags: +- Website --- As an artist, I didn't really see the value of burdening myself with a website until I actually did it. diff --git a/content/blogseries.md b/content/blogseries.md new file mode 100644 index 0000000..d6e542d --- /dev/null +++ b/content/blogseries.md @@ -0,0 +1,6 @@ +--- +title: "Blog Series" +url: /blog/series/ +layout: listart +listtag: 'series' +--- diff --git a/content/blogtags.md b/content/blogtags.md new file mode 100644 index 0000000..6c4fb83 --- /dev/null +++ b/content/blogtags.md @@ -0,0 +1,6 @@ +--- +title: "Blog Tags" +url: /blog/tags/ +layout: listart +listtag: 'tags' +--- diff --git a/content/projtags.md b/content/projtags.md new file mode 100644 index 0000000..f9e1c83 --- /dev/null +++ b/content/projtags.md @@ -0,0 +1,6 @@ +--- +title: "Tags" +url: /software/tags/ +layout: listart +listtag: 'projtags' +--- diff --git a/content/software/_index.md b/content/software/_index.md index 45c722b..08f6c3a 100644 --- a/content/software/_index.md +++ b/content/software/_index.md @@ -10,3 +10,5 @@ During the day I like to program, and at night I... also like to program. If you I like working with Qt, C++ but also branching out into Rust and tiny bits of web development (like this website). My primary operating system is Linux, so making sure things build and run across different operating systems is an interesting challenge. I love working with graphics APIs, like Vulkan and OpenGL. + +{{< proj-featured >}} diff --git a/content/software/astra/index.md b/content/software/astra/index.md index 306a961..68d8b83 100644 --- a/content/software/astra/index.md +++ b/content/software/astra/index.md @@ -3,7 +3,7 @@ title: "Astra" date: 2021-12-01 draft: false layout: "project" -tags: +projtags: - FFXIV featured: yes aliases: diff --git a/content/software/chip8/index.md b/content/software/chip8/index.md index cdc0001..ad892d1 100644 --- a/content/software/chip8/index.md +++ b/content/software/chip8/index.md @@ -4,7 +4,7 @@ date: 2020-01-25 draft: false source: "https://git.sr.ht/~redstrate/chip8" license: MIT -tags: +projtags: - C++ - Emulation resources: diff --git a/content/software/drfrizzly/index.md b/content/software/drfrizzly/index.md index 59dd3d8..a390910 100644 --- a/content/software/drfrizzly/index.md +++ b/content/software/drfrizzly/index.md @@ -2,7 +2,7 @@ title: "Dr. Frizzly's Mega Minigame Collection" date: 2023-02-20 draft: false -tags: +projtags: - Game - Game Jam layout: "project" diff --git a/content/software/gallery/index.md b/content/software/gallery/index.md index f48a511..557a24e 100644 --- a/content/software/gallery/index.md +++ b/content/software/gallery/index.md @@ -4,7 +4,7 @@ date: 2020-01-25 draft: false source: "https://git.sr.ht/~redstrate/gallery" license: MIT -tags: +projtags: - Swift - UIKit - iOS diff --git a/content/software/graph/index.md b/content/software/graph/index.md index f4e91dc..f99af70 100644 --- a/content/software/graph/index.md +++ b/content/software/graph/index.md @@ -4,7 +4,7 @@ date: 2018-08-11 draft: false source: "https://git.sr.ht/~redstrate/graph" license: MIT -tags: +projtags: - 3D - C++ - Vulkan diff --git a/content/software/hydrus-sync-client.md b/content/software/hydrus-sync-client.md index 48e5945..97f965d 100644 --- a/content/software/hydrus-sync-client.md +++ b/content/software/hydrus-sync-client.md @@ -3,7 +3,7 @@ title: "hydrus-sync-client" date: 2022-10-12 draft: false layout: "project" -tags: +projtags: - Hydrus - Rust license: GPLv3 diff --git a/content/software/libxiv.md b/content/software/libxiv.md index 066b92f..04c33cf 100644 --- a/content/software/libxiv.md +++ b/content/software/libxiv.md @@ -3,7 +3,7 @@ title: "libxiv" date: 2022-01-05 draft: false layout: "project" -tags: +projtags: - FFXIV aliases: - /projects/libxiv diff --git a/content/software/novus/index.md b/content/software/novus/index.md index 69cd68a..638442b 100644 --- a/content/software/novus/index.md +++ b/content/software/novus/index.md @@ -3,7 +3,7 @@ title: "Novus" date: 2022-01-05 draft: false layout: "project" -tags: +projtags: - FFXIV aliases: - /projects/novus diff --git a/content/software/physis.md b/content/software/physis.md index d1471b7..0713616 100644 --- a/content/software/physis.md +++ b/content/software/physis.md @@ -3,7 +3,7 @@ title: "Physis" date: 2022-07-19 draft: false layout: "project" -tags: +projtags: - FFXIV - Rust aliases: diff --git a/content/software/prism/index.md b/content/software/prism/index.md index 92034bc..c9f26ad 100644 --- a/content/software/prism/index.md +++ b/content/software/prism/index.md @@ -4,7 +4,7 @@ date: 2020-08-11 draft: false source: "https://git.sr.ht/~redstrate/prism" license: MIT -tags: +projtags: - Prism - 3D - C++ diff --git a/content/software/protean.md b/content/software/protean.md index b2332e7..9603011 100644 --- a/content/software/protean.md +++ b/content/software/protean.md @@ -3,7 +3,7 @@ title: "Protean" date: 2021-08-25 source: "https://git.sr.ht/~redstrate/protean" license: MIT -tags: +projtags: - Go - Mastodon - Twitter diff --git a/content/software/raytracer/index.md b/content/software/raytracer/index.md index 30c513d..3a8a044 100644 --- a/content/software/raytracer/index.md +++ b/content/software/raytracer/index.md @@ -4,7 +4,7 @@ date: 2020-02-17 draft: false source: "https://git.sr.ht/~redstrate/raytracer" license: MIT -tags: +projtags: - C++ - 3D layout: "project" diff --git a/content/software/realm-of-chaos/index.md b/content/software/realm-of-chaos/index.md index d1e6cac..88cb4a1 100644 --- a/content/software/realm-of-chaos/index.md +++ b/content/software/realm-of-chaos/index.md @@ -5,7 +5,7 @@ draft: false source: "https://git.sr.ht/~redstrate/realm-of-chaos" license: GPLv3 license-url: "https://git.sr.ht/~redstrate/realm-of-chaos/tree/master/item/LICENSE" -tags: +proj-tags: - C++ - Game layout: "project" diff --git a/content/software/sen.md b/content/software/sen.md index edd70af..cd46794 100644 --- a/content/software/sen.md +++ b/content/software/sen.md @@ -3,7 +3,7 @@ title: "Sen" date: 2022-06-01 draft: false layout: "project" -tags: +projtags: - Kernel - C license: GPLv3 diff --git a/content/software/silica-viewer/index.md b/content/software/silica-viewer/index.md index 049d9b2..94d2349 100644 --- a/content/software/silica-viewer/index.md +++ b/content/software/silica-viewer/index.md @@ -2,7 +2,7 @@ title: "Silica Viewer" date: 2021-09-10 draft: false -tags: +projtags: - Swift - Procreate layout: "project" diff --git a/content/software/sm64-vulkan/index.md b/content/software/sm64-vulkan/index.md index 131c5ad..a610591 100644 --- a/content/software/sm64-vulkan/index.md +++ b/content/software/sm64-vulkan/index.md @@ -3,7 +3,7 @@ title: "SM64-Vulkan" date: 2022-10-03 draft: false layout: "project" -tags: +projtags: - SM64 - N64 - C diff --git a/content/software/trinity/index.md b/content/software/trinity/index.md index 1f104a5..380f582 100644 --- a/content/software/trinity/index.md +++ b/content/software/trinity/index.md @@ -4,7 +4,7 @@ date: 2018-03-18 draft: false source: "https://git.sr.ht/~redstrate/trinity" license: GPLv3 -tags: +projtags: - C++ - Qt layout: "project" diff --git a/content/software/watersymbol/index.md b/content/software/watersymbol/index.md index b291b8c..dd09144 100644 --- a/content/software/watersymbol/index.md +++ b/content/software/watersymbol/index.md @@ -5,7 +5,7 @@ draft: false source: "https://git.sr.ht/~redstrate/watersymbol" license: GPLv3 license-url: https://git.sr.ht/~redstrate/watersymbol/tree/main/item/LICENSE -tags: +projtags: - Java - Game layout: "project" diff --git a/content/software/xt/index.md b/content/software/xt/index.md index f9c0dad..29d0ea6 100644 --- a/content/software/xt/index.md +++ b/content/software/xt/index.md @@ -2,7 +2,7 @@ title: "XT" date: 2016-01-25 draft: false -tags: +projtags: - OpenGL - C++ - 3D diff --git a/themes/red/layouts/_default/listart.html b/themes/red/layouts/_default/listart.html index 305f4aa..a67cf96 100644 --- a/themes/red/layouts/_default/listart.html +++ b/themes/red/layouts/_default/listart.html @@ -5,7 +5,7 @@ {{ end }} diff --git a/themes/red/layouts/shortcodes/blog-featured.html b/themes/red/layouts/shortcodes/blog-featured.html new file mode 100644 index 0000000..d3015ed --- /dev/null +++ b/themes/red/layouts/shortcodes/blog-featured.html @@ -0,0 +1,4 @@ + diff --git a/themes/red/layouts/shortcodes/proj-featured.html b/themes/red/layouts/shortcodes/proj-featured.html new file mode 100644 index 0000000..7cf2457 --- /dev/null +++ b/themes/red/layouts/shortcodes/proj-featured.html @@ -0,0 +1,3 @@ +
+Tags +
diff --git a/themes/red/layouts/shortcodes/tube.html b/themes/red/layouts/shortcodes/tube.html new file mode 100644 index 0000000..c86232e --- /dev/null +++ b/themes/red/layouts/shortcodes/tube.html @@ -0,0 +1 @@ +