1. Neos VR
  2. News

Neos VR News

2020.9.3.56 - Twitch Reward events for LogiX, improvements and bugfixes

Sorry for smaller build, I spent a lot of time on a few things today. Investigating the Vive hand tracking (might have it tomorrow, but no promises yet) and ICU MessageFormat for translation framework (no timeline yet, just looking for best way to handle stuff).

I ended up merging our fork of TwitchLib with the latest public one (check #devlog for GitHub links and details) and updating the Twitch integration with new goodies! You can now receive events when viewers redeem rewards with channel points, deletes messages are now deleted in the in-game Twitch chat too and Follow events work again!

There are some more improvements and tweaks for the new World UI as well and related things and some security improvements.

[h2]New Features:[/h2]
- Added experimental Stereo Display support (can be activated using -StereoDisplay argument or through the Launcher) (requested by SPŠSE CB https://spsautocb.cz/)
-- This is untested at the moment and might necessarily not be supported long term
- Added UserPlatform logix node which provides the platform that the input user is on (requested by @Alex from Alaska, implemented by @Coffee | Programmer)
- Added FireOnFalse Logix node (requested by @Rue Shejn | Artist 3D, implemented by @Coffee | Programmer)
- Merged latest version of the Twitch API library with custom Neos modifications (mainly thread starvation fixes) and updated/expanded various API's with new functionality
-- Highlighted messages now show as highlighted in the Twitch Chat Dialog
-- Removed messages will now also be removed in the Twitch chat dialog
-- Twitch chat dialog will now show redeemed rewards
-- TwitchChatMessageEvent now has "IsHighlighted" output for highlighted messages and "Custom Reward ID" for associated rewards
-- TwitchSubscriptionEvent now has IsAnonymous property to indicate anonymous gifts
-- Added "Twitch Reward Redeem Event" node, which fires when user redeems a reward using channel points (includes rward ID, message, reward title, cost and more) (requested by @Rukio)

[h2]Tweaks:[/h2]
- "Freeform Dash" is now persistent across Neos runs (requested by @Cyro and others)
- Folder imports are now named after the folder, rather than just generic "Folder Import" (suggested by @ProbablePrime)
- Cloud API security improvements (based on feedback from @ArkGullwing and @Veer | Chief Moderation Officer)
- Mesh import indicator is now non-persistent (suggested by @H3BO3)

[h2]Bugfixes:[/h2]
- Fixed missing Identity constant for many datatypes (including primitives), causing certain generics to misbehave
-- This fixes the constant vibration when moving Slider (reported by @Linkodemayo#4028 and @Alex from Alaska)
-- This also fixes the default Max value being 0 when instantiating new sliders (reported by @SmolCookie)
- Fixed world Save/SaveAs/Close dialog always working on the focused world, rather than the one it was invoked for through the new World UI
- Fixed screenshots saved using the context menu being marked as hidden when the "Keep original screenshot format" option is enabled (reported by @Shifty | Quality Control Lead and @Turk)
- Fixed video exportables not always being exported with an extension (reported by @Lewi-bean | Audio Designer)
- Fixed TwitchInterface not triggering the follow events (reported by @Turk, @ProbablePrime)

2020.9.2.10 - World UI additions and improvements, WebSocket support and more

A bunch of new things and improvements for the new World UI! I don't think I can cram more into this build today, other things will have to wait for tomorrow sorry!

The World UI now has more intelligent sorting when searching, ability to quickly close opened worlds without switching to them, the items shouldn't be jumping back and forth when interacting with them and you can now browse worlds saved locally on your machine too!

This build also introduces WebSocket client support, based on request by many, including a Canadian Metacreation group for their research! This should open up new possibilities for interfacing Neos with external program, it has very simple interface to send and receive Text websocket messages.

Also a bunch of other tweaks and bugfixes!

[h2]New Features:[/h2]
- Added a search/filter scoring system and sorting parameter to WorldListManager, which will score and sort items based on how many search terms they match
-- This way, if you search "creator jam game", it will show items that contain all three terms at the top, with items containing either two below and items that only contain one term last
-- In the future this will also plug into more advanced scoring system by search services like Azure Cognitive Search
-- Existing facets are auto-upgraded to use this as the top sorting parameter
- Added a way to quickly close worlds from the world list by pressing the red X button in the upper right corner (it will show appropriate confirmation prompt before closing)
- Added ButtonHoverRelay which relays the button hover events (under Common UI/Events)
- WorldListManager now has "IdleSortDelay" (default 5 seconds) and "InteractingSortDelay" (default 20 seconds) parameters which will delay any updates that would change the order of listed element by that time since the last change
-- This fixes world items in the list jumping around too quickly (reported by @Enverex and @Nammi)
-- If any of the search/filter parameters are changed, the list is updated immediatelly
-- The "InteractingSortDelay" is used when any of the world items are being pointed at by the laser
- Added "Local Worlds" as data source for the new WorldListManager, allowing you to browse any worlds saved locally on the machine using the same UI (previously requested by many people, sorry I didn't keep a list but I think @SHFR_H was one of them)
-- The "My Worlds" preset now includes locally saved worlds as well in the list
- Added WebsocketClient component (under Network) which is responsible for handling connection to a websocket server at given URL
-- This follows the same host access rules as the HTTP nodes and will require user to approve connection to a particular host
- Added LogiX nodes to interface with the WebsocketClient component (under Network/Websocket) (requested by @ontodistro, @cashmoney, TylorShine (GitHub), @qdot, @Earthmark and others):
-- Websocket Connection Events - fires event when connection opens/closes
-- Websocket Text Message Receiver - fires when a text message is received on a given client
-- Websocket Text Message Sender - allows sending a text message through a WebsocketClient instance (must be connected!)
-- Websocket Connect - allows to set the URL and Handling user of WebsocketClient, which will make given user connect to particular URL
--- If URL is omitted, the current one is kept, if user is omitted local user is used
- Added IsLocalUser node (implemented by @Coffee | Programmer)

[h2]Tweaks:[/h2]
- World items now show a featured icon in the name for featured worlds (the current icon is temporary, will be updated later)
- Worlds that you have currently open will also have yellow border in the new World UI, rather than just worlds you're hosting
- WorldListManager will no longer keep updating when it's disabled or inactive (e.g. when a different dash screen is picked or it's closed)
- The Description and Details text in the World Detail (both compact and expanded view) is no longer autosized
- Changed world close dash screen (with options to save changes or discard) to a modal dialog instead
-- This fixes descriptions that include long unbroken text (e.g. a URL) having really small font (reported by @Shifty | Quality Control Lead)
- Renamed "Private Worlds" custom filter setting to more accurate "My Worlds" (based on feedback by @ArkGullwing)
- The "Friend Sessions" preset for World filtering now shows all sessions which have at least one of your friends in them, rather than sessions that are set to "Friends only" (based on feedback by @Nexulan | Community Manager)
- Added cleanup for button pressing/hovering events, to prevent potential memory leaks
- Added clamp to the VRIkAvatar HeightCompensation (0.25 to 2) to prevent the IK from getting corrupted with extreme values (reported by @Turk)
- LogiX Node selector is now aligned to the top left, rather than top center (requested by @Shifty | Quality Control Lead, @A Monsoon of Babies and others)
- Some more tweaks for the Metamovie at the Venice Festival

[h2]Bugfixes:[/h2]
- Fixed 3D model badges being rotated 180 degrees (reported by @Robyn (QueenHidi))
- Fixed RGB to HSL producing incorrect results with some values (reported by @Azavit and @Alex from Alaska)
- Fixed method mismatch when removing variables from DynamicVariableSpace, causing the system to break (found in log from @Shifty | Quality Control Lead)
-- This should also fix crashes when adding dynamic variable space to the root or over other existing dynamic variables (reported by @ProbablePrime and @Earthmark)
- Fixed exceptions in DynamicVariableSpace trying to reset variables to default state when they have already been disposed (found in log from @Shifty | Quality Control Lead)
- Fixed FacetPreset upgrade process resetting the Facet's size
- Fixed Cloud API incorrectly always reporting that it has more available results on invalid searches
-- This fixes the search getting stuck in cases where "Private Worlds" is checked and another user is selected as "By Owner" (reported by @Cyro)
- Fixed FacetPreset upgrades conflicting with old component upgrades after load, causing some things to get stuck in strange state (e.g. dynamic variables not getting properly reset)
- Fixed null reference causing users to respawn when trying to insert a relay on a drive wire (reported by @Gunnar0, fixed by @Coffee | Programmer)
- Added invalid value guards for CharacterController LinearVelocity, MoveDirection and Gravity, preventing world crashes
-- This fixes SetCharacterGravity/Velocity with NaN/Infinity inputs causing crashes (reported by @Vigilabo)

Introducing brand new World & Session UI as part of the ongoing UI/UX overhaul

Hello everyone!

We have a very special weekly update today: The new Worlds menu is finally released to the public! It’ll have a few tweaks and some polish to come, but for now it’s functional and ready for the community to use. The MCC is about to commence as well so be sure to check out Medra’s posts on it as well as our previous weekly updates!



[h2]New overhauled World UI[/h2]
We have finally released another major part of Radiant UI as part of our UI/UX overhaul efforts - the brand new world browser. This unifies browsing published worlds, active sessions and managing opened worlds into a single unified UI, simplifying the interface for new users, while allowing more flexibility to existing users.

You can find the new world browser under the “Worlds” on your main dash in place of the old one. The interface automatically merges opened instances, active sessions and published worlds into a single item for each unique world, reducing duplication and clutter and by default pushes any active sessions to the top, making it easier to join populated worlds.



By clicking on any of the items you’ll be able to quickly join the opened session (if any are running) or start your own. The compact view also shows you the list of users present in that world, with your friends colored teal and away users semi-transparent. When there are multiple active sessions of a given world, you can either cycle between them or expand the world detail.

The detailed view contains a list of all available sessions as well as an option to start a new one. You can also find the metadata, such as publishing date, tags or the description and access to common actions like getting the world orbs, URLs or starting a custom session.

[previewyoutube][/previewyoutube]

The searching and filtering functionality has been significantly improved as well. Not only it works on live sessions instead of just published worlds, but it supports more complex term matching, instead of exact phrase match. You can find items with any of the terms or force them to be present by prefixing them with the “+” plus symbol or excluding with the “-” minus symbol.

Both the backend and client have been improved to provide much more responsive search and UI, handling most of the heavy work on a background thread.



On the left you can also find common filters to quickly narrow down the list to only show Active sessions, Game worlds, Educational, your own worlds and other categories. By clicking on “Custom” you’ll be able to customize all the searching parameters.

And as last cherry on top, the whole of the new World UI is highly modular and customizable. You can use the individual components to build your own UI’s and facets. The search bar and paging control are completely general and we’ll later use them for other overhauled UI’s as well.

All the pieces are dynamically linked using the new Dynamic Variable system (which you can also use for your own tasks), making it easy to make your own custom pieces of UI.



There are still some tweaks to be done, but we hope that this will greatly improve the experience of new users and reduce frustration. The days of new users not being able to find any populated worlds should now be gone!

If you do have any feedback, problems or suggestions, please let us know on our Discord or GitHub!

[h2]Dynamic Variable Spaces, Data Presets and more[/h2]
One of the major challenges of the UI overhaul is building out new highly modular systems to enable the new UI to be developed and maintained much more easily. Similarly the World UI has paved the road with several general additions to Neos, that have a variety of uses beyond just the UI.

One of them are the dynamic variable spaces, which allow dynamically linking values within the hierarchy based on a name. We have talked about them in the last update, but they have received some more additions in the latest build, providing more components for interaction with the system, like one way value driving or automatically resetting variables when objects are loaded or duplicated.

The system might still undergo some breaking changes, so please be careful if you want to start using them right now. We'll be adding more behaviors and fine-tuning them in the upcoming days.

Another addition is a Data Preset system. This has been used to implement the search/filter presets for the World UI, but it’s generic at the core, operating over raw data. It allows you to setup a set of preset values for certain fields and organize them into a DataPreset component.

You can then automatically assign all the preset values to their fields using a button event and you even get a handy notification if all the fields are currently matching their presets!

Our custom UI framework UIX has received various additions, tweaks and bugfixes as well, helping to mature it some more and provide new capabilities for building your own custom UI.

Several parts of the old UI have also been tweaked and upgraded to these new systems. If you’d like to see all the additions, tweaks and bugfixes, check the #neos-updates channel on our Discord or the updates here on Steam!

[h2]Community Highlights[/h2]
[h3]Planetarium, by Orange[/h3]
Orange of Neos East Japan has brought the Neos community yet another beautiful creation! The planetarium is customizable and shows users many beautiful constellations, so bring your friends along for a field trip!



[h3]Blackboard by PolyLogiX[/h3]
PolyLogiX is working on a new, soon to be public tool, the Blackboard! You can draw using various brushes and materials, and scroll in 2 directions making the board itself much larger than it appears! Can't wait to see this go live for public use!



[h3]Deep Space by Enverex[/h3]
Through a lot of creative and genius tweaks, Enverex was somehow able to create a massive world that is both detailed and extremely performant! Plus some of the NPCs utilize text to speech and can even say avatars names! There's lots to explore from an alien planet to a rideable starship, so give this place a visit!
[previewyoutube][/previewyoutube]

[h2]What’s Next?[/h2]
With the release of the new World UI, our immediate goal right now are tweaks and bugfixes based on feedback. One of the changes will be stabilizing the list of worlds when it’s being interacted with to prevent the items jumping around too much. Another small feature will be the ability to quickly close opened worlds without having to switch to them.

We’ll also be fixing and tweaking many smaller things that have accumulated while the focus was on getting this new system ready for release. After that we’re considering several things. We might implement the ability to place facets on your avatar, which should be a relatively quick task and possibly an UI translation system.

For the next big task however we might focus on some major optimizations to help improve performance with large numbers of people in the world and in general, but things aren’t set in stone yet. Let us know what you think!

And as usual, thank you very much for your support and for helping Neos grow and improve, we couldn’t be doing this without you!

2020.8.31.1203 - Brand new Radiant UI world/session browser is here!

The new Radiant World UI is finally here aaaaa! This is another major addition to the UI overhaul, potentially the most important, as this should simplify finding active sessions, worlds and generally managing worlds, by combining into everything into a single unified UI, while also providing much better searching and filtering abilities and more responsive UI.

There's a whole bunch of general related additions as well, many of the UI pieces are modular and reusable, the dynamic variable system has been extended, there's a new Data Preset system, UIX improvements and tons of tweaks and bugfixes. I'll process some more of the backlogged bugfixes and additions soon, but this build is big enough as it is.

I'm keeping the on-hand world switcher for the time being, until it can be replaced with Facets and there are a few additions I plan to make soon (e.g. ability to quickly close opened worlds without switching to them), so keep tuned!

[h2]New Features:[/h2]
- Added new Radiant UI Worlds interface, for browsing opened worlds, active sessions and published worlds in a single unified UI
-- All existing dashes are automatically upgraded, replacing the old Worlds UI. This new UI is Facet-based and highly modular and customizable
-- Published worlds, active sessions and joined instances are automatically merged into a single browser item in the list, to avoid lots of duplicated items
-- Each item will expand quick detail on click, allowing quick cycling between active sessions (if more than 1 is found) and joining with a single click
-- Each detail can also be expanded to show a list of all available sessions, details about the published world / session, quick actions (copying world/session URL, getting world/session orb, editing metadata or starting custom session), description and ability to start arbitrary number of custom sessions
-- New icons have been designed by @Coffee | Programmer and show the session status (Private, LAN, Friends, Registered Users, Anyone), headless hosts and hosting status
-- The search works not only with cloud worlds, but also active sessions and currently opened worlds
-- The UI is composed from individual 4 facets - World List, World Filter, Search Bar and Paging Control (see more below on details)
- World searching & filtering now supports more complex search term parsing
-- The search term is split into individual terms and will find any result that matches any of the provided terms, rather thatn requiring exact match
-- You can prefix terms with '+' to make them required or '-' to exclude any results containing given search
-- You can put search term into double quotes to include a search term with spaces
-- E.g. you can use a search phrase like this: maybeA maybeB +mustHaveC +"also D with spaces" -"but no E's" -andNotThis
- Added PagingControl (under Common UI/General) which provides general paging mechanism that can be used to build out more complex UI's
- Added RadiantSearchBar (under Radiant UI/General) which is a styled search bar, with searching indicator and clearing functionality
- Added DynamicVariable component, which has its own value field that's bound to the DynamicVariableSpace
- Added DynamicVariableDriver component, which will drive a target based on the dynamic variable state
-- This is treated as one-way interaction, the driven target will never be treated as a source/storage of the value
- Added DynamicVariableReset, which will reset particular dynamic variable to a specific value on Load/Paste/Duplicate (configurable)
- Added "TileSizeBasis" to TiledRawImage, which allows specifying that the tile size and offset are relative to the rect's width or height, rather than being absolute (this makes it simple to for example align image to height and tile across whole width)
- Added DataPreset and DataPresetValue components (more to come, under Data/Presets), which allow assigning presets of values to arbitrary targets
-- Create a set of DataPresetValue instances, each pointing to a unique field and assign a preset value
-- Add all of the presets into the list on DataPreset
-- When the preset is set active, all the fields of preset values are set to the assigned value
-- The system also monitors if the DataPreset is active or not (meaning if all of the entry fields match the preset values)
-- DataPresetValue instances can be shared across multiple templates
-- DataPreset receives button press events
- Added "RequireLockInToPress" to Button component, which will require the button click to be locked in to trigger actual press
-- This is very useful for buttons that are part of ScrollAreas, as pressing and holding the button won't trigger the button event if the laser is moved, but will if it's pressed and then released right away (or moved in direction that locks in the interaction)
- Added AxisMultiViewportPanner (under UIX / Utility), which will smoothly transition arbitrary number of UIX viewports using AnchorMin/Max, based on a currentviewport index
- The UIX Slider component is now generic Slider, natively supporting different primitive types, rather than just float (e.g. int, double, decimal etc)
-- Existing instances are autoconverted to Slider using a new non-generic upgrade mechanism that was added (please let me know if you run into some old things breaking and not loading properly, in case there are unexpected changes)
- Added ConfirmationHandler (Common UI/Utility) which provides generic double-click confirm functionality (this is mostly internal, it'd be tricky to use this right now manually, but it will help simplify a lot of code)
- Added StringConcatenationDriver (under Transform/Drivers), which drives a target string from a list of string values and optional separator
- Added new facet presets: Paging Control, Radiant Search Bar, World Filter, World List

[h2]Tweaks:[/h2]
- WorldListManager now supports browsing own worlds (private worlds owned either by you directly or by any of the groups you're member of)
- WorldListManager supports filtering by the session Min/Max access level (e.g. showing only Friends only worlds and such), Min/Max session uptime
- The SimpleLocalUserProfile UI now shows the account type and Patreon support
- The New World Dialog is now a modal overlay on the dash
- Save/Load mechanism now saves ID's of non-persistent fields, preserving any references to those fields on save, rather than breaking them
- ScrollRect content is now aligned to the top-left by default (this affects any existing things using it - e.g. inspectors, various menus and so on, let me know if this adversely affects anything, I've checked a bunch of things, but there might be things I overlooked)
- Added extra padding to the inspector to help prevent accidental mis-clicks (based on feedback by @Coffee | Programmer)
- Added "nicovideo.jp" to the list of streaming services, which will make URL's from this website import as videos through the youtube-dl (requested by @Enkiko)
- Modal Overlays are now non-persistent by default, to prevent them from being saved when the UI saves
- WorldListManager items are now non-persistent as well
- Biped Rig heuristics will now ignore bones containing "eye" and "lid" (e.g. "eyelid") as eye bones (based on feedback from @H3BO3)
- WorldItems will now listen to local thumbnail updates, updating the UI with a new thumbnail for opened worlds, rather than getting stuck on initially loaded thumbnail
- Upgraded to Unity 2019.4.9f1 (from 2019.4.8f1)
- Small low level optimizations when saving objects/worlds and destroying objects

[h2]Bugfixes:[/h2]
- WorldListManager now exports information about its current search state - whether search is currently active, how many total results were found, how many filtered results are found and if there are more cloud results to be fetched
- Fixed WorldListManager continuously running search & filter update loop when SkipItems is larger than 0 (paging results)
- Fixed WorldListManager throwing an exception from the background work when it's destroyed mid-search/filter
- Fixed Facet placement into a Facet container depending on the UIX update loop, causing the system to place Facets incorrectly if multiple are placed at the same time
- Fixed newly reset dash Home screens getting two copies of the "Paste from Clipboard" button
- Fixed GridLayout not providing correct height metric when the ExpandWidthToFit and PreserveAspectOnExpand are enabled, causing part of the grid layout to be clipped when it's used as part of a scroll rect
- Fixed empty Video Players spawning at the floor (reported by @Rue Shejn | Artist 3D, @Shifty | Quality Control Lead, @Alex from Alaska)
- Fixed Patreon linking process breaking when no reward is claimed by the user (NCR is still awarded)

2020.8.25.934 - More world UI progress, a few other tweaks and bugfixes

Most of the work still goes into the new World UI, it's getting really close! I just need to build the Search bar UI piece and the Category/Filter UI and it'll all be ready for use! (plus some tweaking and such, but that doesn't affect functionality).

A few related and unrelated additions, tweaks and bugfixes that have accumulated along the way.

[h2]New Features:[/h2]
- Added "HorizontalAlign" and "VerticalAlign" to ScrollRect, which allows controlling how is the scrolled content aligned if it doesn't fully fill the available space
- Added "Strip Blendshape Normals" and "Strip Blendshape Tangents" to the StaticMesh, which allows removing the normal/tangent data from the blendshapes on the model, leaving only positional properties (this can be used to strip corrupt normals and/or tangents on already improted meshes)
- Added "UseZeroMetrics" option to LayoutElement, which allows overriding layout metrics with zero (negative values will still mean that the metric is pass-through)
- Added "Fetch Incompatible Sessions" setting, which will make Neos fetch all public sessions, even if they're not compatible with the current build
- Added support for loading 3D/object badges from the cloud (based on request from @Robyn (QueenHidi))

[h2]Work in progress features:[/h2]
- Heavily expanded WorldDetail component, which now has all the essential behaviors
-- It supports selecting sessions both in compact and expanded form as well as starting brand new session
-- Interactions have been implemented, allowing to actually Join sessions, Start new sessions or focus new world
-- It properly combines and updates information of opened worlds and live sessions
-- It shows list of all active sessions when expanded
-- It shows details (publish/modify dates, session uptime, present users, including list of all users in the session with transparent signifying away users and turqoise friends) and thumbnail of the actually selected session. The User count in detail features suggestions from @Turk, @Enverex, @Blaze and @Haven Splendor)
-- The UI properly animates and the top bar will be stationary when scrolling, making sure the close button is always visible
-- It has expandable detail information in the compact view mode, allowing quickly viewing list of present users or the description

[h2]Tweaks:[/h2]
- The role command for the headless now creates a persistent override (must be saved with the world) when changing user's role
-- This fixes the role being reset after the user gets respawned (reported by @Turk)
- Tweaked the text of the Discord invite join request to make it clear that the join request is coming from Discord (based on feedback by @Alex from Alaska)

[h2]Bugfixes:[/h2]
- Fixed World Announcer internally reporting that all sessions of world with given WorldID have ended, when only a single one has
- Fixed being able to make KFC withdraw request through the API
- Fixed "Save as screenshot" context menu item being generated for each held photo, rather than being combined (reported by @H3BO3)
- Fixed "Save as screenshot" option not saving the files with extension when "Keep original screenshot format" is enabled (reported by @Shifty | Quality Control Lead)
- Fixed race condition when saving multiple screenshots at the same time with the Windows platform connector (when screenshots are being saved to the Pictures folder)
- Fixed a race condition causing background exception when loading objects from URL