Example #1
0
        private void Render(string content)
        {
            var             newApp = ParseXml.Parse(content, tagMap);
            GameObjectPatch patch  = VDiff.Diff(vApp, newApp);

            root = patch(root);
            vApp = newApp;
        }
Example #2
0
    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);
    }
Example #3
0
    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);
    }