private void Render(string content) { var newApp = ParseXml.Parse(content, tagMap); GameObjectPatch patch = VDiff.Diff(vApp, newApp); root = patch(root); vApp = newApp; }
private static GameObjectPatch DiffChildren(VGameObject[] vOldChildren, VGameObject[] vNewChildren) { List <GameObjectPatch> patches = new List <GameObjectPatch>(); for (int i = 0; i < vOldChildren.Length; i++) { VGameObject newChild = null; if (i < vNewChildren.Length) { newChild = vNewChildren[i]; } patches.Add(Diff(vOldChildren[i], newChild)); } List <GameObjectPatch> additionalPatches = new List <GameObjectPatch>(); if (vNewChildren.Length > vOldChildren.Length) { for (int i = vOldChildren.Length; i < vNewChildren.Length; i++) { VGameObject newChild = vNewChildren[i]; GameObjectPatch newChildPatch = (GameObject go) => { GameObject newGo = VRender.RenderGameObject(newChild); newGo.transform.SetParent(go.transform); return(newGo); }; additionalPatches.Add(newChildPatch); } } GameObjectPatch completePatch = (GameObject go) => { for (int i = 0; i < patches.Count; i++) { GameObject child = go.transform.GetChild(i).gameObject; patches[i](child); } foreach (GameObjectPatch patch in additionalPatches) { patch(go); } return(go); }; return(completePatch); }
public static GameObjectPatch Diff(VGameObject vOldGO, VGameObject vNewGO) { GameObjectPatch patch; // GameObject has been deleted if (vNewGO == null) { patch = (GameObject go) => { GameObject.Destroy(go); return(null); }; } // GameObject has been added else if (vOldGO == null) { patch = (GameObject go) => { GameObject newGo = VRender.RenderGameObject(vNewGO); newGo.transform.SetParent(go.transform); return(newGo); }; } // GameObject has been modified else { patch = (GameObject go) => { if (vOldGO.type != vNewGO.type) { var oldComponent = go.GetComponent(vOldGO.type); GameObject.DestroyImmediate(oldComponent); go.AddComponent(vNewGO.type); } var componentPatch = DiffFields(vOldGO, vNewGO); componentPatch(go); GameObjectPatch childPatch = DiffChildren(vOldGO.children, vNewGO.children); childPatch(go); return(go); }; } return(patch); }