void Update()
        {
            if (!initializedBuildingsPanel)
            {
                sceneExplorer = FindObjectOfType <SceneExplorer>();

                buildingsBufferRefChain = new ReferenceChain();
                buildingsBufferRefChain = buildingsBufferRefChain.Add(BuildingManager.instance.gameObject);
                buildingsBufferRefChain = buildingsBufferRefChain.Add(BuildingManager.instance);
                buildingsBufferRefChain = buildingsBufferRefChain.Add(typeof(BuildingManager).GetField("m_buildings"));
                buildingsBufferRefChain = buildingsBufferRefChain.Add(typeof(Array16 <Building>).GetField("m_buffer"));

                zonedBuildingInfoPanel = GameObject.Find("(Library) ZonedBuildingWorldInfoPanel").GetComponent <ZonedBuildingWorldInfoPanel>();
                if (zonedBuildingInfoPanel != null)
                {
                    AddZonedBuildingPanelControls();
                    initializedBuildingsPanel = true;
                }
            }

            if (zonedBuildingInfoPanel.component.isVisible)
            {
                InstanceID instance = Util.GetPrivate <InstanceID>(zonedBuildingInfoPanel, "m_InstanceID");
                var        building = BuildingManager.instance.m_buildings.m_buffer[instance.Building];
                zonedBuildingAssetNameLabel.text = "AssetName: " + building.Info.name;
            }
        }
示例#2
0
        void Update()
        {
            var hoveredLocal = hoveredComponent;

            if (drawDebugInfo && hoveredLocal != null)
            {
                if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.F))
                {
                    var uiView = FindObjectOfType <UIView>();
                    if (uiView == null)
                    {
                        return;
                    }

                    var current  = hoveredLocal;
                    var refChain = new ReferenceChain();
                    refChain = refChain.Add(current);
                    while (current != null)
                    {
                        refChain = refChain.Add(current.gameObject);
                        current  = current.parent;
                    }
                    ;
                    refChain = refChain.Add(uiView.gameObject);

                    var sceneExplorer = FindObjectOfType <SceneExplorer>();
                    sceneExplorer.ExpandFromRefChain(refChain.Reverse);
                    sceneExplorer.visible = true;
                }
                if (Input.GetKey(KeyCode.LeftControl) && Input.GetKeyDown(KeyCode.G))
                {
                    if (hoveredComponents.Count > 1 && hoveredComponent != null)
                    {
                        var index    = hoveredComponents.IndexOf(hoveredComponent);
                        var newIndex = (index + hoveredComponents.Count + 1) % hoveredComponents.Count;
                        hoveredComponent = hoveredComponents[newIndex];
                    }
                }
            }
        }
        void AddZonedBuildingPanelControls()
        {
            zonedBuildingInfoPanel.component.Find <UILabel>("AllGood").isVisible       = false;
            zonedBuildingInfoPanel.component.Find <UIPanel>("ProblemsPanel").isVisible = false;

            zonedBuildingAssetNameLabel = CreateLabel
                                          (
                "AssetName: <>", 160, 24,
                zonedBuildingInfoPanel.component,
                new Vector3(8.0f, 48.0f, 0.0f),
                UIAlignAnchor.TopLeft
                                          );

            zonedBuildingShowExplorerButton = CreateButton
                                              (
                "Find in SceneExplorer", 160, 24,
                zonedBuildingInfoPanel.component,
                new Vector3(-8.0f, 100.0f, 0.0f),
                UIAlignAnchor.TopRight,
                (component, param) =>
            {
                InstanceID instance = Util.GetPrivate <InstanceID>(zonedBuildingInfoPanel, "m_InstanceID");
                sceneExplorer.ExpandFromRefChain(buildingsBufferRefChain.Add(instance.Building));
                sceneExplorer.visible = true;
            }
                                              );

            zonedBuildingDumpMeshTextureButton = CreateButton
                                                 (
                "Dump mesh+texture", 160, 24,
                zonedBuildingInfoPanel.component,
                new Vector3(-8.0f, 132.0f, 0.0f),
                UIAlignAnchor.TopRight,
                (component, param) =>
            {
                InstanceID instance = Util.GetPrivate <InstanceID>(zonedBuildingInfoPanel, "m_InstanceID");
                var building        = BuildingManager.instance.m_buildings.m_buffer[instance.Building];
                var material        = building.Info.m_material;
                var mesh            = building.Info.m_mesh;

                var assetName = building.Info.name;

                Log.Warning(String.Format("Dumping asset \"{0}\"", assetName));
                Util.DumpMeshToOBJ(mesh, String.Format("{0}.obj", assetName));
                Util.DumpTextureToPNG(material.GetTexture("_MainTex"), String.Format("{0}_MainTex.png", assetName));
                Util.DumpTextureToPNG(material.GetTexture("_XYSMap"), String.Format("{0}_xyz.png", assetName));
                Util.DumpTextureToPNG(material.GetTexture("_ACIMap"), String.Format("{0}_aci.png", assetName));
                Log.Warning("Done!");
            }
                                                 );
        }
