1. Neos VR
  2. News

Neos VR News

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)

Interview with Metamovie crew, noise supression with RNNoise, desktop progress

Hello everyone and welcome to another weekly update!

As the work is ramping up on the proper desktop support, the first fruits of this process are starting to arrive in forms of some related features. In the latest build the view and ear position can now be overridden for the user, allowing you to create VR 3rd person modes, avatars with custom neck models or for the streamer camera to render audio from its viewpoint for better footage.

We have also integrated the open source RNNoise library, which uses recurrent neural networks to filter out noise from your microphone, greatly improving the quality of everyone’s voice, while not depending on RTX cards and using very little CPU.

On this Friday we’ve also done the first of our live interview streams, with 21 questions for Jason Moore, the director of the Metamovie project and two of the actors: Nicole Rigo and Kenneth Rougaeu. If you missed the livestream, you can check it out below, it’s definitely worth a watch.

The cloud infrastructure has received some major optimizations as well, reducing the cost of the services while preserving the same functionality, ensuring that it scales even better with more users and gives us more headroom to improve functionality.



[h2]Interview with director Jason Moore and Metamovie actors[/h2]
This week on the weekly Neos Stream, Nexulan our Community Manager interviewed Jason Moore, director of Alien Rescue! Also accompanied by actress Nicole Rigo and actor Kenneth Rougaeu as he goes through a series of questions ranging from life, to how they got into showbiz and doing interactive film through VR.

If you missed the interview, the recording is certainly worth a watch as you can learn quite a lot about the history behind the Metamovie project and the people behind it and hear some really fun behind the scenes stories.

Our plan is to do an interview stream like this every month, picking some of the prominent members and creators from the community. Follow us on Twitch if you haven’t already so you don’t miss our next stream and get a chance to ask questions live!

[previewyoutube][/previewyoutube]

[h2]First steps towards proper desktop support[/h2]
Large chunk of the work is now devoted to proper desktop support. It’s still mainly in the design phase, as we look for best ways to architect the system to ensure both high flexibility and longevity by making it easy to extend and maintain as part of the codebase.

We have quite a few systems crystalizing from this design work, with a few of them implemented already. One of the primary underlying mechanisms is the ability to dynamically switch between VR and screen mode without having to restart. In the latest public build the head output system has been extended and unified to support this.

When the screen view is active, a set of subsystems will be responsible for driving the positions of the head and hands instead of the VR device as well as handling the general interactions. Those are the parts that are still being heavily designed, but we have some good concepts coming up as well.

In particular we’re aiming to make the system highly modular, allowing for hybrid combinations. For example using mouse + keyboard interactions with VR headsets or VR devices with only a single controller, with the other hand being simulated and of course the full desktop mode with everything being simulated and controlled via mouse, keyboard, gamepad or a touchscreen.

If you’d like, you can check out the latest design notes below. There’s still a lot of work to be done and most of the system isn’t set in stone yet, so you can expect more things to take shape and fall in place as we go.



However with some of the underlying bits already implemented, there are some new features that you can already play with in the latest build even in VR.

[h2]Overriding user’s view and ears positions[/h2]
One of the first fruits of the additions for the desktop mode is the new ability to override where the user sees and hears from. This is needed for the desktop, as the view direction and position is driven by the code in particular world, rather than by the physical position of the user head. With features like third person we also need to decouple where the user's head is and where they see the scene from as well.

Thanks to these changes, you can now override the position of the user's root, view and ears in the latest build, even when in VR. This has a lot of cool practical (and some less) applications. We’ve already seen users use this to create VR third person modes, with the ability to put your viewpoint behind your avatar or making avatars with separable head that can be grabbed and moved away, taking the user’s viewpoint with it.

You could also use this to experiment with avatars where the viewpoint is driven by the avatar’s IK and neck model. This might be nauseating to a lot of users as their head motions won’t match 1:1, but it is an interesting way to experiment and create very unusual avatars.

For more practical uses, the streamer camera now has the ability to render audio from its viewpoint. When streaming or recording, this will make any spatialized audio have the correct position from the viewer’s point of view, at the cost of making it more confusing for the streamer.

In the future, we’ll build more VR functionality with this mechanism as well. For example this allows you to put your viewpoint outside of your avatar when playing an animation on the character or keep the user’s view stationary in the world while their avatar walks in the environment.

