using UnityEngine;
using System.Collections.Generic;
public class LightmapSettingsSaveData : ScriptableObject {
public Texture2D[] farLightmaps;
public Texture2D[] nearLightmaps;
public LightmapsMode lightmapsMode;
public ColorSpace bakedColorSpace;
public LightProbes lightProbes;
[System.Serializable]
public class LightmapIndexSaveData {
public string objectName;
public int lightmapIndex;
public Vector4 lightmapTilingOffset;
}
public LightmapIndexSaveData[] lightmapIndices;
public void Save()
{
farLightmaps = new Texture2D[LightmapSettings.lightmaps.Length];
nearLightmaps = new Texture2D[LightmapSettings.lightmaps.Length];
for (int i = 0; i < LightmapSettings.lightmaps.Length; ++i) {
farLightmaps[i] = LightmapSettings.lightmaps[i].lightmapFar;
nearLightmaps[i] = LightmapSettings.lightmaps[i].lightmapNear;
}
lightmapsMode = LightmapSettings.lightmapsMode;
bakedColorSpace = LightmapSettings.bakedColorSpace;
lightProbes = LightmapSettings.lightProbes;
Object[] renderers = Object.FindSceneObjectsOfType(typeof(Renderer));
Dictionary<string, LightmapIndexSaveData> objects = new Dictionary<string, LightmapIndexSaveData>();
foreach (Renderer r in renderers)
{
if (0 <= r.lightmapIndex) {
LightmapIndexSaveData index = new LightmapIndexSaveData();
index.objectName = r.name;
index.lightmapIndex = r.lightmapIndex;
index.lightmapTilingOffset = r.lightmapScaleOffset;
if (objects.ContainsKey(r.name)) {
LightmapIndexSaveData data = objects[r.name];
if (data.lightmapIndex != index.lightmapIndex || data.lightmapTilingOffset != index.lightmapTilingOffset) {
Debug.LogError(r.name + " already exists.");
}
}
else {
objects.Add(r.name, index);
}
}
}
lightmapIndices = null;
if (0 < objects.Count) {
lightmapIndices = new LightmapIndexSaveData[objects.Count];
int n = 0;
foreach (LightmapIndexSaveData v in objects.Values) {
lightmapIndices[n++] = v;
}
}
UnityEditor.LightingDataAsset asset;
}
public void Load()
{
LightmapData[] lightmaps = new LightmapData[farLightmaps.Length];
for (int i = 0; i < farLightmaps.Length; ++i) {
lightmaps[i] = new LightmapData();
lightmaps[i].lightmapFar = farLightmaps[i];
lightmaps[i].lightmapNear = nearLightmaps[i];
}
LightmapSettings.lightmaps = lightmaps;
LightmapSettings.bakedColorSpace = bakedColorSpace;
LightmapSettings.lightmapsMode = lightmapsMode;
LightmapSettings.lightProbes = lightProbes;
Update();
}
public void Append()
{
int offset = LightmapSettings.lightmaps.Length;
LightmapData[] mergedLightmaps = new LightmapData[offset + farLightmaps.Length];
for (int i = 0; i < offset; ++i) {
mergedLightmaps[i] = LightmapSettings.lightmaps[i];
}
for (int i = 0; i < farLightmaps.Length; ++i) {
mergedLightmaps[offset + i] = new LightmapData();
mergedLightmaps[offset + i].lightmapFar = farLightmaps[i];
mergedLightmaps[offset + i].lightmapNear = nearLightmaps[i];
}
LightmapSettings.lightmaps = mergedLightmaps;
Update();
}
public void Update()
{
if (lightmapIndices != null) {
Object[] renderers = Object.FindSceneObjectsOfType(typeof(Renderer));
foreach (Renderer r in renderers)
{
for (int i = 0; i < lightmapIndices.Length; ++i) {
if (lightmapIndices[i].objectName == r.name) {
if (0 <= lightmapIndices[i].lightmapIndex && lightmapIndices[i].lightmapIndex < farLightmaps.Length) {
Texture2D farTex = farLightmaps[lightmapIndices[i].lightmapIndex];
for (int j = 0; j < LightmapSettings.lightmaps.Length; ++j) {
if (farTex == LightmapSettings.lightmaps[j].lightmapFar) {
r.lightmapIndex = j;
r.lightmapScaleOffset = lightmapIndices[i].lightmapTilingOffset;
}
}
}
else {
r.lightmapIndex = -1;
r.realtimeLightmapIndex = -1;
}
}
}
}
}
}
}