You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

74 lines
2.4 KiB

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>();
meshFilter.sharedMesh = mesh;
var pipelineAsset = GraphicsSettings.currentRenderPipeline;
var baseMaterial = pipelineAsset ? pipelineAsset.defaultMaterial : AssetDatabase.GetBuiltinExtraResource<Material>("Default-Diffuse.mat");
var meshRenderer = gameObject.AddComponent<MeshRenderer>();
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 = radius,
m = m,
n = n,
};
var data = GoldbergBuilder.CreateGoldberg(options);
var vertices = data.vertices;
var normals = data.normals;
var indices = data.indices;
if (vertices.Count > 65535) mesh.indexFormat = IndexFormat.UInt32;
mesh.SetVertices(vertices);
mesh.SetNormals(normals);
mesh.SetIndices(indices, MeshTopology.Triangles, 0);
mesh.RecalculateBounds();
//mesh.RecalculateNormals();
if (generateLightmapUVs) Unwrapping.GenerateSecondaryUVSet(mesh);
mesh.UploadMeshData(!readWriteMeshes);
return mesh;
}
}
}