internal static void ConvertTransform(float[] transform, ref ovrAvatarTransform target) { target.position.x = transform[0]; target.position.y = transform[1]; target.position.z = transform[2]; target.orientation.x = transform[3]; target.orientation.y = transform[4]; target.orientation.z = transform[5]; target.orientation.w = transform[6]; target.scale.x = transform[7]; target.scale.y = transform[8]; target.scale.z = transform[9]; }
public static ovrAvatarHandInputState CreateInputState(ovrAvatarTransform transform, OvrAvatarDriver.ControllerPose pose) { ovrAvatarHandInputState inputState = new ovrAvatarHandInputState(); inputState.transform = transform; inputState.buttonMask = pose.buttons; inputState.touchMask = pose.touches; inputState.joystickX = pose.joystickPosition.x; inputState.joystickY = pose.joystickPosition.y; inputState.indexTrigger = pose.indexTrigger; inputState.handTrigger = pose.handTrigger; inputState.isActive = pose.isActive; return(inputState); }
static bool UpdateTransforms(Transform[] joints, ovrAvatarTransform[] transforms) { bool updated = false; for (int i = 0; i < joints.Length; ++i) { Transform joint = joints[i]; ovrAvatarTransform transform = CreateOvrAvatarTransform(joint.localPosition, joint.localRotation); if (transform.position != transforms[i].position || transform.orientation != transforms[i].orientation) { transforms[i] = transform; updated = true; } } return updated; }
internal void UpdateSkinnedMeshRenderPBS(OvrAvatar avatar, IntPtr renderPart, Material mat) { if (!isMaterialInitilized) { isMaterialInitilized = true; UInt64 albedoTextureID = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetAlbedoTextureAssetID(renderPart); UInt64 surfaceTextureID = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetSurfaceTextureAssetID(renderPart); mat.SetTexture("_Albedo", OvrAvatarComponent.GetLoadedTexture(albedoTextureID)); mat.SetTexture("_Surface", OvrAvatarComponent.GetLoadedTexture(surfaceTextureID)); } ovrAvatarVisibilityFlags visibilityMask = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetVisibilityMask(renderPart); ovrAvatarTransform localTransform = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetTransform(renderPart); UpdateSkinnedMesh(avatar, bones, localTransform, visibilityMask, renderPart); }
internal static void ConvertTransform(ovrAvatarTransform transform, Transform target) { if (GameObject.ReferenceEquals(target.gameObject, lockedHand) || GameObject.ReferenceEquals(target.gameObject, lockedController)) { return; } Vector3 position = transform.position; position.z = -position.z; Quaternion orientation = transform.orientation; orientation.x = -orientation.x; orientation.y = -orientation.y; target.localPosition = position; target.localRotation = orientation; target.localScale = transform.scale; }
/// <summary> /// Converts a list of tracked finger bones to the Avatar trasform system /// </summary> /// <param name="joints">The list of finger bones, in the same order as the avatar</param> /// <param name="avatarTransforms">The bones converted in Avatar compatible instances</param> private void JointsToAvatarTransforms(List <Transform> joints, ref ovrAvatarTransform[] avatarTransforms) { if (avatarTransforms == null || avatarTransforms.Length != joints.Count) { avatarTransforms = new ovrAvatarTransform[joints.Count]; } Pose localRoot = anchor.RelativeOffset(handRoot); avatarTransforms[0] = OvrAvatar.CreateOvrAvatarTransform(localRoot.position, localRoot.rotation); for (int i = 1; i < joints.Count; ++i) { Transform joint = joints[i]; ovrAvatarTransform transform = OvrAvatar.CreateOvrAvatarTransform(joint.localPosition, joint.localRotation); avatarTransforms[i] = transform; } }
protected void UpdateTransformsFromPose(IntPtr sdkAvatar) { if (sdkAvatar != IntPtr.Zero) { ovrAvatarTransform bodyTransform = OvrAvatar.CreateOvrAvatarTransform(CurrentPose.headPosition, CurrentPose.headRotation); ovrAvatarHandInputState inputStateLeft = OvrAvatar.CreateInputState(OvrAvatar.CreateOvrAvatarTransform(CurrentPose.handLeftPosition, CurrentPose.handLeftRotation), CurrentPose.controllerLeftPose); ovrAvatarHandInputState inputStateRight = OvrAvatar.CreateInputState(OvrAvatar.CreateOvrAvatarTransform(CurrentPose.handRightPosition, CurrentPose.handRightRotation), CurrentPose.controllerRightPose); CAPI.ovrAvatarPose_UpdateBody(sdkAvatar, bodyTransform); if (GetIsTrackedRemote()) { CAPI.ovrAvatarPose_UpdateSDK3DofHands(sdkAvatar, inputStateLeft, inputStateRight, GetRemoteControllerType()); } else { CAPI.ovrAvatarPose_UpdateHands(sdkAvatar, inputStateLeft, inputStateRight); } } }
public void UpdateSkinnedMeshRender(OvrAvatarComponent component, OvrAvatar avatar, IntPtr renderPart) { ovrAvatarVisibilityFlags visibilityMask = CAPI.ovrAvatarSkinnedMeshRender_GetVisibilityMask(renderPart): ovrAvatarTransform localTransform = CAPI.ovrAvatarSkinnedMeshRender_GetTransform(renderPart): UpdateSkinnedMesh(avatar, bones, localTransform, visibilityMask, renderPart): UpdateMeshMaterial(visibilityMask, mesh == null ? component.RootMeshComponent : mesh): bool isActive = this.gameObject.activeSelf: if( mesh != null ) { bool changedMaterial = CAPI.ovrAvatarSkinnedMeshRender_MaterialStateChanged(renderPart): if (changedMaterial || (!previouslyActive && isActive)) { ovrAvatarMaterialState materialState = CAPI.ovrAvatarSkinnedMeshRender_GetMaterialState(renderPart): component.UpdateAvatarMaterial(mesh.sharedMaterial, materialState): } } previouslyActive = isActive: }
public void UpdateSkinnedMeshRender( OvrAvatarComponent component, OvrAvatar avatar, IntPtr renderPart) { // Debug.Log("UpdateSkinnedMeshRenderPBSV2"); ovrAvatarVisibilityFlags visibilityMask = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetVisibilityMask(renderPart); ovrAvatarTransform localTransform = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetTransform(renderPart); UpdateSkinnedMesh(avatar, bones, localTransform, visibilityMask, renderPart); bool isActive = gameObject.activeSelf; if (mesh != null && !previouslyActive && isActive) { if (!isCombinedMaterial) { InitializeSingleComponentMaterial(renderPart, (int)avatar.LevelOfDetail - 1); } } if (blendShapeCount > 0) { const float BLEND_MULTIPLIER = 100.0f; CAPI.ovrAvatarSkinnedMeshRender_GetBlendShapeParams(renderPart, ref blendShapeParams); for (uint i = 0; i < blendShapeParams.blendShapeParamCount && i < blendShapeCount; i++) { float value = blendShapeParams.blendShapeParams[i]; mesh.SetBlendShapeWeight((int)i, value * BLEND_MULTIPLIER); } } previouslyActive = isActive; }
static bool UpdatePoseRoot(Transform poseRoot, ref Transform cachedPoseRoot, ref Transform[] cachedPoseJoints, ref ovrAvatarTransform[] transforms) { if (poseRoot == cachedPoseRoot) { return(false); } if (!poseRoot) { cachedPoseRoot = null; cachedPoseJoints = null; transforms = null; } else { List <Transform> joints = new List <Transform>(); OrderJoints(poseRoot, joints); cachedPoseRoot = poseRoot; cachedPoseJoints = joints.ToArray(); transforms = new ovrAvatarTransform[joints.Count]; } return(true); }
protected void UpdateSkinnedMesh(OvrAvatar avatar, SkinnedMeshRenderer mesh, Transform[] bones, ovrAvatarTransform localTransform, ovrAvatarVisibilityFlags visibilityMask, ovrAvatarSkinnedMeshPose skinnedPose) { UpdateActive(avatar, visibilityMask); OvrAvatar.ConvertTransform(localTransform, this.transform); for (int i = 0; i < skinnedPose.jointCount; i++) { Transform targetBone = bones[i]; OvrAvatar.ConvertTransform(skinnedPose.jointTransform[i], targetBone); } }
protected void UpdateSkinnedMesh(OvrAvatar avatar, SkinnedMeshRenderer mesh, Transform[] bones, ovrAvatarTransform localTransform, ovrAvatarVisibilityFlags visibilityMask, IntPtr renderPart) { UpdateActive(avatar, visibilityMask); OvrAvatar.ConvertTransform(localTransform, this.transform); UInt64 dirtyJoints = CAPI.ovrAvatarSkinnedMeshRender_GetDirtyJoints(renderPart); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); // We need to make sure that we fully update the initial position of // Skinned mesh renderers, then, thereafter, we can only update dirty joints bool forceUpdate = (firstSkinnedUpdate && type == ovrAvatarRenderPartType.SkinnedMeshRender); for (UInt32 i = 0; i < 64; i++) { UInt64 dirtyMask = (ulong)1 << (int)i; if ((forceUpdate && i < bones.Length) || (dirtyMask & dirtyJoints) != 0) { //This joint is dirty and needs to be updated Transform targetBone = bones[i]; ovrAvatarTransform transform = CAPI.ovrAvatarSkinnedMeshRender_GetJointTransform(renderPart, i); OvrAvatar.ConvertTransform(transform, targetBone); } } firstSkinnedUpdate = false; }
void UpdateExpressive() { ovrAvatarTransform baseTransform = OvrAvatar.CreateOvrAvatarTransform(transform.position, transform.rotation); CAPI.ovrAvatar_UpdateWorldTransform(sdkAvatar, baseTransform); }
public static extern void ovrAvatarPose_UpdateBody( IntPtr avatar, ovrAvatarTransform headPose);
protected void UpdateSkinnedMesh(OvrAvatar avatar, Transform[] bones, ovrAvatarTransform localTransform, ovrAvatarVisibilityFlags visibilityMask, IntPtr renderPart) { UpdateActive(avatar, visibilityMask); OvrAvatar.ConvertTransform(localTransform, this.transform); ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart); UInt64 dirtyJoints; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: dirtyJoints = CAPI.ovrAvatarSkinnedMeshRender_GetDirtyJoints(renderPart); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: dirtyJoints = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetDirtyJoints(renderPart); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: dirtyJoints = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetDirtyJoints(renderPart); break; default: throw new Exception("Unhandled render part type: " + type); } for (UInt32 i = 0; i < 64; i++) { UInt64 dirtyMask = (ulong)1 << (int)i; // We need to make sure that we fully update the initial position of // Skinned mesh renderers, then, thereafter, we can only update dirty joints if ((firstSkinnedUpdate && i < bones.Length) || (dirtyMask & dirtyJoints) != 0) { //This joint is dirty and needs to be updated Transform targetBone = bones[i]; ovrAvatarTransform transform; switch (type) { case ovrAvatarRenderPartType.SkinnedMeshRender: transform = CAPI.ovrAvatarSkinnedMeshRender_GetJointTransform(renderPart, i); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS: transform = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetJointTransform(renderPart, i); break; case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2: transform = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetJointTransform(renderPart, i); break; default: throw new Exception("Unhandled render part type: " + type); } OvrAvatar.ConvertTransform(transform, targetBone); } } ovrAvatarBlendShapeParams blendParams = CAPI.ovrAvatarSkinnedMeshRender_GetBlendShapeParams(renderPart); for (uint i = 0; i < blendParams.blendShapeParamCount; i++) { float value = blendParams.blendShapeParams[i]; mesh.SetBlendShapeWeight((int)i, value * 100.0f); } firstSkinnedUpdate = false; }
// Update is called once per frame void Update() { if (Driver != null) { // Get the current pose from the driver OvrAvatarDriver.PoseFrame pose; if (Driver.GetCurrentPose(out pose)) { // If we're recording, record the pose if (RecordPackets) { RecordFrame(Time.deltaTime, pose); } // Update the various avatar components with this pose if (ControllerLeft != null) { ControllerLeft.UpdatePose(pose.controllerLeftPose); } if (ControllerRight != null) { ControllerRight.UpdatePose(pose.controllerRightPose); } if (HandLeft != null) { HandLeft.UpdatePose(pose.controllerLeftPose); } if (HandRight != null) { HandRight.UpdatePose(pose.controllerRightPose); } if (Body != null) { Body.UpdatePose(pose.voiceAmplitude); } if (sdkAvatar != IntPtr.Zero) { ovrAvatarTransform bodyTransform = CreateOvrAvatarTransform(pose.headPosition, pose.headRotation); ovrAvatarHandInputState inputStateLeft = CreateInputState(CreateOvrAvatarTransform(pose.handLeftPosition, pose.handLeftRotation), pose.controllerLeftPose); ovrAvatarHandInputState inputStateRight = CreateInputState(CreateOvrAvatarTransform(pose.handRightPosition, pose.handRightRotation), pose.controllerRightPose); foreach (float[] voiceUpdate in voiceUpdates) { Oculus.Avatar.CAPI.ovrAvatarPose_UpdateVoiceVisualization(sdkAvatar, voiceUpdate); } voiceUpdates.Clear(); Oculus.Avatar.CAPI.ovrAvatarPose_UpdateBody(sdkAvatar, bodyTransform); Oculus.Avatar.CAPI.ovrAvatarPose_UpdateHands(sdkAvatar, inputStateLeft, inputStateRight); Oculus.Avatar.CAPI.ovrAvatarPose_Finalize(sdkAvatar, Time.deltaTime); } } } if (sdkAvatar != IntPtr.Zero && assetLoadingIds.Count == 0) { //If all of the assets for this avatar have been loaded, update the avatar UpdateSDKAvatarUnityState(); UpdateCustomPoses(); if (!assetsFinishedLoading) { AssetsDoneLoading.Invoke(); assetsFinishedLoading = true; } } }
// Update is called once per frame void Update() { if (Driver != null) { // Get the current pose from the driver OvrAvatarDriver.PoseFrame pose; if (Driver.GetCurrentPose(out pose)) { // If we're recording, record the pose if (RecordPackets) { RecordFrame(Time.deltaTime, pose); } // Update the various avatar components with this pose if (ControllerLeft != null) { ControllerLeft.UpdatePose(pose.controllerLeftPose); } if (ControllerRight != null) { ControllerRight.UpdatePose(pose.controllerRightPose); } if (HandLeft != null) { HandLeft.UpdatePose(pose.controllerLeftPose); } if (HandRight != null) { HandRight.UpdatePose(pose.controllerRightPose); } if (Body != null) { Body.UpdatePose(pose.voiceAmplitude); } if (sdkAvatar != IntPtr.Zero) { ovrAvatarTransform bodyTransform = CreateOvrAvatarTransform(pose.headPosition, pose.headRotation); ovrAvatarHandInputState inputStateLeft = CreateInputState(CreateOvrAvatarTransform(pose.handLeftPosition, pose.handLeftRotation), pose.controllerLeftPose); ovrAvatarHandInputState inputStateRight = CreateInputState(CreateOvrAvatarTransform(pose.handRightPosition, pose.handRightRotation), pose.controllerRightPose); foreach (float[] voiceUpdate in voiceUpdates) { CAPI.ovrAvatarPose_UpdateVoiceVisualization(sdkAvatar, voiceUpdate); } voiceUpdates.Clear(); CAPI.ovrAvatarPose_UpdateBody(sdkAvatar, bodyTransform); CAPI.ovrAvatarPose_UpdateHands(sdkAvatar, inputStateLeft, inputStateRight); CAPI.ovrAvatarPose_Finalize(sdkAvatar, Time.deltaTime); } } } if (sdkAvatar != IntPtr.Zero && assetLoadingIds.Count == 0) { //If all of the assets for this avatar have been loaded, update the avatar UpdateSDKAvatarUnityState(); UpdateCustomPoses(); if (!assetsFinishedLoading) { AssetsDoneLoading.Invoke(); assetsFinishedLoading = true; } } /* * if(leftHandCollider) * { * if ((OVRInput.Get(OVRInput.RawAxis1D.LIndexTrigger) > triggerGrabDeadzone || OVRInput.Get(OVRInput.RawAxis1D.LHandTrigger) > triggerGrabDeadzone) && !leftGrabbingObject) * { * //leftHandCollider.enabled = true; * leftHandCollider.isTrigger = false; * } * else * { * leftHandCollider.isTrigger = true; * //leftHandCollider.enabled = false; * } * } * if (rightHandCollider) * { * if ((OVRInput.Get(OVRInput.RawAxis1D.RIndexTrigger) > triggerGrabDeadzone || OVRInput.Get(OVRInput.RawAxis1D.RHandTrigger) > triggerGrabDeadzone) && !rightGrabbingObject) * { * rightHandCollider.isTrigger = false; * //rightHandCollider.enabled = true; * * } * else * { * rightHandCollider.isTrigger = true; * //rightHandCollider.enabled = false; * } * } */ }