mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-09-12 13:59:21 -05:00
add excludes
This commit is contained in:
@@ -21,8 +21,8 @@ namespace UniGLTF.MeshUtility
|
||||
public Vector3[] Normals;
|
||||
public Vector3[] Tangents;
|
||||
}
|
||||
|
||||
// public List<SkinnedMeshRenderer> Renderers { get; private set; }
|
||||
|
||||
public MeshIntegrationResult Result;
|
||||
public List<Vector3> Positions { get; private set; }
|
||||
public List<Vector3> Normals { get; private set; }
|
||||
public List<Vector2> UV { get; private set; }
|
||||
@@ -76,7 +76,7 @@ namespace UniGLTF.MeshUtility
|
||||
|
||||
public MeshIntegrator()
|
||||
{
|
||||
// Renderers = new List<SkinnedMeshRenderer>();
|
||||
Result = new MeshIntegrationResult();
|
||||
|
||||
Positions = new List<Vector3>();
|
||||
Normals = new List<Vector3>();
|
||||
@@ -103,6 +103,8 @@ namespace UniGLTF.MeshUtility
|
||||
|
||||
public void Push(MeshRenderer renderer)
|
||||
{
|
||||
Result.SourceMeshRenderers.Add(renderer);
|
||||
|
||||
var meshFilter = renderer.GetComponent<MeshFilter>();
|
||||
if (meshFilter == null)
|
||||
{
|
||||
@@ -176,6 +178,8 @@ namespace UniGLTF.MeshUtility
|
||||
|
||||
public void Push(SkinnedMeshRenderer renderer)
|
||||
{
|
||||
Result.SourceSkinnedMeshRenderers.Add(renderer);
|
||||
|
||||
var mesh = renderer.sharedMesh;
|
||||
if (mesh == null)
|
||||
{
|
||||
@@ -183,8 +187,6 @@ namespace UniGLTF.MeshUtility
|
||||
return;
|
||||
}
|
||||
|
||||
// Renderers.Add(renderer);
|
||||
|
||||
var indexOffset = Positions.Count;
|
||||
var boneIndexOffset = Bones.Count;
|
||||
|
||||
@@ -249,5 +251,57 @@ namespace UniGLTF.MeshUtility
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public const string INTEGRATED_MESH_NAME = "MeshesIntegrated";
|
||||
public const string INTEGRATED_MESH_BLENDSHAPE_NAME = "MeshesBlendShapeIntegrated";
|
||||
|
||||
public void Intgrate(bool onlyBlendShapeRenderers)
|
||||
{
|
||||
var mesh = new Mesh();
|
||||
|
||||
if (Positions.Count > ushort.MaxValue)
|
||||
{
|
||||
Debug.LogFormat("exceed 65535 vertices: {0}", Positions.Count);
|
||||
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
|
||||
}
|
||||
|
||||
mesh.vertices = Positions.ToArray();
|
||||
mesh.normals = Normals.ToArray();
|
||||
mesh.uv = UV.ToArray();
|
||||
mesh.tangents = Tangents.ToArray();
|
||||
mesh.boneWeights = BoneWeights.ToArray();
|
||||
mesh.subMeshCount = SubMeshes.Count;
|
||||
for (var i = 0; i < SubMeshes.Count; ++i)
|
||||
{
|
||||
mesh.SetIndices(SubMeshes[i].Indices.ToArray(), MeshTopology.Triangles, i);
|
||||
}
|
||||
mesh.bindposes = BindPoses.ToArray();
|
||||
|
||||
if (onlyBlendShapeRenderers)
|
||||
{
|
||||
AddBlendShapesToMesh(mesh);
|
||||
mesh.name = INTEGRATED_MESH_BLENDSHAPE_NAME;
|
||||
}
|
||||
else
|
||||
{
|
||||
mesh.name = INTEGRATED_MESH_NAME;
|
||||
}
|
||||
|
||||
var meshNode = new GameObject();
|
||||
if (onlyBlendShapeRenderers)
|
||||
{
|
||||
meshNode.name = "MeshIntegrator(BlendShape)";
|
||||
}
|
||||
else
|
||||
{
|
||||
meshNode.name = "MeshIntegrator";
|
||||
}
|
||||
|
||||
var integrated = meshNode.AddComponent<SkinnedMeshRenderer>();
|
||||
integrated.sharedMesh = mesh;
|
||||
integrated.sharedMaterials = SubMeshes.Select(x => x.Material).ToArray();
|
||||
integrated.bones = Bones.ToArray();
|
||||
Result.IntegratedRenderer = integrated;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,29 +6,17 @@ namespace UniGLTF.MeshUtility
|
||||
{
|
||||
public static class MeshIntegratorUtility
|
||||
{
|
||||
public const string INTEGRATED_MESH_NAME = "MeshesIntegrated";
|
||||
public const string INTEGRATED_MESH_BLENDSHAPE_NAME = "MeshesBlendShapeIntegrated";
|
||||
public static string INTEGRATED_MESH_NAME => MeshIntegrator.INTEGRATED_MESH_NAME;
|
||||
public static string INTEGRATED_MESH_BLENDSHAPE_NAME => MeshIntegrator.INTEGRATED_MESH_BLENDSHAPE_NAME;
|
||||
|
||||
/// <summary>
|
||||
/// go を root としたヒエラルキーから Renderer を集めて、統合された Mesh 作成する
|
||||
/// </summary>
|
||||
/// <param name="go"></param>
|
||||
/// <param name="onlyBlendShapeRenderers">BlendShapeを保持するSkinnedMeshRendererのみ/BlendShapeを保持しないSkinnedMeshRenderer + MeshRenderer</param>
|
||||
/// <returns></returns>
|
||||
public static MeshIntegrationResult Integrate(GameObject go, bool onlyBlendShapeRenderers)
|
||||
public static MeshIntegrationResult Integrate(GameObject go, bool onlyBlendShapeRenderers, IReadOnlyList<Renderer> excludes = null)
|
||||
{
|
||||
var result = new MeshIntegrationResult();
|
||||
|
||||
var meshNode = new GameObject();
|
||||
if (onlyBlendShapeRenderers)
|
||||
{
|
||||
meshNode.name = "MeshIntegrator(BlendShape)";
|
||||
}
|
||||
else
|
||||
{
|
||||
meshNode.name = "MeshIntegrator";
|
||||
}
|
||||
meshNode.transform.SetParent(go.transform, false);
|
||||
|
||||
// レンダラから情報を集める
|
||||
var integrator = new MeshUtility.MeshIntegrator();
|
||||
|
||||
@@ -37,7 +25,6 @@ namespace UniGLTF.MeshUtility
|
||||
foreach (var x in EnumerateSkinnedMeshRenderer(go.transform, true))
|
||||
{
|
||||
integrator.Push(x);
|
||||
result.SourceSkinnedMeshRenderers.Add(x);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -45,53 +32,17 @@ namespace UniGLTF.MeshUtility
|
||||
foreach (var x in EnumerateSkinnedMeshRenderer(go.transform, false))
|
||||
{
|
||||
integrator.Push(x);
|
||||
result.SourceSkinnedMeshRenderers.Add(x);
|
||||
}
|
||||
|
||||
foreach (var x in EnumerateMeshRenderer(go.transform))
|
||||
{
|
||||
integrator.Push(x);
|
||||
result.SourceMeshRenderers.Add(x);
|
||||
}
|
||||
}
|
||||
|
||||
var mesh = new Mesh();
|
||||
|
||||
if (integrator.Positions.Count > ushort.MaxValue)
|
||||
{
|
||||
Debug.LogFormat("exceed 65535 vertices: {0}", integrator.Positions.Count);
|
||||
mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
|
||||
}
|
||||
|
||||
mesh.vertices = integrator.Positions.ToArray();
|
||||
mesh.normals = integrator.Normals.ToArray();
|
||||
mesh.uv = integrator.UV.ToArray();
|
||||
mesh.tangents = integrator.Tangents.ToArray();
|
||||
mesh.boneWeights = integrator.BoneWeights.ToArray();
|
||||
mesh.subMeshCount = integrator.SubMeshes.Count;
|
||||
for (var i = 0; i < integrator.SubMeshes.Count; ++i)
|
||||
{
|
||||
mesh.SetIndices(integrator.SubMeshes[i].Indices.ToArray(), MeshTopology.Triangles, i);
|
||||
}
|
||||
mesh.bindposes = integrator.BindPoses.ToArray();
|
||||
|
||||
if (onlyBlendShapeRenderers)
|
||||
{
|
||||
integrator.AddBlendShapesToMesh(mesh);
|
||||
mesh.name = INTEGRATED_MESH_BLENDSHAPE_NAME;
|
||||
}
|
||||
else
|
||||
{
|
||||
mesh.name = INTEGRATED_MESH_NAME;
|
||||
}
|
||||
|
||||
var integrated = meshNode.AddComponent<SkinnedMeshRenderer>();
|
||||
integrated.sharedMesh = mesh;
|
||||
integrated.sharedMaterials = integrator.SubMeshes.Select(x => x.Material).ToArray();
|
||||
integrated.bones = integrator.Bones.ToArray();
|
||||
result.IntegratedRenderer = integrated;
|
||||
|
||||
return result;
|
||||
integrator.Intgrate(onlyBlendShapeRenderers);
|
||||
integrator.Result.IntegratedRenderer.transform.SetParent(go.transform, false);
|
||||
return integrator.Result;
|
||||
}
|
||||
|
||||
public static IEnumerable<SkinnedMeshRenderer> EnumerateSkinnedMeshRenderer(Transform root, bool hasBlendShape)
|
||||
|
||||
Reference in New Issue
Block a user