1. Neos VR
  2. News

Neos VR News

2020.11.9.372 - World saving bugfix + data recovery instructions when affected

Pushing a high priority bugfix that prevents some worlds/items from being properly saved. Compatible with previous build, but I recommend updating immediatelly.

If you've saved your world recently and the changes didn't go through, you can recover them as long as you haven't cleared your cache. Check any recently saved worlds to see if they're missing any changes. If they are, do the following:

1) Locate the corresponding log file in the Steam installation for when you last saved the world
2) Search for the first occurence of "Exception in the save process!" following "Saving world: ". Make sure to find the last one in the log for particular world.
3) Copy the path following "Dumping the raw save data to:" (including the .lz4bson extension) from the log
4) Switch to Neos and paste (e.g. Ctrl+V). This will load the last version of the world that failed to save.
5) Verify that it's the right version and save a copy of it. You can then use this copy to overwrite the proper version (overwrite worlds by clicking on an world orb while holding the world orb you want to overwrite with)

[h2]Tweaks:[/h2]
- Merged Polish locale additions by @art0007i

[h2]Bugfixes:[/h2]
- Fixed saving of a worlds/items breaking when there's an object asset file referenced in the session, that hasn't been gathered (discovered in log from @GearBell, @Nexulan | Community Manager, @Medra and @Shifty | Quality Control Lead )
- Fixed Undo Manager becoming persistent by default
- Added extra diagnostic information when writing data into a CircularAudioBuffer (based on issue found in log from @GearBell)

Procedural graphs and realtime audio waveforms, optimizing LogiX & reworking MTC

Hello and welcome to another of our weekly updates!

This week we spent a lot of time on many quality of life improvements, featuring numerous tweaks, bugfixes and security improvements. We have added some nice new features as well, notably procedural meshes for rendering realtime audio waveforms and custom graphs.

Those will be useful for future optimization and debugging purposes as well, as we'll use them to display some performance metrics, but you can already start using them for your own purposes as well.

We have also started work on more optimizations, this time focusing on LogiX and using the opportunity to also implement mechanisms necessary for future features like collections. We're in process of reworking the MTC experience for new users as well.



[h2]Procedural RectMesh system & Generic Member support[/h2]
To enable some of the new features, we added some new architectural building blocks to Neos. Two particularly notable ones are RectMeshSources and Generic members on components/workers.

RectMeshSource is a new type of procedural mesh, that’s typically constrained to a 2D plane (though technically it doesn’t need to be) and defined by a rectangle. It’s designed so it can be used both as a standalone mesh (using StandaloneRectMesh) or within a UIX canvas (using RectMesh). This allows better code reuse and reduces errors. With standalone mesh you need to provide the rect area explicitly, while within UIX it’s implicitly provided by the canvas RectTransform.

The second addition is a more technical one, allowing Components/Workers to have members that are pure generic arguments, which wasn’t previously supported by Neos’ IL postprocessing - code that generates highly efficient code for initializing and accessing sync members. This gives us some new flexibility to implement new features more elegantly.

[h2]Realtime Audio Waveform Mesh[/h2]
Thanks to the architectural additions, we have added two new RectMeshSource procedural meshes. The first one is AudioSourceWaveformMesh, which takes in any audio source as an input (voice stream, sound effects, music) and generates a real time mesh of the shape of the waveform.

The mesh has a configurable number of points, width, color and buffer history (allowing it to show up to 1 second of the waveform). This new mesh can be used to create some cool audio visualizers, so we hope you’ll have lots of fun with it!

[previewyoutube][/previewyoutube]
Tutorial by ProbablePrime on how to use the new audio waveform mesh

[h2]Procedural Line Graphs[/h2]
Using the same underlying procedural generator we added another RectMeshSource, called LineGraphMesh. This is a more general procedural mesh, which allows rendering arbitrary line graphs, using a series of scalar values. It has similar configuration options to the mesh above, but supports arbitrary values.

Since the list of points is defined in an array, which is currently not directly accessible from LogiX or inspector, we have also added additional components to make it easier to use with common setups. To allow for efficient updates, it also has StartIndex property, which allows offsetting the input array. This can be used for history graphs, by simply updating a single value in the array and shifting the index, eliminating the need to constantly shift the entire contents of the array.

Using the ValueGraphRecorder you can simply point to any float value in the world and have it automatically graph over time. You can configure the capture time interval and automatic range scaling.

[previewyoutube][/previewyoutube]
Great tutorial by ProbablePrime on how to use the new graphing functionality

