Neos VR - Frooxius
A tiny patch, mainly re-adding fix for legs jumping up that accidentally got reverted, new MTC strings for the upcoming release and some default generic types for some components! I'll be working on some bigger things and I'm not sure how long it'll take, so I wanted to get this out ASAP.

Compatible with previous build, don't need to update right away (unless you have the glitchy legs problem and you want to get rid of it).

Tweaks:
- Merged MTC Streaming Room Locale strings by @Rue Shejn | Artist 3D
- Added default generic version templates for several components (added by @ProbablePrime | Docs)
-- ButtonValueSet/Cycle/Shift
-- ValueOptionDescriptionDriver
-- DynamicValueVariableReset
-- ValueDriver
-- ValueTextFormatDriver

Bugfixes:
- Re-added fix for Slerp function that got accidentally reverted in the last build
-- This should re-fix the avatar legs randomly jumping up (regression reported by @Cael Thunderwing and @Earthmark)

Neos VR - Frooxius
Hello everyone, a smaller build this time, I'm spending more time poking around BEPUv2 now, but there are some goodies anyway! Leg haptics are now supported! (specifically for bHaptics right now, but it's generalized) Also some new nodes and changes to make it easier to work with Nullable values. There's more to do with those, but hopefully these help a bit already! A bunch of additions for the Context Menu Injection too (filtering primary/secondary and tools)!

New Features:
- Added support for leg haptics (requested by @Rue Shejn | Artist 3D, @Aegis_Wolf | Creative Director and @Ryuvi | Technical Artist on behalf of bHaptics)
-- Added LegHapticPointMapper which maps the haptics of avatar's leg to the haptic device (existing avatars are auto-initialized)
-- Legs are mapped from hips to angle (position along 0...1) with angular offset from the front facing (where knee/foot is facing) going left (negative) and right (positive)
-- Added support for bHaptics Foot mapping
- Added PackNullable and UnpackNullable nodes (under Operators/Nullable) (based on general feedback)
-- These allow you to unpack (get whether value exists and the value itself) and pack (set whether value exists and the value itself) of nullable struct types
- Added "Exclude On Tools" to RootContextMenuItem which allows excluding the option from being injected when opened with a hand that has active tool (requested by @Electronus)
- Added "Exclude Primary/Secondary Hand" to RootContextMenuItem which allows excluding the option based on whether it was opened with user's primary or secondary hand (requested by @Shadow Panther [RU/EN, UTC+3])
- Added "Reverse" input to the For node, which will run the loop backwards (requested by @Gawdl3y, @Shadow Panther [RU/EN, UTC+3] and bentallea)

Tweaks:
- Nullable type wires now use the color of the base type, but semi-transparent
-- We'll very likely change this when the visuals are fully redesigned, but it'll take some time to get to that
- Changed context menu Sprite reference to use more general IAssetProvider<Sprite> rather than specifically the SpriteProvider component
-- This fixes ValueOptionDescriptionDriver, ReferenceOptionDescriptionDriver and other components that use more general references and drives not working with ContextMenuItemSource and other parts of the system (reported by @Shadow Panther [RU/EN, UTC+3] and @seif1)
- DynamicVariableInput node name is now consistent with rest of the dynamic variable nodes and uses nice name (reported by RobertBaruch)
- Avatar heuristics will no longer detect "UnderEye" as eye bone (reported by @Sveny)

Bugfixes:
- All variable nodes now initialize proper default values (e.g. floatQ is initialized to identity, rather than an invalid rotation quaternion) (based on report by @Shifty | Quality Control Lead)
- ButtonValueSet<T> and ButtonValueShift<T> now initialize proper default values for all their fields (same as above) (reported by @Shifty | Quality Control Lead, @Ian Corvid)

