Exemple #1
0
        protected override void OnSceneLoad(SceneOperationKind operation,
                                            ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
        {
            Logger.DebugLogDebug($"{this.GetPrettyTypeFullName()}.{nameof(OnSceneLoad)}: {operation}");
            if (!StudioSceneInitialCamera.Enabled.Value)
            {
                return;
            }

            if (operation == SceneOperationKind.Clear)
            {
                RemoveInitialCamera();
                return;
            }


            // don't do anything on import
            if (operation != SceneOperationKind.Load)
            {
                return;
            }
            StudioSceneInitialCamera.Hooks.EnableChangeCameraHook = false;
            InitialCamera            = null;
            InitialCameraReady       = false;
            InitialCameraSavePending = false;
            AddInitialCamera();
        }
Exemple #2
0
 protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
 {
     if (!Autosave.Autosaving)
     {
         Autosave.ResetStudioCoroutine();
     }
 }
Exemple #3
0
        protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
        {
            var data = GetExtendedData();

            if (data == null)
            {
                return;
            }

            if (operation == SceneOperationKind.Load && data.data.TryGetValue(SavedLights, out var savedLightData))
            {
                var savedLights = MessagePackSerializer.Deserialize <List <SavedLight> >((byte[])savedLightData);
                foreach (var savedLight in savedLights)
                {
                    if (loadedItems.TryGetValue(savedLight.LightId, out var lightInfo) && lightInfo is OCILight ocilight)
                    {
                        if (loadedItems.TryGetValue(savedLight.TargetId, out var targetInfo) && targetInfo is OCIChar targetChara)
                        {
                            var tracker = ocilight.light.gameObject.AddComponent <TrackTransform>();
                            tracker.target        = targetChara.charInfo.objBody.transform;
                            tracker.targetKey     = targetInfo.objectInfo.dicKey;
                            tracker.rotationSpeed = savedLight.RotationSpeed;
                            tracker.targetName    = savedLight.TargetName;
                        }
                    }
                }
            }
        }
        protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
        {
            if (operation == SceneOperationKind.Clear || operation == SceneOperationKind.Load)
            {
                MaskingFolders = new Dictionary <int, OCIFolder>();
            }

            if (operation == SceneOperationKind.Clear)
            {
                return;
            }

            var data = GetExtendedData();

            if (data != null)
            {
                if (data.data.TryGetValue(nameof(MaskingFolders), out var folders) && folders != null)
                {
                    foreach (int folderIndex in MessagePackSerializer.Deserialize <List <int> >((byte[])folders))
                    {
                        if (loadedItems.TryGetValue(folderIndex, out ObjectCtrlInfo oci))
                        {
                            if (oci is OCIFolder ociFolder)
                            {
                                AddColliderToFolder(ociFolder);
                            }
                        }
                    }
                }
            }
        }
Exemple #5
0
        protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
        {
            var data = GetExtendedData();

            if (data == null)
            {
                return;
            }

            if (operation == SceneOperationKind.Load && data.data.TryGetValue(SaveId, out var saveDataBytes))
            {
                var saveData = MessagePackSerializer.Deserialize <List <LayerSaveData> >((byte[])saveDataBytes);
                foreach (var layerData in saveData)
                {
                    if (loadedItems.TryGetValue(layerData.ObjectId, out var itemInfo) && itemInfo is OCIItem item)
                    {
                        item.objectItem.AddComponent <LayerDataContainer>().DefaultLayer = layerData.DefaultLayer;
                        item.objectItem.layer = layerData.NewLayer;
                        foreach (Transform child in item.objectItem.transform)
                        {
                            child.gameObject.layer = layerData.NewLayer;
                        }
                    }
                }
            }
        }
Exemple #6
0
 protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
 {
     foreach (var controller in FindObjectsOfType <ColliderController>())
     {
         controller.ApplyColliders();
     }
 }
        private static void OnSceneBeingLoaded(SceneOperationKind operation)
        {
            var readonlyDict = GetLoadedObjects(operation).ToReadOnlyDictionary();

            foreach (var behaviour in _registeredHandlers)
            {
                try
                {
                    behaviour.Key.OnSceneLoad(operation, readonlyDict);
                }
                catch (Exception e)
                {
                    KoikatuAPI.Logger.LogError(e);
                }
            }

            try
            {
                SceneLoad?.Invoke(KoikatuAPI.Instance, new SceneLoadEventArgs(operation, readonlyDict));
            }
            catch (Exception e)
            {
                KoikatuAPI.Logger.LogError(e);
            }
        }
        private static Dictionary <int, ObjectCtrlInfo> GetLoadedObjects(SceneOperationKind operation)
        {
            Dictionary <int, ObjectCtrlInfo> results;

            switch (operation)
            {
            case SceneOperationKind.Load:
                results = global::Studio.Studio.Instance.dicObjectCtrl;
                break;

            case SceneOperationKind.Import:
                results = global::Studio.Studio.Instance.dicObjectCtrl
                          .Join(Hooks.ImportDictionary, pair => pair.Key, pair => pair.Key, (current, idLookup) => new { originalId = idLookup.Value, obj = current.Value })
                          .ToDictionary(x => x.originalId, x => x.obj);
                break;

            case SceneOperationKind.Clear:
                results = new Dictionary <int, ObjectCtrlInfo>();
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(operation), operation, null);
            }

            return(results);
        }
        protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
        {
            Studio.Studio studio = GetStudio();
            AIGraphics    parent = AIGraphics.Instance;

            parent?.SkyboxManager?.SetupDefaultReflectionProbe();
            parent?.PresetManager?.Load(GetExtendedData());
        }
