Пример #1
0
        protected override void OnResultCompile()
        {
            if (Result == null)
            {
                GpuTexture result = null;

                PixelFormat createFormatV = CreateFormat;
                if (createFormatV != PixelFormat.Unknown)
                {
                    //create

                    Vector2I size = CreateSize;
                    if (size.X > 0 && size.Y > 0)
                    {
                        //!!!!!что еще проверить?

                        //!!!!3d support

                        TypeEnum type        = CreateType;
                        bool     mipmaps     = CreateMipmaps;
                        int      arrayLayers = CreateArrayLayers;
                        Usages   usage       = CreateUsage;
                        int      fsaa        = CreateFSAA;

                        int depth;
                        if (type == TypeEnum._2D)
                        {
                            depth = 1;
                        }
                        else if (type == TypeEnum.Cube)
                        {
                            depth = 6;
                        }
                        else
                        {
                            depth = CreateDepth;
                        }

                        GpuTexture.Usages gpuUsage = 0;
                        if ((usage & Usages.Dynamic) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.Dynamic;
                        }
                        else
                        {
                            gpuUsage |= GpuTexture.Usages.Static;
                        }
                        if ((usage & Usages.WriteOnly) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.WriteOnly;
                        }
                        if ((usage & Usages.AutoMipmaps) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.AutoMipmap;
                        }
                        if ((usage & Usages.RenderTarget) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.RenderTarget;
                        }
                        if ((usage & Usages.ReadBack) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.ReadBack;
                        }
                        if ((usage & Usages.BlitDestination) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.BlitDestination;
                        }

                        //!!!!!почему для других не Discardable?
                        if ((gpuUsage & GpuTexture.Usages.Dynamic) != 0 && (gpuUsage & GpuTexture.Usages.WriteOnly) != 0)
                        {
                            gpuUsage |= GpuTexture.Usages.DynamicWriteOnlyDiscardable;
                        }

                        result = new GpuTexture(type, size, depth, mipmaps, arrayLayers, createFormatV, gpuUsage, fsaa, out var error2);
                        if (!string.IsNullOrEmpty(error2))
                        {
                            result.Dispose();
                            result = null;

                            Log.Warning("Unable to create texture. " + error2);
                        }
                    }
                }
                else
                {
                    //load

                    //!!!!3d support

                    //!!!!!проверять наличие файла. если нет, то он по дефолту создает 512 512 Unknown формат. это какая-то хрень. надо разрулить

                    //!!!!threading


                    //!!!!!каждый раз проверять будет если нет файла. где еще так?

                    string[] loadCubeMap6Files = null;
                    string   loadFromOneFile   = null;

                    if (AnyCubemapSideIsSpecified())
                    {
                        if (AllCubemapSidesAreaSpecified())
                        {
                            loadCubeMap6Files = new string[6];
                            for (int n = 0; n < 6; n++)
                            {
                                var v = GetLoadCubeSide(n);
                                if (v != null)
                                {
                                    loadCubeMap6Files[n] = v.ResourceName;
                                }

                                if (string.IsNullOrEmpty(loadCubeMap6Files[n]) || !VirtualFile.Exists(loadCubeMap6Files[n]))
                                {
                                    loadCubeMap6Files = null;
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        var v = LoadFile.Value;
                        loadFromOneFile = v != null ? v.ResourceName : "";
                        if (string.IsNullOrEmpty(loadFromOneFile) || !VirtualFile.Exists(loadFromOneFile))
                        {
                            loadFromOneFile = null;
                        }
                    }

                    //!!!!
                    //bool RenderToTexture = false;
                    //if( RenderToTexture )
                    //	result = RenderToTextureTest();
                    //else
                    if (loadFromOneFile != null)
                    {
                        result = LoadOneTexture(loadFromOneFile);
                    }
                    else if (loadCubeMap6Files != null)
                    {
                        result = LoadCubeTexture(loadCubeMap6Files);
                    }
                }

                Result = result;
            }
        }