コード整理

* glb/gltf ロード機能をオミット => GltfViewer を参照
* inner class SimpleViewer.Loaded を別ファイルに分離
* FileDialog を別フォルダに分離
This commit is contained in:
ousttrue 2022-10-03 16:41:21 +09:00
parent 85702ea5b0
commit 717ff82f1d
11 changed files with 656 additions and 200 deletions

View File

@ -134,6 +134,7 @@ GameObject:
- component: {fileID: 932029775}
- component: {fileID: 932029774}
- component: {fileID: 932029773}
- component: {fileID: 932029776}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
@ -206,6 +207,100 @@ Transform:
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &932029776
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 932029772}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e4bd97e0a95b5344a8369face780725d, type: 3}
m_Name:
m_EditorClassIdentifier:
RotateSpeed: 0.7
GrabSpeed: 0.7
DollySpeed: 1
--- !u!1 &1029435554
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1029435555}
- component: {fileID: 1029435557}
- component: {fileID: 1029435556}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1029435555
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1029435554}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 1900577221}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1029435556
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1029435554}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 14
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 10
m_MaxSize: 40
m_Alignment: 4
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Open
--- !u!222 &1029435557
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1029435554}
m_CullTransparentMesh: 1
--- !u!1 &1052394165
GameObject:
m_ObjectHideFlags: 0
@ -299,3 +394,315 @@ Transform:
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &1400164759
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1400164764}
- component: {fileID: 1400164763}
- component: {fileID: 1400164762}
- component: {fileID: 1400164761}
- component: {fileID: 1400164760}
m_Layer: 5
m_Name: GltfViewer
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1400164760
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1400164759}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f3d2f58b1e1adc24e9f8495bca2d9614, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &1400164761
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1400164759}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
m_Name:
m_EditorClassIdentifier:
m_IgnoreReversedGraphics: 1
m_BlockingObjects: 0
m_BlockingMask:
serializedVersion: 2
m_Bits: 4294967295
--- !u!114 &1400164762
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1400164759}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier:
m_UiScaleMode: 0
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 800, y: 600}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
m_DynamicPixelsPerUnit: 1
m_PresetInfoIsWorld: 0
--- !u!223 &1400164763
Canvas:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1400164759}
m_Enabled: 1
serializedVersion: 3
m_RenderMode: 0
m_Camera: {fileID: 0}
m_PlaneDistance: 100
m_PixelPerfect: 0
m_ReceivesEvents: 1
m_OverrideSorting: 0
m_OverridePixelPerfect: 0
m_SortingBucketNormalizedSize: 0
m_AdditionalShaderChannelsFlag: 0
m_SortingLayerID: 0
m_SortingOrder: 0
m_TargetDisplay: 0
--- !u!224 &1400164764
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1400164759}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0, y: 0, z: 0}
m_Children:
- {fileID: 1900577221}
m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0, y: 0}
--- !u!1 &1766091833
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1766091836}
- component: {fileID: 1766091835}
- component: {fileID: 1766091834}
m_Layer: 0
m_Name: EventSystem
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1766091834
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1766091833}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalAxis: Horizontal
m_VerticalAxis: Vertical
m_SubmitButton: Submit
m_CancelButton: Cancel
m_InputActionsPerSecond: 10
m_RepeatDelay: 0.5
m_ForceModuleActive: 0
--- !u!114 &1766091835
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1766091833}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
m_Name:
m_EditorClassIdentifier:
m_FirstSelected: {fileID: 0}
m_sendNavigationEvents: 1
m_DragThreshold: 10
--- !u!4 &1766091836
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1766091833}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1900577220
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1900577221}
- component: {fileID: 1900577224}
- component: {fileID: 1900577223}
- component: {fileID: 1900577222}
m_Layer: 5
m_Name: Open
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1900577221
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1900577220}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1029435555}
m_Father: {fileID: 1400164764}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -815.25, y: -335}
m_SizeDelta: {x: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1900577222
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1900577220}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 1900577223}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1400164760}
m_TargetAssemblyTypeName: UniGLTF.GltfViewer.GltfViewer, Assembly-CSharp
m_MethodName: OnOpenClicked
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &1900577223
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1900577220}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &1900577224
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1900577220}
m_CullTransparentMesh: 1

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5b0aac758a2a5ab42aab2ccf5cf5480a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -3,14 +3,13 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
#endif
namespace VRM.SimpleViewer
{
public static class FileDialogForWindows
{
#if UNITY_STANDALONE_WIN
#region GetOpenFileName
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class OpenFileName
@ -63,7 +62,7 @@ namespace VRM.SimpleViewer
var filters = new List<string>();
filters.Add("All Files"); filters.Add("*.*");
foreach(var ext in extensions)
foreach (var ext in extensions)
{
filters.Add(ext); filters.Add("*" + ext);
}
@ -113,6 +112,6 @@ namespace VRM.SimpleViewer
return ofn.file;
}
#endregion
#endif
}
}
#endif

