Ejemplo n.º 1
0
            private static IResource GetResource(string filepath, MyFileTextureEnum type, MyFileArrayTexture referenceArray, int referenceSlice, Vector2I textureSize, out Texture2DDescription description, out int sourceSlice)
            {
                if (referenceArray != null && referenceSlice < referenceArray.Size3.Z && referenceArray.Size == textureSize && filepath == referenceArray.SubresourceFilenames[referenceSlice])
                {
                    var tex2d = referenceArray.Resource as Texture2D;
                    description = tex2d.Description;
                    sourceSlice = referenceSlice;
                    return(referenceArray);
                }
                else
                {
                    var texture = MyManagers.FileTextures.GetTexture(filepath, type, true, temporary: true);
                    var tex2d   = texture.Resource as Texture2D;
                    if (tex2d == null)
                    {
                        var tex2D = texture.Resource as Texture2D;
                        MyRenderProxy.Assert(tex2D != null,
                                             "MyFileArrayTexture supports only 2D textures. Inconsistent texture: " + filepath);

                        description = new Texture2DDescription();
                        sourceSlice = -1;
                        return(null);
                    }

                    description = tex2d.Description;
                    sourceSlice = 0;
                    return(texture);
                }
            }
Ejemplo n.º 2
0
        /// <summary>Bind blend states for alpha blending</summary>
        public static void BindMaterialTextureBlendStates(MyRenderContext rc, MyFileTextureEnum textures)
        {
            textures &= ~MyFileTextureEnum.ALPHAMASK;
            switch (textures)
            {
            case MyFileTextureEnum.COLOR_METAL:
                rc.SetBlendState(MyBlendStateManager.BlendDecalNormal);
                break;

            case MyFileTextureEnum.NORMALMAP_GLOSS:
                rc.SetBlendState(MyBlendStateManager.BlendDecalColor);
                break;

            case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS:
                rc.SetBlendState(MyBlendStateManager.BlendDecalNormalColor);
                break;

            case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS | MyFileTextureEnum.EXTENSIONS:
                rc.SetBlendState(MyBlendStateManager.BlendDecalNormalColorExt);
                break;

            default:
                throw new Exception("Unknown texture bundle type");
            }
        }
Ejemplo n.º 3
0
        static MyFileTextureEnum GetTextureType(MyChannel channel)
        {
            MyFileTextureEnum type = MyFileTextureEnum.UNSPECIFIED;

            switch (channel)
            {
            case MyChannel.ColorMetal:
                type = MyFileTextureEnum.COLOR_METAL;
                break;

            case MyChannel.NormalGloss:
                type = MyFileTextureEnum.NORMALMAP_GLOSS;
                break;

            case MyChannel.Extension:
                type = MyFileTextureEnum.EXTENSIONS;
                break;

            case MyChannel.Alphamask:
                type = MyFileTextureEnum.ALPHAMASK;
                break;

            default:
                MyRenderProxy.Assert(false, "Channel is not recognised");
                break;
            }
            return(type);
        }
Ejemplo n.º 4
0
        public static MyFileTextureEnum GetMaterialTextureTypes(string colorMetalTexture,
                                                                string normalGlossTexture, string extensionTexture, string alphamaskTexture)
        {
            MyFileTextureEnum ret = MyFileTextureEnum.UNSPECIFIED;

            if (!string.IsNullOrEmpty(colorMetalTexture))
            {
                ret |= MyFileTextureEnum.COLOR_METAL;
            }

            if (!string.IsNullOrEmpty(normalGlossTexture))
            {
                ret |= MyFileTextureEnum.NORMALMAP_GLOSS;
            }

            if (!string.IsNullOrEmpty(extensionTexture))
            {
                ret |= MyFileTextureEnum.EXTENSIONS;
            }

            if (!string.IsNullOrEmpty(alphamaskTexture))
            {
                ret |= MyFileTextureEnum.ALPHAMASK;
            }

            return(ret);
        }
Ejemplo n.º 5
0
        /// <summary>Get macro bundles for texture types</summary>
        public static ShaderMacro[] GetMaterialTextureMacros(MyFileTextureEnum textures)
        {
            const string USE_COLORMETAL_TEXTURE  = "USE_COLORMETAL_TEXTURE";
            const string USE_NORMALGLOSS_TEXTURE = "USE_NORMALGLOSS_TEXTURE";
            const string USE_EXTENSIONS_TEXTURE  = "USE_EXTENSIONS_TEXTURE";

            List <ShaderMacro> macros = new List <ShaderMacro>();

            if (textures.HasFlag(MyFileTextureEnum.COLOR_METAL))
            {
                macros.Add(new ShaderMacro(USE_COLORMETAL_TEXTURE, null));
            }

            if (textures.HasFlag(MyFileTextureEnum.NORMALMAP_GLOSS))
            {
                macros.Add(new ShaderMacro(USE_NORMALGLOSS_TEXTURE, null));
            }

            if (textures.HasFlag(MyFileTextureEnum.EXTENSIONS))
            {
                macros.Add(new ShaderMacro(USE_EXTENSIONS_TEXTURE, null));
            }

            return(macros.ToArray());
        }
