Example #1
0
    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];
    }
Example #2
0
    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);
    }
Example #3
0
 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;
    }
Example #6
0
        /// <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;
            }
        }
Example #7
0
    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);
    }
Example #11
0
 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;
    }
Example #13
0
    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);
Example #15
0
    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;
    }
Example #16
0
    // 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;
            }
        }
    }
Example #17
0
    // 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;
         *  }
         * }
         */
    }