Exemple #1
0
 /// <summary>
 /// De-compress the data to general Live2D model files
 /// </summary>
 /// <param name="data">file json file</param>
 /// <returns>Decomplessed model data with CompressedLive2D</returns>
 public CompressedLive2D DeCompress(string data)
 {
     try
     {
         CompressedLive2D profile = JsonUtility.FromJson <CompressedLive2D>(data);
         return(profile);
     }
     catch (Exception e)
     {
         throw e;
     }
 }
Exemple #2
0
        /// <summary>
        /// Moad model information from de compressed data
        /// </summary>
        /// <param name="data">Compressed byte data</param>
        public void LoadModelFromCompressor(byte[] data)
        {
            //set compressor
            var compressor = new ModelCompressor();
            var modelData  = new CompressedLive2D(compressor.DeCompress(Encoding.UTF8.GetString(data)));

            if (modelData != null)
            {
                //Load models
                ToModel(modelData);
            }
        }
Exemple #3
0
        /// <summary>
        /// Moad model information from de compressed data
        /// </summary>
        /// <param name="data">Compressed data</param>
        public void LoadModelFromCompressor(string data)
        {
            //set compressor
            var compressor = new ModelCompressor();
            var modelData  = new CompressedLive2D(compressor.DeCompress(data));

            if (modelData != null)
            {
                //Load models
                ToModel(modelData);
            }
        }