Ejemplo n.º 6
0
 public void Init(string name, MyFileTextureEnum type, bool waitTillLoaded, bool skipQualityReduction)
 {
     m_name                 = name;
     m_type                 = type;
     TextureState           = waitTillLoaded ? FileTextureState.Unloaded : FileTextureState.Requested;
     m_skipQualityReduction = skipQualityReduction;
 }
Ejemplo n.º 7
0
        /// <remarks>On big loops, or whenever recommendable, cache the returned reference</remarks>
        public ITexture GetTexture(string name, MyFileTextureEnum type, bool waitTillLoaded = false, bool skipQualityReduction = false)
        {
            if (name == null || name.Length <= 0)
            {
                return(ReturnDefaultTexture(type));
            }

            Uri uri;

            if (!MyResourceUtils.NormalizeFileTextureName(ref name, out uri))
            {
                IGeneratedTexture texture;
                if (m_generatedTextures.TryGetValue(name, out texture))
                {
                    return(texture);
                }
                else
                {
                    MyRenderProxy.Assert(false, "Can't find generated texture with name \"" + name + "\"");
                    return(ReturnDefaultTexture(type));
                }
            }

            MyFileTexture texOut;

            if (!m_textures.TryGetValue(name, out texOut))
            {
                if (uri.Scheme != FILE_SCHEME)
                {
                    Debug.Assert(false, "Cannot initialize a non file texture");
                    return(ReturnDefaultTexture(type));
                }

                m_texturesPool.AllocateOrCreate(out texOut);
                texOut.Init(name, uri.LocalPath, type, waitTillLoaded, skipQualityReduction);
                m_textures.Add(name, texOut);
            }

            switch (texOut.TextureState)
            {
            case FileTextureState.Unloaded:
            case FileTextureState.Requested:
                if (waitTillLoaded)
                {
                    LoadInternal(name);
                }
                else
                {
                    texOut.TextureState = FileTextureState.Requested;
                    m_requestedTextures.Add(name);
                }
                break;

            case FileTextureState.Loaded:
                break;
            }

            return(texOut);
        }
Ejemplo n.º 8
0
 public void Init(string name, string localPath, MyFileTextureEnum type, bool waitTillLoaded, bool skipQualityReduction)
 {
     Debug.Assert(System.IO.Path.IsPathRooted(localPath), "Path must be rooted");
     m_name                 = name;
     m_path                 = System.IO.Path.GetFullPath(localPath);
     m_type                 = type;
     TextureState           = waitTillLoaded ? FileTextureState.Unloaded : FileTextureState.Requested;
     m_skipQualityReduction = skipQualityReduction;
 }
 public void Init(string name, MyFileTextureEnum type, byte[] errorBytePattern, Format formatBytePattern)
 {
     m_name              = name;
     m_type              = type;
     m_arrayTexture      = null;
     m_dirtyFlag         = false;
     m_numRefs           = 1;
     m_errorBytePattern  = errorBytePattern;
     m_formatBytePattern = formatBytePattern;
 }
        public IDynamicFileArrayTexture CreateTexture(string name, MyFileTextureEnum type, byte[] bytePattern, Format bytePatternFormat)
        {
            MyDynamicFileArrayTexture tex;

            m_objectsPool.AllocateOrCreate(out tex);
            tex.Init(name, type, bytePattern, bytePatternFormat);

            //if (destroyOnUnloadSession)
            //    m_texarraysAutodestroyed.Add(tex);
            return(tex);
        }
Ejemplo n.º 11
0
            public void Load(string resourceName, string[] filePaths, MyFileTextureEnum type)
            {
                m_resourceName = resourceName;

                if (m_listSubresourceFilenames == null)
                    m_objectsPoolOfStringLists.AllocateOrCreate(out m_listSubresourceFilenames);
                m_listSubresourceFilenames.Clear();
                foreach (string path in filePaths)
                    m_listSubresourceFilenames.Add(path);
                m_type = type;

                ISrvBindable tex = MyManagers.FileTextures.GetTexture(filePaths[0], type);
                m_size = tex.Size;
                TextureFormat = Format.Unknown;
            }
        public IFileArrayTexture CreateFromFiles(string resourceName, string[] inputFiles,
                                                 MyFileTextureEnum type)
        {
            MyFileArrayTexture array;

            m_fileTextureArrays.AllocateOrCreate(out array);
            array.Load(resourceName, inputFiles, type);

            if (m_isDeviceInit)
            {
                array.OnDeviceInit();
            }

            return(array);
        }
