Neos VR - Frooxius
Hello, and welcome back to the weekly update!

This week we have a few new minor, but powerful features, including the ability for Facets to keep running even when minimized, ability to project arbitrary 3D objects on the dash, new LogiX wire visuals which make it easier to see the flow of code and new self-moderation features! Check out the new features below!



New Facet Capabilities
The Facet system has gained two new crucial abilities that expand their versatility. The AlwaysOnFacetModule component ensures that part of your Facet hierarchy will always stay on and keeps updating.

This lets you run any logic and other behaviors (like audio playback) even when the dash is closed, which is useful for things like music players, alarm clocks, notifications, custom dash behaviors and lots more!

Accompanying this is another component for UIX called ProjectedRectSlotDriver, which allows positioning 3D objects based on the RectTransform and automatically ensuring that those objects are correctly projected when the Facet is placed inside the curved Dash and other UI’s that use a non-flat projection.

In other words, this lets you show arbitrary 3D objects on your dash! Now you can make Facets that show private mirrors, emit sounds or particles from the actual point where you see them on the dash or just add a friendly 3D houseplant to your private dash!

This will enable lots of cool workflows in the future as well, like popping out a 3D preview of items in inventory or adding 3D effects to any UI.

We hope those new components will help you build even more powerful and versatile Facets than before and we can’t wait to see what kind of uses you’ll find for them!



Banning people from specific worlds and pre-banning
Based on a community request, we have added new self-moderation tools to your repertoire, to give you more control over your own sessions. You can now pre-ban people from your sessions through the friends list, by searching for their name, selecting them and using the buttons on top. You don’t need to add them as your friend to do this.

This way you don’t need to wait for them to come to any of your sessions to apply the ban. A new form of ban was added as well, which prevents the person from joining a particular world that you’re currently in, giving you a more fine-grained control for certain situations.

For this to work, you need to have the target world loaded and it needs to be saved either to your machine or to do the cloud for this option to be available. When you ban someone from a particular world, they are still free to join your other sessions.

We hope those tools give you more control over your experience and to deal with unpleasant situations.

Various updates in preparation for the new World Browser
Our current task is reworking the world browser UI and unifying the world switcher, session joiner and world browser into a single consistent UI. While parts of this are still being designed, some underlying improvements and additions have been made in preparation.

For example Projection360 material now has new Perspective projection mode, which lets you do a traditional 2D perspective projection of 360 photos, with the ability to look around and change the camera field of view.

Other parts of Neos have received some tweaks as well, such as the LogiX visuals. The wires and connection points were updated to better visualize the flow and help distinguish between value wires and impulses.



UIX has received a bunch of new improvements and bugfixes. For example the GridLayout can now auto-size the child elements to fully fill the available horizontal space, rather than leaving a gap and RectSizeDriver lets you control other elements (like 3D objects) based on the size of the RectTransform in the canvas.

We’ve discussed some of the features of the new UI on our last stream if you’re interested in more information.

https://www.twitch.tv/videos/689707812?filter=archives&sort=time



First round of moderators chosen!
It is our pleasure to say we’ve finally graduated our first round of Moderators! Bobotron, CanadianGit, Dante, H3BO3, Kal, LeonClement, Turk and Vigilabo have endured a long and strict 6 month vetting process to prove their determination to help keep Neos safe! If you feel you need moderation assistance in your worlds, you can go to these individuals for help!

You can find identify them by the silver Neos badge and a blue name (we recommend checking the session dialog to verify the badge, as users can have custom nametags). Meanwhile for Discord related problems, you can ping the @Discord Moderators role.

This is the first round of moderators, and there are many more who have recently joined the vetting process. If you feel you have something to contribute to the moderation team, please contact Veer, either on Neos or on Discord, and he will talk to you about the requirements and then give you an application. Welcome, new Moderators, to the Moderation team!

What’s Next?
We hope to have a working version of the new world browser ready in this upcoming week and replace the old inconsistent system. We believe that this will greatly help new players as well, as it will reduce the number of different interactions they need to learn and make it much easier to join populated sessions, while also giving existing players better filtering abilities.

And as usual, thank you for reading our weekly update and supporting this project, we wouldn’t be here without you! We’ll see with you with the next one!

Neos VR - Frooxius
New capabilities for Facets, you can now have parts of Facets be always on (useful for playing sounds or running LogiX when the Dash is hidden) and project arbitrary 3D objects onto the dash (e.g. mirror). Various other smaller additions, tweaks and bugfixes included as well.

