Vive Stereo Rendering Toolkit(MirrorExample)をUnity2019+SteamVR Plugin2.3.2で動かすまで

#最初に
VRChat等で見かけるリアルな鏡が含まれているアセットですが、最新の環境で動かすのにひと手間必要だったのでメモしておきます。Vive Stereo Rendering Toolkitのアップデートは2018年1月から行われておらず、Unity 2019で使用する為には数か所変更が必要になります。その為か分かりませんが、エディタからの再生テストにおいて稀にエラーを吐きます。現時点では、ビルド環境において実行中のエラーは確認しておりません。
#開発環境
Oculus Rift CV1
Unity 2019.1.9f1 Personal
#使用アセット
Vive Stereo Rendering Toolkit
https://assetstore.unity.com/packages/tools/particles-effects/vive-stereo-rendering-toolkit-71255
SteamVR Plugin
https://assetstore.unity.com/packages/tools/integration/steamvr-plugin-32647
#手順
空のプロジェクトを作成、上記アセットを導入。
1. `StereoRendering`>`Examples`>`2.Mirror`>`MirrorExample`を開く。
2. 以下、二つのスクリプトに対して、一部をコメントアウト・追記する。

```csharp:DeviceType.cs
//43~68行を以下の通りにコメントアウト

        public static IDeviceParamFactory InitParamFactory(HmdType hmdType)
        {
// #if (VIVE_STEREO_STEAMVR)
//             if (hmdType == HmdType.SteamVR)
//             {
                return new SteamVRParamFactory();
//             }
// #endif

// #if (VIVE_STEREO_OVR)
//             if (hmdType == HmdType.OVR)
//             {
//                 return new OVRParamFactory();
//             }
// #endif

// #if (UNITY_ANDROID && VIVE_STEREO_WAVEVR)
//             if (hmdType == HmdType.WaveVR)
//             {
//                 return new WaveVRParamFactory();
//             }
// #endif

//             Debug.LogError("Cannot get suitable projection parameter for current HMD.");
//             return null;
        }
```

```csharp:SteamVRParamFactory.cs
//2行目 追記 using Valve.VR;
//ディレクティブをコメントアウト

//========= Copyright 2016-2017, HTC Corporation. All rights reserved. ===========
using UnityEngine;
using Valve.VR;

namespace HTC.UnityPlugin.StereoRendering
{
// #if (VIVE_STEREO_STEAMVR)
    public class SteamVRParamFactory : IDeviceParamFactory
    {
        public int GetRenderWidth()
        {
            return (int)SteamVR.instance.sceneWidth;
        }

        public int GetRenderHeight()
        {
            return (int)SteamVR.instance.sceneHeight;
        }

        public Vector3 GetEyeSeperation(int eye)
        {
            var eyePos = SteamVR.instance.eyes[eye].pos;
            eyePos.z = 0.0f;
            return eyePos;
        }

        public Quaternion GetEyeLocalRotation(int eye)
        {
            return SteamVR.instance.eyes[eye].rot;
        }

        public Matrix4x4 GetProjectionMatrix(int eye, float nearPlane, float farPlane)
        {
            return HMDMatrix4x4ToMatrix4x4(SteamVR.instance.hmd.GetProjectionMatrix((Valve.VR.EVREye)eye, nearPlane, farPlane));
        }

        // transform a SteamVR matrix format to Unity matrix format
        private Matrix4x4 HMDMatrix4x4ToMatrix4x4(Valve.VR.HmdMatrix44_t hmdMatrix)
        {
            Matrix4x4 m = Matrix4x4.identity;

            m[0, 0] = hmdMatrix.m0;
            m[0, 1] = hmdMatrix.m1;
            m[0, 2] = hmdMatrix.m2;
            m[0, 3] = hmdMatrix.m3;

            m[1, 0] = hmdMatrix.m4;
            m[1, 1] = hmdMatrix.m5;
            m[1, 2] = hmdMatrix.m6;
            m[1, 3] = hmdMatrix.m7;

            m[2, 0] = hmdMatrix.m8;
            m[2, 1] = hmdMatrix.m9;
            m[2, 2] = hmdMatrix.m10;
            m[2, 3] = hmdMatrix.m11;

            m[3, 0] = hmdMatrix.m12;
            m[3, 1] = hmdMatrix.m13;
            m[3, 2] = hmdMatrix.m14;
            m[3, 3] = hmdMatrix.m15;

            return m;
        }
    }
// #endif
}
```
#動作確認
こんな感じに動きます。プロジェクトに組み込む場合は、サンプルのパラメータを参考にして設置しましょう。
![mirrorimage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20884/183f46ec-20e9-4b1b-e85e-046583835ce8.gif)


#参考リンク
Vive Stereo Rendering Toolkit
https://github.com/ViveSoftware/ViveStereoRenderingToolkit
Vive Stereo Rendering Prototypes -- License
https://github.com/ViveSoftware/ViveStereoRenderingToolkit/blob/master/license.md