private void BuildRenderComponents()
    {
        ovrAvatarBaseComponent       baseComponnet            = new ovrAvatarBaseComponent();
        ovrAvatarHandComponent       leftHandComponnet        = new ovrAvatarHandComponent();
        ovrAvatarHandComponent       rightHandComponnet       = new ovrAvatarHandComponent();
        ovrAvatarControllerComponent leftControllerComponent  = new ovrAvatarControllerComponent();
        ovrAvatarControllerComponent rightControllerComponent = new ovrAvatarControllerComponent();
        ovrAvatarBodyComponent       bodyComponent            = new ovrAvatarBodyComponent();

        ovrAvatarComponent dummyComponent = new ovrAvatarComponent();

        const bool FetchName = true;

        if (CAPI.ovrAvatarPose_GetLeftHandComponent(sdkAvatar, ref leftHandComponnet))
        {
            CAPI.ovrAvatarComponent_Get(leftHandComponnet.renderComponent, FetchName, ref dummyComponent);
            AddAvatarComponent(ref HandLeft, dummyComponent);
            HandLeft.isLeftHand = true;
        }

        if (CAPI.ovrAvatarPose_GetRightHandComponent(sdkAvatar, ref rightHandComponnet))
        {
            CAPI.ovrAvatarComponent_Get(rightHandComponnet.renderComponent, FetchName, ref dummyComponent);
            AddAvatarComponent(ref HandRight, dummyComponent);
            HandRight.isLeftHand = false;
        }

        if (CAPI.ovrAvatarPose_GetBodyComponent(sdkAvatar, ref bodyComponent))
        {
            CAPI.ovrAvatarComponent_Get(bodyComponent.renderComponent, FetchName, ref dummyComponent);
            AddAvatarComponent(ref Body, dummyComponent);
        }

        if (CAPI.ovrAvatarPose_GetLeftControllerComponent(sdkAvatar, ref leftControllerComponent))
        {
            CAPI.ovrAvatarComponent_Get(leftControllerComponent.renderComponent, FetchName, ref dummyComponent);
            AddAvatarComponent(ref ControllerLeft, dummyComponent);
            ControllerLeft.isLeftHand = true;
        }

        if (CAPI.ovrAvatarPose_GetRightControllerComponent(sdkAvatar, ref rightControllerComponent))
        {
            CAPI.ovrAvatarComponent_Get(rightControllerComponent.renderComponent, FetchName, ref dummyComponent);
            AddAvatarComponent(ref ControllerRight, dummyComponent);
            ControllerRight.isLeftHand = false;
        }

        if (CAPI.ovrAvatarPose_GetBaseComponent(sdkAvatar, ref baseComponnet))
        {
            CAPI.ovrAvatarComponent_Get(baseComponnet.renderComponent, FetchName, ref dummyComponent);
            AddAvatarComponent(ref Base, dummyComponent);
        }
    }
        private void UpdateSDKAvatarUnityState()
        {
#if VIU_OCULUSVR_1_37_0_OR_NEWER && VIU_OCULUSVR_AVATAR
            ovrAvatarControllerComponent controllerComponent = new ovrAvatarControllerComponent();
            ovrAvatarComponent           dummyComponent      = new ovrAvatarComponent();
            OvrAvatarTouchController     controller          = null;

            if (m_deviceIndex == LEFT_INDEX)
            {
                if (CAPI.ovrAvatarPose_GetLeftControllerComponent(sdkAvatar, ref controllerComponent))
                {
                    CAPI.ovrAvatarComponent_Get(controllerComponent.renderComponent, true, ref dummyComponent);
                    AddAvatarComponent(ref controller, dummyComponent);
                    controller.isLeftHand = true;
                }
            }
            else if (m_deviceIndex == RIGHT_INDEX)
            {
                if (CAPI.ovrAvatarPose_GetRightControllerComponent(sdkAvatar, ref controllerComponent))
                {
                    CAPI.ovrAvatarComponent_Get(controllerComponent.renderComponent, true, ref dummyComponent);
                    AddAvatarComponent(ref controller, dummyComponent);
                    controller.isLeftHand = false;
                }
            }
#elif (VIU_OCULUSVR_1_32_0_OR_NEWER || VIU_OCULUSVR_1_36_0_OR_NEWER) && VIU_OCULUSVR_AVATAR
            //Iterate through all the render components
            UInt32 componentCount = CAPI.ovrAvatarComponent_Count(sdkAvatar);

            for (UInt32 i = 0; i < componentCount; i++)
            {
                IntPtr ptr = CAPI.ovrAvatarComponent_Get_Native(sdkAvatar, i);

                ovrAvatarComponent component = (ovrAvatarComponent)Marshal.PtrToStructure(ptr, typeof(ovrAvatarComponent));

                if (!trackedComponents.ContainsKey(component.name))
                {
                    GameObject componentObject = null;
                    Type       specificType    = null;


                    if (specificType == null && (ovrAvatarCapabilities.All & ovrAvatarCapabilities.Hands) != 0)
                    {
                        if (m_deviceIndex == LEFT_INDEX)
                        {
                            ovrAvatarControllerComponent?controllerComponent = CAPI.ovrAvatarPose_GetLeftControllerComponent(sdkAvatar);
                            if (specificType == null && controllerComponent.HasValue && ptr == controllerComponent.Value.renderComponent)
                            {
                                specificType = typeof(OvrAvatarTouchController);
                                if (ovrController != null)
                                {
                                    componentObject = ovrController.gameObject;
                                }
                            }
                        }
                        else if (m_deviceIndex == RIGHT_INDEX)
                        {
                            ovrAvatarControllerComponent?controllerComponent = CAPI.ovrAvatarPose_GetRightControllerComponent(sdkAvatar);
                            if (specificType == null && controllerComponent.HasValue && ptr == controllerComponent.Value.renderComponent)
                            {
                                specificType = typeof(OvrAvatarTouchController);
                                if (ovrController != null)
                                {
                                    componentObject = ovrController.gameObject;
                                }
                            }
                        }
                    }

                    if (componentObject != null)
                    {
                        AddAvatarComponent(componentObject, component);
                    }
                }

                UpdateAvatarComponent(component);
            }
#endif
        }
        private void Update()
        {
            if (m_updateDynamically)
            {
#if (VIU_OCULUSVR_1_32_0_OR_NEWER || VIU_OCULUSVR_1_36_0_OR_NEWER || VIU_OCULUSVR_1_37_0_OR_NEWER) && VIU_OCULUSVR_AVATAR
                if (sdkAvatar == IntPtr.Zero)
                {
                    return;
                }

                if (m_deviceIndex == LEFT_INDEX)
                {
                    inputStateLeft.transform.position    = transform.position;
                    inputStateLeft.transform.orientation = transform.rotation;
                    inputStateLeft.transform.scale       = transform.localScale;

                    inputStateLeft.buttonMask = 0;
                    inputStateLeft.touchMask  = ovrAvatarTouch.Pointing | ovrAvatarTouch.ThumbUp;

                    if (ViveInput.GetPress(HandRole.LeftHand, ControllerButton.AKey))
                    {
                        inputStateLeft.buttonMask |= ovrAvatarButton.One;
                    }

                    if (ViveInput.GetPress(HandRole.LeftHand, ControllerButton.BKey))
                    {
                        inputStateLeft.buttonMask |= ovrAvatarButton.Two;
                    }

                    if (ViveInput.GetPress(HandRole.LeftHand, ControllerButton.System))
                    {
                        inputStateLeft.buttonMask |= ovrAvatarButton.Three;
                    }

                    if (ViveInput.GetPress(HandRole.LeftHand, ControllerButton.Pad))
                    {
                        inputStateLeft.buttonMask |= ovrAvatarButton.Joystick;
                    }

                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.AKeyTouch))
                    {
                        inputStateLeft.touchMask &= ~ovrAvatarTouch.ThumbUp;
                        inputStateLeft.touchMask |= ovrAvatarTouch.One;
                    }
                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.BkeyTouch))
                    {
                        inputStateLeft.touchMask &= ~ovrAvatarTouch.ThumbUp;
                        inputStateLeft.touchMask |= ovrAvatarTouch.Two;
                    }
                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.PadTouch))
                    {
                        inputStateLeft.touchMask &= ~ovrAvatarTouch.ThumbUp;
                        inputStateLeft.touchMask |= ovrAvatarTouch.Joystick;
                    }
                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.TriggerTouch))
                    {
                        inputStateLeft.touchMask &= ~ovrAvatarTouch.Pointing;
                        inputStateLeft.touchMask |= ovrAvatarTouch.Index;
                    }

                    inputStateLeft.joystickX    = ViveInput.GetAxis(HandRole.LeftHand, ControllerAxis.JoystickX);
                    inputStateLeft.joystickY    = ViveInput.GetAxis(HandRole.LeftHand, ControllerAxis.JoystickY);
                    inputStateLeft.indexTrigger = ViveInput.GetAxis(HandRole.LeftHand, ControllerAxis.Trigger);
                    inputStateLeft.handTrigger  = ViveInput.GetAxis(HandRole.LeftHand, ControllerAxis.CapSenseGrip);
                    inputStateLeft.isActive     = true;
                }
                else if (m_deviceIndex == RIGHT_INDEX)
                {
                    inputStateRight.transform.position    = transform.position;
                    inputStateRight.transform.orientation = transform.rotation;
                    inputStateRight.transform.scale       = transform.localScale;

                    inputStateRight.buttonMask = 0;
                    inputStateRight.touchMask  = ovrAvatarTouch.Pointing | ovrAvatarTouch.ThumbUp;

                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.AKey))
                    {
                        inputStateRight.buttonMask |= ovrAvatarButton.One;
                    }

                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.BKey))
                    {
                        inputStateRight.buttonMask |= ovrAvatarButton.Two;
                    }

                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.Pad))
                    {
                        inputStateRight.buttonMask |= ovrAvatarButton.Joystick;
                    }

                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.AKeyTouch))
                    {
                        inputStateRight.touchMask &= ~ovrAvatarTouch.ThumbUp;
                        inputStateRight.touchMask |= ovrAvatarTouch.One;
                    }
                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.BkeyTouch))
                    {
                        inputStateRight.touchMask &= ~ovrAvatarTouch.ThumbUp;
                        inputStateRight.touchMask |= ovrAvatarTouch.Two;
                    }
                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.PadTouch))
                    {
                        inputStateRight.touchMask &= ~ovrAvatarTouch.ThumbUp;
                        inputStateRight.touchMask |= ovrAvatarTouch.Joystick;
                    }
                    if (ViveInput.GetPress(HandRole.RightHand, ControllerButton.TriggerTouch))
                    {
                        inputStateRight.touchMask &= ~ovrAvatarTouch.Pointing;
                        inputStateRight.touchMask |= ovrAvatarTouch.Index;
                    }

                    inputStateRight.joystickX    = ViveInput.GetAxis(HandRole.RightHand, ControllerAxis.JoystickX);
                    inputStateRight.joystickY    = ViveInput.GetAxis(HandRole.RightHand, ControllerAxis.JoystickY);
                    inputStateRight.indexTrigger = ViveInput.GetAxis(HandRole.RightHand, ControllerAxis.Trigger);
                    inputStateRight.handTrigger  = ViveInput.GetAxis(HandRole.RightHand, ControllerAxis.CapSenseGrip);
                    inputStateRight.isActive     = true;
                }

                CAPI.ovrAvatarPose_UpdateHandsWithType(sdkAvatar, inputStateLeft, inputStateRight, m_controllerType);
                CAPI.ovrAvatarPose_Finalize(sdkAvatar, Time.deltaTime);
#endif

                UpdateComponents();

#if VIU_OCULUSVR_1_37_0_OR_NEWER && VIU_OCULUSVR_AVATAR
                if (m_deviceIndex == LEFT_INDEX)
                {
                    ovrAvatarControllerComponent component = new ovrAvatarControllerComponent();
                    if (CAPI.ovrAvatarPose_GetLeftControllerComponent(sdkAvatar, ref component))
                    {
                        UpdateAvatarComponent(component.renderComponent);
                    }
                }
                else if (m_deviceIndex == RIGHT_INDEX)
                {
                    ovrAvatarControllerComponent component = new ovrAvatarControllerComponent();
                    if (CAPI.ovrAvatarPose_GetRightControllerComponent(sdkAvatar, ref component))
                    {
                        UpdateAvatarComponent(component.renderComponent);
                    }
                }
#endif
            }
        }