We hope that you’ll have a lot of fun using these new features, building even cooler avatars and applications with them and we look forward to bringing you more cool features like this as we continue to work on the desktop mode.

[h2]Eliminating background microphone noise with RNNoise[/h2]
One of the smaller, but impactful additions this week was integration of the RNNoise library for filtering out noise from the microphone input. This open source library uses recurrent neural networks trained on a large dataset (6.4 GB) of noise data and is very effective at isolating voice even from very noisy inputs, as well as other unwanted sounds like breathing, headset rattling, keyboard noises and so on.

Since this library runs purely on CPU, doesn’t require GPU/RTX and is very fast, the new noise suppression is now on by default for all users. This will help improve the overall quality of voice for both existing and new users, making the “jet engine with a microphone” a thing of the past. As we get more desktop users in the future with all kinds of different microphones, this will hopefully prove to be very handy.

If you’d prefer to use only noise-gating or external noise elimination, you can disable the library in the settings, but we’d recommend leaving it on for most users. Even for high quality microphones it’ll eliminate any unwanted background noise and make the recording sound cleaner.

[previewyoutube][/previewyoutube]

In typical Neos fashion, we have done a full integration of this library with our engine and its audio system, making it accessible for processing audio clips as well. If you’d have an audio clip you’d like cleaned up, you can now do so through the inspector with the other audio processing options.

Since we couldn’t find any C# wrapper for this library, we have created our own and published it as open source RNNoise.NET in case you’d like to get the library integrated with your own projects.

[h2]More optimizations for the cloud infrastructure[/h2]
Over the past week we’ve also spent some time analyzing the performance and cost of our cloud infrastructure, noticing some significant inefficiencies. While still manageable, looking for ways to reduce the cost is always important, ensuring the infrastructure scales with more incoming users.

We have made several major changes to the cloud architecture to eliminate those, while maintaining the same functionality. One of the major sources of unnecessary cost was our use of the geo redundant storage system for all our data. This storage system replicates all stored data to another data center in a different part of the world.

This replication is crucial to ensure durability in case of data center disaster (like flooding or fire), making sure there is a copy elsewhere, but the replication comes at cost of both bandwidth and storage. A lot of the operational data, like upload chunks, thumbnails, processing queues and static data are either temporary or unimportant, so paying this replication isn’t worth it.

To mitigate this, we split the storage system into three parts. The original geo-replicated storage for any data that needs to be durable - primarily your assets (items, worlds), transaction data (those are also backed up regularly on top of the geo-replication) and such.

For any operational or unimportant data, we use low redundancy accounts. Those are much cheaper, but also faster, since they’re backed by SSDs instead of magnetic drives. They have higher storage cost, but much lower operation cost. Since the operational data is stored only briefly, but is heavily operated on, this is both faster and cheaper.

Some other parts of the infrastructure were optimized as well. We switched to the Microsoft CDN instead of Akamai, as it completely eliminates the cost of transferring data from the data center to the CDN (in addition for the CDN bandwidth) and gives us more statistics and control.

With a few smaller additions and adjustments, this has already dropped the cost significantly and improved the scalability further. We’ll keep monitoring the usage and make any changes, so we can ensure the cloud services keep running smoothly and that we have enough headroom to keep improving its functionality - for example by introducing a proper full text search service.

The sudden surge of users at New Year’s has more than quadrupled the load on the infrastructure and got us some good data on how it scales, what works well and what could use more optimization.

[h2]Community Highlights[/h2]
[h3]Pedal to the metal - new vehicle system by Lucasro7 and Gearbell[/h3]
Man have things been taking off! As the pedal is pressed to the meddle, users in Neos have been going wild with vehicles! We have hover cars, monocycles, motorcycles and honkocycles (with feet flaps included).

[previewyoutube][/previewyoutube]

Thanks to Lucasro7 for making the system and Gearbell for the visual/audio aesthetics. Aegis, our art director even made a full on race track with a vertical loop. The vehicles automatically stick to the ground so you can ride through the loop if you keep up the speed!

All the vehicle craze has kicked off AGRA as well, a Racing League made specifically for driving hover vehicles to compete against each other.

If you’d like to join on the fun, there is a new community Discord for vehicle enthusiasts in Neos. Happy Racing Folks!



