Page Header

November Update

Our store page finally went live early this month. It got picked up by quite a few news websites, we had lots of positive feedback on the trailer, but thankfully none of the extra traffic in the game caused any stress for the backend.
I made a news post over there to fill the void and try to head off any questions people might have.
We changed the menu again. With the store page going live, and an influx of new people, I didn't want the menu to be so offputting. I didn't want people to start the game and be immediately presented with a grid of games. And I hated all the gradients on the old one.

So now the first thing you see is the universally loved citizen model:

We have the social bar at the bottom. This shows your friends and what they're playing. The number below the name is their gamerscore, except we can't call it that because I think MS owns a trademark on it.
I re-designed the settings page too.
Pretty much everything in the menu has been cleaned up and updated. There's more work to do, but this all way less embarassing than it was last month.
Last month we mentioned changes to the asset browser - we've made some more changes since then and pushed it live. We're actively listening to feedback and dogfooding the new asset browser ourselves to make sure it's as good as it can be.

A lot of these changes have been incremental, but with lots of these small updates and tweaks we've made the experience a lot better. We've been focusing pretty heavily on performance and small UI tweaks rather than large feature updates.
Since last month, here's the highlights of what we've changed:
  • Moved the cloud browser into its own separate window and added quick links to the sidebar

  • Re-added shortcuts for type searching

  • Added a flat view to list all files without folders outside of search

As I mentioned previously, we're still iterating on this, it's still a work-in-progress, and we value any feedback - so if you think something should be changed, please let us know.
I spent a lot of time getting Dedicated Servers where we want them to be. You can now host your own Dedicated Servers for your game and things like authentication with Steam via tickets will be handled automatically.

Dedicated Servers use a Fake IP system - the real IP is hidden and connections are made via a Steam Id assigned to the server when it starts up.

Added an API to kick players from a server, or reject them from joining entirely. Players cannot join servers which are full.

  • Added Rich Presence support so that players can see what servers their friends are on and connect to them directly
  • Added a new API for creating a lobby so that you can pass in and override settings such as the Maximum Players for a server, or lobby privacy if it's P2P
  • Steam Authentication is enabled by default for all Dedicated Servers
Volume Fog had a few issues trying to work for every kind of games, it was a bit too soft, had flickering and noise on high contrast, reconstruction was very ghostly specially if things were moving in the scene, didn't perform well with many lights.

It's been rewritten with state of the art reconstruction technques and uses the same frustum tiled lighting system now.


You can go bananas moving around and you won't encounter any ghosting.

This looks better and runs better in most cases, especially on scenes with many lights, on my testing I'm getting 250fps (0.4ms) on Datacore now, around 180 (0.55ms) before.
We also rewrote how we composite ambient occlusion to lighting, the ambient occlusion component will properly react correctly to the rest of the pipeline, including specular occlusion.

We're also moving our default technique to Ground Truth Ambient Occlusion which gives very high quality AO, it's still fast and it kicks ass.

Ambient Occlusion also composites properly with MSAA, this keeps thing sharp without aliasing.

With how this works now you can also add your own ambient occlusion techniques modularly to the pipeline without much difficulty.
The documentation is shown on this site now. When developing this I spent extra care to make sure it's the fastest possible documentation site in the world. Switching pages should be pretty much instant.

There's still work to do here but this is already way better.
I added a mirror component example in testbed.

A mirror is a good example component to have because it can be adapted to water, portals, etc.

Ziks was able to figure out the last remaining part we needed, oblique near clip planes which clips anything behind the surface.
Our previous trigger detection would refcount touches, this can be error prone when there's a situation that doesn't report a contact loss. Instead, we now ask the physics engine if there's any contacts still touching, if there isn't then we know we have exited the trigger.

We also now have events for when the root gameobject enters or exits a trigger. This is because a gameobject could have multiple colliders but we don't want to respond to each collider, just once for the whole gameobject.

Dan and Max have been doing a lot of work with the human model. Dan really stunned us by making the same clothing work on both the citizen and human models.

There's a button on the menu screen now so you can swap between the two modes.

We overhauled our Navmesh generation. Instead of generating one giant Navmesh we now tile it into smaller pieces. This has many benefits, one of them is that you can now cover much larger maps with a Navmesh.

Another one is that you can now efficiently regenerate individual tiles of the Navmesh at runtime without freezing your game.
We also made it possible to add dynamic obstacles to the Navmesh. Those are updated in real-time and do not require regenerating the Navmesh. The obstacles integrate into our existing collider/trigger system.
You can turn larger moving props into an obstacle, or statically block off larger areas of your map.
You can also toggle obstacles on and off to create doors and similar mechanics.
I added virtual cursor support for when you're using a game controller in menus. This works in games as well!

It emulates mouse movement so it works with everything.

When you wanted to draw a HUD, like draw a crosshair or something, you had to use UI Panels. People were animating their crosshairs using transitions and keyframes. Which is cool that it works, but it also feels like a big old slog when all you want to do is draw rectangles on the screen.

