From a6945d79f9a671f104d4ed8dc29818466ac2dd78 Mon Sep 17 00:00:00 2001 From: Masataka SUMI Date: Wed, 9 Feb 2022 20:10:15 +0900 Subject: [PATCH] Add a minimum cancellation handling to VRM1.0 HLAPI. --- Assets/VRM10/Runtime/IO/Vrm10.cs | 88 +++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 31 deletions(-) diff --git a/Assets/VRM10/Runtime/IO/Vrm10.cs b/Assets/VRM10/Runtime/IO/Vrm10.cs index 3a2f3e452..d92abced5 100644 --- a/Assets/VRM10/Runtime/IO/Vrm10.cs +++ b/Assets/VRM10/Runtime/IO/Vrm10.cs @@ -98,48 +98,74 @@ namespace UniVRM10 VrmMetaInformationCallback vrmMetaInformationCallback, CancellationToken ct) { - using (var data = new GlbLowLevelParser(name, bytes).Parse()) + Vrm10Instance result = default; + try { - // 1. Try loading as vrm-1.0 - var vrm10Data = Vrm10Data.Parse(data); - var vrm10Instance = await LoadVrm10DataAsync( - vrm10Data, - null, - normalizeTransform, - showMeshes, - awaitCaller, - materialGenerator, - vrmMetaInformationCallback, - ct); - if (vrm10Instance != null) return vrm10Instance; - - if (!canLoadVrm0X) + using (var gltfData = new GlbLowLevelParser(name, bytes).Parse()) { - return default; - } - - // 2. Try migration from vrm-0.x into vrm-1.0 - MigrationData migrationData; - using (var migrated = Vrm10Data.Migrate(data, out vrm10Data, out migrationData)) - { - var instance = await LoadVrm10DataAsync( + // 1. Try loading as vrm-1.0 + var vrm10Data = Vrm10Data.Parse(gltfData); + var vrm10Instance = await LoadVrm10DataAsync( vrm10Data, - migrationData, + null, normalizeTransform, showMeshes, awaitCaller, materialGenerator, vrmMetaInformationCallback, ct); - if (instance != null) return instance; - } + if (vrm10Instance != null) + { + result = vrm10Instance; + return result; + } - // 3. failed - if (migrationData != null) - { - Debug.LogWarning(migrationData.Message); + if (!canLoadVrm0X) + { + return default; + } + + // 2. Try migration from vrm-0.x into vrm-1.0 + MigrationData migrationData; + using (var migratedGltfData = Vrm10Data.Migrate(gltfData, out var migratedVrm10Data, out migrationData)) + { + var migratedVrm10Instance = await LoadVrm10DataAsync( + migratedVrm10Data, + migrationData, + normalizeTransform, + showMeshes, + awaitCaller, + materialGenerator, + vrmMetaInformationCallback, + ct); + if (migratedVrm10Instance != null) + { + result = migratedVrm10Instance; + return result; + } + } + + // 3. failed + if (migrationData != null) + { + Debug.LogWarning(migrationData.Message); + } + return default; + } + } + finally + { + if (ct.IsCancellationRequested && result != null) + { + if (Application.isPlaying) + { + UnityEngine.Object.Destroy(result.gameObject); + } + else + { + UnityEngine.Object.DestroyImmediate(result.gameObject); + } } - return default; } }