[h3]Maze Chapter 2 by InnocentThief[/h3]
Another wonderful time of bewilderment and puzzling abound, InnocentThief has brought us a brand new puzzle map! This being the second part, it comes with some nice nature aesthetics and a more open feel as you get lost in the map, solve some puzzles and figure out what you need to survive the experience.



[h3]Winter Lake Cabin by Valagrant[/h3]
Here comes a map by Valagrant who brings a classic map that many of you might recognize from another platform! It’s the Winter Lake Cabin, a cozy little nook on the side of the lake as you look out and gander at the moon in the somber quiet night. Bring a couple friends and warm up by the fire, or hop inside and make some hot cocoa! Good Job Valagrant!



[h2]What’s Next & updated roadmap[/h2]
For the week ahead, our main focus is going to be the desktop mode. There are still more parts of the system to be designed, but we might get enough implemented for a minimal usable version, at least for being able to move around, without too many interactions. There might be more as well, but at this point it’s hard to predict.

We’ll keep the legacy debug screen mode in for as long as we can, so you can keep using it for building and testing if you already have been. Some small things will likely break (or already have) as we overhaul the systems, but generally it should still work. We’re actually using it ourselves for testing the screen mode, as it technically acts just as another VR device, allowing us to toggle between the legacy screen and the proper screen mode on the fly.

We have also updated our roadmap on the GitHub, which gives you a rough idea of what major features are coming and what state they’re in. Note that this gives just a rough state of things and the order of items on the roadmap doesn’t determine the order they’ll be implemented in. Our approach is to focus on one major feature at the time and switch focus as necessary, whether dictated by the current needs or just to shake things up.

Many of the smaller additions, tweaks and bug fixes will happen along the way as usual as well. If you’d like to see a full list, you can check out the patch notes on Steam or official Discord to see all that has been done.

We hope that you had a fun week and as always, thank you for your support! Without you this project wouldn’t be going forward and improving every day. I’d also like to add a special thanks to everyone for their kind words of support from the Yearly Update. It is not easy to talk about the difficulties, even more so in public (particularly for me), but I really appreciate everyone’s kindness and positivity.

Thank you again and see you next week!

2021.1.17.998 - View/listener transform override, cloud optimizations and more

With the work starting to ramp up on the desktop mode, here are some first related fruits implemented thanks to underlying architectural changes and additions, particularly ability to override rendering root, view and ears (listener) transforms!

There are two main features built on top of this right now - one for avatars, giving you full control to create custom setups, override where the user "sees" and "hears" from or putting them out of the actual avatar body and easy ability to render all audio from viewpoint of the streamer camera, making the footage audio make more sense for viewers for any spatialized sources.

Another major thing that's more internal are some cloud infrastructure reorganizations and optimizations, mainly to reduce some inefficiencies to save costs and improve performance and scalability. There's some more to come as well as I continue to monitor the impact of the changes.

A bunch of other smaller additions, tweaks and bugfixes as well. There's bits of the proper desktop mode too, nothing usable yet though, but it's starting to take form. More to come soon!

[h2]New Features:[/h2]
- Added a mechanism to override the transform of user's root, view and "ears" for audio-visual output, while preserving their actual UserRoot in the world by assigning Slot references on the UserRoot component
-- Note that view should be used sparingly for VR users (if at all) as it will negate any actual head movement which will be dizzying to a lot of users. If you want to create "out of body" experience, override the root instead.
-- The view override can be put on the avatar's head so the view still moves with the head, but using the avatar's motions, but be careful with this as well, as the motion not being 1:1 can cause nausea as well. I STRONGLY discourage using this as standard feature of avatars for adjusting the view (even if subtle) and only recommend it for gimmick avatars and personal use
- Added AvatarUserRootOverrideAssigner (under Users/Common Avatar System) which allows overriding the root, view and ears from equipped avatar (requested by @GearBell, @Abysmal, @ProbablePrime, @Shifty | Quality Control Lead and @Hayden)
-- The component updates in realtime. You can set the Override target to null to disable or change it to a target object to dynamically assign a new target
- Added "Audio from camera viewpoint" setting to Interactive Camera dialog, which will render the audio from the camera's viewpoint (requested by @Nexulan | Community Manager and many users before (sorry I didn't keep a list! ;_;))
-- This can be useful for streams for spatialized audio to make it less confusing for viewers, at cost of making it more confusing for the streamer
- Added LookLeft, LookUp, LookRight and LookDown to EyeLinearDriver, which allows driving 0...1 directional values (e.g. blendshapes) based on where the eye is currently looking (based on request by @Groxxy the Eye-Puppeteer)
-- This can be used to drive extra blendshapes that morph the eye when it looks in particular directions
-- The response of the values can be controlled using the LookMultiply and LookPower fields
- Added "Extract Sides" audio processing option to the inspector, which removes the center channel from stereo/quad tracks
-- This can be used to remove vocals from music tracks which are typically centered in mono
- Added "Prefer Specular" to advanced model import settings, which will prefer the Specular variants of PBS materials when importing (requested by @Robyn (QueenHidi))
- Added Rect text input node (x, y, width, height)
-- This now also makes it possible to extract driver node or direct inputs for Rect values (based on report by @chemicalcrux)