Exemple #4
0
        /// <summary>
        /// compress the Live2D model files
        /// </summary>
        public async Task <string> CompressAsync(string path)
        {
            //read model json file to get other data path

            string directoryPath = Path.GetDirectoryName(path);

            Debug.Log(path);

            CubismModel3Json datas;
            string           modelJson = "";

            try
            {
                using (var reader = new StreamReader(path))
                {
                    modelJson = reader.ReadToEnd();
                    Debug.Log(modelJson);
                    datas = JsonUtility.FromJson <CubismModel3Json>(modelJson);
                    Debug.Log("version : " + datas.Version);
                    Debug.Log("Moc : " + datas.FileReferences.Moc);
                    foreach (string a in datas.FileReferences.Textures)
                    {
                        Debug.Log("Texture : " + a);
                    }
                    Debug.Log("Physics : " + datas.FileReferences.Physics);
                }
            }
            catch (Exception e)
            {
                Debug.Log("Error in load model3Json");
                Debug.Log(e);
                return(null);
            }


            //collect the texture datas
            List <TextureImage> textures = new List <TextureImage>();

            try
            {
                const int MegaByte = 1024 * 1024;
                foreach (string target in datas.FileReferences.Textures)
                {
                    //check the file size of texture
                    FileInfo fi = new FileInfo(directoryPath + "/" + target);

                    Debug.Log("file size : " + fi.Length);
                    //when file size under the 500MB add it
                    if (fi.Length < 500 * MegaByte)
                    {
                        //Open file
                        using (FileStream fs = new FileStream(directoryPath + "/" + target, FileMode.Open, FileAccess.Read))
                        {
                            //make the byte array for file size
                            var bs = new byte[fs.Length];
                            //read all of file
                            fs.Read(bs, 0, bs.Length);
                            string base64String = Convert.ToBase64String(bs);
                            // add data to class
                            textures.Add(new TextureImage(fi.Name, base64String));
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Debug.Log("Error in load texture");
                Debug.Log(e);
                return(null);
            }


            //convert moc3 file
            string file = "";

            try
            {
                using (var fs = new FileStream(directoryPath + "/" + datas.FileReferences.Moc, FileMode.Open, FileAccess.Read))
                {
                    //make the byte array for file size
                    var fileData = new byte[fs.Length];
                    //read all of file
                    fs.Read(fileData, 0, fileData.Length);
                    file = Convert.ToBase64String(fileData);
                }
            }
            catch (Exception e)
            {
                Debug.Log("Error in load moc3 file");
                Debug.Log(e);
                return(null);
            }


            //physics3json
            string physicsJson = "";

            try
            {
                using (var reader = new StreamReader(directoryPath + "/" + datas.FileReferences.Physics))
                {
                    await Task.Run(() =>
                    {
                        physicsJson = Utility.RemoveChars(reader.ReadToEnd(), new char[] { '\r', '\n', '\t' });
                    });
                }
            }
            catch (Exception e)
            {
                Debug.Log("Error in load physics3Json");
                Debug.Log(e);
            }

            string userJson = "";

            try
            {
                using (var reader = new StreamReader(directoryPath + "/" + datas.FileReferences.UserData))
                {
                    await Task.Run(() =>
                    {
                        userJson = Utility.RemoveChars(reader.ReadToEnd(), new char[] { '\r', '\n', '\t' });
                    });
                }
            }
            catch (Exception e)
            {
                Debug.Log("Error in load physics3Json");
                Debug.Log(e);
            }

            var mergedFile = new CompressedLive2D(file, textures, modelJson, physicsJson, userJson);

            return(JsonUtility.ToJson(mergedFile, true));
        }
Exemple #5
0
        public CubismModel ToModel(MaterialPicker pickMaterial, TexturePicker pickTexture,
                                   CompressedLive2D current, bool shouldImportAsOriginalWorkflow = false)
        {
            // Initialize model source and instantiate it.
            var mocAsBytes = Convert.FromBase64String(current.MocFile);

            if (mocAsBytes == null)
            {
                return(null);
            }

            var moc   = CubismMoc.CreateFrom(mocAsBytes);
            var model = CubismModel.InstantiateFrom(moc);

            //init CubismModel3Json
            var modelJson  = JsonUtility.FromJson <CubismModel3Json>(current.Model3Json);
            var references = modelJson.FileReferences;

            model.name = references.Moc.Replace(".moc3", "");
            model.tag  = "Player";

            //make the texture 2D for attach the model data
            var modelTextures = new Texture2D[references.Textures.Length];

            for (int index = 0; index < references.Textures.Length; index++)
            {
                modelTextures[index] = ReadPng(current.Textures[index].imageData);
            }

#if UNITY_EDITOR
            // Add parameters and parts inspectors.
            model.gameObject.AddComponent <CubismParametersInspector>();
            model.gameObject.AddComponent <CubismPartsInspector>();
#endif

            // Create renderers.
            var rendererController = model.gameObject.AddComponent <CubismRenderController>();
            var renderers          = rendererController.Renderers;
            var drawables          = model.Drawables;

            // Initialize materials.
            for (var i = 0; i < renderers.Length; ++i)
            {
                renderers[i].Material = pickMaterial(modelJson, drawables[i]);
            }

            // Initialize textures.
            for (var i = 0; i < renderers.Length; ++i)
            {
                renderers[i].MainTexture = pickTexture(current, drawables[i], modelTextures);
            }
            rendererController.SortingMode = CubismSortingMode.BackToFrontOrder;

            // Initialize drawables.
            if (modelJson.HitAreas != null)
            {
                for (var i = 0; i < modelJson.HitAreas.Length; i++)
                {
                    for (var j = 0; j < drawables.Length; j++)
                    {
                        if (drawables[j].Id == modelJson.HitAreas[i].Id)
                        {
                            // Add components for hit judgement to HitArea target Drawables.
                            var hitDrawable = drawables[j].gameObject.AddComponent <CubismHitDrawable>();
                            hitDrawable.Name = modelJson.HitAreas[i].Name;

                            drawables[j].gameObject.AddComponent <CubismRaycastable>();
                            break;
                        }
                    }
                }
            }

            // Initialize groups.
            var parameters = model.Parameters;

            for (var i = 0; i < parameters.Length; ++i)
            {
                if (IsParameterInGroup(modelJson, parameters[i], "EyeBlink"))
                {
                    if (model.gameObject.GetComponent <CubismEyeBlinkController>() == null)
                    {
                        model.gameObject.AddComponent <CubismEyeBlinkController>();
                    }


                    parameters[i].gameObject.AddComponent <CubismEyeBlinkParameter>();
                }

                // Set up mouth parameters.
                if (IsParameterInGroup(modelJson, parameters[i], "LipSync"))
                {
                    if (model.gameObject.GetComponent <CubismMouthController>() == null)
                    {
                        model.gameObject.AddComponent <CubismMouthController>();
                    }


                    parameters[i].gameObject.AddComponent <CubismMouthParameter>();
                }
            }

            // Add mask controller if required.
            for (var i = 0; i < drawables.Length; ++i)
            {
                if (!drawables[i].IsMasked)
                {
                    continue;
                }

                // Add controller exactly once...
                model.gameObject.AddComponent <CubismMaskController>();

                break;
            }

            // Add original workflow component if is original workflow.
            if (shouldImportAsOriginalWorkflow)
            {
                // Add cubism update manager.
                var updateaManager = model.gameObject.GetComponent <CubismUpdateController>();

                if (updateaManager == null)
                {
                    model.gameObject.AddComponent <CubismUpdateController>();
                }

                // Add parameter store.
                var parameterStore = model.gameObject.GetComponent <CubismParameterStore>();

                if (parameterStore == null)
                {
                    parameterStore = model.gameObject.AddComponent <CubismParameterStore>();
                }

                // Add pose controller.
                var poseController = model.gameObject.GetComponent <CubismPoseController>();

                if (poseController == null)
                {
                    poseController = model.gameObject.AddComponent <CubismPoseController>();
                }

                // Add expression controller.
                var expressionController = model.gameObject.GetComponent <CubismExpressionController>();

                if (expressionController == null)
                {
                    expressionController = model.gameObject.AddComponent <CubismExpressionController>();
                }

                // Add fade controller.
                var motionFadeController = model.gameObject.GetComponent <CubismFadeController>();

                if (motionFadeController == null)
                {
                    motionFadeController = model.gameObject.AddComponent <CubismFadeController>();
                }
            }

            // Initialize physics if JSON exists.
            string physics3JsonAsString = current.Physics3Json;


            if (!string.IsNullOrEmpty(physics3JsonAsString))
            {
                var physics3Json      = CubismPhysics3Json.LoadFrom(physics3JsonAsString);
                var physicsController = model.gameObject.GetComponent <CubismPhysicsController>();

                if (physicsController == null)
                {
                    physicsController = model.gameObject.AddComponent <CubismPhysicsController>();
                }

                physicsController.Initialize(physics3Json.ToRig());
            }

            string userData3JsonAsString = current.UserData3Json;

            if (!string.IsNullOrEmpty(userData3JsonAsString))
            {
                var userData3Json = CubismUserData3Json.LoadFrom(userData3JsonAsString);


                var drawableBodies = userData3Json.ToBodyArray(CubismUserDataTargetType.ArtMesh);

                for (var i = 0; i < drawables.Length; ++i)
                {
                    var index = GetBodyIndexById(drawableBodies, drawables[i].Id);

                    if (index >= 0)
                    {
                        var tag = drawables[i].gameObject.GetComponent <CubismUserDataTag>();


                        if (tag == null)
                        {
                            tag = drawables[i].gameObject.AddComponent <CubismUserDataTag>();
                        }


                        tag.Initialize(drawableBodies[index]);
                    }
                }
            }

            if (model.gameObject.GetComponent <Animator>() == null)
            {
                model.gameObject.AddComponent <Animator>();
            }

            // Make sure model is 'fresh'
            model.ForceUpdateNow();

            return(model);
        }
Exemple #6
0
 public CubismModel ToModel(CompressedLive2D model, bool shouldImportAsOriginalWorkflow = false)
 {
     return(ToModel(CubismBuiltinPickers.MaterialPicker, ModelDataPicker.TexturePicker,
                    model, shouldImportAsOriginalWorkflow));
 }
Exemple #7
0
        /// <summary>
        /// Builtin <see cref="Texture2D"/> picker.
        /// </summary>
        /// <param name="compressedLive2D">model file.</param>
        /// <param name="drawable">Drawable to map to.</param>
        /// <param name="modelTextures">Loaded Live2D model textures</param>
        /// <returns>Mapped texture.</returns>

        public static Texture2D TexturePicker(CompressedLive2D compressedLive2D, CubismDrawable drawable, Texture2D[] modelTextures)
        {
            var index = drawable.TextureIndex;

            return(modelTextures[index]);
        }