Ejemplo n.º 13
0
        void FillStreamWithTerrainBatch(int materialId,
                                        int vertexMaterialIndex, int indexCount, int startIndex, int baseVertex)
        {
            // all necessary data should be same - geometry and input layout
            var renderable = Owner.GetRenderable();
            var proxy      = renderable.Lods[0].RenderableProxies[0];

            // get shader for streaming
            MyFileTextureEnum textureTypes = proxy.Material == MyMeshMaterialId.NULL ? MyFileTextureEnum.UNSPECIFIED : proxy.Material.Info.TextureTypes;
            var bundle = MyMaterialShaders.Get(MyMaterialShaders.MULTI_MATERIAL_TAG,
                                               MyMaterialShaders.FOLIAGE_STREAMING_PASS_ID, MyMeshes.VoxelLayout,
                                               renderable.Lods[0].VertexShaderFlags & ~MyShaderUnifiedFlags.USE_VOXEL_MORPHING, textureTypes);

            MyRender11.FoliageGenerator.RecordCommands(proxy, m_streams[materialId], materialId,
                                                       bundle.VS, bundle.IL,
                                                       vertexMaterialIndex, indexCount, startIndex, baseVertex);
        }
Ejemplo n.º 14
0
        IDynamicFileArrayTexture GetArrayTextureFromKey(MyArrayTextureKey key)
        {
            IDynamicFileArrayTexture arrayTexture;

            if (m_dictTextures.TryGetValue(key, out arrayTexture))
            {
                return(arrayTexture);
            }

            string            name    = key.ToString();
            MyFileTextureEnum texType = GetTextureType(key.Channel);

            byte[] bytePattern = MyGeneratedTexturePatterns.GetBytePattern(key.Channel, key.Format);
            arrayTexture        = MyManagers.DynamicFileArrayTextures.CreateTexture(name, texType, bytePattern, key.Format);
            m_dictTextures[key] = arrayTexture;
            return(arrayTexture);
        }
Ejemplo n.º 15
0
        private ITexture ReturnDefaultTexture(MyFileTextureEnum type)
        {
            switch (type)
            {
            case MyFileTextureEnum.NORMALMAP_GLOSS:
                return(MyGeneratedTextureManager.MissingNormalGlossTex);

            case MyFileTextureEnum.EXTENSIONS:
                return(MyGeneratedTextureManager.MissingExtensionTex);

            case MyFileTextureEnum.ALPHAMASK:
                return(MyGeneratedTextureManager.MissingAlphamaskTex);

            case MyFileTextureEnum.CUBEMAP:
                return(MyGeneratedTextureManager.MissingCubeTex);
            }
            return(MyGeneratedTextureManager.PinkTex);
        }
Ejemplo n.º 16
0
            internal static bool IsQualityDependantFilter(IFileTexture texture)
            {
                MyFileTexture     textureInternal = (MyFileTexture)texture;
                MyFileTextureEnum type            = textureInternal.TextureType;

                if (type == MyFileTextureEnum.SYSTEM)
                {
                    return(false);
                }
                if (type == MyFileTextureEnum.GUI)
                {
                    return(false);
                }
                if (type == MyFileTextureEnum.GPUPARTICLES)
                {
                    return(false);
                }
                return(true);
            }
            public void Load(string resourceName, string[] filePaths, MyFileTextureEnum type)
            {
                m_resourceName = resourceName;

                if (m_listSubresourceFilenames == null)
                {
                    m_objectsPoolOfStringLists.AllocateOrCreate(out m_listSubresourceFilenames);
                }
                m_listSubresourceFilenames.Clear();
                foreach (string path in filePaths)
                {
                    m_listSubresourceFilenames.Add(path);
                }
                m_type = type;

                ISrvBindable tex = MyManagers.FileTextures.GetTexture(filePaths[0], type);

                m_size        = tex.Size;
                TextureFormat = Format.Unknown;
            }
Ejemplo n.º 18
0
            public void Load(string resourceName, string[] filePaths, MyFileTextureEnum type, byte[] bytePattern, Format formatBytePattern)
            {
                m_resourceName = resourceName;

                if (m_listSubresourceFilenames == null)
                {
                    m_objectsPoolOfStringLists.AllocateOrCreate(out m_listSubresourceFilenames);
                }
                m_listSubresourceFilenames.Clear();
                foreach (string path in filePaths)
                {
                    m_listSubresourceFilenames.Add(path);
                }
                m_type = type;

                ISrvBindable tex = MyManagers.FileTextures.GetTexture(filePaths[0], type, temporary: true);

                m_size = tex.Size;
                Format = Format.Unknown;
                m_recoverySystem.UseBytePattern    = true;
                m_recoverySystem.FormatBytePattern = formatBytePattern;
                m_recoverySystem.BytePattern       = bytePattern;
            }