The component can be used to explicitly write values to the graph as well using LogiX. In this case you might want to set the interval to infinity, so it never writes a new value on itself. It’s also recommended to disable the “Drive” option with this, so the state gets synced to others (for values automatically graphed over time this is not necessary if the value is already same for everyone).

We plan on using this ourselves to create improved performance debugging tools, which will help with further optimizations, but the possibilities should be pretty wide, allowing other educational or practical uses.

[h2]Metaverse Training Center work in progress[/h2]
Over the past weeks, we’ve also been reworking the MTC (Metaverse Training Center) and building a new starter tutorial to help new players get started in Neos. We’re going to be using a simplified version of the tutorial for the time being, before other major features like physics and more of the UI gets reworked, so it’s easier to update.

We’ll have more news to share soon, but here are some screenshots of the new remodelled MTC, which has been improved based on the experience we gained over past year and based on the feedback from both new and existing users.





[h2]Optimizing LogiX (work in progress)[/h2]
As part of the optimizations, we started working on redesigning internal parts of LogiX to significantly reduce overhead based on performance profiling and at the same time solve some long standing issues and introduce new capabilities.

One of the major general performance sinks with LogiX is currently change propagation. Any changes need to be propagated through the whole node setup forward to the nodes that care about them, even for nodes that update every single frame.

The new system will have a LogiX validation process that happens on any change to the node setup. During validation, the correctness of LogiX will be verified, preventing things like evaluation loops that cause crashes and information about change sources propagated and registered.

This way the propagation of every frame will be avoided and done directly from source nodes to the listeners, rather than having to go through all the nodes in-between. For nodes that change continually every frame this will be optimized even further, as the changes won’t need to be propagated at all, reducing overhead.

As another benefit, this system will be propagate other information about inputs as well - e.g. “localness” of values. This will allow us to add support for local only variables, while at the same time preventing accidental misuse by driving a shared state from them (there will be a mechanism to do this if really needed).

Currently this work is still in the design stage, but we’ll be likely implementing it over the next week, hopefully resulting in a good performance boost as well as unlocking path to other future features like collections.



[h2]#NeosFans on Twitter[/h2]
We’ve seen a fun trend occurring on Twitter, where people grab onto a ceiling fan and spin about their virtual rooms in Neos! Funny enough, this has been a tried and true passtime of sorts since the early days of Neos, so it’s really fun for us to see this trend coming full-circle! Puns!







And here's a little throwback clip from beginning of 2019. Were these fans too ahead of the curve?
[previewyoutube][/previewyoutube]

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

Anyway that's all for now! If you'd like to know more about other changes, updates, security fixes and other improvements, check out the #neos-updates channel on our official Discord or the patch notes on Steam.

And as usual thank you everyone for your support, especially our Patreon supporters and ICO investors, for keeping this project going and improving every day!







2020.11.8.605 - Many bugfixes, additions to ValueGraphRecorder

Another maintenance build, with a bunch of bugfixes for bug old and new! A few additions and tweaks as well, but mostly bugsquashing.

[h2]New Features:[/h2]
- Added "WriteValue" impulse target to ValueGraphRecorder, which allows explicitly writing a value to the target graph, regardless of the time interval
-- This can be invoked multiple times per frame
-- You can set the UpdateInterval to infinity, so it never updates on itself and any values are written only by this means
-- If you use this method, it's strongly recommended to uncheck "Drive", otherwise the graph will be local only
- Added MinSpeed and MaxSpeed to RandomAudioClipPlayer (requested by @A Monsoon of Babies)

[h2]Tweaks:[/h2]
- Doubled the fixed bandwidth for Steam Networking Sockets (based on request by @Cyro, please let me know if this causes more problems)
- Merged Japanese locale fixes by @Aesc

