This one has taken a while, sorry about that. I've decided to essentially throw everything originally written here, redo it, and get it out, so I can get back into the flow of things as I'd been just going back and forth with it.
I'll start off with some life-related things first, just to get those out of the way.
Accident
Recently my partner was in a car crash. He was incredibly lucky and got out of it relatively okay besides a few minor cuts and bruises, but my car was pretty much destroyed in the accident as you can see in the photo below.
The car doesn't matter compared to his safety as it can be replaced. That said, the timing wasn't so great. We had only recently splashed out a lot of money on repairs for the car, and on top of that I had spent quite a considerable sum of money on some other things during the last month.
I have just bought a replacement car. It's not in a great state itself, but it's what I could afford. It's difficult to function without a car given where we live. But I'm going to have to take things a little carefully for a while to save up some money again.
Building Worlds 🌎
On a happier note, I've now essentially got a working editor for the engine now. This has been a long time in the works, hampered by constant changes to my own requirements and my general idiocy.
The biggest thing that contributed to getting this done was finally settling my mind on how the world should be formally structured. Something that really had to be beaten into my brain (I'll talk about this further down).
Your levels are essentially rooms in their own respect. Under each room, you have a scene-graph which currently consists of empty, brush, entity, model, light and camera nodes. Just like any other scene-graph, these can be childed to one another and internally form a tree.
An entity here operates as a controller. And from its perspective, anything under it in the tree is a component that the entity can query for.
Each room can reference other rooms which collectively form your world. Per each brush, you can mark any face as a portal and then link that portal to either another portal in the same room—or a portal in a completely different room, and form a relationship between the two.
A camera is then attached to a given room. This is the point at which all the visibility calculations begin from. When the camera intersects a portal, it (or rather whatever it's attached to) is associated with the new room instead.
Finding the parent room of anything is also trivial. You can walk up the tree until you find a room node as these are always guaranteed to be at the top (anything without such a parent is considered invalid).
There are some interesting opportunities with this, such as level-streaming, though that's not on the current roadmap but something which would be good to look into down the road.
Serialisation and deserialisation are done, so you can save your rooms and load them up. There's now a material browser in the editor; I ended up throwing out a lot of work I'd done for that previously (turns out simpler is usually better). Rendering has been overhauled to respect the scene-graph setup, and I'm in the process of overhauling the visibility system.
There's a lot more I could say here in regard to the progress made since the last update, but it'd take me all night, so I'll just finish up with some screenshots.
There have been some improvements to how the renderer handles specific passes too (it's a traditional forward-renderer, so things such as lights are currently handled in multiple passes). I've got a plan to allow shaders to more intelligently handle these without resorting to so much hard-coded logic next, but that's for another day.
MSAA is finally in! ✨
Yes, it's true. For the longest time, the engine has not supported MSAA. MSAA is fairly trivial to implement when using a single framebuffer, or the default, but when you start introducing your own framebuffers into the mix alongside your own abstraction layer, things can get a little messy. It wasn't really a priority either.
For providing antialiasing before, I was basically doubling up the resolution of the framebuffer and then downscaling that. An incredibly lazy form of SSAA essentially. It looked pretty nice, but it's not very efficient.
There was FXAA support too, but that's degraded away as I've made changes to the postprocessing overtime.
Anyway, I wanted to do MSAA the right way, and I've now added support for MSAA which can be toggled on and off at runtime without any friction (such as having to manually restart the software).
Models and Bones 💀
I've done a little bit more work on model support recently. Nothing fantastically groundbreaking, but serialisation is now in for bones, and I've got a fairly good idea how I'm going to handle animations (at least for serialisation and deserialisation).
Before the scene-graph was formally handled by the renderer, models were essentially just hacked into the renderer path, but fortunately that's no longer the case.
It's been surprisingly hard to find a model to use for testing. Originally, I'd been using models from the Halo digsite project just for giggles.
That said, the licence the content was released under doesn't really allow for this. I've started to look elsewhere, as I'm not sure how long whatever models I use for testing will stick around for and don't want to get in trouble.
I've made some minor progress on a character model for the game I'm working on, but it's still not up to the standard that I'd like. And I'm certainly not going to have animations done for it anytime soon.
I'm still going back and forth on how the characters should generally look. The helmet I'm kind of okay with. The clothing here, not at all. And generally it should be much lower poly than what I've ended up with so may need to be thrown out.
sighs...
Handling the bones is also another problem entirely that I'll need to read up on more. My initial attempts haven't been quite successful, to say the least.
Screenshots 📸
Previously for screenshots spat out by the engine, I was naming them 'screenX' and would increment that for each screenshot. This is fine, for most normal people. But alas! I like having the screenshots named in such a way that I can easily document progress.
Anyway, going forward, I've changed it so generated screenshots use the date and time instead. Bloody exciting, eh? No, not really. Primarily, this just means it'll be easier for me to organise these.
If you do somehow manage to take a screenshot at the exact same moment as the last, it's setup to postfix it with (x)
, with x
being the number of screenshots with the same name.
Some final personal thoughts 🤔
I've not been formally diagnosed with anything, but I have been trying to come to terms with the fact that I find it incredibly difficult to focus on trivial tasks. If it wasn't for this, my engine would've come along much more quickly than it has.
If I'm not doing something to keep it interesting, I'll just fizzle out and lose interest. Or if it's a problem that I've got some anxiety about, I'll just ignore it forever and ever, even though it's usually an easy problem to solve.
Sometimes, my brain will just have a surge of a million things I'll want to do. I'll just keep jumping between trying to do them, getting more and more angry with myself, until it gets to the point that I'll do nothing.
And I don't mean gradually. I mean I'll literally start one thing for an hour, hit something I don't like, jump to another, and repeat over and over. Almost like I'm trying to chase some sort of gratifying feeling.
This is why I'll often start a lot of projects and seemingly move on when they reach a certain point. And I'll get really frustrated about projects I'd like to start but have literally no need to start.
Deciding on the world format and pushing myself to implement what was needed in the editor to support it... It was a little like trying to push myself into a really awkward social situation, with the only person in the room being me.
When I was working on a game with a team over a decade ago now, someone on the team would stick it to me that I'd never finished anything in my life. For some reason whenever that feeling of frustration hits me, when there are millions of ideas going through my head, that always comes up alongside it. It sucks.
I'm aware I'm not the most sociable person in the world, but if you ever want to reach out and say hello, I always really appreciate the company even if I'm not the most communicative person in the world.