Ejemplo n.º 19
0
        unsafe static void DrawBatches(MyRenderContext rc, MyStringId material, int matIndex, bool transparent)
        {
            if (m_jobs.Count == 0)
            {
                return;
            }

            var matDesc = m_materials[material][matIndex];

            rc.PixelShader.SetSrv(0, MyGBuffer.Main.DepthStencil.SrvDepth);
            rc.PixelShader.SetSrv(1, MyGlobalResources.Gbuffer1Copy);
            if (transparent)
            {
                rc.PixelShader.Set(m_psColorMapTransparent);
            }
            else
            {
                rc.SetRtvs(MyGBuffer.Main, MyDepthStencilAccess.ReadOnly);
                MyFileTextureEnum type = matDesc.DecalType;
                switch (type)
                {
                case MyFileTextureEnum.NORMALMAP_GLOSS:
                    rc.PixelShader.Set(m_psNormalMap);
                    break;

                case MyFileTextureEnum.COLOR_METAL:
                    rc.PixelShader.Set(m_psColorMap);
                    break;

                case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS:
                    rc.PixelShader.Set(m_psNormalColorMap);
                    break;

                case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS | MyFileTextureEnum.EXTENSIONS:
                    rc.PixelShader.Set(m_psNormalColorExtMap);
                    break;

                default:
                    throw new Exception("Unknown decal type");
                }
                MyMeshMaterials1.BindMaterialTextureBlendStates(rc, type);
            }

            // factor 1 makes overwriting of gbuffer color & subtracting from ao
            MyFileTextureManager texManager = MyManagers.FileTextures;

            rc.PixelShader.SetSrv(3, texManager.GetTexture(matDesc.AlphamaskTexture, MyFileTextureEnum.ALPHAMASK));
            rc.PixelShader.SetSrv(4, texManager.GetTexture(matDesc.ColorMetalTexture, MyFileTextureEnum.COLOR_METAL));
            rc.PixelShader.SetSrv(5, texManager.GetTexture(matDesc.NormalmapTexture, MyFileTextureEnum.NORMALMAP_GLOSS));
            rc.PixelShader.SetSrv(6, texManager.GetTexture(matDesc.ExtensionsTexture, MyFileTextureEnum.EXTENSIONS));

            var decalCb = MyCommon.GetObjectCB(sizeof(MyDecalConstants) * DECAL_BATCH_SIZE);

            int batchCount = m_jobs.Count / DECAL_BATCH_SIZE + 1;
            int offset     = 0;

            for (int i1 = 0; i1 < batchCount; i1++)
            {
                var mapping = MyMapping.MapDiscard(decalCb);

                int leftDecals = m_jobs.Count - offset;
                int decalCount = leftDecals > DECAL_BATCH_SIZE ? DECAL_BATCH_SIZE : leftDecals;
                for (int i2 = 0; i2 < decalCount; ++i2)
                {
                    MyDecalConstants constants = new MyDecalConstants();
                    EncodeJobConstants(i2 + offset, ref constants);
                    mapping.WriteAndPosition(ref constants);
                }

                mapping.Unmap();

                // Draw a box without buffer: 36 vertices -> 12 triangles. 2 triangles per face -> 6 faces
                MyImmediateRC.RC.DrawIndexed(36 * decalCount, 0, 0);

                offset += DECAL_BATCH_SIZE;
            }
        }
Ejemplo n.º 20
0
 public void Init(string name, string localPath, MyFileTextureEnum type, bool waitTillLoaded, bool skipQualityReduction)
 {
     Debug.Assert(System.IO.Path.IsPathRooted(localPath), "Path must be rooted");
     m_name = name;
     m_path = System.IO.Path.GetFullPath(localPath);
     m_type = type;
     TextureState = waitTillLoaded ? FileTextureState.Unloaded : FileTextureState.Requested;
     m_skipQualityReduction = skipQualityReduction;
 }
 public void Init(string name, MyFileTextureEnum type, byte[] errorBytePattern, Format formatBytePattern)
 {
     m_name = name;
     m_type = type;
     m_arrayTexture = null;
     m_dirtyFlag = false;
     m_numRefs = 1;
     m_errorBytePattern = errorBytePattern;
     m_formatBytePattern = formatBytePattern;
 }
Ejemplo n.º 22
0
        // if texture cannot be loaded, it will be used byte pattern to generate substition texture
        public IFileArrayTexture CreateFromFiles(string resourceName, string[] inputFiles, MyFileTextureEnum type, byte[] bytePatternFor4x4, Format formatBytePattern, bool autoDisposeOnUnload)
        {
            MyFileArrayTexture array;

            m_fileTextureArrays.AllocateOrCreate(out array);
            array.Load(resourceName, inputFiles, type, bytePatternFor4x4, formatBytePattern);

            if (m_isDeviceInit)
            {
                array.OnDeviceInit();
            }

            if (autoDisposeOnUnload)
            {
                m_texturesOnAutoDisposal.Add(array);
            }

            return(array);
        }
Ejemplo n.º 23
0
        public IFileArrayTexture CreateFromFiles(string resourceName, string[] inputFiles, MyFileTextureEnum type, string errorTextureFilepath, bool autoDisposeOnUnload)
        {
            MyFileArrayTexture array;

            m_fileTextureArrays.AllocateOrCreate(out array);
            array.Load(resourceName, inputFiles, type, errorTextureFilepath);

            if (m_isDeviceInit)
            {
                array.OnDeviceInit();
            }

            if (autoDisposeOnUnload)
            {
                m_texturesOnAutoDisposal.Add(array);
            }

            return(array);
        }
Ejemplo n.º 24
0
        public IFileArrayTexture CreateFromFiles(string resourceName, string[] inputFiles,
            MyFileTextureEnum type)
        {
            MyFileArrayTexture array;
            m_fileTextureArrays.AllocateOrCreate(out array);
            array.Load(resourceName, inputFiles, type);

            if (m_isDeviceInit)
                array.OnDeviceInit();

            return array;
        }
