internal static List <ShaderMacro> GenerateMaterialShaderFlagMacros(MyShaderUnifiedFlags flags)
        {
            var list = new List <ShaderMacro>();

            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.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_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));
            }

            return(list);
        }
Example #2
0
 internal void Clear()
 {
     DeallocateProxies();
     SortingKeys = null;
     VertexLayout1 = VertexLayoutId.NULL;
     VertexShaderFlags = MyShaderUnifiedFlags.NONE;
     Distance = float.MinValue;
 }
Example #3
0
 internal void Clear()
 {
     DeallocateProxies();
     SortingKeys       = null;
     VertexLayout1     = VertexLayoutId.NULL;
     VertexShaderFlags = MyShaderUnifiedFlags.NONE;
     Distance          = float.MinValue;
 }
 internal static void AddMaterialShaderFlagMacros(StringBuilder sb, MyShaderUnifiedFlags flags)
 {
     if ((flags & MyShaderUnifiedFlags.DEPTH_ONLY) > 0)
     {
         sb.AppendLine("#define DEPTH_ONLY");
     }
     if ((flags & MyShaderUnifiedFlags.ALPHAMASK) > 0)
     {
         sb.AppendLine("#define ALPHA_MASKED");
     }
     if ((flags & MyShaderUnifiedFlags.ALPHAMASK_ARRAY) > 0)
     {
         sb.AppendLine("#define ALPHA_MASK_ARRAY");
     }
     if ((flags & MyShaderUnifiedFlags.TRANSPARENT) > 0)
     {
         sb.AppendLine("#define TRANSPARENT");
     }
     if ((flags & MyShaderUnifiedFlags.DITHERED) > 0)
     {
         sb.AppendLine("#define DITHERED");
     }
     if ((flags & MyShaderUnifiedFlags.FOLIAGE) > 0)
     {
         sb.AppendLine("#define FOLIAGE");
     }
     if ((flags & MyShaderUnifiedFlags.USE_SKINNING) > 0)
     {
         sb.AppendLine("#define USE_SKINNING");
     }
     if ((flags & MyShaderUnifiedFlags.USE_CUBE_INSTANCING) > 0)
     {
         sb.AppendLine("#define USE_CUBE_INSTANCING");
     }
     if ((flags & MyShaderUnifiedFlags.USE_DEFORMED_CUBE_INSTANCING) > 0)
     {
         sb.AppendLine("#define USE_DEFORMED_CUBE_INSTANCING");
     }
     if ((flags & MyShaderUnifiedFlags.USE_GENERIC_INSTANCING) > 0)
     {
         sb.AppendLine("#define USE_GENERIC_INSTANCING");
     }
     if ((flags & MyShaderUnifiedFlags.USE_MERGE_INSTANCING) > 0)
     {
         sb.AppendLine("#define USE_MERGE_INSTANCING");
     }
     if ((flags & MyShaderUnifiedFlags.USE_VOXEL_MORPHING) > 0)
     {
         sb.AppendLine("#define USE_VOXEL_MORPHING");
     }
     if ((flags & MyShaderUnifiedFlags.USE_SHADOW_CASCADES) == MyShaderUnifiedFlags.USE_SHADOW_CASCADES)
     {
         sb.AppendLine(MyRender11.ShaderCascadesNumberHeader());
     }
 }
        internal static void AddMaterialShaderFlagMacros(StringBuilder sb, MyShaderUnifiedFlags flags)
        {
            if ((flags & MyShaderUnifiedFlags.DEPTH_ONLY) > 0)
            {
                sb.AppendLine("#define DEPTH_ONLY");
            }
            if ((flags & MyShaderUnifiedFlags.ALPHAMASK) > 0)
            {
                sb.AppendLine("#define ALPHA_MASKED");
            }
            if ((flags & MyShaderUnifiedFlags.ALPHAMASK_ARRAY) > 0)
            {
                sb.AppendLine("#define ALPHA_MASK_ARRAY");
            }
            if ((flags & MyShaderUnifiedFlags.TRANSPARENT) > 0)
            {
                sb.AppendLine("#define TRANSPARENT");
            }
            if ((flags & MyShaderUnifiedFlags.DITHERED) > 0)
            {
                sb.AppendLine("#define DITHERED");
            }
            if ((flags & MyShaderUnifiedFlags.FOLIAGE) > 0)
            {
                sb.AppendLine("#define FOLIAGE");
            }
            if ((flags & MyShaderUnifiedFlags.USE_SKINNING) > 0)
            {
                sb.AppendLine("#define USE_SKINNING");
            }
            if ((flags & MyShaderUnifiedFlags.USE_CUBE_INSTANCING) > 0)
            {
                sb.AppendLine("#define USE_CUBE_INSTANCING");
            }
            if ((flags & MyShaderUnifiedFlags.USE_DEFORMED_CUBE_INSTANCING) > 0)
            {
                sb.AppendLine("#define USE_DEFORMED_CUBE_INSTANCING");
            }
            if ((flags & MyShaderUnifiedFlags.USE_GENERIC_INSTANCING) > 0)
            {
                sb.AppendLine("#define USE_GENERIC_INSTANCING");
            }
            if ((flags & MyShaderUnifiedFlags.USE_MERGE_INSTANCING) > 0)
            {
                sb.AppendLine("#define USE_MERGE_INSTANCING");
            }
            if ((flags & MyShaderUnifiedFlags.USE_VOXEL_MORPHING) > 0)
            {
                sb.AppendLine("#define USE_VOXEL_MORPHING");
            }
            if((flags & MyShaderUnifiedFlags.USE_SHADOW_CASCADES) == MyShaderUnifiedFlags.USE_SHADOW_CASCADES)
			{
				sb.AppendLine(MyRender11.ShaderCascadesNumberHeader());
			}
        }
