using System.Collections.Generic; using System.Linq; using UnityEditor; using UnityEditor.AssetImporters; using UnityEngine; using UnityEngine.Rendering; namespace Metamesh { [ScriptedImporter(1, "gph")] public class GoldbergPolyhedronImporter : ScriptedImporter { //[SerializeField] float radius = 1; [SerializeField, Min(1)] int m = 1; [SerializeField, Min(0)] int n = 0; [SerializeField] bool generateLightmapUVs = false; [SerializeField] bool readWriteMeshes = false; [MenuItem("Assets/Create/GoldbergPolyhedron")] public static void CreateNewAsset() => ProjectWindowUtil.CreateAssetWithContent("New GoldbergPolyhedron.gph", ""); public override void OnImportAsset(AssetImportContext context) { var gameObject = new GameObject(); var mesh = ImportAsMesh(); var meshFilter = gameObject.AddComponent(); meshFilter.sharedMesh = mesh; var pipelineAsset = GraphicsSettings.currentRenderPipeline; var baseMaterial = pipelineAsset ? pipelineAsset.defaultMaterial : AssetDatabase.GetBuiltinExtraResource("Default-Diffuse.mat"); var meshRenderer = gameObject.AddComponent(); meshRenderer.sharedMaterial = baseMaterial; context.AddObjectToAsset("prefab", gameObject); if (mesh != null) context.AddObjectToAsset("mesh", mesh); context.SetMainObject(gameObject); } private Mesh ImportAsMesh() { var mesh = new Mesh { name = "Mesh" }; var options = new GoldbergBuilder.GoldbergCreationOption() { size = 1, m = m, n = n, }; var data = GoldbergBuilder.CreateGoldberg(options); var vertices = data.vertices; var normals = data.normals; var indices = data.indices; var uvs = data.uvs; var barycentrics = data.barycentrics; if (vertices.Count > 65535) mesh.indexFormat = IndexFormat.UInt32; mesh.SetVertices(vertices); mesh.SetNormals(normals); mesh.SetIndices(indices, MeshTopology.Triangles, 0); mesh.SetUVs(0, uvs); mesh.SetUVs(1, barycentrics); mesh.RecalculateBounds(); //mesh.RecalculateNormals(); if (generateLightmapUVs) Unwrapping.GenerateSecondaryUVSet(mesh); mesh.UploadMeshData(!readWriteMeshes); return mesh; } } }