using Thousandto.Core.Asset; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using UnityEditor; using UnityEngine; namespace Thousandto.Editor.Test { /// <summary> /// 预览选中物件的光照贴图 /// </summary> public partial class SplitTerrainWindow : UnityEditor.EditorWindow { Texture2D _tex; private Vector2 _previewScrollRect = new Vector2(0, 0); private Rect _viewRect; Rect posRect = new Rect(0, 400, 400, 400); int _blockW = 200; int _blockH = 200; Vector4 _lightScaleInfo; Vector4 _boundsInPixel; int _lightIndex = 0; bool _foldOutPreview = true; void DrawTexturePreview() { var oldColor = GUI.contentColor; GUI.contentColor = Color.green; _foldOutPreview = EditorGUILayout.Foldout(_foldOutPreview, "Preview Lightmap"); GUI.contentColor = oldColor; if (_foldOutPreview) { //DrawSplitSetting("lightmapIndex: ", ref _lightIndex, ""); //EditorGUILayout.Vector4Field("ScakeOffset", _lightScaleInfo); EditorGUILayout.Vector4Field("_boundsInPixel", _boundsInPixel); DrawSplitSetting("分块大小W: ", ref _blockW, ""); DrawSplitSetting("分块大小H: ", ref _blockH, ""); GUILayout.BeginHorizontal(); if (GUILayout.Button("合并lightmap 预览")) { _tex = LightMapSpliter.CombineLightmap(Selection.gameObjects); } if (GUILayout.Button("同步选中的prefab")) { var gos = Selection.gameObjects; Utils.SyncPrefabInEditor(gos); } if (GUILayout.Button("删除PrefabInfo脚本")) { var gos = Selection.gameObjects; for(int i = 0; i < gos.Length; ++i) { var scripts = gos[i].GetComponentsInChildren<PrefabLightmapInfo>(); if(PrefabUtility.GetPrefabType(gos[i]) != PrefabType.PrefabInstance) { var path = AssetDatabase.GetAssetPath(gos[i]); scripts = AssetDatabase.LoadAssetAtPath<GameObject>(path).GetComponentsInChildren<PrefabLightmapInfo>(); } for(int j = 0; scripts != null && j < scripts.Length; ++j) { DestroyImmediate(scripts[j], true); } } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } GUILayout.EndHorizontal(); if (_tex != null) { _viewRect = new Rect(0, 0, _tex.width, _tex.height); GUILayoutOption[] options = new GUILayoutOption[] { GUILayout.MaxWidth(400), GUILayout.Height(300), GUILayout.MaxHeight(1024) }; _previewScrollRect = EditorGUILayout.BeginScrollView(_previewScrollRect); var aspect = _tex.width / (float)_tex.height; Rect aspectRect = GUILayoutUtility.GetAspectRect(aspect, GUILayout.MaxWidth(_tex.width), GUILayout.MaxHeight(_tex.height)); EditorGUI.DrawPreviewTexture(aspectRect, _tex); EditorGUILayout.EndScrollView(); } } } void PickTexFromLightmap() { Vector4 bound; Vector4 scaleBound; Rect pickRect; _tex = LightMapUtil.PickLightmap(_curSelectObj as GameObject, out bound, out scaleBound, out pickRect); return; try { var lpData = LightmapSettings.lightmaps; var go = _curSelectObj as GameObject; if (go == null) return; var renderer = go.GetComponent<MeshRenderer>(); if (renderer == null) return; var meshFileter = go.GetComponent<MeshFilter>(); _lightScaleInfo = renderer.lightmapScaleOffset; _lightIndex = renderer.lightmapIndex; var tex = lpData[_lightIndex].lightmapDir; if (tex == null) tex = lpData[_lightIndex].lightmapColor; var uv2s = LightMapUtil.GetMeshUV2(meshFileter.sharedMesh); var sourceBounds = LightMapUtil.GetBounds(uv2s, renderer); var bounds = new Vector4(sourceBounds.x * renderer.lightmapScaleOffset.x + renderer.lightmapScaleOffset.z, sourceBounds.y * renderer.lightmapScaleOffset.y + renderer.lightmapScaleOffset.w, sourceBounds.z * renderer.lightmapScaleOffset.x + renderer.lightmapScaleOffset.z, sourceBounds.w * renderer.lightmapScaleOffset.y + renderer.lightmapScaleOffset.w); _blockW = (int)((bounds.z - bounds.x )* tex.width); _blockH = (int)((bounds.w - bounds.y) * tex.height); int startX = (int)(bounds.x * tex.width); int startY = (int)(bounds.y * tex.height); _boundsInPixel.x = startX; _boundsInPixel.y = startY; _boundsInPixel.z = _blockW; _boundsInPixel.w = _blockH; startY = (tex.height - startY - _blockH); if (_blockH == 0 || _blockW == 0) return; var colors = tex.GetPixels(startX, startY, _blockW, _blockH); Texture2D tex2d = new Texture2D(_blockW, _blockH); tex2d.SetPixels(colors); tex2d.Apply(); _tex = tex2d; } catch(Exception ex) { UnityEngine.Debug.LogException(ex); } } } }