private static ICtrlState <TRole> GetState <TRole>(TRole role)
        {
            Initialize();
            var info = ViveRoleEnum.GetInfo <TRole>();

            if (!info.IsValidRole(role))
            {
                return(RGCtrolState <TRole> .s_defaultState);
            }

            if (RGCtrolState <TRole> .s_roleStates == null)
            {
                RGCtrolState <TRole> .s_roleStates = new RGCtrolState <TRole> [info.ValidRoleLength];
            }

            var roleOffset = info.ToRoleOffsetFromRole(role);

            if (RGCtrolState <TRole> .s_roleStates[roleOffset] == null)
            {
                RGCtrolState <TRole> .s_roleStates[roleOffset] = new RGCtrolState <TRole>(role);
                s_roleStateTable[typeof(TRole)][roleOffset]    = RGCtrolState <TRole> .s_roleStates[roleOffset];
            }

            return(RGCtrolState <TRole> .s_roleStates[roleOffset]);
        }
示例#2
0
        public static ViveRoleProperty New(string typeFullName, string valueName)
        {
            var prop = new ViveRoleProperty();

            prop.m_roleTypeFullName = typeFullName;
            prop.m_roleValueName    = valueName;

            Type roleType;

            if (ViveRoleEnum.ValidViveRoleTable.TryGetValue(typeFullName, out roleType))
            {
                var roleInfo  = ViveRoleEnum.GetInfo(roleType);
                var roleIndex = roleInfo.GetElementIndexByName(valueName);
                if (roleIndex >= 0)
                {
                    prop.m_roleValueInt = roleInfo.GetRoleValueByElementIndex(roleIndex);
                }
                else
                {
                    prop.m_roleValueInt = roleInfo.InvalidRoleValue;
                }
            }

            return(prop);
        }
            public RGCtrolState(TRole role)
            {
                var info = ViveRoleEnum.GetInfo <TRole>();

                m_state = GetState(typeof(TRole), info.ToRoleValue(role));
                m_role  = role;
            }
        private static ICtrlState GetState(Type roleType, int roleValue)
        {
            Initialize();
            var info = ViveRoleEnum.GetInfo(roleType);

            if (!info.IsValidRoleValue(roleValue))
            {
                return(s_defaultState);
            }

            ICtrlState[] stateList;
            if (!s_roleStateTable.TryGetValue(roleType, out stateList) || stateList == null)
            {
                s_roleStateTable[roleType] = stateList = new ICtrlState[info.ValidRoleLength];
            }

            var roleOffset = info.ToRoleOffset(roleValue);

            if (stateList[roleOffset] == null)
            {
                stateList[roleOffset] = new RCtrlState(roleType, roleValue);
            }

            return(stateList[roleOffset]);
        }
示例#5
0
        public bool IsRole <TRole>(TRole role)
        {
            Update();

            if (m_roleType != typeof(TRole))
            {
                return(false);
            }
            var roleInfo = ViveRoleEnum.GetInfo <TRole>();

            return(m_roleValue == roleInfo.ToRoleValue(role));
        }
            public GenericMap()
            {
                m_info = ViveRoleEnum.GetInfo <TRole>();
                m_map  = GetInternalMap(typeof(TRole));

                if (s_instance == null)
                {
                    s_instance = this;
                }
                else
                {
                    UnityEngine.Debug.LogWarning("duplicated instance for RoleInfo<" + typeof(TRole).Name + ">");
                }
            }
示例#7
0
        public TRole ToRole <TRole>()
        {
            Update();

            TRole role;
            var   roleInfo = ViveRoleEnum.GetInfo <TRole>();

            if (m_roleType != typeof(TRole) || !roleInfo.TryGetRoleByName(m_roleValueName, out role))
            {
                // return invalid if role type not match or the value name not found in roleInfo
                return(roleInfo.InvalidRole);
            }

            return(role);
        }
示例#8
0
            public GenericMap()
            {
                m_info = ViveRoleEnum.GetInfo <TRole>();
                m_map  = GetInternalMap(typeof(TRole));

                if (s_instance == null)
                {
                    s_instance = this;
                }
                else
                {
                    Debug.LogWarning("duplicated instance for RoleInfo<" + typeof(TRole).Name + ">");
                }

                m_map.onRoleValueMappingChanged += OnMappingChanged;
            }
