-
Notifications
You must be signed in to change notification settings - Fork 0
/
BuildRAtlasSO.cs
136 lines (109 loc) · 6.01 KB
/
BuildRAtlasSO.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using System.IO;
using System.Text;
using UnityEngine;
namespace BuildR2 {
public class BuildRAtlasSO : ScriptableObject {
private const string TEXTURE_FOLDER_PATH = "Internal/Textures/BuildRAtlas/";
private const string MATERIAL_FOLDER_PATH = "Internal/Materials/BuildRAtlas/";
public BuildRAtlas atlasData = new BuildRAtlas();
public void UpdateAtlas() {
#if UNITY_EDITOR
string textureFilePath = TextureFilePath();
string materialFilePath = MaterialFilePath();
atlasData.texture = UnityEditor.AssetDatabase.LoadAssetAtPath(textureFilePath, typeof(Texture2D)) as Texture2D;
atlasData.material = UnityEditor.AssetDatabase.LoadAssetAtPath(materialFilePath, typeof(Material)) as Material;
atlasData.UpdateAtlas();
UnityEditor.EditorUtility.SetDirty(this);
UnityEditor.EditorUtility.SetDirty(atlasData.texture);
if (!UnityEditor.AssetDatabase.Contains(atlasData.texture)) {
byte[] bytes = atlasData.texture.EncodeToJPG();
File.WriteAllBytes(textureFilePath, bytes);
UnityEditor.AssetDatabase.Refresh();
}
UnityEditor.EditorUtility.SetDirty(atlasData.material);
if (!UnityEditor.AssetDatabase.Contains(atlasData.material))
UnityEditor.AssetDatabase.CreateAsset(atlasData.material, materialFilePath);
atlasData.texture = UnityEditor.AssetDatabase.LoadAssetAtPath(textureFilePath, typeof(Texture2D)) as Texture2D;
atlasData.material = UnityEditor.AssetDatabase.LoadAssetAtPath(materialFilePath, typeof(Material)) as Material;
UnityEditor.AssetDatabase.SaveAssets();
UnityEditor.AssetDatabase.Refresh();
if(atlasData.material != null)
atlasData.material.mainTexture = atlasData.texture;
UnityEditor.Selection.activeObject = this;
#endif
}
#if UNITY_EDITOR
private string TextureFilePath() {
BuildRSettings settings = BuildRSettings.GetSettings();
string settingsLocation = UnityEditor.AssetDatabase.GetAssetPath(settings);
if (string.IsNullOrEmpty(settingsLocation))
return "";
int dirLength = settingsLocation.Length - (settings.name.Length + 6);//+6 for .asset
string settingsFolder = settingsLocation.Substring(0, dirLength);
string tempTextureFolder = Concat(settingsFolder, TEXTURE_FOLDER_PATH);
string dataPath = Application.dataPath;
int dataPathLength = dataPath.Length;
string projectPath = Application.dataPath.Substring(0, dataPathLength - 6);//cull assets folder reference
string fullTempTextureFolder = Concat(projectPath, tempTextureFolder);
if (!Directory.Exists(fullTempTextureFolder))
Directory.CreateDirectory(fullTempTextureFolder);
return Concat(tempTextureFolder, "buildr_atlas_", name, ".jpg");
}
private string MaterialFilePath() {
BuildRSettings settings = BuildRSettings.GetSettings();
string settingsLocation = UnityEditor.AssetDatabase.GetAssetPath(settings);
if (string.IsNullOrEmpty(settingsLocation))
return "";
int dirLength = settingsLocation.Length - (settings.name.Length + 6);//+6 for .asset
string settingsFolder = settingsLocation.Substring(0, dirLength);
string tempTextureFolder = Concat(settingsFolder, MATERIAL_FOLDER_PATH);
string dataPath = Application.dataPath;
int dataPathLength = dataPath.Length;
string projectPath = Application.dataPath.Substring(0, dataPathLength - 6);//cull assets folder reference
string fullTempTextureFolder = Concat(projectPath, tempTextureFolder);
if (!Directory.Exists(fullTempTextureFolder))
Directory.CreateDirectory(fullTempTextureFolder);
return Concat(tempTextureFolder, "buildr_atlas_", name, ".mat");
}
public static StringBuilder SB = new StringBuilder();
public static string Concat(params string[] items) {
int length = SB.Length;
SB.Remove(0, length);
int itemCount = items.Length;
for (int i = 0; i < itemCount; i++)
SB.Append(items[i]);
return SB.ToString();
}
#endif
#region statics
public static BuildRAtlasSO CreateWallSectionAtlasAsset(string name = null, string directory = null) {
BuildRAtlasSO buildRAtlas = CreateInstance<BuildRAtlasSO>();
if (Application.isPlaying) return buildRAtlas;
if (name != null)
buildRAtlas.name = name;
#if UNITY_EDITOR
if (directory == null)
UnityEditor.AssetDatabase.CreateAsset(buildRAtlas, AssetCreator.GeneratePath("buildrAtlas.asset", "BuildRAtlases"));
else
UnityEditor.AssetDatabase.CreateAsset(buildRAtlas, Path.Combine(directory, "buildrAtlas.asset"));
#endif
return buildRAtlas;
}
#if UNITY_EDITOR
[UnityEditor.MenuItem("Tools/BuildR/Create New Building Atlas", false, ToolsMenuLevels.CREATE_WALLSECTION)]
private static BuildRAtlasSO MenuCreateAtlas() {
BuildRAtlasSO output = CreateWallSectionAtlasAsset();
UnityEditor.Selection.activeObject = output;
return output;
}
[UnityEditor.MenuItem("Assets/Create/BuildR/Create New Building Atlas", false, ToolsMenuLevels.CREATE_WALLSECTION)]
private static BuildRAtlasSO MenuCreateAtlasB() {
string activeFolder = AssetCreator.ActiveSelectionPath();
BuildRAtlasSO output = CreateWallSectionAtlasAsset(null, activeFolder);
UnityEditor.Selection.activeObject = output;
return output;
}
#endif
#endregion
}
}