示例#4
0
        void AddVehiclePanelControls(WorldInfoPanel infoPanel, out UILabel assetNameLabel, out UIButton showExplorerButton, out UIButton dumpMeshTextureButton)
        {
            infoPanel.component.Find <UILabel>("Type").isVisible = false;

            assetNameLabel = CreateLabel
                             (
                "AssetName: <>", 160, 24,
                infoPanel.component,
                new Vector3(8.0f, 48.0f, 0.0f),
                UIAlignAnchor.TopLeft
                             );

            showExplorerButton = CreateButton
                                 (
                "Find in SceneExplorer", 160, 24,
                infoPanel.component,
                new Vector3(-8.0f, -57.0f, 0.0f),
                UIAlignAnchor.BottomRight,
                (component, param) =>
            {
                InstanceID instance = ReflectionUtil.GetPrivate <InstanceID>(infoPanel, "m_InstanceID");

                if (instance.Vehicle == 0)
                {
                    sceneExplorer.ExpandFromRefChain(vehiclesParkedBufferRefChain.Add(instance.ParkedVehicle));
                }
                else
                {
                    sceneExplorer.ExpandFromRefChain(vehiclesBufferRefChain.Add(instance.Vehicle));
                }

                sceneExplorer.visible = true;
            }
                                 );

            dumpMeshTextureButton = CreateButton
                                    (
                "Dump asset", 160, 24,
                infoPanel.component,
                new Vector3(-8.0f, -25.0f, 0.0f),
                UIAlignAnchor.BottomRight,
                (component, param) =>
            {
                var instance    = ReflectionUtil.GetPrivate <InstanceID>(infoPanel, "m_InstanceID");
                var vehicleInfo = instance.Vehicle == 0 ? VehicleManager.instance.m_parkedVehicles.m_buffer[instance.ParkedVehicle].Info : VehicleManager.instance.m_vehicles.m_buffer[instance.Vehicle].Info;
                var assetName   = vehicleInfo.name;
                DumpUtil.DumpAsset(assetName, vehicleInfo.m_mesh, vehicleInfo.m_material, vehicleInfo.m_lodMesh, vehicleInfo.m_lodMaterial);
            }
                                    );
        }
