Sign in

Stefan Reinalter

@molecularmusing.bsky.social
525 followers 205 following 438 posts

Founder of Molecular Matters • C++ & low-level programming • Created Live++ (@liveplusplus.bsky.social) liveplusplus.tech

PostsRepliesMedia
Reposted by Stefan Reinalter
Edd Coates | Game UI Database @eddcoates.bsky.social · 23/09/2026
Since a dev shared his game concept last month, Steam has been flooded with vibe-coded slop clones. This is what "democratising creativity" actually looks like. Even with AI, your ideas are worthless as long as they can be plagiarised at scale. Gen AI was designed for plagiarism, NOT creativity.
14609208
Stefan Reinalter @molecularmusing.bsky.social · 20/09/2026
Twenty-something me had his first "WTF?" moment seeing this.
111
Stefan Reinalter @molecularmusing.bsky.social · 20/09/2026
Fighting the tools already counts against time-to-triangle ;)
011
Stefan Reinalter @molecularmusing.bsky.social · 19/09/2026
Ah yes, the japanese comments. I think this was the only time I saw people initialize their floats with 0x3F800000. Kind of like saying "if you don't understand this, then you're not worthy" :)
310
Stefan Reinalter @molecularmusing.bsky.social · 19/09/2026
Statistical outlier :)
000
Stefan Reinalter @molecularmusing.bsky.social · 19/09/2026
Triangle in a week? The PS2's time-to-triangle was very famously something like 3 months :D
220
Reposted by Stefan Reinalter
Alex Kanaris-Sotiriou @kanaratron.bsky.social · 15/02/2025
We're stoked to introduce the 'No Gen AI' seal for indie games! Indie devs can use it on their game's store page to assure potential players that their game was made without the use of Generative AI. You can grab it from the Polygon Treehouse website:- www.polygon-treehouse.com/no-gen-ai-seal
A graphical asset in the shape of a cog. It contains the following text 'This developer assures that NO GEN AI' was used in this indie game
172136495369
Stefan Reinalter @molecularmusing.bsky.social · 18/09/2026
Absolutely not a good look, OpenAI. Imagine you're a trillion dollar valued company and can't afford to pay for NYTimes. Instead, it's "ah nice" when you're getting behind their paywall. Also great to read about the "fair use" argument.
020
Stefan Reinalter @molecularmusing.bsky.social · 16/09/2026
And yes, of course I rant because this makes my job with Live++ harder. std::initializer_list gets special treatment in Clang, causing... issues.
020
Stefan Reinalter @molecularmusing.bsky.social · 16/09/2026
Rant time: the fact that std::initializer_list in C++ is a partial language construct with special syntax, a compiler-generated array with special lifetime, yet needs a header and an std::initializer_list to provide a type is BONKERS. Looks like any other std type, yet it's not.
2170
Reposted by Stefan Reinalter
Jess Miers 🦝 @jmiers230.bsky.social · 13/09/2026
I did a somewhat deep dive into the recent OpenAI and Anthropic "hacks" for an upcoming interview. IMO, the AI companies are better off running with the "rogue AI" story because the real story is actually pretty embarrassing. Like making your Wi-Fi password "wifi" embarrassing. 🧵
341835794
Reposted by Stefan Reinalter
Terence Tao @teorth.bsky.social · 11/09/2026
A group of 25 Fields Medalists, including myself, have made a joint declaration on Math and AI: mathandai.org . We welcome additional signatories. See also this article in the Economist announcing the declaration: www.economist.com/science-and-...
mathandai.org
Declaration — Math and AI
Read the declaration and add your name.
422055930
Stefan Reinalter @molecularmusing.bsky.social · 10/09/2026
No smart pointer. These interfaces are all "grab once, release at the end".
010
Stefan Reinalter @molecularmusing.bsky.social · 10/09/2026
It seems that Visual Assist X has never met our lord and saviour, COM:
A screenshot of Visual Assist X showing that reinterpret_cast should not be used, but when dealing with COM interfaces, it's the only cast that can actually be used in C++.
250
Stefan Reinalter @molecularmusing.bsky.social · 03/09/2026
I rewrote the PVS computation. It now works in quadrants, making use of the fact that all occluders are the same size and on a grid. Angles are now sorted using the wedge product, so there's no floating-point math or radix sort anywhere. This is much faster and bit exact now!
020
Stefan Reinalter @molecularmusing.bsky.social · 02/09/2026
As somebody who has used both approaches, I find DLL reloading too limiting these days. I do want some globals and function statics, but don't want to remember some extra steps for persisting their values across DLL boundaries.
130
Stefan Reinalter @molecularmusing.bsky.social · 29/08/2026
This is what I'm talking about: Shows the PVS of a cell on hover in the map editor.
061
Stefan Reinalter @molecularmusing.bsky.social · 29/08/2026
Revisited radix sort today for computing exact region-to-region visibility for a PVS. The PVS stores occluded cells, so an empty PVS simply does not cull anything. When computing the PVS in the background, you can "see" it working by draw calls going down and perf. going up :).
040
Stefan Reinalter @molecularmusing.bsky.social · 24/08/2026
GTFO! Update your gosh darn crap UI instead of adding another layer of crap to your platform! I want to tear this all to pieces.
040
Stefan Reinalter @molecularmusing.bsky.social · 22/08/2026
Imagine sitting on Ultima and WC. Great IPs.
140
Stefan Reinalter @molecularmusing.bsky.social · 21/08/2026
Coupa is still an incredibly shitty platform. It's unbelievably bad, yet several major companies use it and force you to use it. Sigh.
000
Stefan Reinalter @molecularmusing.bsky.social · 19/08/2026
Habit I guess. But you are right, could replace that with a simple Construct.
010
Stefan Reinalter @molecularmusing.bsky.social · 19/08/2026
If you wanted, you could get the item first, then move construct into *that* buffer, and be done. No need for extra baggage.
100
Stefan Reinalter @molecularmusing.bsky.social · 19/08/2026
They are. Almost all my types are trivial, standard layout, and trivially relocatable.
110
Stefan Reinalter @molecularmusing.bsky.social · 18/08/2026
There's a pattern that keeps coming up and I don't know if it has a name, but I wanted to share: Nothing fancy really, just a way of shoving arbitrary funcs (including capturing lambdas) into ordinary func pointers without needing any inheritance or allocation. E.g. ThreadPool:
1121
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
Because there's no reason to let them know of other changes? Just like when compiling your code? Modules know about the compilands they contain and will be notified about which compilands were recompiled, if any. The only exception to this are global hooks, which are *always* called.
100
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
I don't know how I survived my previous gamedev job 15 years ago without these tools. Feels like the stone age now.
151
Reposted by Stefan Reinalter
mmalex @mmalex.bsky.social · 16/08/2026
it does! thankyou for taking the time to walk me through it. it sounds like a sequence of steps id probably cock up, but it hilights how you sort of look at code differently once you can incrementally live modify it. i remember having imgui finally click as 'not just cute' when i saw omar add a ...
132
Reposted by Stefan Reinalter
mmalex @mmalex.bsky.social · 16/08/2026
introspection of complex state. imgui + hot reload just blew my mind iow :) so yeah... mindset changes once you have these hot reload tools, as you know. cheers!
122
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
In memory, you now have layout B. Serialization is still the old code, so data gets loaded from disk A into memory layout B. Now you add the serialize call. Hot-reload. Memory is still layout B, but when you save in the editor now, disk is also B. Does that make sense?
120
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
It's actually a two step process, sorry for leaving out these details in my initial post. You start with layout A on disk and layout A in memory. You start the game. You add the member to the struct. Hot-reload. Via hooks, you tear down the old data and recreate it.
140
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
sad_panda_face :(. But it's my own fault really.
150
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
It's not automatic, don't think that's technically possible without *any* information from the user. The custom hook can be as simple or complicated as you want, e.g. could be a single "nuke all and reload level", which is roughly what I am doing.
020
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
Goes to show that I don't do any marketing. It's been on the market for 8+ years now.
020
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
You mean because the game might be accessing the structs before they are being recreated? That's being taken care of by using a Synchronized Agent with Live++. It's easy to just halt your game loop until recompile and hot-reload are complete.
010
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
It largely depends on the game/application. If it's easy to just reload the current level, do that. Or deserialize to memory, serialize back afterwards. Or in my case: memcpy full world state to memory, kill all, create all, serialize back.
120
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
There are different types of hooks: compile, link, prepatch, postpatch. Do whatever you want in those. Eg recreate everything in the postpatch hook, load full game state - done, easy layout transition. Seriously undervalued feature if you ask me.
200
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
I'm still fleshing this out as I go, so I actually prefer doing it like this for now. Regarding hooks: a hook is a simple function, you can have as many of them as you want, in any number of files. They get registered with a single line of code - a macro that puts the func. into its own section.
100
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
Absolutely agree with you! As pointed out elsewhere, I would totally use the same serialization stuff you had on LBP and do simple version checks. But I don't need to currently, because it's only me working on this ATM. But still, I can't go back to earlier data I had.
130
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
His face has the shirt's texture on it. And nobody bothered to review this.
010
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
bsky.app/profile/mole...
000
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
It does via Live++ hooks. It's easier though in my case since all the data structures are trivial, so re-creating them in a hook is trivial as well.
110
Stefan Reinalter @molecularmusing.bsky.social · 16/08/2026
Via Live++ hooks. I add the new member, hot-reload. Hook re-creates the corresponding instances in layout B, code loads from A on disk into B in memory. Add the Serialize() call, hot-reload. Code will now write to layout B on disk, Save All in the editor, done. An on the fly layout transformation.
210
Stefan Reinalter @molecularmusing.bsky.social · 15/08/2026
All of that took me about 2 minutes. Changed the data layout, saved files in the new layout on disk, added new things to the editor, the backend, and to the shader code. I can do this all day without ever closing the game. It's profound, really.
190
Stefan Reinalter @molecularmusing.bsky.social · 15/08/2026
Finally, I go into the .hlsl file and add a new member to the constant buffer: Hit save, hot-reload the shader. Change the shader to use that member, done.
120
Stefan Reinalter @molecularmusing.bsky.social · 15/08/2026
Half a second later, the edit field appears live in the editor. I fill in the value that I had in the shader. Go over to the backend, add a new parameter to the function updating the material constants: Hit save, hot-reload. The compiler tells me all call sites which I fix.
110
Stefan Reinalter @molecularmusing.bsky.social · 15/08/2026
This is a change in a header file, but Live++ nicely supports that. It recompiles all affected files, I hit save in the editor, the data on disk is now in the new format. I then add a line to the property editor and save the .cpp, get's reloaded automatically:
110
Stefan Reinalter @molecularmusing.bsky.social · 15/08/2026
Note how I do not have any versioning code in my serialization. Why? Because I start the game, everything gets serialized into memory with layout A. I change to layout B via hot-reload, save all files in the editor, and it's now layout B on disk. Trivial, no supporting old stuff.
330
Stefan Reinalter @molecularmusing.bsky.social · 15/08/2026
I wanted to expose the height scale used by the Parallax Occlusion Mapping shader in the editor for materials today. First change: add a member to the material struct. Add the member, serialize it.
120
Stefan Reinalter @molecularmusing.bsky.social · 15/08/2026
For the record: My full rebuild is <2s. Loading into the game takes a bit more than one second in a debug build from hitting F5 in Visual Studio. If you've never experienced what hot-reload brings to the table, you don't know what you're missing out on.
130