//[MenuItem(UniGLTFVersion.MENU + "/Integrate static mesh")] public static void IntegrateSelected() { var go = Selection.activeObject as GameObject; var meshWithMaterials = Integrate(go.transform); // save as asset var assetPath = ""; #if UNITY_2018_2_OR_NEWER var prefab = PrefabUtility.GetCorrespondingObjectFromSource(go); #else var prefab = PrefabUtility.GetPrefabParent(go); #endif if (prefab != null) { var prefabPath = AssetDatabase.GetAssetPath(prefab); assetPath = string.Format("{0}/{1}_{2}{3}", Path.GetDirectoryName(prefabPath), Path.GetFileNameWithoutExtension(prefabPath), go.name, ASSET_SUFFIX ); } else { var path = EditorUtility.SaveFilePanel( "Save mesh", "Assets", go.name + ".asset", "asset"); if (string.IsNullOrEmpty(path)) { return; } assetPath = UnityPath.FromFullpath(path).Value; } assetPath = AssetDatabase.GenerateUniqueAssetPath(assetPath); Debug.LogFormat("CreateAsset: {0}", assetPath); AssetDatabase.CreateAsset(meshWithMaterials.Mesh, assetPath); // add component var meshObject = new GameObject(go.name + ".integrated"); if (go.transform.parent != null) { meshObject.transform.SetParent(go.transform.parent, false); } meshObject.transform.localPosition = go.transform.localPosition; meshObject.transform.localRotation = go.transform.localRotation; meshObject.transform.localScale = go.transform.localScale; var filter = meshObject.AddComponent <MeshFilter>(); filter.sharedMesh = meshWithMaterials.Mesh; var renderer = meshObject.AddComponent <MeshRenderer>(); renderer.sharedMaterials = meshWithMaterials.Materials; }
/// <summary> /// Extract images from glb or gltf out of Assets folder. /// </summary> /// <param name="prefabPath"></param> public void ExtractImages(UnityPath prefabPath) { var prefabParentDir = prefabPath.Parent; // glb buffer var folder = prefabPath.GetAssetFolder(".Textures"); // // https://answers.unity.com/questions/647615/how-to-update-import-settings-for-newly-created-as.html // int created = 0; //for (int i = 0; i < GLTF.textures.Count; ++i) for (int i = 0; i < GLTF.images.Count; ++i) { folder.EnsureFolder(); //var x = GLTF.textures[i]; var image = GLTF.images[i]; var src = Storage.GetPath(image.uri); if (UnityPath.FromFullpath(src).IsUnderAssetsFolder) { // asset is exists. } else { string textureName; var byteSegment = GLTF.GetImageBytes(Storage, i, out textureName); // path var dst = folder.Child(textureName + image.GetExt()); File.WriteAllBytes(dst.FullPath, byteSegment.ToArray()); dst.ImportAsset(); // make relative path from PrefabParentDir image.uri = dst.Value.Substring(prefabParentDir.Value.Length + 1); ++created; } } if (created > 0) { AssetDatabase.Refresh(); } CreateTextureItems(prefabParentDir); }
static void CopySRGBWrite(bool isSRGB) { var src = Selection.activeObject as Texture; var texturePath = UnityPath.FromAsset(src); var path = EditorUtility.SaveFilePanel("save prefab", "Assets", Path.GetFileNameWithoutExtension(AddPath(texturePath.FullPath, ".sRGB")), "prefab"); var assetPath = UnityPath.FromFullpath(path); if (!assetPath.IsUnderAssetsFolder) { return; } Debug.LogFormat("[CopySRGBWrite] {0} => {1}", texturePath, assetPath); var renderTexture = new RenderTexture(src.width, src.height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.sRGB); using (var scope = new ColorSpaceScope(isSRGB)) { Graphics.Blit(src, renderTexture); } var dst = new Texture2D(src.width, src.height, TextureFormat.ARGB32, false, RenderTextureReadWrite.sRGB == RenderTextureReadWrite.Linear); dst.ReadPixels(new Rect(0, 0, src.width, src.height), 0, 0); dst.Apply(); RenderTexture.active = null; assetPath.CreateAsset(dst); GameObject.DestroyImmediate(renderTexture); }