Dominic Szablewski Profile Banner
Dominic Szablewski Profile
Dominic Szablewski

@phoboslab

7,669
Followers
185
Following
191
Media
2,259
Statuses

Joined March 2008
Don't wanna be here? Send us removal request.
@phoboslab
Dominic Szablewski
3 years
Q1K3, an homage to Quake in 13kb of JavaScript: Thanks to @NoFateNet for the music <3
61
606
2K
@phoboslab
Dominic Szablewski
3 years
Lossless Image Compression in O(n) Time — introducing QOI, the Quite OK Image Format. 300 lines of C, single header library:
Tweet media one
46
376
2K
@phoboslab
Dominic Szablewski
1 year
My wipEout rewrite only works with OpenGL, but I set up the code in a way to potentially support other rendering backends. To test whether this actually works, I implemented a very bare-bones wireframe software renderer. Almost playable!
34
155
2K
@phoboslab
Dominic Szablewski
3 months
I'm rewriting my 14 year old "Impact" JavaScript game engine... in C. No reason. Just a lot of fun.
50
61
1K
@phoboslab
Dominic Szablewski
1 year
Fiddling with the leaked WipEout source. It may not look like much, but getting this thing to compile and run on x86-64 was a royal pain. Rendering is in OpenGL, but all transforms still in software, hence the wobbliness.
26
134
1K
@phoboslab
Dominic Szablewski
1 year
Play the original wipEout in your browser: Also check out the in-depth "Making-of" in my blog:
39
355
963
@phoboslab
Dominic Szablewski
1 year
Now running with buttery smooth 3800 fps. Still lot's of room for improvement, but I think I'll leave it at that.
41
65
894
@phoboslab
Dominic Szablewski
3 years
The specification for the QOI format for lossless image compression has been finalized! It fits on a single-page PDF. Thanks to everyone who helped to make this happen!
Tweet media one
12
130
827
@phoboslab
Dominic Szablewski
1 year
At last, here's the final specification of the Quite OK Audio Format, along with some benchmark results:
Tweet media one
13
92
595
@phoboslab
Dominic Szablewski
1 year
For a fixed size array of objects, you can maintain two arrays of pointers to keep track of active/free ones. Seems a bit easier (and more efficient?) than a linked list and is always O(1) unlike a scan through the objects array. Does this pattern have a name?
Tweet media one
51
26
420
@phoboslab
Dominic Szablewski
2 years
Time Domain Audio Compression at 3.2 bits per Sample -- introducing QOA, the Quite OK Audio Format. 400 lines of C, single header library:
Tweet media one
18
74
384
@phoboslab
Dominic Szablewski
3 months
My C game engine expects you to define your entity struct _before_ you include parts of the lib. The struct has some required fields (with types from the lib), so you have to do a little dance to include everything. Which would you prefer?
Tweet media one
86
8
303
@phoboslab
Dominic Szablewski
2 months
At last, I published high_impact – a simple 2D game engine completely written in C. Please read “Porting my JavaScript Game Engine to C for No Reason”
Tweet media one
11
58
306
@phoboslab
Dominic Szablewski
1 year
As proposed by some people on my last tweet, just copying the actual particle storage in-place is both simpler and faster than maintaining a separate index or ptr array. This stays true even when the object size is increased to 1kb. memcpy() is fast!
Tweet media one
10
14
225
@phoboslab
Dominic Szablewski
3 months
Curiously, this also increases the difficulty quite a bit... Thanks to @JaceCear for reminding me of this thread!
@TylerGlaiel
Tyler Glaiel
5 months
if you're currently working on a video game, take a short break, pick a number in your code or data files, multiply it by 1000, and post the results
928
4K
62K
9
14
210
@phoboslab
Dominic Szablewski
3 years
Please read The Making of Q1K3 - A “Tour de Force” of cramming the essence of Quake into 13kb
Tweet media one
6
63
206
@phoboslab
Dominic Szablewski
2 years
Just finished the first draft of the QOA file format specification: If you're looking for a challenge: try to implement a decoder using only this spec... and then let me know what I need to fix/clarify :]
Tweet media one
9
20
187
@phoboslab
Dominic Szablewski
10 years
WipEout Model Viewer: http://t.co/wXsZibrw3r – The game still looks great, even 20 years later! http://t.co/N5THvpZLd2
Tweet media one
15
181
170
@phoboslab
Dominic Szablewski
5 years
Single file C library for decoding MPEG1: ~3k LOC. This took me way longer than I expected. I don't write much C, so could use some feedback. /cc @ID_AA_Carmack @Jonathan_Blow @nothings
8
35
160
@phoboslab
Dominic Szablewski
1 year
For a proper nostalgia trip, you can now switch to a lower resolution and enable a CRT post processing effect in the options. Try it here: Thanks again to @Mattias_G for the lovely CRT shader!
7
30
155
@phoboslab
Dominic Szablewski
3 months
Computer graphics research papers be like: We present a novel way to increase rendering quality 10x. Kindly judge from these comparison screenshots:
Tweet media one
4
11
146
@phoboslab
Dominic Szablewski
5 months
I was finally able to track down the physics bug in - you can now take jumps in Rapier class without crashing into the mountains!
3
7
137
@phoboslab
Dominic Szablewski
6 years
Ported the JSMpeg MPEG1 and MP2 decoders to WebAssembly. Not that it's a good idea, but you can now decode 4k MPEG1 videos in your Browser in real time. Try it:
6
36
133
@phoboslab
Dominic Szablewski
3 months
Slopes are a surprisingly difficult problem! Took some time to rework the old source. It's not a "physics engine", but it should be good enough for some action games. Also, totally natural that shooting a crate spawns 8 more :]
7
3
123
@phoboslab
Dominic Szablewski
3 years
I'm paying my respects to the greatest game on its 25th anniversary for #js13k - not really matching the theme, but I wanted to do this for a long time!
Tweet media one
Tweet media two
Tweet media three
Tweet media four
5
13
111
@phoboslab
Dominic Szablewski
2 months
So here's a super simple version of this archive format I was thinking about. The header is at the end, so the archive can be appended to any other file (e.g. an executable).
Tweet media one
13
3
107
@phoboslab
Dominic Szablewski
3 years
I finally started to work on my #js13k entry. This time I'm generating all the textures instead of relying on a PNG file. Worked out way better than I expected - super fun, too!
Tweet media one
7
6
106
@phoboslab
Dominic Szablewski
1 year
Added some touch buttons for mobile. It's buttery smooth, but no fun; needs better button positioning. Also, the hoops you have to jump through to make a web game work on iOS are just ridiculous :/ Install to home screen for the "best" experience.
Tweet media one
11
11
104
@phoboslab
Dominic Szablewski
3 months
It's amazing how "ergonomic" C can be with the right approach. Years ago I implemented all kinds of containers and piled on abstractions. I was working against the language, now I'm embracing it. Feels good :]
5
4
97
@phoboslab
Dominic Szablewski
10 years
For the technically inclined, don't miss the blog post and source code: Reverse Engineering WipEout http://t.co/zjEEQI0Cp6
9
82
97
@phoboslab
Dominic Szablewski
1 year
Slowly getting somewhere. No sound and still tons of bugs to fix. The game/HUD is now resolution independent, but the menu is still all over the place.
4
6
96
@phoboslab
Dominic Szablewski
3 years
Wow, some people on Reddit are mad, because QOI is not REAL image format! I don't know man, I kinda loaded some pixels from a QOI file today.
7
1
92
@phoboslab
Dominic Szablewski
3 years
Very cool to see implementations of QOI popping up for Zig, Go and Rust (4x!): Zig: Go: Rust: Rust: Rust: Rust:
2
10
81
@phoboslab
Dominic Szablewski
3 years
Just found out that QOI was posted on Slashdot. Everybody there hates it. I feel like I unlocked an achivement!
5
2
74
@phoboslab
Dominic Szablewski
3 months
Gearing up for the release of high_impact tomorrow! Just need to finish the blog post. In the meantime, here's Biolab Disaster with @Mattias_G 's trusty CRT shader. The distortion might be a tad bit too much for a 2D sidescroller; I need to turn that down a notch...
4
6
74
@phoboslab
Dominic Szablewski
3 months
Resurrected Ye Old Editor. Now loads from a simple double click of the .html; uses the FileSystem API to load/save files. Kind of a cool way to deliver cross-platform Apps.
6
4
73
@phoboslab
Dominic Szablewski
1 year
Taking @Mattias_G 's excellent CRT shader for a spin. Great stuff! Imitating the PSX texture swim is a bit more difficult, as (unlike the original) my rewrite doesn't subdivide the track faces. This results in just horribly warped textures right under your ship.
Tweet media one
2
6
73
@phoboslab
Dominic Szablewski
1 year
Github user chzigotzky got wipEout running on PowerPC! Just some *slight* issues with loading paletted images on big endian machines :]
Tweet media one
2
4
66
@phoboslab
Dominic Szablewski
1 year
Interestingly the game doesn't use a depth buffer. Instead, polygons are sorted into one of 8192 bins, based on their z-coord. Rendering is simply back to front. It's a re-implementation of the PSX LIBGPU's Ordering Table.
4
0
66
@phoboslab
Dominic Szablewski
3 months
Ported a second game today. This is as simple as it gets at just 200 lines of code. Now, I only need to write some more docs!
5
2
66
@phoboslab
Dominic Szablewski
2 years
Adding an extra if statement to QOA's clamp function speeds up decoding by ~8%. Quite an unexpected gain!
Tweet media one
6
2
65
@phoboslab
Dominic Szablewski
2 years
I love this project so much! The pure positive energy SerenityOS brings to the tech world is immeasurable. Great work everyone and a happy new year!
@awesomekling
Andreas Kling
2 years
Update: Tim Flynn tracked down the red line and got it fixed! We can now render a perfect Acid2 Guy in Ladybird, with hours remaining of 2022 😅🐞🌍
Tweet media one
5
10
304
0
6
63
@phoboslab
Dominic Szablewski
5 months
When I wrote pl_json I felt particularly clever and tried to implement the tokenizer as a state machine. Turns out it runs much slower than the "naive" version. Its only redeeming quality is that it fits on a single screen.
Tweet media one
3
4
59
@phoboslab
Dominic Szablewski
1 year
That was a lot of fun! First time I ever attempted a software 3D renderer. Maybe this could become a proper rendering backend. Code is here:
3
4
60
@phoboslab
Dominic Szablewski
5 years
The what, why and how of an MPEG1 decoder in a single file C library: Including some unsolved design problems...
4
13
58
@phoboslab
Dominic Szablewski
2 months
A Simple Archive Format for Self-Contained Executables:
3
5
60
@phoboslab
Dominic Szablewski
10 years
Proud to finally release Xibalba - A WebGL First Person Shooter made with @ImpactJS http://t.co/Giyg9pSuc2
11
41
58
@phoboslab
Dominic Szablewski
6 years
The Making of Underrun for @js13kGames - A WebGL twin stick shooter in 13kb of JavaScript:
Tweet media one
4
21
55
@phoboslab
Dominic Szablewski
2 years
Going full circle by finally implementing my own sqrt() for no good reason. Here you go, Facebook interview person!
Tweet media one
@phoboslab
Dominic Szablewski
14 years
Just failed hard at a phone interview for Facebook. "Please implement sqrt() in JavaScript" WTF?
1
4
9
2
1
55
@phoboslab
Dominic Szablewski
6 years
900 bytes left. Calling it a day. Play my @js13kGames entry UNDERRUN: - source:
Tweet media one
4
8
52
@phoboslab
Dominic Szablewski
1 year
I re-ran all the benchmarks from yesterday to write to /dev/null, so it doesn't measure disk writing speed. QOA was the fastest format to decode (probably because ffmpeg has quite a bit of overhead – but still!).
Tweet media one
2
3
51
@phoboslab
Dominic Szablewski
12 years
Cross Code is one of the most beautiful @ImpactJS games yet. I love the pixel art! http://t.co/vNOCTwzZ
4
32
51
@phoboslab
Dominic Szablewski
5 months
After seeing this, I of course had to try it with wipEout by just running the game at 480hz. It looks soooo buttery smooth on my 60hz potato. Video below.
Tweet media one
Tweet media two
Tweet media three
@tsoding
Тsфdiиg
5 months
I know that posting this animation caused lots of frustration for you because of annoying randos, but I personally really liked this idea of subframes and had a lot of fun playing with it. Thank you!
13
26
854
3
1
51
@phoboslab
Dominic Szablewski
1 year
In the process of rewriting all fixed point maths to float in wipEout. This function had me stumped for a while. It's trying to project a point to a line (to center the camera on the track), but it only sorta, kinda works because there is an int32 overflow in the cos_alpha calc!
Tweet media one
1
2
47
@phoboslab
Dominic Szablewski
5 months
I know there are better ways to do motion blur, but having the whole game loop at 480hz is amazing for input latency, too. And hey, the game easily runs at ~3000hz anyway. Would look even nicer with proper analog input, but that still needs some work.
2
2
48
@phoboslab
Dominic Szablewski
2 years
@YoshiMilkman @JasperRLZ Yep, my game XType Plus was built with the NWF. Nintendo actually used my JS game engine (ImpactJS) to build a Pachinko Game. Overall it is my understanding that the NWF wasn't as successful as they had hoped.
4
1
43
@phoboslab
Dominic Szablewski
12 years
Finally, WebGL on the iPhone with Ejecta:
5
54
46
@phoboslab
Dominic Szablewski
3 years
Most common complaint is, that it doesn’t solve every possible problem under the sun. Well, thats the point!
0
0
45
@phoboslab
Dominic Szablewski
4 months
Seeing a 5 hour video of @tsoding implementing floor/ceiling rendering in a raycaster () is quite cathartic. I often find myself stuck at problems way more trivial than this, but I trained myself to just keep poking. Persistence is underrated!
@tsoding
Тsфdiиg
4 months
After 3 days of fighting me and Chat have finally figure out how to ray cast floor and ceiling oldschool style. This is rendered using HTML 2D Canvas and programmed in TypeScript. Thinking to rewrite it in C compiled to WebAssembly to piss off the React devs.
27
27
1K
1
5
47
@phoboslab
Dominic Szablewski
6 years
I'm not a sponsor for @js13kGames this year (since ImpactJS is now free) so I figured I might as well participate! Going for Quake1 vibe with some gritty low res graphics.
Tweet media one
2
4
47
@phoboslab
Dominic Szablewski
9 years
Ejecta WebGL now supports antialias! ThreeJS happily runs with 60fps, 4xMSAA on the iPhone5s
Tweet media one
0
16
43
@phoboslab
Dominic Szablewski
5 years
@ID_AA_Carmack I enjoyed your interview with Rogan. Would you consider doing one with @lexfridman ? It would be great to have an interviewer who is more familiar with the subject matter!
3
0
44
@phoboslab
Dominic Szablewski
12 years
Maybe the most original game idea since Portal? http://t.co/HAPyADzv - made by @KrisJet
4
37
45
@phoboslab
Dominic Szablewski
12 years
Ejecta, a fast Canvas implementation for iOS, is now Open Source. Watch the intro video here http://t.co/OVwbn7PX
7
46
45
@phoboslab
Dominic Szablewski
8 years
Neat!
Tweet media one
3
29
44
@phoboslab
Dominic Szablewski
3 years
After lots of useful discussion (and some bikeshedding), we have arrived at the final specification for QOI. If you already worked on an implementation, I'd like to ask you to update it <3
3
4
43
@phoboslab
Dominic Szablewski
6 years
Wohooo, 1st place! Thanks again to @NoFateNet for the awesome soundtrack! This year's #js13k had some crazy ambitious games and I can't wait till next year. Congrats everyone!
@js13kGames
js13kGames
6 years
Tweet media one
4
35
56
4
6
40
@phoboslab
Dominic Szablewski
4 months
I never understood this "assisted reading" type of video. But hey, I don't judge! Maybe watch the actual Q1K3 Making Of for some real behind the scenes info: :]
@Gamedevjs
Gamedev.js
4 months
A @js13kGames entry from 2021 made by @phoboslab , Q1K3, was rediscovered by @ThePrimeagen – in an hour long video he went through the Making Of blog post while adding his own comments. #js13k #gamedev #gamedevjs #Quake #Q1K3 #YouTube
Tweet media one
0
3
21
4
7
42
@phoboslab
Dominic Szablewski
1 year
Just received a warning email from my hoster (Hetzner) that my $15 VPS almost used up the included 20TB traffic this month. Every further TB comes in at $1. Pretty reasonable, considering that I would have paid $1800 for the same traffic with AWS EC2 :]
1
0
40
@phoboslab
Dominic Szablewski
1 year
@Jonathan_Blow This guy is an excellent bullshit artist. 30 posts, no conclusion. "The answer is in my other thread, bro!". Another 20 posts. "Actual cause is hard to explain, watch my 80min YT video". The video: "Guess what! You lack these vitamins an supplements. Luckily, I sell those!"
1
0
42
@phoboslab
Dominic Szablewski
3 years
#js13k I'm using TrenchBroom to build my levels. Amazing tool; a real pleasure to work with!
Tweet media one
0
1
41
@phoboslab
Dominic Szablewski
1 year
You don't often see a JS game getting re-implemented in C, let alone one made for the size restricted #js13k . Great work!
@ComputerMouth
benjamón
1 year
Today I've finished a 2-month project of porting @phoboslab 's Q1K3 to C and GLES. It's available for download here:
3
2
32
2
6
42
@phoboslab
Dominic Szablewski
9 years
Ejecta now supports instanced_arrays. ThreeJS example with 65k instances runs with 60fps:
Tweet media one
3
4
41
@phoboslab
Dominic Szablewski
1 year
There's a MoveDonkey() function in the wipEout source and I carried it through all the refactoring while wondering what the hell this donkey was. Turns out it's this thing - apparently also know as a "Nodding Donkey". #NamingThingsIsHard
Tweet media one
2
1
38
@phoboslab
Dominic Szablewski
4 years
Seeing @Jonathan_Blow porting my pl_mpeg code to his Jai language is quite humbling. Sorry for the mess, dude!
1
0
39
@phoboslab
Dominic Szablewski
3 months
Dug out and updated an old tool to generate font atlases. Web tech is a pretty good fit for these things!
Tweet media one
2
0
40
@phoboslab
Dominic Szablewski
2 years
Received lots of great feedback for QOA including some cool ideas to improve the quality. Should have launched this sooner; the hive mind is way more knowledgeable than I could ever be!
2
1
38
@phoboslab
Dominic Szablewski
9 years
Updated Quake to run on the Oculus DK2 in Direct Mode with positional tracking: http://t.co/GcnJST3y0x http://t.co/NupspK6zTp
Tweet media one
3
29
37
@phoboslab
Dominic Szablewski
8 years
Proud to release Ejecta 2.1: JavaScript+Canvas on iOS & tvOS – now faster than ever
Tweet media one
0
10
36
@phoboslab
Dominic Szablewski
2 months
HN is asking why I consider Impact (the JavaScript engine) to be “at the end of its life”. My answer made me remember all the shit we had to deal with back in 2010. I think I incurred a mild case of PTSD from that:
5
1
37
@phoboslab
Dominic Szablewski
1 year
A video decoder for the Sega Dreamcast, based on pl_mpeg. Amazing work!
@falco_girgis
Falco Girgis
1 year
It's official! 320x240 1148kbps MPEG1 playback at 30fps on the Sega #Dreamcast , which is better than retail games could do! All thanks to clever usage of a single SH4 SIMD instruction plus cache prefetching. Coming soon to KOS! #gamedev #retrocomputing
19
51
302
0
5
35
@phoboslab
Dominic Szablewski
5 years
VOIDCALL is finally finished! Play here: - The game clocks in just 8 bytes shy of 13kb. I had to fight for every last byte! #js13k
Tweet media one
4
7
34
@phoboslab
Dominic Szablewski
1 year
So, we all read about ZIP compression as a language model, but did you know that QOI image compression works nicely to detect seizures? Fascinating thread!
@CamelCaseCam1
Cameron Kroll 🛠️🧬
1 year
Today I finished my core seizure-detection algorithm. My idea is so stupid it might actually work! In one sentence: find the entropy of a seizure by turning it into an image. Read on to find out more! cc: @_buildspace @FarzaTV @_nightsweekends
2
0
16
1
6
31
@phoboslab
Dominic Szablewski
2 years
Just published “Magic Webcam” for iOS – a complete rewrite of my older “Instant Webcam” App. Better stability & performance, higher resolution video and robust audio streaming. And it's free! (unlocking all features is an In-App Purchase). Get it here:
Tweet media one
2
4
35
@phoboslab
Dominic Szablewski
8 years
- Decode It Like It's 1999. My JavaScript MPEG1 decoder.
1
17
33
@phoboslab
Dominic Szablewski
10 years
If you want to know how the WebGL shooter Xibalba was made, don't miss the Making Of screencast: http://t.co/dZ4M0gbxiB
0
16
34
@phoboslab
Dominic Szablewski
5 months
In a recent video by James Lambert he highlighted one feature of LibDragon (open source alternative to Nintendo's LibUltra): the ability to play FMVs on the N64. I just found out it's based on pl_mpeg!
1
3
33
@phoboslab
Dominic Szablewski
9 years
Play GTA V in your browser - sort of http://t.co/cJyJQMaEd3 - a giant hack of C, JavaScript and lot's of glue.
10
32
31
@phoboslab
Dominic Szablewski
4 years
Building a UI in SerenityOS is quite liberating! No need to care about any styling. The VideoPlayer is coming along nicely, but I still need to figure out audio playback.
Tweet media one
1
4
33
@phoboslab
Dominic Szablewski
6 years
Added some much needed screen shake and explosion effects when killing enemies; sadly, the compo version will have to do without these. Play here:
5
5
32