您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

129 行
3.2 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using UniGLTF;
using UnityEngine;
namespace VrmLib
{
public enum TopologyType : int
{
Points = 0,
Lines = 1,
LineLoop = 2,
LineStrip = 3,
Triangles = 4,
TriangleStrip = 5,
TriangleFan = 6,
}
public struct Triangle
{
public int Vertex0;
public int Vertex1;
public int Vertex2;
public Triangle(int v0, int v1, int v2)
{
Vertex0 = v0;
Vertex1 = v1;
Vertex2 = v2;
}
}
public class Submesh
{
public int Offset;
public int DrawCount;
public int Material;
public override string ToString()
{
return $"{Material}({DrawCount})";
}
public Submesh(int material) : this(0, 0, material)
{
}
public Submesh(int offset, int drawCount, int material)
{
Offset = offset;
DrawCount = drawCount;
Material = material;
}
}
public class Mesh
{
public VertexBuffer VertexBuffer;
public BufferAccessor IndexBuffer;
public TopologyType Topology = TopologyType.Triangles;
public List<Submesh> Submeshes { private set; get; } = new List<Submesh>();
public List<MorphTarget> MorphTargets = new List<MorphTarget>();
public override string ToString()
{
var sb = new System.Text.StringBuilder();
foreach (var key in VertexBuffer.Select(x => x.Key))
{
sb.Append($"[{key}]");
}
if (IndexBuffer != null)
{
switch (Topology)
{
case TopologyType.Triangles:
sb.Append($" {IndexBuffer.Count / 3} tris");
break;
default:
sb.Append($" topology: {Topology}");
break;
}
}
if (MorphTargets.Any())
{
sb.Append($", {MorphTargets.Count} morphs");
foreach (var kv in MorphTargets[0].VertexBuffer)
{
sb.Append($"[{kv.Key}]");
}
}
var byteLength = VertexBuffer.ByteLength + IndexBuffer.ByteLength + MorphTargets.Sum(x => x.VertexBuffer.ByteLength);
sb.Append($": expected {byteLength / 1000 / 1000} MB");
return sb.ToString();
}
public Mesh(TopologyType topology = TopologyType.Triangles)
{
Topology = topology;
}
// Skin.Normalize
public void ApplyRotationAndScaling(Matrix4x4 m)
{
m.SetColumn(3, new Vector4(0, 0, 0, 1));
var position = VertexBuffer.Positions.Bytes.Reinterpret<Vector3>(1);
var normal = VertexBuffer.Normals.Bytes.Reinterpret<Vector3>(1);
for (int i = 0; i < position.Length; ++i)
{
{
position[i] = m.MultiplyPoint(position[i]);
}
{
normal[i] = m.MultiplyVector(normal[i]);
}
}
}
}
}