New Features:
- Added AlwaysOnFacetModule (under Radiant UI/Utility), which will ensure that all children of the slot this component is on will get parented under always Active hierarchy
-- This allows creating facets that have behaviors that stay running even when the dash is closed (requested by @Nexulan, @Coffee | Programmer and others)
-- The component also respects the Enabled property. It will automatically move the children back to normal hierarchy when disabled and move them to always active hiearchy when enabled
-- It makes sure the reparented children are properly saved with the facet when the workspace is saved, there's no need for a mechanism to spawn a new instance on load
- Added ProjectedRectSlotDriver (under UIX/Utility) which will drive transform and parent a target slot based on the UI rect position, projected through a canvas projector (if present)
-- Specifically, this can be used for Facets with the curved Dash to project 3D objects on the curved screen automatically when the Facet is placed
-- This works with any objects. E.g. you can now make a Facet which spawns a private mirror and works in the dash
- Added RectSizeDriver (under UIX/Utility) which will drive a 2D field using the absolute size of the Rect it's on, multiplied with optional scale
-- You can use this to size objects appropriatelly based on the size of the canvas/rect they're in (e.g. the actual placed size of a facet)
- Added DebugTransform component which will print out the hierarchy it's on for a given user (under Debug category)
- Added HoverEnter and HoverLeave to the Button Events node (requested by @Toxic_Cookie)
-- Note that not all buttons have hover events, particularly the NeosButton.
- Added pulse random Logix node (implemented by @Coffee | Programmer)

Tweaks:
- Added quaternion overloads to the delta node (requested by @Cyro)
- Updated connector visuals to show directionality and increase contrast (based on feedback from @reddragon, @H3BO3, @ProbablePrime, @Turk and @Enverex, implemented by @Coffee | Programmer)
- Background thread snapshot in Debug Dialog (and with the F9 key) will now unwrap async state machines, to provide information about which async task is currently running (based on snapshots provided by @bobotron)
- Background thread snapshot now also includes hash of the task, to help differentiate different instances
- Neos can now classify the LZMA and LZ4 encoded objects/worlds just from the data, fixing scenarios where those objects could not be loaded due to the original extension being unknown (all cloud assets are also being reclassified)

Bugfixes:
- Fixed ExternalSlotSaver causing crash on save when the target is itself (reported by @Shifty | Quality Control Lead)
- Fixed context menu appearing when BlockRemoteEquip is enabled on a tooltip (reported by @Hayden (PolyLogiX - ZyroDesign))
- Fixed DuplicateBlock placed on the avatar preventing all items from being duplicated (reported by @ProbablePrime)
- Fixed incorrect detection of RiftS Touch Controllers
-- This fixes incorrect tutorial graphic appearing on the dash (reported by @Rue Shejn | Artist 3D and @Earthmark)
-- This also fixes incorrect overlay model appearing for the contextual tutorials

Neos VR - Frooxius
Extra patch, forgot to include new controller graphics made by @Coffee | Programmer. Compatible with previous build.

Tweaks:
- Added graphic for Cosmos controllers (made by @Coffee | Programmer)
- Added new simpler version of controller diagram for the screen mode (made by @Coffee | Programmer)
- CV1 version of Touch controllers now have their custom graphic to prevent confusion (based on feedback by @Electronus) (made by @Coffee | Programmer)

Neos VR - Frooxius
Currently I'm focusing on the new unified Worlds UI/Facet (combining world switcher, world browser and session joiner into one interface). It's still being designed, but here are some things that have accumulated along the way, like new Perspective projection for 360 shader, GridLayout auto-fitting, UIX bugfixes and more!

Visibility of lasers has also been tweaked so they show less for other users and to prevent cases where they briefly flicker when moving a hand around rapidly.

Also includes new LogiX wire visuals by @Coffee | Programmer! Other changes are still being worked on before they're ready to be merged to the main build.

Now there's also ability to save objects outside of hierarchy together with the object! This lets you make objects that unparent some important pieces during use, but can be safely saved, without losing those pieces.

