1. Neos VR
  2. News

Neos VR News

2021.1.26.1308 - Mesh metadata caching, improved GLTF 2.0 support and more

Some mesh related improvements! The mesh assets now use the asset variant system to generate, download and cache metadata, rather than computing them every time the mesh load. This should provide a bump in performance when loading worlds/avatars/items. It might take a few hours to get the full effect, as the metadata gets generated on the first load of each unique mesh.

The Assimp library for 3D model import has been also updated to latest version from the source after more than half a year, with tons of bugfixes and additions, including much improved GLTF 2.0 support - rigs and blendshapes should now import correctly with names. There was a regression for some FBX files with animations, but I managed to fix that one in the library, but let me know if you run into a problem with some models that worked before.

Also a bunch of other tweaks and bugfixes as usual. Not too many in this build, I plan on working on some more desktop stuff and wanted to push this out so it doesn't have to wait for that.

[h2]Optimizations:[/h2]
- Moved mesh metadata computation to the asset variant system, improving performance and lowering CPU/memory usage when loading meshes
-- Bounding Boxes, Bone Metadata and approximate bone bounds are now loaded from cache/cloud, instead of being computed on every single load of the mesh
-- Other metadata is generated as well, which will allow future additions of mesh variants
- Drive system will no longer unnecessarily request links when the target is set to null to avoid wasting CPU and memory resources

[h2]New Features:[/h2]
- Updated to the latest version of Assimp model importer library from the source (previously requested by @Karel | CEO and others)
-- This includes over a 1000 commits since our last update, with more than half a year of updates and should provide overall improvement for different 3D model support
-- This includes significant improvements to GLTF 2.0 support, for example fixing lack of Blendshape import support and some blendshapes importing without names (reported and sample models provided by @Aegis_Wolf | Art Director, @MattyK and @3x1t_5tyl3)
-- This build includes a custom bugfix for FBX animation regression introduced in the new version of Assimp, to prevent some FBX animated models from being mangled
-- Note that the animation speed for FBX is assumed to be 1000 ticks per second, as it seems to be decoded wrong for some models. If you encounter some models playing animation too slow or too fast, let me know
-- Recompiled the Linux version of Assimp64.so as well using Ubuntu (WSL), which can make model import work on Linux (based on previous feedback by @happysmash27, currently untested)

- Added "Adjust Saturation" and "Adjust Value" processing to static textures (based on request by @Veer | Chief Moderation Officer)

[h2]Tweaks:[/h2]
- Improved SimpleAvatarProtection security (based on report by @epicEaston197 and @jeana)
- Added Pin button to the Audio Stream dialog (requested by @Tatsu Kimiero)
- Saving current avatar is now blocked when the world prohibits any saving of items (based on feedback by @orange)
- OnlineUsersCount now has UsersInPublic, which provides info on how many users are in public worlds (requested by @Alex from Alaska)
- Added descriptive names to badge objects (requested by @Earthmark)

- Merged Korean locale update by @MirPASEC
- Merged Japanese locale additions by @Aesc
- Merged Esperanto and Chinese locale additions by @Melnus
- Merged Finnish locale additions and fixes by @Napo
- Merged French locale update by @brodokk
- Merged Russian locale additions by @Shadow Panther [RU/EN, UTC+3]
- Merged Czech locale additions by @rampa_3 (UTC +1, DST UTC +2)
- Merged Estonian locale additions and tweaks by @Meron
- Merged English locale tweak by @rampa_3 (UTC +1, DST UTC +2)