Ejemplo n.º 25
0
        /// <summary>Get macro bundles for texture types</summary>
        public static ShaderMacro[] GetMaterialTextureMacros(MyFileTextureEnum textures)
        {
            const string USE_COLORMETAL_TEXTURE = "USE_COLORMETAL_TEXTURE";
            const string USE_NORMALGLOSS_TEXTURE = "USE_NORMALGLOSS_TEXTURE";
            const string USE_EXTENSIONS_TEXTURE = "USE_EXTENSIONS_TEXTURE";

            List<ShaderMacro> macros = new List<ShaderMacro>();
            if (textures.HasFlag(MyFileTextureEnum.COLOR_METAL))
                macros.Add(new ShaderMacro(USE_COLORMETAL_TEXTURE, null));

            if (textures.HasFlag(MyFileTextureEnum.NORMALMAP_GLOSS))
                macros.Add(new ShaderMacro(USE_NORMALGLOSS_TEXTURE, null));

            if (textures.HasFlag(MyFileTextureEnum.EXTENSIONS))
                macros.Add(new ShaderMacro(USE_EXTENSIONS_TEXTURE, null));

            return macros.ToArray();
        }
Ejemplo n.º 26
0
        public IFileArrayTexture CreateFromFiles(string resourceName, string[] inputFiles, MyFileTextureEnum type, string errorTextureFilepath, bool autoDisposeOnUnload)
        {
            MyFileArrayTexture array;
            m_fileTextureArrays.AllocateOrCreate(out array);
            array.Load(resourceName, inputFiles, type, errorTextureFilepath);

            if (m_isDeviceInit)
                array.OnDeviceInit();

            if (autoDisposeOnUnload)
                m_texturesOnAutoDisposal.Add(array);

            return array;
        }
Ejemplo n.º 27
0
 internal static void AddMaterialShaderFlagMacrosTo(List<ShaderMacro> list, MyShaderUnifiedFlags flags, MyFileTextureEnum textureTypes = MyFileTextureEnum.UNSPECIFIED)
 {
     if ((flags & MyShaderUnifiedFlags.DEPTH_ONLY) > 0)
         list.Add(new ShaderMacro("DEPTH_ONLY", null));
     if ((flags & MyShaderUnifiedFlags.ALPHA_MASKED) > 0)
         list.Add(new ShaderMacro("ALPHA_MASKED", null));
     if ((flags & MyShaderUnifiedFlags.ALPHA_MASK_ARRAY) > 0)
         list.Add(new ShaderMacro("ALPHA_MASK_ARRAY", null));
     if ((flags & MyShaderUnifiedFlags.TRANSPARENT) > 0)
         list.Add(new ShaderMacro("TRANSPARENT", null));
     if ((flags & MyShaderUnifiedFlags.DITHERED) > 0)
         list.Add(new ShaderMacro("DITHERED", null));
     if ((flags & MyShaderUnifiedFlags.DITHERED_LOD) > 0)
         list.Add(new ShaderMacro("DITHERED_LOD", null));
     if ((flags & MyShaderUnifiedFlags.USE_SKINNING) > 0)
         list.Add(new ShaderMacro("USE_SKINNING", null));
     if ((flags & MyShaderUnifiedFlags.STATIC_DECAL) > 0)
     {
         Debug.Assert(textureTypes != MyFileTextureEnum.UNSPECIFIED);
         list.Add(new ShaderMacro("STATIC_DECAL", null));
         list.AddRange(MyMeshMaterials1.GetMaterialTextureMacros(textureTypes));
     }
     if ((flags & MyShaderUnifiedFlags.STATIC_DECAL_CUTOUT) > 0)
         list.Add(new ShaderMacro("STATIC_DECAL_CUTOUT", null));
     if ((flags & MyShaderUnifiedFlags.USE_CUBE_INSTANCING) > 0)
         list.Add(new ShaderMacro("USE_CUBE_INSTANCING", null));
     if ((flags & MyShaderUnifiedFlags.USE_DEFORMED_CUBE_INSTANCING) > 0)
         list.Add(new ShaderMacro("USE_DEFORMED_CUBE_INSTANCING", null));
     if ((flags & MyShaderUnifiedFlags.USE_GENERIC_INSTANCING) > 0)
         list.Add(new ShaderMacro("USE_GENERIC_INSTANCING", null));
     if ((flags & MyShaderUnifiedFlags.USE_MERGE_INSTANCING) > 0)
         list.Add(new ShaderMacro("USE_MERGE_INSTANCING", null));
     if ((flags & MyShaderUnifiedFlags.USE_SINGLE_INSTANCE) > 0)
     {
         Debug.Assert((flags & MyShaderUnifiedFlags.USE_MERGE_INSTANCING) > 0);
         list.Add(new ShaderMacro("USE_SINGLE_INSTANCE", null));
     }
     if ((flags & MyShaderUnifiedFlags.USE_VOXEL_MORPHING) > 0)
         list.Add(new ShaderMacro("USE_VOXEL_MORPHING", null));
     if ((flags & MyShaderUnifiedFlags.USE_VOXEL_DATA) > 0)
         list.Add(new ShaderMacro("USE_VOXEL_DATA", null));
     if ((flags & MyShaderUnifiedFlags.USE_TEXTURE_INDICES) > 0)
         list.Add(new ShaderMacro("USE_TEXTURE_INDICES", null));
 }
