protected void UpdatePreviewHand(SerializedProperty instanceProperty, SerializedProperty showPreviewProperty, SerializedProperty prefabProperty, SteamVR_Skeleton_Pose_Hand handData) { GameObject preview = instanceProperty.objectReferenceValue as GameObject; EditorGUILayout.PropertyField(showPreviewProperty); if (showPreviewProperty.boolValue) { if (preview == null) { preview = GameObject.Instantiate <GameObject>((GameObject)prefabProperty.objectReferenceValue); preview.transform.parent = poser.transform; preview.transform.localPosition = Vector3.zero; preview.transform.localRotation = Quaternion.identity; SteamVR_Behaviour_Skeleton previewSkeleton = null; if (preview != null) { previewSkeleton = preview.GetComponent <SteamVR_Behaviour_Skeleton>(); } if (previewSkeleton != null) { if (handData.bonePositions == null || handData.bonePositions.Length == 0) { previewSkeleton.ForceToReferencePose(defaultReferencePose); SaveHandData(handData, previewSkeleton); } preview.transform.localPosition = Vector3.zero; preview.transform.localRotation = Quaternion.identity; preview.transform.localRotation = Quaternion.Inverse(handData.rotation); preview.transform.position = preview.transform.TransformPoint(-handData.position); for (int boneIndex = 0; boneIndex < handData.bonePositions.Length; boneIndex++) { Transform bone = previewSkeleton.GetBone(boneIndex); bone.localPosition = handData.bonePositions[boneIndex]; bone.localRotation = handData.boneRotations[boneIndex]; } } instanceProperty.objectReferenceValue = preview; } } else { if (preview != null) { DestroyImmediate(preview); } } }
protected void SaveHandData(SteamVR_Skeleton_Pose_Hand handData, SteamVR_Behaviour_Skeleton thisSkeleton) { handData.position = thisSkeleton.transform.InverseTransformPoint(poser.transform.position); //handData.position = thisSkeleton.transform.localPosition; handData.rotation = Quaternion.Inverse(thisSkeleton.transform.localRotation); handData.bonePositions = new Vector3[SteamVR_Action_Skeleton.numBones]; handData.boneRotations = new Quaternion[SteamVR_Action_Skeleton.numBones]; for (int boneIndex = 0; boneIndex < SteamVR_Action_Skeleton.numBones; boneIndex++) { Transform bone = thisSkeleton.GetBone(boneIndex); handData.bonePositions[boneIndex] = bone.localPosition; handData.boneRotations[boneIndex] = bone.localRotation; } EditorUtility.SetDirty(activePose); }
protected void UpdatePreviewHand(SerializedProperty instanceProperty, SerializedProperty showPreviewProperty, GameObject previewPrefab, SteamVR_Skeleton_Pose_Hand handData, SteamVR_Skeleton_Pose sourcePose, bool forceUpdate) { GameObject preview = instanceProperty.objectReferenceValue as GameObject; //EditorGUILayout.PropertyField(showPreviewProperty); if (showPreviewProperty.boolValue) { if (forceUpdate && preview != null) { DestroyImmediate(preview); } if (preview == null) { preview = Instantiate <GameObject>(previewPrefab); preview.transform.localScale = Vector3.one * poserScale.floatValue; preview.transform.parent = poser.transform; preview.transform.localPosition = Vector3.zero; preview.transform.localRotation = Quaternion.identity; SteamVR_Behaviour_Skeleton previewSkeleton = null; if (preview != null) { previewSkeleton = preview.GetComponent <SteamVR_Behaviour_Skeleton>(); } if (previewSkeleton != null) { if (handData.bonePositions == null || handData.bonePositions.Length == 0) { SteamVR_Skeleton_Pose poseResource = (SteamVR_Skeleton_Pose)Resources.Load("ReferencePose_OpenHand"); DeepCopyPose(poseResource, sourcePose); EditorUtility.SetDirty(sourcePose); } preview.transform.localPosition = Vector3.zero; preview.transform.localRotation = Quaternion.identity; preview.transform.parent = null; preview.transform.localScale = Vector3.one * poserScale.floatValue; preview.transform.parent = poser.transform; preview.transform.localRotation = Quaternion.Inverse(handData.rotation); preview.transform.position = preview.transform.TransformPoint(-handData.position); for (int boneIndex = 0; boneIndex < handData.bonePositions.Length; boneIndex++) { Transform bone = previewSkeleton.GetBone(boneIndex); bone.localPosition = handData.bonePositions[boneIndex]; bone.localRotation = handData.boneRotations[boneIndex]; } } SceneView.RepaintAll(); instanceProperty.objectReferenceValue = preview; } } else { if (preview != null) { DestroyImmediate(preview); SceneView.RepaintAll(); } } }