1. Neos VR
  2. News

Neos VR News

Contacts+ (contacts of contacts) session mode, cloud upgrades, haptics additions

Hello and welcome to another weekly update!

This week we had two major changes. One was Contacts+ mode for session access, prioritized based on popular community request and the other was a cloud infrastructure upgrade and series bug fixes, which came out of unexpected issues.

The haptics system introduced last week has also received numerous additions, tweaks and bugfixes, not only improving the bHaptics integration itself, but also enabling it for standard VR controllers, allowing you to use Haptic Volumes to create control haptics.



[h2]Contacts+ mode (Contacts of Contacts)[/h2]

Based on popular demand from the community, we have prioritized adding the “Contacts+” session access mode. Unlike the regular “Contacts” which allows only the contacts of the host to join the session, this one will allow users to join as long as any of their contacts are within the session.

This makes the sessions using this setting more accessible, removing the need to figure out who the host is and send them a friend request. It’s also particularly useful for headless sessions, where only a select few users can initially join the session (or only the owner), but once they’re in any contacts and their contacts can join.

Because we value privacy and security, we took special care with how this feature was implemented. Whenever a user joins, they are authenticated and verified, ensuring that people can’t join even if they somehow get the session’s ID or URL. If all of their contacts leave the session, they won’t be able to rejoin either.

At the same time the backend API is designed in a way to make it practically impossible to determine another user’s entire contact list. Obviously it is possible to tell if the user who just joined is someone’s contact, but anything beyond that (including checking any other user) isn’t accessible through the API.

[h2]Haptics framework improvements and additions[/h2]
Since we introduced the new haptics framework last week for the bHaptics vest, we have added multitude of new features, tweaks and bug fixes to it. Notably the system now works with VR controllers as well, allowing you to use Haptic Volumes to trigger haptics on user’s controllers and test how it works.

Both bHaptics and VR controller drivers now also interpret other sensations as well, including Pain, Temperature and Vibration. Since they’re vibro-tactile systems, those sensations are translated to vibrations (for example Pain will produce a pulsing sensation to simulate heartbeat), but once more haptic devices are supported they can interpret this information and create more accurate haptic responses.

We have also showcased the bHaptics integration in our official livestream this Friday. If you missed it, check out the recording below:

[previewyoutube][/previewyoutube]

[h2]Major SDK upgrade and bugfixes for the cloud backend[/h2]
Earlier this week we noticed some degradation with the cloud backend, particularly with the asset variant system that’s responsible for computing optimized versions of textures to reduce VRAM usage and loading times. The system got flooded with enormous amounts of duplicate jobs, leading the queue to grow to 8 million and progress very slowly, as the system threw invalid jobs one by one.

This discovery has led to a series of upgrades and bug fixes for the cloud backend. We moved to the v12 version of the Azure storage SDK’s, moving away from the deprecated v11 version. This required a large chunk of the code to be updated, as the API’s weren’t compatible with each other, but also provided a noticeable performance improvement.

The asset variant compute system was also improved and partly redesigned to prevent this pathological scenario from occuring again. The system will now prevent most duplicate jobs from being created in the first place, but even when they happen (as is possible with a highly concurrent system) it will discard them much faster than before.

We have fixed some other internal problems with the cloud service, which resulted in certain internal tasks failing (particularly with world/item synchronization). Those failures were compensated by another subsystem, but caused unnecessary processing and bloat, which is now removed.

Another part of the system that received some bug fixes was the NAT punchthrough and relay system, responsible for establishing real time session connections. If you’re using custom session IDs, they would be randomly rendered unjoinable. This behavior has now been fixed.

The relay system, which is used when connection cannot be established directly with NAT punchthrough now also performs several attempts to establish a connection, improving reliability of joining a session with more spotty connections.

With growing population, improving and upgrading the cloud backend is very important to ensure that everything keeps running smoothly and so we can reduce the internal cost. There are many more upgrades and improvements planned, but we’ll handle them as needed.

[h2]Regular Oculus Quest / Android builds[/h2]
Neos has had Oculus Quest builds available in early preview for Patreon supporters for a while, but they were typically seldom updated, as doing so required a lot of manual labor and would often be very behind the main PCVR versions on Steam.

Starting this week, we have automated the process of building and publishing the new APK’s for sideloading, making those builds always match the PCVR version. Currently PCVR is still our main priority and focus, but automating this part of the process will help bring more attention to them in the future as it will ease the development iteration process.

