6using System.Collections;
7using System.Collections.Generic;
8using System.Threading.Tasks;
21using Valve.VR.InteractionSystem;
32 private const int PREVIEW_LAYER = 20;
33 private const int PREVIEW_VIDEO_LAYER = 21;
34 private const int PreviewWidth = 256;
35 private const int PreviewHeight = 256;
38 private static readonly Quaternion CAMERA_VIEW_ANGLE = Quaternion.Euler(30f, -30f, 0f);
44 private Quaternion cameraRotation = CAMERA_VIEW_ANGLE;
45 internal RawImage previewComponent;
46 private bool doSpin =
false;
47 private Texture2D previewImage;
48 internal GameObject instance;
49 private Light[] sceneLights;
50 private bool[] lightWasEnabled =
null;
51 private bool isPreview =
false;
52 private bool inSetup =
true;
53 private bool destroyAfterRender =
false;
54 internal bool forceRender =
false;
57 private Camera _previewCamera =
null;
59 private Camera previewCamera
67 if (_previewCamera ==
null)
72 _previewCamera = cam.GetComponent<Camera>();
76 _previewCamera =
new GameObject().AddComponent<Camera>();
78 _previewCamera.gameObject.name =
"Prefab Browser Asset Preview Camera 4 " +
asset.name;
79 _previewCamera.cullingMask = 1 << PREVIEW_LAYER;
80 _previewCamera.transform.localRotation = CAMERA_VIEW_ANGLE;
81 _previewCamera.nearClipPlane = 0.01f;
82 _previewCamera.gameObject.SetActive(
false);
86 return _previewCamera;
90 private static RenderTexture _renderTexture;
92 private static RenderTexture renderTexture
96 if (_renderTexture ==
null)
100 _renderTexture =
new RenderTexture(16, 16, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Default);
102 _renderTexture =
new RenderTexture(PreviewWidth, PreviewHeight, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Default);
103 _renderTexture.autoGenerateMips =
false;
104 _renderTexture.useMipMap =
false;
107 return _renderTexture;
111 private static Light _previewLightA =
null;
113 private static Light previewLightA
117 if (_previewLightA ==
null)
119 GameObject go =
new GameObject();
120 go.name =
"Asset Preview Lighting";
121 go.transform.localRotation =
Quaternion.Euler(15f, 330f, 0f);
122 _previewLightA = go.AddComponent<Light>();
123 _previewLightA.type = LightType.Directional;
124 _previewLightA.intensity = .5f;
127 return _previewLightA;
131 private static Light _previewLightB =
null;
133 private static Light previewLightB
137 if (_previewLightB ==
null)
139 GameObject go =
new GameObject();
140 go.name =
"Asset Preview Lighting";
141 go.transform.localRotation =
Quaternion.Euler(15f, 150f, 0f);
142 _previewLightB = go.AddComponent<Light>();
143 _previewLightB.type = LightType.Directional;
144 _previewLightB.intensity = .5f;
147 return _previewLightB;
158 if (!targetGraphic ||
global)
159 onClick.AddListener(OpenPropertiesWindow);
162 private void OpenPropertiesWindow()
170 internal void ForcePointerExit()
177 private string st =
"";
181 isPreview = previewOnly;
184 DestroyImmediate(instance);
191 previewImage =
new Texture2D(16, 16);
193 previewImage =
new Texture2D(PreviewWidth, PreviewHeight);
201 bool nullImage =
false;
202 if (!HasPreviewImage())
204 pb_ObjectUtility.Destroy(previewImage);
212 gameObject.AddComponent<VerticalLayoutGroup>();
213 Image image = gameObject.DemandComponent<
Image>();
214 image.color =
new Color(1f,1f,1f,25f/255f);
220 GameObject description = gameObject.AddChild();
228 Destroy(description);
230 previewComponent.texture = previewImage;
233 FormattingComponents();
237 if (
asset.GetComponent<RawImage>())
242 Destroy(description);
247 previewComponent.texture =
asset.GetComponent<RawImage>().texture;
250 FormattingComponents();
254 if (
asset.GetComponent<VideoPlayer>())
255 RenderVideoPreview();
259 Text text = description.AddComponent<Text>();
260 text.font = pb_GUIUtility.DefaultFont();
261 text.alignment = TextAnchor.MiddleCenter;
262 text.text =
asset.name;
263 instance = (GameObject)GameObject.Instantiate(
asset, Vector3.zero, Quaternion.identity);
264 MoveToLayer(instance.transform, PREVIEW_LAYER);
265 instance.SetActive(
false);
268 if (previewComponent)
276 var parent = image.transform.parent.GetComponent<RectTransform>();
277 var imageTransform = image.GetComponent<RectTransform>();
280 if (image.texture !=
null)
282 if (!parent)
return imageTransform.sizeDelta;
283 padding = 1 - padding;
284 float ratio = image.texture.width / (float)image.texture.height;
285 var bounds =
new Rect(0, 0, parent.rect.width, parent.rect.height);
286 if (Mathf.RoundToInt(imageTransform.eulerAngles.z) % 180 == 90)
289 bounds.size =
new Vector2(bounds.height, bounds.width);
292 h = bounds.height * padding;
294 if (w > bounds.width * padding)
296 w = bounds.width * padding;
300 imageTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, h);
301 imageTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, h);
302 return imageTransform.sizeDelta;
308 pb_ObjectUtility.Destroy(instance);
310 Destroy(_previewCamera.gameObject);
317 private void Update()
322 if (doSpin || forceRender)
324 previewCamera?.transform.RotateAround(Vector3.one * 100, Vector3.up,
cameraRotateSpeed * Time.deltaTime);
331 private bool IsPicture(
string ext)
335 return ext ==
"png" || ext ==
"jpg" || ext ==
"jpeg" || ext ==
"bmp";
345 Camera cam = Camera.main;
353 Ray ray =
new Ray(cam.transform.position, cam.transform.forward);
357 var spawn = GameObject.Find(
"SpawnPoint");
361 throw new Exception(
"SpawnPoint not found!");
377 if (plane.Raycast(ray, out hit))
389 int namedLikeThis = 0;
392 if (
pb_Scene.
instance.transform.GetChild(i).name == go.name.Replace(
"(Clone)",
""))
397 if (namedLikeThis > 0)
399 go.DemandComponent<
RenameObject>().NewName = go.name.Replace(
"(Clone)",
"_") + namedLikeThis;
401 if (go.GetComponent<RawImage>())
406 Debug.LogWarning(
"GlobalTextureHolder does NOT have image: " +
asset.name);
408 go.name = go.name.Replace(
"(Clone)",
"");
410 go.AddComponent<Rigidbody>();
411 go.GetComponent<Rigidbody>().isKinematic =
true;
413 go.AddComponent<Interactable>();
415 go.GetComponent<
ThrowableCanDisable>().attachmentFlags = Hand.AttachmentFlags.ParentToHand | Hand.AttachmentFlags.TurnOnKinematic;
417 foreach (var rb in go.GetComponentsInChildren<Rigidbody>())
419 rb.collisionDetectionMode = CollisionDetectionMode.Discrete;
420 rb.isKinematic =
true;
422 rb.useGravity =
false;
438 if (this.name.Contains(
"Properties"))
442 gameObject.SetActive(
false);
447 if (go.GetComponentInChildren<MeshCollider>())
450 if (bounds.size.x >= 5 || bounds.size.y >= 5)
452 go.transform.localScale /= (bounds.size.x) * 10;
454 if (bounds.size.x <= 0.05f|| bounds.size.y <= 0.05f)
456 go.transform.localScale *= 5;
469 var spawn = GameObject.Find(
"ModelEditorRoot");
473 throw new Exception(
"SpawnPoint not found!");
483 go.name = go.name.Replace(
"(Clone)",
"");
484 go.GetComponentInChildren<MeshCollider>().enabled =
false;
485 go.GetComponentInChildren<MeshRenderer>().gameObject.AddComponent<
MeshInfo>();
487 foreach (var rb
in go.GetComponentsInChildren<Rigidbody>())
489 rb.collisionDetectionMode = CollisionDetectionMode.Discrete;
490 rb.isKinematic =
true;
491 rb.detectCollisions =
false;
492 rb.useGravity =
false;
497 var mr = go.GetComponentInChildren<MeshRenderer>();
498 Vector3 objectSizes = mr.bounds.max - mr.bounds.min;
499 float objectSize = Mathf.Max(objectSizes.x, objectSizes.y, objectSizes.z);
500 float cameraView = 2.0f * Mathf.Tan(0.5f * Mathf.Deg2Rad * Camera.main.fieldOfView);
501 float distance = 2.0f * objectSize / cameraView;
502 distance += 0.5f * objectSize;
512 if (previewComponent)
518 if (!isPreview || targetGraphic)
522 if (previewComponent ==
null)
529 if (previewImage ==
null)
531 if (instance !=
null && instance.GetComponent<VideoPlayer>())
533 instance.SetActive(
true);
534 instance.GetComponent<VideoPlayer>().Play();
544 if (!SetupPreviewRender())
547 previewComponent.texture = renderTexture;
556 if (isPreview && eventData !=
null)
return;
562 if (previewImage ==
null)
564 if (instance !=
null && instance.GetComponent<VideoPlayer>())
566 instance.GetComponent<VideoPlayer>().Pause();
567 instance.SetActive(
false);
572 if (previewComponent ==
null)
579 StartCoroutine(StopSpinAfterAFrame());
581 cameraRotation = previewCamera.transform.localRotation;
600 private IEnumerator StopSpinAfterAFrame()
602 yield
return new WaitForEndOfFrame();
606 private static readonly
object key =
new object();
608 private void OnPostRenderCam(Camera camera)
614 if (camera == previewCamera && previewComponent && previewImage && renderTexture && instance && instance.activeSelf)
618 previewImage.ReadPixels(
new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
622 Debug.Log(
"ejj de jó vagy: " + e);
626 previewImage.Apply();
628 previewComponent.texture = previewImage;
635 RenderTexture.active =
null;
637 renderTexture.DiscardContents();
638 renderTexture.Release();
639 if (Camera.onPostRender !=
null) Camera.onPostRender -= OnPostRenderCam;
640 if (destroyAfterRender)
642 pb_ObjectUtility.Destroy(instance);
643 destroyAfterRender =
false;
649 private IEnumerator ReadPixelsWOError()
651 yield
return new WaitForEndOfFrame();
654 cameraRotation = previewCamera.transform.localRotation;
658 previewImage.ReadPixels(
new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
659 previewImage.Apply();
661 previewComponent.texture = previewImage;
663 RenderTexture.active =
null;
665 renderTexture.DiscardContents();
666 renderTexture.Release();
669 private bool HasPreviewImage()
671 if (
asset.GetComponentInChildren<Renderer>() ==
null)
return false;
672 if (
asset.GetComponentInChildren<TextMeshPro>())
return false;
676 private bool SetupAndRenderPreview(Texture2D texture)
678 if (!SetupPreviewRender())
683 texture.ReadPixels(
new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
686 RenderTexture.active =
null;
688 renderTexture.DiscardContents();
689 renderTexture.Release();
691 pb_ObjectUtility.Destroy(instance);
696 private bool SetupPreviewRender()
700 if (
asset.GetComponentInChildren<Renderer>() ==
null)
return false;
701 if (
asset.GetComponentInChildren<TextMeshPro>())
return false;
703 sceneLights =
Object.FindObjectsOfType<Light>();
704 lightWasEnabled =
new bool[sceneLights.Length];
716 Renderer renderer = instance.GetComponentInChildren<Renderer>();
722 instance.transform.position = -renderer.bounds.center;
724 MoveToLayer(instance.transform, PREVIEW_LAYER);
726 previewCamera.transform.localRotation = cameraRotation;
729 pb_AssetPreview.PrepareCamera(previewCamera, instance, PreviewWidth, PreviewHeight);
731 previewCamera.targetTexture = renderTexture;
735 private void MoveToLayer(Transform root,
int layer)
737 root.gameObject.layer = layer;
738 foreach (Transform child
in root)
739 MoveToLayer(child, layer);
741 private void FormattingComponents()
743 var cellSize = GetComponentInParent<pb_GridLayoutGroup>().cellSize;
744 var vlg = gameObject.GetComponent<VerticalLayoutGroup>();
745 var rt = GetComponent<RectTransform>();
746 vlg.padding.right = (int)(cellSize.x - cellSize.y);
750 private void topLeft(GameObject uiObject)
752 RectTransform uitransform = uiObject.GetComponent<RectTransform>();
754 uitransform.anchorMin =
new Vector2(0, 1);
755 uitransform.anchorMax =
new Vector2(0, 1);
756 uitransform.pivot =
new Vector2(0, 1);
758 private void RenderPreview()
766 if (
asset.GetComponent<VideoPlayer>())
768 if (instance ==
null)
776 MoveToLayer(instance.transform, PREVIEW_LAYER);
784 Destroy(instance.GetComponentInChildren<Collider>());
785 Renderer renderer = instance.GetComponentInChildren<Renderer>();
788 instance.transform.position = -renderer.bounds.center;
789 instance.SetActive(
true);
792 if (sceneLights !=
null)
793 for (
int i = 0; i < sceneLights.Length; i++)
795 lightWasEnabled[i] = sceneLights[i].enabled;
796 sceneLights[i].enabled =
false;
799 RenderTexture.active = renderTexture;
801 instance.SetActive(
true);
803 previewLightA.gameObject.SetActive(
true);
804 previewLightB.gameObject.SetActive(
true);
807 Camera.onPostRender += OnPostRenderCam;
809 previewCamera.Render();
813 previewImage.ReadPixels(
new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
814 previewImage.Apply();
816 if (!previewComponent)
820 previewComponent.texture = previewImage;
822 RenderTexture.active =
null;
824 renderTexture.DiscardContents();
825 renderTexture.Release();
828 instance.SetActive(
false);
830 previewLightA.gameObject.SetActive(
false);
831 previewLightB.gameObject.SetActive(
false);
833 if (sceneLights !=
null)
834 for (
int i = 0; i < sceneLights.Length; i++)
836 sceneLights[i].enabled = lightWasEnabled[i];
840 private int _stopafterframe = 2;
842 private void RenderVideoPreview()
844 if (
asset.GetComponent<VideoPlayer>())
846 if (instance ==
null)
849 MoveToLayer(instance.transform, PREVIEW_VIDEO_LAYER);
850 var video = instance.GetComponent<VideoPlayer>();
851 video.audioOutputMode = VideoAudioOutputMode.None;
852 video.sendFrameReadyEvents =
true;
854 video.frameReady += Pb_PrefabBrowserItemButton_frameReady;
859 private void Pb_PrefabBrowserItemButton_frameReady(VideoPlayer source,
long frameIdx)
862 if (_stopafterframe <= 0)
864 source.sendFrameReadyEvents =
false;
865 source.frameReady -= Pb_PrefabBrowserItemButton_frameReady;
866 source.playbackSpeed = 1;
868 instance.SetActive(
false);
886 [CustomEditor(typeof(pb_PrefabBrowserItemButton))]
887 public class pb_PrefabBrowserItemButtonEditor : Editor
889 public override void OnInspectorGUI()
891 base.OnInspectorGUI();
892 if (GUILayout.Button(
"Initialize"))
894 (target as pb_PrefabBrowserItemButton).Initialize(
true);
UnityEngine.UI.Button Button
System.Drawing.Image Image
void SwitchToModelEditor()
static CanvasManager instance
void StartLateRebuild(bool force=false)
static FileDragAndDrop instance
static pb_PrefabBrowser instance
static void RegisterStates(IEnumerable< IUndo > targets, string message)
static void Focus(Vector3 target)
static UnityEngine.GameObject Instantiate(UnityEngine.GameObject original)
static void SetSelection(IEnumerable< GameObject > selection)
static GameObject activeGameObject
bool HasTexture(string filename)
Texture2D GetLowRes(string filename)
Texture2D GetFullRes(string filename)
static GlobalTextureHolder instance
static Bounds GetBounds(GameObject go)
static ModelEditorLogicManager instance
Transform holderTransform
static PreviewCamerasHolder instance
void AddWork(GameObject asset, RawImage t)
void RenderSpin(GameObject asset, RawImage previewComponent)
static PreviewGenerator Instance
Represents a Class to destroy every Asset (Textures, Materials, Meshes) loaded by TriLib for this Gam...