1. Neos VR
  2. News

Neos VR News

2021.9.28.28 - World Text Renderer Wizard, Button Dynamic Impulse Trigger

Hello everyone! Just a small build sorry! Pushing out a few additions added for our "The Universe" educational project, but hopefully they'll help you out with your projects as well!

[h2]New Features:[/h2]
- Added ButtonDynamicImpulseTrigger (under Common UI / Button Interactions)
-- This allows sending dynamic impulses on a button press/hover events
-- You can specify impulse tag for each of the button event types. If it's null or empty, no impulse will be sent
-- If the target is null, the impulse will be sent to the world root
- Added ButtonDynamicImpulseTriggerWithValue and ButtonDynamicImpulseTriggerWithReference
-- These work analogously, but allow providing value/reference
-- You can specify unique value/reference for each button event

- Added "World Text Renderer Wizard" (under Create New -> Editors)
-- This lets you mass replace fonts and materials used by text renderers
-- You can filter by standalone text renderers and UIX text renderers in addition to standard properties (hiearchy root, disabled and with tag)

[h2]Tweaks:[/h2]
- Merged Russian locale additions by @Shadow Panther [RU/EN, UTC+3]
- Merged Korean locale additions by @MirPASEC
- Merged Finnish locale additions by @Toni Kat
- Merged Czech locale additions by @rampa_3 (UTC +1, DST UTC +2)

[h2]Bugfixes:[/h2]
- Fixed exceptions when recalculating blendshape normals with smooth shading on models when the blendshape produces degenerate triangles (reported by @Shifty | Quality Control Lead)
- Fixed smooth normal recalculation failing on meshes with degenerate triangles

2021.9.27.743 - New LogiX Color nodes, recalculating blendshape normals/tangets

Hello everyone! Sorry for few new builds, we're wrapping up stuff on The Universe experience and working on some more internal stuff, but here's a bunch more small goodies!

Interactive Camera now has linear interpolation mode! There's also a whole bunch of new LogiX nodes for working with Colors! And you can now recalculate normals and tangents of blendshapes on your meshes directly in Neos!

I've done a few tweaks to asset variant processing, so mesh variants (e.g. colliders) should no longer get held up by texture processing and if you have lots cores you should get a bit more parallelization too - though it's something we might need to tune, as it can impact main performance negatively.

Anyway, hope these help you out a bunch! Also note that there's a new datatype that you can see "colorX". This is work in progress for the Color Management update, please don't use it yet, otherwise your stuff might break!

