Esempio n. 1
0
        protected void EnsureUMADataSetup(UMAData umaData)
        {
            if (umaData.umaRoot == null)
            {
                GameObject newRoot = new GameObject("Root");
                newRoot.transform.parent        = umaData.transform;
                newRoot.transform.localPosition = Vector3.zero;
                newRoot.transform.localRotation = Quaternion.Euler(270f, 0, 0f);
                umaData.umaRoot = newRoot;

                GameObject newGlobal = new GameObject("Global");
                newGlobal.transform.parent        = newRoot.transform;
                newGlobal.transform.localPosition = Vector3.zero;
                newGlobal.transform.localRotation = Quaternion.Euler(90f, 90f, 0f);

                umaData.skeleton = new UMASkeleton(newGlobal.transform);

                var newRenderer = umaData.umaRoot.AddComponent <SkinnedMeshRenderer>();
                newRenderer.rootBone          = newGlobal.transform;
                umaData.myRenderer            = newRenderer;
                umaData.myRenderer.enabled    = false;
                umaData.myRenderer.sharedMesh = new Mesh();
            }
            else
            {
                umaData.CleanMesh(false);
            }
        }
Esempio n. 2
0
        protected void EnsureUMADataSetup(UMAData umaData)
        {
            if (umaData.umaRoot == null)
            {
                GameObject newRoot = new GameObject("Root");
                newRoot.transform.parent        = umaData.transform;
                newRoot.transform.localPosition = Vector3.zero;
                newRoot.transform.localRotation = Quaternion.Euler(270f, 0, 0f);
                umaData.umaRoot = newRoot;

                GameObject newGlobal = new GameObject("Global");
                newGlobal.transform.parent        = newRoot.transform;
                newGlobal.transform.localPosition = Vector3.zero;
                newGlobal.transform.localRotation = Quaternion.Euler(90f, 90f, 0f);

                umaData.skeleton = new UMASkeleton(newGlobal.transform);

                var newRenderer = umaData.umaRoot.AddComponent <SkinnedMeshRenderer>();
                newRenderer.rootBone             = newGlobal.transform;
                newRenderer.shadowCastingMode    = UnityEngine.Rendering.ShadowCastingMode.Off;
                newRenderer.receiveShadows       = false;
                newRenderer.useLightProbes       = false;
                newRenderer.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
                umaData.myRenderer            = newRenderer;
                umaData.myRenderer.enabled    = false;
                umaData.myRenderer.sharedMesh = new Mesh();
            }
            else
            {
                umaData.CleanMesh(false);
            }
        }
Esempio n. 3
0
 /// <summary>
 /// Hide the avatar and clean up its components.
 /// </summary>
 public virtual void Hide()
 {
     if (umaData != null)
     {
         umaData.CleanTextures();
         umaData.CleanMesh(true);
         umaData.CleanAvatar();
         Destroy(umaData.umaRoot);
         umaData.umaRoot = null;
         umaData.SetRenderers(null);
         umaData.animator  = null;
         umaData.firstBake = true;
         umaData.skeleton  = null;
     }
     umaRace = null;
 }
Esempio n. 4
0
 /// <summary>
 /// Hide the avatar and clean up its components.
 /// </summary>
 public virtual void Hide(bool DestroyRoot = true)
 {
     if (umaData != null)
     {
         umaData.CleanTextures();
         umaData.CleanMesh(true);
         umaData.CleanAvatar();
         if (DestroyRoot)
         {
             UMAUtils.DestroySceneObject(umaData.umaRoot);
             umaData.umaRoot  = null;
             umaData.skeleton = null;
         }
         umaData.SetRenderers(null);
         umaData.animator  = null;
         umaData.firstBake = true;
     }
     umaRace = null;
 }
Esempio n. 5
0
        protected void EnsureUMADataSetup(UMAData umaData)
        {
            if (umaData.umaRoot == null)
            {
                GameObject newRoot = new GameObject("Root");
                //make root of the UMAAvatar respect the layer setting of the UMAAvatar so cameras can just target this layer
                newRoot.layer                   = umaData.gameObject.layer;
                newRoot.transform.parent        = umaData.transform;
                newRoot.transform.localPosition = Vector3.zero;
                newRoot.transform.localRotation = Quaternion.Euler(270f, 0, 0f);
                newRoot.transform.localScale    = Vector3.one;
                umaData.umaRoot                 = newRoot;

                GameObject newGlobal = new GameObject("Global");
                newGlobal.transform.parent        = newRoot.transform;
                newGlobal.transform.localPosition = Vector3.zero;
                newGlobal.transform.localRotation = Quaternion.Euler(90f, 90f, 0f);

                GameObject newSMRGO = new GameObject("UMARenderer");
                //make UMARenderer GO respect the layer setting of the UMAAvatar so cameras can just target this layer
                newSMRGO.layer                   = umaData.gameObject.layer;
                newSMRGO.transform.parent        = umaData.transform;
                newSMRGO.transform.localPosition = Vector3.zero;
                newSMRGO.transform.localRotation = Quaternion.Euler(0, 0, 0f);
                newSMRGO.transform.localScale    = Vector3.one;

                umaData.skeleton = new UMASkeleton(newGlobal.transform);

                var newRenderer = newSMRGO.AddComponent <SkinnedMeshRenderer>();
                newRenderer.rootBone          = newGlobal.transform;
                umaData.myRenderer            = newRenderer;
                umaData.myRenderer.enabled    = false;
                umaData.myRenderer.sharedMesh = new Mesh();
            }
            else
            {
                umaData.CleanMesh(false);
            }
        }