You can expect the Android builds to be typically updated within a day of publishing a regular PCVR build on the private android-preview branch on Steam, which can be obtained through the #android-testers channel in our official Discord.

[h2]Community Highlights[/h2]
Hey there everyone your friendly neighborhood Turk here this week to showcase what the community has made! This week we have Maps aplenty!

[h3]Ancient Temple[/h3]
A very old, somber temple brought to you by Enverex, from it’s nice aesthetics to it’s hidden temples, see if you can find the mysteries that are hidden within. See if you can find the special magic portal! Thanks Enverex!



[h3]Japanese Onsen[/h3]
A nice flavourful Onsen with some nice summer night atmosphere! Come on by, take a dip, appreciate some tranquility gardens, and watch some videos! Thanks Rhenium, GAWAWA, and Cid for the map! (Special Thanks to Vigilabo, Orange, lilhatategami for their object contributions)



[h3]Builders Dojo[/h3]
A wonderful world and concept set up by LosAngelesGraff! A Dojo for builders to build! Hosting the map daily, it’s an open world for people to make wonderful art pieces, creations, toys, or friends that get spread through the Neos Community! Thanks Graff!



[h3]Inverse Nebula[/h3]
Welcome to this canteen amongst the stairs, but inverted? A Casual RP Map made by DeliriousJax and Co. Where there are some scenic views to contemplate as you get a drink at the local Tavern. I hear it’s hosted by a Security Droid S-05 so you’ll feel plenty safe. Thanks S-05!



[h3]Breakdance[/h3]
Also we had another Dance Cypher hosted by the IDA this week! JJfxMultimedia, B-Botics and Charma and the Crew managed to bring Makoto from the Korean Dance Community over and dropped some sick moves! Good Dancing guys! If you want try to stop by sometime, they are open to having people stop by and dancing! Even I‘ve participated and it’s a blast!

https://twitter.com/i/status/1334915980963717122



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

This is everything for this week, if you’d like to know more about the smaller additions, tweaks and bug fixes you can always check out the patch notes on Steam or in the #neos-updates channel on our official Discord.

And as always, thank you for your support! Neos wouldn’t be the same metaverse without your help, awesome creations and being part of a great community!

2020.12.5.1396 - Fixed dash randomly breaking, particularly for new users

Another small patch, should fix the dash randomly breaking for some users, particularly when running the Welcome Guide.

Compatible with current build, no need to update if you're not experiencing any issues.

[h2]Bugfixes:[/h2]
- Fixed regression, where deactivated Tweens would sometimes break the state of the datamodel due to being destroyed too early
-- This fixes the Dash randomly breaking (reported by @Zure melk through @Shifty | Quality Control Lead)
- Added exception guard to OnActivated/OnDeactivated events, to prevent errors in the event code from corrupting the state of the data model (based on above issue)

2020.12.5.608 - Fixed Contacts+ worlds not showing up in the world listing

Just a quick patch for an issue I noticed with Contacts+, the build is compatible with the previous one.

[h2]Tweaks:[/h2]
- Merged Japanese, Esperanto and Chinese new Contacts+ strings by @Melnus

[h2]Bugfixes:[/h2]
- Fixed Contacts+ sessions not showing up in the World browser

2020.12.5.585 - Contacts+ mode, VisemeAnalyzer bugfixes (improves performance)

Contacts+ mode is now here based on popular demand! Sorry the build is otherwise smaller, it took most of the engineering time to implement it in a secure way. It ensures that the person joining is actually a contact of the other users in the session, but also avoids API abuse which would let others easily scan your contacts list.

A few important bugfixes too, particularly for VisemeAnalyzer randomly dropping back to local calculation (particularly on Headless servers), causing significant increase in CPU usage.

