Exemplo n.º 1
0
    public void UpdateAvatar(IntPtr nativeComponent)
    {
        CAPI.ovrAvatarComponent_Get(nativeComponent, false, ref nativeAvatarComponent);

        OvrAvatar.ConvertTransform(nativeAvatarComponent.transform, transform);

        for (UInt32 renderPartIndex = 0; renderPartIndex < 1; renderPartIndex++) //nativeAvatarComponent.renderPartCount
        {
            if (RenderParts.Count <= renderPartIndex)
            {
                break;
            }

            OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex];
            IntPtr renderPart            = OvrAvatar.GetRenderPart(nativeAvatarComponent, renderPartIndex);
            ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart);
            switch (type)
            {
            case ovrAvatarRenderPartType.SkinnedMeshRender:
                ((OvrAvatarSkinnedMeshRenderComponent)renderComponent).UpdateSkinnedMeshRender(this, owner, renderPart);
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS:
                ((OvrAvatarSkinnedMeshRenderPBSComponent)renderComponent).UpdateSkinnedMeshRenderPBS(owner, renderPart, renderComponent.mesh.sharedMaterial);
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2:
                ((OvrAvatarSkinnedMeshPBSV2RenderComponent)renderComponent).UpdateSkinnedMeshRender(this, owner, renderPart);
                break;

            default:
                break;
            }
        }
    }
        private void UpdateAvatarComponent(ovrAvatarComponent component)
        {
            for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++)
            {
                if (RenderParts.Count <= renderPartIndex)
                {
                    break;
                }

                OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex];
                IntPtr renderPart            = OvrAvatar.GetRenderPart(component, renderPartIndex);
                ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart);
                switch (type)
                {
                case ovrAvatarRenderPartType.SkinnedMeshRenderPBS:
                    var mat   = renderComponent.mesh.sharedMaterial;
                    var bones = renderComponent.bones;
                    ovrAvatarVisibilityFlags visibilityMask = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetVisibilityMask(renderPart);
                    ovrAvatarTransform       localTransform = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetTransform(renderPart);
                    UpdateSkinnedMesh(localTransform, renderPart, bones);

                    UInt64 albedoTextureID  = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetAlbedoTextureAssetID(renderPart);
                    UInt64 surfaceTextureID = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetSurfaceTextureAssetID(renderPart);
                    mat.SetTexture("_Albedo", OvrAvatarComponent.GetLoadedTexture(albedoTextureID));
                    mat.SetTexture("_Surface", OvrAvatarComponent.GetLoadedTexture(surfaceTextureID));
                    break;

                default:
                    break;
                }
            }
        }
Exemplo n.º 3
0
 /// <summary>
 /// Searchs for the right handeness hand in the Avatar if available.
 /// </summary>
 private void FindHand()
 {
     if (_avatarHandComponent == null)
     {
         OvrAvatarHand avatarHand = handeness == Handeness.Right ? avatar.HandRight : avatar.HandLeft;
         _avatarHandComponent = avatarHand?.RenderParts[0];
     }
 }
Exemplo n.º 4
0
    private void AddRenderParts(
        OvrAvatarComponent ovrComponent,
        ovrAvatarComponent component,
        Transform parent)
    {
        bool isBody           = ovrComponent.name == "body";
        bool isLeftController = ovrComponent.name == "controller_left";
        bool isReftController = ovrComponent.name == "controller_right";

        for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++)
        {
            GameObject renderPartObject = new GameObject();
            renderPartObject.name = GetRenderPartName(component, renderPartIndex);
            renderPartObject.transform.SetParent(parent);
            renderPartObject.tag = transform.tag;
            IntPtr renderPart                      = GetRenderPart(component, renderPartIndex);
            ovrAvatarRenderPartType  type          = CAPI.ovrAvatarRenderPart_GetType(renderPart);
            OvrAvatarRenderComponent ovrRenderPart = null;
            switch (type)
            {
            case ovrAvatarRenderPartType.SkinnedMeshRender:
                ovrRenderPart = AddSkinnedMeshRenderComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRender(renderPart));
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS:
                ovrRenderPart = AddSkinnedMeshRenderPBSComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart));
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2:
            {
                ovrRenderPart = AddSkinnedMeshRenderPBSV2Component(
                    renderPart,
                    renderPartObject,
                    CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBSV2(renderPart),
                    isBody && renderPartIndex == 0,
                    isLeftController || isReftController);
            }
            break;

            default:
                break;
            }

            if (ovrRenderPart != null)
            {
                if (isBody)
                {
                    ovrRenderPart.GetComponent <BodyCollider>().owner = this;
                }
                ovrComponent.RenderParts.Add(ovrRenderPart);
                ovrRenderParts.Add(ovrRenderPart);
            }
        }
    }