So I added a HUD drawing API. This lets you draw to the HUD from anywhere in code.
protected override void OnUpdate()

{
if ( Scene.Camera is null )
return;

var hud = Scene.Camera.Hud;

hud.DrawRect( new Rect( 300, 300, 10, 10 ), Color.White );

hud.DrawLine( new Vector2( 100, 100 ), new Vector2( 200, 200 ), 10, Color.White );

hud.DrawText( new TextRendering.Scope( "Hello!", Color.Red, 32 ), Screen.Width * 0.5f );
}
Matt is working on more cool 2d drawing stuff, that we'll hopefully ship next month.
I've fixed a very fundamental issue with how we were handling Fixed Update.

The logic was wrong resulting in FixedUpdate often being called too many times a second depending on your frame rate. This could result in issues like physics objects moving too fast if you had uncapped FPS.

This has been resolved and now it should be called the correct amount of times per second.
I found that using prefabs from code was a big of a jaunt. If you wanted to get a prefab you had to load a PrefabFile then call SceneUtility.GetPrefabScene. It was all very unnecessary, really.

So now to load a prefab you can do this
GameObject prefab = GameObject.GetPrefab( "weapons/glock/glock.prefab" );

Previously these prefab objects weren't loaded. They were empty. They were just references. Now they are loaded, they have all the child GameObjects and Components.

This means you can do stuff like this to get information about your prefab without instantiating it into the Scene.
GameObject prefab = GameObject.GetPrefab( "weapons/glock/glock.prefab" );

var weapon = prefab.GetComponent<BaseWeapon>();
And when you want to actually spawn it into the scene, that's the same as ever.
GameObject prefab = GameObject.GetPrefab( "weapons/glock/glock.prefab" );

var glock = prefab.Clone();
As an added bonus here, these prefabs can be referenced over the network. So in this example, you can send prefab as an RPC argument and when it's called on other computers, it'll be the same prefab.
Continuing from last months scenic hammer are a bundle of improvements.
The biggest improvement is GameObjects can now parent each other in hierarchy the same way as scene, Hammer had an archaic way of handling this before so it's quite the overhaul to get here.
This means you can make lifts with buttons and lights, but mind your head on the ceiling.
Other improvements include:
  • Scene prefabs can be dragged into the map
  • You can paste GameObjects from the scene editor into your Hammer map
  • General bug fixes including: transforms, copying, undos, gizmos stick to objects, and scene meshes can be selected now
I've improved the game startup times, there was a lot of small performance fixes that added up, as well as shipping a precompiled menu. Our median startup time went from 12 seconds to 5 seconds, and our fastest times went from 5s to 3s.

There was also an awkward 1-2 seconds before the loading screen opened, it now opens almost as soon as you click play game.

Here's our lovely graph from our data.

Net9 was released this month. We updated the entire engine to it the next day. We were previously on .net7, so benefitted from all the stuff in .net8 too.


We saw performance improvements across the board, but particularly when serializing/deserializing json - which is great because our whole engine uses it for serialization.
That was a great month. Huge leaps forward. I'm not expecting December to be as productive. But we'll be pushing on.

We're doing a lot of thinking about the Sandbox mode. Lots of planning, lots of ground work. At some point we'll have to actually start making it.

We'll be running a Jam over Christmas. It'll probably be announced next week, or the week after and finish in the new year. This time it won't be games.

Comments

Oct, 10 2021
105
classic laylad
Sep, 9 2022
2565
Oh, I had predicted a jam for Christmas, but otherwise, great job!!
Jan, 1 2024
655
Great job! Can't wait for the next jam...
Sep, 9 2021
0
nice
Aug, 8 2021
155
Excited to see what the plans for the sandbox mode will be.
Jul, 7 2023
135

Sep, 9 2021
345
Great update as always. Keep going.
Oct, 10 2022
1620
Nice work, thx :)
Jul, 7 2022
100
Good to see always improvements to the base engine, hopefully once the sandbox mode gets to a stable release it's as well as fully feature as gmod's, if not more, mostly curious about how fully custom playermodels would be handled, if added. Also great to see Hammer being so much more useful and friendly to use than the mess the original Hammer in Source (1) was.
Nov, 11 2022
260
Wishlisted ! Keep up with the great work !
May, 5 2023
930
It's really cool that you can optimize your platform so easily. Excellent work!
Nov, 11 2022
0
пупи эпи)
Sep, 9 2022
40
Based
Sep, 9 2023
15
i love the progress you made
May, 5 2021
0
gmod 2 looking good
Jul, 7 2022
60
Great Update
Aug, 8 2022
195
OMG Sam !!!!
Oct, 10 2021
0
good one! certainly looking for building tools in Sandbox mode.
May, 5 2023
0
w
Aug, 8 2021
0
W
Aug, 8 2022
0
Hoping for the day I see mention of Addons coming back. Having to totally fork a game just to add new content is really not great.
Sep, 9 2022
50
nice work
Sep, 9 2021
5
Some day we will see completed dedicated servers where we can change ports and much more