Exemple #10
0
            protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
            {
                var controllers = FindObjectsOfType <ColliderController>();

                for (var i = 0; i < controllers.Length; i++)
                {
                    controllers[i].ApplyColliders();
                }
            }
Exemple #11
0
 protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
 {
     foreach (var kvp in loadedItems)
     {
         if (kvp.Value is OCIChar)
         {
             GetController(kvp.Value as OCIChar).LoadAnimations(kvp.Key, loadedItems);
         }
     }
 }
Exemple #12
0
        /// <summary>
        /// Read the extended save data and set the values of SliderSet or ToggleSet which will set the UI elements and trigger the setter method
        /// </summary>
        protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
        {
            if (operation == SceneOperationKind.Load)
            {
                var data = GetExtendedData();
                if (data?.data == null)
                {
                    ResetAll();
                }
                else
                {
                    if (data.data.TryGetValue("MapMasking", out var mapMasking) && mapMasking != null)
                    {
                        MapMasking.Value = (bool)mapMasking;
                    }
                    else
                    {
                        MapMasking.Reset();
                    }

                    if (data.data.TryGetValue("NearClipPlane", out var nearClipPlane) && nearClipPlane != null && (float)nearClipPlane != 0f)
                    {
                        NearClipPlane.Value = (float)nearClipPlane;
                    }
                    else
                    {
                        NearClipPlane.Reset();
                    }

                    if (data.data.TryGetValue("FarClipPlane", out var farClipPlane) && farClipPlane != null && (float)farClipPlane != 0f)
                    {
                        FarClipPlane.Value = (float)farClipPlane;
                    }
                    else
                    {
                        FarClipPlane.Reset();
                    }

                    if (data.data.TryGetValue("ShadowDistance", out var shadowDistance) && shadowDistance != null && (float)shadowDistance != 0f)
                    {
                        ShadowDistance.Value = (float)shadowDistance;
                    }
                    else
                    {
                        ShadowDistance.Reset();
                    }
                }
            }
            else if (operation == SceneOperationKind.Clear)
            {
                ResetAll();
            }
            //Do not import saved data, keep current settings
        }
            private static void SceneLoadComplete(SceneOperationKind operation)
            {
                LoadInProgress   = false;
                ImportInProgress = false;
                if (_loadOrImportSuccess || operation == SceneOperationKind.Clear)
                {
                    _loadOrImportSuccess = false;

                    OnSceneBeingLoaded(operation);
                }
            }
        protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
        {
            var extData = GetExtendedData();

            if (extData == null)
            {
                return;
            }

            if (operation == SceneOperationKind.Load && extData.data.TryGetValue(DictID, out var povRawData))
            {
                RealPOV.EnablePov(MessagePackSerializer.Deserialize <ScenePovData>((byte[])povRawData));
            }
        }
