2using System.Collections;
3using System.Collections.Generic;
15 const int PREVIEW_LAYER = 20;
16 const int PreviewWidth = 128;
17 const int PreviewHeight = 128;
18 private static readonly Quaternion CAMERA_VIEW_ANGLE = Quaternion.Euler(30f, -30f, 0f);
22 private Quaternion cameraRotation = CAMERA_VIEW_ANGLE;
23 private RawImage previewComponent;
24 private bool doSpin =
false;
25 private Texture2D previewImage;
26 private Light[] sceneLights;
27 private bool[] lightWasEnabled =
null;
28 private GameObject instance;
30 private static Camera _previewCamera =
null;
31 private static Camera previewCamera
38 _previewCamera = cam.GetComponent<Camera>();
42 _previewCamera =
new GameObject().AddComponent<Camera>();
44 _previewCamera.gameObject.name =
"Prefab Browser Asset Preview Camera";
45 _previewCamera.cullingMask = 1 << PREVIEW_LAYER;
46 _previewCamera.transform.localRotation = CAMERA_VIEW_ANGLE;
47 _previewCamera.nearClipPlane = 0.01f;
48 _previewCamera.gameObject.SetActive(
false);
51 return _previewCamera;
55 private static RenderTexture _renderTexture;
56 private static RenderTexture renderTexture
60 if(_renderTexture ==
null)
62 _renderTexture =
new RenderTexture(PreviewWidth, PreviewHeight, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Default);
63 _renderTexture.autoGenerateMips =
false;
64 _renderTexture.useMipMap =
false;
67 return _renderTexture;
71 private static Light _previewLightA =
null;
72 private static Light previewLightA
76 if(_previewLightA ==
null)
78 GameObject go =
new GameObject();
79 go.name =
"Asset Preview Lighting";
80 go.transform.localRotation =
Quaternion.Euler(15f, 330f, 0f);
81 _previewLightA = go.AddComponent<Light>();
82 _previewLightA.type = LightType.Directional;
83 _previewLightA.intensity = .5f;
86 return _previewLightA;
90 private static Light _previewLightB =
null;
91 private static Light previewLightB
95 if(_previewLightB ==
null)
97 GameObject go =
new GameObject();
98 go.name =
"Asset Preview Lighting";
99 go.transform.localRotation =
Quaternion.Euler(15f, 150f, 0f);
100 _previewLightB = go.AddComponent<Light>();
101 _previewLightB.type = LightType.Directional;
102 _previewLightB.intensity = .5f;
105 return _previewLightB;
120 Destroy(gameObject.GetComponent<Mask>());
121 Destroy(gameObject.GetComponent<VerticalLayoutGroup>());
122 Destroy(gameObject.transform.GetChild(0).gameObject);
123 foreach (Transform child
in gameObject.transform)
125 Destroy(child.gameObject);
129 StartCoroutine(InitializeNextFrame());
132 private IEnumerator InitializeNextFrame()
134 yield
return new WaitForEndOfFrame();
140 previewImage =
new Texture2D(PreviewWidth, PreviewHeight);
142 foreach (Transform child
in gameObject.transform)
144 Destroy(child.gameObject);
147 if(!SetupAndRenderPreview(previewImage))
149 pb_ObjectUtility.Destroy(previewImage);
153 gameObject.AddComponent<Mask>();
154 gameObject.AddComponent<VerticalLayoutGroup>();
155 Image image = gameObject.DemandComponent<
Image>();
156 image.color = pb_GUIUtility.ITEM_BACKGROUND_COLOR;
158 GameObject description = gameObject.AddChild();
160 if(previewImage !=
null)
162 previewComponent = description.AddComponent<RawImage>();
163 previewComponent.texture = previewImage;
168 if (
asset.GetComponent<RawImage>())
170 previewComponent = description.AddComponent<RawImage>();
171 previewComponent.texture =
asset.GetComponent<RawImage>().texture;
175 if (
asset.GetComponent<VideoPlayer>())
176 RenderVideoPreview();
180 Text text = description.AddComponent<Text>();
181 text.font = pb_GUIUtility.DefaultFont();
182 text.alignment = TextAnchor.MiddleCenter;
183 text.text =
asset.name;
188 public static Vector2
SizeToParent(RawImage image,
float padding = 0) {
190 var parent = image.transform.parent.GetComponent<RectTransform>();
191 var imageTransform = image.GetComponent<RectTransform>();
194 if (image.texture !=
null) {
195 if (!parent)
return imageTransform.sizeDelta;
196 padding = 1 - padding;
197 float ratio = image.texture.width / (float)image.texture.height;
198 var bounds =
new Rect(0, 0, parent.rect.width, parent.rect.height);
199 if (Mathf.RoundToInt(imageTransform.eulerAngles.z) % 180 == 90) {
201 bounds.size =
new Vector2(bounds.height, bounds.width);
204 h = bounds.height * padding;
206 if (w > bounds.width * padding) {
207 w = bounds.width * padding;
211 imageTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, w);
212 imageTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, h);
213 return imageTransform.sizeDelta;
220 previewCamera.transform.RotateAround(Vector3.one * 100, Vector3.up,
cameraRotateSpeed * Time.deltaTime);
227 if(previewComponent ==
null)
231 if (previewImage ==
null)
233 if (instance !=
null && instance.GetComponent<VideoPlayer>())
235 instance.SetActive(
true);
236 instance.GetComponent<VideoPlayer>().Play();
240 if(!SetupPreviewRender())
243 previewComponent.texture = renderTexture;
250 if (previewImage ==
null)
252 if (instance !=
null && instance.GetComponent<VideoPlayer>())
254 instance.GetComponent<VideoPlayer>().Pause();
255 instance.SetActive(
false);
260 if(previewComponent ==
null)
265 cameraRotation = previewCamera.transform.localRotation;
269 previewImage.ReadPixels(
new Rect(0,0,renderTexture.width,renderTexture.height), 0, 0);
270 previewImage.Apply();
272 previewComponent.texture = previewImage;
274 RenderTexture.active =
null;
276 renderTexture.DiscardContents();
277 renderTexture.Release();
279 pb_ObjectUtility.Destroy(instance);
282 bool SetupAndRenderPreview(Texture2D texture)
284 if(!SetupPreviewRender())
289 texture.ReadPixels(
new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
292 RenderTexture.active =
null;
294 renderTexture.DiscardContents();
295 renderTexture.Release();
297 pb_ObjectUtility.Destroy(instance);
302 bool SetupPreviewRender()
307 if(!
asset ||
asset.GetComponentInChildren<Renderer>() ==
null)
return false;
309 sceneLights =
Object.FindObjectsOfType<Light>();
310 lightWasEnabled =
new bool[sceneLights.Length];
314 Renderer renderer = instance.GetComponentInChildren<Renderer>();
316 instance.transform.position -= renderer.bounds.center - (
Vector3.one * 100);
318 MoveToLayer(instance.transform, PREVIEW_LAYER);
320 previewCamera.transform.localRotation = cameraRotation;
323 pb_AssetPreview.PrepareCamera(previewCamera, instance, PreviewWidth, PreviewHeight);
325 previewCamera.targetTexture = renderTexture;
330 void MoveToLayer(Transform root,
int layer) {
331 root.gameObject.layer = layer;
332 foreach(Transform child
in root)
333 MoveToLayer(child, layer);
341 if (
asset &&
asset.GetComponent<VideoPlayer>())
343 if (instance ==
null)
346 MoveToLayer(instance.transform, PREVIEW_LAYER);
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 RenderTexture.active = renderTexture;
360 instance.SetActive(
true);
362 previewLightA.gameObject.SetActive(
true);
363 previewLightB.gameObject.SetActive(
true);
365 previewCamera.Render();
367 instance.SetActive(
false);
369 previewLightA.gameObject.SetActive(
false);
370 previewLightB.gameObject.SetActive(
false);
372 if (sceneLights !=
null)
373 for(
int i = 0; i < sceneLights.Length; i++)
375 sceneLights[i].enabled = lightWasEnabled[i];
381 private int _stopafterframe = 2;
383 void RenderVideoPreview()
385 if (
asset.GetComponent<VideoPlayer>())
387 if (instance ==
null)
389 instance = (GameObject) GameObject.Instantiate(
asset, Vector3.one * 100, Quaternion.identity);
390 MoveToLayer(instance.transform, PREVIEW_LAYER);
391 var video = instance.GetComponent<VideoPlayer>();
392 video.audioOutputMode = VideoAudioOutputMode.None;
393 video.sendFrameReadyEvents =
true;
394 video.frameReady += Pb_PrefabBrowserItemButton_frameReady;
399 private void Pb_PrefabBrowserItemButton_frameReady(VideoPlayer source,
long frameIdx)
402 if (_stopafterframe <= 0)
404 source.sendFrameReadyEvents =
false;
405 source.frameReady -= Pb_PrefabBrowserItemButton_frameReady;
407 instance.SetActive(
false);
UnityEngine.UI.Button Button
System.Drawing.Image Image
static Vector2 SizeToParent(RawImage image, float padding=0)
override void OnPointerEnter(PointerEventData eventData)
override void OnPointerExit(PointerEventData eventData)
void Initialize(bool reinitialize=false)
Transform holderTransform
static PreviewCamerasHolder instance