示例#5
0
        void AddBuildingPanelControls(WorldInfoPanel infoPanel, out UILabel assetNameLabel,
                                      out UIButton showExplorerButton, Vector3 showExplorerButtonOffset,
                                      out UIButton dumpMeshTextureButton, Vector3 dumpMeshTextureButtonOffset)
        {
            infoPanel.component.Find <UILabel>("AllGood").isVisible       = false;
            infoPanel.component.Find <UIPanel>("ProblemsPanel").isVisible = false;

            assetNameLabel = CreateLabel
                             (
                "AssetName: <>", 160, 24,
                infoPanel.component,
                new Vector3(8.0f, 48.0f, 0.0f),
                UIAlignAnchor.TopLeft
                             );

            showExplorerButton = CreateButton
                                 (
                "Find in SceneExplorer", 160, 24,
                infoPanel.component,
                showExplorerButtonOffset,
                UIAlignAnchor.TopRight,
                (component, param) =>
            {
                InstanceID instance = ReflectionUtil.GetPrivate <InstanceID>(infoPanel, "m_InstanceID");
                sceneExplorer.ExpandFromRefChain(buildingsBufferRefChain.Add(instance.Building));
                sceneExplorer.visible = true;
            }
                                 );

            dumpMeshTextureButton = CreateButton
                                    (
                "Dump asset", 160, 24,
                infoPanel.component,
                dumpMeshTextureButtonOffset,
                UIAlignAnchor.TopRight,
                (component, param) =>
            {
                var instance  = ReflectionUtil.GetPrivate <InstanceID>(infoPanel, "m_InstanceID");
                var building  = BuildingManager.instance.m_buildings.m_buffer[instance.Building];
                var assetName = building.Info.name;
                DumpUtil.DumpAsset(assetName, building.Info.m_mesh, building.Info.m_material, building.Info.m_lodMesh, building.Info.m_lodMaterial);
            }
                                    );
        }
