/// <summary> /// Converts materials for ToonLit. /// </summary> /// <param name="materials">Materials to convert.</param> /// <param name="assetsDirectory">Root directory for converted avatar.</param> /// <returns>Converted materials (key: original material).</returns> internal Dictionary <Material, Material> ConvertMaterialsForToonLit(Material[] materials, string assetsDirectory) { var saveDirectory = $"{assetsDirectory}/Materials"; Directory.CreateDirectory(saveDirectory); AssetDatabase.Refresh(); var materialsToConvert = materials.Where(m => !VRCSDKUtility.IsMaterialAllowedForQuestAvatar(m)).ToArray(); var convertedMaterials = new Dictionary <Material, Material>(); for (int i = 0; i < materialsToConvert.Length; i++) { var m = materialsToConvert[i]; AssetDatabase.TryGetGUIDAndLocalFileIdentifier(m, out string guid, out long localId); var material = new MaterialWrapperBuilder().Build(m); var toonlit = material.ConvertToToonLit(); AssetDatabase.CreateAsset(toonlit, $"{saveDirectory}/{m.name}_from_{guid}.mat"); convertedMaterials.Add(m, toonlit); } return(convertedMaterials); }
private bool AvatarHasErrorForQuest(VRChatAvatar avatar) { if (!avatar.GameObject.activeInHierarchy) { return(false); } foreach (var m in avatar.GetRendererMaterials()) { if (!VRCSDKUtility.IsMaterialAllowedForQuestAvatar(m)) { return(true); } } if (new ComponentRemover().GetUnsupportedComponentsInChildren(avatar.GameObject, true).Length > 0) { return(true); } return(false); }
/// <summary> /// Generates textures for Toon Lit. /// </summary> /// <param name="materials">Materials to generate textures.</param> /// <param name="assetsDirectory">Root directory for converted avatar.</param> /// <param name="maxTextureSize">Max texture size. 0 for no limits.</param> /// <param name="progressCallback">Callback to show progress.</param> /// <returns>Converted textures (key: original material).</returns> internal Dictionary <Material, Texture2D> GenrateToonLitTextures(Material[] materials, string assetsDirectory, int maxTextureSize, TextureProgressCallback progressCallback) { var saveDirectory = $"{assetsDirectory}/Textures"; Directory.CreateDirectory(saveDirectory); AssetDatabase.Refresh(); var materialsToConvert = materials.Where(m => !VRCSDKUtility.IsMaterialAllowedForQuestAvatar(m)).ToArray(); var convertedTextures = new Dictionary <Material, Texture2D>(); for (int i = 0; i < materialsToConvert.Length; i++) { var m = materialsToConvert[i]; progressCallback(materialsToConvert.Length, i, null, m); try { AssetDatabase.TryGetGUIDAndLocalFileIdentifier(m, out string guid, out long localId); var material = MaterialWrapperBuilder.Build(m); using (var image = material.GenerateToonLitImage()) { Texture2D texture = null; if (image != null) { if (maxTextureSize > 0 && Math.Max(image.Width, image.Height) > maxTextureSize) { image.Resize(maxTextureSize, maxTextureSize); } texture = MagickImageUtility.SaveAsAsset($"{saveDirectory}/{m.name}_from_{guid}.png", image); } convertedTextures.Add(m, texture); } } catch (Exception e) { progressCallback(materialsToConvert.Length, i, e, m); throw e; } } return(convertedTextures); }