示例#9
0
        private static GenericMap <TRole> GetInternalMap <TRole>()
        {
            var roleEnumType = typeof(TRole);

            if (GenericMap <TRole> .s_instance == null)
            {
                var validateResult = ViveRoleEnum.ValidateViveRoleEnum(roleEnumType);
                if (validateResult != ViveRoleEnumValidateResult.Valid)
                {
                    Debug.LogWarning(roleEnumType.Name + " is not valid ViveRole type. " + validateResult);
                    return(null);
                }

                new GenericMap <TRole>();
            }

            return(GenericMap <TRole> .s_instance);
        }
示例#10
0
            public Map(Type roleType)
            {
                m_info = ViveRoleEnum.GetInfo(roleType);

                m_role2index = new uint[m_info.ValidRoleLength];
                m_index2role = new int[VRModule.MAX_DEVICE_COUNT];

                m_roleBoundDevices = new IndexedSet <uint> [m_info.ValidRoleLength];
                m_sn2role          = new IndexedTable <string, int>(Mathf.Min(m_info.ValidRoleLength, (int)VRModule.MAX_DEVICE_COUNT));

                for (int i = 0; i < m_role2index.Length; ++i)
                {
                    m_role2index[i] = VRModule.INVALID_DEVICE_INDEX;
                }

                for (int i = 0; i < m_index2role.Length; ++i)
                {
                    m_index2role[i] = m_info.InvalidRoleValue;
                }
            }
示例#11
0
        // update type and value if type string or value string is/are dirty
        private void Update()
        {
            if (!m_isTypeDirty && !m_isValueDirty)
            {
                return;
            }

            var changed = false;

            if (m_isTypeDirty)
            {
                m_isTypeDirty = false;

                Type newType;
                if (string.IsNullOrEmpty(m_roleTypeFullName) || !ViveRoleEnum.ValidViveRoleTable.TryGetValue(m_roleTypeFullName, out newType))
                {
                    newType = DefaultRoleType;
                }

                changed = ChangeProp.Set(ref m_roleType, newType);
            }

            if (m_isValueDirty || changed)
            {
                m_isValueDirty = false;

                int newValue;
                var info = ViveRoleEnum.GetInfo(m_roleType);
                if (string.IsNullOrEmpty(m_roleValueName) || !info.TryGetRoleValueByName(m_roleValueName, out newValue))
                {
                    newValue = info.InvalidRoleValue;
                }

                changed |= ChangeProp.Set(ref m_roleValue, newValue);
            }

            if (changed && Changed != null)
            {
                Changed.Invoke();
            }
        }
            public Map(Type roleType)
            {
                m_info = ViveRoleEnum.GetInfo(roleType);

                m_role2index = new uint[m_info.ValidRoleLength];
                m_index2role = new int[MAX_DEVICE_COUNT];

                m_role2sn = new string[m_info.ValidRoleLength];
                m_sn2role = new Dictionary <string, int>(Mathf.Min(m_info.ValidRoleLength, (int)MAX_DEVICE_COUNT));

                for (int i = 0; i < m_role2index.Length; ++i)
                {
                    m_role2index[i] = INVALID_DEVICE_INDEX;
                    m_role2sn[i]    = string.Empty;
                }

                for (int i = 0; i < m_index2role.Length; ++i)
                {
                    m_index2role[i] = m_info.InvalidRoleValue;
                }
            }
示例#13
0
        private static Map GetInternalMap(Type roleType)
        {
            if (s_mapTable == null)
            {
                s_mapTable = new IndexedTable <Type, Map>();
            }

            Map map;

            if (!s_mapTable.TryGetValue(roleType, out map))
            {
                var validateResult = ViveRoleEnum.ValidateViveRoleEnum(roleType);
                if (validateResult != ViveRoleEnumValidateResult.Valid)
                {
                    Debug.LogWarning(roleType.Name + " is not valid ViveRole type. " + validateResult);
                    return(null);
                }

                map = new Map(roleType);
                s_mapTable.Add(roleType, map);
            }

            return(map);
        }