示例#6
0
        void AddCitizenPanelControls(WorldInfoPanel infoPanel, out UILabel assetNameLabel,
                                     out UIButton showExplorerButton, Vector3 showExplorerButtonOffset,
                                     out UIButton showInstanceButton, Vector3 showInstanceButtonOffset,
                                     out UIButton showUnitButton, Vector3 showUniteButtonOffset
                                     )
        {
            assetNameLabel = CreateLabel
                             (
                "AssetName: <>", 160, 24,
                infoPanel.component,
                new Vector3(8.0f, 48.0f, 0.0f),
                UIAlignAnchor.TopLeft
                             );

            showExplorerButton = CreateButton
                                 (
                "Find citizen in SE", 160, 24,
                infoPanel.component,
                showExplorerButtonOffset,
                UIAlignAnchor.TopRight,
                (component, param) =>
            {
                InstanceID instance = ReflectionUtil.GetPrivate <InstanceID>(infoPanel, "m_InstanceID");
                if (instance.Type == InstanceType.CitizenInstance)
                {
                    var ci = CitizenManager.instance.m_instances.m_buffer[instance.CitizenInstance];
                    if (ci.m_citizen == 0)
                    {
                        return;
                    }
                    sceneExplorer.ExpandFromRefChain(citizenInstancesBufferRefChain.Add((int)ci.m_citizen));
                }
                else if (instance.Type == InstanceType.Citizen)
                {
                    sceneExplorer.ExpandFromRefChain(citizensBufferRefChain.Add((int)instance.Citizen));
                }
                sceneExplorer.visible = true;
            }
                                 );

            showInstanceButton = CreateButton
                                 (
                "Find instance in SE   ", 160, 24,
                infoPanel.component,
                showInstanceButtonOffset,
                UIAlignAnchor.TopRight,
                (component, param) =>
            {
                var instance = ReflectionUtil.GetPrivate <InstanceID>(infoPanel, "m_InstanceID");
                if (instance.Type == InstanceType.CitizenInstance)
                {
                    sceneExplorer.ExpandFromRefChain(citizenInstancesBufferRefChain.Add(instance.CitizenInstance));
                    sceneExplorer.visible = true;
                }
                else if (instance.Type == InstanceType.Citizen)
                {
                    for (var index = 0; index < CitizenManager.instance.m_instances.m_buffer.Length; index++)
                    {
                        var ci = CitizenManager.instance.m_instances.m_buffer[index];
                        if (ci.m_flags == CitizenInstance.Flags.None || ci.Info == null || ci.m_citizen != instance.Citizen)
                        {
                            continue;
                        }
                        sceneExplorer.ExpandFromRefChain(citizenInstancesBufferRefChain.Add(index));
                        sceneExplorer.visible = true;
                        break;
                    }
                }
            }
                                 );

            showUnitButton = CreateButton
                             (
                "Find unit in SE   ", 160, 24,
                infoPanel.component,
                showUniteButtonOffset,
                UIAlignAnchor.TopRight,
                (component, param) =>
            {
                var instance = ReflectionUtil.GetPrivate <InstanceID>(infoPanel, "m_InstanceID");
                if (instance.Type == InstanceType.CitizenInstance)
                {
                    var ci      = CitizenManager.instance.m_instances.m_buffer[instance.CitizenInstance];
                    var citizen = ci.m_citizen;
                    if (citizen == 0)
                    {
                        return;
                    }
                    for (var index = 0; index < CitizenManager.instance.m_units.m_buffer.Length; index++)
                    {
                        var cu = CitizenManager.instance.m_units.m_buffer[index];
                        if (cu.m_flags == CitizenUnit.Flags.None)
                        {
                            continue;
                        }
                        uint unit = 0;
                        if (cu.m_citizen0 == citizen)
                        {
                            unit = cu.m_citizen0;
                        }
                        else if (cu.m_citizen1 == citizen)
                        {
                            unit = cu.m_citizen1;
                        }
                        else if (cu.m_citizen2 == citizen)
                        {
                            unit = cu.m_citizen2;
                        }
                        else if (cu.m_citizen3 == citizen)
                        {
                            unit = cu.m_citizen3;
                        }
                        else if (cu.m_citizen4 == citizen)
                        {
                            unit = cu.m_citizen4;
                        }
                        if (unit == 0)
                        {
                            continue;
                        }
                        sceneExplorer.ExpandFromRefChain(citizensUnitsBufferRefChain.Add(index));
                        sceneExplorer.visible = true;
                        break;
                    }
                    sceneExplorer.visible = true;
                }
                else if (instance.Type == InstanceType.Citizen)
                {
                    if (instance.Citizen == 0)
                    {
                        return;
                    }
                    for (var index = 0; index < CitizenManager.instance.m_units.m_buffer.Length; index++)
                    {
                        var cu = CitizenManager.instance.m_units.m_buffer[index];
                        if (cu.m_flags == CitizenUnit.Flags.None)
                        {
                            continue;
                        }
                        uint unit = 0;
                        if (cu.m_citizen0 == instance.Citizen)
                        {
                            unit = cu.m_citizen0;
                        }
                        else if (cu.m_citizen1 == instance.Citizen)
                        {
                            unit = cu.m_citizen1;
                        }
                        else if (cu.m_citizen2 == instance.Citizen)
                        {
                            unit = cu.m_citizen2;
                        }
                        else if (cu.m_citizen3 == instance.Citizen)
                        {
                            unit = cu.m_citizen3;
                        }
                        else if (cu.m_citizen4 == instance.Citizen)
                        {
                            unit = cu.m_citizen4;
                        }
                        if (unit == 0)
                        {
                            continue;
                        }
                        sceneExplorer.ExpandFromRefChain(citizensUnitsBufferRefChain.Add(index));
                        sceneExplorer.visible = true;
                        break;
                    }
                }
            }
                             );
        }
        void Update()
        {
            if (!initializedBuildingsPanel)
            {
                sceneExplorer = FindObjectOfType<SceneExplorer>();

                buildingsBufferRefChain = new ReferenceChain();
                buildingsBufferRefChain = buildingsBufferRefChain.Add(BuildingManager.instance.gameObject);
                buildingsBufferRefChain = buildingsBufferRefChain.Add(BuildingManager.instance);
                buildingsBufferRefChain = buildingsBufferRefChain.Add(typeof(BuildingManager).GetField("m_buildings"));
                buildingsBufferRefChain = buildingsBufferRefChain.Add(typeof(Array16<Building>).GetField("m_buffer"));

                zonedBuildingInfoPanel = GameObject.Find("(Library) ZonedBuildingWorldInfoPanel").GetComponent<ZonedBuildingWorldInfoPanel>();
                if (zonedBuildingInfoPanel != null)
                {
                    AddZonedBuildingPanelControls();
                    initializedBuildingsPanel = true;
                }
            }

            if (zonedBuildingInfoPanel.component.isVisible)
            {
                InstanceID instance = Util.GetPrivate<InstanceID>(zonedBuildingInfoPanel, "m_InstanceID");
                var building = BuildingManager.instance.m_buildings.m_buffer[instance.Building];
                zonedBuildingAssetNameLabel.text = "AssetName: " + building.Info.name;
            }
        }
        void Update()
        {
            if (!initializedZonedBuildingsPanel)
            {
                sceneExplorer = FindObjectOfType<SceneExplorer>();

                buildingsBufferRefChain = new ReferenceChain();
                buildingsBufferRefChain = buildingsBufferRefChain.Add(BuildingManager.instance.gameObject);
                buildingsBufferRefChain = buildingsBufferRefChain.Add(BuildingManager.instance);
                buildingsBufferRefChain = buildingsBufferRefChain.Add(typeof(BuildingManager).GetField("m_buildings"));
                buildingsBufferRefChain = buildingsBufferRefChain.Add(typeof(Array16<Building>).GetField("m_buffer"));

                zonedBuildingInfoPanel = GameObject.Find("(Library) ZonedBuildingWorldInfoPanel").GetComponent<ZonedBuildingWorldInfoPanel>();
                if (zonedBuildingInfoPanel != null)
                {
                    AddBuildingPanelControls(zonedBuildingInfoPanel, out zonedBuildingAssetNameLabel,
                        out zonedBuildingShowExplorerButton, new Vector3(-8.0f, 100.0f, 0.0f),
                        out zonedBuildingDumpMeshTextureButton, new Vector3(-8.0f, 132.0f, 0.0f)
                        );
                    initializedZonedBuildingsPanel = true;
                }
            }

            if (!initializedServiceBuildingsPanel)
            {
                sceneExplorer = FindObjectOfType<SceneExplorer>();
                serviceBuildingInfoPanel = GameObject.Find("(Library) CityServiceWorldInfoPanel").GetComponent<CityServiceWorldInfoPanel>();
                if (serviceBuildingInfoPanel != null)
                {
                    AddBuildingPanelControls(serviceBuildingInfoPanel, out serviceBuildingAssetNameLabel,
                        out serviceBuildingShowExplorerButton, new Vector3(-8.0f, 100.0f, 0.0f),
                        out serviceBuildingDumpMeshTextureButton, new Vector3(-8.0f, 132.0f, 0.0f)
                        );
                    initializedServiceBuildingsPanel = true;
                }
            }

            if (!initializedCitizenVehiclePanel)
            {
                sceneExplorer = FindObjectOfType<SceneExplorer>();

                vehiclesBufferRefChain = new ReferenceChain();
                vehiclesBufferRefChain = vehiclesBufferRefChain.Add(VehicleManager.instance.gameObject);
                vehiclesBufferRefChain = vehiclesBufferRefChain.Add(VehicleManager.instance);
                vehiclesBufferRefChain = vehiclesBufferRefChain.Add(typeof(VehicleManager).GetField("m_vehicles"));
                vehiclesBufferRefChain = vehiclesBufferRefChain.Add(typeof(Array16<Vehicle>).GetField("m_buffer"));

                vehiclesParkedBufferRefChain = new ReferenceChain();
                vehiclesParkedBufferRefChain = vehiclesParkedBufferRefChain.Add(VehicleManager.instance.gameObject);
                vehiclesParkedBufferRefChain = vehiclesParkedBufferRefChain.Add(VehicleManager.instance);
                vehiclesParkedBufferRefChain = vehiclesParkedBufferRefChain.Add(typeof(VehicleManager).GetField("m_parkedVehicles"));
                vehiclesParkedBufferRefChain = vehiclesParkedBufferRefChain.Add(typeof(Array16<VehicleParked>).GetField("m_buffer"));

                citizenVehicleInfoPanel = GameObject.Find("(Library) CitizenVehicleWorldInfoPanel").GetComponent<CitizenVehicleWorldInfoPanel>();
                if (citizenVehicleInfoPanel != null)
                {
                    AddVehiclePanelControls(
                        citizenVehicleInfoPanel,
                        out citizenVehicleAssetNameLabel,
                        out citizenVehicleShowExplorerButton,
                        out citizenVehicleDumpTextureMeshButton
                        );
                    initializedCitizenVehiclePanel = true;
                }
            }

            if (!initializedCityServiceVehiclePanel)
            {
                sceneExplorer = FindObjectOfType<SceneExplorer>();

                cityServiceVehicleInfoPanel = GameObject.Find("(Library) CityServiceVehicleWorldInfoPanel").GetComponent<CityServiceVehicleWorldInfoPanel>();
                if (cityServiceVehicleInfoPanel != null)
                {
                    AddVehiclePanelControls(
                        cityServiceVehicleInfoPanel,
                        out cityServiceVehicleAssetNameLabel,
                        out cityServiceVehicleShowExplorerButton,
                        out cityServiceVehicleDumpTextureMeshButton);
                    initializedCityServiceVehiclePanel = true;
                }
            }

            if (!initializedPublicTransportVehiclePanel)
            {
                sceneExplorer = FindObjectOfType<SceneExplorer>();

                publicTransportVehicleInfoPanel = GameObject.Find("(Library) PublicTransportVehicleWorldInfoPanel").GetComponent<PublicTransportVehicleWorldInfoPanel>();
                if (publicTransportVehicleInfoPanel != null)
                {
                    AddVehiclePanelControls(
                        publicTransportVehicleInfoPanel,
                        out publicTransportVehicleAssetNameLabel,
                        out publicTransportVehicleShowExplorerButton,
                        out publicTransportVehicleDumpTextureMeshButton);
                    initializedPublicTransportVehiclePanel = true;
                }
            }

            if (zonedBuildingInfoPanel.component.isVisible)
            {
                InstanceID instance = Util.GetPrivate<InstanceID>(zonedBuildingInfoPanel, "m_InstanceID");
                var building = BuildingManager.instance.m_buildings.m_buffer[instance.Building];
                zonedBuildingAssetNameLabel.text = "AssetName: " + building.Info.name;
            }

            if (serviceBuildingInfoPanel.component.isVisible)
            {
                InstanceID instance = Util.GetPrivate<InstanceID>(serviceBuildingInfoPanel, "m_InstanceID");
                var building = BuildingManager.instance.m_buildings.m_buffer[instance.Building];
                serviceBuildingAssetNameLabel.text = "AssetName: " + building.Info.name;
            }

            if (citizenVehicleInfoPanel.component.isVisible)
            {
                InstanceID instance = Util.GetPrivate<InstanceID>(citizenVehicleInfoPanel, "m_InstanceID");

                if (instance.Vehicle == 0)
                {
                    var vehicle = VehicleManager.instance.m_parkedVehicles.m_buffer[instance.ParkedVehicle];
                    citizenVehicleAssetNameLabel.text = "AssetName: " + vehicle.Info.name;
                }
                else
                {
                    var vehicle = VehicleManager.instance.m_vehicles.m_buffer[instance.Vehicle];
                    citizenVehicleAssetNameLabel.text = "AssetName: " + vehicle.Info.name;
                }
            }

            if (cityServiceVehicleInfoPanel.component.isVisible)
            {
                InstanceID instance = Util.GetPrivate<InstanceID>(cityServiceVehicleInfoPanel, "m_InstanceID");

                if (instance.Vehicle == 0)
                {
                    var vehicle = VehicleManager.instance.m_parkedVehicles.m_buffer[instance.ParkedVehicle];
                    cityServiceVehicleAssetNameLabel.text = "AssetName: " + vehicle.Info.name;
                }
                else
                {
                    var vehicle = VehicleManager.instance.m_vehicles.m_buffer[instance.Vehicle];
                    cityServiceVehicleAssetNameLabel.text = "AssetName: " + vehicle.Info.name;
                }
            }

            if (publicTransportVehicleInfoPanel.component.isVisible)
            {
                InstanceID instance = Util.GetPrivate<InstanceID>(publicTransportVehicleInfoPanel, "m_InstanceID");

                if (instance.Vehicle == 0)
                {
                    var vehicle = VehicleManager.instance.m_parkedVehicles.m_buffer[instance.ParkedVehicle];
                    publicTransportVehicleAssetNameLabel.text = "AssetName: " + vehicle.Info.name;
                }
                else
                {
                    var vehicle = VehicleManager.instance.m_vehicles.m_buffer[instance.Vehicle];
                    publicTransportVehicleAssetNameLabel.text = "AssetName: " + vehicle.Info.name;
                }
            }
        }
