mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-04-25 07:28:51 -05:00
Merge branch 'master' into fix/vrm10viewer_uikit
This commit is contained in:
commit
26d41e7b53
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.");
|
||||
|
|
|
|||
|
|
@ -78,6 +78,10 @@ namespace UniGLTF
|
|||
{
|
||||
return false;
|
||||
}
|
||||
if (Mesh.triangles.Length == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (Materials == null)
|
||||
{
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user