void RefreshFromFileValues(ElementRuntime elementRuntime) { if (elementRuntime.mAssociatedNamedObjectSave != null && elementRuntime.mAssociatedNamedObjectSave.SourceType == SourceType.File && !string.IsNullOrEmpty(elementRuntime.mAssociatedNamedObjectSave.SourceFile) && !string.IsNullOrEmpty(elementRuntime.mAssociatedNamedObjectSave.SourceName)) { Scene scene = null; string fileNameToFind = FileManager.Standardize(ContentDirectory + elementRuntime.mAssociatedNamedObjectSave.SourceFile); foreach (Scene loadedScene in mReferencedFileRuntimeList.LoadedScenes) { if (loadedScene.Name == fileNameToFind) { scene = loadedScene; break; } } if (scene != null) { INameable nameable = scene.FindByName(elementRuntime.mAssociatedNamedObjectSave.SourceNameWithoutParenthesis); // It's valid if this is null. This may happen if the NamedObjectSave references // the entire file. if (nameable != null) { Type typeOfObject = nameable.GetType(); bool wasFound = false; BindingFlags bindingFlags = BindingFlags.Default; if (typeOfObject.GetProperty("X") != null) { wasFound = true; bindingFlags = BindingFlags.GetProperty; } //if(typeOfObject.GetField("X") != null) //{ // wasFound = true; // bindingFlags = BindingFlags.GetField; //} if (wasFound) { Binder binder = null; object[] args = null; // I think this can't be attached to a camera, but we should throw an exception if so PositionedObject asPositionedObject = elementRuntime.mDirectObjectReference as PositionedObject; if (asPositionedObject.Parent != null) { asPositionedObject.RelativeX = (float)typeOfObject.InvokeMember("X", bindingFlags, binder, nameable, args); asPositionedObject.RelativeY = (float)typeOfObject.InvokeMember("Y", bindingFlags, binder, nameable, args); asPositionedObject.RelativeZ = (float)typeOfObject.InvokeMember("Z", bindingFlags, binder, nameable, args); asPositionedObject.RelativeRotationX = (float)typeOfObject.InvokeMember("RotationX", bindingFlags, binder, nameable, args); asPositionedObject.RelativeRotationY = (float)typeOfObject.InvokeMember("RotationY", bindingFlags, binder, nameable, args); asPositionedObject.RelativeRotationZ = (float)typeOfObject.InvokeMember("RotationZ", bindingFlags, binder, nameable, args); asPositionedObject.ForceUpdateDependencies(); } else { asPositionedObject.X = (float)typeOfObject.InvokeMember("X", bindingFlags, binder, nameable, args); asPositionedObject.Y = (float)typeOfObject.InvokeMember("Y", bindingFlags, binder, nameable, args); asPositionedObject.Z = (float)typeOfObject.InvokeMember("Z", bindingFlags, binder, nameable, args); asPositionedObject.RotationX = (float)typeOfObject.InvokeMember("RotationX", bindingFlags, binder, nameable, args); asPositionedObject.RotationY = (float)typeOfObject.InvokeMember("RotationY", bindingFlags, binder, nameable, args); asPositionedObject.RotationZ = (float)typeOfObject.InvokeMember("RotationZ", bindingFlags, binder, nameable, args); } } } } } elementRuntime.RefreshNamedObjectPositionedObjectValues(); }