Based on urgent requests, also added ability to ban people from specific worlds, without need for them to join - you can search for them in the Friend list. Also includes the global ban from all your sessions too.
New Features:
- Added "Perspective" projection mode to Projection 360 material, which renders a perspective projected view of the image to the UV coordinates of the mesh it's on
-- This works essentially like a traditional camera view for 360 photos in screen applications
-- You can use The new PerspectiveFieldOfView and PerspectiveAngleOffset fields to control the projection properties
- Added "ExternalSlotSaver" (under Utility), which will ensure that a referenced slot is saved as a child of the slot this component is on even if it's outside of the saved hierarchy
-- This can be used for any items that parent some crucial elements outside of themselves during use, making sure those elements are saved with the item
-- It allows overriding the local position, rotation, scale and active state of the item when it's saved
-- The hiearchy change is only applied during the save, after the save is finished the target slot remains where it was originally before save
-- It also ignores the "PersistentSelf" by default, making sure the target slot is saved despite being non-persistent, but allowing it to be set as such so it's not saved as part of other objects it's parented under
- Added "ExpandWidthToFit" to GridLayout, which will auto-expand the size of the cells to fill remainder of the free space
-- This can be used so the grid perfectly fits the width of the container, even if the size isn't a multiple of the CellSize and Spacing
-- You can also use "PreserveAspectOnExpand" so the height of the cell is scaled by the same ratio as the width, preserving the aspect ratio (default on)
- Added basic Viveport profile integration (in preparation for @jasonmo's Metamovie project)
- Added "Notify Modified" node under "Interaction", which allows sending modification events up in the hierarchy for components
-- This can be used to trigger the dash workspace to save (requested by @Toxic_Cookie and @Alex from Alaska)
- Added ability to ban any registered user from all sessions through the Friends list (based on feedback by @GearBell, @Ryuvi, @Zane and many others)
-- They don't need to be added as friend, simply search for them
-- This allows banning people without having to wait for them to join the session
- Added ability to ban any registered user from a specific world (requested by @GearBell, @Ryuvi and @Zane)
-- This is also done through the friends list, by finding the user and selecting them, the buttons appear in the upper bar
-- It will ban the user specifically from the world the user is in.
-- The world must be saved for this option to be available.
-- This is persistent for the given user and saved as part of the profile in the cloud, but doesn't transfer to other hosts of that world
-- User will still be able to join other worlds by the same host
- Added "Damping" property to CharacterController, which controls what percetange of player's velocity is removed over a unit of time
-- This can be used to easily setup physical fly (set damping to 1.0 and AirForce to a high value) (requested by @Nexulan, @Rue Shejn | Artist 3D, @Shifty | Quality Control Lead and others)
- Added "SearchFromEnd" to IndexOfString, which will search the string backwards for a match (requested by @Alex from Alaska)
- Pressing F9 on keyboard will log a snapshot of the background workers to the log file
-- Added to help diagnose some resource starving issues (reported by @Rukio, @ProbablePrime and @H3BO3)
-- If you experience UI freezing, press the F9 key repeatedly (about twice a second is enough) for about 10-20 seconds and then send the logs

Tweaks:
- Revamped Logix wire visuals to indicate flow direction (implemented by @Coffee | Programmer)
-- This also changes the texture for impulse wires to be visually distinct from other wires
- Changed Impulse connector texture to be visually distinct to other inputs on Logix nodes (implemented by @Coffee | Programmer)
- Tweaked interaction laser visibility behavior for other users to prevent it from being distracting in some cases (based on feedback by @GearBell, @Rukio, @Shifty | Quality Control Lead, @Turk, @H3BO3 and others)
-- For grabbing it's now only shown when holding the object
-- For interaction, there's a small grace period before it shows, to prevent it from flashing briefly when it happens to hover over an item
- The easter egg exit messages now show who submitted the currently shown message
- Added memory pooling to loading/saving events
- Renamed "Sequence" to "Impulses" on ImpulseMultiplexer
- Tweaked some join error messages for better clarity
- Optimized Grid procedural mesh generation
- Upgraded to Unity 2019.4.5f1 (from 2019.4.4f1)

Bugfixes:
- PerformanceMetrics component will automatically link local user when it's in the Userspace
-- This fixes the FPS facet (and any others that use this) randomly breaking when local database is cleared or the link to the user is somehow broken (reported by @Shifty | Quality Control Lead and @Turk)
- Fixed equipped item repositioning triggering for other users when toggled on and off (reported by @Conduit)
- Fixed non-functional B button on the Cosmos Controllers (reported by @I wont shut up about reflections)
- Removed useless outputs (analog Grip, Grip Touch, AB/XY Touch and Menu Touch) from the Cosmos Controllers (reported by @I wont shut up about reflections)
- Fixed keyboards being favoritable from public folders (with exception of owned by the Neos group) - you need to save a copy to your own inventory - only favorite keyboards you trust! (based on feedback by @Alex from Alaska)
- Added extra logging information for cases when local elements are attempted to be encoded, resulting in a world crash (based on report by @Enverex)
- Potentially fixed UIX canvas randomly breaking for certain users due to corrupting awaitable task state (reported by @KierDran)
- Fixed GridLayout not recalculating the layout when only the width of the parent container changes\
- Fixed default filename when exporting a photo defaulting to "FrooxEngine.PhotoMetadata" instead of the actual photo label (reported by @Shifty | Quality Control Lead)
- Fixed number of vertices for GridMesh being swapped between flat shaded and smooth shaded variant
-- This fixes the GridMesh breaking when flat shading is turned on reported by @A Monsoon of Babies)
-- This also fixes lots of unused invisible vertices being generated for smooth shaded version