Exemplo n.º 5
0
    private OvrAvatarProjectorRenderComponent AddProjectorRenderComponent(GameObject gameObject, ovrAvatarRenderPart_ProjectorRender projectorRender)
    {
        ovrAvatarComponent component = CAPI.ovrAvatarComponent_Get(sdkAvatar, projectorRender.componentIndex);
        OvrAvatarComponent ovrComponent;

        if (trackedComponents.TryGetValue(component.name, out ovrComponent))
        {
            if (projectorRender.renderPartIndex < ovrComponent.RenderParts.Count)
            {
                OvrAvatarRenderComponent          targetRenderPart   = ovrComponent.RenderParts[(int)projectorRender.renderPartIndex];
                OvrAvatarProjectorRenderComponent projectorComponent = gameObject.AddComponent <OvrAvatarProjectorRenderComponent>();
                projectorComponent.InitializeProjectorRender(projectorRender, SurfaceShader, targetRenderPart);
                return(projectorComponent);
            }
        }
        return(null);
    }
Exemplo n.º 6
0
    private void UpdateAvatarComponent(ovrAvatarComponent component)
    {
        OvrAvatarComponent ovrComponent;

        if (!trackedComponents.TryGetValue(component.name, out ovrComponent))
        {
            throw new Exception(
                      string.Format("trackedComponents didn't have {0}", component.name));
        }
        ConvertTransform(component.transform, ovrComponent.transform);
        for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++)
        {
            if (ovrComponent.RenderParts.Count <= renderPartIndex)
            {
                continue;
            }
            OvrAvatarRenderComponent renderComponent = ovrComponent.RenderParts[(int)renderPartIndex];
            IntPtr renderPart            = GetRenderPart(component, renderPartIndex);
            ovrAvatarRenderPartType type = Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetType(renderPart);
            switch (type)
            {
            case ovrAvatarRenderPartType.SkinnedMeshRender:
                ((OvrAvatarSkinnedMeshRenderComponent)renderComponent).UpdateSkinnedMeshRender(this, Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetSkinnedMeshRender(renderPart));
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS:
                ((OvrAvatarSkinnedMeshRenderPBSComponent)renderComponent).UpdateSkinnedMeshRenderPBS(this, Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart));
                break;

            case ovrAvatarRenderPartType.ProjectorRender:
                ((OvrAvatarProjectorRenderComponent)renderComponent).UpdateProjectorRender(Oculus.Avatar.CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart));
                break;

            default:
                throw new NotImplementedException(
                          string.Format("Unsupported render part type: {0}",
                                        type.ToString()));
            }
        }
    }
        private void AddRenderParts(
            OvrAvatarComponent ovrComponent,
            ovrAvatarComponent component,
            Transform parent)
        {
            for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++)
            {
                GameObject renderPartObject = new GameObject();
                renderPartObject.name = GetRenderPartName(component, renderPartIndex);

                renderPartObject.transform.SetParent(parent);
                renderPartObject.transform.localPosition = Vector2.zero;
                renderPartObject.transform.localRotation = Quaternion.identity;

                IntPtr renderPart                      = GetRenderPart(component, renderPartIndex);
                ovrAvatarRenderPartType  type          = CAPI.ovrAvatarRenderPart_GetType(renderPart);
                OvrAvatarRenderComponent ovrRenderPart = null;
                switch (type)
                {
                case ovrAvatarRenderPartType.SkinnedMeshRenderPBS:
                    ovrRenderPart = AddSkinnedMeshRenderPBSComponent(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBS(renderPart));
                    break;

                case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2:
                    ovrRenderPart = AddSkinnedMeshRenderPBSV2Component(renderPartObject, CAPI.ovrAvatarRenderPart_GetSkinnedMeshRenderPBSV2(renderPart));
                    break;

                default:
                    break;    // throw new NotImplementedException(string.Format("Unsupported render part type: {0}", type.ToString()));
                }

                if (ovrRenderPart != null)
                {
                    ovrComponent.RenderParts.Add(ovrRenderPart);
                    RenderParts.Add(ovrRenderPart);
                }
            }
        }
