1. Neos VR
  2. News

Neos VR News

2020.9.23.1035 - ColliderUserTracker, SkinnedMesh optimization, User Silencing

Starting to work on the optimizations, here are a few initial bits! Added ColliderUserTracker component which I wanted to implement for a while, it tracks all the users in a collider (trigger) for you, which can be used to easily setup things like doors, culling zones and more!

Also made change for SkinnedMeshRenderer, which now avoids constantly recomputing bounds (it's pretty much only done during import auto-sizing process unless you re-enable it manually), which provided a pretty nice boost in testing.

This build also has a bunch of changes to Neos Classroom, a spin-off version used for education. I'm working on making new Quest build for that as well, so once that's done there will be a new Quest build as well.

[h2]New Features:[/h2]
- Added ColliderUserTracker (under Physics/Utility), which automatically tracks if any users are inside given trigger volume
-- It outputs "IsLocalUserInside" and "IsAnyUserInside" booleans for convenient use as well
-- It's based on physics system events and highly efficient as result, can be used to setup events, animations (e.g. doors opening), culling volumes and so on
- Added ability to Silence users in the session (muting them globally for everyone) (based on request by @Karel | CEO for Neos Classroom and others before)
-- Also added "AllowSilence" permission to UserPermissions. By default it inherits permission from "AllowKick"
- Added ability for sessions to be assigned a "Universe ID", which effectively separates all public (and private) lists from all others (based on request by @Karel | CEO for Neos Classroom)
-- The sessions with assigned UniverseID will show up in listing only if explicitly requested. This can be used to separate various business/educational sessions
- Added simple automated benchmarking mode through -Bench commandline argument
-- This will load the world, wait 30 seconds, then capture performance data for 30 seconds and shutdown
-- Captured performance data is stored in a "Bench" folder, currently as CSV file
- Added EnumToInt node, which converts enum value to its corresponding integer value
-- For HttpStatusCode enum this is the numeric value of the actual code (requested by @ProbablePrime and @Bitman | PolyLogiX Studio)

[h2]Neos Classroom Additions/Tweaks:[/h2] (requested by @Karel | CEO)
- Added ability to use a remote session key with Neos Classroom (add remoteSessionKey entry to the config), allowing the sessions to be joiend over the internet rather than just on LAN
- Added ability to toggle user voice on individual users
- Added ability for students to "Raise their hand"
- Added display number of joined students
- Enabled usernames above heads
- Fixed loading of the device name from the Neos Classroom config and not remembering the one saved

[h2]Optimizations:[/h2]
- Added "Compute Realtime Bounds" option to SkinnedMeshRenderer, which allows toggling whether bounding box is being recomputed every frame from the deformed mesh
-- This is now off by default, which resulted 25% performance boost in a test scenario with empty world and a dozen copies of my avatar
-- As a side effect, SkinnedMeshRenderers are now not sources of bounds (I might add simpler and less accurate on-demand method)
-- If you're heavily deforming or distorting the rig, you might see it popping invisible, you might need to re-enable this in such cases, but it's heavily not recommended to do so unless absolutely necessary
-- The option is temporary enabled during model import for accurate auto-sizing
- Added memory pooling when requesting session information to avoid some memory allocations
Tweaks:
- World browser will now link active session information locally for non-public worlds if they're owned by the user hosting it, rather than create a separate entry for it
- Dynamic variable node labels now contain the type of the variable, making it easier to tell which type they operate on (based on feedback by @Hayden (PolyLogiX - ZyroDesign))
- Lowered default Max User limit to 16 (requested by @Karel | CEO)
- Marked gizmos as not being locomotion grippable, preventing users from grabbing onto them by accident when gripping on anything is enabled (based on feedback by @GearBell, @Kal and @Turk )
- Slot gizmo options will no longer accept physical touch (based on feedback by @GearBell, @Kal and @Turk )
- Added "Slot" and "User" dynamic variable generic presets to the LogiX node menu (based on feedback by @Turk)
- Some small security improvements for inventory
- Merged French locale fixes by @FreakyWaves Music and @Archer
- Merged new/updated British English locale strings and English fixes by @Enverex
- Merged new/updated Finnish locale strings by @Napo
- Merged Korean locale fixes by @MirPASEC

[h2]Bugfixes:[/h2]
- Fixed AlwaysOnFacetModule breaking with multiple children (based on report by @Alex from Alaska)
- Fixed MultiSlerp node showing as "Multi Lerp" (reported by @3x1t_5tyl3)
- Fixed component attacher "Back" button not returning to the actual previous folder when generic component type selector is opened (based on report by @ProbablePrime)

2020.9.21.475 - Dynamic Variable system matures and LogiX bindings, bugfixes

The dynamic variable system is now maturing and ready for proper use! Added LogiX bindings to make it easy to integrate it into your interactive setups as well as versions of the components for reference dynamic variables.

Also adding initial Finnish and French translations from community contributions! The user search has been fixed as well as some shaders (like fog box volume rendering through).

[h2]New Features:[/h2]
- Added LogiX nodes to work with the dynamic variable spaces (under Variables). Same syntax as with components applies.
-- DynamicVariableInput - will link up with dynamic variable in the hierarchy the node is in (meaning you need to pack first to work). Will notify when the variable value changes, RECOMMENDED to use when possible!
-- ReadDynamicVariable - reads dynamic variable from a target point in hierarchy, use for dynamic lookups, won't notify when variable changes
-- WriteDynamicVariable - write a value to existing dynamic variable at some target point in hierarchy
-- CreateDynamicVariable - will create backing storage for a dynamic variable if it does not exist
-- WriteOrCreateDynamicVariable - will create backing storage if it doesn't exist or just write a new value
-- DeleteDynamicVariable - will remove all backing storage components for given dynamic variable

- Added DynamicReferenceVariable - has storage for a dynamic variable that's a reference to an object
- Added DynamicReferenceVariableReset - analogous to the value reset, but for references
- Added DynamicReference - uses external reference as backing storage for reference dynamic variable (analogous to DynamicField)
- Added DynamicReferenceVariableDriver - drives a target reference from a dynamic variable (no backing storage)
- Added support for generic node presets in the node browser for common types (this allows creating nodes like DynamicImpulseReceiver from common types directly from the menu)
- Added initial Finnish (fi) translation strings by @AdmiralSoap
- Added initial French (fr) translation strings by @Archer

[h2]Tweaks:[/h2]
- Merged German locale improvements by Schwefelhexafluorid (GitHub handle, not sure what the Discord one is, sorry!)
- Merged Turkish MMC strings by @Blaze
- Merged Esperanto, Japanese and Chinese locale fixes from @Melnus
- LogiX variable nodes were moved to "Variables/Storage"
- Added French pluralizer (requested by @Archer)
- Renamed DynamicVariable to DynamicValueVariable
- Renamed DynamicVariableReset to DynamicValueVariableReset
- Renamed DynamicVariableDriver to DynamicValueVariableDriver

[h2]Bugfixes:[/h2]
- Fixed DynamicVariableReset potentially resetting dynamic variable with no backing storage, causing inconsistent behavior
- Fixed user search on the Contacts screen not showing any newly registered users after recent changes to API sanitization (reported by @Kulza#8623 and @MattyK through @Shifty | Quality Control Lead)
- Fixed FogBoxVolume in Worldspace mode rendering through everything, even if the boundaries of the volume are obscured (discovered with @Rue Shejn | Artist 3D)
- Fixed PBS Displace Metallic/Transparent in AlphaBlend mode not casing properly displaced shadows (discovered with @Aegis_Wolf | Art Director)

2020.9.19.217 - Fixed lip tracking not working, British English and tweaks

Just a small patch, a few additions and tweaks. Compatible with current build, no need to update immediatelly if you're not affected by the issues.

New Features:
- Added British English locale by @Nammi (this only overrides certain strings with British English equivalents)
- Added MMC translation strings by @ProbablePrime (note that these are temporary for the MMC and will be removed after the contest ends)
- Added Japanese, Chinese and Esperanto translations for the MMC strings by @Melnus

Tweaks:
- Userspace now has "World" dynamic variable space as well (based on feedback from @Alex from Alaska)
- Categorized NoDestroyUndo under Transform/Tagging (requested by @Alex from Alaska)

Bugfixes:
- Fixed Lip tracking not correctly initializing in latest build (reported by @umbran)

Neos is now available in 9 languages! Dynamic Variable System ready to use.

Hello and welcome back to the Neos Weekly Update!

This week we thank all of our wonderful translators who’ve been working hard this week! Thanks to them Neos is now available in 9 different languages! We’ve got some more technical stuff in this update so check it out below as well.



[h2]Thank you, Translators![/h2]
The Neos UI is now available in multiple languages! It’s been a long-requested feature to add translations to the UI and with it now being implemented, we’ve seen a large number of community members contributing translations of Neos into other languages.

We haven’t expected to see this many so soon, but we’re really excited by your enthusiasm in helping to make Neos more comfortable for non-native English speakers. As a small thank you, we’ll be giving everyone who contributed a 25 GB bump in storage.

On our official Discord we also have a new Translators role, so we can notify whenever there are new strings to be translated. If you’d like the role, just ask a team member to assign it to you! We’d also like to shout out to all of the individuals involved in helping with this project!

A special thanks goes out to Orange for Japanese, Melnus for Chinese and Esperanto, Nammi for Icelandic and British English, MR Alex and Avunia for German, BlazeVR for Turkish, MirPasec, LUA and R3C0D3r for Korean and of course, a thanks to Frooxius for providing Czech! You can see a full list of contributors on the official GitHub repository.

We have also approved temporary addition of Metaverse Maker Contest strings by ProbablePrime, which will make the voting UI of this community-held contest available in different languages. However those will be removed once the competition is over.

[previewyoutube][/previewyoutube]

[h2]Stabilizing the dynamic variable system[/h2]
The dynamic variable system was originally introduced for the new World UI, but it has been designed for general use. However since we weren’t fully settled on some parts of its design, we have recommended to be careful with its usage due to potential breaking changes.

This week we have finalized those parts and the system should now be ready! One of the major additions is the ability to directly bind variable spaces by their name. This allows variables to link up with a particular space in their parent hierarchy, even if there’s a closer DynamicVariableSpace to them.

Each world is now also setup with a space named “World” at the root and each user with one called “User”, which allows for convenient scoping of variables within each user or within the whole world.

To achieve this linking, we have reserved all Unicode symbols and punctuation, except spaces, periods and underscores for a custom syntax. If you used those symbols in your variable names then you’ll need to change them, but otherwise your existing setups will be unaffected.

If you want a variable to bind to a particular space, simply prefix it with the name of the space and a forward slash, like “User/Health” for example. We’ll keep extending the syntax in the future to allow for things like optional bindings, binding multiple names and potentially more complex pattern matching.

[previewyoutube][/previewyoutube]

We have also added LogiX nodes to work with the new system, to greatly simplify and modularize setups. You can implicitly use dynamic variables as inputs. The system will automatically link up with the variable and trigger changes whenever the variable changes. This process is designed to be highly efficient and avoid expensive look-ups.

Other nodes allow to dynamically read variables from a target hierarchy and write them back. For the variables to be readable or writable, there needs to be a backing storage in the target hierarchy, for example the DynamicVariable component. However you can also use WriteOrCreateDynamicVariable node which will create this backing storage for you if it doesn’t exist.

We hope that this new system will open up a lot more efficient and flexible approaches to building interactive content in Neos and we can’t wait to see what you’ll make with it! If you run into any issues or problems, please let us know!

[h2]Sampling Color in LogiX, improving localization system and more[/h2]
As usual we have made a variety of small additions, tweaks and bugfixes to Neos over the week. Notably there is now a new LogiX node “Sample Color”, which lets you sample a visible color from a point and direction in the world, like a small color probe. Note that this is a relatively expensive operation as it renders a very tiny image of the scene and should be used only sparingly.

As part of the improvements to the new localization system we have also made contributions to the MessageFormat.NET library which implements the ICU MessageFormat syntax. Its simplified plural formatter has been replaced with a proper implementation of the ICU standard.

This ensures that the printed numbers can be grammatically correct depending on the language and allows one to one porting of the proper pluralization algorithms defined in Unicode CLDR. For example in English when decimal numbers are visibly printed, the nouns will be pluralized correctly: “1.0 items” instead of “1.0 item”.

We have also added several more pluralizers to increase the coverage of the languages and made some other additions and improvements. If you’d like to use the library with those improvements for your own project, you can get our fork here at GitHub.

[h2]Community Highlights[/h2]

[h3]Updated Kinect Tracking Driver by Groxxy[/h3]
Groxxy has brought us an updated version of the Kinect tracking drivers which includes support for the 11 point tracking in Neos! It does so by emulating 8 tracking points, which is an improvement from the usual 3 reserved for hips and feet. Now the Kinect software can capture elbows, chest, knees as well as hips and feet for a true full-body tracking experience and much more realistic avatars! Thank you Groxxy!

[previewyoutube][/previewyoutube]

[h3]Everyone working on MMC creations![/h3]
You are all working so hard, that you all deserve a huge shoutout from the Neos team! Neos team members who are not judges have been able to visit some of your worlds while you’re working, and we know you’re giving it your all! Only 10 days left until the end of the MMC! Keep going, everyone!



[h2]What’s Next?[/h2]
Our main goal right now are optimizations and related features for Neos. We have started investigation into upgrading to BEPUv2 and other optimizations, but ran into some initial snags (check out the #devlog channel on Discord for details).

However there are dozens of different optimizations planned, some major and minor, with more to be discovered as we keep profiling and finding bottlenecks, so Neos should get progressively smoother as time goes!

Thank you again for reading the Neos Weekly Update! We want to thank our Patrons for bringing Neos up to $9000 a month this past week. This project would not be able to survive without you!

2020.9.17.639 - Named Dynamic Variable Spaces, tweaks and bugfixes

Sorry for smallish build again, but here are some new Dynamic Variable Space goodies! I've finally settled on some implementation details, more stuff coming for them soon (mainly LogiX bindings). Some more small additions, tweaks and bugfixes.

[h2]New Features:[/h2]
- Added support for named dynamic variable spaces, allowing variables to selectively link up with a particular space
-- DynamicVariableSpace now has SpaceName property. Changing this property is relatively expensive operation and recommended to setup only once
-- It also has "OnlyDirectBinding" property. When enabled, variables won't be bound to this space unless they specify it by name (meaning anonymous variables will go through)
-- You cannot use punctuation and symbols in the variable or space name except for ., _ and (space), others are reserved for future syntax. It's recommended to stick to latin letters and digits, but most Unicode letters will work
-- Variable name can specify binding to particular space using following syntax: space name/variable name. It will bind to the nearest parent space with given name. Any other spaces in the way will be ignored
-- Only direct linking with particular space name is supported right now, more will come as needed (e.g. optional preference, multiple names, ignoring specific names, potential multi-level linking)
-- When no space is specified, it will link nearest variable space with any name (including none)

[h2]Tweaks:[/h2]
- Userspace dash now has "Dash" variable space, which is shared across all screens the title header (you can use it to interlink your facets)
- Each spawned user is now setup with "User" dynamic variable space, with only direct binding
- Each world is setup with "World" dynamic variable space at the root slot, with only direct binding (existing worlds are auto-upgraded)
- Exposed "SetActive" on DataPreset as impulse target to LogiX (based on discussion with @ProbablePrime)
- Merged additions fixes for Japanese locale from @orange and @Melnus
- Merged additions for Chinese and Esperanto locales by @Melnus
- Merged Turkish and English locale fixes from @Blaze

[h2]Bugfixes:[/h2]
- Fixed BipedRig "Detect Right hand" incorrectly finding left hand fingers when used on a full body rig
- Fixed component lookup in parents ignoring the components on the root slot
- Added fallback to MessageFormat.NET for cultures not supported on given platform, defaulting to invariant culture (based on report by @Melnus)
- Fixed the set null button in Inspector not working for delegates (reported by @ProbablePrime)