Example #6
0
        private static MyMergeInstancingShaderBundle GetMergeInstancing(string pass, MyShaderUnifiedFlags flags = MyShaderUnifiedFlags.NONE)
        {
            MyMergeInstancingShaderBundle ret = new MyMergeInstancingShaderBundle();

            flags |= MyShaderUnifiedFlags.USE_MERGE_INSTANCING;

            var passId = MyStringId.GetOrCompute(pass);

            ret.MultiInstance  = MyMaterialShaders.Get(STANDARD_MATERIAL, passId, MyVertexLayouts.Empty, flags);
            ret.SingleInstance = MyMaterialShaders.Get(STANDARD_MATERIAL, passId, MyVertexLayouts.Empty, flags | MyShaderUnifiedFlags.USE_SINGLE_INSTANCE);
            return(ret);
        }
Example #7
0
        private static MyShaderUnifiedFlags ParseFlags(string flagNames)
        {
            if (string.IsNullOrEmpty(flagNames) || flagNames.Trim() == "")
            {
                return(MyShaderUnifiedFlags.NONE);
            }

            MyShaderUnifiedFlags flags = MyShaderUnifiedFlags.NONE, flag;
            var flagNameList = flagNames.Split('|');

            for (int i = 0; i < flagNameList.Length; i++)
            {
                if (MyShaderUnifiedFlags.TryParse(flagNameList[i], out flag))
                {
                    flags |= flag;
                }
                else
                {
                    MyDebug.AssertDebug(false, "Invalid flags enum: " + flagNameList[i]);
                }
            }
            return(flags);
        }
        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);
        }
        // must have same number of subparts
        //internal void RefreshVoxelMeshData()
        //{
        //    if (!m_owner.RenderDirty)
        //    {
        //        var meshInfo = m_mesh.LODs[0].m_meshInfo;


        //        m_lods[0].RenderableProxies[0].geometry.IB = meshInfo.IB.Buffer;
        //        m_lods[0].RenderableProxies[0].geometry.IndexFormat = meshInfo.IB.Format;

        //        m_lods[0].RenderableProxies[0].geometry.VB = meshInfo.VB.Select(x => x.Buffer).ToArray();
        //        m_lods[0].RenderableProxies[0].geometry.VertexStrides = meshInfo.VB.Select(x => x.Stride).ToArray();

        //        int ctr = 0;
        //        foreach (var kv in m_mesh.LODs[0].m_meshInfo.Parts)
        //        {
        //            m_lods[0].RenderableProxies[ctr].depthOnlySubmeshes = kv.Value;
        //            m_lods[0].RenderableProxies[ctr].depthOnlySubmeshes = kv.Value;
        //            ctr++;
        //        }
        //    }
        //}

        internal void SetLodShaders(int lodNum, MyShaderUnifiedFlags appendedFlags)
        {
            var lod = m_lods[lodNum];

            var num = MyMeshes.GetLodMesh(Mesh, lodNum).Info.PartsNum;

            for (int p = 0; p < num; p++)
            {
                var partId = MyMeshes.GetMeshPart(Mesh, lodNum, p);
                var technique = partId.Info.Material.Info.Technique;

                //if (AreTechniqueDrawcallsDepthBatchable(technique) && skinning == null && shadowmapId == -1)
                //{
                //    shadowmapId = c;
                //}

                if (DebrisEntityVoxelMaterial.ContainsKey(m_owner.ID))
                {
                    technique = MyVoxelMesh.SINGLE_MATERIAL_TAG;
                }

                lod.RenderableProxies[p].DepthShaders = MyMaterialShaders.Get(
                    X.TEXT(MapTechniqueToShaderMaterial(technique)),
                    X.TEXT(MyGeometryRenderer.DEFAULT_DEPTH_PASS),
                    lod.VertexLayout1,
                    lod.VertexShaderFlags | MyShaderUnifiedFlags.DEPTH_ONLY | MapTechniqueToShaderMaterialFlags(technique) | GetCurrentStateMaterialFlags(lodNum) | appendedFlags);
                lod.RenderableProxies[p].Shaders = MyMaterialShaders.Get(
                    X.TEXT(MapTechniqueToShaderMaterial(technique)),
                    X.TEXT(MyGeometryRenderer.DEFAULT_OPAQUE_PASS),
                    lod.VertexLayout1,
                    lod.VertexShaderFlags | MapTechniqueToShaderMaterialFlags(technique) | GetCurrentStateMaterialFlags(lodNum) | appendedFlags);
                lod.RenderableProxies[p].ForwardShaders = MyMaterialShaders.Get(
                    X.TEXT(MapTechniqueToShaderMaterial(technique)),
                    X.TEXT(MyGeometryRenderer.DEFAULT_FORWARD_PASS),
                    lod.VertexLayout1,
                    lod.VertexShaderFlags | MapTechniqueToShaderMaterialFlags(technique) | GetCurrentStateMaterialFlags(lodNum) | appendedFlags);
            }
        }
