Hello and welcome to another of our weekly updates!
This week we spent a lot of time on many quality of life improvements, featuring numerous tweaks, bugfixes and security improvements. We have added some nice new features as well, notably procedural meshes for rendering realtime audio waveforms and custom graphs.
Those will be useful for future optimization and debugging purposes as well, as we'll use them to display some performance metrics, but you can already start using them for your own purposes as well.
We have also started work on more optimizations, this time focusing on LogiX and using the opportunity to also implement mechanisms necessary for future features like collections. We're in process of reworking the MTC experience for new users as well.

[h2]Procedural RectMesh system & Generic Member support[/h2]
To enable some of the new features, we added some new architectural building blocks to Neos. Two particularly notable ones are RectMeshSources and Generic members on components/workers.
RectMeshSource is a new type of procedural mesh, that’s typically constrained to a 2D plane (though technically it doesn’t need to be) and defined by a rectangle. It’s designed so it can be used both as a standalone mesh (using StandaloneRectMesh) or within a UIX canvas (using RectMesh). This allows better code reuse and reduces errors. With standalone mesh you need to provide the rect area explicitly, while within UIX it’s implicitly provided by the canvas RectTransform.
The second addition is a more technical one, allowing Components/Workers to have members that are pure generic arguments, which wasn’t previously supported by Neos’ IL postprocessing - code that generates highly efficient code for initializing and accessing sync members. This gives us some new flexibility to implement new features more elegantly.
[h2]Realtime Audio Waveform Mesh[/h2]
Thanks to the architectural additions, we have added two new RectMeshSource procedural meshes. The first one is AudioSourceWaveformMesh, which takes in any audio source as an input (voice stream, sound effects, music) and generates a real time mesh of the shape of the waveform.
The mesh has a configurable number of points, width, color and buffer history (allowing it to show up to 1 second of the waveform). This new mesh can be used to create some cool audio visualizers, so we hope you’ll have lots of fun with it!
[previewyoutube][/previewyoutube]
Tutorial by ProbablePrime on how to use the new audio waveform mesh[h2]Procedural Line Graphs[/h2]
Using the same underlying procedural generator we added another RectMeshSource, called LineGraphMesh. This is a more general procedural mesh, which allows rendering arbitrary line graphs, using a series of scalar values. It has similar configuration options to the mesh above, but supports arbitrary values.
Since the list of points is defined in an array, which is currently not directly accessible from LogiX or inspector, we have also added additional components to make it easier to use with common setups. To allow for efficient updates, it also has StartIndex property, which allows offsetting the input array. This can be used for history graphs, by simply updating a single value in the array and shifting the index, eliminating the need to constantly shift the entire contents of the array.
Using the ValueGraphRecorder you can simply point to any float value in the world and have it automatically graph over time. You can configure the capture time interval and automatic range scaling.
[previewyoutube][/previewyoutube]
Great tutorial by ProbablePrime on how to use the new graphing functionalityThe component can be used to explicitly write values to the graph as well using LogiX. In this case you might want to set the interval to infinity, so it never writes a new value on itself. It’s also recommended to disable the “Drive” option with this, so the state gets synced to others (for values automatically graphed over time this is not necessary if the value is already same for everyone).
We plan on using this ourselves to create improved performance debugging tools, which will help with further optimizations, but the possibilities should be pretty wide, allowing other educational or practical uses.
[h2]Metaverse Training Center work in progress[/h2]
Over the past weeks, we’ve also been reworking the MTC (Metaverse Training Center) and building a new starter tutorial to help new players get started in Neos. We’re going to be using a simplified version of the tutorial for the time being, before other major features like physics and more of the UI gets reworked, so it’s easier to update.
We’ll have more news to share soon, but here are some screenshots of the new remodelled MTC, which has been improved based on the experience we gained over past year and based on the feedback from both new and existing users.


[h2]Optimizing LogiX (work in progress)[/h2]
As part of the optimizations, we started working on redesigning internal parts of LogiX to significantly reduce overhead based on performance profiling and at the same time solve some long standing issues and introduce new capabilities.
One of the major general performance sinks with LogiX is currently change propagation. Any changes need to be propagated through the whole node setup forward to the nodes that care about them, even for nodes that update every single frame.
The new system will have a LogiX validation process that happens on any change to the node setup. During validation, the correctness of LogiX will be verified, preventing things like evaluation loops that cause crashes and information about change sources propagated and registered.
This way the propagation of every frame will be avoided and done directly from source nodes to the listeners, rather than having to go through all the nodes in-between. For nodes that change continually every frame this will be optimized even further, as the changes won’t need to be propagated at all, reducing overhead.
As another benefit, this system will be propagate other information about inputs as well - e.g. “localness” of values. This will allow us to add support for local only variables, while at the same time preventing accidental misuse by driving a shared state from them (there will be a mechanism to do this if really needed).
Currently this work is still in the design stage, but we’ll be likely implementing it over the next week, hopefully resulting in a good performance boost as well as unlocking path to other future features like collections.

[h2]#NeosFans on Twitter[/h2]
We’ve seen a fun trend occurring on Twitter, where people grab onto a ceiling fan and spin about their virtual rooms in Neos! Funny enough, this has been a tried and true passtime of sorts since the early days of Neos, so it’s really fun for us to see this trend coming full-circle! Puns!



And here's a little throwback clip from beginning of 2019. Were these fans too ahead of the curve?
[previewyoutube][/previewyoutube]
----------------------------------------
Anyway that's all for now! If you'd like to know more about other changes, updates, security fixes and other improvements, check out the #neos-updates channel on our official Discord or the patch notes on Steam.
And as usual thank you everyone for your support, especially our Patreon supporters and ICO investors, for keeping this project going and improving every day!
