Live data from Hacker News

Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

totenarctanz.itch.io

11–20 of 37 posts

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#11
post #7
post #2

Very cool project, can't play because on mac but looks like cool approach

It works perfectly cool through wine. Also i think adding mac builds wouldnt be hard given its simple dependencies.

Yeah it should be just a simple cargo build. But for the same reason it should be playable through any emulator/translation/VM layer as you mentioned.

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#12
post #4

I love custom game engines. Looks fantastic! Will you be sharing the source?

Thanks! For several reasons, most probably and regrettably no, for now at least. More than happy to talk about any specific part however (e.g. how scenes are handled, the code itself, or how particular features are implemented or optimized).

Could you talk more about the subset of rust you settled on?

You said you didn't explicitly use simd, but did you do anything to help the optimizer autovectorize like float chunking

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#13
post #4

Earlier quoted context omitted.

Thanks! For several reasons, most probably and regrettably no, for now at least. More than happy to talk about any specific part however (e.g. how scenes are handled, the code itself, or how particular features are implemented or optimized).

Could you talk more about the subset of rust you settled on? You said you didn't explicitly use simd, but did you do anything to help the optimizer autovectorize like float chunking

It's a very procedural style. I have not used: iterators, lifetimes, Arcs/Boxes/RefCells and whatnot, any kind of generics, data structures other than vecs/arrays, async, and many more. Also avoided functional style, builder patterns...

I only used traits to more easily implement the scenes; a Scene needs to implement a new(), a start() and an update(), so that I can put them in an array and call them like scenes[current_scene_idx].update() from the main loop.

Also, I used some short and simple closures to avoid repeating the same code in many places (like a scope-local write() closure for the menus that wraps drawtext() with some default parameters).

The vast majority of the time is spent in the triangle filling code, where probably some autovectorization is going on when mixing colors. I tried some SIMD there on x86 and didn't see visible improvements.

Apart from obvious and low-hanging fruit (keeping structs simple, keeping the cache happy, don't pass data around needlessly) I didn't do anything interesting. And TBH profiling it shows a lot of cache misses, but I didn't bother further.

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#14
post #10
post #6

Earlier quoted context omitted.

I believe you can build to mac targets on github though

Didn't know this, but I'd rather not use github to be honest. Isn't there also some kind of signing required to publish a Mac build?

you're right, I wasn't aware of it. Of course you could build it and leave it as is, so we would need to accept the binary, but still - a lot of work. Makes some good projects made by devoted programmers exclusive to other platforms, sadly.

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#15
post #13

Earlier quoted context omitted.

Could you talk more about the subset of rust you settled on? You said you didn't explicitly use simd, but did you do anything to help the optimizer autovectorize like float chunking

It's a very procedural style. I have not used: iterators, lifetimes, Arcs/Boxes/RefCells and whatnot, any kind of generics, data structures other than vecs/arrays, async, and many more. Also avoided functional style, builder patterns... I only used traits to more easily implement the scenes; a Scene needs to implement a new(), a start() and an update(), so that I can put them in an array and call them like scenes[cur…

Without lifetimes arcs boxes or refcells do you have a lot of clones? Or a lot of unsafe? Or is it mostly single threaded?

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#16
post #13

Earlier quoted context omitted.

It's a very procedural style. I have not used: iterators, lifetimes, Arcs/Boxes/RefCells and whatnot, any kind of generics, data structures other than vecs/arrays, async, and many more. Also avoided functional style, builder patterns... I only used traits to more easily implement the scenes; a Scene needs to implement a new(), a start() and an update(), so that I can put them in an array and call them like scenes[cur…

Without lifetimes arcs boxes or refcells do you have a lot of clones? Or a lot of unsafe? Or is it mostly single threaded?

It's all single threaded. Just structs being passed around. For example, the mesh drawing call is:

drawmeshindexed(m: &Mesh, mat: &Mat4x4, tex: &Image, uv_off: &TexCoord, li: &LightingInfo, cam: &Camera, buf: &mut Framebuffer)

so there is also no global state/objects. All state is passed down into the functions.

There were some cases that RefCells came in handy (like having an array of references of all models in the scene) and lifetimes were suggested by the compiler at some other similar functions, by I ended up not using that specific code. To be clear, I have nothing against those (on the contrary), it just happened that I didn't need them.

One small exception: I have a Vec of Boxes for the scenes, as SceneCommon is an interface and you can't just have an array of it, obviously.

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#17
post #16

Earlier quoted context omitted.

Without lifetimes arcs boxes or refcells do you have a lot of clones? Or a lot of unsafe? Or is it mostly single threaded?

It's all single threaded. Just structs being passed around. For example, the mesh drawing call is: drawmeshindexed(m: &Mesh, mat: &Mat4x4, tex: &Image, uv_off: &TexCoord, li: &LightingInfo, cam: &Camera, buf: &mut Framebuffer) so there is also no global state/objects. All state is passed down into the functions. There were some cases that RefCells came in handy (like having an array of references of all models in the…

Thanks! That seems like a nice subset for a lot of use cases. You say it isn't functional, which in rust it is hard to be pure, but if you consider it a spectrum, the style you describe is closer than most game code I've seen.

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#18
post #16

Earlier quoted context omitted.

It's all single threaded. Just structs being passed around. For example, the mesh drawing call is: drawmeshindexed(m: &Mesh, mat: &Mat4x4, tex: &Image, uv_off: &TexCoord, li: &LightingInfo, cam: &Camera, buf: &mut Framebuffer) so there is also no global state/objects. All state is passed down into the functions. There were some cases that RefCells came in handy (like having an array of references of all models in the…

Thanks! That seems like a nice subset for a lot of use cases. You say it isn't functional, which in rust it is hard to be pure, but if you consider it a spectrum, the style you describe is closer than most game code I've seen.

Right, it's a spectrum, you can't avoid some things (and rightly so).

Another soft rule: no member functions (except for the Scenes); structs are only data, all functions are free functions.

Also no operator overloading, so yes, lots of Vec3::add(&v1, &v2). I was hesitant at first but this makes for more transparent ops (* is dot or cross?) and does not hide the complexity.

The whole thing is around 6-7kloc and I think it would be possible to rewrite in C++ in a day or two.

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#19
post #9
post #8

Didnt you think of making it open-source on github?

The game-side code, not really (I am ashamed of reading it myself). The engine-side is a bit less shameful, but I'd rather not as I mentioned elsewhere, especially on github. I may change my mind though.

That's a shame, i like how you go about using Rust to have crystal clear structure while sidestepping the unreadable side that comes from using all of its nuances.

I'd kinda like a look. My Code is dependency free where possible (up to the graphics library for making the pixels go on screen) too - and everything else is a clean pipeline. Soooo i can only speak for myself, but if you have some parts that don't make you cringe much but proud - please share!

It's less about implementation of functionality, im mostly curious about your style! :)

Re: Show HN: A PSX/DOS style 3D game written in Rust with a custom software renderer

#20
post #19
post #9

Earlier quoted context omitted.

The game-side code, not really (I am ashamed of reading it myself). The engine-side is a bit less shameful, but I'd rather not as I mentioned elsewhere, especially on github. I may change my mind though.

That's a shame, i like how you go about using Rust to have crystal clear structure while sidestepping the unreadable side that comes from using all of its nuances. I'd kinda like a look. My Code is dependency free where possible (up to the graphics library for making the pixels go on screen) too - and everything else is a clean pipeline. Soooo i can only speak for myself, but if you have some parts that don't make yo…

I'll see if I can produce a reasonably readable stripped down version (the lib + an example scene) and I might be back soon ;)
Post reply on HN