Ejemplo n.º 28
0
        /// <remarks>On big loops, or whenever recommendable, cache the returned reference</remarks>
        public ITexture GetTexture(string name, MyFileTextureEnum type, bool waitTillLoaded = false, bool skipQualityReduction = false)
        {
            if (name == null || name.Length <= 0)
                return ReturnDefaultTexture(type);

            Uri uri;
            if (!MyResourceUtils.NormalizeFileTextureName(ref name, out uri))
            {
                IGeneratedTexture texture;
                if (m_generatedTextures.TryGetValue(name, out texture))
                    return texture;
                else
                {
                    MyRenderProxy.Assert(false, "Can't find generated texture with name \"" + name + "\"");
                    return ReturnDefaultTexture(type);
                }
            }

            MyFileTexture texOut;
            if (!m_textures.TryGetValue(name, out texOut))
            {
                if (uri.Scheme != FILE_SCHEME)
                {
                    Debug.Assert(false, "Cannot initialize a non file texture");
                    return ReturnDefaultTexture(type);
                }

                m_texturesPool.AllocateOrCreate(out texOut);
                texOut.Init(name, uri.LocalPath, type, waitTillLoaded, skipQualityReduction);
                m_textures.Add(name, texOut);
            }

            switch (texOut.TextureState)
            {
                case FileTextureState.Unloaded:
                case FileTextureState.Requested:
                    if (waitTillLoaded)
                        LoadInternal(name);
                    else
                    {
                        texOut.TextureState = FileTextureState.Requested;
                        m_requestedTextures.Add(name);
                    }
                    break;
                case FileTextureState.Loaded:
                    break;
            }

            return texOut;
        }
Ejemplo n.º 29
0
 private ITexture ReturnDefaultTexture(MyFileTextureEnum type)
 {
     switch (type)
     {
         case MyFileTextureEnum.NORMALMAP_GLOSS:
             return MyGeneratedTextureManager.MissingNormalGlossTex;
         case MyFileTextureEnum.EXTENSIONS:
             return MyGeneratedTextureManager.MissingExtensionTex;
         case MyFileTextureEnum.ALPHAMASK:
             return MyGeneratedTextureManager.MissingAlphamaskTex;
         case MyFileTextureEnum.CUBEMAP:
             return MyGeneratedTextureManager.MissingCubeTex;
     }
     return MyRender11.DebugMode ? MyGeneratedTextureManager.PinkTex : MyGeneratedTextureManager.ZeroTex;
 }
Ejemplo n.º 30
0
        public ISrvBindable GetTexture(string name, MyFileTextureEnum type, bool waitTillLoaded = false, bool skipQualityReduction = false)
        {
            if (name == null || name.Length <= 0)
            {
                switch (type)
                {
                    case MyFileTextureEnum.NORMALMAP_GLOSS:
                        return MyGeneratedTextureManager.MissingNormalGlossTex;
                    case MyFileTextureEnum.EXTENSIONS:
                        return MyGeneratedTextureManager.MissingExtensionTex;
                    case MyFileTextureEnum.ALPHAMASK:
                        return MyGeneratedTextureManager.MissingAlphamaskTex;
                    case MyFileTextureEnum.CUBEMAP:
                        return MyGeneratedTextureManager.MissingCubeTex;
                }
                return MyRender11.DebugMode ? MyGeneratedTextureManager.PinkTex : MyGeneratedTextureManager.ZeroTex;
            }

            // Check whether name is absolute path to file
            if (System.IO.Path.IsPathRooted(name))
                MakeRelativePath(ref name);

            if (m_unmannagedTextures.ContainsKey(name))
                return m_unmannagedTextures[name];


            MyFileTexture texOut;

            if (!m_textures.TryGetValue(name, out texOut))
            {
                m_texturesPool.AllocateOrCreate(out texOut);
                texOut.Init(name, type, waitTillLoaded, skipQualityReduction);
                m_textures.Add(name, texOut);
            }

            switch (texOut.TextureState)
            {
                case FileTextureState.Unloaded:
                case FileTextureState.Requested:
                    if (waitTillLoaded)
                        LoadInternal(name);
                    else
                    {
                        texOut.TextureState = FileTextureState.Requested;
                        m_requestedTextures.Add(name);
                    }
                    break;
                case FileTextureState.Loaded:
                    break;
            }

            return texOut;
        }
