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.
76 lines
2.5 KiB
76 lines
2.5 KiB
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using UnityEditor;
|
|
using UnityEditor.AssetImporters;
|
|
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using static Metamesh.GoldbergBuilder;
|
|
|
|
namespace Metamesh
|
|
{
|
|
[ScriptedImporter(1, "gph")]
|
|
public class GoldbergPolyhedronImporter : ScriptedImporter
|
|
{
|
|
[SerializeField] float radius = 1;
|
|
[SerializeField, Min(2)] uint subdivision = 2;
|
|
[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 builder = new GoldbergBuilder();
|
|
var options = new GoldbergCreationOption()
|
|
{
|
|
m = m,
|
|
n = n,
|
|
};
|
|
var data = builder.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;
|
|
}
|
|
}
|
|
} |