private static byte[] GetEmbeddedByteCode(Type effectType, EffectLanguage language) { Assembly effectAssembly = effectType.Assembly; string resourceNamespace = effectType.Assembly.GetName().Name + ".Effects.ByteCode"; string effectName = effectType.Name; string genericEffectByteCodeExtension = ".mgfxo"; string effectLanguageExtension = language switch { EffectLanguage.GLSL => ".ogl", EffectLanguage.HLSL => ".dx11", _ => throw new ArgumentOutOfRangeException(nameof(language), "ByteCode can only be loaded for known shader languages (currently GLSL and HLSL)."), }; string languageSpecificResourceName = effectName + effectLanguageExtension + genericEffectByteCodeExtension; string[] resourceNames = effectAssembly.GetManifestResourceNames(); string fullResourceName = resourceNames.Where(resourceName => resourceName.EndsWith(languageSpecificResourceName)).FirstOrDefault(); if (string.IsNullOrEmpty(fullResourceName)) { throw new ArgumentException("Could not find embedded resource \"" + languageSpecificResourceName + "\". Existing embedded resources are: \"" + string.Join("\", \"", resourceNames + "\".")); } byte[] byteCode; using (MemoryStream resourceMemStream = new MemoryStream()) { using (Stream resourceStream = effectAssembly.GetManifestResourceStream(fullResourceName)) { resourceStream.CopyTo(resourceMemStream); } byteCode = resourceMemStream.ToArray(); } return(byteCode); }
private static void DetectSupportedEffectLanguage(GraphicsDevice graphicsDevice, Type effectType) { CustomEffectBase.SystemEffectLanguage = EffectLanguage.Unknown; foreach (EffectLanguage language in Enum.GetValues(typeof(EffectLanguage))) { if (language == EffectLanguage.Unknown) { continue; } byte[] effectByteCode; Effect temporaryEffect; try { effectByteCode = CustomEffectBase.GetEmbeddedByteCode(effectType, language); temporaryEffect = new Effect(graphicsDevice, effectByteCode); if (temporaryEffect == null) { continue; } else { temporaryEffect.Dispose(); temporaryEffect = null; CustomEffectBase.SystemEffectLanguage = language; break; } } catch (Exception e) { continue; } } }