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)

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)