Esempio n. 6
0
        protected void EnsureUMADataSetup(UMAData umaData)
        {
            if (umaData.umaRoot == null)
            {
                GameObject newRoot = new GameObject("Root");
                //make root of the UMAAvatar respect the layer setting of the UMAAvatar so cameras can just target this layer
                newRoot.layer                   = umaData.gameObject.layer;
                newRoot.transform.parent        = umaData.transform;
                newRoot.transform.localPosition = Vector3.zero;
                newRoot.transform.localRotation = Quaternion.Euler(270f, 0, 0f);
                newRoot.transform.localScale    = Vector3.one;
                umaData.umaRoot                 = newRoot;

                GameObject newGlobal = new GameObject("Global");
                newGlobal.transform.parent        = newRoot.transform;
                newGlobal.transform.localPosition = Vector3.zero;
                newGlobal.transform.localRotation = Quaternion.Euler(90f, 90f, 0f);

                umaData.skeleton = new UMASkeleton(newGlobal.transform);

                renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererCount];

                for (int i = 0; i < umaData.generatedMaterials.rendererCount; i++)
                {
                    renderers[i] = MakeRenderer(i, newGlobal.transform);
                }
                umaData.SetRenderers(renderers);
            }
            else
            {
                umaData.CleanMesh(false);
                if (umaData.rendererCount == umaData.generatedMaterials.rendererCount)
                {
                    renderers = umaData.GetRenderers();
                }
                else
                {
                    var oldRenderers    = umaData.GetRenderers();
                    var globalTransform = umaData.GetGlobalTransform();

                    renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererCount];

                    for (int i = 0; i < umaData.generatedMaterials.rendererCount; i++)
                    {
                        if (oldRenderers != null && oldRenderers.Length > i)
                        {
                            renderers[i] = oldRenderers[i];
                            continue;
                        }
                        renderers[i] = MakeRenderer(i, globalTransform);
                    }

                    if (oldRenderers != null)
                    {
                        for (int i = umaData.generatedMaterials.rendererCount; i < oldRenderers.Length; i++)
                        {
                            Destroy(oldRenderers[i].gameObject);
                            //For cloth, be aware of issue: 845868
                            //https://issuetracker.unity3d.com/issues/cloth-repeatedly-destroying-objects-with-cloth-components-causes-a-crash-in-unity-cloth-updatenormals
                        }
                    }
                    umaData.SetRenderers(renderers);
                }
            }
        }
