private IEnumerator SetModelAsync(string newRenderModelName)
        {
            if (string.IsNullOrEmpty(newRenderModelName))
            {
                yield break;
            }

            // Pre-load all render models before asking for the data to create meshes.
            CVRRenderModels renderModels = Headers.OpenVR.RenderModels;

            if (renderModels == null)
            {
                yield break;
            }

            // Gather names of render models to pre-load.
            string[] renderModelNames;

            uint count = renderModels.GetComponentCount(newRenderModelName);

            if (count > 0)
            {
                renderModelNames = new string[count];

                for (int componentIndex = 0; componentIndex < count; componentIndex++)
                {
                    uint capacity = renderModels.GetComponentName(newRenderModelName, (uint)componentIndex, null, 0);
                    if (capacity == 0)
                    {
                        continue;
                    }

                    var componentNameStringBuilder = new System.Text.StringBuilder((int)capacity);
                    if (renderModels.GetComponentName(newRenderModelName, (uint)componentIndex, componentNameStringBuilder, capacity) == 0)
                    {
                        continue;
                    }

                    string componentName = componentNameStringBuilder.ToString();

                    capacity = renderModels.GetComponentRenderModelName(newRenderModelName, componentName, null, 0);
                    if (capacity == 0)
                    {
                        continue;
                    }

                    var nameStringBuilder = new System.Text.StringBuilder((int)capacity);
                    if (renderModels.GetComponentRenderModelName(newRenderModelName, componentName, nameStringBuilder, capacity) == 0)
                    {
                        continue;
                    }

                    var s = nameStringBuilder.ToString();

                    // Only need to pre-load if not already cached.
                    if (!(models[s] is RenderModel model) || model.Mesh == null)
                    {
                        renderModelNames[componentIndex] = s;
                    }
                }
            }
            else
            {
                // Only need to pre-load if not already cached.
                if (!(models[newRenderModelName] is RenderModel model) || model.Mesh == null)
                {
                    renderModelNames = new string[] { newRenderModelName };
                }
コード例 #2
0
    // Token: 0x06000DE3 RID: 3555 RVA: 0x00058504 File Offset: 0x00056704
    private bool LoadComponents(SteamVR_RenderModel.RenderModelInterfaceHolder holder, string renderModelName)
    {
        Transform transform = base.transform;

        for (int i = 0; i < transform.childCount; i++)
        {
            Transform child = transform.GetChild(i);
            child.gameObject.SetActive(false);
            this.StripMesh(child.gameObject);
        }
        if (string.IsNullOrEmpty(renderModelName))
        {
            return(true);
        }
        CVRRenderModels instance = holder.instance;

        if (instance == null)
        {
            return(false);
        }
        uint componentCount = instance.GetComponentCount(renderModelName);

        if (componentCount == 0U)
        {
            return(false);
        }
        int num = 0;

        while ((long)num < (long)((ulong)componentCount))
        {
            uint num2 = instance.GetComponentName(renderModelName, (uint)num, null, 0U);
            if (num2 != 0U)
            {
                StringBuilder stringBuilder = new StringBuilder((int)num2);
                if (instance.GetComponentName(renderModelName, (uint)num, stringBuilder, num2) != 0U)
                {
                    transform = this.FindComponent(stringBuilder.ToString());
                    if (transform != null)
                    {
                        transform.gameObject.SetActive(true);
                    }
                    else
                    {
                        transform                  = new GameObject(stringBuilder.ToString()).transform;
                        transform.parent           = base.transform;
                        transform.gameObject.layer = base.gameObject.layer;
                        Transform transform2 = new GameObject("attach").transform;
                        transform2.parent           = transform;
                        transform2.localPosition    = Vector3.zero;
                        transform2.localRotation    = Quaternion.identity;
                        transform2.localScale       = Vector3.one;
                        transform2.gameObject.layer = base.gameObject.layer;
                    }
                    transform.localPosition = Vector3.zero;
                    transform.localRotation = Quaternion.identity;
                    transform.localScale    = Vector3.one;
                    num2 = instance.GetComponentRenderModelName(renderModelName, stringBuilder.ToString(), null, 0U);
                    if (num2 != 0U)
                    {
                        StringBuilder stringBuilder2 = new StringBuilder((int)num2);
                        if (instance.GetComponentRenderModelName(renderModelName, stringBuilder.ToString(), stringBuilder2, num2) != 0U)
                        {
                            SteamVR_RenderModel.RenderModel renderModel = SteamVR_RenderModel.models[stringBuilder2] as SteamVR_RenderModel.RenderModel;
                            if (renderModel == null || renderModel.mesh == null)
                            {
                                if (this.verbose)
                                {
                                    Debug.Log("Loading render model " + stringBuilder2);
                                }
                                renderModel = this.LoadRenderModel(instance, stringBuilder2.ToString(), renderModelName);
                                if (renderModel == null)
                                {
                                    goto IL_227;
                                }
                                SteamVR_RenderModel.models[stringBuilder2] = renderModel;
                            }
                            transform.gameObject.AddComponent <MeshFilter>().mesh             = renderModel.mesh;
                            transform.gameObject.AddComponent <MeshRenderer>().sharedMaterial = renderModel.material;
                        }
                    }
                }
            }
IL_227:
            num++;
        }
        return(true);
    }
コード例 #3
0
    // Token: 0x06000DDD RID: 3549 RVA: 0x00057F55 File Offset: 0x00056155
    private IEnumerator SetModelAsync(string renderModelName)
    {
        if (string.IsNullOrEmpty(renderModelName))
        {
            yield break;
        }
        using (SteamVR_RenderModel.RenderModelInterfaceHolder holder = new SteamVR_RenderModel.RenderModelInterfaceHolder())
        {
            CVRRenderModels renderModels = holder.instance;
            if (renderModels == null)
            {
                yield break;
            }
            uint     componentCount = renderModels.GetComponentCount(renderModelName);
            string[] renderModelNames;
            if (componentCount > 0U)
            {
                renderModelNames = new string[componentCount];
                int num = 0;
                while ((long)num < (long)((ulong)componentCount))
                {
                    uint num2 = renderModels.GetComponentName(renderModelName, (uint)num, null, 0U);
                    if (num2 != 0U)
                    {
                        StringBuilder stringBuilder = new StringBuilder((int)num2);
                        if (renderModels.GetComponentName(renderModelName, (uint)num, stringBuilder, num2) != 0U)
                        {
                            num2 = renderModels.GetComponentRenderModelName(renderModelName, stringBuilder.ToString(), null, 0U);
                            if (num2 != 0U)
                            {
                                StringBuilder stringBuilder2 = new StringBuilder((int)num2);
                                if (renderModels.GetComponentRenderModelName(renderModelName, stringBuilder.ToString(), stringBuilder2, num2) != 0U)
                                {
                                    string text = stringBuilder2.ToString();
                                    SteamVR_RenderModel.RenderModel renderModel = SteamVR_RenderModel.models[text] as SteamVR_RenderModel.RenderModel;
                                    if (renderModel == null || renderModel.mesh == null)
                                    {
                                        renderModelNames[num] = text;
                                    }
                                }
                            }
                        }
                    }
                    num++;
                }
            }
            else
            {
                SteamVR_RenderModel.RenderModel renderModel2 = SteamVR_RenderModel.models[renderModelName] as SteamVR_RenderModel.RenderModel;
                if (renderModel2 == null || renderModel2.mesh == null)
                {
                    renderModelNames = new string[]
                    {
                        renderModelName
                    };
                }
                else
                {
                    renderModelNames = new string[0];
                }
            }
            for (;;)
            {
                bool flag = false;
                foreach (string text2 in renderModelNames)
                {
                    if (!string.IsNullOrEmpty(text2))
                    {
                        IntPtr zero = IntPtr.Zero;
                        EVRRenderModelError evrrenderModelError = renderModels.LoadRenderModel_Async(text2, ref zero);
                        if (evrrenderModelError == EVRRenderModelError.Loading)
                        {
                            flag = true;
                        }
                        else if (evrrenderModelError == EVRRenderModelError.None)
                        {
                            RenderModel_t renderModel_t = this.MarshalRenderModel(zero);
                            Material      material      = SteamVR_RenderModel.materials[renderModel_t.diffuseTextureId] as Material;
                            if (material == null || material.mainTexture == null)
                            {
                                IntPtr zero2 = IntPtr.Zero;
                                evrrenderModelError = renderModels.LoadTexture_Async(renderModel_t.diffuseTextureId, ref zero2);
                                if (evrrenderModelError == EVRRenderModelError.Loading)
                                {
                                    flag = true;
                                }
                            }
                        }
                    }
                }
                if (!flag)
                {
                    break;
                }
                yield return(new WaitForSeconds(0.1f));
            }
            renderModels     = null;
            renderModelNames = null;
        }
        SteamVR_RenderModel.RenderModelInterfaceHolder holder = null;
        bool arg = this.SetModel(renderModelName);

        SteamVR_Events.RenderModelLoaded.Send(this, arg);
        yield break;
        yield break;
    }
コード例 #4
0
    // BUGBUG: PaulBro - workaround for Error: Unity SteamVR: Failed to load IVRRenderModels interface version IVRRenderModels_005
    // See https://steamcommunity.com/app/358720/discussions/0/357286663674402763/
    // private bool LoadComponents(RenderModelInterfaceHolder holder, string renderModelName)
    private bool LoadComponents(CVRRenderModels renderModels, string renderModelName)
    {
        // Disable existing components (we will re-enable them if referenced by this new model).
        // Also strip mesh filter and renderer since these will get re-added if the new component needs them.
        var t = transform;

        for (int i = 0; i < t.childCount; i++)
        {
            var child = t.GetChild(i);
            child.gameObject.SetActive(false);
            StripMesh(child.gameObject);
        }

        // If no model specified, we're done; return success.
        if (string.IsNullOrEmpty(renderModelName))
        {
            return(true);
        }

        // BUGBUG: PaulBro - workaround for Error: Unity SteamVR: Failed to load IVRRenderModels interface version IVRRenderModels_005
        //var renderModels = holder.instance;
        if (renderModels == null)
        {
            return(false);
        }

        var count = renderModels.GetComponentCount(renderModelName);

        if (count == 0)
        {
            return(false);
        }

        for (int i = 0; i < count; i++)
        {
            var capacity = renderModels.GetComponentName(renderModelName, (uint)i, null, 0);
            if (capacity == 0)
            {
                continue;
            }

            var componentName = new System.Text.StringBuilder((int)capacity);
            if (renderModels.GetComponentName(renderModelName, (uint)i, componentName, capacity) == 0)
            {
                continue;
            }

            // Create (or reuse) a child object for this component (some components are dynamic and don't have meshes).
            t = FindComponent(componentName.ToString());
            if (t != null)
            {
                t.gameObject.SetActive(true);
            }
            else
            {
                t                  = new GameObject(componentName.ToString()).transform;
                t.parent           = transform;
                t.gameObject.layer = gameObject.layer;

                // Also create a child 'attach' object for attaching things.
                var attach = new GameObject(k_localTransformName).transform;
                attach.parent           = t;
                attach.localPosition    = Vector3.zero;
                attach.localRotation    = Quaternion.identity;
                attach.localScale       = Vector3.one;
                attach.gameObject.layer = gameObject.layer;
            }

            // Reset transform.
            t.localPosition = Vector3.zero;
            t.localRotation = Quaternion.identity;
            t.localScale    = Vector3.one;

            capacity = renderModels.GetComponentRenderModelName(renderModelName, componentName.ToString(), null, 0);
            if (capacity == 0)
            {
                continue;
            }

            var componentRenderModelName = new System.Text.StringBuilder((int)capacity);
            if (renderModels.GetComponentRenderModelName(renderModelName, componentName.ToString(), componentRenderModelName, capacity) == 0)
            {
                continue;
            }

            // Check the cache or load into memory.
            var model = models[componentRenderModelName] as RenderModel;
            if (model == null || model.mesh == null)
            {
                if (verbose)
                {
                    Debug.Log("Loading render model " + componentRenderModelName);
                }

                model = LoadRenderModel(renderModels, componentRenderModelName.ToString(), renderModelName);
                if (model == null)
                {
                    continue;
                }

                models[componentRenderModelName] = model;
            }

            t.gameObject.AddComponent <MeshFilter>().mesh             = model.mesh;
            t.gameObject.AddComponent <MeshRenderer>().sharedMaterial = model.material;
        }

        return(true);
    }