示例#14
0
        public override string ToString()
        {
            Update();

            return(m_roleType.Name + "." + ViveRoleEnum.GetInfo(m_roleType).GetNameByRoleValue(m_roleValue));
        }
示例#15
0
 public void Set(Type type, int value)
 {
     Set(type.FullName, ViveRoleEnum.GetInfo(type).GetNameByRoleValue(value));
 }
        // Draw the property inside the given rect
        public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
        {
            // Using BeginProperty / EndProperty on the parent property means that
            // prefab override logic works on the entire property.
            EditorGUI.BeginProperty(position, label, property);

            // Draw label
            position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), new GUIContent(property.displayName));

            // Don't make child fields be indented
            var indent = EditorGUI.indentLevel;

            EditorGUI.indentLevel = 0;

            // Caluculate rects
            var spacing       = 5.0f;
            var rectWidth     = Mathf.Round((position.width - spacing) * 0.5f);
            var enumTypeRect  = new Rect(position.x, position.y, rectWidth, position.height);
            var enumValueRect = new Rect(position.x + rectWidth + spacing, position.y, rectWidth, position.height);

            var roleTypeNameProp  = property.FindPropertyRelative("m_roleTypeFullName");
            var roleValueNameProp = property.FindPropertyRelative("m_roleValueName");
            var roleValueIntProp  = property.FindPropertyRelative("m_roleValueInt");

            var roleTypeName  = roleTypeNameProp.stringValue;
            var roleValueName = roleValueNameProp.stringValue;

            // find current role type / type index
            Type roleType;
            var  roleTypeIndex = ViveRoleEnum.ValidViveRoleTable.IndexOf(roleTypeName);

            if (roleTypeIndex < 0)
            {
                // name not found
                roleType      = s_defaultRoleType;
                roleTypeIndex = s_defaultRoleTypeIndex;
            }
            else
            {
                roleType = ViveRoleEnum.ValidViveRoleTable.GetValueByIndex(roleTypeIndex);
            }

            // find current role value index
            var roleTypeInfo   = ViveRoleEnum.GetInfo(roleType);
            var roleValueIndex = roleTypeInfo.GetElementIndexByName(roleValueName);

            if (roleValueIndex < 0)
            {
                roleValueIndex = roleTypeInfo.InvalidRoleValueIndex;
            }

            // draw pupup box, get new role type index / value index
            var newRoleTypeIndex  = EditorGUI.Popup(enumTypeRect, roleTypeIndex, s_roleTypeNames);
            var newRoleValueIndex = EditorGUI.Popup(enumValueRect, roleValueIndex, EnumUtils.GetDisplayInfo(roleType).displayedNames);

            // if new role index changed
            if (newRoleTypeIndex != roleTypeIndex || newRoleValueIndex != roleValueIndex)
            {
                var target = GetTargetObjectOfProperty(property) as ViveRoleProperty;

                if (newRoleTypeIndex != roleTypeIndex)
                {
                    roleTypeNameProp.stringValue = ViveRoleEnum.ValidViveRoleTable.GetKeyByIndex(newRoleTypeIndex);
                    roleType     = ViveRoleEnum.ValidViveRoleTable.GetValueByIndex(newRoleTypeIndex);
                    roleTypeInfo = ViveRoleEnum.GetInfo(roleType);

                    target.SetTypeDirty();
                }

                if (newRoleValueIndex != roleValueIndex)
                {
                    roleValueNameProp.stringValue = roleTypeInfo.GetNameByElementIndex(newRoleValueIndex);
                    roleValueIntProp.intValue     = roleTypeInfo.GetRoleValueByElementIndex(newRoleValueIndex);

                    target.SetValueDirty();
                }
            }

            property.serializedObject.ApplyModifiedProperties(); // will call ViveRoleProperty.OnAfterDeserialize here

            // Set indent back to what it was
            EditorGUI.indentLevel = indent;

            EditorGUI.EndProperty();
        }
示例#17
0
 public static ViveRoleProperty New(Type type, int value)
 {
     return(New(type.FullName, ViveRoleEnum.GetInfo(type).GetNameByRoleValue(value)));
 }