Example #10
0
        private static void GenerateCombo(MyStringId materialId, MyStringId passId, MyShaderUnifiedFlags additionalFlags, MyShaderUnifiedFlags unsupportedFlags, MatCombos.Combo[] comboList1, MatCombos.Combo[] comboList2,
                                          float progress, OnShaderCacheProgressDelegate onShaderCacheProgress)
        {
            if (comboList1 == null || comboList1.Length == 0)
            {
                comboList1 = new[] { new MatCombos.Combo() }
            }
            ;
            if (comboList2 == null || comboList2.Length == 0)
            {
                comboList2 = new[] { new MatCombos.Combo() }
            }
            ;
            for (int k = 0; k < comboList1.Length; k++)
            {
                MyVertexInputComponentType[] vertexInput1 = comboList1[k].VertexInput;
                if (vertexInput1 == null)
                {
                    vertexInput1 = new MyVertexInputComponentType[0];
                }
                int[] vertexInputOrder1 = comboList1[k].VertexInputOrder;
                if (vertexInputOrder1 == null || vertexInputOrder1.Length != vertexInput1.Length)
                {
                    vertexInputOrder1 = new int[vertexInput1.Length];
                    for (int x = 0; x < vertexInput1.Length; x++)
                    {
                        vertexInputOrder1[x] = x;
                    }
                }
                MyShaderUnifiedFlags flags1 = ParseFlags(comboList1[k].FlagNames);
                if ((flags1 & unsupportedFlags) != 0)
                {
                    continue;
                }

                // go through all combinations of shader flags
                for (int l = 0; l < comboList2.Length; l++)
                {
                    MyVertexInputComponentType[] vertexInput2 = comboList2[l].VertexInput;
                    if (vertexInput2 == null)
                    {
                        vertexInput2 = new MyVertexInputComponentType[0];
                    }
                    int[] vertexInputOrder2 = comboList2[l].VertexInputOrder;
                    if (vertexInputOrder2 == null || vertexInputOrder2.Length != vertexInput2.Length)
                    {
                        vertexInputOrder2 = new int[vertexInput2.Length];
                        for (int x = 0; x < vertexInput2.Length; x++)
                        {
                            vertexInputOrder2[x] = x;
                        }
                    }
                    var vertexInput      = vertexInput1.Concat(vertexInput2).ToArray();
                    var vertexInputOrder = vertexInputOrder1.Concat(vertexInputOrder2).ToArray();
                    Array.Sort(vertexInputOrder, vertexInput, m_intComparer);
                    VertexLayoutId vertexLayout;
                    if (vertexInput.Length != 0)
                    {
                        vertexLayout = MyVertexLayouts.GetLayout(vertexInput);
                    }
                    else
                    {
                        vertexLayout = MyVertexLayouts.Empty;
                    }

                    // return errors & skipped info
                    string vsSource;
                    string psSource;
                    MyMaterialShaders.Preprocess(materialId, passId, vertexLayout.Info, out vsSource, out psSource);

                    MyShaderUnifiedFlags flags = ParseFlags(comboList2[l].FlagNames) | flags1 | additionalFlags;
                    if ((flags & unsupportedFlags) != 0)
                    {
                        continue;
                    }

                    var macros             = MyMaterialShaders.GenerateMaterialShaderFlagMacros(flags);
                    var descriptor         = String.Format("{0}_{1}", materialId.ToString(), passId.ToString());
                    var vertexLayoutString = vertexLayout.Info.Components.GetString();

                    PreCompile(vsSource, macros, MyShadersDefines.Profiles.vs_5_0, descriptor, vertexLayoutString, progress, onShaderCacheProgress);
                    PreCompile(psSource, macros, MyShadersDefines.Profiles.ps_5_0, descriptor, vertexLayoutString, progress, onShaderCacheProgress);
                    macros.Add(m_globalMacros[0]);
                    for (int m = 0; m < m_globalMacros.Length; m++)
                    {
                        macros[macros.Count - 1] = m_globalMacros[m];
                        //PreCompile(vsSource, macros, MyShadersDefines.Profiles.vs_5_0, descriptor, vertexLayoutString, progress, onShaderCacheProgress);
                        PreCompile(psSource, macros, MyShadersDefines.Profiles.ps_5_0, descriptor, vertexLayoutString, progress, onShaderCacheProgress);
                    }
                }
            }
        }
 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));
 }
        internal static MyMaterialShadersBundleId Get(MyStringId material, MyStringId materialPass, VertexLayoutId vertexLayout, MyShaderUnifiedFlags flags)
        {
            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
            };
            Bundles[id.Index] = new MyMaterialShadersBundle { };

            InitBundle(id);

            return id;
        }
        private static MyMergeInstancingShaderBundle GetMergeInstancing(string pass, MyShaderUnifiedFlags flags = MyShaderUnifiedFlags.NONE)
        {
            MyMergeInstancingShaderBundle ret = new MyMergeInstancingShaderBundle();

            flags |= MyShaderUnifiedFlags.USE_MERGE_INSTANCING;

            var passId = MyStringId.GetOrCompute(pass);
            ret.MultiInstance = MyMaterialShaders.Get(STANDARD_MATERIAL, passId, MyVertexLayouts.Empty, flags);
            ret.SingleInstance = MyMaterialShaders.Get(STANDARD_MATERIAL, passId, MyVertexLayouts.Empty, flags | MyShaderUnifiedFlags.USE_SINGLE_INSTANCE);
            return ret;
        }
        private static void GenerateCombo(MyStringId materialId, MyStringId passId, MyShaderUnifiedFlags additionalFlags, MyShaderUnifiedFlags unsupportedFlags, CacheGenerator.Combo[] comboList1, CacheGenerator.Combo[] comboList2,
                                          float progress, OnShaderCacheProgressDelegate onShaderCacheProgress)
        {
            if (comboList1 == null || comboList1.Length == 0)
            {
                comboList1 = new[] { new CacheGenerator.Combo() }
            }
            ;
            if (comboList2 == null || comboList2.Length == 0)
            {
                comboList2 = new[] { new CacheGenerator.Combo() }
            }
            ;
            for (int k = 0; k < comboList1.Length; k++)
            {
                MyVertexInputComponentType[] vertexInput1 = comboList1[k].VertexInput;
                if (vertexInput1 == null)
                {
                    vertexInput1 = new MyVertexInputComponentType[0];
                }
                int[] vertexInputOrder1 = comboList1[k].VertexInputOrder;
                if (vertexInputOrder1 == null || vertexInputOrder1.Length != vertexInput1.Length)
                {
                    vertexInputOrder1 = new int[vertexInput1.Length];
                    for (int x = 0; x < vertexInput1.Length; x++)
                    {
                        vertexInputOrder1[x] = x;
                    }
                }
                MyShaderUnifiedFlags flags1 = ParseFlags(comboList1[k].FlagNames);
                if ((flags1 & unsupportedFlags) != 0)
                {
                    continue;
                }

                // go through all combinations of shader flags
                for (int l = 0; l < comboList2.Length; l++)
                {
                    MyVertexInputComponentType[] vertexInput2 = comboList2[l].VertexInput;
                    if (vertexInput2 == null)
                    {
                        vertexInput2 = new MyVertexInputComponentType[0];
                    }
                    int[] vertexInputOrder2 = comboList2[l].VertexInputOrder;
                    if (vertexInputOrder2 == null || vertexInputOrder2.Length != vertexInput2.Length)
                    {
                        vertexInputOrder2 = new int[vertexInput2.Length];
                        for (int x = 0; x < vertexInput2.Length; x++)
                        {
                            vertexInputOrder2[x] = x;
                        }
                    }
                    var vertexInput      = vertexInput1.Concat(vertexInput2).ToArray();
                    var vertexInputOrder = vertexInputOrder1.Concat(vertexInputOrder2).ToArray();
                    Array.Sort(vertexInputOrder, vertexInput, m_intComparer);
                    VertexLayoutId vertexLayout;
                    if (vertexInput.Length != 0)
                    {
                        vertexLayout = MyVertexLayouts.GetLayout(vertexInput);
                    }
                    else
                    {
                        vertexLayout = MyVertexLayouts.Empty;
                    }

                    MyShaderUnifiedFlags flags = ParseFlags(comboList2[l].FlagNames) | flags1 | additionalFlags;
                    var macros = new List <ShaderMacro>();
                    macros.Add(MyMaterialShaders.GetRenderingPassMacro(passId.String));
                    MyMaterialShaders.AddMaterialShaderFlagMacrosTo(macros, flags);
                    macros.AddRange(vertexLayout.Info.Macros);

                    // return errors & skipped info
                    MyMaterialShaderInfo sources;
                    MyMaterialShaders.GetMaterialSources(materialId, out sources);

                    if ((flags & unsupportedFlags) != 0)
                    {
                        continue;
                    }

                    var vertexLayoutString = vertexLayout.Info.Components.GetString();

                    string vsDescriptor = MyMaterialShaders.GetShaderDescriptor(sources.VertexShaderFilename, materialId.String, passId.String, vertexLayout);
                    PreCompile(sources.VertexShaderFilepath, macros, MyShaderProfile.vs_5_0, vsDescriptor, vertexLayoutString, progress, onShaderCacheProgress);

                    string psDescriptor = MyMaterialShaders.GetShaderDescriptor(sources.PixelShaderFilename, materialId.String, passId.String, vertexLayout);
                    PreCompile(sources.PixelShaderFilepath, macros, MyShaderProfile.ps_5_0, psDescriptor, vertexLayoutString, progress, onShaderCacheProgress);
                    macros.Add(m_globalMacros[0]);
                    for (int m = 0; m < m_globalMacros.Length; m++)
                    {
                        macros[macros.Count - 1] = m_globalMacros[m];
                        //PreCompile(sources.VertexShaderFilepath, macros, MyShadersDefines.Profiles.vs_5_0, vsDescriptor, vertexLayoutString, progress, onShaderCacheProgress);
                        PreCompile(sources.PixelShaderFilepath, macros, MyShaderProfile.ps_5_0, psDescriptor, vertexLayoutString, progress, onShaderCacheProgress);
                    }
                }
            }
        }