Neos VR - Frooxius
Hello everyone, I'm back! :smile: Here's a bunch of smaller additions, tweaks and bugfixes to clear up a bunch of the GitHub issues that have popped up while I was on the break. This includes numerous improvements and fixes for the Context Menu Injection, LogiX, avatar legs randomly popping up (and other random glitches, as it was caused by an underlying math function that's used in a lot of places), glitchy audio on Unity Native video playback and more!

I'll be working on some larger things next, I've already started poking around BEPUv2, so that will be a major upgrade, but not certain how long will that quite take yet, as well as on some cloud and builds things to improve some internal processes. Hopefully this build will help get rid of some of the pain points in the meanwhile!

New Features:
- Added "Keep Position" to ContextMenuSubmenu which will not reposition the context menu when it's opened through this option (requested by @3x1t_5tyl3)
-- Note that you should make sure that the context menu is in a good position when it's opened first before using this, otherwise it'll end up in whatever random last position it was last spawned in, resulting in usability issues
- Added "OnlyForSide" field to RootContextMenuItem, which allows the context menu item to be optionally filtered based on the hand that opens the context menu (requested by @Shadow Panther [RU/EN, UTC+3])
- Added TooltipAvatarPoseFilter (under Transform/Interaction) which allows installing avatar pose filters when equipping tooltips (requested by @3x1t_5tyl3)
-- This needs to be placed on the same slot as the tooltip to work
- Texture Asset Variant system now supports RawRGBAHalf texture compression for HDR and high precision textures
-- This fixes HDR textures set as "Uncompressed" loading as LDR RGBA32 textures, resulting in loss of all the HDR data (reported by @SmolCookie | VRtualis CEO)

Tweaks:
- A dummy character controller is now activated when no locomotion module is active (e.g. when sitting in an avatar anchor or when all are disabled by permissions)
-- This fixes users in avatar anchors not being tracked by ColliderUserTracker and being excluded from culling systems and events
-- If you run into issues where you need the user to be excluded from events and such with your avatar anchor, let us know and we'll add a mechanism to provide this. Currently I'm not sure if there are any use-cases for this.
- SessionOrbsController now skips updates in background worlds with no users present to avoid unecessarily loading and unloading thumbnails
- Default User Scale is now respected when user is reset because of falling outside of the map or when their scale gets corrupted (reported by @Gawdl3y)
- Categorized Float2/3/4Driver components under Transform/Drivers (requested by @Epsilion)
- Importing all asset types (Audio, Fonts, import dialogs...) will now place them in the user's current space rather than root (reported by @Kyuubi)
- Pressing secondary when dragging a wire to a Type input on a LogiX node will now spawn the Type input node (requested by @3x1t_5tyl3)
- Increased the maximum value of "Cleanup Interval" in the session menu to 3600 (based on feedback by @3x1t_5tyl3)
- FindCharacterControllerFromSlot now ignores any disabled character colliders
- All avatar records that aren't in public folders have been marked as non-public
-- Note that you won't see this reflected in your inventory right away, as the records will still be cached. I recommend waiting a day and clearing your database if you want the UI to reflect the change, but it's not necessary for the security improvement to work

- Merged Japanese locale additions and tweaks by @Aesc
- Merged Russian locale additions and fixes by @Shadow Panther [RU/EN, UTC+3]
- Merged Korean locale additions by @Guide
- Merged Czech locale additions by @rampa_3 (UTC +1, DST UTC +2)
- Merged Spanish locale additions by @Ruz

Bugfixes:
- Fixed custom context menu not responding to changes of the Sprite on ContextMenuItemSource when the menu is opened (reported by @seif1 and @Axius)
- Context Menu open/close speed is now sanitized, preventing invalid values (0, negative, infinity, NaN...) from breaking it (reported by Asakleiman)
- Neos will now retry API requests on 502, 503 and 504 responses, which usually indicate transcient issues
-- This should improve robustness of cloud functionality and syncing (based on report by @Shadow Panther [RU/EN, UTC+3])
- Fixed Context Menu breaking when the Label is null (reported by @Hayden)
- Custom context menu will now preserve the CommonTool summoner and pointer when already opened or try to use the one from the hand that has opened it
-- This fixes flick misbehaving when opened from the main context menu (reported by @Gawdl3y)
-- This also fixes custom context menus not being usable when the laser is disabled (reported by @Electronus, @Hayden, @Ukilop and @Psychpsyo)
-- This also fixes the context menu not preserving its position when the item is clicked with other hand (reported by @Gawdl3y and @Psychpsyo)
-- This also fixes not being able to interact with the context menu when the laser is occluded by a collider (@Ian Corvid and @Epsilion)
- Fixed Unity Native video playback engine producing glitchy audio on videos that aren't stereo (e.g. Mono, Quad or 5.1) (reported by @Gawdl3y and @Enverex)
- Fixed Slerp operation producing NaN quaternions in some rare cases due to floating point imprecision, resulting in random corruptions and glitchy behavior
-- This fixes avatar legs randomly jumping up on some avatars (reported by @Earthmark, @Cael Thunderwing, @H3BO3 and @HaruMaki)
-- This will also likely fix other random cases of glitchy behavior across the board (including when you use the Slerp function in LogiX) as the function is used widely internally
- Fixed LookAtUser always looking at the local user when the target node is set to View (reported by @AshtonSparx and @Sox)
- Fixed "Prevent reticle from going below the horizon" option no longer working after desktop update (reported by @ooBLANKAoo)

Neos VR - Frooxius
Another build sorry! This is only tweaks to the Minecraft importer I made though, I wanted to push them out so everyone gets the improved handling for things.

Build compatible with previous one, no need to update unless you're playing with the Minecraft imports.

Tweaks:
- Culling colliders are now Spheres instead of Boxes
- Saplings now use alpha clip and have no collisions
- Rails and Powered rails now use alpha clip and have collisions (to avoid easily running on them like ramps)
- Light sources are now default off and controlable by World/Minecraft.Lights dynamic variable
- Torches now use alphaclip, fixing their look
- Redstone torches are now classified as torches as well (meaning no collisions and use proper alphaclip)
- Redstone wires now have no collision and use alpha clip

Neos VR - Frooxius
Hello everyone! I know I said no builds, but I ended up working on a silly thing that was just easier to integrate directly for now - Neos can now directly import Minecraft Worlds! :smile: It even sets them up with culling system (both rendering and assets), so you can import quite large maps.

I'm still playing with this now, so there will be some more updates to it, but it's not a feature that "official" right now, it's just there for you to toy with as well if you'd like, but it'll just be left as is at some point for a while. The source of it is available too though if you'd like to have a look or make contributions!

Also a few small addditions and tweaks (mostly related to this) thrown in!



Silly Features:
- Added support for directly importing Minecraft Worlds into Neos
-- In order to import, you need to install Mineways (https://www.realtimerendering.com/erich/minecraft/public/mineways/) either into C:\Program Files\Mineways or under Tools\Mineways in your Neos installation
-- To import, simply import the folder containing your Minecraft world (import the folder containing the level.dat file)
-- Alternatively import on the headless using importMinecraft <path to world> command
-- Neos will import all chunks with actual block data. For large maps import can take pretty long (dozens of minutes), but you'll be able to interact with the map as chunks of it import
-- Neos will setup and customize all the materials, collisions as well as a culling system which will only load meshes and render chunks within distance around the player to support large maps efficiently
-- For older maps, Neos will setup point light sources for torches (might turn this off if it ends up too heavy). For newer ones this isn't currently supported
-- Importer source code available for reference (and contributions) here: https://github.com/Neos-Metaverse/Minecraft2Neos
-- Please note that this isn't a fully officially supported feature, but something done for fun. Feature requests and bug reports won't likely be fullfilled unless we want to work on them. We might separate this into a separate optional importer plugin in the future.

New Features:
- ContextMenuItemSource now proxies button events as IButton, allowing it to be used with the Button Events LogiX node (based on feedback by @ProbablePrime | Docs, @3x1t_5tyl3, @Kal, @Cyro and others)
- Added "CloseMenuOnPress" to ContextMenuItemSource which will close the context menu when the item is pressed
- Added CloseContextMenu LogiX node (under LogiX/Interaction)
-- You can provide summoner, which will only close the menu if the current summoner is the same one as you provided. This is typically done so you avoid closing context menu when it was opened by something else in the meanwhile

- Added "Force Point Filtering" advanced model import setting, which will use point filtering for all textures on the imported model
-- Note this is mostly for stylistic purposes, do not use this as optimization technique
- Added "No MipMaps" advanced import setting for models, which will disable mipmaps on all textures
-- It's recommended to only use this when really needed for visual style, do not use this as "optimization" unless you really know what you're doing, otherwise you might cause visual artifacts and cause worse performance
- Added "Force Uncompressed" advanced import setting for models, which will set preferred texture format to RawRGBA
-- It's strongly recommended to use this only when really needed, typically for very small textures. Switch textures to alternate compression formats first like LZMA or BC7 variants first before using this option, as it will use significantly more memory (4-8 times more)

Tweaks:
- Neos and CloudX can now detect Matroska (MKV) file types from the header

- Merged Icelanding locale updates and fixes by @Nammi
- Merged German locale additions by @3x1t_5tyl3

Bugfixes:
- Batch importing models now imports them one by one, rather than importing everything at once in one go, causing the background processing to get overloaded and everything to freeze (reported by @Bitman (Neos.js Developer), @Elektrospy, @3x1t_5tyl3, @marsmaantje, @Ian Corvid and others)

Neos VR - Frooxius
I've got one last build for you before the week break, I just wanted to get a few of the quicker to do priority issues done and out of the way. Most notably proper context menu injection! This provides a proper, efficient and stable (it won't break due to random changes) mechanism to add custom items to your context menus or even open fully custom context menus.

It's designed to be pretty flexible, allowing you to show custom items on grabbed objects, tools (might add some more things specific to this if needed later), avatars and so on, check below for details.

Also a few bugfixes and tweaks as well!

New Features:
Added Context Menu Injection system for adding custom items (components under Radiant UI / Context Menu) (requested by @Earthmark, @Turk | Mentor Manager, @Electronus and GitHub / Patreon Priority Voting)

- Added ContextMenuItemSource, which provides desceription of a context menu item - label, color and sprite
-- Disabling this component will prevent the item from being injected
-- All the visuals are driven in realtime and will be reflected even when the menu is opened
-- Any button press and hover events are relayed to the Slot that this component is on, allowing you to use all the standard button components and events (under Common UI / Button Iteractions)
-- ButtonEnabled property will still generate the item, but it will be disabled in the context menu

- Added RootContextMenuItem, which will inject target ContextMenuItemSource into the root menu whenever opened
-- In order to inject the item, it needs to be anywhere within the user's hierarchy. It uses efficient registration mechanism, so it can be placed anywhere in the hierarchy
-- This works for held items too - e.g. you can add custom options that will appear for grabbed objects
- Added ContextMenuSubmenu for invoking fully custom context menu
-- This receives standard button press events and can be invoked either from another context menu item or any other button
-- By default it will generate items from children of a Slot (they need to have ContextMenuItemSource on them), you can optionally enable it to search whole hierarchy using SearchWholeHierarchy, but it's not recommended for performance and does not guarantee order of items
-- You can disable flick, override opening speed and also generate the items in counter clockwise order

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

- Added ButtonPressEventRelay, which can relay button press events to another slot
- Added ButtonHoverEventRelay, which can relay button hover events to another slot

Tweaks:
- Removed the Patreon badge gap for now, until we find a better solution (requested by @Karel | CEO based on feedback)
-- Currently this technically breaks some of the guidelines, but should look visually better. We're looking into some alternate solutions, but those will take a bit longer

- Merged Russian locale fixes by @Shadow Panther [RU/EN, UTC+3]
- Merged Japanese locale tweaks by @Aesc

Bugfixes:
- Fixed internal check for value and reference types when setting up drives checking against the type of the field, rather than the value/target
- Fixed implicit color->float4 and float4->color casts not being generated in some cases
- Fixed audio clips imported from URL throwing an exception and not importing properly (found in a log from @ProbablePrime | Docs)
- Increased maximum nested depth when loading saved items and worlds, to fix cases of certain items with very deep hierarchies not being able to be loaded (reported by @Shadow Panther [RU/EN, UTC+3])
- Added extra logging for gather jobs to help diagnose gather jobs being stuck for some users
- Fixed LogiX tip spawning a node when holding an item with laser and double pressing trigger to switch to the freeform rotation mode (reported by @Snooper and Patreon Priority Voting)
- Removed collider from temporary LogiX wire when connecting nodes to prevent it from interfering with the laser (@Ukilop, @H3BO3 and @3x1t_5tyl3)

Neos VR - Frooxius
Hello everyone and welcome to another of our weekly updates!

With the first phase of desktop complete, we have focused on clearing up a bunch of smaller additions, tweaks and bugfixes. The desktop Freeform camera now automatically outputs your voice when applicable and we added more notes for accessing the user's viewpoint and camera state.

We added support for the HP Reverb G2 Omnicept Edition eye tracking, if you have this headset, your gaze, eye openness and pupils should now be mapped to your avatar out of the box! More of our native dependencies have been moved to Azure Pipelines and updated to latest version too, notably Opus, improving voice and music compression quality and Freetype, fixing bugs and adding WOFF font format support.

For some quality of life improvements, LogiX itself received new nodes, particularly for bitwise masks working with vectors and the Material tooltip can now batch convert materials to another type. We have also fixed numerous bugs, crashes and made security improvements, details are in the post below!

And last, but not least, we did some significant optimizations to the session thumbnail system, reducing CPU, memory and network bandwidth usage, as well as making more related optimizations for UIX panels, which overall improve smoothness of the experience and reduce a lot of cases of microstutters.



Games of Neos livestream
On our last regular Friday livestream, we went back to a bunch of the fun worlds created by our community and played a bunch of games! If you missed it, check out the footage below, as we drive around some race tracks, figure out who the murderer is in MurderX, talk to ghosts to figure out meme pictures and more!



HP Omnicept Eye Tracking Support
With the release of the HP Reverb G2 Omnicept Edition headset, we have integrated the SDK to provide full eye tracking support for anyone owning this headset. This includes the eye direction, eye openness (closing your eyelids) and pupil size.

Thanks to our generalized input system, there’s nothing extra that you need to do on your end! If you own the headset and have the Omnicept runtime installed, simply starting Neos and using any avatars already setup with eyes will work out of the box, just like with the Vive Pro Eye headset.

At the moment there doesn’t seem to be an API available for the lip tracking functionality, once that is made available to developers we’ll be happy to integrate it as well, as providing more options for our users for expression is an important aspect of Neos.

Voice output for Freeform Camera and more desktop polish
We’ve also made some last additions and polish to our new desktop mode. Most notably, the Freeform Camera will now automatically output your voice for other users if they’re sufficiently far away from your actual avatar and the camera is closer, making it easier to communicate.

New LogiX nodes for accessing various desktop information were added as well, allowing you to find out where the actual user’s viewpoint is, whether their Freecam is active and whether it’s voice is currently active too.

If you have a customized view visual, you will need to set up the AudioOutput and AvatarAudioOutputManager as you’d on the rest of your avatar, but check the “IsViewVoice” field on the latter component, so it gets activated properly.

Also note that Whisper mode won’t work in the Freecam mode to avoid some weirdness (both your avatar and camera can be potentially heard), you’ll need to switch back to first or third person for this mode.

Updated Opus (audio encoding) and Freetype (WOFF font support)
Thanks to our ongoing transition to Azure Pipelines, we were able to upgrade more of our native dependencies to their latest versions easily. Among the libraries that we moved were Opus and Freetype, responsible for audio encoding and font decoding respectively.

We have upgraded the Opus library to latest 1.3.1 from 1.1.3, which includes several years worth of improvements and bug fixes and should help improve the audio quality, especially at lower bitrates. This library is used to encode both your voice over network, as well as any desktop audio with our audio streaming feature.

Freetype library is used internally for decoding font files for the text rendering system and has been updated to 2.10.4 from 2.10.0. This mainly includes bug fixes, including an important security patch. However we also now added support for the WOFF font format support, alongside TTF and OTF.

Currently WOFF2 isn’t supported yet, despite the Freetype library supporting it, because it requires additional dependencies, but we’d like to eventually add support for this as well.

New LogiX operator nodes
Based on a few requests, we have expanded the LogiX nodes to include new operators and overloads as well to make it easier to work with vectors and bitmasks in particular. Boolean vectors (bool2, bool3 and bool4) now work with the bitwise logical operators as well as bit-shifting and bit-rotating nodes.

Integer vectors like int2, int3, int4, long3, long4 and so on now support bitwise operations as well. Any vectors can also be used with comparison operators, producing boolean vectors. E.g. comparing two float3 values will result in bool3 with each element of the vector being compared individually.

Batch Material Conversion
As a quality of life improvement, we added the ability to batch convert materials in the hierarchy to another type. Previously you could use the Material Tooltip to convert a single material, but oftentimes users would need to convert multiple materials in the scene or object/avatar.

In the latest version of Neos, you can simply grab a slot reference in the inspector with the Material Tooltip and you’ll see a new option in the context menu “Convert All To…”. Running this will convert all the materials within that hierarchy to a particular type.

As another quality of life, we also made the extraction process for all the materials in the hierarchy undoable, so you don’t have to manually delete all the orbs if you do it by mistake.



Mipmap Generation Control
Another quality of life improvement is now the ability to control mipmap generation for 2D textures. You can turn the mipmaps completely off for textures that you know won’t require them, such as skyboxes, saving some VRAM usage in the process.

For textures that do need mipmaps, you can now choose which rescaling algorithm will be used to generate them. You can currently pick between Bilinear, Box (default) and Lanczos3. The last filter in particular can be useful for certain textures and images, as it will produce sharper visuals at a distance, particularly with contrasting detail.



Updated Account / OAuth 2.0 website
The work in progress account and OAuth 2.0 website has received a small lick of paint courtesy of our new team member ProbablePrime and has been moved to a nicer domain https://auth.neos.com by Karel, in order to give it a more official look.

Alongside this we have also moved the main API endpoint to api.neos.com to help unify things a bit more, so if you have any 3rd party applications, make sure to update! The old endpoint will continue to function for a while, but will drop at some point in the future.



Optimized UIX and Thumbnail System
While investigating random hitches and stutters for the upcoming MTC Streamer room, we found a few underlying issues with the session thumbnail system and UIX and some related subsystems.

In the latest build we have implemented several different optimizations which overall should help reduce CPU, memory and network usage and provide smoother experience. Parts of the thumbnail system were removed to avoid overloading the system resources, particularly when just starting the session.

Headless servers will now also avoid compressing and reuploading thumbnails taken from other users or the default world thumbnail and any thumbnails are also registered with local cache, to avoid cases of having to redownload different instances of the same image or even own uploaded thumbnail in some cases.

We discovered that even disabled UIX canvases were being computed in the background, resulting in unnecessary CPU and memory usage. In the latest build, the UIX Canvas will defer any computations until it’s activated again. This way any inactive dash screens, closed dash, context menu or locally hidden/culled interfaces in the world will have minimized performance impact.

A few other smaller optimizations include directly loaded textures (thumbnails being a prime example) skipping metadata computation since it’s not necessary and any thumbnail updates in the UI being deferred until it’s activated as well.

We’re already getting reports of reduced microstutters and higher framerates on the latest build, so we’re happy that those changes are being felt despite being relatively small!

Fixed text layout glitches and flickering
Among many smaller bug fixes, one of the notable ones (if only for the few hours it took to narrow down) is the auto-size layout for the text rendering system. This has been actually caused by two major underlying issues, which have both been corrected.

Those combined caused auto-sized text to randomly spaz out and glitch when being changed and some words to get forcefully wrapped to multiple lines. With the bugfix in place, the text rendering system should now be more robust and produce more reliable results.



Favorite avatar security improvements
To improve general security of your inventory and particularly favorite avatars, we have reworked the mechanism by which your favorite avatar is loaded in worlds. Instead of the record being marked public and potentially accessible by anyone who knows its exact ID, a temporary one-time key is generated instead just prior to spawning.

While this doesn’t completely eliminate the possibility of ripping (that’s unfortunately not technically possible to prevent completely), it should significantly mitigate the possibility of one type of attack and provide better security hygiene by not marking avatar records as public.

We’ll be automatically unflagging those avatars as public soon as the new system proliferates, unless they are present in a public folder.

Various crash bugfixes & better Unicode handling
Other notable bugfixes from last week include numerous security improvements and some sources of crashes and freezes. A regression in network encoding for a few less commonly used types was patched, which resulted in worlds crashing on use.

Another notable fix is also for pasting invalid Unicode strings from the clipboard, for example when deleting half of Unicode character surrogate for certain symbols like 🔆. Previously doing this would freeze Neos until restart, although it would only impact the user executing this action and couldn’t be used for an attack.

In tandem with this, we improved the handling of Unicode strings for the text editing in Neos, which is now aware of those surrogate pairs and will treat them as a single symbol, rather than two independent ones.

bobool3ol

No two bobool3ol's are the same. They're always 7.

What’s next
With a bunch of smaller tasks, improvements and bug fixes out of the way and the first phase of desktop support nearly complete, I’ll be now taking a roughly week long break as mentioned in the last weekly update, to reset and refresh before tackling next major development tasks.

This unfortunately means that for the following week there will be no Neos updates, responses to questions and issues (from me anyway) and no weekly update next week, unless there’s an emergency. You’ll still be able to reach other team members in case you need assistance.

I hope that everyone will have a great week regardless. And as usual, big thanks to everyone for your support! Without you we wouldn’t be able to keep improving Neos every day! We’ll see you soon, with more big tasks and features to tackle!

You can find what's planned at our GitHub roadmaps and watch the latest developments on our official Discord server.

Neos VR - Frooxius
Hello everyone, another smaller build, but with some optimizations now! During testing the MTC we got a lead that the worlds UI is causing some hitches and this led to some more discoveries for things to be optimized, both client-side and on the server! There are some changes to the session thumbnail system to avoid wasting resources - e.g. loading and updating thumbnails when the UI cannot be seen (e.g. your dash is closed or on different screen) and recompressing, reuploading/redownloading same thumbnails and some more!

Also more general optimization, UIX canvases will now deffer the actual update if they're inactive, to avoid UI that's invisible to you (e.g. closed dash, or inactive dash screen, context menu or anything culled in world) from unnecessarily doing background computations and wasting CPU cycles and memory.

Overall these should help reduce some unnecessary background resource drain and help things run a bit better! Sorry I don't have more for now, going to be working on a weekly update next, so I'm pushing out what I have for now.

Optimizations:
- UIX Canvas updates are now deferred when it's inactive (either directly within hierarchy), reducing performance impact of currently inactive canvases
-- This includes dash (e.g. worlds or contacts UI updating its layout in the background) as well as any world-space canvases (e.g. Context Menu when not open)
-- This should also help reduce CPU/memory impact when various avatar/level culling systems are employed, not generating the actual UI until it needs to be shown
- Tweaked session thumbnail capture intervals to reduce the load on the user starting/joining the session
- Downloading new session thumbnail for the Worlds menu is now deferred when it's inactive, preventing unecessary downloads and processing of thumbnails when the UI is not visible
-- This should help fix some cases of random hitching in worlds, even when dash is deactivated (based on report by @Rue Shejn | Artist 3D and @Nexulan | Producer)
-- On some users, this should also mitigate the gather jobs from getting overloaded and downloads stuck in some cases (reported by @ProbablePrime, @I'm Erin. and @Kitten_of_Codes)
- Moved session thumbnail downloads to the CDN, rather than direct blob download for better performance and metrics
- When StaticTexture2D is set to DirectLoad, the metadata computation task is now skipped
-- This reduces unnecessary CPU load and memory usage, particularly for session thumbnails which use DirectLoad
- Uploaded thumbnails are now associated with their public URL in the database, to avoid cases where user has to redownloaded their own thumbnail, resulting in resource waste
- Headless will no longer reupload and recompress session thumbnails from other sources (users in the session or the world thumbnail), but rather use their direct URL
-- This will reduce unnecessary network bandwidth and CPU/memory usage by redownloading different versions of the same thumbnail and better employ caching mechanisms
- Merged Spanish locale additions (including new MTC Streamer Room) by @Ruz
- Merged Czech locale addition by @rampa_3 (UTC +1, DST UTC +2)

Bugfixes:
- Added transition code for SessionUser head output device being serialized as integer, causing potential compatibility problems when the enum changes
- Fixed UIX canvas becoming invisible when the RectTransform on the root becomes deactivated and the graphic chunks don't get flagged as dirty to re-enable it
- DynamicField<T> and CloudValueField<T> are now aware when pointed to read only fields (e.g. RawOutput<T>) and will avoid any writes back to them to avoid throwing exceptions in the log (based on report by @RezilloRyker)
- Fixed Headless not being able to load certain worlds and objects due to scene hierarchy being too deep (reported by @Shadow Panther [RU/EN, UTC+3] and @Torrn)

Neos VR - Frooxius
Another small build before I start focusing on some bigger things, but hopefully with some nice goodies! There's a bunch of new LogiX node overloads for vector and boolean vector types, which should give you a whole bunch of extra flexibility when working with those datatypes.

The new WIP Neos Account website (also used for OAuth) now also has some basic Neos branding to look less sketchy thanks to @ProbablePrime.

And there's a pretty important bugfix (technically two internally) for text rendering, which should fix some text being glitched out and wrapped incorrectly in some cases (see #🎥devlog for sample video), improving the overall robustness of our text rendering system.

New Features:
- Added bitwise overloads of logical operators for boolean vectors (bool2, bool3, bool4) and integer vectors (int2, int3, long4...) (requested by @art0007i)
- Added bit shift and bit rotate overloads for boolean vectors (bool2, bool3 and bool4) (requested by @art0007i)
- Added vector comparison operator nodes (requested by @art0007i)
-- These produce boolean vectors. E.g. if you compare two float3 values, you get bool3, with each component being compared independently
- Added "Cosine" curve shape preset (requested by Dirko3000)
-- This starts slow and ramps up to full speed
- Added bobool3ol

Tweaks:
- Neos Account / Auth website (https://auth.neos.com/) now has basic Neos branding and style (implemented by @ProbablePrime, based on request from @Geenz | Graphics Programmer)
-- Internal layouts were centralized
-- Swapped the Nav Bar to Dark and added the Neos Round Logo.
-- Website is now labeled "Neos Account Website" instead of internal project name "CloudX.Account"
-- External login providers were removed for now
-- Patreon and Main Website links now link to separate websites rather than dummy pages

- Merged Czech locale additions by @rampa_3 (UTC +1, DST UTC +2)
- Merged Japanese locale additions and tweaks by @Aesc
- Merged Korean locale additions by @Guide
- Merged Russian locale additions and fixes by @Shadow Panther [RU/EN, UTC+3]

Bugfixes:
- Fixed cloud not providing proper response code when synchronizing records and there are too many requests at the time, resulting in unecessary sync errors, rather than retry logic being employed properly
- Fixed text layout computing the longest word width incorrectly when multiple text segments are used (e.g. formatting), resulting in horizontal auto-scale producing wrong values in some cases and some words being forcefully wrapped (based on report and sample by @Enverex)
- Fixed text auto-size layout using some auto-sized values from previous run when the text is being changed, resulting in random non-persistent layout glitches (words being wrapped incorrectly, lines being randomly spaced wrong) (based on report and sample by @Enverex)
- Fixed ValueMultiplexer and ReferenceMultiplexer still throwing exceptions in some cases when the index is out of bounds due to off by one error (based on report by @Enverex)

Neos VR - Frooxius
Another small build sorry! Just handling some smaller tasks and such right now. It has some goodies too though, like material batch conversion! There are some more security improvements too and a bunch of bugfixes and polish for desktop and other things.

New Features:
- Added Batch Material conversion feature to the Material Tooltip when holding a slot reference, which allows converting all materials in the hierarchy to specific material type (requested by @Veer | Chief Moderation Officer)
- If you double-click the right mouse button in third person mode, the character's forward direction will align with the view as well

Tweaks:
- Improved security if favorite avatars using scoped temporary access keys
-- Favorited avatar records are no longer marked as public to severely mitigate possibility of malicious access
-- In a few days we'll automatically unmark all avatar records as public unless they're in a public folder
-- Note that when unregistered user hosts, they won't be able to load private favorited avatars for you, you'll have to equip them yourself
- Removed old logging code for opening worlds
- ToString on fields will now always act as doing ToString on the field value
- Material conversion dialog positioning is now consistent with other dialogs and respects different camera modes
- Extracting all material orbs from hierarchy is now undoable
- Upgraded youtube-dl to 2021.05.16 from 2021.04.01
- Upgraded various internal dependencies and libraries for both cloud and client to latest versions

- Merged German locale additions (including MTC Streamer Room) and fixes by @3x1t_5tyl3
- Merged Russian locale addition by @Shadow Panther [RU/EN, UTC+3]
- Merged Korean locale update and fix by @MirPASEC

Bugfixes:
- Fixed InventoryLink generating context menu item when disabled (reported by @Ukilop)
- Fixed ValueMultiplexer and ReferenceMultiplexer throwing exceptions when Index is invalid and driven value is being written back (based on log provided by @Enverex)
- Fixed 48-bit source textures (e.g. PNG) being washed out when exported due to tonemapping running on them (reported by @Cataena and @Lucaedr )
- Added a guard against TwitchChatDialog throwing lots of exceptions when parts of it are removed (based on report and log by @RezilloRyker)
- Fixed UI Aligned Camera mode not properly transforming the camera orientation when aligning items, resulting in items being misaligned when they're parented under a slot with rotation offset (reported by @Epsilion, @Axius, @3x1t_5tyl3)
- Fixed text renderer auto-sizing not respecting BoundsAlignment when performing last iteration bounds alignment, resulting in random small offsets of the resulting text (based on report and sample by @Enverex)
- Fixed components that destroy the user on unhandled exception (e.g. CommonTool) not actually destroying user, resulting in logspam and corrupt behaviors (found in a log from @AlienInArea51 (MR-Alex))
-- If you encounter case like this during normal operation, please make a bug report! However if you are messing with internals of those components and deleting necessary working objects, this behavior can be normal and you should find alternate approach that won't rely on corrupting internal state, as we won't necessarily support such use-cases

...