1. Neos VR
  2. News

Neos VR News

2021.9.11.1001 - Importing arbitrary animations from JSON files, tweaks, fixes

Hello everyone! Another relatively small build, we're still focusing on the educational experiences right now, but here are some general goodies and tools that were implemented for this experience.

Notably, you can now import arbitrary animation file from a custom JSON format .animj! This lets you create and bring in arbitrary animation tracks without having to tack them onto some 3D model files and support all the Neos' animation track types too, as well as any Neos-supported primitive datatype (e.g. colors, integers, booleans...). This can be particularly powerful for building experiences, where you can sample these animations with LogiX to drive behaviors.

There's now also View UserNode element, which should improve certain behaviors to work better with the 3rd person or freeform camera modes and other overriden views.

Also there's some more tweaks and few security improvements as well.

[h2]New Features:[/h2]
- Added suport for importing raw animation tracks from a custom ".animj" format
-- This allows creating any animation track type supported by Neos.
-- To learn more about the format and some examples, see this wiki page: https://wiki.neos.com/AnimJ (will be WIP at the time of release)
-- You can sample these animations with LogiX or drive elements with Animator as any other, but the animation tracks do not need to correspond to just Transform (Position, Rotation, Scale) properties, but can be used for any Neos primitive datatype for arbitrary purposes