View File

@ -1,8 +1,7 @@
fileFormatVersion: 2
guid: 649d78dc96acf5b4f83d54cd1859e940
timeCreated: 1524038001
licenseType: Free
guid: 8a56b2b48ad6a1a4897d1de96cac39db
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0

View File

@ -0,0 +1,25 @@
namespace VRM.SimpleViewer
{
public static class FileUtil
{
public static string OpenFileDialog(string title, params string[] extensions)
{
#if UNITY_STANDALONE_WIN
return FileDialogForWindows.FileDialog("open VRM", "vrm", "bvh");
#elif UNITY_WEBGL
// Open WebGLFileDialog
// see: Assets\VRM_Samples\SimpleViewer\Plugins\OpenFile.jslib
WebGLFileDialog();
// Control flow does not return here. return empty string with dummy
return "";
#elif UNITY_EDITOR
// EditorUtility.OpenFilePanel
// TODO: How to specify multiple extensions on OSX?
return UnityEditor.EditorUtility.OpenFilePanel("Open VRM", "", "vrm");
#else
// fall back constant path
return Application.dataPath + "/default.vrm";
#endif
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 952ae2eb9c0c59b4ba3ed6344bd867c4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,12 @@
#if UNITY_WEBGL
using System.Runtime.InteropServices;
namespace VRM.SimpleViewer
{
public static class WebGLUtil
{
[DllImport("__Internal")]
public static extern void WebGLFileDialog();
}
}
#endif

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b12500e13ead097488e89244d024ed2d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,118 @@
using System;
using UniGLTF;
using UniHumanoid;
using UnityEngine;
namespace VRM.SimpleViewer
{
class Loaded : IDisposable
{
RuntimeGltfInstance _instance;
VRMBlendShapeProxy m_proxy;
Blinker m_blink;
bool m_enableBlinkValue;
public bool EnableBlinkValue
{
set
{
if (m_blink == value) return;
m_enableBlinkValue = value;
if (m_blink != null)
{
m_blink.enabled = m_enableBlinkValue;
}
}
}
AIUEO m_lipSync;
bool m_enableLipSyncValue;
public bool EnableLipSyncValue
{
set
{
if (m_enableLipSyncValue == value) return;
m_enableLipSyncValue = value;
if (m_lipSync != null)
{
m_lipSync.enabled = m_enableLipSyncValue;
}
}
}
public Loaded(RuntimeGltfInstance instance, HumanPoseTransfer src, Transform lookAtTarget)
{
_instance = instance;
var lookAt = instance.GetComponent<VRMLookAtHead>();
if (lookAt != null)
{
// vrm
_pose = _instance.gameObject.AddComponent<HumanPoseTransfer>();
_pose.Source = src;
_pose.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
m_lipSync = instance.gameObject.AddComponent<AIUEO>();
m_blink = instance.gameObject.AddComponent<Blinker>();
lookAt.Target = lookAtTarget;
lookAt.UpdateType = UpdateType.LateUpdate; // after HumanPoseTransfer's setPose
m_proxy = instance.GetComponent<VRMBlendShapeProxy>();
}
// not vrm
var animation = instance.GetComponent<Animation>();
if (animation && animation.clip != null)
{
animation.Play(animation.clip.name);
}
}
public void Dispose()
{
// Destroy game object. not RuntimeGltfInstance
GameObject.Destroy(_instance.gameObject);
}
public void Update()
{
if (m_proxy != null)
{
m_proxy.Apply();
}
}
HumanPoseTransfer _pose;
public void EnableBvh(HumanPoseTransfer src)
{
if (_pose != null)
{
_pose.Source = src;
_pose.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
}
}
public void EnableTPose(HumanPoseClip pose)
{
if (_pose != null)
{
_pose.PoseClip = pose;
_pose.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseClip;
}
}
public void ResetSpring()
{
if (_pose != null)
{
foreach (var spring in _pose.GetComponentsInChildren<VRMSpringBone>())
{
spring.Setup();
}
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cd86f9044da608b4883f7bec5167a160
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -2,7 +2,6 @@
using System.Collections;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using UniGLTF;
using UniHumanoid;
@ -13,13 +12,11 @@ using VRMShaders;
namespace VRM.SimpleViewer
{
/// <summary>
/// UI event handling
/// </summary>
public class ViewerUI : MonoBehaviour
{
#if UNITY_WEBGL
[DllImport("__Internal")]
private static extern void WebGLFileDialog();
#endif
#region UI
[SerializeField]
Text m_version = default;
@ -196,118 +193,8 @@ namespace VRM.SimpleViewer
m_target = GameObject.FindObjectOfType<TargetMover>().gameObject;
}
class Loaded : IDisposable
{
RuntimeGltfInstance _instance;
HumanPoseTransfer _pose;
VRMBlendShapeProxy m_proxy;
Blinker m_blink;
bool m_enableBlinkValue;
public bool EnableBlinkValue
{
set
{
if (m_blink == value) return;
m_enableBlinkValue = value;
if (m_blink != null)
{
m_blink.enabled = m_enableBlinkValue;
}
}
}
AIUEO m_lipSync;
bool m_enableLipSyncValue;
public bool EnableLipSyncValue
{
set
{
if (m_enableLipSyncValue == value) return;
m_enableLipSyncValue = value;
if (m_lipSync != null)
{
m_lipSync.enabled = m_enableLipSyncValue;
}
}
}
public Loaded(RuntimeGltfInstance instance, HumanPoseTransfer src, Transform lookAtTarget)
{
_instance = instance;
var lookAt = instance.GetComponent<VRMLookAtHead>();
if (lookAt != null)
{
// vrm
_pose = _instance.gameObject.AddComponent<HumanPoseTransfer>();
_pose.Source = src;
_pose.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
m_lipSync = instance.gameObject.AddComponent<AIUEO>();
m_blink = instance.gameObject.AddComponent<Blinker>();
lookAt.Target = lookAtTarget;
lookAt.UpdateType = UpdateType.LateUpdate; // after HumanPoseTransfer's setPose
m_proxy = instance.GetComponent<VRMBlendShapeProxy>();
}
// not vrm
var animation = instance.GetComponent<Animation>();
if (animation && animation.clip != null)
{
animation.Play(animation.clip.name);
}
}
public void Dispose()
{
// Destroy game object. not RuntimeGltfInstance
GameObject.Destroy(_instance.gameObject);
}
public void EnableBvh(HumanPoseTransfer src)
{
if (_pose != null)
{
_pose.Source = src;
_pose.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseTransfer;
}
}
public void EnableTPose(HumanPoseClip pose)
{
if (_pose != null)
{
_pose.PoseClip = pose;
_pose.SourceType = HumanPoseTransfer.HumanPoseTransferSourceType.HumanPoseClip;
}
}
public void OnResetClicked()
{
if (_pose != null)
{
foreach (var spring in _pose.GetComponentsInChildren<VRMSpringBone>())
{
spring.Setup();
}
}
}
public void Update()
{
if (m_proxy != null)
{
m_proxy.Apply();
}
}
}
Loaded m_loaded;
private void Start()
{
m_version.text = string.Format("VRMViewer {0}.{1}",
@ -316,7 +203,7 @@ namespace VRM.SimpleViewer
m_useFastSpringBone.onValueChanged.AddListener(OnUseFastSpringBoneValueChanged);
OnUseFastSpringBoneValueChanged(m_useFastSpringBone.isOn);
m_reset.onClick.AddListener(() => m_loaded.OnResetClicked());
m_reset.onClick.AddListener(() => m_loaded?.ResetSpring());
// load initial bvh
if (m_motion != null)
@ -338,7 +225,9 @@ namespace VRM.SimpleViewer
var context = new UniHumanoid.BvhImporterContext();
context.Parse(path, source);
context.Load();
SetMotion(context.Root.GetComponent<HumanPoseTransfer>());
m_src = context.Root.GetComponent<HumanPoseTransfer>();
m_src.GetComponent<Renderer>().enabled = false;
m_loaded?.EnableBvh(m_src);
}
private void Update()
@ -348,7 +237,9 @@ namespace VRM.SimpleViewer
if (Root != null) Root.SetActive(!Root.activeSelf);
}
m_ui.UpdateToggle(() => m_loaded?.EnableBvh(m_src), () => m_loaded?.EnableTPose(m_pose));
m_ui.UpdateToggle(
() => m_loaded?.EnableBvh(m_src),
() => m_loaded?.EnableTPose(m_pose));
if (m_loaded != null)
{
@ -358,39 +249,30 @@ namespace VRM.SimpleViewer
}
}
IEnumerator LoadTexture(string url)
IEnumerator LoadCoroutine(string url)
{
var www = new WWW(url);
var www = new UnityEngine.Networking.UnityWebRequest(url);
yield return www;
LoadModelAsync("tmp.vrm", www.bytes);
var task = LoadBytesAsync("WebGL.vrm", www.downloadHandler.data);
}
/// <summary>
/// for WebGL
/// call from OpenFile.jslib
/// </summary>
public void FileSelected(string url)
{
Debug.Log($"FileSelected: {url}");
StartCoroutine(LoadTexture(url));
StartCoroutine(LoadCoroutine(url));
}
void OnOpenClicked()
{
#if UNITY_STANDALONE_WIN
var path = FileDialogForWindows.FileDialog("open VRM", "vrm", "glb", "bvh", "gltf", "zip");
#elif UNITY_WEBGL
{
WebGLFileDialog();
return;
}
var path = "";
#elif UNITY_EDITOR
var path = UnityEditor.EditorUtility.OpenFilePanel("Open VRM", "", "vrm");
#else
var path = Application.dataPath + "/default.vrm";
#endif
var path = FileUtil.OpenFileDialog("Open VRM", "vrm", "bvh");
if (string.IsNullOrEmpty(path))
{
return;
}
LoadPathAsync(path);
}
@ -401,41 +283,44 @@ namespace VRM.SimpleViewer
Debug.LogWarning($"{path} not exists");
return;
}
LoadModelAsync(path, File.ReadAllBytes(path));
var bytes = File.ReadAllBytes(path);
await LoadBytesAsync(path, bytes);
}
async void LoadModelAsync(string path, byte[] bytes)
public async Task LoadBytesAsync(string path, byte[] bytes)
{
var size = bytes != null ? bytes.Length : 0;
Debug.Log($"LoadModelAsync: {path}: {size}bytes");
var ext = Path.GetExtension(path).ToLower();
switch (ext)
if (ext == ".bvh")
{
case ".gltf":
case ".glb":
case ".zip":
{
var instance = await GltfUtility.LoadAsync(path,
GetIAwaitCaller(m_useAsync.isOn),
GetGltfMaterialGenerator(m_useUrpMaterial.isOn));
SetModel(instance);
break;
}
case ".vrm":
{
VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
var instance = await VrmUtility.LoadBytesAsync(path, bytes, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback, loadAnimation: m_loadAnimation.isOn);
SetModel(instance);
break;
}
case ".bvh":
LoadMotion(path, File.ReadAllText(path));
break;
// bvh motion
LoadMotion(path, File.ReadAllText(path));
return;
}
// cleanup
if (m_loaded != null)
{
m_loaded.Dispose();
m_loaded = null;
}
// vrm
VrmUtility.MaterialGeneratorCallback materialCallback = (VRM.glTF_VRM_extensions vrm) => GetVrmMaterialGenerator(m_useUrpMaterial.isOn, vrm);
VrmUtility.MetaCallback metaCallback = m_texts.UpdateMeta;
var instance = await VrmUtility.LoadBytesAsync(path, bytes, GetIAwaitCaller(m_useAsync.isOn), materialCallback, metaCallback, loadAnimation: m_loadAnimation.isOn);
if (m_useFastSpringBone.isOn)
{
var _ = FastSpringBoneReplacer.ReplaceAsync(instance.Root);
}
instance.EnableUpdateWhenOffscreen();
instance.ShowMeshes();
m_loaded = new Loaded(instance, m_src, m_target.transform);
}
void OnUseFastSpringBoneValueChanged(bool flag)
@ -482,35 +367,5 @@ namespace VRM.SimpleViewer
return new ImmediateCaller();
}
}
void SetModel(RuntimeGltfInstance instance)
{
// cleanup
if (m_loaded != null)
{
m_loaded.Dispose();
m_loaded = null;
}
if (m_useFastSpringBone.isOn)
{
var _ = FastSpringBoneReplacer.ReplaceAsync(instance.Root);
}
instance.EnableUpdateWhenOffscreen();
instance.ShowMeshes();
m_loaded = new Loaded(instance, m_src, m_target.transform);
}
void SetMotion(HumanPoseTransfer src)
{
m_src = src;
src.GetComponent<Renderer>().enabled = false;
if (m_loaded != null)
{
m_loaded.EnableBvh(src);
}
}
}
}