示例#9
0
        public void ExpandFromRefChain(ReferenceChain refChain)
        {
            if (refChain == null)
            {
                Log.Error("SceneExplorer: ExpandFromRefChain(): Null refChain");
                return;
            }
            if (refChain.Length == 0)
            {
                Log.Error("SceneExplorer: ExpandFromRefChain(): Invalid refChain, expected Length >= 0");
                return;
            }

            if (refChain.ChainTypes[0] != ReferenceChain.ReferenceType.GameObject)
            {
                Log.Error(String.Format("SceneExplorer: ExpandFromRefChain(): invalid chain type for element [0] - expected {0}, got {1}",
                                        ReferenceChain.ReferenceType.GameObject, refChain.ChainTypes[0]));
                return;
            }

            sceneRoots.Clear();
            ClearExpanded();
            searchDisplayString = String.Format("Showing results for \"{0}\"", refChain.ToString());

            var rootGameObject = (GameObject)refChain.ChainObjects[0];

            sceneRoots.Add(rootGameObject, true);

            var expandedRefChain = new ReferenceChain().Add(rootGameObject);

            state.expandedGameObjects.Add(expandedRefChain, true);

            for (int i = 1; i < refChain.Length; i++)
            {
                switch (refChain.ChainTypes[i])
                {
                case ReferenceChain.ReferenceType.GameObject:
                    var go = (GameObject)refChain.ChainObjects[i];
                    expandedRefChain = expandedRefChain.Add(go);
                    state.expandedGameObjects.Add(expandedRefChain, true);
                    break;

                case ReferenceChain.ReferenceType.Component:
                    var component = (Component)refChain.ChainObjects[i];
                    expandedRefChain = expandedRefChain.Add(component);
                    state.expandedComponents.Add(expandedRefChain, true);
                    break;

                case ReferenceChain.ReferenceType.Field:
                    var field = (FieldInfo)refChain.ChainObjects[i];
                    expandedRefChain = expandedRefChain.Add(field);
                    state.expandedObjects.Add(expandedRefChain, true);
                    break;

                case ReferenceChain.ReferenceType.Property:
                    var property = (PropertyInfo)refChain.ChainObjects[i];
                    expandedRefChain = expandedRefChain.Add(property);
                    state.expandedObjects.Add(expandedRefChain, true);
                    break;

                case ReferenceChain.ReferenceType.Method:
                    break;

                case ReferenceChain.ReferenceType.EnumerableItem:
                    var index = (int)refChain.ChainObjects[i];
                    state.selectedArrayStartIndices[expandedRefChain] = index;
                    state.selectedArrayEndIndices[expandedRefChain]   = index;
                    expandedRefChain = expandedRefChain.Add(index);
                    state.expandedObjects.Add(expandedRefChain, true);
                    break;
                }
            }

            state.currentRefChain             = refChain.Copy();
            state.currentRefChain.IdentOffset = -state.currentRefChain.Length;
        }