Merge branch 'master' into fix/vrm10viewer_uikit

This commit is contained in:
ousttrue 2025-04-02 12:23:42 +09:00 committed by GitHub
commit 26d41e7b53
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 72 additions and 56 deletions

View File

@ -21,18 +21,20 @@ namespace UniGLTF.SpringBoneJobs
{
private FastSpringBoneCombinedBuffer _combinedBuffer;
public FastSpringBoneCombinedBuffer Combined => _combinedBuffer;
private readonly LinkedList<FastSpringBoneBuffer> _buffers = new LinkedList<FastSpringBoneBuffer>();
private Queue<(bool isAdd, FastSpringBoneBuffer buffer)> _request = new();
private readonly List<FastSpringBoneBuffer> _buffers = new();
struct Request
{
public FastSpringBoneBuffer Remove;
public FastSpringBoneBuffer Add;
}
private Queue<Request> _request = new();
public bool HasBuffer => _buffers.Count > 0 && _combinedBuffer != null;
public void Register(FastSpringBoneBuffer buffer)
public void Register(FastSpringBoneBuffer add, FastSpringBoneBuffer remove)
{
_request.Enqueue((true, buffer));
}
public void Unregister(FastSpringBoneBuffer buffer)
{
_request.Enqueue((false, buffer));
_request.Enqueue(new Request { Remove = remove, Add = add });
}
/// <summary>
@ -52,11 +54,6 @@ namespace UniGLTF.SpringBoneJobs
var logicsIndex = 0;
foreach (var buffer in _buffers)
{
if (_request.Any(x => !x.isAdd && x.buffer == buffer))
{
// 削除するので skip
continue;
}
buffer.BackupCurrentTails(combined.CurrentTails, combined.NextTails, logicsIndex);
logicsIndex += buffer.Logics.Length;
}
@ -65,15 +62,20 @@ namespace UniGLTF.SpringBoneJobs
// buffer 増減
while (_request.Count > 0)
{
var (isAdd, buffer) = _request.Dequeue();
if (isAdd)
var req = _request.Dequeue();
if (req.Remove != null && req.Add != null)
{
// 速度 0 にする
_buffers.AddLast(buffer);
// 順番が変わらないように入れ替える
var index = _buffers.IndexOf(req.Remove);
_buffers[index] = req.Add;
}
else
else if (req.Add != null)
{
_buffers.Remove(buffer);
_buffers.Add(req.Add);
}
else if (req.Remove != null)
{
_buffers.Remove(req.Remove);
}
}

View File

@ -78,11 +78,14 @@ namespace UniGLTF.SpringBoneJobs
_batchedBufferLogicSizes = batchedBufferLogicSizes;
}
/// <summary>
/// Job向けに、Lidt[FastSpringBoneBuffer] をひとつの FastSpringBoneCombinedBuffer に統合する
/// </summary>
internal static JobHandle Create(JobHandle handle,
LinkedList<FastSpringBoneBuffer> _buffers, out FastSpringBoneCombinedBuffer combined)
IReadOnlyList<FastSpringBoneBuffer> buffers, out FastSpringBoneCombinedBuffer combined)
{
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CopyToBatchedBuffers");
var batchedBuffers = _buffers.ToArray();
var batchedBuffers = buffers.ToArray();
var batchedBufferLogicSizes = batchedBuffers.Select(buffer => buffer.Logics.Length).ToArray();
Profiler.EndSample();
@ -92,7 +95,7 @@ namespace UniGLTF.SpringBoneJobs
var collidersCount = 0;
var logicsCount = 0;
var transformsCount = 0;
foreach (var buffer in _buffers)
foreach (var buffer in buffers)
{
springsCount += buffer.Springs.Length;
collidersCount += buffer.Colliders.Length;
@ -103,7 +106,7 @@ namespace UniGLTF.SpringBoneJobs
// バッファの構築
Profiler.BeginSample("FastSpringBone.ReconstructBuffers.CreateBuffers");
combined = new FastSpringBoneCombinedBuffer(logicsCount, springsCount, _buffers.Count,
combined = new FastSpringBoneCombinedBuffer(logicsCount, springsCount, buffers.Count,
collidersCount, transformsCount, batchedBuffers, batchedBufferLogicSizes);
Profiler.EndSample();
@ -300,6 +303,9 @@ namespace UniGLTF.SpringBoneJobs
public void Execute(int springIndex)
{
var spring = Springs[springIndex];
var center = spring.centerTransformIndex >= 0
? Transforms[spring.transformIndexOffset + spring.centerTransformIndex]
: (BlittableTransform?)null;
for (int jointIndex = spring.logicSpan.startIndex; jointIndex < spring.logicSpan.EndIndex; ++jointIndex)
{
if (float.IsNaN(CurrentTails[jointIndex].x))
@ -317,9 +323,10 @@ namespace UniGLTF.SpringBoneJobs
}
var tail = Transforms[tailIndex];
CurrentTails[jointIndex] = tail.position;
PrevTails[jointIndex] = tail.position;
NextTails[jointIndex] = tail.position;
var tailPos = center.HasValue ? center.Value.worldToLocalMatrix.MultiplyPoint3x4(tail.position) : tail.position;
CurrentTails[jointIndex] = tailPos;
PrevTails[jointIndex] = tailPos;
NextTails[jointIndex] = tailPos;
}
}
}

View File

@ -310,9 +310,6 @@ namespace UniGLTF
{
var node = data.GLTF.nodes[channel.target.node];
var mesh = data.GLTF.meshes[node.mesh];
var primitive = mesh.primitives.FirstOrDefault();
var targets = primitive.targets;
if (!gltf_mesh_extras_targetNames.TryGet(mesh, out List<string> targetNames))
{
throw new UniGLTFNotSupportedException("glTF BlendShape Animation. targetNames invalid.");

View File

@ -78,6 +78,10 @@ namespace UniGLTF
{
return false;
}
if (Mesh.triangles.Length == 0)
{
return false;
}
if (Materials == null)
{
return false;

View File

@ -69,8 +69,9 @@ namespace UniGLTF
public NativeArray<T> CreateNativeArray<T>(ArraySegment<T> data) where T : struct
{
var array = CreateNativeArray<T>(data.Count);
for (int i = 0; i < data.Count; i++)
array[i] = data.Array[data.Offset + i];
var toSpan = array.AsSpan();
var fromSpan = data.AsSpan();
fromSpan.CopyTo(toSpan);
return array;
}

View File

@ -9,6 +9,18 @@ namespace UniGLTF
/// </summary>
public sealed class UnitySupportedImageTypeDeserializer : ITextureDeserializer
{
/// <summary>
/// `true` を指定すると、テクスチャを Non-Readable なものとしてデシリアライズする。
/// </summary>
/// <remarks>
/// `UnityEngine.ImageConversion.LoadImage` の第二引数 `markNonReadable` に相当。
/// デフォルト値は `false`。
/// テクスチャ編集を行わないアプリケーションプログラム等では、
/// この値を `true` にすることでメモリ使用量の削減を期待できる。
/// このフラグの効用については `UnityEngine.Texture2D.Apply` に記述がある。
/// </remarks>
public bool MarkNonReadable { get; set; } = false;
public async Task<Texture2D> LoadTextureAsync(DeserializingTextureInfo textureInfo, IAwaitCaller awaitCaller)
{
if (textureInfo.ImageData == null) return null;
@ -16,7 +28,7 @@ namespace UniGLTF
try
{
var texture = new Texture2D(2, 2, TextureFormat.ARGB32, textureInfo.UseMipmap, textureInfo.ColorSpace == ColorSpace.Linear);
texture.LoadImage(textureInfo.ImageData);
texture.LoadImage(textureInfo.ImageData, MarkNonReadable);
await awaitCaller.NextFrame();
texture.wrapModeU = textureInfo.WrapModeU;

View File

@ -273,6 +273,12 @@ namespace UniGLTF
? MeshExporter_DividedVertexBuffer.Export(_data, unityMesh, Materials, m_settings.InverseAxis.Create(), m_settings)
: MeshExporter_SharedVertexBuffer.Export(_data, unityMesh, Materials, m_settings.InverseAxis.Create(), m_settings)
;
if (gltfMesh.primitives == null || gltfMesh.primitives.Count == 0)
{
Debug.LogError($"gltfMesh.primitives is empty: {unityMesh.Mesh.name}");
}
_gltf.meshes.Add(gltfMesh);
Meshes.Add(unityMesh.Mesh);
if (!MeshBlendShapeIndexMap.ContainsKey(unityMesh.Mesh))

View File

@ -57,7 +57,7 @@ namespace VRM
return;
}
m_service.BufferCombiner.Unregister(m_buffer);
m_service.BufferCombiner.Register(add: null, remove: m_buffer);
m_buffer.Dispose();
m_buffer = null;
}
@ -67,7 +67,7 @@ namespace VRM
Debug.Assert(m_buffer == null);
var buffer = await SpringBoneJobs.FastSpringBoneReplacer.MakeBufferAsync(m_vrm, awaitCaller);
m_buffer = buffer;
SpringBoneJobs.FastSpringBoneService.Instance.BufferCombiner.Register(buffer);
SpringBoneJobs.FastSpringBoneService.Instance.BufferCombiner.Register(add: buffer, remove: null);
}

View File

@ -55,7 +55,7 @@ namespace UniVRM10
{
if (m_fastSpringBoneBuffer != null)
{
m_fastSpringBoneService.BufferCombiner.Unregister(m_fastSpringBoneBuffer);
m_fastSpringBoneService.BufferCombiner.Register(add: null, remove: m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer.Dispose();
}
}
@ -87,16 +87,10 @@ namespace UniVRM10
}
m_building = true;
// 登録削除
if (m_fastSpringBoneBuffer != null)
{
m_fastSpringBoneService.BufferCombiner.Unregister(m_fastSpringBoneBuffer);
}
var fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer);
// 登録
m_fastSpringBoneService.BufferCombiner.Register(m_fastSpringBoneBuffer);
m_fastSpringBoneService.BufferCombiner.Register(add: fastSpringBoneBuffer, remove: m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer = fastSpringBoneBuffer;
m_building = false;
return true;

View File

@ -54,7 +54,7 @@ namespace UniVRM10
public void Dispose()
{
m_bufferCombiner.Unregister(m_fastSpringBoneBuffer);
m_bufferCombiner.Register(add: null, remove: m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer.Dispose();
m_fastSpringBoneScheduler.Dispose();
@ -88,16 +88,9 @@ namespace UniVRM10
}
m_building = true;
// 登録削除
if (m_fastSpringBoneBuffer != null)
{
m_bufferCombiner.Unregister(m_fastSpringBoneBuffer);
}
m_fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer);
// 登録
m_bufferCombiner.Register(m_fastSpringBoneBuffer);
var fastSpringBoneBuffer = await FastSpringBoneBufferFactory.ConstructSpringBoneAsync(awaitCaller, m_instance, m_fastSpringBoneBuffer);
m_bufferCombiner.Register(add: fastSpringBoneBuffer, remove: m_fastSpringBoneBuffer);
m_fastSpringBoneBuffer = fastSpringBoneBuffer;
m_building = false;
return true;