1
0
mirror of synced 2024-12-21 02:35:54 +01:00
WACVR/Assets/Script/Configuration/SkyboxSwitcher.cs

128 lines
4.5 KiB
C#
Raw Normal View History

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
2022-05-26 05:39:01 +02:00
using System.IO;
using UnityEngine.Networking;
using System.Runtime.InteropServices;
using System;
public class SkyboxSwitcher : MonoBehaviour
{
2022-05-26 05:39:01 +02:00
private string skyboxPath;
2022-10-03 02:04:54 +02:00
public List<FileInfo> imageFiles = new List<FileInfo>();
2022-05-26 05:39:01 +02:00
public List<Texture2D> textures = new List<Texture2D>();
public List<System.IntPtr> ptrs = new List<System.IntPtr>();
public static bool useSkybox = false;
public GameObject Room;
2022-05-26 05:39:01 +02:00
[SerializeField]
private List<Material> skyboxes;
[SerializeField]
private int currentSkyboxIndex = 0;
2022-10-05 23:09:26 +02:00
private TMP_Dropdown Dropdown;
void Start()
2022-10-03 02:04:54 +02:00
{
skyboxes.Insert(0, RenderSettings.skybox); // add ubiquitous default skybox (should be current)
2022-05-26 05:39:01 +02:00
// check StreamingAssets folder for additional skybox textures
skyboxPath = Path.Combine(Application.streamingAssetsPath, "SkyboxTextures");
StartCoroutine(AddSkyboxes());
2022-10-05 23:09:26 +02:00
Dropdown = GetComponent<TMP_Dropdown>();
2022-10-03 02:04:54 +02:00
ConfigManager.onConfigChanged += ApplyConfig;
ConfigManager.EnsureInitialization();
ApplyConfig();
}
void ApplyConfig()
{
2022-10-05 23:09:26 +02:00
if (ConfigManager.config.Skybox == 0)
{
Room.SetActive(true);
}
2022-10-03 02:04:54 +02:00
else
2022-10-05 23:09:26 +02:00
{
Room.SetActive(false);
currentSkyboxIndex = ConfigManager.config.Skybox-1;
SetSkybox();
}
}
2022-05-26 05:39:01 +02:00
IEnumerator AddSkyboxes()
{
var skyboxDir = new DirectoryInfo(skyboxPath);
2022-10-03 02:04:54 +02:00
2022-05-26 05:39:01 +02:00
imageFiles.AddRange(skyboxDir.GetFiles("*.png"));
imageFiles.AddRange(skyboxDir.GetFiles("*.jpg"));
imageFiles.AddRange(skyboxDir.GetFiles("*.jpeg"));
//List<FileInfo> hdrFiles = new List<FileInfo>();
//hdrFiles.AddRange(skyboxDir.GetFiles("*.hdr"));
//hdrFiles.AddRange(skyboxDir.GetFiles("*.hdri"));
//hdrFiles.AddRange(skyboxDir.GetFiles("*.exr"));
foreach (var file in imageFiles) // Typical image files
{
var uwr = UnityWebRequestTexture.GetTexture(file.ToString());
yield return uwr.SendWebRequest();
if (uwr.result == UnityWebRequest.Result.ConnectionError)
{
2022-05-26 05:54:24 +02:00
Debug.LogWarning($"Couldn't load skybox texture at {uwr.uri}.");
2022-05-26 05:39:01 +02:00
}
else
{
var skyboxMat = new Material(Shader.Find("Skybox/Panoramic"));
skyboxMat.SetFloat("_Rotation", 45f);
var texture = DownloadHandlerTexture.GetContent(uwr);
if (texture != null)
{
skyboxMat.SetTexture("_MainTex", texture);
skyboxes.Add(skyboxMat);
2022-10-05 23:09:26 +02:00
Dropdown.options.Add(new TMP_Dropdown.OptionData(file.Name));
2022-05-26 05:39:01 +02:00
}
}
}
SetSkybox();
2022-05-26 05:39:01 +02:00
//foreach (var file in hdrFiles) // HDR files -- no way to use by scripting?
//{
// var uwr = UnityWebRequest.Get(file.ToString());
// yield return uwr.SendWebRequest();
// if (uwr.result == UnityWebRequest.Result.ConnectionError)
// {
// Debug.Log($"Had trouble loading file {uwr.uri}.");
// }
// else
// {
// byte[] data = uwr.downloadHandler.data;
// if (data != null)
// {
// GCHandle pinnedArray = GCHandle.Alloc(data, GCHandleType.Pinned);
// IntPtr pointer = pinnedArray.AddrOfPinnedObject();
// var cubemap = Cubemap.CreateExternalTexture(2200, TextureFormat.DXT5, false, pointer);
// var skyboxMat = new Material(Shader.Find("Skybox/Panoramic"));
// skyboxMat.SetTexture("_Tex", cubemap);
// skyboxes.Add(skyboxMat);
// pinnedArray.Free();
// }
// // FIXME: convert Texture2D to Cubemap
// //textures.Add(texture);
// //ptrs.Add(texture.GetNativeTexturePtr());
// //texture = textures[textures.Count - 1];
// //var cubemap = Cubemap.CreateExternalTexture(texture.width, texture.format, false, texture.GetNativeTexturePtr());
// //skyboxMat.SetTexture("_Tex", cubemap);
// }
//}
}
private void SetSkybox()
{
if (currentSkyboxIndex < skyboxes.Count && skyboxes[currentSkyboxIndex] != null)
2022-05-26 00:04:33 +02:00
RenderSettings.skybox = skyboxes[currentSkyboxIndex];
}
}