private void Awake() { _trackedObjectData = new List <TrackedObjectData>(); _tcpServer = GetComponent <SteamVrAsyncStreamingMappingDataUsingTcp>(); _savedPositions = new List <Vector3>(); _steamTrackedObjects = new List <SteamVR_TrackedObject>(); _steamTrackedObjectsInitial = new List <SteamVR_TrackedObject>(); _lastIds = new List <int>(); _lastActive = new List <bool>(); _lastNames = new List <string>(); _offsets = new List <SteamVR_Offset>(); SOCKET_BUFSIZE = (int)new System.ComponentModel.Int32Converter().ConvertFromString(SocketSize); if (StreamData) { //init variables _tcpServer.Port = 11000; _tcpServer._isListening = true; _tcpServer._ip = IPServer; _tcpServer.RequiredCommand = CommandMappingTable; _tcpServer.ServerMessageEntryValueSeparator = MappingTableEntryValueSeparator; _tcpServer.ServerMessageEntriesSeparator = MappingTableEntriesSeparator; } //add to lists var _childrenWithTrackedObjects = GetComponentsInChildren <SteamVR_TrackedObject>().ToList(); _objectsStart = new List <SteamVR_TrackedObject>(_childrenWithTrackedObjects); var wishList = _childrenWithTrackedObjects .Select(c => PlayerPrefs.GetInt(c.gameObject.name + "_id", -1)).ToList(); var otherAvailableIds = new List <int>(); var allAvailableIds = new List <int>(); for (var i = StartIndex; i < CreateNumber; i++) { allAvailableIds.Add(i); if (!wishList.Contains(i)) { otherAvailableIds.Add(i); } } for (var i = 0; i < _childrenWithTrackedObjects.Count; i++) { var child = _childrenWithTrackedObjects[i]; var childname = child.gameObject.name; if (wishList[i] >= 0) { var ind = wishList[i]; if (allAvailableIds.Contains(ind)) { //Debug.Log("success: assign id " + ind + " to " + childname); } else { ind = otherAvailableIds.First(); // Debug.Log("failed: assign id " + wishList[i] + " to " + childname + ", use " + ind + " instead"); } child.index = (SteamVR_TrackedObject.EIndex)ind; allAvailableIds.Remove(ind); if (otherAvailableIds.Contains(ind)) { otherAvailableIds.Remove(ind); } //child.gameObject.SetActive(PlayerPrefs.GetInt(childname + "_active") == 1); } } for (var i = StartIndex; i < CreateNumber; i++) { SteamVR_Offset off; var ind = i; var candidates = _childrenWithTrackedObjects.Where(s => (int)s.index == ind).ToList(); var sto = candidates.FirstOrDefault(); if (sto != null) { off = sto.gameObject.GetComponent <SteamVR_Offset>(); _childrenWithTrackedObjects.Remove(sto); //Debug.Log("handle " + sto.gameObject.name); } else { var go = new GameObject(); sto = go.AddComponent <SteamVR_TrackedObject>(); sto.index = (SteamVR_TrackedObject.EIndex)i; go.transform.parent = transform; go.name = "UnassignedName" + i; //Debug.Log("create " + go.name); off = go.AddComponent <SteamVR_Offset>(); if (candidates.Count > 1) { Debug.Log("mutliple ids " + i); var delete = _childrenWithTrackedObjects.Where(c => c != sto && (int)c.index == i); foreach (var d in delete) { _childrenWithTrackedObjects.Remove(d); Destroy(d.gameObject); } } } var newData = new TrackedObjectData { id = i, pos = Vector3.zero, rot = Quaternion.identity }; sto.origin = null; _trackedObjectData.Add(newData); _steamTrackedObjects.Add(sto); _steamTrackedObjectsInitial.Add(sto); _lastIds.Add((int)sto.index); _lastActive.Add(sto.gameObject.activeSelf); _lastNames.Add(sto.gameObject.name); _offsets.Add(off); _savedPositions.Add(sto.transform.position); #if UNITY_EDITOR DrawIcon(sto.gameObject, 0); sto.gameObject.SetActive(true); #endif } if (_childrenWithTrackedObjects.Count > 0) { Debug.LogError("Initialize error: more than one initial 'SteamVR_TrackedObject' with same device index"); } var ser = PlayerPrefs.GetString("origin"); Vector3 pos; Quaternion rot; if (TryDeserializeOrigin(ser, out rot, out pos)) { transform.rotation = rot; transform.position = pos; } Logging.SetTrackedObjects(_steamTrackedObjects); }
void StreamTrackedObjectData() { var ts = new List <TrackedObjectData>(); var changed = false; for (var i = 0; i < CreateNumber - StartIndex; i++) { var data = _trackedObjectData[i]; //check device ids (no doubles) and names (changes) var deviceId = (int)_steamTrackedObjects[i].index; var tmpName = _steamTrackedObjects[i].gameObject.name; var isActive = _steamTrackedObjects[i].gameObject.activeSelf; if (_lastNames[i] != tmpName) { var lastName = _lastNames[i]; _lastNames[i] = tmpName; Debug.Log("changed name of device " + _lastIds[i] + " from " + lastName + " to " + tmpName); ResetNames(); changed = true; } if (_lastIds[i] != deviceId) { var indexOfData2Change = -1; TrackedObjectData data2Change = new TrackedObjectData(); for (var j = 0; j < CreateNumber - StartIndex; j++) { if (i == j || (int)_steamTrackedObjects[j].index != deviceId) { continue; } indexOfData2Change = j; data2Change = _trackedObjectData[j]; break; } if (indexOfData2Change >= 0) { var otherActive = _steamTrackedObjects[indexOfData2Change].gameObject.activeSelf; data2Change.id = _lastIds[i]; _steamTrackedObjects[indexOfData2Change].index = (SteamVR_TrackedObject.EIndex)_lastIds[i]; _lastIds[indexOfData2Change] = _lastIds[i]; _steamTrackedObjects[indexOfData2Change].gameObject.SetActive(isActive); data.id = deviceId; //_steamTrackedObjects[i].index = (SteamVR_TrackedObject.EIndex)deviceId; _lastIds[i] = deviceId; _steamTrackedObjects[i].gameObject.SetActive(otherActive); Debug.Log("switched device ID of " + _steamTrackedObjects[i].gameObject.name + " (now " + deviceId + ") and " + _steamTrackedObjects[indexOfData2Change].gameObject.name + " (now " + data2Change.id + ")"); _trackedObjectData[i] = data; _trackedObjectData[indexOfData2Change] = data2Change; changed = true; } } if (isActive != _lastActive[i]) { _lastActive[i] = isActive; changed = true; } var streamAnyway = Logging.State == Logging.LogState.Playing || Logging.State == Logging.LogState.PlayingPause; if (!streamAnyway && (!_steamTrackedObjects[i].isValid || !isActive)) { continue; } if (_offsets[i].AnyDependencyViolated()) { continue; } data.pos = _offsets[i].Child.position; data.rot = (streamAnyway ? _offsets[i].Child.rotation * Quaternion.Euler(TrackableRotationInitial) : _offsets[i].Child.rotation); ts.Add(data); } if (changed) { NotifyTcpServerMappingChanged(); Logging.SetTrackedObjects(_steamTrackedObjects); } TrackedObjectData[] tsa = ts.ToArray(); if (StreamData) { byte[] msg = ToByteArray(tsa); if (_socket != null && ts.Count != 0) { if (UseCustomIps) { foreach (var clientEndPoint in _clientEndPoints) { _socket.SendTo(msg, clientEndPoint); } } else { _socket.SendTo(msg, _endPoint); } } } //log stuff Logging.TryLog(tsa, _lastDict); Logging.TryAlter(ref _steamTrackedObjects); }