private void FindJointsAndEntities(simengine.VisualEntity thisEntity, Dictionary <string, simengine.VisualEntity> visited) { if (thisEntity == null) { return; } if (visited.ContainsKey(thisEntity.State.Name)) { return; } else { visited.Add(thisEntity.State.Name, thisEntity); } // process the children first if (thisEntity is simengine.VisualEntity) { foreach (simengine.VisualEntity Child in ((simengine.VisualEntity)thisEntity).Children) { FindJointsAndEntities(Child, visited); } } if (thisEntity.ParentJoint != null) { AddJoint(thisEntity.ParentJoint, thisEntity); } // search this entity for other entities or joints Type thisEntityType = thisEntity.GetType(); System.Reflection.FieldInfo[] fields = thisEntityType.GetFields( System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic); foreach (FieldInfo field in fields) { // search for joints if ((field.FieldType == typeof(Joint)) || (field.FieldType.IsSubclassOf(typeof(Joint)))) { Joint thisJoint = (Joint)field.GetValue(thisEntity); if (thisJoint != null) { AddJoint(thisJoint, thisEntity); } } else if (field.FieldType == typeof(List <Joint>)) { List <Joint> jointList = (List <Joint>)field.GetValue(thisEntity); if (jointList != null) { foreach (Joint thisJoint in jointList) { AddJoint(thisJoint, thisEntity); } } } else if (field.FieldType == typeof(Joint[])) { Joint[] jointArray = (Joint[])field.GetValue(thisEntity); if (jointArray != null) { foreach (Joint thisJoint in jointArray) { AddJoint(thisJoint, thisEntity); } } } // search for entities if ((field.FieldType == typeof(simtypes.Entity)) || (field.FieldType.IsSubclassOf(typeof(simtypes.Entity)))) { FindJointsAndEntities((simengine.VisualEntity)field.GetValue(thisEntity), visited); } else if (field.FieldType.IsGenericType) { Type[] parms = field.FieldType.GetGenericArguments(); if (parms.Length == 1) { if ((parms[0] == typeof(simtypes.Entity)) || (parms[0].IsSubclassOf(typeof(simtypes.Entity)))) { foreach (simengine.VisualEntity someEntity in (System.Collections.ICollection)field.GetValue(thisEntity)) { FindJointsAndEntities(someEntity, visited); } } } } } }