Exemple #15
0
        protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary<int, ObjectCtrlInfo> loadedItems)
        {
            if (operation == SceneOperationKind.Clear || operation == SceneOperationKind.Load)
                MaskingFolders = new Dictionary<int, OCIFolder>();

            if (operation == SceneOperationKind.Clear) return;

            var data = GetExtendedData();
            if (data != null)
                if (data.data.TryGetValue(nameof(MaskingFolders), out var folders) && folders != null)
                {
                    var folderList = MessagePackSerializer.Deserialize<List<int>>((byte[])folders);
                    for (var index = 0; index < folderList.Count; index++)
                    {
                        int folderIndex = folderList[index];
                        if (loadedItems.TryGetValue(folderIndex, out ObjectCtrlInfo oci))
                            if (oci is OCIFolder ociFolder)
                                AddColliderToFolder(ociFolder);
                    }
                }
        }
Exemple #16
0
            protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
            {
                //Dispose of any Frame texture when resetting the scene
                if (operation == SceneOperationKind.Clear)
                {
                    FrameTex?.Dispose();
                    FrameTex = null;
                    return;
                }

                //On loading or importing a scene, check if the item has any patterns that exist in the pattern folder and use MaterialEditor to handle these textures instead
                foreach (var loadedItem in loadedItems.Values)
                {
                    if (loadedItem is OCIItem item)
                    {
                        if (item?.itemComponent != null)
                        {
                            for (int i = 0; i < 3; i++)
                            {
                                string filePath = item.GetPatternPath(i);
                                SavePatternTex(item, i, filePath);
                            }
                        }

                        if (item?.panelComponent != null)
                        {
                            if (!item.itemInfo.panel.filePath.IsNullOrEmpty())
                            {
                                Logger.LogInfo($"bg:{item.itemInfo.panel.filePath}");
                            }
                            SaveBGTex(item, item.itemInfo.panel.filePath);
                        }
                    }
                }

                //On loading a scene load the saved frame texture, if any
                //Frames are not imported, only loaded
                if (operation == SceneOperationKind.Load)
                {
                    FrameTex?.Dispose();
                    FrameTex = null;

                    var data = GetExtendedData();
                    if (data?.data != null)
                    {
                        if (data.data.TryGetValue("FrameData", out var frameObj) && frameObj != null)
                        {
                            FrameTex = new TextureContainer((byte[])frameObj);
                        }
                    }

                    if (FrameTex != null)
                    {
                        var imageFrame = Traverse.Create(Studio.Studio.Instance.frameCtrl).Field("imageFrame").GetValue <RawImage>();
                        imageFrame.texture = FrameTex.Texture;
                        imageFrame.enabled = true;

                        var cameraUI = Traverse.Create(Studio.Studio.Instance.frameCtrl).Field("cameraUI").GetValue <Camera>();
                        cameraUI.enabled = true;
                    }
                }
            }
 protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
 {
     SceneConsole.Instance?.LoadPluginData(GetExtendedData());
 }
