using System.IO; using System.Reflection; using Microsoft.Xna.Framework.Graphics; namespace MonoGame.Extended.Graphics.Effects { /// /// Reperesents the bytecode of an that is encapsulated inside a compiled assembly. /// /// /// /// Files that are encapsulated inside a compiled assembly are commonly known as Manifiest or embedded resources. /// Since embedded resources are added to the assembly at compiled time, they can not be accidentally deleted or /// misplaced. However, if the file needs to be changed, the assembly will need to be re-compiled with the changed /// file. /// /// /// To add an embedded resource file to an assembly, first add it to the project and then change the Build Action /// in the Properties of the file to Embedded Resource. The next time the project is compiled, the /// compiler will add the file to the assembly as an embedded resource. The compiler adds namespace(s) to the /// embedded resource so it matches with the path of where the file was added to the project. /// /// public class EffectResource { private static EffectResource _defaultEffect; /// /// Gets the embedded into the MonoGame.Extended.Graphics library. /// public static EffectResource DefaultEffect => _defaultEffect ?? (_defaultEffect = new EffectResource("MonoGame.Extended.Graphics.Effects.Resources.DefaultEffect.ogl.mgfxo")); private readonly string _resourceName; private volatile byte[] _bytecode; private readonly Assembly _assembly; /// /// Gets the bytecode of the file. /// /// /// The bytecode of the file. /// public byte[] Bytecode { get { if (_bytecode != null) return _bytecode; lock (this) { if (_bytecode != null) return _bytecode; var stream = _assembly.GetManifestResourceStream(_resourceName); using (var memoryStream = new MemoryStream()) { stream.CopyTo(memoryStream); _bytecode = memoryStream.ToArray(); } } return _bytecode; } } /// /// Initializes a new instance of the class. /// /// The name of the embedded resource. This must include the namespace(s). /// The assembly which the embedded resource is apart of. public EffectResource(string resourceName, Assembly assembly = null) { _resourceName = resourceName; _assembly = assembly ?? typeof(EffectResource).GetTypeInfo().Assembly; } } }