Mercurial > hg > Game > Games
diff Orchestland/Assets/OVR/Scripts/OVRPluginEvent.cs @ 1:f7675884f2a1
Add Orchestland project
author | Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2015 23:09:20 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Orchestland/Assets/OVR/Scripts/OVRPluginEvent.cs Fri Jul 17 23:09:20 2015 +0900 @@ -0,0 +1,122 @@ +/************************************************************************************ + +Copyright : Copyright 2014 Oculus VR, LLC. All Rights reserved. + +Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License"); +you may not use the Oculus VR Rift SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +http://www.oculusvr.com/licenses/LICENSE-3.2 + +Unless required by applicable law or agreed to in writing, the Oculus VR SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +using UnityEngine; +using System; + +/// <summary> +/// Matches the events in the native plugin. +/// </summary> +public enum RenderEventType +{ + // PC + BeginFrame = 0, + EndFrame = 1, + Initialize = 2, + Destroy = 3, + + // Android + InitRenderThread = 0, + Pause = 1, + Resume = 2, + LeftEyeEndFrame = 3, + RightEyeEndFrame = 4, + TimeWarp = 5, + PlatformUI = 6, + PlatformUIConfirmQuit = 7, +} + +/// <summary> +/// Communicates with native plugin functions that run on the rendering thread. +/// </summary> +public static class OVRPluginEvent +{ + /// <summary> + /// Immediately issues the given event. + /// </summary> + public static void Issue(RenderEventType eventType) + { + GL.IssuePluginEvent(EncodeType((int)eventType)); + } + + /// <summary> + /// Create a data channel through the single 32-bit integer we are given to + /// communicate with the plugin. + /// Split the 32-bit integer event data into two separate "send-two-bytes" + /// plugin events. Then issue the explicit event that makes use of the data. + /// </summary> + public static void IssueWithData(RenderEventType eventType, int eventData) + { + // Encode and send-two-bytes of data + GL.IssuePluginEvent(EncodeData((int)eventType, eventData, 0)); + + // Encode and send remaining two-bytes of data + GL.IssuePluginEvent(EncodeData((int)eventType, eventData, 1)); + + // Explicit event that uses the data + GL.IssuePluginEvent(EncodeType((int)eventType)); + } + + // PRIVATE MEMBERS + //------------------------------ + // Pack event data into a Uint32: + // - isDataFlag + // - bytePos + // - eventId data is associated with + // - 2-bytes of event data + // + // 31 30 29...25 24...16 15...0 + // [data][pos][eventid][unused][payload] + //------------------------------ + private const UInt32 IS_DATA_FLAG = 0x80000000; + private const UInt32 DATA_POS_MASK = 0x40000000; + private const int DATA_POS_SHIFT = 30; + private const UInt32 EVENT_TYPE_MASK = 0x3E000000; + private const int EVENT_TYPE_SHIFT = 25; + private const UInt32 PAYLOAD_MASK = 0x0000FFFF; + private const int PAYLOAD_SHIFT = 16; + + private static int EncodeType(int eventType) + { + return (int)((UInt32)eventType & ~IS_DATA_FLAG); // make sure upper bit is not set + } + + private static int EncodeData(int eventId, int eventData, int pos) + { + UInt32 data = 0; + data |= IS_DATA_FLAG; + data |= (((UInt32)pos << DATA_POS_SHIFT) & DATA_POS_MASK); + data |= (((UInt32)eventId << EVENT_TYPE_SHIFT) & EVENT_TYPE_MASK); + data |= (((UInt32)eventData >> (pos * PAYLOAD_SHIFT)) & PAYLOAD_MASK); + + return (int)data; + } + + private static int DecodeData(int eventData) + { +// bool hasData = (((UInt32)eventData & IS_DATA_FLAG) != 0); + UInt32 pos = (((UInt32)eventData & DATA_POS_MASK) >> DATA_POS_SHIFT); +// UInt32 eventId = (((UInt32)eventData & EVENT_TYPE_MASK) >> EVENT_TYPE_SHIFT); + UInt32 payload = (((UInt32)eventData & PAYLOAD_MASK) << (PAYLOAD_SHIFT * (int)pos)); + + return (int)payload; + } +}