1. Neos VR
  2. News

Neos VR News

2021.9.21.357 - Session crash fix, dynamic bone chain & skin mesh baking fixes

Hello everyone! Pushing a small patch with some important bugfixes, notably one causing a session crash, so it doesn't have to wait on other things.

Unfortunately it's not compatible with previous build since some binary encoding was changed. I've thrown in a few extra bugfixes for a good measure though!

[h2]Tweaks:[/h2]
- Merged Russian locale tweaks by @Shadow Panther [RU/EN, UTC+3]

[h2]Bugfixes:[/h2]
- Fixed exception in FocusManager when disposing world while there's an active focus or when the dispose happens in a network sync phase (found in a log from @Shadow Panther [RU/EN, UTC+3])
- Fixed encoding/decoding of Uri datatype in some cases causing corruption of the data stream, resulting in session crash (reported by @Shadow Panther [RU/EN, UTC+3], @josh fluffy the helpful husky, @jeana, @bigtin and @HentaiGames, GH #3048)
- Fixed DynamicBonePlayerColliders being ignored, resulting in custom dynamic player colliders not working properly (reported by @Shifty | Quality Control Lead, GH #3028)
- Fixed skinned meshes without any bones failing to bake to a static mesh (reported by @Aetoriz and @orange, GH #3020)

2021.9.20.1334 - World/Session thumbnail overrides, security improvements, fixes

Hello everyone! Sorry for lack of builds for past few days, been busy with more of the educational projects and some planning for other upcoming things, but here's a bunch more goodies.

Notably, there's now a mechanism to customize world thumbnails! You can either overide location where it's captured or provide a custom image. You can customize capture locations of session thumbnails too in the world.

Importantly there are also some security improvements. Particularly for the initial handshake that verifies identity of the users, to prevent cases of man-in-the-middle attacks impersonating another user, based on an excellent security report based on our new security policy (please check them here: https://github.com/Neos-Metaverse/NeosPublic/blob/master/.github/SECURITY.md).

We updated Assimp to the latest version as well, which sould bring a number of improvements for importing models. A number of bugs were fixes as well, notably haptic feedback not working from newly joined users in the session until they re-equip their avatar.

[h2]New Features:[/h2]
- Added WorldCaptureThumbailSource and SessionCaptureThumbnailSource which allow overriding the thumbnail capture locations when saving world and then generating session thumbnails (prevously requested by @Alex rainbowdashie and @epicEaston197, GH #1419)
-- If you have multiple a random active source is picked
-- For sessions, the sources are weighted by proximity of the users - ones with more users nearby will be preferred
-- You can add optional overlay texture that will be alpha-blended on top of the thumbnail
-- For saved world capture, you can optionally include users in the thumbnail by unchecking "ExcludeUsersInCapture"
- Added WorldTextureThumbnailSource which allows providing a custom thumbnail for saved worlds
Security:
- Reworked part of authentication mechanism when joining a session to prevent chances of man-in-the-middle attacks to impersonate another user (reported by @runtime, Moderation Ticket #687383)
- Disabled automatic Python script execution when importing .blend files to prevent potential security risk (reported by dmx, Moderation Ticket #537424, fixed by @Geenz | Graphics Programmer)
-- Please be careful when opening .blend files from unknown sources and take some caution when importing files from untrusted sources in general

[h2]Tweaks:[/h2]
- Upgraded Assimp to the latest version from upstream
-- This includes 152 commits with a number of bugfixes and improvements. You can see details here: https://github.com/Neos-Metaverse/assimp/pull/9
-- This might fix some files in some cases failing to import (reported by @Shadow Panther [RU/EN, UTC+3] and @DemonZLa GH #3036)
- Pressing the "X" button on the host access request dialog now fires "Ignored" impulse (requested by @kazu0617 Neos:kazu, GH #2881, implemented by @ProbablePrime | Docs)
- Avatar feet will now ignore lower body colliders on other avatar's feet if they're roughly vertically aligned with each other and similar sizes
-- This should fix avatar's feet moving up when two players are close to each other, without affecting the feet reacting to other player's hands or heads (based on reports by @AshtonSparx, @Shifty | Quality Control Lead, @Turk, @Snooper, @Sox and others, GH #2670, GH #676)
- TextureThumbanilSource is now ItemTextureThumbnailSource

- Added "Reset objects that are too far away" to ScaleObjectManager
-- This brings objects that have been moved too far away from the center closer
- Merged Korean locale additions by @MirPASEC
- Merged Japanese locale additions by @Aesc/あすく
- Merged Czech locale additions and fixes by @rampa_3 (UTC +1, DST UTC +2)
- Merged Russian locale additions by @Shadow Panther [RU/EN, UTC+3]
- Merged Finnish locale additions by @Toni Kat
- Merged English locale fixes by @Toni Kat

[h2]Optimizations:[/h2]
- Optimized conversions between UV and pixel coordinates for Bitmap2D

[h2]Bugfixes:[/h2]
- Fixed Neos trying to start playback on audio device that failed to initialize, resulting in a crash (based on report by @I'm Erin., @ProbablePrime | Docs, GH #2120)
-- The device should reinitialize now on the next attempt
- Baking meshes will no longer remove SimpleAwayIndicator if the bake is configured to not destroy the original (reported by @orange, GH #3038)
- ValueTextFormatDriver will no longer update if the Source and Target are the same (based on report by @Epsilion, @Psychpsyo, @Ukilop, GH #3037)
- Put a upper limit on how long a string formatted by ValueTextFormatDriver can get to avoid unbounded exponential growth (currently 262144, can be changed if needed, will later be more flexible/configurable with hard permissions)
- Fixed locomotion modules removed at certain points in the update loop resulting in LocomotionController breaking
-- This fixes locomotion module as well as context menus and other itneractions breaking when modules are installed from OnDone output of a Tween nodes (reported by @Zyzyl, @Jezithyr, @Wolfyx The Hybrid, GH #3035)
-- This also fixes similar issue with other setups (e.g. sample provided by @Espa)
- Fixed avatars of newly joined users in the session not triggering haptic feedback (reported by @infotron and @Shifty | Quality Control Lead, GH #3034)

2021.9.16.105 - Baking rigged meshes into static, optimizations, tweaks

Hello everyone! Another small build, but hopefully with more goodies! Neos now internally supports transforming vertices on a rigged mesh in its own MeshX structure, which allowed me to implement a few fancy features!

Notably SkinnedMeshRenderer has a new "Explicit" bounds mode, which can be useful if you want to specify a bounding box. There's new helper functions to compute/expand those bounds from its current pose.

You can also bake rigged meshes into a static mesh now! The Glue tooltip will do that as well when baking meshes (unless in Skinned Mesh Mode), which should produce more expected behavior, rather than the mesh being baked in its default pose.

There's some small optimizations as well and few tweaks.

[h2]New Features:[/h2]
- Added support for Explicit SkinnedMeshRenderer bounds
-- You can specify the local bounds on the SkinnedMeshRenderer using the ExplicitLocalBounds and switch the BoundsComputeMethod to "Explicit"
-- This is useful if you know the range of motion of the skinned mesh renderer, e.g. when animated
-- It's STRONGLY discouraged to set this to really large bounds, as that will result in the mesh always being processed when it shouldn't and poor performance. Use the other compute methods instead
- Added "Compute explicit bounds from current pose" on SkinnedMeshRenderer, which will compute an explicit bounding box from the current pose of the mesh
- Added "Extend explicit bounds from current pose" on SkinnedMeshRenderer, which will expand the current bounds to cover the mesh's current pose
-- This can be used to pose the mesh to different locations and repeatedly use this to cover all the possible locations
- Added "Bake To Static Mesh" to SkinnedMeshRenderer
-- This will make the skinned mesh in its current pose with current blendshapes into a static mesh asset (previously requested by @Jack, @Ukilop and @Robyn (QueenHidi), GH #2212)
- Added intensity particle fade in / out templates
- Added Mass imperial units (based on feedback by @Birdthings, @Dante | Moderation Team, @Veer | CMO)
- Added support for Miles Per Hour, Feet Per Second and Knots for Velocity

[h2]Tweaks:[/h2]
- Glue tool in Bake Meshes mode will now bake any SkinnedMeshes in their current pose and blendshape weights, rather than baking them in their bindpose
- Grab mode context menu option is now hidden in desktop (suggested by @AshtonSparx, GH #3012)
- ParticleStyle templates are now localizable
- Merged MMC locale string tweaks by @ProbablePrime | Docs

- Merged Russian locale additions (including The Universe) by @Shadow Panther [RU/EN, UTC+3]
- Merged Korean locale additions by @MirPASEC
- Merged Japanese locale additions by @Aesc/あすく
- Merged English locale fixes by @Shadow Panther [RU/EN, UTC+3]
- Merged Finnish locale additions by @Toni Kat

[h2]Optimizations:[/h2]
- Optimized MeshX in-memory bone binding representation, removing reference to the mesh
-- This reduces both memory usage of meshes with bone bindings and GC workload
- Tweaked exact bounding box computation to cause smaller freeze when running on a complex hierarchy

Importing animations from JSON, Precision Grab, Multithreaded Dynamic Bone Chain

Hello and welcome to another of our weekly updates!

While we continued our focus on educational experiences this week, we added a number of general features and improvements along the way. Notably we now support importing arbitrary animation files from JSON!

This makes it easy to create animation tracks (either by hand or 3rd party tools) that do not have to be tied to a 3D model file and that support any of the Neos' primitive data types. While we used this for our own purposes, this feature is general enough to benefit all content creators in Neos and expand the available tooling for building interactive content.

Another addition spurred by some of the educational content is new precision grab mode. This lets you easily grab a single item between the tip of your index finger and thumb, rather than grabbing multiple objects in your palm area. This can be useful anytime you want to grab just a single object without grabbing everything else in its proximity.

We implemented more optimizations as well! The dynamic bone chain simulation is now multithreaded, which gives another performance boost, especially with multiple people in the world. We also added new nodes that let you parse, format and convert various units, improved security of LogiX accessing external URLs and much more!



[h2]Ravenswood Bluff livestream - social bluff game[/h2]
We have devoted our recent livestream to playing a game called Ravenswood Bluff, which is a community made version of Blood On The Clocktower game. This has been a thrilling experience full of twists and turns. If you missed the stream, you can check out the recording below. As of writing this game isn't released to public yet, but will be in the future.
[previewyoutube][/previewyoutube]

[h2]AnimJ - importing arbitrary animations from JSON[/h2]
As part of our work on the educational projects, we needed to easily animate some parameters in the experience. To make this process easier for us, we introduced a new file format that allows creating arbitrary animation tracks from JSON files that can be easily created by hand or 3rd party tools.

Thanks to Neos’ open nature, anyone can take advantage of this new functionality for any project! The format supports all currently supported animation track types - Raw, Discrete and Curve, which cover the majority of common animations. Any Neos primitive (numbers, vectors, colors and so on) are supported as well.

You can learn more about the format and see some examples over at our Wiki. We’ll add more examples there as we go. Importing the files is easy - simply save the file as .animj and copy & paste it into Neos as any other asset.

The imported animation track can be used with the Animator component to directly drive fields or sampled with the new LogiX nodes we introduced recently.

We hope this enables creators to make it easier to build cool interactive content in Neos, as it makes it easier for our own. We are always happy when work on official projects spawns general functionality like this, that’s beneficial to everyone.

[h2]Precision Grab[/h2]
Another general addition that got implemented based on the needs of the educational project is a new grab mode - the Precision grab! It’s a feature we wanted to add for a long while, but that got pushed into the background by other priorities.

Previously the only way to grab a single item was using the laser. Grabbing objects with your hand would always grab everything within the vicinity of your palm. In some cases this is useful to grab multiple items, but for cases like rearranging LogiX nodes or picking an individual piece on a board game it’s detrimental.

[previewyoutube][/previewyoutube]

You can now switch from the default Palm grab mode using your context menu to Precision grab. This will always grab only a single closest item between the thumb and index finger of your avatar.

Additionally you can also enable “Auto” mode, which switches between Palm and Precision grab based on the orientation of your hand - if your palm is facing upwards or downwards, you’ll perform a palm grab, otherwise it's the precision one. You can also disable hand grabbing completely and just use your laser.

Let us know what you think of this new mode! If it proves to be useful, we might even make it a new default, as it might make interactions more intuitive, especially for new users.

[h2]Multithreading for dynamic bone chain simulation[/h2]
Following our BEPUv2 upgrade we have reworked the way dynamic bone chains update to be more centralized, especially for finding intersections between colliders and the bones, utilizing BEPUv2’s Tree acceleration structure.

In a recent build we’ve implemented another piece of optimization on top of this work - the numerical simulation of dynamic bones is now multithreaded! In worlds and avatars with heavy use of dynamic bones this can save a considerable amount of frametime, increasing the overall framerate.

There is still much to do with optimizations and a lot of performance that can be claimed. We plan to do more optimizations as we go, improving the performance bit by bit.

[h2]Parsing & Formatting Units[/h2]
Neos has its origins as an educational experience and as such, one of the earliest libraries written for it is Quantity parsing and formatting. This allows parsing various units for Distance, Mass/Weight, Velocity, Acceleration, Temperature, Resistance, Voltage, Current and many other physical units.



Internally this is used for things like setting your height in settings. Since a lot of its functionality has been untapped though, we exposed it through a set of new LogiX nodes, which let you parse any of these units and format them again as a different one.

This can be used to build experiences that work with physical units. For example users can input sizes in centimeters, kilometers, lightyears, inches, feet and more. You can convert between different units too, like between Celsius and Fahrenheit or centimeters and inches.



The library is pretty versatile and supports a number of metric, scientific and imperial. The library itself is open source too, you can find it over here!

[h2]Fixed time synchronization issues[/h2]
Following from the previous week, we have chased down last issues with time synchronization, especially on headless servers. The system has been significantly refactored to provide more robust synchronization of the session’s master clock, with fewer (and ideally none) time jumps and low clock drift.

As a result, audio, video and animation playback should now have near-perfect sync for all users as well as any other behaviors that depend on the time - spinners, wigglers, LogiX time-based nodes (T, Stopwatch or Elapsed time) and more.

If you find any more issues with time sync, please let us know on GitHub, but we are pretty confident we managed to chase up all the remaining bugs with the system.

[h2]Improved Host Access Security[/h2]
Whenever an item or world in Neos attempts to access an external server, the user gets asked whether they want to permit contacting the given host. This gives you more control over your security.

Based on reports through our GitHub and Moderation system, we have expanded this system to require explicit permission for any port outside the standard HTTP and HTTPS ports (80 and 443 respectively).

This prevents certain attacks like port scanning, for example when you allow access to localhost. For applications that use standard HTTP(s) nothing has changed, but if you’re using any other port, you’ll need to update your setup to request specifically for these ports.

To make this easier, we added new overloads of the nodes for requesting access which now accept the URL and automatically extract the port number when making the request. This approach is more future proof as well, in case we choose to add further restrictions (e.g. based on a protocol used for example), so we recommend switching to those versions for any new projects.

[h2]Improved Uri support in LogiX, tweaks, bugfixes and more[/h2]
Apart from these bigger additions and fixes, we have released dozens of other smaller additions, tweaks, security improvements and bugfixes. For example there are now Uri input and output nodes in LogiX, making it easier to work with this data type.

String, Uri and Type input nodes now also have buttons to easily reset them back to null and we fixed some issues with not being able to undo values changes to those nodes properly.

We added a “View” UserRoot node to a number of components that use it, like “PositionAtUser”, which allow aligning objects with the user’s view, rather than head, which can make them work well with the third person desktop mode or freeform camera.

It’s also easier to enter a freeform camera focused on a particular object on the desktop now! Simply aim your cursor at a given object and Press Ctrl+F from any mode. Pressing Alt+F will unfocus and return to previous camera mode.

If you’d like to see a complete list of all changes over the past week, check out the release notes on Steam or Discord.

[h2]Work in progress: The Universe[/h2]
As part of our educational project efforts, we have been working on recreating “Neos: The Universe” experience. This is one of the original demos from 2015 for the very first GearVR headset, whose goal was to show what Neos could be and what kinds of experiences would everyone be able to build in it.

[previewyoutube][/previewyoutube]
Trailer of the original experience

Now years later, we have recreated an enhanced version of the experience in Neos itself, utilizing all the collaborative power and in-game building tools to put it together. There’s still some work to do on it, but it is now nearing completion and will be released to the public soon.

Unlike the original demo, which ran on a mobile VR headset with no positional tracking or hand interaction, you are able to walk around and grab the items to compare them. Not only that, you’ll be able to easily add your own items into the experience.

We’ll have more information for you soon, but here’s the latest sneak peek.





Anyway that's all for this week! We can't wait to bring you more stuff the next one! You can always check the latest on our official Discord. And as usual, big thanks to everyone for supporting Neos! Without your help we couldn't keep working on this project every day and pushing it towards the future!

2021.9.14.1348 - Precision grab mode, Quantity parsing & formatting and more

So I've pushed the small build earlier and then remembered I wanted to a few more things in it, so here they are! ^^;

Notably there's a new grabbing more - Precision grab! You can enable this through the context menu. It should make it easier to grab a single item that's between your index finger and thumb, especially when there's a whole bunch of grabbable items.

Also I've exposed a bunch of nodes for parsing and formatting quantities (supported are Acceleration, Angle, Distance, Mass, Ratio, Temperature, Time, Velocity, Current, Resistance and Voltage). Neos has this functionality internally, but it can be quite useful in some cases, if at very least for converting units.

Also fixing another source of crash with Uri node.

[h2]New Features:[/h2]
- Added "Precision" grab mode
-- Instead of a large grab sphere in the palm that grabs everything in the vicinity, this grabs the single closest item between the tips of Index and Thumb finger on the hand
-- You can enable this through the context menu of given hand. If this is popular enough, we might make it the default, but we'll have to get some feedback on it first. Try it out and let us know what you think!
- Added "Auto" grab mode
-- This switches between precision and palm grab based on the orientation of the hand - if the palm is facing upwards or downvarts, palm grab is used, otherwise (hand is more sideways) precision grab is used
- Added "Laser Only" grab mode
-- This will disable hand grabbing completely and will only use laser for grabbing

- Added ParseQuantity LogiX node which will parse string as a particular quantity
- Added FormatQuantity LogiX node, which formats any of the supported quantities as particular unit
-- If FormatUnit is null, it will try to use best possible unit based on the provided value
-- You can optionally use long unit names
- Added BaseValue and FromBaseValue nodes which allow converting between a quantity and its base value (double)

[h2]Tweaks:[/h2]
- Added Neos Festa 3 Participant badge (requested by @orange)
- Removed Neos Festa 3 exhibitor badge from the session menu

- Merged Finnish locale additions and fixes for Universe by @Toni Kat

[h2]Bugfixes:[/h2]
- Fixed UriInput node throwing exceptions when the Uri is null, instead of properly displaying "null" and causing crash (reported by @ScarsTRF, GH #3010)