[h2]Bugfixes:[/h2]
- Fixed "Start Streaming" button not using the localized string (reported by @かず (kazu / GitHub: kazu0617))
- Removed deprecated SimpleViveBasePositioner (based on feedback by @Psychpsyo)
- Added explicit ordering to Undo steps, fixing the Undo system getting messed up in some cases when the user leaves and rejoins
-- This fixes the Undo function randomly breaking (reported by @Enverex, @Robyn (QueenHidi) and @Hayden, cause discovered by @Shifty | Quality Control Lead)
- Fixed potential incorrect serialization/deserialization of texture filtering type on texture variant descriptors
- Fixed being able to transfer objects with SimpleAvatarProtection out of the world by grabbing them and switching to another world (reported by @Dante and others)
- Fixed race conditions when requesting assets in the background, when the asset provider parameters change before the request is finished (found in a log from @DJNightmares)
- BooleanValueDriver now has FalseValue and TrueValue initialized with proper defaults for each datatype (particularly floats), to avoid having a degenerate value by default
-- This fixes BooleanValueDriver corrupting rotations when one of the values has not been changed from the default (based on report by @Zyzyl)
- OnActivated and OnDeactivated LogiX event impulses are now scheduled to fire after the event itself finishes propagating
-- This fixes various data model corruptions by making changes to the scene in this event (e.g. adding new children, as reported by @chemicalcrux)

Desktop audio streaming, Matcap for XiexeToon, Mentor Network, MTC Avatar Room

Hello and welcome to another weekly update!

This week we have a few exciting things for you. Neos now has the ability to easily share your desktop audio to other users in full stereo with high quality, letting you stream live music to your hangout worlds, run live DJ events and do lots of creative things that we haven’t even thought of!

We made some improvements to the shader asset system as well, making it much easier for us to update shaders. Thanks to those changes, we integrated the Matcap support in Xiexe Toon shader, as well as ColorMasking and using secondary UV’s, added PBS stencil and made all the filter shaders usable in UIX with full masking support.

We’re also introducing a new Mentor Network, a way for community members to get better visibility and communication tools to help out new users. If you’re interested and would like to apply, check out details below.

The avatar lobby for the new version of Metaverse Training Center has made significant progress. There’s still work to do, but you can check out the work in progress on the new environment below. We have some more details on progress on the desktop mode as well.

[h3]Friday Livestream - showcasing MTC avatar lobby and announcing the mentor network[/h3]
[previewyoutube][/previewyoutube]

[h2]Audio Streaming - stream your desktop audio in high quality[/h2]
One of the major new features added this week is the new ability to easily stream your desktop audio into your worlds in full stereo and with higher bitrate than used for the voice. Simply click the new “Stream Audio” on the Home screen in your dash, select the audio device you want to stream, adjust the target bitrate (goes from 2.5 kbps all the way 500 kbps using the Opus codec) and hit “Start Streaming”.

Using this feature you can easily stream music from your desktop in your social hangout worlds or do live DJ events without need for any complex streaming setup or external software. The system supports both audio inputs as well as capturing audio playback from your system, giving you great flexibility for the setup.

The streamed audio is independent of your voice data as well, so you can still talk with others as usual, switch to whisper or mute yourself, without affecting the audio stream. The only caveat is that you should use a different audio device than the one that Neos sends it sound to, otherwise you’ll be streaming everyone’s voices and in-game audio as well.

Streamed audio data is also treated the same as any other source, so you can easily plug it into various visualizers and build audio reactive worlds. To help this along, the streaming control dialog also serves as a proxy to the audio data, allowing you to drop it directly into the inspector. To stop the streaming, simply close the dialog spawned in the game.

We hope that this new feature brings a lot more utility and some exciting use cases, not only to the WaveXR Resident DJ community that has been exploring Neos recently and has requested this feature for their events, but to everyone else who was previously looking to bring their music to Neos or even perform live.

[previewyoutube][/previewyoutube]
It's a real world devlog! Note that this shows an earlier work in progress version of the feature, with some bugs and without the UI fully finished.

[h2]Matcap support for Xiexe Toon, Filter shaders in UIX, PBS Stencil[/h2]
Since we have accumulated numerous requests for additions, tweaks and fixes to various shaders in Neos, we have decided to fully transition our shader asset system to the asset variant system, used by other types of assets like textures or cubemaps.

Previously the shader metadata and individual variants were uploaded to a special location and used special keyword URL’s, rather than regular neosdb:/// ones. This made any updates to shaders a tedious process, as we had to manually update those files and URL’s in the code.

