Steps toward hierarchy changes
This commit is contained in:
		
							parent
							
								
									be167722e7
								
							
						
					
					
						commit
						6e85ef163d
					
				@ -35,6 +35,7 @@ namespace RoboidControl.Unity {
 | 
			
		||||
            }
 | 
			
		||||
            siteServer.site.Add(thing);
 | 
			
		||||
            core.OnPoseChanged += PoseChanged;
 | 
			
		||||
            core.OnHierarchyChanged += ParentChanged;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static Thing Create(RoboidControl.Thing core) {
 | 
			
		||||
@ -59,6 +60,7 @@ namespace RoboidControl.Unity {
 | 
			
		||||
                this.transform.localRotation = core.orientation.ToQuaternion();
 | 
			
		||||
 | 
			
		||||
            core.OnPoseChanged += this.PoseChanged;
 | 
			
		||||
            core.OnHierarchyChanged += ParentChanged;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
@ -72,18 +74,11 @@ namespace RoboidControl.Unity {
 | 
			
		||||
                Vector3 direction = Quaternion.AngleAxis(core.linearVelocity.direction.horizontal, Vector3.up) * Vector3.forward;
 | 
			
		||||
                this.transform.Translate(core.linearVelocity.distance * Time.deltaTime * direction, Space.Self);
 | 
			
		||||
            }
 | 
			
		||||
            // else if (core.positionUpdated)
 | 
			
		||||
            //     this.transform.localPosition = core.position.ToVector3();
 | 
			
		||||
 | 
			
		||||
            if (core.angularVelocity != null && core.angularVelocity.distance != 0) {
 | 
			
		||||
                // Vector3 angularVelocity = core.angularVelocity.ToVector3();
 | 
			
		||||
                // Debug.Log(angularVelocity);
 | 
			
		||||
                Vector3 axis = core.angularVelocity.direction.ToVector3();
 | 
			
		||||
                this.transform.localRotation *= Quaternion.AngleAxis(core.angularVelocity.distance * Time.deltaTime, axis);
 | 
			
		||||
                //this.transform.localRotation *= Quaternion.Euler(angularVelocity * Time.deltaTime);
 | 
			
		||||
            }
 | 
			
		||||
            // else if (core.orientationUpdated)
 | 
			
		||||
            //     this.transform.localRotation = core.orientation.ToQuaternion();
 | 
			
		||||
 | 
			
		||||
            if (!string.IsNullOrEmpty(core.modelUrl) && this.modelUrl == null) {
 | 
			
		||||
                string extension = core.modelUrl.Substring(core.modelUrl.LastIndexOf("."));
 | 
			
		||||
@ -98,7 +93,14 @@ namespace RoboidControl.Unity {
 | 
			
		||||
                    this.gameObject.name = core.name;
 | 
			
		||||
                core.nameChanged = false;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (core.hierarchyChanged) {
 | 
			
		||||
                Debug.Log("Parent changed");
 | 
			
		||||
                if (core.parent == null)
 | 
			
		||||
                    this.transform.SetParent(null, true);
 | 
			
		||||
                else
 | 
			
		||||
                    this.transform.SetParent(core.parent.component.transform, true);
 | 
			
		||||
            core.hierarchyChanged = false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void PoseChanged() {
 | 
			
		||||
@ -109,6 +111,14 @@ namespace RoboidControl.Unity {
 | 
			
		||||
                this.transform.localRotation = core.orientation.ToQuaternion();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ParentChanged() {
 | 
			
		||||
            
 | 
			
		||||
            // if (core.parent == null)
 | 
			
		||||
            //     this.transform.SetParent(null, true);
 | 
			
		||||
            // else
 | 
			
		||||
            //     this.transform.SetParent(core.parent.component.transform, true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private IEnumerator LoadJPG() {
 | 
			
		||||
            UnityWebRequest request = UnityWebRequestTexture.GetTexture(core.modelUrl);
 | 
			
		||||
            yield return request.SendWebRequest();
 | 
			
		||||
 | 
			
		||||
@ -94,27 +94,6 @@ namespace RoboidControl {
 | 
			
		||||
 | 
			
		||||
        #region Update
 | 
			
		||||
 | 
			
		||||
        protected void ReceiveUDP(IAsyncResult result) {
 | 
			
		||||
            // UnityEngine.Debug.Log("received");
 | 
			
		||||
            if (this.udpClient == null) // || this.endPoint == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            byte[] data = this.udpClient.EndReceive(result, ref endPoint);
 | 
			
		||||
            // This does not yet take multi-packet messages into account!
 | 
			
		||||
            if (endPoint == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            // We can receive our own publish (broadcast) packages. How do we recognize them????
 | 
			
		||||
            // It is hard to determine our source port
 | 
			
		||||
            string ipAddress = endPoint.Address.ToString();
 | 
			
		||||
            Participant remoteParticipant = GetParticipant(ipAddress, endPoint.Port);
 | 
			
		||||
            remoteParticipant ??= AddParticipant(ipAddress, endPoint.Port);
 | 
			
		||||
 | 
			
		||||
            ReceiveData(data, remoteParticipant);
 | 
			
		||||
 | 
			
		||||
            udpClient.BeginReceive(new AsyncCallback(callbackResult => ReceiveUDP(callbackResult)), null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected ulong nextPublishMe = 0;
 | 
			
		||||
        public override void Update(ulong currentTimeMS = 0) {
 | 
			
		||||
            if (currentTimeMS == 0) {
 | 
			
		||||
@ -139,6 +118,11 @@ namespace RoboidControl {
 | 
			
		||||
                Thing thing = this.things[ix];
 | 
			
		||||
                if (thing == null || thing.parent != null)
 | 
			
		||||
                    continue;
 | 
			
		||||
                
 | 
			
		||||
                if (thing.hierarchyChanged && !(this.isIsolated || this.networkId == 0)) {
 | 
			
		||||
                    ThingMsg thingMsg = new(this.networkId, thing);
 | 
			
		||||
                    this.Send(this.remoteSite, thingMsg);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                thing.Update(currentTimeMS, true);
 | 
			
		||||
                if (this.isIsolated || this.networkId == 0)
 | 
			
		||||
@ -172,10 +156,6 @@ namespace RoboidControl {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public virtual void Publish() {
 | 
			
		||||
            this.Publish(new ParticipantMsg(this.networkId));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #endregion Update
 | 
			
		||||
 | 
			
		||||
        #region Send
 | 
			
		||||
@ -199,6 +179,10 @@ namespace RoboidControl {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public virtual void Publish() {
 | 
			
		||||
            this.Publish(new ParticipantMsg(this.networkId));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void PublishThingInfo(Thing thing) {
 | 
			
		||||
            // Console.WriteLine("Publish thing info");
 | 
			
		||||
            this.Publish(new ThingMsg(this.networkId, thing));
 | 
			
		||||
@ -239,6 +223,27 @@ namespace RoboidControl {
 | 
			
		||||
 | 
			
		||||
        #region Receive
 | 
			
		||||
 | 
			
		||||
        protected void ReceiveUDP(IAsyncResult result) {
 | 
			
		||||
            // UnityEngine.Debug.Log("received");
 | 
			
		||||
            if (this.udpClient == null) // || this.endPoint == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            byte[] data = this.udpClient.EndReceive(result, ref endPoint);
 | 
			
		||||
            // This does not yet take multi-packet messages into account!
 | 
			
		||||
            if (endPoint == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            // We can receive our own publish (broadcast) packages. How do we recognize them????
 | 
			
		||||
            // It is hard to determine our source port
 | 
			
		||||
            string ipAddress = endPoint.Address.ToString();
 | 
			
		||||
            Participant remoteParticipant = GetParticipant(ipAddress, endPoint.Port);
 | 
			
		||||
            remoteParticipant ??= AddParticipant(ipAddress, endPoint.Port);
 | 
			
		||||
 | 
			
		||||
            ReceiveData(data, remoteParticipant);
 | 
			
		||||
 | 
			
		||||
            udpClient.BeginReceive(new AsyncCallback(callbackResult => ReceiveUDP(callbackResult)), null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void ReceiveData(byte[] data, Participant sender) {
 | 
			
		||||
            byte msgId = data[0];
 | 
			
		||||
            if (msgId == 0xFF) {
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,11 @@ namespace RoboidControl {
 | 
			
		||||
                if (parentThing == null)
 | 
			
		||||
                    Console.WriteLine($"Could not find parent [{msg.networkId}/{msg.parentId}]");
 | 
			
		||||
                else
 | 
			
		||||
                    thing.parent = parentThing;
 | 
			
		||||
                    thing.parent = parentThing;                    
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                Console.Write($"Dropped {thing.id}");
 | 
			
		||||
                thing.parent = null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								src/Thing.cs
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/Thing.cs
									
									
									
									
									
								
							@ -145,14 +145,15 @@ namespace RoboidControl {
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    value.AddChild(this);
 | 
			
		||||
                    OnParentChanged?.Invoke();
 | 
			
		||||
                }
 | 
			
		||||
                OnHierarchyChanged?.Invoke();
 | 
			
		||||
                this.hierarchyChanged = true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Event which is triggered when the parent changes
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public event ChangeHandler OnParentChanged = delegate { };
 | 
			
		||||
        public event ChangeHandler OnHierarchyChanged = delegate { };
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Add a child Thing to this Thing
 | 
			
		||||
@ -219,6 +220,11 @@ namespace RoboidControl {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Indicator that the hierarchy of the thing has changed
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool hierarchyChanged = true;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The children of this thing
 | 
			
		||||
        /// </summary>
 | 
			
		||||
@ -368,7 +374,8 @@ namespace RoboidControl {
 | 
			
		||||
            this.positionUpdated = false;
 | 
			
		||||
            this.orientationUpdated = false;
 | 
			
		||||
            this.linearVelocityUpdated = false;
 | 
			
		||||
            this.angularVelocityUpdated = false;            
 | 
			
		||||
            this.angularVelocityUpdated = false;
 | 
			
		||||
            //this.hierarchyChanged = false;
 | 
			
		||||
 | 
			
		||||
            // should recurse over children...
 | 
			
		||||
            if (recursively) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user