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); }
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()); } }
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 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); } }
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); } } } }
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; }
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)); } }