By treating the shaders more like normal assets, with the cloud system extracting and managing the metadata and variants as it does with other assets, not only has this process been greatly simplified, but it fixed some long standing loading issues and improved performance, allowing metadata to be cached, rather than fetched from the cloud at every startup.

Thanks to these changes we were able to fulfill several of the requests. The Xiexe Toon material in Neos now has MatCap support, as well as ColorMasking and ability to switch to secondary UV’s on the mesh for each individual texture map.

An example of the use of Xiexe with Matcap in Neos, screenshot courtesy by DAWKY

Another example of the use of Xiexe with Matcap in Neos, screenshot courtesy by DAWKY

The filter materials, like HSV, Invert, Blur, Grayscale, LUT and many others were also extended with stencil support, which now makes them fully usable in UIX with proper mask support. This will allow for more flexibility and customization when building both your own custom UI and making official ones.

Other changes include also new PBS Stencil shader, which is a vanilla PBS material with added stencil support for masking effects and some bug fixes for other shaders ignoring texture scaling options.

[h2]Introducing the Neos Mentor Network[/h2]
The Neos Mentor Network is here! The Mentor Network is an initiative for the Neos Community to have representatives in the community new or old, who like to show new users around and help them get started, inform fellow community members and also point out problems that Neos has as a whole so that we can make the platform better for all.

The Mentor Network will act as a place where other mentors can connect and also improve their craft. Neos is a really big platform and we all understand as things scale up, managing it and making sure things go smoothly can be problematic. It’s no lie that sometimes Neos can be really overwhelming, but once you’re past that initial barrier, things can be so much fun and oh so chaotic in a way that makes VR awesome!

Do you like to contribute to Neos? Do you like to help out the community? Want to see it grow or learn some better tools of the trade to help out and coordinate with others? Then send in an application and join today!

Of course if you prefer helping other users independently of the network, that’s perfectly fine as well, there are lots of different ways to contribute and help out the community! We’re proud that helping each other is one of the core values of our community and we hope it continues to be as it continues to grow, with this program making it easier to make some of the members easier to approach for new users and providing tools for better organization and team communication.

The mentor network is managed by Turk, so if you have any questions about the program or any concerns, please direct them to him. Here’s a sneak peak at what the badge will look like. It’s not fully final yet, so expect the design to change!



[h2]Progress on the MTC Avatar Lobby[/h2]
We have made significant progress on another part of the reworked MTC 2.0, our tutorial world to help new users - the avatar & social room. The old MTC avatar room is one of the most visited parts, so it was an easy decision to rework it next.



The new version provides the user a comfortable environment, where they can learn how to set up their own avatar, but also hang out with other users. We often see users hanging out in the avatar room with the community members helping them out, so we wanted to make it into a comfortable environment.



There is still work to do, but the environment has been coming along nicely. If you’d like to see it in action, check out the recording from our Friday’s livestream where we showcased the progress so far. We hope to have a finished version soon and set it live.

[h2]Fixing choppy voice, particle system freezes, cloud and more[/h2]
Thanks to working on the audio streaming feature, we’ve been able to find a long-standing bug in the audio streaming code, which would cause the voice to randomly become very choppy for some users. This issue would affect some users more than others and was quite difficult to diagnose, but as of the latest build it should be completely gone.

We traced down another of the elusive bugs, causing a random freeze on particle bursts for any particles with collisions enabled, after long periods without any particles with collision emitted. We have thrown in a few CPU and memory optimizations for the multithreading system handling those collisions as well.

Another of the notable fixes and optimizations this week has been to the cloud infrastructure. Earlier this week the cloud service started degrading significantly. We have investigated this issue and traced down the culprit to a combination of a poorly coded bot and an edge case in the database SDK. We have corrected both of the problems, while also adding new internal diagnostic tools to help analyze any future cases like this.

We also finally have some data on the cloud cost optimizations that we implemented last week. So far it seems really promising, with the cost being significantly reduced thanks to more efficient structure and elimination of unnecessarily wasted bandwidth.