[h2]Bugfixes:[/h2]
- Permission system security bugfixes (based on reports by several users)
- Implemented workaround for change in Patreon's API, where the reported amount of US cents is no longer necessarily US cents, resulting in the wrong amount of NCR and wrong tier being awarded to users using their own currency (e.g. GBP instead of USD) (based on reports by @Shifty | Quality Control Lead, @Raith and others)
-- Anyone affected by this should now have correct tier and remainder of NCR minted, please contact us if there are any more discrepancies
- Fixed exceptions during Neos initialization in the LoopbackAudioInputDriver (reported by @Shifty | Quality Control Lead)
- Fixed active Neos Loopback audio input device causing the output audio to get volume normalized
- Fixed SetGlobalTransformMatrix applying to the node slot, rather than the target one (reported by @Dante)
- InteractiveCamera will now parent itself back to the world root, if it's within part of hierarchy that gets deactivated (e.g. camera anchor that gets disabled) (based on report by @Enverex and @jasonmo)
- When switching interactive camera from camera anchor to smooth POV, it will now properly unparent itself from the anchor
- Fixed item shelves accepting items with empty bounds, causing items that are visually too large or too far away to attach to them
-- This fixes camera anchors attaching to tool shelves from long range (reported by @Rukio, sorry it took so long!)
- Fixed incorrect matching of audio devices in CSCore, causing the default audio device to be determined incorrectly (based on report by @Lucaedr, @Kulza)
- Fixed RandomObjectSpawner not respecting the passed spawn point (reported by @Epsilion)
- Fixed AssetFrameSlot receiving other AssetFrameSlot's of the same type (reported by @sirkitree)
- Fixed Local2Global matrix invalidation not propagating to local parts of hierarchy
-- This fixes variety of strange bugs, particularly ones relating to anything to do with bounding boxes
-- This includes AssetFrameSlots grabbing slots from long distances if they contain TextRenderer, particularly audio clip players (reported by @sirkitree)

2020.11.6.439 - Procedural Line graph mesh, Audio loopback capture, tweaks, more

Sorry for smaller build today, but here are some more goodies! There are two new components which allow easily rendering graphs! The full potential of the mesh one will be unlocked with access to collections so you can fill it with any data you want, but there's another helper component that lets you easily graph history of any value.