Ejemplo n.º 31
0
        internal static MyMaterialShadersBundleId Get(MyStringId material, MyStringId materialPass,
            VertexLayoutId vertexLayout, MyShaderUnifiedFlags flags, MyFileTextureEnum textureTypes)
        {
            int hash = 0;
            MyHashHelper.Combine(ref hash, material.GetHashCode());
            MyHashHelper.Combine(ref hash, materialPass.GetHashCode());
            MyHashHelper.Combine(ref hash, vertexLayout.GetHashCode());
            MyHashHelper.Combine(ref hash, unchecked((int)flags));

            if (HashIndex.ContainsKey(hash))
            {
                return HashIndex[hash];
            }

            var id = new MyMaterialShadersBundleId { Index = BundleInfo.Allocate() };
            MyArrayHelpers.Reserve(ref Bundles, id.Index + 1);

            HashIndex[hash] = id;
            BundleInfo.Data[id.Index] = new MyMaterialShadersInfo
            {
                Material = material,
                Pass = materialPass,
                Layout = vertexLayout,
                Flags = flags,
                TextureTypes = textureTypes,
            };
            Bundles[id.Index] = new MyMaterialShadersBundle { };

            InitBundle(id);

            return id;
        }
Ejemplo n.º 32
0
        // if texture cannot be loaded, it will be used byte pattern to generate substition texture
        public IFileArrayTexture CreateFromFiles(string resourceName, string[] inputFiles, MyFileTextureEnum type, byte[] bytePatternFor4x4, Format formatBytePattern, bool autoDisposeOnUnload)
        {
            MyFileArrayTexture array;
            m_fileTextureArrays.AllocateOrCreate(out array);
            array.Load(resourceName, inputFiles, type, bytePatternFor4x4, formatBytePattern);

            if (m_isDeviceInit)
                array.OnDeviceInit();

            if (autoDisposeOnUnload)
                m_texturesOnAutoDisposal.Add(array);

            return array;
        }
Ejemplo n.º 33
0
 /// <summary>Bind blend states for alpha blending</summary>
 public static void BindMaterialTextureBlendStates(MyRenderContext rc, MyFileTextureEnum textures)
 {
     textures &= ~MyFileTextureEnum.ALPHAMASK;
     switch (textures)
     {
         case MyFileTextureEnum.COLOR_METAL:
             rc.SetBlendState(MyBlendStateManager.BlendDecalNormal);
             break;
         case MyFileTextureEnum.NORMALMAP_GLOSS:
             rc.SetBlendState(MyBlendStateManager.BlendDecalColor);
             break;
         case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS:
             rc.SetBlendState(MyBlendStateManager.BlendDecalNormalColor);
             break;
         case MyFileTextureEnum.COLOR_METAL | MyFileTextureEnum.NORMALMAP_GLOSS | MyFileTextureEnum.EXTENSIONS:
             rc.SetBlendState(MyBlendStateManager.BlendDecalNormalColorExt);
             break;
         default:
             throw new Exception("Unknown texture bundle type");
     }
 }
        public IDynamicFileArrayTexture CreateTexture(string name, MyFileTextureEnum type, byte[] bytePattern, Format bytePatternFormat)
        {
            MyDynamicFileArrayTexture tex;
            m_objectsPool.AllocateOrCreate(out tex);
            tex.Init(name, type, bytePattern, bytePatternFormat);

            //if (destroyOnUnloadSession)
            //    m_texarraysAutodestroyed.Add(tex);
            return tex;
        }
        internal static MyMaterialShadersBundleId Get(MyStringId material, MyStringId materialPass,
                                                      VertexLayoutId vertexLayout, MyShaderUnifiedFlags flags, MyFileTextureEnum textureTypes)
        {
            int hash = 0;

            MyHashHelper.Combine(ref hash, material.GetHashCode());
            MyHashHelper.Combine(ref hash, materialPass.GetHashCode());
            MyHashHelper.Combine(ref hash, vertexLayout.GetHashCode());
            MyHashHelper.Combine(ref hash, unchecked ((int)flags));

            if (HashIndex.ContainsKey(hash))
            {
                return(HashIndex[hash]);
            }

            var id = new MyMaterialShadersBundleId {
                Index = BundleInfo.Allocate()
            };

            MyArrayHelpers.Reserve(ref Bundles, id.Index + 1);

            HashIndex[hash]           = id;
            BundleInfo.Data[id.Index] = new MyMaterialShadersInfo
            {
                Material     = material,
                Pass         = materialPass,
                Layout       = vertexLayout,
                Flags        = flags,
                TextureTypes = textureTypes,
            };
            Bundles[id.Index] = new MyMaterialShadersBundle {
            };

            InitBundle(id);

            return(id);
        }
 internal static void AddMaterialShaderFlagMacrosTo(List <ShaderMacro> list, MyShaderUnifiedFlags flags, MyFileTextureEnum textureTypes = MyFileTextureEnum.UNSPECIFIED)
 {
     if ((flags & MyShaderUnifiedFlags.DEPTH_ONLY) > 0)
     {
         list.Add(new ShaderMacro("DEPTH_ONLY", null));
     }
     if ((flags & MyShaderUnifiedFlags.ALPHA_MASKED) > 0)
     {
         list.Add(new ShaderMacro("ALPHA_MASKED", null));
     }
     if ((flags & MyShaderUnifiedFlags.ALPHA_MASK_ARRAY) > 0)
     {
         list.Add(new ShaderMacro("ALPHA_MASK_ARRAY", null));
     }
     if ((flags & MyShaderUnifiedFlags.TRANSPARENT) > 0)
     {
         list.Add(new ShaderMacro("TRANSPARENT", null));
     }
     if ((flags & MyShaderUnifiedFlags.DITHERED) > 0)
     {
         list.Add(new ShaderMacro("DITHERED", null));
     }
     if ((flags & MyShaderUnifiedFlags.DITHERED_LOD) > 0)
     {
         list.Add(new ShaderMacro("DITHERED_LOD", null));
     }
     if ((flags & MyShaderUnifiedFlags.USE_SKINNING) > 0)
     {
         list.Add(new ShaderMacro("USE_SKINNING", null));
     }
     if ((flags & MyShaderUnifiedFlags.STATIC_DECAL) > 0)
     {
         Debug.Assert(textureTypes != MyFileTextureEnum.UNSPECIFIED);
         list.Add(new ShaderMacro("STATIC_DECAL", null));
         list.AddRange(MyMeshMaterials1.GetMaterialTextureMacros(textureTypes));
     }
     if ((flags & MyShaderUnifiedFlags.STATIC_DECAL_CUTOUT) > 0)
     {
         list.Add(new ShaderMacro("STATIC_DECAL_CUTOUT", null));
     }
     if ((flags & MyShaderUnifiedFlags.USE_CUBE_INSTANCING) > 0)
     {
         list.Add(new ShaderMacro("USE_CUBE_INSTANCING", null));
     }
     if ((flags & MyShaderUnifiedFlags.USE_DEFORMED_CUBE_INSTANCING) > 0)
     {
         list.Add(new ShaderMacro("USE_DEFORMED_CUBE_INSTANCING", null));
     }
     if ((flags & MyShaderUnifiedFlags.USE_GENERIC_INSTANCING) > 0)
     {
         list.Add(new ShaderMacro("USE_GENERIC_INSTANCING", null));
     }
     if ((flags & MyShaderUnifiedFlags.USE_MERGE_INSTANCING) > 0)
     {
         list.Add(new ShaderMacro("USE_MERGE_INSTANCING", null));
     }
     if ((flags & MyShaderUnifiedFlags.USE_SINGLE_INSTANCE) > 0)
     {
         Debug.Assert((flags & MyShaderUnifiedFlags.USE_MERGE_INSTANCING) > 0);
         list.Add(new ShaderMacro("USE_SINGLE_INSTANCE", null));
     }
     if ((flags & MyShaderUnifiedFlags.USE_VOXEL_MORPHING) == MyShaderUnifiedFlags.USE_VOXEL_MORPHING)
     {
         list.Add(new ShaderMacro("USE_VOXEL_MORPHING", null));
     }
     if ((flags & MyShaderUnifiedFlags.USE_VOXEL_DATA) == MyShaderUnifiedFlags.USE_VOXEL_DATA)
     {
         list.Add(new ShaderMacro("USE_VOXEL_DATA", null));
     }
 }
