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.

78 lines
2.6 KiB

10 months ago
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;
10 months ago
[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()
{
10 months ago
var mesh = new Mesh
10 months ago
{
10 months ago
name = "Mesh"
};
10 months ago
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;
10 months ago
mesh.SetVertices(vertices);
mesh.SetNormals(normals);
mesh.SetIndices(indices, MeshTopology.Triangles, 0);
mesh.SetUVs(0, uvs);
mesh.SetUVs(1, barycentrics);
10 months ago
mesh.RecalculateBounds();
//mesh.RecalculateNormals();
10 months ago
if (generateLightmapUVs) Unwrapping.GenerateSecondaryUVSet(mesh);
mesh.UploadMeshData(!readWriteMeshes);
return mesh;
}
}
}