Apart from these notable fixes and improvements, there were dozens of other bug fixes, tweaks and additions. If you’d like to learn more, check out the #neos-update channel on our Discord or the patch notes on stream.

[h2]Progress on the desktop mode[/h2]
The desktop mode is still heavily in the design phase, but we have made some good progress on that end as well. As we went through all the different subsystems and how to abstract them for desktop use, it became obvious that implementing at least a partial version of an input binding system is the best way forward.

This will help separate concerns and reduce desktop-specific code in a lot of the codebase. For example a locomotion module can only be concerned with the direction the user wants to move in, axes around which they want to turn and whether they want to jump, but not which combination of inputs achieve this.

By having this computed in the input binding system and only passing the resulting directional and boolean inputs, the logic can be greatly simplified. Given the previous example, the movement direction can be computed using a controller joystick and head direction in VR, while using the mouse and keyboard on desktop.

Once implemented, we can also expand this system to allow customization, allowing both desktop and VR users to customize how Neos is controlled. This is something that would come later though, as our initial goal is to first do this abstraction internally and nail down the details of the system.



[h2]Community Highlights by Turk[/h2]
Hello Neos Community!I hope your week has been fantastic. People this week have been going crazy for visuals. So, I’d thought I’d use this weekly update to show off some of the crazy visuals people have been making and doing in Neos lately :)

[h3]Curving Bullets by orange[/h3]
First up is Orange’s Curving Bullet world! Ever watch the movie Wanted? Wanted to feel like a super train assassin who can Curve the bullet? Want to flex on your friends and get the high score? Then come on down to the Curving Bullet Range and show off some guns! Thank you Orange-san for your efforts!


https://twitter.com/mikan3134/status/1351125817615654914

[h3]Kaliedoscopic Playground by Sirkitree:[/h3]
Long time Neos veteran and All-around Mandala-Master/Enthusiast sirkitree thoroughly entrances us with his craft. In His World KaliedoScopic Playground he goes into showcasing how he makes some of his visuals in Neos, and how easily you can too if you’d like to add to the wonderful entropy that these visuals bestow on you as you witness them. Thanks sirkitree for the world!



[h3]Club VibeZ by QueenHidi[/h3]
A exciting update from QueenHidi, she’s updated her Club VibeZ world to include more visual effects for those who want to party and those who want some sights to their DJ sessions! Watch as the winding tunnels send particles all over around you, and ebb and flow to the beat entrances you. Many of you might not be aware, but the WaveXR Community are setting up shop over in Neos, and this was made to have them feel more at home and teach them some of the ropes! So Thanks QueenHidi


------------------------------------------------------------------

Anyway this is all for this week! We'll see you at the next one with more cool stuff and developments and as usual, big thanks to everyone supporting this project, whether it's through Patreon, Twitch, GitHub, Discord, helping the community in-game or just simply being part of the platform!

See you next week!

2021.1.24.1266 - Desktop audio streaming, choppy voice fix, many fixes & tweaks

Hello, got a nice build for you, finally picking up some steam on things! :smile:

You can now easily stream your desktop audio to the world, in high quality (customizable bitrate) and full stereo! This should be ideal for streaming music/podcasts into social worlds, soundboards and other effects!

I've also found a problem in the new shader variant system which made the shaders take a few second to load, since the metadata was being fetched from the cloud every time (and inefficiently at that, using a fallback method) and not cached locally, which should now make them load much faster once they're locally cached and reduce some uncessary network chatter.

