150 lines
4.9 KiB
C#
150 lines
4.9 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor.SceneManagement;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.SceneManagement;
|
|
//using UnityEngine.Rendering.Universal; //URP only
|
|
|
|
namespace RapidIcon_1_7_2
|
|
{
|
|
public class RapidIconStage : PreviewSceneStage
|
|
{
|
|
//---INTERNAL---//
|
|
Camera cam;
|
|
Color ambientLightColour;
|
|
AmbientMode ambientMode;
|
|
bool fogEnabled;
|
|
|
|
public void SetScene(UnityEngine.SceneManagement.Scene scene_in)
|
|
{
|
|
this.scene = scene_in;
|
|
}
|
|
|
|
public void SetupScene(Icon icon)
|
|
{
|
|
icon.LoadMatInfo();
|
|
|
|
//---Create scene objects---//
|
|
GameObject obj = GameObject.Instantiate((GameObject)icon.parentIconSet.assetObject);
|
|
GameObject camGO = new GameObject("camera");
|
|
GameObject lightGO = new GameObject("light");
|
|
|
|
//---Place the objects in the scene---//
|
|
StageUtility.PlaceGameObjectInCurrentStage(camGO);
|
|
StageUtility.PlaceGameObjectInCurrentStage(lightGO);
|
|
StageUtility.PlaceGameObjectInCurrentStage(obj);
|
|
|
|
SceneManager.MoveGameObjectToScene(camGO, scene);
|
|
SceneManager.MoveGameObjectToScene(lightGO, scene);
|
|
SceneManager.MoveGameObjectToScene(obj, scene);
|
|
|
|
//---Apply the object settings---//
|
|
obj.transform.position = icon.iconSettings.objectPosition;
|
|
obj.transform.localScale = icon.iconSettings.objectScale;
|
|
obj.transform.eulerAngles = icon.iconSettings.objectRotation;
|
|
|
|
//---Apply hierarchy settings---//
|
|
List<string> keys = icon.iconSettings.subObjectEnables.Keys.ToList();
|
|
foreach (string key in keys)
|
|
{
|
|
var indicies = key.Split('/');
|
|
GameObject subObj = obj;
|
|
for (int i = 2; i < indicies.Length; i++)
|
|
{
|
|
int idx = int.Parse(indicies[i]);
|
|
subObj = subObj.transform.GetChild(idx).gameObject;
|
|
}
|
|
subObj.SetActive(icon.iconSettings.subObjectEnables[key]);
|
|
}
|
|
|
|
//---Add the camera component and apply camera settings---//
|
|
cam = camGO.AddComponent<Camera>();
|
|
cam.scene = this.scene;
|
|
cam.clearFlags = CameraClearFlags.Nothing;
|
|
cam.transform.position = icon.iconSettings.cameraPosition;
|
|
cam.transform.LookAt(icon.iconSettings.cameraTarget);
|
|
cam.orthographic = icon.iconSettings.cameraOrtho;
|
|
cam.orthographicSize = icon.iconSettings.cameraSize;
|
|
cam.orthographicSize /= icon.iconSettings.camerasScaleFactor;
|
|
|
|
cam.fieldOfView = icon.iconSettings.cameraFov;
|
|
float fov = 2 * Mathf.Rad2Deg * Mathf.Atan2(
|
|
Mathf.Tan(cam.fieldOfView * Mathf.Deg2Rad / 2), icon.iconSettings.camerasScaleFactor
|
|
);
|
|
if (fov < 0)
|
|
fov += 180;
|
|
cam.fieldOfView = fov;
|
|
|
|
cam.nearClipPlane = 0.001f;
|
|
cam.farClipPlane = 10000;
|
|
cam.depthTextureMode = DepthTextureMode.Depth;
|
|
cam.clearFlags = CameraClearFlags.Color;
|
|
//cam.GetUniversalAdditionalCameraData().renderPostProcessing = false; //URP only
|
|
|
|
//---Add light componenet and apply lighting settings---//
|
|
Light dirLight = lightGO.AddComponent<Light>();
|
|
dirLight.type = LightType.Directional;
|
|
dirLight.color = icon.iconSettings.lightColour;
|
|
dirLight.transform.eulerAngles = icon.iconSettings.lightDir;
|
|
dirLight.intensity = icon.iconSettings.lightIntensity;
|
|
|
|
//---Store current environment settings---//
|
|
ambientLightColour = RenderSettings.ambientLight;
|
|
ambientMode = RenderSettings.ambientMode;
|
|
fogEnabled = RenderSettings.fog;
|
|
|
|
//---Apply environment settings---//
|
|
RenderSettings.ambientLight = icon.iconSettings.ambientLightColour;
|
|
RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Flat;
|
|
RenderSettings.fog = false;
|
|
|
|
//---Apply animation settings---//
|
|
if (icon.iconSettings.animationClip != null)
|
|
{
|
|
float t = icon.iconSettings.animationClip.length * icon.iconSettings.animationOffset;
|
|
icon.iconSettings.animationClip.SampleAnimation(obj, t);
|
|
}
|
|
}
|
|
|
|
public Texture2D RenderIcon(int width, int height)
|
|
{
|
|
//---Setup render texture---//
|
|
var rtd = new RenderTextureDescriptor(width, height) { depthBufferBits = 24, msaaSamples = 8, useMipMap = false, sRGB = true };
|
|
var rt = new RenderTexture(rtd);
|
|
rt.Create();
|
|
|
|
//---Render camera to render texture---//
|
|
cam.targetTexture = rt;
|
|
cam.aspect = (float)width / (float)height;
|
|
cam.Render();
|
|
cam.targetTexture = null;
|
|
cam.ResetAspect();
|
|
|
|
//---Convert render texture to Texture2D---//
|
|
Texture2D render = new Texture2D(width, height, TextureFormat.RGBA32, false, false);
|
|
var oldActive = RenderTexture.active;
|
|
RenderTexture.active = rt;
|
|
render.ReadPixels(new Rect(0, 0, width, height), 0, 0);
|
|
render.Apply();
|
|
|
|
//---Cleanup render texture---//
|
|
RenderTexture.active = oldActive;
|
|
rt.Release();
|
|
|
|
//---Restore environment settings---//
|
|
RenderSettings.ambientLight = ambientLightColour;
|
|
RenderSettings.ambientMode = ambientMode;
|
|
RenderSettings.fog = fogEnabled;
|
|
|
|
return render;
|
|
}
|
|
|
|
protected override GUIContent CreateHeaderContent()
|
|
{
|
|
GUIContent headerContent = new GUIContent();
|
|
headerContent.text = "RapidIcon";
|
|
return headerContent;
|
|
}
|
|
}
|
|
} |