[h2]New Features:[/h2]
- Added Linear Interpolation to Interactive Camera (requested by @orange, GH #3082)

- Added new LogiX nodes for color blending (based on request by @TheBasementNerd (she/her), GH #3077)
-- Additive Blend, Multiplicative Blend and Soft Additive Blend
-- Alpha Blend has better handling for out of range values
-- All blend nodes are now in "Blending" subfolder in Color
- Added Luminance node for Colors (based on implementation by @Geenz | Graphics Programmer)
- Added Invert LogiX node for Colors (GH #3077)
- Added LogiX nodes for quickly overriding/multiplying color channels (both in RGB and HSV spaces) under Color/Channels (based on GH #3077)
-- Set R, G, B, A, Hue, Saturation and Value
-- Multiply R, G, B, RGB, A, Hue, Saturation and Value
- Added inspector options for recalculating blendshape normals and tangents (requested by @Modern and @Enverex, GH #3075)
-- "Recalculate Blendshape Normals"
-- "Recalculate Blendshape Normals (smooth shading)"
-- "Recalculate Blendshape Tangents (Mikktspace)"
-- Note that the base mesh normals/tangents should be calculated using same method/algorithm, otherwise the blendshape normals/tangents can be severely distorted in some cases

[h2]Tweaks:[/h2]
- SessionCaptureThumbnailSource overlay will only work if it has under 25 % coverage
-- This could be either fully covered with at most 25 % alpha or 100 % alpha covering less than 25 % of the image
- Batch converting materials in the world undo step is now batched into a single undo step, instead of each replacement being a separate step (based on discovery by @Snooper)
- When importing .blend files by using Blender install on the system, Neos now exports those files to .glb instead of .fbx for better compatibility (based on issue by @runtime, GH #2909)
-- If this causes too many issues, let us know and we can potentially switch it back. But please note that you can still manually export to .fbx from Blender if you really need to
- Added new Universe locale strings

- Merged Korean locale additions by @MirPASEC
- Merged Japanese locale additions by @Aesc/あすく
- Merged Russian locale additions by @Shadow Panther [RU/EN, UTC+3]

[h2]Optimizations:[/h2]
- Split asset variant generator workers to one for textures and one for other assets, so they can run in parallel, resulting in faster processing when importing (based on feedback by @SHFR_H, GH #3078)
- Number of asset variant generator threads now scales with number of cores in the system, resulting in asset variant generation speedups on systems with many cores
-- The system will try to use a quarter of available cores for general assets and eighth for textures
-- Note that the texture asset variant generation is already multithreaded, this only affects the number of parallel tasks (with each being multithreaded)
-- If you notice stutters, please let us know and we can tweak these parameters some more

[h2]Security:[/h2]
- Improved cloud API session data validation

[h2]Bugfixes:[/h2]
- Fixed String Insert node returning null when index equals length of the input string (reported by @Banane9 and @Ukilop, GH #3065)

Important notes:
- This build contains a new colorX datatype in preparation for the Color Management update by @Geenz | Graphics Programmer.
-- This datatype is currently NOT supported!
-- Be advised that if you use it before the official release, your content might break.
-- Please keep using the standard color datatype until a further annoucements.

2021.9.22.1431 - (Un)Escape string node, Proportional duration tween, bugfixes

Hello everyone! Another small build with a few more goodies. There's new Escape & Unescape nodes for strings, which can be useful when parsing escaped strings (e.g. from a JSON input). The Tween node also has a new "ProportionalDuration" mode which adjusts the tween duration based on the actual distance between the tweened values.

There's a number of bugfixes as well, notably some fixes for the dynamic bone chain system causing crashes in some cases and number of smaller fixes found in logs from reports.

[h2]New Features:[/h2]
- Added Escape String and Unescape String nodes
-- These perform string escaping and unescaping so it can be used as input/output string literal in a number of languages (e.g. C, C#, JSON and others)
-- Implementation currently wraps System.Text.RegularExpressions.Regex.Escape/Unescape, but can be expanded in the future
- Added FormatLocaleString LogiX node (under Assets)
-- This allows formatting a string from a given locale resource
-- Currently arguments aren't supported, as those require collection support first
- Added LocaleMessageCount LogiX node which outputs number of messages in a given locale resource
- Added DefaultValue & DefaultReference to ParentValueLink and ParentReferenceLink (requested by @guheheP, GH #3060)
-- These allow providing custom default values when there's no current parent value
- Added "ProportionalDuration" input to the Tween node
-- This scales the duration of the tween based on the distance between the tweened values - if they're closer it'll take shorter, if they're further away it'll take longer
-- For values and vectors, linear distance is used
-- For quaternions, angular distance is used (in radians)
Tweaks:
- RTF tags are now stripped when tags are auto-generated from a record's name (reported by @Enverex, GH #3061)

[h2]Optimizations:[/h2]
- DynamicBoneChain collisions from players that are currently inactive are now ignored and not tracked by the system, resulting in some performance savings when combined with culling systems
- Collision Listener Components on Slots that only have one Collider now use less memory, avoiding memory allocations

[h2]Security:[/h2]
- Admin buttons for WorldDetail UI will no longer generate outside of the userspace

[h2]Bugfixes:[/h2]
- Fixed invalid deallocation of player dynamic bone colliders when the player exits world, is respawned or otherwise deallocated
-- This fixes random world crashes (reported by @Shifty | Quality Control Lead , GH #3064)
-- This should potentially also fix collisions randomly persisting in the world after user leaves (reported by @3x1t_5tyl3, @Sox, @Lexevo and @epicEaston197, GH #2958)
- Fixed RaycastTouchSource throwing exceptions when the hierarchy is scaled to zero, resulting it invalid raycast directions (found in a log from @xn--qm8h, GH #3063)
- Fixed collision listener components sometimes not unregistering events (found in a log from @xn--qm8h, GH #3063)
-- This fixes exception and increased resource usage due to them trying to process events that they shouldn't
- Fixed DataPreset throwing exceptions when it has null entries (found in a log from @Enverex, GH #2914)
- Fixed regression in "Bake To Static Mesh" failing to bake skinned meshes with blendshapes (reported by @kazu0617 Neos:kazu, @GonGon, GH #3059)

Baking rigged meshes to static, custom world thumbnails, security improvements

Hello everyone and welcome to another of our weekly updates!

While we are internally finalizing one of the educational experiences for public release, there's a number of general features and improvements that have been sprouted from this work, that should benefit anyone using Neos.

You can now bake rigged (posed) meshes into a static one! They keep their current pose and blendshapes when baked, essentially becoming a mesh snapshot. There's already an easy to use tool made by Orange that lets you easily strike a pose and generate a figurine of your avatar. It behaves as any other mesh in Neos, so it can not only be used for fun, but also to optimize your worlds or export your avatar in a pose for 3D printing or rendering!

Related to this, SkinnedMeshRenderer has a new Explicit bounds mode. This can be used to fix cases where animated meshes would randomly get culled when they shouldn't, without the performance penalty of dynamically computing its bounds every frame.

We also added ability to customize the world thumbnails! This makes it easier to ensure a good thumbnail for any worlds you publish to help entice players to visit them. Not only it helps our own official worlds, but any others as well, including the incoming MMC submissions as it's nearing its end.

Based on community reports, we also improved security of the initial session connection when joining users get authenticated and fixed issue where importing malicious .blend files could run Python scripts in the embedded file. As a reminder, you can report any security issues at moderation.neos.com according to our Security Reporting Policy.



[h2]Explicit Skinned Mesh Renderer bounds[/h2]
During our work on the educational demos, we have noticed an issue with a number of animated rigged meshes - they would de-render at random times and simply not be visible, even though they were there.

This was due to them using a static bounding box of the mesh in its default (binding) pose for culling, which didn’t correspond to where the mesh actually was positioned by its bones as part of the animation.

One approach for this is to simply recompute the bounding box dynamically every frame. However this has a noticeable performance cost, which adds up with more meshes in the scene.

To deal with this better, we implemented the capability to perform skinned mesh transformations in our own data structures, which enables a whole bunch of applications and features.

Notably it now lets you pre-compute an explicit bounding box on the current pose of the mesh, to ensure that it’s always rendered properly without an extra per-frame performance cost. You can even expand the current bounding box to incorporate a new pose with a press of the button.

The explicit bounds can be manually edited with hand too if you know how and where the mesh should be rendered, though it is not recommended to simply make it cover a huge area unless absolutely necessary, otherwise the mesh will need to be calculated even when you cannot see it.

[h2]Baking Skinned Meshes into a static pose[/h2]
Perhaps a much more fun feature to sprout from this new internal addition is the ability to bake skinned meshes into a static mesh in its current pose and with its current blendshapes. It’s something that’s been requested by a number of community members as well.

For example this lets you take your avatar and simply bake yourself into a static mesh in whatever pose and expression you strike at the moment. The resulting mesh is like any other. You can even give it a collider afterwards!

Our Japanese community has already built a tool on top of this feature - simply step on a pedestal, press a button and in a few seconds a small figurine of your avatar pops out! Check out the video below if you’d like to see it in action.


https://twitter.com/mikan3134/status/1438804932858023938

Another practical use case comes from another of the projects that our team has been involved in - the Metamovie. There are a number of corpses lying around the world, all of them skinned meshes, fully posed directly in Neos.

However previously we had to export those out and bake them outside of Neos and reimport, which is a tedious process, but improved the world’s performance. Now with this tool baking them is a one-click operation directly in Neos.

To actually bake a mesh, you can click a button on the SkinnedMeshRenderer. Alternatively, to bake multiple meshes (both static and skinned) you can use the Glue tool in the “Bake Meshes” mode or the LogiX node for baking.

[h2]Customizable World & Session Thumbnails[/h2]
Yet another long-requested feature has been prodded into implementation with our educational project - being able to customize the thumbnail of your saved world and locations of session thumbnails.

Thumbnails can be important when publishing a world, as they can be the deciding factor whether someone visits your world or not, but previously they would always be captured at whatever point you were in the world when hitting the Save button.

There are now new sets of components that let you override this. If you’d still like to have the most recent thumbnail captured whenever you save, you can use the WorldCaptureThumbnailSource component.

This will capture a fresh thumbnail from wherever this component is located. You can even add an optional overlay texture on top of it. Alternatively you can use WorldTextureThumbnailSource to simply provide a static 360 texture for the thumbnail if you made a polished one.

We also added SessionCaptureThumbnailSource. You can scatter these components around popular locations in your world, so whenever a thumbnail is captured for the session, it will be taken from one of those points. The system will pick a random one every time, but prioritize locations with more people nearby than others.

[h2]Improved session connection handshake and other security improvements[/h2]
Based on security reports through our moderation ticket system, we implemented more security improvements. Notably we reworked a portion of the protocol that establishes the initial connection to a session.

This process performs a cryptographic authentication of any user joining the session, to ensure that they are who they say they are. However, part of this process was susceptible to a man-in-the-middle attack, which while difficult to execute, would allow someone to impersonate another user in a different session.

This mechanism has now been expanded to significantly mitigate the possibility of such attack as well as number of others, providing greater security guarantees on user identities.

Additionally we also improved security of importing .blend files. Blender files can contain Python scripts that run automatically when they are opened. When the file is imported directly to Neos, those scripts no longer run automatically, preventing attack where importing a malicious .blend file could run arbitrary code on your computer.

If you find any security issues, please report them responsibly at moderation.neos.com! Reports are eligible for CDFT rewards, depending on combination of their severity, quality of the report and other factors. You can learn more about our Security reporting policy on our GitHub here.

[h2]Bug Fixes, small optimizations and tweaks[/h2]
Among those larger additions and improvements, we released a number of other bug fixes, tweaks and additions. For example during the work on the skinned mesh renderer, we noticed unnecessary data being stored on each bone binding and removed it, reducing some memory usage and GC workload.

We improved the avatar IK feet behavior, to avoid the legs going up when near another player, but still keep reacting to other parts of their body - for example their hands if they’re pushing another player’s feet up.

We fixed a number of crashes too and DynamicBonePlayerColliders components were ignored after recent rework of the system. We updated the Assimp importer library to the latest as well, bringing about 150 commits of bug fixes and additions that should improve compatibility with various 3D model formats.

If you’d like to know more, you can check out our release notes on Steam or Discord! We hope that everyone had a great week and that the next one will be awesome too and as always - huge thanks to you for helping to keep this project going. Neos is a living, breathing metaverse and we're amazed at the creativity we see every day!

2021.9.21.1057 - Fixed headless not being able to save worlds

A priority hotfix for a regression causing headless not being able to save a world.

Compatible with previous build!

[h2]Bugfixes:[/h2]
- Fixed regression in headless failing to save world due to changes in the thumbnail generation system (reported by @Rucio and @Shadow Panther [RU/EN, UTC+3], GH #3051)