- Added "View" as UserNode element, allowing it to be used with any Component or LogiX node that uses this
-- This makes "View" a valid target for PositionAtUser (requested by @Hayden, GH #2816)
-- Note that if you try to set user's position/rotation via View, it might not always produce a correct result, because the view can be controlled by external means where user's root position in the world doesn't map to the view

[h2]Tweaks:[/h2]
- Ctrl+F to focus target in freecam can now be used from any camera mode (e.g. first person or third person) rather than only while Freeform camera is active
-- Pressing Alt+F to unfocus will automatically switch to previous camera mode when Freeform camera is activated this way
- Added type castability checks when generating cast nodes, to avoid generating casts that are known to never succeed and prevent confusion (based on report by @Delta, GH #2989 and number of previous reports)
-- Casts are not generated when casting one class to another, if neither is ever assignable to the other
-- Casts are also eliminated when casting class to interface that it doesn't implement
- GrabbableSetterTip now has the option to apply grabbables to the hit object or the object root (requested by @SHFR_H, implemented by @ProbablePrime | Docs | Docs)
-- Object root is the default option to preserve the old behavior

[h2]Security:[/h2]
- Host access now requires requesting access for each individual port to avoid security vulnerabilities like port scanning (based on report by @FRICK/フリック, Moderation Ticket #823623)
-- HTTP and HTTPs ports (80 and 443) do not require specifying port, they'll be both allowed with just the base string. If you only use these ports, you don't need to change anything
-- LogiX nodes have been updated accordingly, allowing you to specify port that you're requesting access to
- Fixed roleCloudVariable being able to assign higher role than the host has (reported by @Raith | Programmer, Moderation Ticket #952355)
- Added guard to prevent errors in stream messages from crashing the whole world and added extra diagnostics (based on report by @Azora Husky, GH #2980)

2021.9.9.1144 - Fix time sync issue on join, seams when splitting skinned meshes

Hello everyone! Another smaller build, doing some more things for educational project, but this should have a bunch of important bugfixes!

Notably the issues with time sync should now hopefully be fixed, there was one last issue where the playback time would be offset for any new users who join the session.

I made some improvements to the unglue logic for CharacterController as well, which should improve existing behaviors and gadgets and fix some issues with older content too.

Importantly I made some improvements and fixes to the separating of avatar to parts not affected by blendshapes, fixing the cases where there would be visible seams due to lighting in the scene. If you avoided using this optmization before, it might be a good idea to try again again (I recommend doing "Bake non-driven blendshapes" then "Separate parts of mesh unaffected by blendshapes"), as it can provide a noticeable performance boost for your avatar!

[h2]New Features:[/h2]
- Reworked transition system for ScaleObjectManager
-- Added Offset transition, which applies an offset to the object during transition
-- Added Size transition as separate configuration
-- Separated Transition ranges between near and far boundaries
-- Added Exp to transition ranges, allowing to smooth in/out the transitions

[h2]Tweaks:[/h2]
- Merged latest BEPUv2 updates from source
-- This has improved Cylinder-Triangle interactions and fix for Hull-Hull interactions
- Separating skinned mesh renderer into parts affected by blendshapes and unaffected ones now properly preserves the root bone in the final setup
-- This ensures that the lighting stays the same for both meshes when using Forward rendered materials in presence of multiple lights, rather than creating visible seams (based on reports by @Kulza, @AshtonSparx, @Enverex, @Shifty | Quality Control Lead and others)
Optimizations:
- Added readonly decorators to vector, quaternion, matrix, color, bounding box and other struct type methods and properties, to prevent potential unecessary defensive copies being generated by the compiler
- Avoided reconfiguring bounds update method on every SkinnedMeshRenderer update, rather than only when it changes

[h2]Security:[/h2]
- AprilFoolsViolentExplosion will no longer run on avatars with SimpleAvatarProtection when the user doesn't have permission to use those (based on report by @Aetoriz and @あむ(Rabbuttz), Ticket #607491)

[h2]Bugfixes:[/h2]
- GitHub API now uses authorization token to fix issue where priorityIssue messages and updating of priority issues would get rate limited (based on previous report by @Lexevo and @Sox, GH #2942)
- Fixed Android builds failing (reported by @Shadow Panther [RU/EN, UTC+3], GH #2966)
- Changed unglue logic when applying forces or changing character velocity to keep Traction support but instead significantly reduce the glue force (based on reports by @TheBasementNerd (she/her), @CrowDevil I LoF Manager, and @H3BO3, GH #2978 and GH #2900)
- Increased the velocity change threshold for ungluging character controller and added compensation for the delta time (based on same issue as above)
- Fixed Context Menu flick selection pressing buttons that are disabled (reported by @Delta, GH #2979)
- Fixed BagEditor and ListEditor not unregistering events properly if modified, resulting in a potential session crash (reported by @Kulza, GH #2974)
- Fixed initial state synchronization when joining world not using the host time from the message after recent rework, resulting in playback of videos and audio to be significantly offset (based on report by @Enverex, GH #2943)
-- Also added a mechanism to properly compute the next delta time to ensure that time taken between the decoding and between the first update is accounted for, reducing possibility of another time correction being necessary a few seconds into joining the world
- Fixed regression in ChildParentAudioClipPlayer not playing sounds at all (based on report by @Earthmark, @Epsilion)
- Fixed SkinnedMeshRenderer Proxy bounds source not registering and unregistering events properly
-- This should fix Proxy bounds not working properly in some cases or lingering events after they've been removed

Sampling Static Texture pixels in LogiX, Subtitle Import, Security Report Policy

Hello everyone and welcome to our weekly update!

This week we have a number of smaller, but hopefully very useful additions. Notably, you can now sample colors from static 2D and 3D textures from LogiX! This opens up new options for content creation, by letting you encode various data into texture assets and then read them at runtime. Similarly you can now also sample Animation tracks as well.

Neos also has native subtitle support, letting you import srt, sub, ssa, ttml and vtt directly into Neos (or dynamically from a URL) as a native Neos animation. Those can not only be synced with video and audio files (with new playback sync components to help), but sampled with LogiX as well, providing another building block for your experiences.

We added a number of other features as well, like Parent Data Link mechanism, Tube Wire procedural mesh, components for easily playing sound effects on button presses or parented objects and more.

Along with a number of security improvements based on community reports, we also published a Security Policy document on our GitHub, which details how to best make reports and to clear up some circulating misconceptions, notably that reporting security issues will lead to a ban - we want to encourage responsible security reporting, so we now offering CDFT bounties! To learn more, please give the document a read: https://github.com/Neos-Metaverse/NeosPublic/blob/master/.github/SECURITY.md

We have also been devoting some time to an educational project over past week, implementing things like a CIrcuit Simulator and part of The Universe experience. Those are mostly side projects for educational purposes right now though, but we'll be bringing portions of them to the broader community in the future. If you're curious to see some progress on them regardless, check out the videos below!



[h2]August Recap Livestream - MMC, Neos Festa, New Team Member, BEPUv2, Medra Interview[/h2]
On our last Friday livestream we did our regular beginning of month recap of the previous month's events, as well as any upcoming happenings. If you missed it, you can watch the archival footage below.

We covered the MMC and Neos Festa events and had a special guest - Medra joined us to talk about the currently ongoing Metaverse Maker Competition that's returning for its second year.

We covered the BEPUv2 upgrade and what it brought us as well what's coming in the future, as well as other events, like bringing Dante into the Neos Team to help bridge communication between moderation and the team and help with a number of other things.

[previewyoutube][/previewyoutube]

[h2]Sampling static textures (2D and 3D) in LogiX[/h2]
You can now read texture data from LogiX! With a new set of nodes for working with asset files it is now possible to get a reference to a texture and read both its metadata (format and size) and individual pixels.



You can either perform bilinear sampling using a UV(W) coordinate, which will interpolate between the pixels and allow you to use normalized coordinates without considering the actual resolution or use another node to get a specific pixel.

[previewyoutube][/previewyoutube]

Both 2D and 3D static textures are supported. In order to read the texture data, it needs to be marked as “Readable” and not use block compression. This will keep the texture data in-memory in an accessible format, increasing the RAM usage, so it’s recommended to only use it for textures that need it.

This feature can open up new options for building maps and tools. For example you can encode any data into a texture and sample based on the user's position in the world to vary some parameters - like making a Geiger counter!

[h2]Sampling animations in LogiX[/h2]
Similarly to textures, it’s now possible to also read animation data directly in LogiX! By referencing an animation asset, you can read the values of its animation tracks at a given position in time.

We have added nodes to help you find the right animation track by its name as well. In order for this to work, you need to make sure that you’re sampling the track with correct data type - for example float3 for positions, floatQ for rotations and so on.

If you’re animating some parameters it might be better to use the traditional Animator for better performance, but this feature should open some new options for building content in Neos.

[h2]Native subtitle support[/h2]
Neos now has native subtitle support! You can import srt, sub, ssa, ttml and vtt files directly into Neos, to have them converted into a native Neos animation, that can be synced with a video or audio file or any other playback in Neos.

This allows you to easily bring external subtitles not only for videos, but also as a building block for your own experiences. They can be sampled with the new LogiX nodes for sampling animations as well if you need more fine-grained control over them.

There is also a special component DynamicSubtitleProvider, which will seamlessly import subtitles from a given URL and provide them as animation files, without having to manually import the file by hand first.

[h2]Parent Data Link mechanism[/h2]
Recent build has added a new mechanism for dynamically linking data based on hierarchy. It is now possible to dynamically drive values and references from its parent with ParentValue, ParentReference and ParentValueLink and ParentReferenceLink components.

[previewyoutube][/previewyoutube]

This system is akin to a very lightweight version of the dynamic variables. Instead of the entire hierarchy it links up data between the immediate parent and its children and it’s only one way - the child values are always driven from the parent (although they do support writeback).

This can be useful for a number of workflows, where a child object can get data based on where it’s parented from. For example snapping objects under a certain parent can link up a reference, allowing you to build things like virtual wires that interconnect elements.

[h2]Fixing time desync on headless sessions[/h2]
Recently we discovered a long standing problem with headless that was responsible for a number of strange behaviors on any headless session, that were mostly looked over. Most notable effect was video playback ending up significantly out of sync for multiple people.

We found that the root cause was due to the world time (a “master clock” to which everything else is synced) never being synced on headless sessions, resulting in different users having a chance of a random drift. This was due to the time corrections being done from stream packets, but headless never has any of its own!

This would not only affect videos, but any other kind of playback - audio files, animations, effects. Other behaviors would be affected too - any time based LogiX, stopwatch or time elapsed nodes and more.

We have released a fix that ensures that time synchronization packets are always sent, which fixes the whole range of issues and we have been tuning and improving the system to eliminate other resulting sources of random jumps and skips from the synchronization system based on reports from our community.

If you find any more issues with time synchronization, please let us know on our GitHub!

[h2]Other additions and quality of life improvements[/h2]
We’ve made a number of other smaller additions over the course of the week. There is now a new procedural mesh TubeWireMesh, which is ideal for making things like cables and there’s a mechanism for duplicating other objects when a particular object gets duplicated.

We added components for easily playing sounds on button presses or when children get parented and unparented under a Slot. PhysicalButtons also have a new “Hold” mode which makes them behave like the physical toggle switches - you press them once and they stay pressed in, you press them again and they pop out!

[previewyoutube][/previewyoutube]

Some other new components include VectorSwizzleDrivers (they let you rearrange components of any vector into another vector) and various bug fixes for remaining issues after the BEPUv2 upgrade.

If you’d like to see all the changes, check out the release notes on Steam or in our official Discord!

[h2]Security improvements[/h2]
We’ve made a number of security improvements based on reports by our community. The SimpleAvatarProtection and world delete confirmations have now been completely moved to userspace to prevent potential tampering and extra protections have been made for the laser offset from worldspace.

We also covered cases of missing validations when adding generic components with Nullable types or when trying to access extremely long components paths. Neos will now also send an email whenever you reset your password, in case someone makes an unauthorized change.

[h2]Official Security Policy[/h2]
To help better understand our security policy and how to report security issues and exploits, we have created a new document on our GitHub detailing the process and how to best report them. If you’d like to read more about it, please give it a read here.

While we have already been receiving a number of security reports through our Moderation Ticket system that helped improve Neos’ security, we have been noticing a number of misconceptions circulating in the community, for example that reporting security issues will result in a ban, which is untrue.

Hopefully the document will help clarify those misconceptions and offer some incentives in the form of CDFT as well. It also explains how to make a good quality report to ensure we have all the necessary information to implement a fix.

[h2]Work in progress on educational project - Circuit Simulator[/h2]
Neos has its origins as an educational project and is still actively used as such in a number of schools and universities. As part of an ongoing educational project, we have been recently required to focus on a few new educational features, notably for teaching electronics.

Over the past week, we have been integrating a functional circuit simulation with Neos, that will allow students to learn about electronics in a more intuitive manner, by being able to see the voltages and current flowing through a virtual model of educational circuit board.

We are looking into the possibility of releasing the simulation components used to build the circuit board for everyone, so anyone using Neos can toy around with those and build their own virtual circuits, since it can be quite fun in the multiplayer setting and with all the other tools and visualizations that Neos offers.

[previewyoutube][/previewyoutube]

However currently we are not certain whether it’s possible or not. In any case if you’re curious about what’s possible to do with Neos to help improve education, you can check out the following videos! They showcase a number of working circuits, notably flip flop circuits made out of NAND gates and NPN transistors.

https://www.youtube.com/watch?v=2iW4cLKuuCQ
https://www.youtube.com/watch?v=gvHqKhhhL7A

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

Anyway this is all for this week! And as usual, big thanks to everyone for supporting this project and helping it move forward every week, we couldn't do it without you!

2021.9.6.614 - Parent Data Link, TubeWireMesh, time skip tweaks, fixes and more

Hello everyone! Sorry for lack of builds, I've been working on a thing for educational project that we're part of, but here's a bunch of improvements and additions, some of those are general additions that I needed for this project that should help with other things too!

Anotable addition is a new Parent Data Link mechanism! It lets you drive a child value (of any type pretty much) based on which Slot it's parented under, which should allow for a bunch of new cool patterns!

There's also now a TubeWireMesh (essentially same type of mesh as LogiX wires, but tube instead of strip) and RemoteConnectionPointDriver which lets you dynamically drive it (and the StripeWireMesh) to do things like cables and such!

Some tweaks and bugfixes as well!

[h2]New Features;[/h2]
- Added Parent Data Link mechanism
-- This allows dynamically linking values and references by being directly parented under a slot
-- Parent Slot provides the value with ParentValue or ParentReference components
-- Child with ParentValueLink or ParentReferenceLink will drive target field/reference from the Parent's value when directly under them
-- You can differentiate multiple links with the same value using a Tag/MatchTag
-- WriteBack is supported - when enabled changing the child value will update the parent's
-- This is a lighter mechanism and doesn't require setting up dynamic variable space, but requires the child to be immediately parented under given slot. It can be useful for linking up values on snapping and similar
- Added TubeWireMesh
-- This is analogous to StripeWireMesh, but a tube shape instead of a flat stripe
- Added RemoteConnectionPointDriver
-- This allows driving local position, vector, orientation and size from a target Slot. It can be used with TubeWireMesh and StripeWireMesh to drive the other point from another slot
- Added IsUserSilenced node (requested by @3x1t_5tyl3, GH #2933)
- Added IsContact to CloudUserInfo which indicates whether the given user is contact or not (requested by @kazu0617 Neos:kazu, GH #2935)
-- This will only be reported in the userspace for security reasons

- Inspector now generates items for empty (non-value) sync elements (e.g. LinkTargets) to allow them being assigned as references
- Added internal mechanism for asynchronously computing exact boudning box
-- For mesh colliders and mesh renderers this actually transforms each vertex, rather than the mesh

[h2]Tweaks:[/h2]
- ExternalSlotSaver will not relocate the target Slot on saving if it's part of the hierarchy that's being saved
-- E.g. when it's together with the ExternalSlotSaver under an object that's being saved or when the entire world is being saved
- Made tweaks to the master clock synchronization to potentially improve undesired time skips (based on issue by @Enverex, @Kulza, @Lexevo, GH #2943)
-- When encoding, the update time is compensated, rather than using time from the beginning of the update, in case there's a several second lag during the frame update
-- If the received time is older than the last received one, it'll be rejected, in case there are stray delayed packets
-- Added extra diagnostics
- ScaleObjectCreator now uses exact bounds fo the object to ensure a close fit (based on feedback by @Aegis_Wolf | Creative Director)

- Merged Czech locale update by @rampa_3 (UTC +1, DST UTC +2)
- Merged Dutch locale update by @AnotherFoxGuy
- Merged Russian locale update by @Shadow Panther [RU/EN, UTC+3]

[h2]Security:[/h2]
- Neos will now send an email on successful password reset using a recovery code (based on suggestion by @Marco Sizemore, GH #2877)

[h2]Bugfixes:[/h2]
- Fixed cloud not responding with an error when accesing GitHub API fails due to rate limit (based on report by @Lexevo, @Sox, GH #2942)

2021.9.4.468 - Fix for mesh collider generation for extremelly large meshes

Just a small patch for an issue found with generating mesh colliders for very large meshes, which can potentially cause some corruption and issues.

Compatible with previous build, no need to update right away.

[h2]Tweaks:[/h2]
- Added logging for finished gather jobs to help diagnose issue reported by @EvieEternal , GH ##2921)

- Merged Korean locale additions by @MirPASEC

[h2]Bugfixes:[/h2]
- Fixed extremelly large meshes (with more than 16M triangles) trying to compute mesh colliders, resulting in exceptions and errors due to exceeding the maximum buffer size of the acceleration structure (found in a report log from @Enverex, GH #2914)
-- It's not recommended to have mesh colliders this enormous, as it'll use several GB of memory alone for the acceleration structure
-- In the future we'll likely use auto-decimation for such meshes so they can still be interacted with