Neos VR - Frooxius
Hello, and welcome back to the weekly update!

This week we have a couple new things to talk about, with our new inclusion of the MikkTSpace algorithm for calculating tangents and the Vive Cosmos support! We’re also introducing a new easter egg perk for our Patreon supporters.

The Japanese community has also held a Cross Universe Tournament in Neos, check it out below in community highlights!





MikkTSpace Algorithm
We’ve implemented this ubiquitous algorithm which is utilized in Blender, Substance Painter, Marmoset Unity, Unreal Engine and many other creative tools, so that your designs in these programs will look the same when uploaded into Neos.

Prior to this, we were using a much simpler algorithm to calculate tangents, resulting in some normal maps and height maps looking incorrect in Neos, particularly on a more complex geometry.

This algorithm produces a lot more robust results and ensures consistency for generated tangents across different tools and as such it has become the de facto industry standard. For this reason, it’s integrated natively into Neos itself.

It is automatically applied on imported 3D models, but you can also recalculate tangents of any existing model through the inspector, by clicking on the “Recalculate Tangents (Mikktspace)”. The original simpler algorithm is available in this manner as well.

Because we couldn’t find any existing library to utilize this algorithm from C#, we have created our own and made it open source (MIT) for anyone to use! Since Neos greatly benefits from many open source projects, we are happy to have found a small opportunity to contribute ourselves.

You can find the repository for Mikktspace.NET with both native and C# code here on GitHub, with scripts for compiling for Windows, Linux and Android (ARMv7) as well as precompiled binaries. The algorithm itself has been designed by Morten S. Mikkelsen and you can read more about its benefits here.

Vive Cosmos Support
Until now, due to a lack of high demand, Vive Cosmos controller support has not been implemented, causing Cosmos players to not be able to use Neos in VR. We’ve heard of a few new players having this trouble, so we’ve decided to fix this so they too can enjoy Neos.

For now, the Cosmos support might not be without bugs, so for our Cosmos users, we need your feedback in the bugs-feedback channel or on the GitHub! It’ll really help speed along the debugging process for your system, since we do not have the hardware for our own testing.

We want to support as much hardware as possible, so even if you feel you may be in the hardware minority, let us know what you’re using and we’ll act if we get enough demand for the product.

Put your permanent mark into Neos through a custom exit message
As many of you have already noticed, with our new Radiant UI, Neos now features a small easter egg on the exit screen - random exit messages, that range from various quotes, references to some in-jokes.

Every time you exit Neos there is a random chance to get any of those messages for any user. We’ve had fun adding more of those each build, so we thought, why not share some of the fun with you?

Starting now, if you’re a Patreon supporter starting at the Neuromancer level, you can submit your own custom message that will have a chance to appear for any of the users. If you have a message you’d like to add, let a team member (ideally Shifty) know through our official Discord channel.

The messages need to be fairly short (maximum 2-3 sentences) and appropriate for the general public, but other than that they can be generally anything. However we reserve the right to deny or remove any potentially controversial messages. If you’re a higher Patreon tier you can submit multiple (check the Patreon tiers for details).

The location and/or presentation of this easter egg might change in the future as well (and it doesn’t show up at all when using the Neos Pro license), but we do want to keep it around for fun permanently, so there’s a good chance your message will still be popping up years into the future (it will stay even if you’re no longer a Patreon)!

Community Highlights
Cross Universe World Championship 2020
The Cross Universe World Championship was held last night and streamed by Nexulan! We had many contestants from across the globe competing to win, and we have the whole thing archived down below, so check it out!



Rukio’s Twitch Streams
Rukio has been streaming Neos for quite some time now, and is quite the talented world designer. He’s a very gracious host who streams Neos and other games, so go check him out!



Vigilabo On The Keyboard
This clip was from one of Rukio’s streams, showing Vigilabo creating and playing some loops on his keyboard! It’s quite a catchy tune, definitely well worth the listen!