[h2]Work-in-progress features:[/h2]
- Expanded Neos' input/output system to support two toggleable rendering outputs - VR and Screen, using "VR_Active" state that can be changed at any time (for testing purposes it's currently bound to the F8 key, but it's not in usable state yet)
- Unified Neos' head output system to remove duplicates and remove any deprecated versions to simplify the code and management
- Added "VR Active" state to user and corresponding node, which determines if the user is currently in VR mode or screen mode
-- Note that the legacy screen mode is treated as "VR" mode. This info will be useful as the proper desktop mode is fully implemented

[h2]Tweaks:[/h2]
- Redesigned part of cloud storage system architecture to utilize multiple differently configured storage services to reduce cost and optimize performance
-- Any operational data (file upload chunks, asset variant computations, thumbnails, status updates and related queue/table objects and their work items, generally anything that's ok if it's lost) is now using low-redundancy, low-latency and low-operation cost (backed by SSD's) storage systems to prevent extra costs with geo-redundant storage
-- Any permanently saved data (assets, records) are still using geo-redundant storage, to ensure durability even in case of data center disasters
- Reworked asset restore mechanism to run only at a single worker at the time and less frequently to avoid unecessary load on the cloud resources
- Removed obsolete session thumbnail extension mechanism, reducing some networking / Cloud API load
- When "Setup IK" in advanced import is disabled, the biped detection report will no longer be generated (based on report by @H3BO3 and @chemicalcrux)
- Upgraded CloudX dependencies and related libraries
- Upgraded to Unity 2019.4.18f1 (from 2019.4.17f1)

- Merged Esperanto, Japanese and Chinese locale updates by @Melnus
- Merged Korean locale update by @LUA
- Merged French locale update by @brodokk
- Merged Czech locale update by @rampa_3 (UTC +1, DST UTC +2)
- Merged Dutch locale update by @AnotherFoxGuy
- Merged Russian locale update by @Shadow Panther [RU/EN, UTC+3]

[h2]Bugfixes:[/h2]
- Improved Inventory and File Browser interaction security (based on report by @Komdog)
- Fixed cloud asset variant processing not deleting associated queue data blobs, resulting in increased costs
- Fixed errors in cloud asset dependency processing, preventing asset dependencies from being removed in cases where even after the removal, the user would still be over their quota limit, causing the storage usage to get stuck and resulting in delays in cloud processing (based on report by @DJNightmares)
- Added generic argument validation to ValueTag and ValueFieldProxy components (based on discovery by @Cyro)
- Added guard to exceptions in OnWorldSaved and OnFocusChanged world events, to prevent errors in those from crashing the entire world (based on report by @Epsilion)
- Fixed world object transfer mechanism trying to transfer already destroyed items, causing exceptions (based on report by @Epsilion)
- Grabbable configured with DestroyOnRelease will now clean itself up when pasted as well, to prevent from getting stuck (based on report by @Epsilion)
- Fixed LogiX tooltip throwing an exception when trying to extract driver node for unsupported datatypes (based on report by @chemicalcrux)
- Potentially fixed desktop view being incorrectly rotated when using Portait mode on a screen that's connected to integrated GPU (based on report by @Freyar)
- Fixed FocusWorld node being able to keep the user in the current world when impulsed every frame (reported by @Cyro)
- Added extra logging for headset presence status changes, to help diagnose issues when the headset disconnects (based on report by @Rue Shejn | Artist 3D)

2021.1.13.764 - RNNoise noise suppression integration, new cloud CDN, fixes

Just a small build today, but some important changes. A new major addition is integration of the RNNoise noise supression library! This library uses recurrent neural networks trained on large set of data, but runs purely on CPU and is quite fast (will run even in mobile devices), while being very good at cleaning up unwanted noises (check #devlog to see some examples and more info).

The library is on by default now for everyone, which should improve the general quality of voice for existing and new users, even with poor microphones or background noises and should come handy once there are more desktop users in the future, with varying microphones. You can turn it off in settings if you prefer not to use it (or use other solution).

I'm also making some changes to the cloud, I've been investigating some sources of increased cost and found a few things that should provide major improvements. We're switching to a new CDN service (Microsoft from Akamai) and there were some optimizations. Let me know if you notice any weirdness with downloading assets or things not loading.

There's a few other tweaks and bugfixes too. I've started poking around some internals of Neos that I haven't touched in a while, slowly preparing things for the desktop support, there's a small new bit in this build of it too, though not something you can use (yet)!

[h2]New Features:[/h2]
- Integrated RNNoise noise suppression library for eliminating audio noise using recurrent neural networks
-- This is now default on for microphone input to reduce any background noise, breathing and ensure good quality voice audio for all users (can be turned off in settings)
-- You can also use it to process any audio clips in Neos through the inspector using the new Denoise (RNNoise, optimized for voice at 48 kHz) option
-- The library runs purely on CPU, no GPU/RTX support required
--- Our fork of the library: https://github.com/Frooxius/rnnoise
--- Source of our .NET wrapper for the library: https://github.com/Frooxius/RNNoise.NET

- Added Stafing property to PhysicalLocomotion which allows controlling whether strafing with secondary is supported or not (requested by @Shifty | Quality Control Lead)
-- This respects the "Allow Strafing" setting by default

- Added OverlayLayer, similar to HiddenLayer, which separates objects into a layer that always renders on screen overlay
-- Note that this is for internal use only for the screen support, I strongly advise against using this yourself

[h2]Tweaks:[/h2]
- Moved to Microsoft Azure CDN from Akamai CDN
-- This is mostly internal change, which provides more diagnostics and reduces some cloud service costs.
- Added caching of asset metadata on the cloud API to heavily reduce database queries and improve response times
- Added total/completed/failed gather job counters to the debug dialog
- Neos account in Contacts will now always appear online as bot account
- Lowered default noise gate threshold thanks the new noise supression feature (I recommend tweaking your own, you might put it lower than it was before now if you have RNNoise on)

- Merged Japanese, Esperanto and Chinese locale updates by @Melnus
- Merged Korean locale update by @LUA
- Merged Japanese locale fixes and tweaks by @かず (kazu / GitHub: kazu0617)

[h2]Bugfixes:[/h2]
- Fixed exceptions in HapticPointMapper on headless (found in a log from @Medra)
- Added extra data model diagnostics to help diagnose some issues found in log from @Medra
- Fixed exception causing the session to crash when running permision system cleanups
-- This should fix random session disconnects reported by (@Hayden, logs provided by @Polaris (she/her))

2021.1.11.642 - Screenshot inventory auto-save, voice quality improvement, fixes

Hello everyone! Sorry for the lack of builds lately, I've been taking things a bit slow recently (and working on the yearly update), but I've now started on a bunch of things again and picking up the pace again. This build has a bunch of small additions, tweaks and fixes.

One major addition is ability to auto-save any screenshots to your inventory! If you're pack-rat like me, you can define an auto-save path and have every single screenshot (including ones others took that you save through the context menu)!

I've made some changes to help improve overall voice quality and also in cases when there's packet loss as well. There's more that can be done with that, but I'll see what difference do the current changes make too.

Anyway, I hope those changes and fixes help, I'll have more stuff coming soon!

[h2]New Features:[/h2]
- Added CloudUserInfo (under Cloud/Indicators) which will fetch cloud user information for given UserID (based on request by @Ryuvi | Technical Artist)
-- Currently provides Username, Registration Date and IconURL (can be fed directly to StaticTexture2D)
- Added IgnoreReverbZones property to AudioOutput, which will prevent any reverb zones from affecting the particular audio output (based on request by @GearBell)
- Added Auto-save screenshot path to Settings, which allows any taken or saved (through the context menu) screenshots to be automatically uploaded to your inventory
-- You only provide the directory path, name is taken from screenshot itself as usual. Several variables can be used in the name:
-- Time Taken: %day%, %month%, %year%, %second%, %minute%, %hour%, %day_name%, %month_name%, %day_name_en%, %month_nameen%
-- Session start time: same as above, but with session in front, e.g. %session_day%, %session_month% etc...
-- %location_name% - name of the world/session where it was taken
-- %neos_version% - version of Neos in which this photo was taken
-- Both forward and backward slashes work
-- E.g. VR Photos\%year%\%location_name%\%month_name% %day% would save screenshot under VR Photos\2021\Neos Hub\January 11
- Added internal event mechanism when records are saved. This will now make Inventory automatically pick up any items saved by other methods (e.g. the screenshot auto-saving) and refresh the UI

[h2]Tweaks:[/h2]
- Added handling for lost voice data packets, which will now fill in the missing audio data rather than skip it
-- This should improve voice quality for users with significant packet loss ratio (based on reports by @Zephyr.С, @Zane, @Rue Shejn | Artist 3D, @Hayden and others)
- Voice messages now ignore reverb zones (based on feedback by @GearBell, @Turk, @Lewis Snow | Lead Audio Engineer and @Earthmark)
- Video players now ignore reverb zones (based on feedback by @GearBell)
- OpusStream now uses maximum encoding complexity on PC (previously complexity 2 out of 10) to provide best audio quality. Mobile platforms still use 2 to conserve CPU usage
- Inventory/Message item spawn undo message is now localized
- AssetMetadata (photo, audio) now stores the host of the session where the asset is taken, access level of the session and whether the session is currently hidden from listing
-- This information is also indexed in the cloud when the asset is saved and will be searchable/filterable in the future
- Added NonHeadlessUserCount property to OnlineUserUserCount components
- The online user count facet now shows the total number of non-headless registered users instead of the total number of registered users and has the two numbers now swapped (the approximate number of all users is in parentheses now)
- Switched back to latest youtube-dl (2021.01.08) from youtube-dlc (2020.11.11-3)
- Merged Dutch locale additions by @AnotherFoxGuy
- Merged Japanese locale tweaks and fixes by kazu0617 and @Aesc
- Merged major Czech locale proofreading revision by @rampa_3 (UTC +1, DST UTC +2)
- Merged English locale fixes by @rampa_3 (UTC +1, DST UTC +2)
- Merged Korean locale fixes by @MirPASEC
- Merged Spanish locale additions and twaeks by @Ruzert

[h2]Optimizations:[/h2]
- Added type caching for user root components lookups, speeding up frequent lookups of certain components (e.g. for interactions, dynamic bones and more)
- Some small optimizations when fetching cloud user info

[h2]Bugfixes:[/h2]
- Fixed exception in cloud API when running a record search with invalid user or group
- Added exception logging for asynchronous stream decode tasks
- Added extra logging information for failed gather jobs to help diagnose failed loads (based on reprots by @Sykes, @Enverex, @oXoMaStErSoXo and others)
- Fixed asset variant processing system getting stuck due to temporary internet disconnect and not resuming once the connection is restored
- Fixed user root components potentially returning already destroyed components, resulting in various errors when those are attempted to be used
-- This should fix null reference exceptions with certain avatars and dynamic bones, causing those to break (reported by @GearBell, @Cataena and @Shifty | Quality Control Lead)
- NeowGlowCircle is now tolerant to having its drives unassigned, preventing exceptions when parts of the visual are missing
- Fixed exceptions when validating generic types when the type is null, causing certain behaviors to break (e.g. custom generic type selection) (reported by @Epsilion)
- Fixed model import breaking on models which require transform computation on the root node (e.g. animating the scene root, as poreted by @chemicalcrux)
- Fixed LinearMapper still clamping values even when Clamp is unchecked (reported by @Alex from Alaska)
- Fixed Undo action for spawning Inventory/Message item that contains multiple items undoing only a single item (reported by @Coffee | Programmer)
- Added exception guard to the online user stats fetching loop to prevent it from breaking (based on report by @Raith (CytraX))
- Fixed being able to trigger tooltip equip action when the user is child of the tooltip, causing odd behavior (reported by @Shifty | Quality Control Lead)