Exemplo n.º 8
0
    public void UpdateAvatar(ovrAvatarComponent component, OvrAvatar avatar)
    {
        OvrAvatar.ConvertTransform(component.transform, transform);

        for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++)
        {
            if (RenderParts.Count <= renderPartIndex)
            {
                break;
            }

            OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex];
            IntPtr renderPart            = OvrAvatar.GetRenderPart(component, renderPartIndex);
            ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart);
            switch (type)
            {
            case ovrAvatarRenderPartType.SkinnedMeshRender:
                ((OvrAvatarSkinnedMeshRenderComponent)renderComponent).UpdateSkinnedMeshRender(this, avatar, renderPart);
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS:
                ((OvrAvatarSkinnedMeshRenderPBSComponent)renderComponent).UpdateSkinnedMeshRenderPBS(avatar, renderPart, renderComponent.mesh.sharedMaterial);
                break;

            case ovrAvatarRenderPartType.ProjectorRender:
                ((OvrAvatarProjectorRenderComponent)renderComponent).UpdateProjectorRender(this, CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart));
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2:
                ((OvrAvatarSkinnedMeshPBSV2RenderComponent)renderComponent).UpdateSkinnedMeshRender(this, avatar, renderPart);
                break;

            default:
                break;
            }
        }
    }
    public void UpdateAvatar(ovrAvatarComponent component, OvrAvatar avatar)
    {
        if (IsCombiningMeshes)
        {
            if (!IsVertexDataUpdating)
            {
                CombineMeshes(component);
                IsCombiningMeshes = false;
                ThreadData        = null;
            }

            return;
        }

        OvrAvatar.ConvertTransform(component.transform, transform);

        for (UInt32 renderPartIndex = 0; renderPartIndex < component.renderPartCount; renderPartIndex++)
        {
            if (RenderParts.Count <= renderPartIndex)
            {
                break;
            }

            OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex];
            IntPtr renderPart            = OvrAvatar.GetRenderPart(component, renderPartIndex);
            ovrAvatarRenderPartType type = CAPI.ovrAvatarRenderPart_GetType(renderPart);
            switch (type)
            {
            case ovrAvatarRenderPartType.SkinnedMeshRender:
                ((OvrAvatarSkinnedMeshRenderComponent)renderComponent).UpdateSkinnedMeshRender(this, avatar, renderPart);
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS:
                var material = RootMeshComponent != null ? RootMeshComponent.sharedMaterial : renderComponent.mesh.sharedMaterial;
                ((OvrAvatarSkinnedMeshRenderPBSComponent)renderComponent).UpdateSkinnedMeshRenderPBS(avatar, renderPart, material);
                break;

            case ovrAvatarRenderPartType.ProjectorRender:
                ((OvrAvatarProjectorRenderComponent)renderComponent).UpdateProjectorRender(this, CAPI.ovrAvatarRenderPart_GetProjectorRender(renderPart));
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2:
                ((OvrAvatarSkinnedMeshPBSV2RenderComponent)renderComponent).UpdateSkinnedMeshRender(this, avatar, renderPart);
                break;

            default:
                break;
            }
        }

        // The mesh has been combined and therefore update the combined mesh "components"
        if (RootMeshComponent != null)
        {
            var part_zero = OvrAvatar.GetRenderPart(component, 0);

            ovrAvatarRenderPartType typeZero = CAPI.ovrAvatarRenderPart_GetType(part_zero);
            switch (typeZero)
            {
            case ovrAvatarRenderPartType.SkinnedMeshRender:
                UpdateActive(avatar, CAPI.ovrAvatarSkinnedMeshRender_GetVisibilityMask(part_zero));
                bool changedMaterial = (FirstMaterialUpdate && gameObject.activeSelf) || CAPI.ovrAvatarSkinnedMeshRender_MaterialStateChanged(part_zero);
                if (changedMaterial)
                {
                    FirstMaterialUpdate = false;
                    ovrAvatarMaterialState materialState = CAPI.ovrAvatarSkinnedMeshRender_GetMaterialState(part_zero);
                    UpdateAvatarMaterial(RootMeshComponent.sharedMaterial, materialState);
                }
                break;

            case ovrAvatarRenderPartType.SkinnedMeshRenderPBS:
                UpdateActive(avatar, CAPI.ovrAvatarSkinnedMeshRenderPBS_GetVisibilityMask(part_zero));
                break;

            case ovrAvatarRenderPartType.ProjectorRender:
            default:
                break;
            }
        }

        DebugDrawTransforms();
    }
        private void UpdateAvatarComponent(IntPtr nativeComponent)
        {
            ovrAvatarComponent nativeAvatarComponent = new ovrAvatarComponent();

            CAPI.ovrAvatarComponent_Get(nativeComponent, false, ref nativeAvatarComponent);
            ConvertTransform(nativeAvatarComponent.transform, transform);
            for (UInt32 renderPartIndex = 0; renderPartIndex < nativeAvatarComponent.renderPartCount; renderPartIndex++)
            {
                if (RenderParts.Count <= renderPartIndex)
                {
                    break;
                }

                OvrAvatarRenderComponent renderComponent = RenderParts[(int)renderPartIndex];
                IntPtr renderPart             = OvrAvatar.GetRenderPart(nativeAvatarComponent, renderPartIndex);
                ovrAvatarRenderPartType  type = CAPI.ovrAvatarRenderPart_GetType(renderPart);
                ovrAvatarTransform       localTransform;
                ovrAvatarVisibilityFlags visibilityMask;
                var mesh  = renderComponent.mesh;
                var bones = renderComponent.bones;
                switch (type)
                {
                case ovrAvatarRenderPartType.SkinnedMeshRenderPBS:
                    visibilityMask = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetVisibilityMask(renderPart);
                    localTransform = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetTransform(renderPart);
                    if ((visibilityMask & ovrAvatarVisibilityFlags.FirstPerson) != 0)
                    {
                        renderComponent.gameObject.SetActive(true);
                        mesh.enabled = true;
                    }

                    UpdateSkinnedMesh(localTransform, renderPart, bones);

                    UInt64 albedoTextureID  = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetAlbedoTextureAssetID(renderPart);
                    UInt64 surfaceTextureID = CAPI.ovrAvatarSkinnedMeshRenderPBS_GetSurfaceTextureAssetID(renderPart);
                    mesh.sharedMaterial.SetTexture("_Albedo", OvrAvatarComponent.GetLoadedTexture(albedoTextureID));
                    mesh.sharedMaterial.SetTexture("_Surface", OvrAvatarComponent.GetLoadedTexture(surfaceTextureID));
                    break;

                case ovrAvatarRenderPartType.SkinnedMeshRenderPBS_V2:
                    visibilityMask = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetVisibilityMask(renderPart);
                    localTransform = CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetTransform(renderPart);
                    if ((visibilityMask & ovrAvatarVisibilityFlags.FirstPerson) != 0)
                    {
                        renderComponent.gameObject.SetActive(true);
                        mesh.enabled = true;
                    }

                    UpdateSkinnedMesh(localTransform, renderPart, bones);

                    ovrAvatarPBSMaterialState materialState =
                        CAPI.ovrAvatarSkinnedMeshRenderPBSV2_GetPBSMaterialState(renderPart);
                    Texture2D diffuseTexture  = OvrAvatarComponent.GetLoadedTexture(materialState.albedoTextureID);
                    Texture2D normalTexture   = OvrAvatarComponent.GetLoadedTexture(materialState.normalTextureID);
                    Texture2D metallicTexture = OvrAvatarComponent.GetLoadedTexture(materialState.metallicnessTextureID);
                    mesh.materials[0].SetTexture("_MainTex", diffuseTexture);
                    mesh.materials[0].SetTexture("_NormalMap", normalTexture);
                    mesh.materials[0].SetTexture("_RoughnessMap", metallicTexture);
                    break;

                default:
                    break;
                }
            }
        }
Exemplo n.º 11
0
    internal void InitializeProjectorRender(ovrAvatarRenderPart_ProjectorRender render, Shader shader, OvrAvatarRenderComponent target)
    {
        if (shader == null)
        {
            shader = Shader.Find("OvrAvatar/AvatarSurfaceShader");
        }

        material = CreateAvatarMaterial(gameObject.name + "_projector", shader);
        material.EnableKeyword("PROJECTOR_ON");

        Renderer renderer = target.GetComponent <Renderer>();

        if (renderer != null)
        {
            List <Material> materials = new List <Material>(renderer.sharedMaterials);
            materials.Add(material);
            renderer.sharedMaterials = materials.ToArray();
        }
    }
    internal void InitializeProjectorRender(ovrAvatarRenderPart_ProjectorRender render, OvrAvatarRenderComponent target)
    {
        material = CreateAvatarMaterial(gameObject.name + "_projector", physicallyBasedShader: false, selfOccluding: false);
        material.EnableKeyword("PROJECTOR_ON");

        Renderer renderer = target.GetComponent <Renderer>();

        if (renderer != null)
        {
            List <Material> materials = new List <Material>(renderer.sharedMaterials);
            materials.Add(material);
            renderer.sharedMaterials = materials.ToArray();
        }
    }