public void StartMeshCombining(ovrAvatarComponent component)
    {
        IsCombiningMeshes = true;
        gameObject.SetActive(false);

        ThreadData = new MeshThreadData[RenderParts.Count];
        const UInt32 BODY_INDEX = 0;

        for (UInt32 renderPartIndex = 0; renderPartIndex < RenderParts.Count; renderPartIndex++)
        {
            var    renderPart    = RenderParts[(int)renderPartIndex];
            IntPtr ovrRenderPart = OvrAvatar.GetRenderPart(component, renderPartIndex);
            var    materialState = CAPI.ovrAvatarSkinnedMeshRender_GetMaterialState(ovrRenderPart);

            ThreadData[renderPartIndex].VertexCount    = renderPart.mesh.sharedMesh.vertexCount;
            ThreadData[renderPartIndex].IsDarkMaterial = renderPartIndex != 0;

            if (materialState.alphaMaskTextureID != 0)
            {
                if (renderPartIndex != BODY_INDEX)
                {
                    ClothingAlphaOffset  = materialState.alphaMaskScaleOffset;
                    ClothingAlphaTexture = materialState.alphaMaskTextureID;
                }

                ThreadData[renderPartIndex].UsesAlpha = true;
            }

            ThreadData[renderPartIndex].MeshColors = renderPart.mesh.sharedMesh.colors;
        }

        VertexThread = new Thread(() => UpdateVertices(ref ThreadData));
        VertexThread.Start();
    }
Esempio n. 2
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;
                }
            }
        }
Esempio n. 4
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;
                }
            }
        }