rj-action-library/Runtime/LOD/LODMeshCreator.cs

61 lines
1.3 KiB
C#

using Godot;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class LODMeshCreator:Node
{
[Export]
public MeshInstance3D[] meshes;
[Export]
public float[] distances;
[Export]
public Mesh.PrimitiveType primitiveType = Mesh.PrimitiveType.Triangles;
[Export]
public bool generateTangents = true;
[ExportToolButton("Create")]
public Callable CreateButton => Callable.From( ()=>{ Create(); } );
[ExportGroup("Output")]
[Export]
public MeshInstance3D lodMesh;
public async Task Create()
{
var list = new List<MeshGeometry>();
var index = 0;
foreach ( var m in meshes )
{
var mg = MeshGeometry.From( m.Mesh as ArrayMesh );
mg.lodEdgeLength = distances[ index ];
index++;
await this.RequestNextFrame();
}
var mesh = MeshGeometry.GenerateLODMesh( list, primitiveType, null, generateTangents );
await this.RequestNextFrame();
this.DestroyChildren();
await this.RequestNextFrame();
lodMesh = this.CreateChild<MeshInstance3D>( "LODMesh" );
lodMesh.Mesh = mesh;
lodMesh.Mesh.SurfaceSetMaterial( 0, MaterialSurfaceContainer.GetActiveFrom( meshes[ 0 ] ) );
}
}
}