public void Initialize(GameObject sourceObject) { Release(); this.sourceObject = sourceObject; gameObject = sourceObject != null?GameObject.Instantiate <GameObject>(sourceObject) : new GameObject(); gameObject.hideFlags |= HideFlags.HideAndDontSave | HideFlags.HideInInspector; gameObject.name = sourceObject.name; EditorCommon.DisableOtherBehaviors(gameObject); gameObjectTransform = gameObject.transform; animator = gameObject.GetComponent <Animator>(); if (animator != null) { animator.fireEvents = false; animator.applyRootMotion = false; animator.updateMode = AnimatorUpdateMode.Normal; animator.cullingMode = AnimatorCullingMode.AlwaysAnimate; if (animator.runtimeAnimatorController == null) //In case of Null, AnimationClip.SampleAnimation does not work, so create it. { tmpAnimatorController = new UnityEditor.Animations.AnimatorController(); tmpAnimatorController.name = "Very Animation Temporary Controller"; tmpAnimatorController.hideFlags |= HideFlags.HideAndDontSave; tmpAnimatorController.AddLayer("Very Animation Layer"); UnityEditor.Animations.AnimatorController.SetAnimatorController(animator, tmpAnimatorController); } } animation = gameObject.GetComponent <Animation>(); UpdateBones(); #region rendererDictionary { rendererDictionary = new Dictionary <Renderer, Renderer>(); var sourceRenderers = sourceObject.GetComponentsInChildren <Renderer>(true); var objectRenderers = gameObject.GetComponentsInChildren <Renderer>(true); foreach (var sr in sourceRenderers) { if (sr == null) { continue; } var spath = AnimationUtility.CalculateTransformPath(sr.transform, sourceObject.transform); var index = ArrayUtility.FindIndex(objectRenderers, (x) => AnimationUtility.CalculateTransformPath(x.transform, gameObject.transform) == spath); Assert.IsTrue(index >= 0); if (index >= 0 && !rendererDictionary.ContainsKey(objectRenderers[index])) { rendererDictionary.Add(objectRenderers[index], sr); } } } #endregion UpdateState(); }
public void Initialize(GameObject sourceObject) { Release(); this.sourceObject = sourceObject; gameObject = sourceObject != null?GameObject.Instantiate <GameObject>(sourceObject) : new GameObject(); gameObject.hideFlags |= HideFlags.HideAndDontSave | HideFlags.HideInInspector; gameObject.name = sourceObject.name; EditorCommon.DisableOtherBehaviors(gameObject); gameObjectTransform = gameObject.transform; animator = gameObject.GetComponent <Animator>(); if (animator != null) { animator.enabled = true; animator.fireEvents = false; animator.updateMode = AnimatorUpdateMode.Normal; animator.cullingMode = AnimatorCullingMode.AlwaysAnimate; UnityEditor.Animations.AnimatorController.SetAnimatorController(animator, null); } animation = gameObject.GetComponent <Animation>(); if (animation != null) { animation.enabled = true; } UpdateBones(); #region rendererDictionary { rendererDictionary = new Dictionary <Renderer, Renderer>(); var sourceRenderers = sourceObject.GetComponentsInChildren <Renderer>(true); var objectRenderers = gameObject.GetComponentsInChildren <Renderer>(true); foreach (var sr in sourceRenderers) { if (sr == null) { continue; } var spath = AnimationUtility.CalculateTransformPath(sr.transform, sourceObject.transform); var index = ArrayUtility.FindIndex(objectRenderers, (x) => AnimationUtility.CalculateTransformPath(x.transform, gameObject.transform) == spath); Assert.IsTrue(index >= 0); if (index >= 0 && !rendererDictionary.ContainsKey(objectRenderers[index])) { rendererDictionary.Add(objectRenderers[index], sr); } } } #endregion UpdateState(); SetTransformOutside(); }
private void UpdateBlendShapeSetIcon() { if (!blendShapeSetIconUpdate) { return; } blendShapeSetIconUpdate = false; if (va.blendShapeSetList == null || va.blendShapeSetList.Count <= 0) { return; } TransformPoseSave beforePose = new TransformPoseSave(va.editGameObject); BlendShapeWeightSave beforeBlendShape = new BlendShapeWeightSave(va.editGameObject); va.transformPoseSave.ResetDefaultTransform(); va.blendShapeWeightSave.ResetDefaultWeight(); var gameObject = GameObject.Instantiate <GameObject>(va.editGameObject); gameObject.hideFlags |= HideFlags.HideAndDontSave; gameObject.transform.rotation = Quaternion.identity; EditorCommon.DisableOtherBehaviors(gameObject); Action ForceObjectUpdate = () => { gameObject.SetActive(false); gameObject.SetActive(true); }; int blankLayer; { for (blankLayer = 31; blankLayer > 0; blankLayer--) { if (string.IsNullOrEmpty(LayerMask.LayerToName(blankLayer))) { break; } } if (blankLayer < 0) { blankLayer = 31; } } foreach (var renderer in gameObject.GetComponentsInChildren <Renderer>(true)) { if (renderer == null) { continue; } renderer.gameObject.layer = blankLayer; } var renderers = gameObject.GetComponentsInChildren <SkinnedMeshRenderer>(true).Where(renderer => renderer != null && renderer.sharedMesh != null && renderer.sharedMesh.blendShapeCount > 0).ToArray(); foreach (var renderer in renderers) { renderer.updateWhenOffscreen = true; } { RenderTexture iconTexture = new RenderTexture(IconTextureSize, IconTextureSize, 16, RenderTextureFormat.ARGB32); iconTexture.hideFlags |= HideFlags.HideAndDontSave; iconTexture.Create(); var cameraObject = new GameObject(); cameraObject.hideFlags |= HideFlags.HideAndDontSave; var camera = cameraObject.AddComponent <Camera>(); camera.targetTexture = iconTexture; camera.clearFlags = CameraClearFlags.Color; camera.backgroundColor = Color.clear; camera.cullingMask = 1 << blankLayer; { Bounds bounds = new Bounds(); foreach (var renderer in renderers) { if (Mathf.Approximately(bounds.size.sqrMagnitude, 0f)) { bounds = renderer.bounds; } else { bounds.Encapsulate(renderer.bounds); } } var transform = camera.transform; var sizeMax = Mathf.Max(bounds.size.x, Mathf.Max(bounds.size.y, bounds.size.z)); switch (blendShapeSetIconCameraMode) { case IconCameraMode.forward: { var rot = Quaternion.AngleAxis(180f, Vector3.up); transform.localRotation = rot; sizeMax = Mathf.Max(bounds.size.x, bounds.size.y); transform.localPosition = new Vector3(bounds.center.x, bounds.center.y, bounds.max.z) - transform.forward; } break; case IconCameraMode.back: { transform.localRotation = Quaternion.identity; sizeMax = Mathf.Max(bounds.size.x, bounds.size.y); transform.localPosition = new Vector3(bounds.center.x, bounds.center.y, bounds.min.z) - transform.forward; } break; case IconCameraMode.up: { var rot = Quaternion.AngleAxis(90f, Vector3.right); transform.localRotation = rot; sizeMax = Mathf.Max(bounds.size.x, bounds.size.z); transform.localPosition = new Vector3(bounds.center.x, bounds.max.y, bounds.center.z) - transform.forward; } break; case IconCameraMode.down: { var rot = Quaternion.AngleAxis(-90f, Vector3.right); transform.localRotation = rot; sizeMax = Mathf.Max(bounds.size.x, bounds.size.z); transform.localPosition = new Vector3(bounds.center.x, bounds.min.y, bounds.center.z) - transform.forward; } break; case IconCameraMode.right: { var rot = Quaternion.AngleAxis(-90f, Vector3.up); transform.localRotation = rot; sizeMax = Mathf.Max(bounds.size.y, bounds.size.z); transform.localPosition = new Vector3(bounds.max.x, bounds.center.y, bounds.center.z) - transform.forward; } break; case IconCameraMode.left: { var rot = Quaternion.AngleAxis(90f, Vector3.up); transform.localRotation = rot; sizeMax = Mathf.Max(bounds.size.y, bounds.size.z); transform.localPosition = new Vector3(bounds.min.x, bounds.center.y, bounds.center.z) - transform.forward; } break; } camera.orthographic = true; camera.orthographicSize = sizeMax * 0.6f; camera.farClipPlane = 1f + sizeMax * 5f; } cameraObject.transform.SetParent(gameObject.transform); gameObject.transform.rotation = va.editGameObject.transform.rotation; foreach (var set in va.blendShapeSetList) { va.blendShapeWeightSave.ResetDefaultWeight(); if (set.poseTemplate.blendShapePaths != null && set.poseTemplate.blendShapeValues != null) { foreach (var renderer in renderers) { var path = AnimationUtility.CalculateTransformPath(renderer.transform, gameObject.transform); var index = EditorCommon.ArrayIndexOf(set.poseTemplate.blendShapePaths, path); if (index < 0) { continue; } for (int i = 0; i < set.poseTemplate.blendShapeValues[index].names.Length; i++) { var sindex = renderer.sharedMesh.GetBlendShapeIndex(set.poseTemplate.blendShapeValues[index].names[i]); if (sindex < 0 || sindex >= renderer.sharedMesh.blendShapeCount) { continue; } renderer.SetBlendShapeWeight(sindex, set.poseTemplate.blendShapeValues[index].weights[i]); } } } ForceObjectUpdate(); camera.Render(); { RenderTexture save = RenderTexture.active; RenderTexture.active = iconTexture; if (set.icon == null) { set.icon = new Texture2D(iconTexture.width, iconTexture.height, TextureFormat.ARGB32, iconTexture.useMipMap); set.icon.hideFlags |= HideFlags.HideAndDontSave; } set.icon.ReadPixels(new Rect(0, 0, iconTexture.width, iconTexture.height), 0, 0); set.icon.Apply(); RenderTexture.active = save; } } GameObject.DestroyImmediate(cameraObject); iconTexture.Release(); RenderTexture.DestroyImmediate(iconTexture); } GameObject.DestroyImmediate(gameObject); beforePose.ResetDefaultTransform(); beforeBlendShape.ResetDefaultWeight(); { va.editGameObject.SetActive(false); va.editGameObject.SetActive(true); } va.SetUpdateResampleAnimation(); }