2using System.Collections;
3using System.Collections.Generic;
11 private const int PREVIEW_LAYER = 20;
12 private const int PREVIEW_VIDEO_LAYER = 21;
13 private static readonly Quaternion CAMERA_VIEW_ANGLE = Quaternion.Euler(30f, -30f, 0f);
14 private const int PreviewWidth = 200;
15 private const int PreviewHeight = 200;
18 private Quaternion cameraRotation = CAMERA_VIEW_ANGLE;
19 private Light[] sceneLights;
20 private bool[] lightWasEnabled =
null;
22 private Camera _previewCamera =
null;
24 private Camera previewCamera
28 if (_previewCamera ==
null)
33 _previewCamera = cam.GetComponent<Camera>();
37 _previewCamera =
new GameObject().AddComponent<Camera>();
39 _previewCamera.gameObject.name =
"Prefab Browser Asset Preview Camera";
40 _previewCamera.cullingMask = 1 << PREVIEW_LAYER;
42 _previewCamera.transform.localRotation = CAMERA_VIEW_ANGLE;
43 _previewCamera.nearClipPlane = 0.01f;
48 return _previewCamera;
52 private static RenderTexture _renderTexture;
54 private static RenderTexture renderTexture
58 if (_renderTexture ==
null)
61 _renderTexture =
new RenderTexture(128, 128, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Default);
63 _renderTexture =
new RenderTexture(PreviewWidth, PreviewHeight, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Default);
65 _renderTexture.autoGenerateMips =
false;
66 _renderTexture.useMipMap =
false;
69 return _renderTexture;
73 private static Light _previewLightA =
null;
75 private static Light previewLightA
79 if (_previewLightA ==
null)
81 GameObject go =
new GameObject();
82 go.name =
"Asset Preview Lighting";
83 go.transform.localRotation =
Quaternion.Euler(15f, 330f, 0f);
84 _previewLightA = go.AddComponent<Light>();
85 _previewLightA.type = LightType.Directional;
86 _previewLightA.intensity = .5f;
89 return _previewLightA;
93 private static Light _previewLightB =
null;
95 private static Light previewLightB
99 if (_previewLightB ==
null)
101 GameObject go =
new GameObject();
102 go.name =
"Asset Preview Lighting";
103 go.transform.localRotation =
Quaternion.Euler(15f, 150f, 0f);
104 _previewLightB = go.AddComponent<Light>();
105 _previewLightB.type = LightType.Directional;
106 _previewLightB.intensity = .5f;
109 return _previewLightB;
113 private readonly Queue<Object[]> workQueue =
new Queue<Object[]>();
120 public void AddWork(GameObject asset, RawImage t)
122 workQueue.Enqueue(
new Object[] { asset, t });
125 System.Diagnostics.Stopwatch sw =
new System.Diagnostics.Stopwatch();
126 private Coroutine work =
null;
131 Debug.Log($
"Preview generation started!");
132 Debug.Log($
"{workQueue.Count} image to generate...");
133 if (workQueue.Count == 0)
return;
135 work = StartCoroutine(Work());
140 private IEnumerator Work()
142 while (workQueue.Count > 0)
146 var job = workQueue.Dequeue();
147 RenderPreview((GameObject)job[0], (RawImage)job[1]);
151 Debug.Log($
"Preview generation done in: {sw.ElapsedMilliseconds}ms");
158 private void MoveToLayer(Transform root,
int layer)
160 root.gameObject.layer = layer;
161 foreach (Transform child
in root)
162 MoveToLayer(child, layer);
165 private void RenderPreview(GameObject asset, RawImage previewComponent)
167 if (previewComponent ==
null)
169 Debug.LogWarning(
"previewComponent is NULL!");
172 var instance = (GameObject)GameObject.Instantiate(asset,
Vector3.one * 100,
Quaternion.identity);
173 var colliders = instance.GetComponentsInChildren<Collider>();
174 foreach (var c
in colliders)
178 Renderer renderer = instance.GetComponentInChildren<Renderer>();
182 Debug.LogWarning(
"No renderer to preview");
185 instance.transform.position -= renderer.bounds.center - (
Vector3.one * 100);
186 instance.SetActive(
true);
187 if (sceneLights !=
null)
188 for (
int i = 0; i < sceneLights.Length; i++)
190 lightWasEnabled[i] = sceneLights[i].enabled;
191 sceneLights[i].enabled =
false;
194 MoveToLayer(instance.transform, PREVIEW_LAYER);
196 previewCamera.gameObject.SetActive(
true);
198 previewCamera.transform.localRotation = cameraRotation;
199 pb_AssetPreview.PrepareCamera(previewCamera, instance, PreviewWidth, PreviewHeight);
201 previewCamera.targetTexture = renderTexture;
203 RenderTexture.active = renderTexture;
205 instance.SetActive(
true);
207 previewLightA.gameObject.SetActive(
true);
208 previewLightB.gameObject.SetActive(
true);
209 previewCamera.Render();
211 Texture2D previewImage;
213 previewImage =
new Texture2D(128, 128);
215 previewImage =
new Texture2D(PreviewWidth, PreviewHeight);
216 previewImage.ReadPixels(
new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
217 previewImage.Apply();
219 previewComponent.texture = previewImage;
221 RenderTexture.active =
null;
223 renderTexture.DiscardContents();
224 renderTexture.Release();
225 instance.SetActive(
false);
227 previewLightA.gameObject.SetActive(
false);
228 previewLightB.gameObject.SetActive(
false);
230 if (sceneLights !=
null)
231 for (
int i = 0; i < sceneLights.Length; i++)
233 sceneLights[i].enabled = lightWasEnabled[i];
239 GameObject spinnyCache;
243 private void Update()
245 if (!spinnyCache)
return;
248 Renderer renderer = spinnyCache.GetComponentInChildren<Renderer>();
251 Destroy(spinnyCache);
254 spinnyCache.SetActive(
true);
255 if (sceneLights !=
null)
256 for (
int i = 0; i < sceneLights.Length; i++)
258 lightWasEnabled[i] = sceneLights[i].enabled;
259 sceneLights[i].enabled =
false;
262 MoveToLayer(spinnyCache.transform, PREVIEW_LAYER);
265 pb_AssetPreview.PrepareCamera(previewCamera, spinnyCache, PreviewWidth, PreviewHeight);
267 previewCamera.gameObject.SetActive(
true);
268 previewCamera.targetTexture = renderTexture;
270 RenderTexture.active = renderTexture;
272 spinnyCache.SetActive(
true);
274 previewLightA.gameObject.SetActive(
true);
275 previewLightB.gameObject.SetActive(
true);
276 previewCamera.Render();
278 Texture2D previewImage;
280 previewImage =
new Texture2D(128, 128);
282 previewImage =
new Texture2D(PreviewWidth, PreviewHeight);
284 previewImage.ReadPixels(
new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
285 previewImage.Apply();
287 drawToThis.texture = previewImage;
289 RenderTexture.active =
null;
291 renderTexture.DiscardContents();
292 renderTexture.Release();
293 spinnyCache.SetActive(
false);
294 previewLightA.gameObject.SetActive(
false);
295 previewLightB.gameObject.SetActive(
false);
297 if (sceneLights !=
null)
298 for (
int i = 0; i < sceneLights.Length; i++)
300 sceneLights[i].enabled = lightWasEnabled[i];
304 if (modulo % 60 == 0)
305 Resources.UnloadUnusedAssets();
308 public void RenderSpin(GameObject asset, RawImage previewComponent)
311 spinnyCache = (GameObject)GameObject.Instantiate(asset, Vector3.one * 100, Quaternion.identity);
314 if (!spinnyCache.name.Contains(asset.name))
316 var to_delete = spinnyCache;
318 spinnyCache = (GameObject)GameObject.Instantiate(asset, Vector3.one * 100, Quaternion.identity);
321 Renderer renderer = spinnyCache.GetComponentInChildren<Renderer>();
324 Destroy(spinnyCache);
327 spinnyCache.transform.position -= renderer.bounds.center - (Vector3.one * 100);
328 Destroy(spinnyCache.GetComponentInChildren<Collider>());
329 drawToThis = previewComponent;
334 Destroy(spinnyCache);
338 [NaughtyAttributes.Button]
339 private void FileGenerationTeszt()
341 var instance = (GameObject)GameObject.Instantiate(
tesztRenderGO, Vector3.one * 100, Quaternion.identity);
342 Destroy(instance.GetComponentInChildren<Collider>());
343 Renderer renderer = instance.GetComponentInChildren<Renderer>();
349 instance.transform.position -= renderer.bounds.center - (Vector3.one * 100);
350 instance.SetActive(
true);
351 if (sceneLights !=
null)
352 for (
int i = 0; i < sceneLights.Length; i++)
354 lightWasEnabled[i] = sceneLights[i].enabled;
355 sceneLights[i].enabled =
false;
358 MoveToLayer(instance.transform, PREVIEW_LAYER);
360 previewCamera.transform.localRotation = cameraRotation;
361 pb_AssetPreview.PrepareCamera(previewCamera, instance, PreviewWidth, PreviewHeight);
363 previewCamera.targetTexture = renderTexture;
365 RenderTexture.active = renderTexture;
367 instance.SetActive(
true);
369 previewLightA.gameObject.SetActive(
true);
370 previewLightB.gameObject.SetActive(
true);
373 for (
int i = 0; i < 360; i += angle)
375 previewCamera.Render();
376 Texture2D previewImage;
378 previewImage =
new Texture2D(128, 128);
380 previewImage =
new Texture2D(PreviewWidth, PreviewHeight);
382 previewImage.ReadPixels(
new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
383 previewImage.Apply();
385 previewFile.AddFile($
"{i / angle}.png", previewImage.EncodeToPNG());
387 RenderTexture.active =
null;
389 renderTexture.DiscardContents();
390 renderTexture.Release();
392 previewCamera?.transform.RotateAround(Vector3.one * 100, Vector3.up, angle);
393 pb_AssetPreview.PrepareCamera(previewCamera, instance);
395 previewCamera.targetTexture = renderTexture;
397 RenderTexture.active = renderTexture;
401 Compress(
".teszt\\teszt.pwf", previewFile.Data);
402 System.IO.File.WriteAllBytes(
".teszt\\teszt_nc.pwf", previewFile.Data);
404 System.IO.File.WriteAllBytes(
".teszt\\4.png", previewFile.GetFile(4));
405 instance.SetActive(
false);
407 previewLightA.gameObject.SetActive(
false);
408 previewLightB.gameObject.SetActive(
false);
410 if (sceneLights !=
null)
411 for (
int i = 0; i < sceneLights.Length; i++)
413 sceneLights[i].enabled = lightWasEnabled[i];
419 public void Compress(
string filename,
byte[] byteArray)
421 byte[] compressedBytes;
423 using (var uncompressedStream =
new System.IO.MemoryStream(byteArray))
425 using (var compressedStream =
new System.IO.MemoryStream())
427 using (var compressorStream =
new System.IO.Compression.GZipStream(compressedStream, System.IO.Compression.CompressionLevel.Fastest))
429 uncompressedStream.CopyTo(compressorStream);
431 compressedBytes = compressedStream.ToArray();
435 System.IO.File.WriteAllBytes(filename, compressedBytes);
440 byte[] decompressedBytes;
441 using (var compressedStream =
new System.IO.MemoryStream(System.IO.File.ReadAllBytes(fileName)))
443 using (var decompressorStream =
new System.IO.Compression.GZipStream(compressedStream, System.IO.Compression.CompressionMode.Decompress))
445 using (var decompressedStream =
new System.IO.MemoryStream())
447 decompressorStream.CopyTo(decompressedStream);
449 decompressedBytes = decompressedStream.ToArray();
453 return decompressedBytes;
467 private int fileNumber;
474 fileNumber = System.BitConverter.ToInt32(
Data, 0);
488 public void AddFile(
string filename,
byte[] data)
490 var list =
Data.Skip(4).ToList();
491 list = System.BitConverter.GetBytes(fileNumber + 1).Concat(list).ToList();
492 list.AddRange(System.BitConverter.GetBytes(data.Length));
493 var bytename = System.Text.Encoding.UTF8.GetBytes(filename);
494 System.Array.Resize(ref bytename, 32);
495 list.AddRange(bytename);
498 Data = list.ToArray();
506 throw new System.IndexOutOfRangeException(
"File number smaller than requested index.");
510 var list =
Data.Skip(4).ToArray();
513 var length = System.BitConverter.ToInt32(list, 0);
514 list = list.Skip(4 + 32 + length).ToArray();
519 var length = System.BitConverter.ToInt32(list, 0);
520 return list.Skip(4 + 32).Take(length).ToArray();
527 var list =
Data.Skip(4).ToArray();
528 while (list.Length > 0)
530 var length = System.BitConverter.ToInt32(list, 0);
531 var filename = System.BitConverter.ToString(list, 4, 32);
532 if (filename == name)
534 return list.Skip(4 + 32).Take(length).ToArray();
536 list = list.Skip(4 + 32 + length).ToArray();
Transform holderTransform
static PreviewCamerasHolder instance
byte[] GetFile(int index)
void AddFile(string filename, byte[] data)
byte[] GetFile(string name)
byte[] Decompress(string fileName)
void AddWork(GameObject asset, RawImage t)
void RenderSpin(GameObject asset, RawImage previewComponent)
static PreviewGenerator Instance
void Compress(string filename, byte[] byteArray)