mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-08-24 03:25:41 -05:00
MeshExportInfo.GetInfo
This commit is contained in:
@@ -1,18 +0,0 @@
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UniGLTF
|
||||
{
|
||||
public static class ExporterExtensions
|
||||
{
|
||||
public static bool EnableForExport(this Component mono)
|
||||
{
|
||||
if (mono.transform.Ancestors().Any(x => !x.gameObject.activeSelf))
|
||||
{
|
||||
// 自分か祖先に !activeSelf がいる
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f76ebfda1e249cb48890de41cc221889
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -35,148 +35,11 @@ namespace UniGLTF
|
||||
|
||||
public virtual bool UseBlendShape(int index, string relativePath) => true;
|
||||
|
||||
static void CalcMeshSize(ref MeshExportInfo info,
|
||||
string relativePath,
|
||||
MeshExportSettings settings,
|
||||
Func<int, string, bool> useBlendShape
|
||||
)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
if (!info.IsRendererActive)
|
||||
{
|
||||
sb.Append("[NotActive]");
|
||||
}
|
||||
|
||||
info.VertexCount = info.Mesh.vertexCount;
|
||||
info.ExportVertexSize = 0;
|
||||
info.TotalBlendShapeCount = 0;
|
||||
info.ExportBlendShapeCount = 0;
|
||||
|
||||
// float4 x 3
|
||||
// vertices
|
||||
sb.Append($"(Pos");
|
||||
if (info.HasNormal)
|
||||
{
|
||||
sb.Append("+Nom");
|
||||
info.ExportVertexSize += 4 * 3;
|
||||
}
|
||||
if (info.HasUV)
|
||||
{
|
||||
sb.Append("+UV");
|
||||
info.ExportVertexSize += 4 * 2;
|
||||
}
|
||||
if (info.HasVertexColor)
|
||||
{
|
||||
sb.Append("+Col");
|
||||
info.ExportVertexSize += 4 * 4;
|
||||
}
|
||||
if (info.HasSkinning)
|
||||
{
|
||||
// short, float x 4 weights
|
||||
sb.Append("+Skin");
|
||||
info.ExportVertexSize += (2 + 4) * 4;
|
||||
}
|
||||
// indices
|
||||
info.IndexCount = info.Mesh.triangles.Length;
|
||||
|
||||
// postion + normal ?. always tangent is ignored
|
||||
info.TotalBlendShapeCount = info.Mesh.blendShapeCount;
|
||||
info.ExportBlendShapeVertexSize = settings.ExportOnlyBlendShapePosition ? 4 * 3 : 4 * (3 + 3);
|
||||
for (var i = 0; i < info.Mesh.blendShapeCount; ++i)
|
||||
{
|
||||
if (!useBlendShape(i, relativePath))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
++info.ExportBlendShapeCount;
|
||||
}
|
||||
|
||||
if (info.ExportBlendShapeCount > 0)
|
||||
{
|
||||
sb.Append($"+Morph x {info.ExportBlendShapeCount}");
|
||||
}
|
||||
sb.Append($") x {info.Mesh.vertexCount}");
|
||||
switch (info.VertexColor)
|
||||
{
|
||||
case VertexColorState.ExistsAndIsUsed:
|
||||
case VertexColorState.ExistsAndMixed: // エクスポートする
|
||||
sb.Insert(0, "[use vcolor]");
|
||||
break;
|
||||
case VertexColorState.ExistsButNotUsed:
|
||||
sb.Insert(0, "[remove vcolor]");
|
||||
break;
|
||||
}
|
||||
if (info.ExportBlendShapeCount > 0 && !info.HasSkinning)
|
||||
{
|
||||
sb.Insert(0, "[morph without skin]");
|
||||
}
|
||||
|
||||
// total bytes
|
||||
sb.Insert(0, $"{info.ExportByteSize:#,0} Bytes = ");
|
||||
info.Summary = sb.ToString();
|
||||
}
|
||||
|
||||
static bool TryGetMeshInfo(GameObject root, Renderer renderer, MeshExportSettings settings, Func<int, string, bool> useBlendShape, out MeshExportInfo info)
|
||||
{
|
||||
info = default;
|
||||
if (root == null)
|
||||
{
|
||||
info.Summary = "";
|
||||
return false;
|
||||
}
|
||||
if (renderer == null)
|
||||
{
|
||||
info.Summary = "no Renderer";
|
||||
return false;
|
||||
}
|
||||
info.Renderer = renderer;
|
||||
|
||||
if (renderer is SkinnedMeshRenderer smr)
|
||||
{
|
||||
info.Skinned = true;
|
||||
info.Mesh = smr.sharedMesh;
|
||||
info.IsRendererActive = smr.EnableForExport();
|
||||
}
|
||||
else if (renderer is MeshRenderer mr)
|
||||
{
|
||||
var filter = mr.GetComponent<MeshFilter>();
|
||||
if (filter != null)
|
||||
{
|
||||
info.Mesh = filter.sharedMesh;
|
||||
}
|
||||
info.IsRendererActive = mr.EnableForExport();
|
||||
}
|
||||
else
|
||||
{
|
||||
info.Summary = "no Mesh";
|
||||
return false;
|
||||
}
|
||||
|
||||
info.VertexColor = VertexColorUtility.DetectVertexColor(info.Mesh, info.Renderer.sharedMaterials);
|
||||
|
||||
var relativePath = UniGLTF.UnityExtensions.RelativePathFrom(renderer.transform, root.transform);
|
||||
CalcMeshSize(ref info, relativePath, settings, useBlendShape);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void SetRoot(GameObject ExportRoot, MeshExportSettings settings)
|
||||
{
|
||||
Settings = settings;
|
||||
Meshes.Clear();
|
||||
if (ExportRoot == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var renderer in ExportRoot.GetComponentsInChildren<Renderer>(true))
|
||||
{
|
||||
if (TryGetMeshInfo(ExportRoot, renderer, settings, UseBlendShape, out MeshExportInfo info))
|
||||
{
|
||||
Meshes.Add(info);
|
||||
}
|
||||
}
|
||||
MeshExportInfo.GetInfo(ExportRoot, Meshes, settings, UseBlendShape);
|
||||
}
|
||||
|
||||
public Func<string, string> GltfMaterialFromUnityShaderName = DefaultGltfMaterialType;
|
||||
|
||||
@@ -213,7 +213,7 @@ namespace UniGLTF
|
||||
{
|
||||
var current = self;
|
||||
|
||||
var split = path.Split(new [] {'/'}, StringSplitOptions.RemoveEmptyEntries);
|
||||
var split = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
foreach (var childName in split)
|
||||
{
|
||||
@@ -334,5 +334,15 @@ namespace UniGLTF
|
||||
}
|
||||
return go.AddComponent<T>();
|
||||
}
|
||||
|
||||
public static bool EnableForExport(this Component mono)
|
||||
{
|
||||
if (mono.transform.Ancestors().Any(x => !x.gameObject.activeSelf))
|
||||
{
|
||||
// 自分か祖先に !activeSelf がいる
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UniGLTF
|
||||
{
|
||||
public delegate bool UseBlendShapeFunc(int blendShapeIndex, string relativePath);
|
||||
|
||||
[Serializable]
|
||||
public struct MeshExportInfo
|
||||
{
|
||||
@@ -46,5 +51,155 @@ namespace UniGLTF
|
||||
public int ExportByteSize => ExportVertexSize * VertexCount + IndicesSize + ExportBlendShapeCount * ExportBlendShapeVertexSize * VertexCount;
|
||||
|
||||
public string Summary;
|
||||
|
||||
/// <summary>
|
||||
/// ヒエラルキーからエクスポートする Mesh の情報を収集する
|
||||
/// </summary>
|
||||
/// <param name="exportRoot"></param>
|
||||
/// <param name="list"></param>
|
||||
/// <param name="settings"></param>
|
||||
/// <param name="useBlendShape"> blendShape の export を filtering する </param>
|
||||
public static void GetInfo(GameObject exportRoot, List<MeshExportInfo> list, MeshExportSettings settings, UseBlendShapeFunc useBlendShape)
|
||||
{
|
||||
list.Clear();
|
||||
if (exportRoot == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var renderer in exportRoot.GetComponentsInChildren<Renderer>(true))
|
||||
{
|
||||
if (TryGetMeshInfo(exportRoot, renderer, settings, useBlendShape, out MeshExportInfo info))
|
||||
{
|
||||
list.Add(info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool TryGetMeshInfo(GameObject root, Renderer renderer, MeshExportSettings settings, UseBlendShapeFunc useBlendShape, out MeshExportInfo info)
|
||||
{
|
||||
info = default;
|
||||
if (root == null)
|
||||
{
|
||||
info.Summary = "";
|
||||
return false;
|
||||
}
|
||||
if (renderer == null)
|
||||
{
|
||||
info.Summary = "no Renderer";
|
||||
return false;
|
||||
}
|
||||
info.Renderer = renderer;
|
||||
|
||||
if (renderer is SkinnedMeshRenderer smr)
|
||||
{
|
||||
info.Skinned = true;
|
||||
info.Mesh = smr.sharedMesh;
|
||||
info.IsRendererActive = smr.EnableForExport();
|
||||
}
|
||||
else if (renderer is MeshRenderer mr)
|
||||
{
|
||||
var filter = mr.GetComponent<MeshFilter>();
|
||||
if (filter != null)
|
||||
{
|
||||
info.Mesh = filter.sharedMesh;
|
||||
}
|
||||
info.IsRendererActive = mr.EnableForExport();
|
||||
}
|
||||
else
|
||||
{
|
||||
info.Summary = "no Mesh";
|
||||
return false;
|
||||
}
|
||||
|
||||
info.VertexColor = VertexColorUtility.DetectVertexColor(info.Mesh, info.Renderer.sharedMaterials);
|
||||
|
||||
var relativePath = UniGLTF.UnityExtensions.RelativePathFrom(renderer.transform, root.transform);
|
||||
CalcMeshSize(ref info, relativePath, settings, useBlendShape);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void CalcMeshSize(ref MeshExportInfo info,
|
||||
string relativePath,
|
||||
MeshExportSettings settings,
|
||||
UseBlendShapeFunc useBlendShape
|
||||
)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
if (!info.IsRendererActive)
|
||||
{
|
||||
sb.Append("[NotActive]");
|
||||
}
|
||||
|
||||
info.VertexCount = info.Mesh.vertexCount;
|
||||
info.ExportVertexSize = 0;
|
||||
info.TotalBlendShapeCount = 0;
|
||||
info.ExportBlendShapeCount = 0;
|
||||
|
||||
// float4 x 3
|
||||
// vertices
|
||||
sb.Append($"(Pos");
|
||||
if (info.HasNormal)
|
||||
{
|
||||
sb.Append("+Nom");
|
||||
info.ExportVertexSize += 4 * 3;
|
||||
}
|
||||
if (info.HasUV)
|
||||
{
|
||||
sb.Append("+UV");
|
||||
info.ExportVertexSize += 4 * 2;
|
||||
}
|
||||
if (info.HasVertexColor)
|
||||
{
|
||||
sb.Append("+Col");
|
||||
info.ExportVertexSize += 4 * 4;
|
||||
}
|
||||
if (info.HasSkinning)
|
||||
{
|
||||
// short, float x 4 weights
|
||||
sb.Append("+Skin");
|
||||
info.ExportVertexSize += (2 + 4) * 4;
|
||||
}
|
||||
// indices
|
||||
info.IndexCount = info.Mesh.triangles.Length;
|
||||
|
||||
// postion + normal ?. always tangent is ignored
|
||||
info.TotalBlendShapeCount = info.Mesh.blendShapeCount;
|
||||
info.ExportBlendShapeVertexSize = settings.ExportOnlyBlendShapePosition ? 4 * 3 : 4 * (3 + 3);
|
||||
for (var i = 0; i < info.Mesh.blendShapeCount; ++i)
|
||||
{
|
||||
if (!useBlendShape(i, relativePath))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
++info.ExportBlendShapeCount;
|
||||
}
|
||||
|
||||
if (info.ExportBlendShapeCount > 0)
|
||||
{
|
||||
sb.Append($"+Morph x {info.ExportBlendShapeCount}");
|
||||
}
|
||||
sb.Append($") x {info.Mesh.vertexCount}");
|
||||
switch (info.VertexColor)
|
||||
{
|
||||
case VertexColorState.ExistsAndIsUsed:
|
||||
case VertexColorState.ExistsAndMixed: // エクスポートする
|
||||
sb.Insert(0, "[use vcolor]");
|
||||
break;
|
||||
case VertexColorState.ExistsButNotUsed:
|
||||
sb.Insert(0, "[remove vcolor]");
|
||||
break;
|
||||
}
|
||||
if (info.ExportBlendShapeCount > 0 && !info.HasSkinning)
|
||||
{
|
||||
sb.Insert(0, "[morph without skin]");
|
||||
}
|
||||
|
||||
// total bytes
|
||||
sb.Insert(0, $"{info.ExportByteSize:#,0} Bytes = ");
|
||||
info.Summary = sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user