コード例 #1
0
        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);
                            }
                        }
                    }
                }
            }
        }