private SkinnedMeshRenderer GetClipBoundSkinnedMeshRenderer() { PlayableDirector selectedDirector = TimelineEditor.inspectedDirector; SkinnedMeshBlendshapeTrack track = base.target as SkinnedMeshBlendshapeTrack; if (selectedDirector != null && track != null) { ParentBindingTrack parentTrack = track.parent as ParentBindingTrack; if (parentTrack != null) { Object binding = parentTrack.GetEditorBinding(selectedDirector); if (binding is GameObject) { return(SkinnedMeshBlendshapeTrack.GetSkinnedMeshFromGameObject((GameObject)binding)); } else if (binding is Transform) { return(SkinnedMeshBlendshapeTrack.GetSkinnedMeshFromGameObject(((Transform)binding).gameObject)); } } else { return(selectedDirector.GetGenericBinding(track) as SkinnedMeshRenderer); } } return(null); }
public override void OnInspectorGUI() { SkinnedMeshBlendshapeTrack track = base.target as SkinnedMeshBlendshapeTrack; SkinnedMeshRenderer skinnedMeshRenderer = GetClipBoundSkinnedMeshRenderer(); if (skinnedMeshRenderer != null && skinnedMeshRenderer.sharedMesh != null) { string[] blendShapes = new string[skinnedMeshRenderer.sharedMesh.blendShapeCount]; int index = Mathf.Min(track._blendShapeIndex, skinnedMeshRenderer.sharedMesh.blendShapeCount); for (int i = 0; i < skinnedMeshRenderer.sharedMesh.blendShapeCount; i++) { blendShapes[i] = skinnedMeshRenderer.sharedMesh.GetBlendShapeName(i); } if (skinnedMeshRenderer.sharedMesh.blendShapeCount > 0) { index = EditorGUILayout.Popup(kParameterLabel, index, blendShapes); track._blendShapeIndex = index; } else { GUI.enabled = false; EditorGUILayout.TextField(kNoParametersLabel); GUI.enabled = true; } } else { GUI.enabled = false; EditorGUILayout.TextField(kParameterLabel, track._blendShapeIndex.ToString()); GUI.enabled = true; } }
public void SetParentBinding(object playerData) { if (playerData is GameObject) { _trackBinding = SkinnedMeshBlendshapeTrack.GetSkinnedMeshFromGameObject((GameObject)playerData); _parentBinding = true; } else if (playerData is Transform) { _trackBinding = SkinnedMeshBlendshapeTrack.GetSkinnedMeshFromGameObject(((Transform)playerData).gameObject); _parentBinding = true; } else { _parentBinding = false; } }
public override void ProcessFrame(Playable playable, FrameData info, object playerData) { SkinnedMeshBlendshapeTrack track = (SkinnedMeshBlendshapeTrack)_trackAsset; if (!_parentBinding) { _trackBinding = playerData as SkinnedMeshRenderer; } if (_trackBinding == null || track._blendShapeIndex >= _trackBinding.sharedMesh.blendShapeCount) { return; } if (_firstFrame) { _defaultValue = _trackBinding.GetBlendShapeWeight(track._blendShapeIndex); _firstFrame = false; } float weight = _defaultValue; int numInputs = playable.GetInputCount(); for (int i = 0; i < numInputs; i++) { float inputWeight = playable.GetInputWeight(i); if (inputWeight > 0.0f) { ScriptPlayable <SkinnedMeshBlendshapePlayableBehaviour> scriptPlayable = (ScriptPlayable <SkinnedMeshBlendshapePlayableBehaviour>)playable.GetInput(i); SkinnedMeshBlendshapePlayableBehaviour inputBehaviour = scriptPlayable.GetBehaviour(); weight = Mathf.Lerp(weight, inputBehaviour._weight, inputWeight); } } _trackBinding.SetBlendShapeWeight(track._blendShapeIndex, weight); }