Ejemplo n.º 37
0
        public ISrvBindable GetTexture(string name, MyFileTextureEnum type, bool waitTillLoaded = false, bool skipQualityReduction = false)
        {
            if (name == null || name.Length <= 0)
            {
                switch (type)
                {
                case MyFileTextureEnum.NORMALMAP_GLOSS:
                    return(MyGeneratedTextureManager.MissingNormalGlossTex);

                case MyFileTextureEnum.EXTENSIONS:
                    return(MyGeneratedTextureManager.MissingExtensionTex);

                case MyFileTextureEnum.ALPHAMASK:
                    return(MyGeneratedTextureManager.MissingAlphamaskTex);

                case MyFileTextureEnum.CUBEMAP:
                    return(MyGeneratedTextureManager.MissingCubeTex);
                }
                return(MyRender11.DebugMode ? MyGeneratedTextureManager.PinkTex : MyGeneratedTextureManager.ZeroTex);
            }

            // Check whether name is absolute path to file
            if (System.IO.Path.IsPathRooted(name))
            {
                MakeRelativePath(ref name);
            }

            if (m_unmannagedTextures.ContainsKey(name))
            {
                return(m_unmannagedTextures[name]);
            }


            MyFileTexture texOut;

            if (!m_textures.TryGetValue(name, out texOut))
            {
                m_texturesPool.AllocateOrCreate(out texOut);
                texOut.Init(name, type, waitTillLoaded, skipQualityReduction);
                m_textures.Add(name, texOut);
            }

            switch (texOut.TextureState)
            {
            case FileTextureState.Unloaded:
            case FileTextureState.Requested:
                if (waitTillLoaded)
                {
                    LoadInternal(name);
                }
                else
                {
                    texOut.TextureState = FileTextureState.Requested;
                    m_requestedTextures.Add(name);
                }
                break;

            case FileTextureState.Loaded:
                break;
            }

            return(texOut);
        }
Ejemplo n.º 38
0
 public void Init(string name, MyFileTextureEnum type, bool waitTillLoaded, bool skipQualityReduction)
 {
     m_name = name;
     m_type = type;
     TextureState = waitTillLoaded ? FileTextureState.Unloaded : FileTextureState.Requested;
     m_skipQualityReduction = skipQualityReduction;
 }