Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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;
                }
            }
        }