There are a bunch of bugfixes for some things that have been elusive for a bit. The random choppy voice issues should now be gone (unless they're caused by poor network), e.g. when using VoiceMeter or some audio devices, thanks to poking around with the audio stream system. Also the random freezes with particle systems are gone now!

There's a bunch more stuff as well and more coming hopefully soon!

[h2]New Features:[/h2]
- Added new "Stream Audio" tool, which allows you to easily stream your desktop audio (or another audio input device) to the world in high quality and stereo (based on request by @Scott Marshall on behalf of the WaveXR DJ community and previous discussions with @Tatsu Kimiero, @Zane and others)
-- This can be accessed through the "Tools" facet on the main dash, same location as "Create New World", "Avatar Creator" and others
-- You can select which audio device you want to stream and the desired bitrate (from 2.5 kbps to 500 kbps, the stream is using Opus codec). Both settings are persistent.
-- The stream is in full stereo rather than mono used for the voice
-- Once you start the stream a simple "Audio Stream" dialog will spawn in the world (quick simple UI for now, will be updated in the future)
-- You can toggle the streamed audio between spatialized (coming from the dialog) and broadcast
-- You can toggle whether the streamed audio plays for yourself or not
-- You can also adjust the audio volume coming from the dialog
-- To stop the stream, simply close/delete the dialog. Dialog is non-persistent and will destroy itself when the user leaves
-- The dialog is a reference proxy to the audio stream data, allowing you to drop it as a source in the inspector
-- The audio stream is completely independent from your microphone, allowing you to talk, use whiper or mute yourself as usual, without interrupting the audio. Switching to another world will interrupt though (this can be changed if necessary)
-- The audio stream is relayed through the host same as voice. Make sure there's sufficient bandwidth for your chosen bitrate and number of users.
-- It's heavily recommended to use another sound output (e.g. a virtual one) from your VR output, otherwise you'll stream in-game audio back into the game
-- The data streamed this way is raw as it comes from the device. No normalization, noise gating or denoising is applied.
- Added "AverageCodecSamplesPerSecond", "AverageReadSamplesPerSecond" and "AverageWriteSamplesPerSecond" to AudioStreamMetadata
-- These indicate average number of encoded/decoded samples per second and number of locally read/written samples respectively
-- This is measured at 10 second intervals
-- This new info is also shown in the inspector
- Streams are now internally destroyable
- Added Neos Mentor badges and nameplate colors (mentors have green outline with white center)
-- Currently the badge is not yet fully final and will likely change in the upcoming days
- Added ++ and -- action nodes for float datatypes (based on feedback by @Psychpsyo)
- Added "UseFilteredData" to LocalAudioDeviceStream to allow passing raw unfiltered data

[h2]Tweaks:[/h2]
- Inventory permission notifications (not allowed to save, spawn or swap avatars) are now localizable
- Removed audio-stream skip-ahead mechanism for high latency compensation in cases of high audio noise and constant transmission
- Set default primary controller to Right instead of Left (suggested by @Shifty | Quality Control Lead)
- Increased the max displayed message length to 512 from 128 (based on feedback by @Veer | Chief Moderation Officer)
-- Note that this is just a quick hacky change and might still be kinda weird until the UI is reworked
- Renamed ++ and -- operator nodes to +1 and -1 to avoid confusion with ++ and -- action nodes
- Public banned users will now show in user search, allowing people to find them and add as a contact and added a separate type of ban which prevents the user from showing up in search (based on suggestion by @H3BO3 and others in the moderation team)
-- This allows more fine-grained moderation control, only preventing user from being listed in search when really needed (e.g. offensive user-names)
- Merged Korean locale additions and tweaks by @MirPASEC
- Merged Japanese locale additions and fixes by @Aesc
- Merged Esperanto and Chinese locale additions by @Melnus
- Merged Czech locale additions by @rampa_3 (UTC +1, DST UTC +2)
- Merged French locale additions by @brodokk
- Merged Russian locale additions and tweaks by @Shadow Panther [RU/EN, UTC+3]

[h2]Optimizations:[/h2]
- Optimized upload finalization on the cloud worker to avoid inefficient synchronous IO and reduced async overhead when extending computation for larger uploads
- Added caching of completed upload tasks to the cloud worker, to speed up disposing of already finished uploads in the queue when there are duplicates
-- This should fix some cases of uploads taking long time to finish when the processing queue gets flooded with many items
- Type member editor now uses fully qualified type string when displaying the type, which allows the type string to be reused as input (based on feedback from @chemicalcrux)
- Optimized multi-threading synchronization and handling for particle system collisions to potentially reduce random hitches and improve overall performance
- Optimized memory usage for particle systems with collisions that have a very high amount of max particles, but don't have that many active
- Fixed list particle system collision job data accumulating endlessly when there are particle systems with collisions, but no active particles, causing a significant hitch when the particles are spawned next time, with duration of the hitch proportional to how long ago they were last spawned (reported by @Lewis Snow | Lead Audio Engineer, @Rue Shejn | Artist 3D, @H3BO3, @Turk and others, with replication case found by @Shifty | Quality Control Lead)

[h2]Bugfixes:[/h2]
- Fixed audio encoding skipping a chunk of samples when encoding audio frames when number of available samples isn't a multiple of the framesize and the operating buffer has been previously enlarged to handle more frames than are currently being encoded
-- This should fix random cases of glitchy/choppy voice audio with certain users (previously reported by @Rue Shejn | Artist 3D, @Zephyr.С, @Shifty | Quality Control Lead, @Zane, @Hayden and others)
- Fixed invalid frame size calculation for encoded audio streams with multi-channel (stereo and up)
- Fixed SmoothValue misbehaving when first driving rotation due to invalid default quaternion (reported by @Zyzyl)
- Fixed XNOR node with two inputs behaving as XOR (reported by @Rubik and @Ballistic)
-- Existing instances of XNOR will be auto-converted to XOR to preserve their old behavior
- Fixed red grab interaction laser not showing up when there's GrabBlock in the higher hierarchy, but the pointed grabbable is below this block (reported by @Earthmark)
- Fixed cloud backend missing endpoint for fetching a batch of shader metadata, resulting in slower shader loading due to having fetch the metadata individually
- Fixed Neos not caching any asset metadata locally when it has been fetched individually from the cloud, causing it to be fetched next time again
-- Combined with above, this resulted in shader metadata not being cached locally at all, resulting in a noticeable delay when loading shaders and unecessary rise in API traffic (this is separate from generating fresh variants for the first time, this process will still take longer, but only ever happens once for each unique shader variant)
- Fixed "JumpToUser" permission incorrectly causing the "Respawn" button to gray out for ther user (reported by @Zyzyl and @Rukio)
- Fixed Component Attach dialog being usable by guests (reported by @Psychpsyo)
- Removed accidentally saved log file from Neos standard assets (reported by @Epsilion)
- Broke FireOnChange, FireWhileTrue and ImpulseInput nodes when they're already broken (Disabled) so they don't send impulses in this state (reported by @Psychpsyo)

2021.1.22.1352 - Matcap, UV0/UV1 & ColorMask support for XiexeToon, PBS Stencil

Sorry for the smaller build today, it took a fair amount of time, but here are a bunch of shader updates! Based on popular demand, XiexeToon now has matcap support! I've also added ColorMask support and secondary UV support since those were popularly requested features too. Let me know if you run into any issues with those.

The filter materials now also have stencil support and can be used with masking in UIX! This should allow for a bunch of nice effects. There is also new PBS Stencil material too.

There are also some minor bugfixes based on recent changes too, which should solve some problems with the shaders loading and potentially some other things getting stuck.

[h2]New Features:[/h2]
- Integrated Matcap support from XiexeToon (requested by @Turk, @DAWKY, @WolfYears101, @RoxyBoxxy, @Elektrospy, @GearBell, @Snooper, @chemicalcrux, @Engi, @Robyn (QueenHidi), @Princess, @jeana, @orange and others)
-- To use, simply assign "Matcap" texture
-- MatcapTint has been integrated as well
-- Note that it's recommended to switch texture to at least Trillinear, so you get blending between different smoothness levels
- Added ColorMask support to XiexeToon (reuqested by same as above)
- Integrated secondary UV support from XiexeToon (requested by @Elektrospy and others)
-- You can switch to second set of UV's for Albedo, Normal, Metallic, Thickness, Occlusion and Emission Maps
- Added PBS Stencil material (requested by @Sharkmare)

- Filter materials now have stencil support and can be used with masked UI (requested by @Hayden)
-- Following materials were extended: Blur, Depth, Gamma, Grayscale, HSV, ChannelMatrix, Invert, LUT, Pixelate, Posterize, Refract and Threshold

- Added internal build process to automatically prepare newly compiled shaders for upload

[h2]Tweaks:[/h2]
- Increased number of parallel record preprocessing jobs and upload finalization jobs, to reduce delays when finishing uploads
- Rig component inspector actions are now localizable

- Merged Korean locale updates by @MirPASEC
- Merged Esperanto, Japanese and Chinese locale additions and tweaks by @Melnus
- Merged Czech locale additions by @rampa_3 (UTC +1, DST UTC +2)

[h2]Bugfixes:[/h2]
- Fixed invalid shader variant comparison, causing shader variants to not be scheduled or loaded properly when there's same variant for a different platform already computed (reported by @AshtonSparx and @Rue Shejn | Artist 3D)
- Fixed exceptions in StaticAssetProviders when they have been disposed while still running a background update (found in report from @marsmaantje and @chemicalcrux)
- Fixed Blur material ignoring Offset/Scale of the SpreadMagnitudeTexture (reported by @chemicalcrux)
- Fixed Pixelate material ignoring Offset/Scale of the ResolutionMagnitudeTexture
- Fixed exception when searching for generic base class with invalid input (found in log from @chemicalcrux)
- Fixed "Cleanup bone colliders" on Rig removing whole Slots on Rigs where the bones aren't separate objects (reported by @Medra)

2021.1.21.1068 - External inventory links, improved shader asset system, fixes

Sorry for fewer builds lately! I'm still trying to find good ways to ramp up development speed, but there's also a lot of design work, particularly on the desktop mode, that doesn't yet translate into code. There were trouble with the cloud recently as well that took a good chunk of time to find the root cause, but good news is that it's now running smoother and is more robust, so the same thing won't happen again and we have some good new tools for diagnosing any future incidents!

There's a big change in the shader system in this build, I've finally transitioned it fully onto the asset variant system, rather than using its own system for distributing and loading. This simplifies lots of things on my end, it's done in part as preparation for a bunch of the shader additions requests, because it removes a lot of tedious manual work whenever publishing shader updates. It makes the system more efficient too (local caching of data) and eliminates a bunch of bugs! Some of them even related to general asset downloading/loading.

There are a few other small additions, you can now easily share inventory folders via external link - just grab the inventory link in Neos, open context menu and click "Copy Link" then paste it anywhere you want! If anyone copies and pastes it into Neos, it'll pop up the inventory link item.

I'll have more stuff for you soon, some of the stuff in this build is laying a bit of groundwork for it, so keep tuned!

[h2]New Features:[/h2]
- Fully transitioned Shader assets to the general asset variant system, rather than using specialized version
-- Shader assets are now loaded directly from regular assets (neosdb:// instead of special key-word URLs) with the cloud generating metadata and variants
-- Shader metadata is now cached locally, rather than fetched every time, reducing load time and bandwidth usage
-- Variants are downloaded with the same pathway as rest of assets and can use the CDN for faster downloads
-- It is now easier to update shaders and add new features to them, as large parts of the manual update and upload process are now gone
-- Note that some shaders might take a bit to load (usually within a minute) if you're the first person requesting particular variant for any freshly compiled shader
- Added MaterialAssetMetadata (under Assets/Utility) which provides metadata about a material asset (current variant ID and whether it's waiting for apply)
-- This information is now also show in the inspector by default
- Added DefaultAudioDeviceIndex to AudioSettingSync, for controlling the default audio device
- Added "Copy Link" context menu option to InventoryLinks, which will copy URL to the clipboard that can be shared outside of Neos (requested by @GearBell with suggestion from @chemicalcrux)
- You can now import neosrec:// URL's that represent either objects or directories (inventory links) by simply pasting them into Neos

[h2]Optimizations:[/h2]
- Android builds will no longer download original asset and try to compute metadata locally when it's not computed on the cloud, instead waiting for the cloud computation to finish
-- This should significantly reduce CPU, memory and bandwidth usage on mobile
- Asset load requests are now done from background threads to reduce potential hitches / framerate slowdown when loading static assets

[h2]Tweaks:[/h2]
- Added protection against invalid cloud API usage pattern when fetching unread messages, causing severe database load and degradation of the cloud service performance
- Added protection against session NAT punchthrough information rapidly flipping between two remote addresses for the NAT punchtrough service
-- If you have issues people connecting to your or your headless, please check your network. The session needs to be accessible only from a single IP and port combination and you can't use the same custom session ID for multiple sessions, otherwise you'll have connectivity problems
- Added internal mechanism for repairing storage space usage for accounts that ended up over their quota and deleted items afterwards (if you're having trouble with usage getting stuck, you can request a team member to run this repair for you, ideally Shifty)
- Added internal diagnostics for correlating API usage to database load to help diagnose cloud service problems
- Added asset caching to the asset variant processing system, reducing bandwidth usage and time required to compute the asset metadata and multiple variants
-- This is particularly useful for the shader variants, as there's lots of individual tiny variants, while the asset file is much bigger
- Added timeout (15 seconds) for headset presence sensor changes to prevent rapid changing from away to online when the sensor is not working properly (based on report by @Coffee | Programmer)
-- This is set to prefer the user being present in the headset. In case of rapid flipping, Neos will report that the user is constantly in the headset. This is done so also in cases of malfunction when the headset is on the head so some interactions don't get blocked
- Audio device selection dialog is now more general
-- Updated the labels to be more general instead specifically microphone
-- It now exports the selected audio device through SelectedDeviceIndex property, rather than setting directly
- AlphaClip property on XiexeToonMaterial now starts at 0.5 by default (based on suggestion by @chemicalcrux)
- Removed obsolete DefaultAudioInputDeviceSelector

- Merged Icelandic locale additions by @Nammi, with commit merge conflicts resolved by @かず (kazu / GitHub: kazu0617)
- Merged Japanese, Esperanto and Chinese locale additions by @Melnus
- Merged Korean locale additions and fixes by @LUA
- Merged Spanish locale tweaks by @Ruzert
- Merged Czech locale additions by @rampa_3 (UTC +1, DST UTC +2)
- Merged Russian locale additions by @Shadow Panther [RU/EN, UTC+3]

[h2]Bugfixes:[/h2]
- Fixed pathological cases of database queries costing several orders of magnitude more throughput than they should, resulting in severely degraded cloud service
- Fixed cloud API responding with 500 (internal server error) instead of 429 (too many requests) in case of heavy load, resulting in client retry logic not being properly triggered and requests failing, rather than just taking longer
- Fixed account bans not taking immediate effect if the user is still logged in
- Fixed gather jobs with unsupported schemes getting stuck in the background, preventing other gahter jobs from starting in the queue
- Fixed asset gathering sometimes using incomplete or empty files on failure as the gathered asset
-- This fixes certain cases of assets being corrupt (e.g. video files being only partially loaded) or not loading at all (e.g. shaders, meshes and so on)
- Added zero file size check when loading assets and their variants, forcing the system to re-gather the asset in case it's corrupted
- Added guards to exceptions when loading shader variants, so they're properly logged and null shader is used and the material doesn't get stuck on the pink error material
- Fixed being able to create invalid overloads of FireOnChange node with invalid generic arguments, causing the node (and potentially other things) to break (based on report by @Psychpsyo)
- Fixed internal record cache ending up with two duplicates of particular record when an item is saved through the inventory
-- This fixes item remaining visible in the UI after being deleted (reported by @chemicalcrux, @H3BO3, @Toxic_Cookie, @Hayden, @Shifty | Quality Control Lead, @epicEaston197 and @ProbablePrime)
- Fixed incorrect check of whether particular locomotion module can be used or not, resulting in UI (context menu) not graying out locomotion modes that the user is not allowed to use (reported by @GearBell)