Rhenium is making a texture painting system
This system seems quite interesting! Rhenium is making a tool that allows one to paint a projection onto an image with some new custom tools.



What’s Next?
This week has been a bit quieter on updates, as we’ve focused on some smaller things and taking a bit of a break on the development, so our goals remain pretty much the same. We’ll be continuing the UI overhaul, by recreating the world switcher as a Facet and then adding ability to place Facets on the avatar.

After this, reworking the World browsing UI is going to be the main priority, which will involve integrating it with session joining, to make finding populated worlds much easier, particularly for new users.

On the side, we’re also investigating switching to the official libVLC Unity bindings for video playback, as the current solution (UMP) is the source of majority of crash reports and hasn’t received any new updates in well over a year. Hopefully the switch will be relatively smooth and help improve stability and control.

And as usual, thank you again for reading this weekly update and for supporting Neos!



Neos VR - Frooxius
Just a small patch. Should fixup some issues with the Vive Cosmos support and adds a LogiX node for accessing its raw inputs. Also important fix for inventory items getting orphaned in rare cases, where they exist in a inventory path that doesn't have a corresponding folder for it. A few more tweaks and bugfixes as well.

New Features:
- Added "CosmosController" node for accessing raw inputs from the Cosmos Controller
- Added autoSleep configuration property to headless (default true). Disabling this will ensure that the world always runs full updates even if nobody is present (based on feedback by @guillefix)
- Added "Smoothing" and "Power" to VolumeMeter component to give more control on how it the volume measured (based on feedback by @H3BO3)

Tweaks:
- Inverted the "Smoothing" range on AudioDeviceVolume to be more sensible (0 smoothing will not smooth at all), existing instances are auto-updated

Bugfixes:
- Added a mechanism to prevent rare cases of orphaned inventory items (items in folder paths that were deleted) (based on reports by @Enkiko)
-- All existing items were revalidated and folders regenerated where necessary. You might find folders appear in your inventory that were previously there. You can safely delete those (EDIT: I just checked the report for this, looks like only two users (including Enkiko) were affected, so this is very rare indeed. The fix should prevent future occurrences of this, only seem to happen when you run out of space)
- Fixed incorrect binding for the context menu on the Cosmos controllers (based on report by @I wont shut up about reflections)
- Added a small grace period (4 frames currently) for running full update cycles on worlds that turn into background worlds, which lets any logic that disables things to run (based on report by @Enverex)

