diff --git a/.gitignore b/.gitignore
index 442485f4..f3303d7b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,11 @@
-[Ll]ibrary/
+[Ll]ibrary/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
+[Uu]ser[Ss]ettings/
Logs/
+OpenVRInitError.txt
Assets/AssetStoreTools*
Assets/ExternalPlugins/RootMotion*
Assets/ExternalPlugins/SteamVR*
@@ -35,17 +37,17 @@ Assets/ExternalPlugins/UnityMemoryMappedFile/UnityMemoryMappedFile*
Assets/VRoidSDK*
Assets/Scenes/Example*
Assets/Scenes/LoginExample*
-ControlWindowWPF/ControlWindowWPF/VRoidHubWindow*
-UnityMemoryMappedFile/PipeCommands_VRoidSDK*
-Assets/Scripts/VRoidSDKConnector*
-Assets/Tobii*
-Assets/ExternalPlugins/ViveSR*
-tobii*
+#プラグインが使う外部SDK(再配布不可のためリポジトリには含めない。置き場所の説明だけ残す)
+PluginProjects/*/SDK/*
+!PluginProjects/*/SDK/README.md
+#Tobii SDK同梱のネイティブDLL(リポジトリ直下のみ。プラグインの自前コードは対象外)
+/tobii_gameintegration_*.dll
SteamVR*csproj
Backup*
Assets/ExternalPlugins/uOSC*
Assets/ExternalPlugins/MidiJack*
Assets/ExternalPlugins/EasyDeviceDiscoveryProtocol*
+FastSpringBone*csproj
DepthFirstScheduler*csproj
MeshUtility*csproj
MToon*csproj
@@ -59,10 +61,14 @@ VRM*csproj
VMCMOD*csproj
Oculus*csproj
DVRSDK*csproj
+VRoidSDK*csproj
+VMC.VRoidHubSetup*csproj
Assets/Resources*
Assets/Scripts/DMMVRConnectConnector*
ControlWindowWPF/ControlWindowWPF/DMMVRConnectWindow*
UnityMemoryMappedFile/PipeCommands_DMMVRConnect*
+#mocopi Receiver SDKに対してUnityが生成するcsproj(リポジトリ直下のみ)
+/com.sony.mocopi.receiver.csproj
# Visual Studio cache directory
@@ -93,4 +99,21 @@ sysinfo.txt
*.unitypackage
common.json
Assets/_TerrainAutoUpgrade/
-.vsconfig
\ No newline at end of file
+.vsconfig
+/TrackerPositions.json
+
+#自動テスト用データ(テスト用VRM・ゴールデン・実行結果)
+TestData/
+
+#コード署名ツール(証明書・KMS設定・署名済みバイナリのキャッシュを含むためpushしない)
+codesignkit/
+
+#プラグインのビルド成果物(SDKのネイティブDLLを含むため配布物には入れるがpushしない)
+BuildRootFiles/ControlPanel/Plugins/
+PluginProjects/**/bin/
+PluginProjects/**/obj/
+ControlWindowWPF/VMC.ControlPanel.PluginAPI/bin/
+ControlWindowWPF/VMC.ControlPanel.PluginAPI/obj/
+
+#エディタ実行用にプラグインをコピーする場所(ビルド成果物・SDKのネイティブDLLを含む)
+/Plugins/
diff --git a/Assets/ExternalPlugins/DVRSDK/DVRAvatar/Scripts/VRMLoader.cs b/Assets/ExternalPlugins/DVRSDK/DVRAvatar/Scripts/VRMLoader.cs
deleted file mode 100644
index ccb8ccb1..00000000
--- a/Assets/ExternalPlugins/DVRSDK/DVRAvatar/Scripts/VRMLoader.cs
+++ /dev/null
@@ -1,334 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.IO;
-using System.Threading.Tasks;
-#if UNIVRM_0_68_IMPORTER || UNIVRM_0_77_IMPORTER
-using UniGLTF;
-#endif
-using UnityEngine;
-using VRM;
-
-namespace DVRSDK.Avatar
-{
- public class VRMLoader : IDisposable
- {
-#if UNIVRM_LEGACY_IMPORTER || UNIVRM_0_68_IMPORTER
- private VRMImporterContext currentContext;
- public GameObject Model => currentContext == null ? null : currentContext.Root;
-#elif UNIVRM_0_77_IMPORTER
- private VRMImporterContext currentContext;
- private RuntimeGltfInstance currentInstance;
- public GameObject Model => currentInstance == null ? null : currentInstance.Root;
-#else
- private IDisposable currentContext = null;
- public GameObject Model = null;
-#endif
-
-
- ///
- /// 読み込んだモデルを実際に表示する
- ///
- public void ShowMeshes()
- {
-#if UNIVRM_LEGACY_IMPORTER || UNIVRM_0_68_IMPORTER || UNIVRM_0_77_IMPORTER
- if (Model == null)
- throw new InvalidOperationException("Need to load VRM model first.");
-#endif
-
-#if UNIVRM_LEGACY_IMPORTER || UNIVRM_0_68_IMPORTER
- currentContext.ShowMeshes();
-#elif UNIVRM_0_77_IMPORTER
- currentInstance.ShowMeshes();
-#else
-#endif
-
-#if UNIVRM_0_68_IMPORTER
- currentContext.DisposeOnGameObjectDestroyed();
-#endif
- }
-
- ///
- /// 同期でファイルからVRMモデルを読み込む
- ///
- /// ファイルのパス
- /// VRMモデルのGameObject
- public GameObject LoadVrmModelFromFile(string vrmFilePath)
- {
- // ファイルをByte配列に読み込みます
- var bytes = File.ReadAllBytes(vrmFilePath);
-
- return LoadVrmModelFromByteArray(bytes);
- }
-
- ///
- /// 同期でファイルからVRMMetaObjectを読み込む
- ///
- ///
- ///
- ///
- public VRMMetaObject LoadVrmMetaFromFile(string vrmFilePath, bool createThumbnail)
- {
- // ファイルをByte配列に読み込みます
- var bytes = File.ReadAllBytes(vrmFilePath);
-
- return LoadVrmMetaFromByteArray(bytes, createThumbnail);
- }
-
- ///
- /// 非同期でファイルからVRMモデルを読み込む
- ///
- /// ファイルのパス
- /// VRMモデルのGameObject
- public async Task LoadVrmModelFromFileAsync(string vrmFilePath)
- {
- // ファイルをByte配列に読み込みます
- var bytes = await ReadAllBytesAsync(vrmFilePath);
-
- return await LoadVrmModelFromByteArrayAsync(bytes);
- }
-
- ///
- /// 非同期でファイルからVRMMetaObjectを読み込む
- ///
- ///
- ///
- ///
- public async Task LoadVrmMetaFromFileAsync(string vrmFilePath, bool createThumbnail)
- {
- // ファイルをByte配列に読み込みます
- var bytes = await ReadAllBytesAsync(vrmFilePath);
-
- return await LoadVrmMetaFromByteArrayAsync(bytes, createThumbnail);
- }
-
- ///
- /// 同期でByte配列からVRMモデルを読み込む
- ///
- ///
- ///
- public GameObject LoadVrmModelFromByteArray(byte[] vrmByteArray)
- {
-#if UNIVRM_LEGACY_IMPORTER
- InitializeVrmContextFromByteArray(vrmByteArray);
-
- // 同期処理で読み込みます
- currentContext.Load();
-
- // 読込が完了するとcontext.RootにモデルのGameObjectが入っています
- var root = currentContext.Root;
-
- return root;
-#elif UNIVRM_0_68_IMPORTER
- var parser = new GltfParser();
- parser.ParseGlb(vrmByteArray);
-
- currentContext = new VRMImporterContext(parser);
- currentContext.Load();
-
- return currentContext.Root;
-#elif UNIVRM_0_77_IMPORTER
- var parser = new GlbLowLevelParser(string.Empty, vrmByteArray);
- var data = parser.Parse();
-
- currentContext = new VRMImporterContext(data);
- currentInstance = currentContext.Load();
-
- return currentInstance.Root;
-#else
- return null;
-#endif
- }
-
- ///
- /// 同期でByte配列からVRMMetaObjectを読み込む
- ///
- ///
- ///
- ///
- public VRMMetaObject LoadVrmMetaFromByteArray(byte[] vrmByteArray, bool createThumbnail)
- {
- InitializeVrmContextFromByteArray(vrmByteArray);
-
- return GetMeta(createThumbnail);
- }
-
- ///
- /// ConnectからロードしたモデルデータをVRM化する
- ///
- ///
- ///
- public object LoadVRMModelFromConnect(byte[] cachedData)
- {
- return LoadVrmModelFromByteArray(cachedData);
- }
-
- ///
- /// 非同期でByte配列からVRMモデルを読み込む
- ///
- ///
- ///
- public async Task LoadVrmModelFromByteArrayAsync(byte[] vrmByteArray)
- {
-#if UNIVRM_LEGACY_IMPORTER
- await InitializeVrmContextFromByteArrayAsync(vrmByteArray);
-
- // 非同期処理(Task)で読み込みます
- await currentContext.LoadAsyncTask();
-
- // 読込が完了するとcontext.RootにモデルのGameObjectが入っています
- var root = currentContext.Root;
-
- return root;
-#elif UNIVRM_0_68_IMPORTER
- var parser = new GltfParser();
- await Task.Run(() =>
- {
- parser.ParseGlb(vrmByteArray);
- });
-
- currentContext = new VRMImporterContext(parser);
- await currentContext.LoadAsync();
-
- return currentContext.Root;
-#elif UNIVRM_0_77_IMPORTER
- var parser = new GlbLowLevelParser(string.Empty, vrmByteArray);
- GltfData data = null;
-
- await Task.Run(() =>
- {
- data = parser.Parse();
- });
-
- currentContext = new VRMImporterContext(data);
- currentInstance = await currentContext.LoadAsync();
-
- return currentInstance.Root;
-#else
- return null;
-#endif
- }
-
- ///
- /// 非同期でByte配列からVRMMetaObjectを読み込む
- ///
- ///
- ///
- ///
- public async Task LoadVrmMetaFromByteArrayAsync(byte[] vrmByteArray, bool createThumbnail)
- {
- await InitializeVrmContextFromByteArrayAsync(vrmByteArray);
-
- return GetMeta(createThumbnail);
- }
-
- ///
- /// ConnectからロードしたモデルデータをVRM化する
- ///
- ///
- ///
- public async Task