Example #15
0
        private static MyMergeInstancingShaderBundle GetMergeInstancing(MyStringId pass, MyShaderUnifiedFlags flags = MyShaderUnifiedFlags.NONE)
        {
            MyMergeInstancingShaderBundle ret = new MyMergeInstancingShaderBundle();

            flags |= MyShaderUnifiedFlags.USE_MERGE_INSTANCING;

            ret.MultiInstance = MyMaterialShaders.Get(STANDARD_MATERIAL, pass, MyVertexLayouts.Empty, flags, MyFileTextureEnum.UNSPECIFIED);
            ret.SingleInstance = MyMaterialShaders.Get(STANDARD_MATERIAL, pass, MyVertexLayouts.Empty, flags | MyShaderUnifiedFlags.USE_SINGLE_INSTANCE, MyFileTextureEnum.UNSPECIFIED);
            return ret;
        }
Example #16
0
        private static MyMergeInstancingShaderBundle GetMergeInstancing(MyStringId pass, MyShaderUnifiedFlags flags = MyShaderUnifiedFlags.NONE)
        {
            MyMergeInstancingShaderBundle ret = new MyMergeInstancingShaderBundle();

            flags |= MyShaderUnifiedFlags.USE_MERGE_INSTANCING;

            ret.MultiInstance  = MyMaterialShaders.Get(STANDARD_MATERIAL, pass, MyVertexLayouts.Empty, flags, MyFileTextureEnum.UNSPECIFIED);
            ret.SingleInstance = MyMaterialShaders.Get(STANDARD_MATERIAL, pass, MyVertexLayouts.Empty, flags | MyShaderUnifiedFlags.USE_SINGLE_INSTANCE, MyFileTextureEnum.UNSPECIFIED);
            return(ret);
        }
 internal static List<ShaderMacro> GenerateMaterialShaderFlagMacros(MyShaderUnifiedFlags flags)
 {
     var list = new List<ShaderMacro>();
     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.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));
     
     return list;
 }
 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));
     }
 }