Files
Bachelor-Arbeit-Thomas-Wichert/Assets/Oculus/VR/Editor/BuildingBlocks/Utils.cs
2025-07-21 09:11:14 +02:00

210 lines
7.1 KiB
C#

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* All rights reserved.
*
* Licensed under the Oculus SDK License Agreement (the "License");
* you may not use the Oculus SDK except in compliance with the License,
* which is provided at the time of installation or download, or which
* otherwise accompanies this software in either electronic or hard copy form.
*
* You may obtain a copy of the License at
*
* https://developer.oculus.com/licenses/oculussdk/
*
* Unless required by applicable law or agreed to in writing, the Oculus SDK
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
namespace Meta.XR.BuildingBlocks.Editor
{
[InitializeOnLoad]
public static class Utils
{
internal const string BlocksPublicName = "Building Blocks";
internal const string BlockPublicName = "Building Block";
internal static readonly OVRGUIContent StatusIcon = OVREditorUtils.CreateContent("ovr_icon_bbw.png", OVRGUIContent.Source.BuildingBlocksIcons, $"Open {BlocksPublicName}");
internal static readonly OVRGUIContent GotoIcon = OVREditorUtils.CreateContent("ovr_icon_link.png", OVRGUIContent.Source.BuildingBlocksIcons, "Select Block");
internal static readonly OVRGUIContent AddIcon = OVREditorUtils.CreateContent("ovr_icon_addblock.png", OVRGUIContent.Source.BuildingBlocksIcons, "Add Block to current scene");
internal static readonly Color AccentColor = OVREditorUtils.HexToColor("#a29de5");
private static readonly Dictionary<string, BlockData> _idToBlockDataDictionary =
new Dictionary<string, BlockData>();
private static bool _dirty = true;
static Utils()
{
OVRGUIContent.RegisterContentPath(OVRGUIContent.Source.BuildingBlocksIcons, "BuildingBlocks/Icons");
OVRGUIContent.RegisterContentPath(OVRGUIContent.Source.BuildingBlocksThumbnails, "BuildingBlocks/Thumbnails");
OVRGUIContent.RegisterContentPath(OVRGUIContent.Source.BuildingBlocksAnimations, "BuildingBlocks/Animations");
var statusItem = new OVRStatusMenu.Item()
{
Name = BlocksPublicName,
Color = AccentColor,
Icon = StatusIcon,
InfoTextDelegate = ComputeMenuSubText,
OnClickDelegate = OnStatusMenuClick,
Order = 1
};
OVRStatusMenu.RegisterItem(statusItem);
EditorApplication.projectChanged -= OnProjectChanged;
EditorApplication.projectChanged += OnProjectChanged;
}
public static void OnProjectChanged()
{
_dirty = true;
}
public static string ComputeMenuSubText()
{
var numberOfBlocks = GetBlocksInScene().Count;
return $"{numberOfBlocks} {OVREditorUtils.ChoosePlural(numberOfBlocks, "block", "blocks")} in current scene.";
}
private static void OnStatusMenuClick()
{
BuildingBlocksWindow.ShowWindow("StatusMenu");
}
public static void RefreshList(bool force = false)
{
if (!_dirty && !force)
{
return;
}
var blockGuids = AssetDatabase.FindAssets($"t:{nameof(BlockData)}");
var blockDataList = blockGuids.Select(id =>
AssetDatabase.LoadAssetAtPath<BlockData>(AssetDatabase.GUIDToAssetPath(id)))
.ToList();
_idToBlockDataDictionary.Clear();
foreach (var blockData in blockDataList)
{
_idToBlockDataDictionary[blockData.Id] = blockData;
}
_dirty = false;
}
public static BlockData GetBlockData(this BuildingBlock block)
{
return GetBlockData(block.BlockId);
}
public static BlockData GetBlockData(string blockId)
{
RefreshList();
_idToBlockDataDictionary.TryGetValue(blockId, out var blockData);
return blockData;
}
public static BuildingBlock GetBlock(this BlockData data)
{
return Object.FindObjectsOfType<BuildingBlock>().FirstOrDefault(x => x.BlockId == data.Id);
}
public static BuildingBlock GetBlock(string blockId)
{
return GetBlockData(blockId)?.GetBlock();
}
public static List<BuildingBlock> GetBlocks(this BlockData data)
{
return Object.FindObjectsOfType<BuildingBlock>().Where(x => x.BlockId == data.Id).ToList();
}
public static List<BuildingBlock> GetBlocks(string blockId)
{
return GetBlockData(blockId)?.GetBlocks();
}
public static List<T> GetBlocksWithType<T>() where T : Component
{
return Object.FindObjectsOfType<T>().Where(controller => controller.GetComponent<BuildingBlock>() != null).ToList();
}
public static bool IsRequiredBy(this BlockData data, BlockData other)
{
if (data == null || other == null)
{
return false;
}
if (data == other)
{
return true;
}
foreach (var dependency in other.Dependencies)
{
if (data.IsRequiredBy(dependency))
{
return true;
}
}
return false;
}
public static List<BuildingBlock> GetBlocksInScene()
{
return Object.FindObjectsOfType<BuildingBlock>().ToList();
}
public static List<BuildingBlock> GetUsingBlocksInScene(this BlockData requiredData)
{
return Object.FindObjectsOfType<BuildingBlock>().Where(x =>
{
var data = x.GetBlockData();
return requiredData != data && requiredData.IsRequiredBy(data);
}).ToList();
}
public static List<BlockData> GetUsingBlockDatasInScene(this BlockData requiredData)
{
return requiredData.GetUsingBlocksInScene().Select(x => x.GetBlockData()).ToList();
}
public static List<BlockData> GetAllDependencyDatas(this BlockData data)
{
return data.Dependencies
.SelectMany(dependency => GetAllDependencyDatas(dependency).Concat(new[] { dependency }))
.Distinct()
.ToList();
}
public static void SelectBlockInScene(this BuildingBlock block)
{
Selection.activeGameObject = block.gameObject;
}
public static void SelectBlockInScene(this BlockData blockData)
{
blockData.GetBlock()?.SelectBlockInScene();
}
public static int ComputeNumberOfBlocksInScene(this BlockData blockData)
{
return Object.FindObjectsOfType<BuildingBlock>().Count(x => x.BlockId == blockData.Id);
}
}
}