Neos VR - Frooxius
Fixing Mikktspace generation for multi-submesh meshes, initial (UNSTESTED!!! Please try it out if you have the headset and controllers) support for Vive Cosmos, some new commands to help with analyzing your storage usage (they're very technical right now, but should help in some cases if you really need to use them)

New Features:
- Added initial support for Vive Cosmos Controllers (requested by @I wont shut up about reflections and @Zalno)
-- This includes input bindings and handling controller inputs for Neos interactions
-- CURRENTLY UNTESTED!!! I'll make any fixes and tweaks as necessary based on this build
-- LogiX nodes for accessing Cosmos-specific inputs aren't included yet
- Added /requestRecordUsageReport command to the Neos account in your friends list, which will generate a basic storage usage report for your account and send it to your email
-- This list includes all records (worlds, items...) on your account that use any storage, sorted by sum of the sizes of their assets
-- This doesn't take into account assets that are shared across records. The raw sum of all records is very likely going to be much higher than your actual storage usage, because shared assets are only counted once
-- Conversely if you delete a world/item, your storage won't necessarily go down by the amount reported, but only by how many unique assets it has. If the assets are used by other records, your storage won't go down by the full amount
-- Additionally some assets are "free", like various Neos assets (e.g. some stuff you find in public Neos inventory) and will be counted in the report, but doesn't actually contribute to your storage
-- The report includes name, path, ID, record type (and whether it's message item) and public status of each record
- Added /deleteRecord <record ID> command to the Neos account, which allows you to delete any record from your account by its ID
-- IMPORTANT! It doesn't ask for confirmation, double check you've got the right Record ID as this action is mostly irreversible.
-- You can use this to delete some message-item records for the time being. For inventory items and worlds I strongly recommend using in-game UI
- Added "AdminX" utility in the "Tools" folder in Neos installation
-- This lets you conveniently run the above Neos commands outside of Neos from command-line interface after logging into your account
-- When running commands through this tool, don't include the initial slash in the message
-- You can use echo <message> command for testing
-- This tool requires .NET Core 3.x runtime installed

Optimizations:
- Removed all memory allocations when enumerating mesh submeshes
-- This severely reduces memory allocations for functions that do this often, e.g. fetching faces by their global index or triangle index (used for fetching hit triangle from raycast or during Mikktspace calculation)

Bugfixes:
- Fixed incorrect global mesh face/triangle indexing, particularly when there are multiple submeshes
-- This fixes the Mikktspace algorithm producing incorrect results, making some parts of meshes appear black (reported by @Aegis_Wolf | Art Director, @Dante, @Sykes, @Ubes and others)
-- You can recalculate tangents on already imported meshes using Mikktspace through the inspector to fix the wrong tangents (I STRONGLY recommend doing this if you already recalculated using simple one, as the mesh might've ended up with a weird mix of tangents)
- Fixed Headless client/server not updating Thumbnails and other behaviors properly (reported by @Enverex)
- Added more diagnostics for canvas update cycles to help diagnose bug reported by @KierDran

Neos VR - Frooxius
Native support for MikkTSpace algorithm for calculating tangents! It's on by default for newly imported models, you can also recalculate it for any existing mesh from the inspector. This should fix many inconsistencies in normal maps and height maps and visual artifacts.

Also a bunch of other stuff that has accumulated. Improvements for headless and some fixes for handling permissions/roles. Fixes for incorrectly used video playback engine in some cases, causing potential crashes.

New Features:
- Integrated the Mikktspace Tangent Space calculation algorithm directly into Neos (recently requested by @H3BO3)
-- This should produce more robust results and fix visual artifacts (like normal map seams) for models. This algorithm is very widely used (e.g. by Blender, Unity, Unreal Engine, Substance Painter and others) so the tangents should now be consistent with many industry standard tools
-- It is now used by default on imported models, instead of Assimp's tangent space calculation.
-- You can also run it manually on any existing mesh through the StaticMesh in the inspector, by running "Recalculate Tangents (Mikktspace)"
-- Since there wasn't existing .NET Wrapper for this algorithm, I've made one and published it as open source under MIT for anyone to use! https://github.com/Frooxius/Mikktspace.NET
- Added overloads for Math function nodes with two inputs that accept scalar as first argument and vector as second
GitHub
Frooxius/Mikktspace.NET
A .NET / C# wrapper for the Mikktspace tangent generation algorithm - Frooxius/Mikktspace.NET

Tweaks:
- Increased number of parallel jobs for processing uploads and record syncs, reducing some queue stalls with long-running jobs (this should reduce cases of the syncing sometimes taking a long time)
- Disabled RTF parsing for Input and Display LogiX nodes, making it easier to edit/diagnose strings with RTF tags in them
- Some internal moderation tool improvements (based on suggestions by @CanadianGit, @Veer | Chief of Moderation and @Dante)
- Some other internal security improvements
- Sealed many of the LogiX node types, potentially enabling compiler/JIT optimizations
- Set Global/Local Rotation/Scale nodes now use identity rotation/scale as a default when value is not plugged in (suggested by @Alex from Alaska)
- Headless will now skip most heavy updates in the gameloop if no users are present in the world, effectively treaing it as a background world (based on previous feedback by @Enverex)
- Changed default order of dash screens (based on suggestion by @Shifty | Quality Control Lead)
- Tweaked dash screen button colors
- Headless client/server will now use the higest available role when setting up role overrides, rather than skipping assigning it altogether when the role is higher than the host is allowed
- Upgraded to Unity 2019.4.4f1 (from 2019.4.3f1)
- Updated the Debug build of Neos

Bugfixes:
- Fixed VideoTextureProvider getting corrupted when unexpected error occurs in youtube-DL (e.g. due to invalid URL) and not loading any subsequent videos (reported by @A Monsoon of Babies)
- Fixed invalid playback engine switching when playing videos from URL with unknown MIME, resulting in Unity Native being used when libVLC should be used instead and resulting in potential crashes (reported by @RΞBOЯИ through @Shifty | Quality Control Lead)
- Fixed Atan2 LogiX nodes having swapped X and Y inputs in relation to the underlying function (reported by @Zyzyl)
-- Exiting instances will have their inputs swapped on load to preserve the original behavior
- Fixed some more potential time comparison errors due to local system timezone (when updating world statistics and focus changes)
- Fixed headless host not getting assigned proper role (effectively defaulting to Admin), causing odd behaviors in the permission system (e.g. not being assign certain roles in some cases, but giving role higher than it normally could in others) (based on feedback by @Enverex)
- Fixed headless host using the DefaultHostRole when determining which role can and cannot be assigned, rather than taking the actual Host role into account
-- This fixes odd behavior where the host is a friend or has an override and as a result gets a higher role than regular host, but this higher role isn't taken into account (based on feedback by @Enverex)

Neos VR - Frooxius
Welcome back to another weekly update!

This week we’ve reached another important milestone with our UI overhaul, finishing the ability to customize the layout of the new RadiantUI dash and even make your own UI pieces for it! Some other parts of the new UI have also gotten extra polish and cleanup, like the lasers and gripping system.

In other news, we’re also finally made our official Neos Merch stores open! If you’re interested in getting some official Neos Merch, check the links down below. We’ve got T-shirts, bandanas, stickers, buttons, mugs and more!

We also have some amazing community highlights, the Neos East Japan have created a mindblowing virtual smartphone in Neos, with support for apps!



Customizable Radiant UI dash
Earlier this week, we officially released the ability to customize your own dash. Simply activate the UI editing mode. This will show a grid on the dash and let you grip out the Facets (pieces of UI) and move them around.

You can drop them in another place (either the main screen or the upper bar), resize them by holding trigger and dragging or get rid of them by Destroying them like any other item. You can duplicate them as well if you want multiple copies.

If you accidentally make your dash unusable, you can reset it back to default through the Neos Launcher (configuration tool on Steam). Simply open the launcher, check the “Reset Dash” option and click the big “Launch” button.



How to toggle the UI editing mode
The UI editing mode can be toggled on and off at any time.

  • Index: Hold the A (lower) button on the left controller and double tap the same button on the right controller
  • Rift Touch: Hold the X (lower) button on the left controller and double tap the A (lower) button on the right controller
  • Vive: Hold the upper App/Menu button on the left controller until a circle fully appears, then double tap the same button on the right controller
  • Windows MR: Hold the App/Menu button in the middle of the left controller until a circle fully appears and then double tap the same button on the right controller
  • Screen: Press the F6 key on your keyboard

Make your own UI: Facets
One of the greatest strengths of Neos has always been its community and creative power and with the RadiantUI our goal is to bring this power to the whole UI itself. You can now build your own pieces of UI using the Facet system and bring them to your dash.

Not only has anyone the ability to rebuild the existing pieces of UI in their own image, but also build completely new functionality. To do so, you can start by creating your own Facet using the Create New -> Object -> Facet template.

This will create a simple UIX canvas with a Facet component attached on the root. This component defines how the canvas should be sized when it’s integrated into a container (like the dash) - you can specify minimum and maximum sizes, allowed aspect ratios and preferred sizes.

Within the canvas you can build any functionality you want as any other object. You can use LogiX, even put in some 3D objects (although you have to be careful with how they get used). Once you’re done, save the Facet into your inventory.

To spawn the Facet and place it into your dash, select it in your inventory and click the new purple button, with an arrow coming out of the square (this will change in the future). This will spawn the Facet in your private space and let you place it into your dash.



IMPORTANT: At this moment, this system is mainly for experimentation and building your own UI. Be wary which Facets you place into your private UI, as they can potentially contain malicious code that can access some of your private information.

Use Facets only from sources you trust, they should be treated as installing an application on your system. To help mitigate potential risks, you can only spawn out Facets you saved into your own private inventory at the moment.

As more measures and functions are put in place in the future, those restrictions will relax.

Polishing the rest of Radiant UI
Some of the previously introduced pieces of the new UI have gotten some extra polish. For example the lasers now have intensity patterns based on the action, which should help provide more information to visually impaired users (e.g. with color blindness or blurry vision).

Thanks to the new UI Editing Mode the equippable item grip repositioning has also been improved. Instead of being tied to the Builder Edit mode, it now uses the UI Edit Mode, so it no longer requires builder permissions to adjust the pose for weapons, tools and other items.

A lot of its glitchy behaviors have been also fixed and it can be now toggled on the fly, without need to equip and re-equip the item.

Official Neos Merch
You’ve asked for it and now it’s here! We’ve opened two official Neos VR merch stores: Redbubble and Spreadshirt! You can get some Neos themed stickers, buttons, mugs, T-shirts and a bandana!

The reason why we choose two stores is so we can offer different kinds of products and also have better shipping options based on what you choose. Here’s the main points for each:
Spreadshirt

  • T-shirts
  • Bandana
  • Hoodies
  • Mugs
  • Caps
  • Buttons



Redbubble

  • T-shirts
  • Stickers
  • Better shipping outside of US



We hope you’ll like the choices, but we’ve got some more to come! If you won free merch in our original giveaway, it should be shipping soon!

Community Highlights
Evolver Neos Phone by Neos East Japan
https://twitter.com/mikan3134/status/1282253366383370242
Looks like the NEJ team is creating something new and awesome again! This collapsible device resembles a really thin smartphone, and has the capability to store applications and tools. The NEJ team has made it really easy to add facets and other items using their custom app creator, so give this amazing device a try!



Reading Nook by Mcham3
A dreamy little world made to be a cozy reading area. I would personally love to have a room like this in my house, and I swear I’ve seen something like this in one of my dreams! Beautifully done, Mcham3!



‘MURICA by Creator Jam!
The jammers are back at it with their zany world designs! This one is complete with a fast food restaurant, yelling southerners, fried everything and a souped up american-flag painted monster truck with a mounted machine gun that fires fighter jets playing “America, f#$@ yeah!”. Happy 4th of July!



What’s Next?
With the dash itself now being customizable, we continue to expand this system, so Facets can not only be placed in the dash, but also on your avatar. This will let you place some key pieces of UI in different places for quick access, such as on your hands, your viewpoint or permanently pinned in your playspace.

We’ll also continue reworking more pieces of the old UI and build new ones as Facets. The next ones on the list are particularly the world switcher and the world browser, which will be merged with session joining, to make it easier for everyone to find active sessions.

Even in the short time we’ve already seen some amazing custom Facets and this is just the beginning for the new system, we can’t wait to see all the incredible stuff that you will create!

Thanks for reading this weekly update, we hope you enjoy the updates and we can’t wait to bring you more. And thank you for supporting Neos and making it better every day!

Neos VR - Frooxius
A bit smaller build today, doing some cleanup of issues and adding new small facets. Time to test the dash auto-upgrade systems, new "Paste content from clipboard" should be added to all dashes! :smile: (please let me know if it runs into some issues) Also tweaks and bugfixes as usual!

New Features:
- Added "Curvature" to RadiantDashStateSync which allows reading/writing the dash curvature (based on request by @SmolCookie)
- Added "VirtualMultiKey" under "Userspace/Virtual Keyboard", which allows simulating press of multiple keys on a single button press
-- You can use this to simulate combinations like Ctrl+C and Ctrl+V for clipboard actions (based on request by @Turk)
- Created "Paste Content From Clipboard" facet and put it on the Home screen by default
-- It will be auto-inserted into customized dashes too (you can always move it or delete it if you don't want it)
-- The equivalent button in the "Session" screen has now been removed

Tweaks & Optimizations:
- Text in the Friends list is now properly autosized, fixing cases where large or long world names end up overflowing
- You can now swap the Min and Max values on a Slider to reverse the range (requested by @Turk)
- Optimized CPU and memory usage when generating the UI for the Friends dialog
- Added a copy of the sync status Facet to the top bar by default (only for users who haven't customized their dash yet) (suggested by @Turk, @sirkitree and @GearBell)
- Added blue name badge color as the official Neos moderator indicator - you can approach those members with any community/moderation related issues
- Changed the Neos moderator badge to a more official one (graphic created by @Coffee | Programmer, suggested by @Veer | Chief of Moderation)
- Reordered name badges, so official Neos team/moderator badges always show first, then supporter badges (spark, flame, Patreon, Anorak) and lastly the custom ones (suggested by @Veer | Chief of Moderation on behalf of others)
- Updated the controller tutorial graphics to include information about which controller to use to open/close dash (updated by @Coffee | Programmer)
- The RTF tags are now stripped in the headless CLI interface for easier reading (suggested by @Enverex)
-- The "status" command is excluded, so it's possible to still check the actual full name, including formatting

Bugfixes:
- Fixed ComponentCloneTip not clearing the name when the template is cleared (reported by @Blaze)
- Fixed ambient occlusion effect not being disabled when "Postprocessing" is disabled on a Camera and causing multiple instances of the filter to accumulate when repeatedly toggled on and off (reported by @orange)
- Fixed controller haptics not working when triggered through the hand reference (this fixes haptics being broken after change to NearestUserHand reported by @Rukio and @Shifty | Quality Control Lead)
- Fixed race condition breaking an UIX canvas when Graphic maps a material that gets destroyed before the UIX update cycle completes
- Fixed Facets saved to inventory being named "FrooxEngine.Facet" (reported by @Shifty | Quality Control Lead and @Coffee | Programmer)
- Fixed race condition when pinning glyphs in a Font asset and the dynamic atlas hasn't been initialized yet

...