Exemple #18
0
            protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
            {
                var data = GetExtendedData();

                if (operation == SceneOperationKind.Clear || operation == SceneOperationKind.Load)
                {
                    RendererPropertyList.Clear();
                    MaterialFloatPropertyList.Clear();
                    MaterialColorPropertyList.Clear();
                    MaterialTexturePropertyList.Clear();
                    MaterialShaderList.Clear();
                    TextureDictionary.Clear();
                }

                if (data == null)
                {
                    return;
                }

                var importDictionary = new Dictionary <int, int>();

                if (operation == SceneOperationKind.Load)
                {
                    if (data.data.TryGetValue(nameof(TextureDictionary), out var texDic) && texDic != null)
                    {
                        TextureDictionary = MessagePackSerializer.Deserialize <Dictionary <int, byte[]> >((byte[])texDic);
                    }
                }

                if (operation == SceneOperationKind.Import)
                {
                    if (data.data.TryGetValue(nameof(TextureDictionary), out var texDic) && texDic != null)
                    {
                        foreach (var x in MessagePackSerializer.Deserialize <Dictionary <int, byte[]> >((byte[])texDic))
                        {
                            importDictionary[x.Key] = SetAndGetTextureID(x.Value);
                        }
                    }
                }

                if (operation == SceneOperationKind.Clear)
                {
                    return;
                }

                if (data.data.TryGetValue(nameof(MaterialShaderList), out var shaderProperties) && shaderProperties != null)
                {
                    foreach (var loadedProperty in MessagePackSerializer.Deserialize <List <MaterialShader> >((byte[])shaderProperties))
                    {
                        if (loadedItems.TryGetValue(loadedProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            bool setShader      = SetShader(ociItem.objectItem, loadedProperty.MaterialName, loadedProperty.ShaderName, ObjectType.StudioItem);
                            bool setRenderQueue = SetRenderQueue(ociItem.objectItem, loadedProperty.MaterialName, loadedProperty.RenderQueue, ObjectType.StudioItem);
                            if (setShader || setRenderQueue)
                            {
                                MaterialShaderList.Add(new MaterialShader(GetObjectID(objectCtrlInfo), loadedProperty.MaterialName, loadedProperty.ShaderName, loadedProperty.ShaderNameOriginal, loadedProperty.RenderQueue, loadedProperty.RenderQueueOriginal));
                            }
                        }
                    }
                }

                if (data.data.TryGetValue(nameof(RendererPropertyList), out var rendererProperties) && rendererProperties != null)
                {
                    foreach (var loadedProperty in MessagePackSerializer.Deserialize <List <RendererProperty> >((byte[])rendererProperties))
                    {
                        if (loadedItems.TryGetValue(loadedProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            if (SetRendererProperty(ociItem.objectItem, loadedProperty.RendererName, loadedProperty.Property, int.Parse(loadedProperty.Value), ObjectType.StudioItem))
                            {
                                RendererPropertyList.Add(new RendererProperty(GetObjectID(objectCtrlInfo), loadedProperty.RendererName, loadedProperty.Property, loadedProperty.Value, loadedProperty.ValueOriginal));
                            }
                        }
                    }
                }

                if (data.data.TryGetValue(nameof(MaterialFloatPropertyList), out var materialFloatProperties) && materialFloatProperties != null)
                {
                    foreach (var loadedProperty in MessagePackSerializer.Deserialize <List <MaterialFloatProperty> >((byte[])materialFloatProperties))
                    {
                        if (loadedItems.TryGetValue(loadedProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            if (SetFloatProperty(ociItem.objectItem, loadedProperty.MaterialName, loadedProperty.Property, loadedProperty.Value, ObjectType.StudioItem))
                            {
                                MaterialFloatPropertyList.Add(new MaterialFloatProperty(GetObjectID(objectCtrlInfo), loadedProperty.MaterialName, loadedProperty.Property, loadedProperty.Value, loadedProperty.ValueOriginal));
                            }
                        }
                    }
                }

                if (data.data.TryGetValue(nameof(MaterialColorPropertyList), out var materialColorProperties) && materialColorProperties != null)
                {
                    foreach (var loadedProperty in MessagePackSerializer.Deserialize <List <MaterialColorProperty> >((byte[])materialColorProperties))
                    {
                        if (loadedItems.TryGetValue(loadedProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            if (SetColorProperty(ociItem.objectItem, loadedProperty.MaterialName, loadedProperty.Property, loadedProperty.Value, ObjectType.StudioItem))
                            {
                                MaterialColorPropertyList.Add(new MaterialColorProperty(GetObjectID(objectCtrlInfo), loadedProperty.MaterialName, loadedProperty.Property, loadedProperty.Value, loadedProperty.ValueOriginal));
                            }
                        }
                    }
                }

                if (data.data.TryGetValue(nameof(MaterialTexturePropertyList), out var materialTextureProperties) && materialTextureProperties != null)
                {
                    foreach (var loadedProperty in MessagePackSerializer.Deserialize <List <MaterialTextureProperty> >((byte[])materialTextureProperties))
                    {
                        if (loadedItems.TryGetValue(loadedProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            int?texID = null;
                            if (operation == SceneOperationKind.Import)
                            {
                                if (loadedProperty.TexID != null)
                                {
                                    texID = importDictionary[(int)loadedProperty.TexID];
                                }
                            }
                            else
                            {
                                texID = loadedProperty.TexID;
                            }

                            MaterialTextureProperty newTextureProperty = new MaterialTextureProperty(GetObjectID(objectCtrlInfo), loadedProperty.MaterialName, loadedProperty.Property, texID, loadedProperty.Offset, loadedProperty.OffsetOriginal, loadedProperty.Scale, loadedProperty.ScaleOriginal);

                            bool setTex = false;
                            if (newTextureProperty.TexID != null)
                            {
                                setTex = SetTextureProperty(ociItem.objectItem, newTextureProperty.MaterialName, newTextureProperty.Property, newTextureProperty.Texture, ObjectType.StudioItem);
                            }

                            bool setOffset = SetTextureProperty(ociItem.objectItem, newTextureProperty.MaterialName, newTextureProperty.Property, TexturePropertyType.Offset, newTextureProperty.Offset, ObjectType.StudioItem);
                            bool setScale  = SetTextureProperty(ociItem.objectItem, newTextureProperty.MaterialName, newTextureProperty.Property, TexturePropertyType.Scale, newTextureProperty.Scale, ObjectType.StudioItem);

                            if (setTex || setOffset || setScale)
                            {
                                MaterialTexturePropertyList.Add(newTextureProperty);
                            }
                        }
                    }
                }
            }
Exemple #19
0
            protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
            {
                var data = GetExtendedData();

                if (operation == SceneOperationKind.Clear || operation == SceneOperationKind.Load)
                {
                    StudioItemRendererPropertyList.Clear();
                    StudioItemMaterialFloatPropertyList.Clear();
                    StudioItemMaterialColorPropertyList.Clear();
                }

                if (data == null)
                {
                    return;
                }

                if (data.data.TryGetValue("RendererProperties", out var rendererProperties) && rendererProperties != null)
                {
                    var loadedRendererProperties = MessagePackSerializer.Deserialize <List <RendererProperty> >((byte[])rendererProperties);

                    foreach (var loadedRendererProperty in loadedRendererProperties)
                    {
                        if (loadedItems.TryGetValue(loadedRendererProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            foreach (var renderer in ociItem.objectItem.GetComponentsInChildren <Renderer>())
                            {
                                if (renderer.NameFormatted() == loadedRendererProperty.RendererName)
                                {
                                    StudioItemRendererPropertyList.Add(new RendererProperty(GetObjectID(objectCtrlInfo), loadedRendererProperty.RendererName, loadedRendererProperty.Property, loadedRendererProperty.Value, loadedRendererProperty.ValueOriginal));
                                    SetRendererProperty(renderer, loadedRendererProperty.Property, int.Parse(loadedRendererProperty.Value));
                                }
                            }
                        }
                    }
                }

                if (data.data.TryGetValue("MaterialFloatProperties", out var materialFloatProperties) && materialFloatProperties != null)
                {
                    var loadedMaterialFloatProperties = MessagePackSerializer.Deserialize <List <MaterialFloatProperty> >((byte[])materialFloatProperties);

                    foreach (var loadedMaterialFloatProperty in loadedMaterialFloatProperties)
                    {
                        if (loadedItems.TryGetValue(loadedMaterialFloatProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            foreach (var rend in ociItem.objectItem.GetComponentsInChildren <Renderer>())
                            {
                                foreach (var mat in rend.materials)
                                {
                                    if (mat.HasProperty($"_{loadedMaterialFloatProperty.Property}") && FloatProperties.Contains(loadedMaterialFloatProperty.Property))
                                    {
                                        var valueOriginal = mat.GetFloat($"_{loadedMaterialFloatProperty.Property}").ToString();
                                        StudioItemMaterialFloatPropertyList.Add(new MaterialFloatProperty(GetObjectID(objectCtrlInfo), loadedMaterialFloatProperty.MaterialName, loadedMaterialFloatProperty.Property, loadedMaterialFloatProperty.Value, valueOriginal));
                                        SetFloatProperty(ociItem.objectItem, mat, loadedMaterialFloatProperty.Property, loadedMaterialFloatProperty.Value);
                                    }
                                }
                            }
                        }
                    }
                }

                if (data.data.TryGetValue("MaterialColorProperties", out var materialColorProperties) && materialColorProperties != null)
                {
                    var loadedMaterialColorProperties = MessagePackSerializer.Deserialize <List <MaterialColorProperty> >((byte[])materialColorProperties);

                    foreach (var loadedMaterialColorProperty in loadedMaterialColorProperties)
                    {
                        if (loadedItems.TryGetValue(loadedMaterialColorProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            foreach (var rend in ociItem.objectItem.GetComponentsInChildren <Renderer>())
                            {
                                foreach (var mat in rend.materials)
                                {
                                    if (mat.HasProperty($"_{loadedMaterialColorProperty.Property}") && ColorProperties.Contains(loadedMaterialColorProperty.Property))
                                    {
                                        var valueOriginal = mat.GetColor($"_{loadedMaterialColorProperty.Property}");
                                        StudioItemMaterialColorPropertyList.Add(new MaterialColorProperty(GetObjectID(objectCtrlInfo), loadedMaterialColorProperty.MaterialName, loadedMaterialColorProperty.Property, loadedMaterialColorProperty.Value, valueOriginal));
                                        SetColorProperty(ociItem.objectItem, mat, loadedMaterialColorProperty.Property, loadedMaterialColorProperty.Value);
                                    }
                                }
                            }
                        }
                    }
                }
            }
Exemple #20
0
 protected internal override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
 {
     Logger.Log(LogLevel.Warning | LogLevel.Message, $"OnSceneLoad {operation} - {loadedItems.Count}");
 }
Exemple #21
0
 /// <summary>
 /// Fired when a scene is successfully changed, either by loading, importing or resetting.
 /// </summary>
 /// <param name="operation">Operation that caused this event</param>
 /// <param name="loadedItems">A dictionary of items loaded by this operation and their original IDs.
 /// The IDs are identical to the IDs at the time of saving the scene, even during import.
 /// Warning: The IDs here might not be the same as IDs of the objects in the scene!
 /// To get current scene ID of the object call <see cref="StudioObjectExtensions.GetSceneId(ObjectCtrlInfo)"/></param>
 protected internal abstract void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems);
            protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
            {
                //Dispose of any textures when resetting the scene
                if (operation == SceneOperationKind.Clear)
                {
                    FrameTex?.Dispose();
                    FrameTex = null;
                    BGTex?.Dispose();
                    BGTex = null;
                    return;
                }

                //On loading or importing a scene, check if the item has any patterns that exist in the pattern folder and use MaterialEditor to handle these textures instead
                foreach (var loadedItem in loadedItems.Values)
                {
                    if (loadedItem is OCIItem item)
                    {
                        if (item.itemComponent != null)
                        {
                            for (int i = 0; i < 3; i++)
                            {
                                string filePath = item.GetPatternPath(i);
                                SavePatternTex(item, i, filePath);
                            }
                        }

                        if (item.panelComponent != null)
                        {
                            SaveBGTex(item, item.itemInfo.panel.filePath);
                        }
                    }
                }

                //On loading a scene load the saved frame texture, if any
                //Frames and BGs are not imported, only loaded
                if (operation == SceneOperationKind.Load)
                {
                    FrameTex?.Dispose();
                    FrameTex = null;
                    BGTex?.Dispose();
                    BGTex = null;

                    var data = GetExtendedData();
                    if (data?.data != null)
                    {
                        if (data.data.TryGetValue("FrameData", out var frameObj) && frameObj != null)
                        {
                            FrameTex = new TextureContainer((byte[])frameObj);
                        }
                        if (data.data.TryGetValue("BGData", out var bgObj) && bgObj != null)
                        {
                            BGTex = new TextureContainer((byte[])bgObj);
                        }
                    }

                    if (FrameTex != null)
                    {
                        var imageFrame = Traverse.Create(Studio.Studio.Instance.frameCtrl).Field("imageFrame").GetValue <RawImage>();
                        imageFrame.texture = FrameTex.Texture;
                        imageFrame.enabled = true;

                        var cameraUI = Traverse.Create(Studio.Studio.Instance.frameCtrl).Field("cameraUI").GetValue <Camera>();
                        cameraUI.enabled = true;
                    }

                    if (BGTex != null)
                    {
                        BackgroundCtrl m_BackgroundCtrl = Traverse.Create(Studio.Studio.Instance).Field("m_BackgroundCtrl").GetValue <BackgroundCtrl>();
                        MeshRenderer   meshRenderer     = Traverse.Create(m_BackgroundCtrl).Field("meshRenderer").GetValue <MeshRenderer>();

                        meshRenderer.material.SetTexture("_MainTex", BGTex.Texture);
                        m_BackgroundCtrl.isVisible = true;
                    }
                }
            }
            protected override void OnSceneLoad(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedItems)
            {
                var data = GetExtendedData();

                if (operation == SceneOperationKind.Clear || operation == SceneOperationKind.Load)
                {
                    RendererPropertyList.Clear();
                    MaterialFloatPropertyList.Clear();
                    MaterialColorPropertyList.Clear();
                    MaterialTexturePropertyList.Clear();
                    TextureDictionary.Clear();
                }

                if (data == null)
                {
                    return;
                }

                var importDictionary = new Dictionary <int, int>();

                if (operation == SceneOperationKind.Load)
                {
                    if (data.data.TryGetValue(nameof(TextureDictionary), out var texDic) && texDic != null)
                    {
                        TextureDictionary = MessagePackSerializer.Deserialize <Dictionary <int, byte[]> >((byte[])texDic);
                    }
                }
                else if (operation == SceneOperationKind.Import)
                {
                    if (data.data.TryGetValue(nameof(TextureDictionary), out var texDic) && texDic != null)
                    {
                        Dictionary <int, byte[]> importTextureDictionary = MessagePackSerializer.Deserialize <Dictionary <int, byte[]> >((byte[])texDic);

                        foreach (var x in importTextureDictionary)
                        {
                            importDictionary[x.Key] = SetAndGetTextureID(x.Value);
                        }
                    }
                }
                else if (operation == SceneOperationKind.Clear)
                {
                    return;
                }

                if (data.data.TryGetValue(nameof(RendererPropertyList), out var rendererProperties) && rendererProperties != null)
                {
                    var loadedRendererProperties = MessagePackSerializer.Deserialize <List <RendererProperty> >((byte[])rendererProperties);

                    foreach (var loadedRendererProperty in loadedRendererProperties)
                    {
                        if (loadedItems.TryGetValue(loadedRendererProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            foreach (var renderer in ociItem.objectItem.GetComponentsInChildren <Renderer>())
                            {
                                if (renderer.NameFormatted() == loadedRendererProperty.RendererName)
                                {
                                    RendererPropertyList.Add(new RendererProperty(GetObjectID(objectCtrlInfo), loadedRendererProperty.RendererName, loadedRendererProperty.Property, loadedRendererProperty.Value, loadedRendererProperty.ValueOriginal));
                                    SetRendererProperty(renderer, loadedRendererProperty.Property, int.Parse(loadedRendererProperty.Value));
                                }
                            }
                        }
                    }
                }

                if (data.data.TryGetValue(nameof(MaterialFloatPropertyList), out var materialFloatProperties) && materialFloatProperties != null)
                {
                    var loadedMaterialFloatProperties = MessagePackSerializer.Deserialize <List <MaterialFloatProperty> >((byte[])materialFloatProperties);

                    foreach (var loadedMaterialFloatProperty in loadedMaterialFloatProperties)
                    {
                        if (loadedItems.TryGetValue(loadedMaterialFloatProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            foreach (var rend in ociItem.objectItem.GetComponentsInChildren <Renderer>())
                            {
                                foreach (var mat in rend.materials)
                                {
                                    if (mat.NameFormatted() == loadedMaterialFloatProperty.MaterialName && mat.HasProperty($"_{loadedMaterialFloatProperty.Property}") && FloatProperties.Contains(loadedMaterialFloatProperty.Property))
                                    {
                                        var valueOriginal = mat.GetFloat($"_{loadedMaterialFloatProperty.Property}").ToString();
                                        MaterialFloatPropertyList.Add(new MaterialFloatProperty(GetObjectID(objectCtrlInfo), loadedMaterialFloatProperty.MaterialName, loadedMaterialFloatProperty.Property, loadedMaterialFloatProperty.Value, valueOriginal));
                                        SetFloatProperty(ociItem.objectItem, mat, loadedMaterialFloatProperty.Property, loadedMaterialFloatProperty.Value, ObjectType.StudioItem);
                                    }
                                }
                            }
                        }
                    }
                }

                if (data.data.TryGetValue(nameof(MaterialColorPropertyList), out var materialColorProperties) && materialColorProperties != null)
                {
                    var loadedMaterialColorProperties = MessagePackSerializer.Deserialize <List <MaterialColorProperty> >((byte[])materialColorProperties);

                    foreach (var loadedMaterialColorProperty in loadedMaterialColorProperties)
                    {
                        if (loadedItems.TryGetValue(loadedMaterialColorProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            foreach (var rend in ociItem.objectItem.GetComponentsInChildren <Renderer>())
                            {
                                foreach (var mat in rend.materials)
                                {
                                    if (mat.NameFormatted() == loadedMaterialColorProperty.MaterialName && mat.HasProperty($"_{loadedMaterialColorProperty.Property}") && ColorProperties.Contains(loadedMaterialColorProperty.Property))
                                    {
                                        var valueOriginal = mat.GetColor($"_{loadedMaterialColorProperty.Property}");
                                        MaterialColorPropertyList.Add(new MaterialColorProperty(GetObjectID(objectCtrlInfo), loadedMaterialColorProperty.MaterialName, loadedMaterialColorProperty.Property, loadedMaterialColorProperty.Value, valueOriginal));
                                        SetColorProperty(ociItem.objectItem, mat, loadedMaterialColorProperty.Property, loadedMaterialColorProperty.Value, ObjectType.StudioItem);
                                    }
                                }
                            }
                        }
                    }
                }

                if (data.data.TryGetValue(nameof(MaterialTexturePropertyList), out var materialTextureProperties) && materialTextureProperties != null)
                {
                    var loadedMaterialTextureProperties = MessagePackSerializer.Deserialize <List <MaterialTextureProperty> >((byte[])materialTextureProperties);

                    foreach (var loadedMaterialTextureProperty in loadedMaterialTextureProperties)
                    {
                        if (loadedItems.TryGetValue(loadedMaterialTextureProperty.ID, out ObjectCtrlInfo objectCtrlInfo) && objectCtrlInfo is OCIItem ociItem)
                        {
                            foreach (var rend in ociItem.objectItem.GetComponentsInChildren <Renderer>())
                            {
                                foreach (var mat in rend.materials)
                                {
                                    if (mat.NameFormatted() == loadedMaterialTextureProperty.MaterialName && mat.HasProperty($"_{loadedMaterialTextureProperty.Property}") && TextureProperties.Contains(loadedMaterialTextureProperty.Property))
                                    {
                                        int texID = operation == SceneOperationKind.Import ? importDictionary[loadedMaterialTextureProperty.TexID] : loadedMaterialTextureProperty.TexID;
                                        MaterialTextureProperty newTextureProperty = new MaterialTextureProperty(GetObjectID(objectCtrlInfo), loadedMaterialTextureProperty.MaterialName, loadedMaterialTextureProperty.Property, texID);
                                        MaterialTexturePropertyList.Add(newTextureProperty);
                                        SetTextureProperty(ociItem.objectItem, mat, newTextureProperty.Property, newTextureProperty.Texture, ObjectType.StudioItem);
                                    }
                                }
                            }
                        }
                    }
                }
            }
Exemple #24
0
 /// <inheritdoc />
 /// <param name="operation">Operation that caused the event</param>
 /// <param name="loadedObjects">Objects loaded by the event</param>
 public SceneLoadEventArgs(SceneOperationKind operation, ReadOnlyDictionary <int, ObjectCtrlInfo> loadedObjects)
 {
     Operation     = operation;
     LoadedObjects = loadedObjects;
 }