There are some more internal additions as well for sound devices (capturing desktop output audio and Neos' own audio output) that will be important for some future features as well as improvements to default audio device detection.

A bunch of other tweaks and fixes as usual too!

[h2]New Features:[/h2]
- Added LineGraphmesh procedural RectMesh, which generates a line graph based on a series of values, with configurable value range
- Added ValueGraphRecorder, which updates a graph renderer with history of a source float value (requested by @ProbablePrime)
-- To use, you need to assign both TargetArray and TargetArrayOffset, which will be filled with data
-- Optionaly you can assign RangeMin and RangeMax, to have the component automatically update the displayed range based on the values (with configurable adjust threshold and multipliers)
-- By default it will drive targets, but this can be optionally disabled if required, resulting in only a single RecordingUser updating the targets
- Neos now supports using audio output devices as an input on Windows using loopback capture
- Added internal loopback audio capture, which captures Neos' own audio output (this is mostly for internal use, like recording in-game audio and later on for echo cancellation)
- BakeMesh and BakeClip methods on procedural meshes and clips are now exposed as impulse targets for LogiX (based on feedback by @Kal, @Cyro and @Aegis_Wolf | Art Director)
- Added FinishHandling to TextEditor, which determines on how is the target string updated after editing finishes (requested by @Earthmark):
-- Leave As Is (leaves it unchanged)
-- Null on Empty (sets target to null if string is empty after editing ends)
-- Null on Whitespace (sets target to null if string is just whitespaces or empty after editing ends)
- Neos Exit messages can now refer to the local user using $LocalUser variable (requested by @Blaze)

[h2]Tweaks:[/h2]
- Added OnAnimationFinished impulse to SetUserScale (requested by @Shifty | Quality Control Lead)
- When triggering change in user's scale, any currently running scale animation is cancelled (based on report by @Turk)
- Inspector now lists SyncArray members without showing the actual data (this allows the references to be assigned)
- Improved detection of the system default audio input device (previously reported by @Cyro)
-- This only affects new users, if you already have one setup, then it'll stay
- Upgraded to Unity 2019.4.14f1 (from 2019.4.13f1)

- Merged Japanese, Esperanto and Chinese locale updates by @Melnus
- Merged Czech locale updates by @rampa_3 (UTC +1, DST UTC +2)

[h2]Bugfixes:[/h2]
- Fixed in-memory audio writing constantly overwriting the first block of audio samples
- Fixed DefaultUserScale updating user's default scale when not equipped, by simply becoming part of their hierarchy (reported by @Shifty | Quality Control Lead)
- Fixed FocusWorld and OpenWorld nodes not working in Userspace (reported by @ProbablePrime)
- Re-applied fix for ColliderUserTracker loosing the track of user when switching between different locomotion types (e.g. Fly to Walk/Run) (reported by @ChrisWarner103 (DelVR))
-- This fix was previously disabled due to @Turk's MMC submission depending on the buggy behavior

2020.11.5.88 - Realtime audio waveform mesh, transform LogiX nodes and more

A bunch of new goodies! I've implemented new procedural mesh mechanism that lets procedural meshes to be used both in UIX and as standalone meshes, as well as some new underlying procedural generators, which will power lots of things in the future. Some more architectural underlying changes were made as well to support new ways to implement stuff in Neos (particularly with genrics) which will make some other things easier to implement.

Currently there's a new "AudioSourceWaveformMesh" procedural mesh added with this system, which generates an audio waveform from arbitrary audio source! Audio clip, video, realtime voice, anything should work!

A bunch of new Transform nodes as well, various tweaks, updated SDK and bunch of bugfixes (including some more for AudioX still throwing exceptions and causing audio artifacts).

[h2]New Features:[/h2]
- Added new procedural mesh mechanism, which allows certain meshes of base type RectMeshSource to be used both as standalone and within UIX
-- StandaloneRectMesh will generate it as standalone mesh, with explicitly provided Rect used to define the mesh generation area
-- RectMesh UIX graphic will allow the mesh to be used as part of UIX canvas, with the Rect provided implicitly by the RectTransform
-- Those meshes need to be instantiated as generic parameter using one of the above container components, you can't attach them directly as component
- Added AudioSourceWaveformMesh (a type of RectMeshSource), which visualizes realtime audio waveform from arbitrary audio source
-- It has configurable number of Points (currently samples aren't averaged over an interval), width, color and UV scale
-- You can also configure HistoryLength (in seconds, up to 1 second), which determines how much of the audio data duration is visualized. Lower values are recommended
- Added full support for TimeSpan type in the Neos' data moadel
-- This now also allows a TimeSpan LogiX variable to be created (requested by @Earthmark)
- Added nodes to set Slot's transform in one operation (requested by @Turk, @H3BO3,@Electronus and @KierDran):
-- SetLocalPositionRotation
-- SetLocalTransform
-- SetTRS (mildly dangerous, make sure your TRS is valid, otherwise use the ones above)
-- SetGlobalPositionRotation
-- SetGlobalTransform (I strongly recommend using the one above instead, setting global scale can lead to lots of problems, you were warned)
-- SetGlobalTransformMatrix (This one is even easier to shoot yourself into foot with. Use only if you absolutely know what you're doing)
- Added "SetUserScale", which allows setting the global scale of the user while preserving their position in the world (requested by @Shifty | Quality Control Lead)
-- It also has optional "AnimationTime" input, which will smoothly animate the scale. Default is 0, which is instant change
- Added ∅ (set null) button for string value fields (requested by @3x1t_5tyl3)
- Added "Recalculate All Normals" and "Recalculate All Normals (merged)" to Asset Optimization Wizard (requested by @AdmiralSoap and @Kal)

[h2]Tweaks:[/h2]
- Added generic type presets to DataPresetValue (suggested by @Earthmark)
- Categorized Brush tooltips under Tools/Brushes (based on suggestion by @Hayden (PolyLogiX Studio))
- When loading data, null string values will no longer decode as empty strings (based on report from @Alex from Alaska)
- Upgraded to Vive Hand Tracking SDK 0.9.4 (from 0.9.3) (suggested by @Danyy59)
- Upgraded to SR Anipal SDK 1.3.1.0 (from 1.3.0.9)
- DefaultUserScale will now update the default value continually, rather than just on equip (based on report by @Shifty | Quality Control Lead)
- World open/focus nodes will not close a current world for the host if they own the world and have unsaved changes (based on feedback by @ProbablePrime)
- Small optimizations for segmented mesh builders
- Improved resampling playback rate precision
- Removed deprecated "RemotePressSpeed" from PhysicalButton (based on report by @sirkitree)

- Merged Czech locale additions and fixes by @rampa_3 (UTC +1, DST UTC +2)
- Merged Russian locale additions by @Shadow Panther
- Merged Japanese locale fixes by @Aesc

[h2]Bugfixes:[/h2]
- Fixed inventory folder sorting separating items by the case, causing order to appear non-alphabetical (reported by @PeterTheThinker)
- Fixed audio playback throwing exceptions (causing audio glitches & performance degradation) when playback position ends up aligning with the last sample of aligned decode block for stream-decoded audio clips
- Fixed crash when joining a world while another user leaves due to permission validation trying to use data from the disposed user (discovered on @Nammi's headless)
- Fixed DefaultUserScale ignoring SetOnEquip setting (reported by @Shifty | Quality Control Lead)
- Fixed world focusing breaking when there are worlds with null SessionID (reported by @ProbablePrime)
- Fixed "status" command displaying incorrect uptime on headless (reported by @Shadow Panther)
- Fixed being able to record voice messages to non-contacts (reported by @Vixus)
-- This was only UI issue, the message would get rejected by the cloud server