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)

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)