Esempio n. 7
0
        protected void EnsureUMADataSetup(UMAData umaData)
        {
            if (umaData.umaRecipe != null)
            {
                umaData.umaRecipe.UpdateMeshHideMasks();
            }

            if (umaData.umaRoot != null)
            {
                umaData.CleanMesh(false);
                if (umaData.rendererCount == umaData.generatedMaterials.rendererAssets.Count && umaData.AreRenderersEqual(umaData.generatedMaterials.rendererAssets))
                {
                    renderers = umaData.GetRenderers();
                }
                else
                {
                    var oldRenderers    = umaData.GetRenderers();
                    var globalTransform = umaData.GetGlobalTransform();

                    renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererAssets.Count];

                    for (int i = 0; i < umaData.generatedMaterials.rendererAssets.Count; i++)
                    {
                        if (oldRenderers != null && oldRenderers.Length > i)
                        {
                            renderers[i] = oldRenderers[i];
                            if (umaData.generatedMaterials.rendererAssets[i] != null)
                            {
                                umaData.generatedMaterials.rendererAssets[i].ApplySettingsToRenderer(renderers[i]);
                            }
                            else
                            {
                                umaData.ResetRendererSettings(i);
                            }

                            continue;
                        }
                        UMARendererAsset rendererAsset = umaData.generatedMaterials.rendererAssets[i];
                        if (rendererAsset == null)
                        {
                            rendererAsset = umaData.defaultRendererAsset;
                        }

                        renderers[i] = MakeRenderer(i, globalTransform, rendererAsset);
                    }

                    if (oldRenderers != null)
                    {
                        for (int i = umaData.generatedMaterials.rendererAssets.Count; i < oldRenderers.Length; i++)
                        {
                            DestroyImmediate(oldRenderers[i].gameObject);
                            //For cloth, be aware of issue: 845868
                            //https://issuetracker.unity3d.com/issues/cloth-repeatedly-destroying-objects-with-cloth-components-causes-a-crash-in-unity-cloth-updatenormals
                        }
                    }
                    umaData.SetRenderers(renderers);
                    umaData.SetRendererAssets(umaData.generatedMaterials.rendererAssets.ToArray());
                }
                return;
            }

            if (umaData.umaRoot == null)
            {
                Transform rootTransform = umaData.gameObject.transform.Find("Root");
                if (rootTransform)
                {
                    umaData.umaRoot = rootTransform.gameObject;
                }
                else
                {
                    GameObject newRoot = new GameObject("Root");
                    //make root of the UMAAvatar respect the layer setting of the UMAAvatar so cameras can just target this layer
                    newRoot.layer                   = umaData.gameObject.layer;
                    newRoot.transform.parent        = umaData.transform;
                    newRoot.transform.localPosition = Vector3.zero;
                    newRoot.transform.localRotation = Quaternion.Euler(270f, 0, 0f);
                    newRoot.transform.localScale    = Vector3.one;
                    umaData.umaRoot                 = newRoot;
                }

                Transform globalTransform = umaData.umaRoot.transform.Find("Global");
                if (!globalTransform)
                {
                    GameObject newGlobal = new GameObject("Global");
                    newGlobal.transform.parent        = umaData.umaRoot.transform;
                    newGlobal.transform.localPosition = Vector3.zero;
                    newGlobal.transform.localRotation = Quaternion.Euler(90f, 90f, 0f);

                    globalTransform = newGlobal.transform;
                }

                umaData.skeleton = new UMASkeleton(globalTransform);

                renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererAssets.Count];

                for (int i = 0; i < umaData.generatedMaterials.rendererAssets.Count; i++)
                {
                    UMARendererAsset rendererAsset = umaData.generatedMaterials.rendererAssets[i];
                    if (rendererAsset == null)
                    {
                        rendererAsset = umaData.defaultRendererAsset;
                    }

                    renderers[i] = MakeRenderer(i, globalTransform, rendererAsset);
                }
                umaData.SetRenderers(renderers);
                umaData.SetRendererAssets(umaData.generatedMaterials.rendererAssets.ToArray());
            }

            //Clear out old cloth components
            for (int i = 0; i < umaData.rendererCount; i++)
            {
                Cloth cloth = renderers[i].GetComponent <Cloth>();
                if (cloth != null)
                {
                    DestroyImmediate(cloth, false);                    //Crashes if trying to use Destroy()
                }
            }
        }
        protected void EnsureUMADataSetup(UMAData umaData)
        {
            if (umaData.umaRecipe != null)
            {
                umaData.umaRecipe.UpdateMeshHideMasks();
            }

            #region SetupSkeleton
            // First, ensure that the skeleton is setup, and if not,
            // then generate the root, global and set it up.
            if (umaData.umaRoot == null)
            {
                umaData.SetupSkeleton();
            }
            #endregion
            if (umaData.umaRoot != null)
            {
                umaData.CleanMesh(false);
                if (umaData.rendererCount == umaData.generatedMaterials.rendererAssets.Count && umaData.AreRenderersEqual(umaData.generatedMaterials.rendererAssets))
                {
                    renderers = umaData.GetRenderers();
                }
                else
                {
                    var oldRenderers    = umaData.GetRenderers();
                    var globalTransform = umaData.GetGlobalTransform();

                    renderers = new SkinnedMeshRenderer[umaData.generatedMaterials.rendererAssets.Count];

                    for (int i = 0; i < umaData.generatedMaterials.rendererAssets.Count; i++)
                    {
                        if (oldRenderers != null && oldRenderers.Length > i)
                        {
                            renderers[i] = oldRenderers[i];
                            if (umaData.generatedMaterials.rendererAssets[i] != null)
                            {
                                umaData.generatedMaterials.rendererAssets[i].ApplySettingsToRenderer(renderers[i]);
                            }
                            else
                            {
                                umaData.ResetRendererSettings(i);
                            }

                            continue;
                        }
                        UMARendererAsset rendererAsset = umaData.generatedMaterials.rendererAssets[i];
                        if (rendererAsset == null)
                        {
                            rendererAsset = umaData.defaultRendererAsset;
                        }

                        renderers[i] = MakeRenderer(i, globalTransform, rendererAsset);
                    }

                    if (oldRenderers != null)
                    {
                        for (int i = umaData.generatedMaterials.rendererAssets.Count; i < oldRenderers.Length; i++)
                        {
                            DestroyImmediate(oldRenderers[i].gameObject);
                            //For cloth, be aware of issue: 845868
                            //https://issuetracker.unity3d.com/issues/cloth-repeatedly-destroying-objects-with-cloth-components-causes-a-crash-in-unity-cloth-updatenormals
                        }
                    }
                    umaData.SetRenderers(renderers);
                    umaData.SetRendererAssets(umaData.generatedMaterials.rendererAssets.ToArray());
                }
                return;
            }

            //Clear out old cloth components
            for (int i = 0; i < umaData.rendererCount; i++)
            {
                Cloth cloth = renderers[i].GetComponent <Cloth>();
                if (cloth != null)
                {
                    DestroyImmediate(cloth, false);                    //Crashes if trying to use Destroy()
                }
            }
        }