[h2]New Features:[/h2]
- Added Contacts+ (Contacts of Contacts) session access mode (requested by @Turk, @GearBell, @Zane, @DAWKY, @RoxyBoxxy, @Enverex, @DeliriousJax and many others before (I didn't keep a list, sorry :frowning: )))
-- This allows anyone to join the session, as long as any of their contacts are in the session as well
-- The implementation is designed to be minimally revealing about user's contacts, preventing abuse of the internal API that would allow someone to reconstruct another user's contact list
-- Internal enum name is "FriendsOfFriends" (e.g. for headless command)

[h2]Tweaks:[/h2]
- Add/remove member commands now accept the group ID (G-something) in addition to the group name (based on feedback by @Karel | CEO)
- Updated version number of the VoiceFacetPreset to ensure it upgrades to the new functionality for all users (reported by @Shifty | Quality Control Lead)
- Added 5 second delay between video load retry attempts when it fails
- When importing files/URL's, the input strings are now trimmed to avoid import errors due to extra spaces

- Merged Esperanto locale additions and tweaks by @yellowcrash10
- Merged Polish locale additions by @art0007i
- Merged German locale additions and tweaks by @Bluigi
- Merged Japanese locale tweaks by @Aesc

[h2]Bugfixes:[/h2]
- Tween will automatically finalize itself if the hierarchy it's on is deactivated
-- This should fix tiny badges as (re-)reported by @H3BO3, @Ukilop and @Shifty | Quality Control Lead
- Fixed VisemeAnalyzer switching to local analysis randomly when on a headless server or when a Linux user is present
-- This will help reduce CPU load and fix Linux users not seeing certain user's visemes (based on report by @Shifty | Quality Control Lead and @Hawk)
- Fixed Linux users not having their visemes computed locally and instead streaming "empty" visemes to other users
- Fixed video load retry-attempts not working when a playback engine is enforced, either implicitly or explicitly (based on a report by @Enverex)

2020.12.4.68 - Major cloud SDK upgrade and many bugfixes (inc. asset variants)

Sorry for a smaller build, I ended up going another rabbit hole investigating an issue in the cloud yesterday, that ended up with upgrading the whole cloud infrastructure to new Azure Storage SDK, moving away from the deprecated v11 to new v12 version. This was a major change as the API's aren't compatible, so I had to adjust a lot of existing code, but as bonus the cloud API should now be snappier and use fewer resources, as well as have access to latest features.

During the process I also discovered some long-standing bugs and pathological behavior which are now fixed. One of them that started this had to do with the asset variant system, which resulted in a flood of duplicate asset computation requests (it got to up to 8 million in the queue), which pretty much resulted in the whole system griding down and not processing much (it used to try 6 times to get a valid task and then the processor would wait 5 seconds. Since most of them were invalid, this made it go really REALLY slow).

The queue is now being processed rapidly (it's down to 2.7 million), you might still experience some delays with some assets not being processed and loading in original uncompressed versions, but I think it'll clear up within a day or two. The new system also has measures to prevent this from happening again and clearing any duplicate tasks significantly faster.

This build is compatible with previous one.

[h2]Tweaks:[/h2]
- Added new world category icons by @Coffee | Programmer
- Upgraded Azure storage & table SDK's to the new v12, moving away from the deprecated v11 API and reworked the cloud code onto this new API
-- This should provide some performance benefits for the cloud as well as get the latest bugfixes and features for future development
-- This is also major upgrade as a lot of code had to be adjusted. I have tested things thoroughly before pushing this fully live, but please watch out for any cloud weirdness
- Switched cloud queue message encoding to UTF-8 from Base64 with the new SDK, improving the cloud performance and reducing bandwidth/storage use
- Optimized cloud record preprocessing to reduce overall internal traffic with unecessarily frequent queue processing extensions
- Added a mechanism to prevent flood of duplicate asset variant tasks in the queue in the cloud, causing delays before assets actually get processed and wasting cloud performance
- AdminX now enforces UTF-8 encoding for the console input/output, fixing cases where non-ASCII characters would be displayed/processed incorrectly (based on report from @Karel | CEO)
- Removed MMC world category
- Upgraded to Unity 2019.4.16f1 (from 2019.4.15f1)

- Merged Swedish locale additions by @Swingly
- Merged Russian locale additions by @Shadow Panther [RU/EN, UTC+3]
- Merged Japanese, Esperanto and Chinese locale additions by @Melnus
- Merged Czech locale additions by @rampa_3 (UTC +1, DST UTC +2)
- Merged Korean locale additions by @MirPASEC

[h2]Bugfiixes:[/h2]
- Fixed asset variant processing falling severely behind when there's a flood of duplicate or invalid entries, causing the processing queue to grow faster than it's processeed, despite barely any assets being actually processsed
- Fixed asset variant system requesting invalid metadata type for Cubemaps when a variant is requested, but metadata isn't present
- Fixed cloud dependency removal tokens not being scheduled properly, causing some data not being validated or cleaned up
-- This is mostly internal bugfix, as the issue is compensated by other failsafe subsystems, but this should reduce some unecessary load and errors in cloud processing
- Fixed cloud queue system not deleting processed tasks from the queue properly due to task extension, causing a lot of unecessary reprocessing to occur
- Added generic argument validation to ButtonValueShift to prevent instantiating wrong type and causing crash (reported by @Komdog)