public ContentTypeReader[] LoadAssetReaders(ContentReader reader) { // Dummy variables required for it to work on iDevices ** DO NOT DELETE ** // This forces the classes not to be optimized out when deploying to iDevices ListReader <Char> hCharListReader = new ListReader <Char>(); ListReader <Rectangle> hRectangleListReader = new ListReader <Rectangle>(); ListReader <Vector3> hVector3ListReader = new ListReader <Vector3>(); ListReader <StringReader> hStringListReader = new ListReader <StringReader>(); SpriteFontReader hSpriteFontReader = new SpriteFontReader(); Texture2DReader hTexture2DReader = new Texture2DReader(); CharReader hCharReader = new CharReader(); RectangleReader hRectangleReader = new RectangleReader(); StringReader hStringReader = new StringReader(); Vector3Reader hVector3Reader = new Vector3Reader(); CurveReader hCurveReader = new CurveReader(); int numberOfReaders; ContentTypeReader[] contentReaders; // The first content byte i read tells me the number of content readers in this XNB file numberOfReaders = reader.ReadByte(); contentReaders = new ContentTypeReader[numberOfReaders]; // For each reader in the file, we read out the length of the string which contains the type of the reader, // then we read out the string. Finally we instantiate an instance of that reader using reflection for (int i = 0; i < numberOfReaders; i++) { // This string tells us what reader we need to decode the following data // string readerTypeString = reader.ReadString(); string originalReaderTypeString = reader.ReadString(); // Need to resolve namespace differences string readerTypeString = originalReaderTypeString; readerTypeString = PrepareType(readerTypeString); Type l_readerType = Type.GetType(readerTypeString); if (l_readerType != null) { contentReaders[i] = (ContentTypeReader)Activator.CreateInstance(l_readerType, true); } else { throw new ContentLoadException("Could not find matching content reader of type " + originalReaderTypeString + " (" + readerTypeString + ")"); } // I think the next 4 bytes refer to the "Version" of the type reader, // although it always seems to be zero int typeReaderVersion = reader.ReadInt32(); } return(contentReaders); }
protected string GetRealFilename <T>(string assetName) { // Replace Windows path separators with local path separators assetName = GetFilename(assetName); // Get the real file name if ((typeof(T) == typeof(Curve))) { assetName = CurveReader.Normalize(assetName); } else if ((typeof(T) == typeof(Texture2D))) { assetName = Texture2DReader.Normalize(assetName); } else if ((typeof(T) == typeof(SpriteFont))) { assetName = SpriteFontReader.Normalize(assetName); } else if ((typeof(T) == typeof(Effect))) { assetName = Effect.Normalize(assetName); } else if ((typeof(T) == typeof(Song))) { assetName = SongReader.Normalize(assetName); } else if ((typeof(T) == typeof(SoundEffect))) { assetName = SoundEffectReader.Normalize(assetName); } else if ((typeof(T) == typeof(Video))) { assetName = Video.Normalize(assetName); } return(assetName); }
internal ContentTypeReader[] LoadAssetReaders(ContentReader reader) { #pragma warning disable 0219, 0649 // Trick to prevent the linker removing the code, but not actually execute the code if (falseflag) { // Dummy variables required for it to work on iDevices ** DO NOT DELETE ** // This forces the classes not to be optimized out when deploying to iDevices var hByteReader = new ByteReader(); var hSByteReader = new SByteReader(); var hDateTimeReader = new DateTimeReader(); var hDecimalReader = new DecimalReader(); var hBoundingSphereReader = new BoundingSphereReader(); var hBoundingFrustumReader = new BoundingFrustumReader(); var hRayReader = new RayReader(); var hCharListReader = new ListReader <Char>(); var hRectangleListReader = new ListReader <Rectangle>(); var hRectangleArrayReader = new ArrayReader <Rectangle>(); var hVector3ListReader = new ListReader <Vector3>(); var hStringListReader = new ListReader <StringReader>(); var hIntListReader = new ListReader <Int32>(); var hSpriteFontReader = new SpriteFontReader(); var hTexture2DReader = new Texture2DReader(); var hCharReader = new CharReader(); var hRectangleReader = new RectangleReader(); var hStringReader = new StringReader(); var hVector2Reader = new Vector2Reader(); var hVector3Reader = new Vector3Reader(); var hVector4Reader = new Vector4Reader(); var hCurveReader = new CurveReader(); var hIndexBufferReader = new IndexBufferReader(); var hBoundingBoxReader = new BoundingBoxReader(); var hMatrixReader = new MatrixReader(); var hBasicEffectReader = new BasicEffectReader(); var hVertexBufferReader = new VertexBufferReader(); var hAlphaTestEffectReader = new AlphaTestEffectReader(); var hEnumSpriteEffectsReader = new EnumReader <Graphics.SpriteEffects>(); var hArrayFloatReader = new ArrayReader <float>(); var hArrayVector2Reader = new ArrayReader <Vector2>(); var hListVector2Reader = new ListReader <Vector2>(); var hArrayMatrixReader = new ArrayReader <Matrix>(); var hEnumBlendReader = new EnumReader <Graphics.Blend>(); var hNullableRectReader = new NullableReader <Rectangle>(); var hEffectMaterialReader = new EffectMaterialReader(); var hExternalReferenceReader = new ExternalReferenceReader(); var hSoundEffectReader = new SoundEffectReader(); var hSongReader = new SongReader(); var hModelReader = new ModelReader(); var hInt32Reader = new Int32Reader(); var hEffectReader = new EffectReader(); var hSingleReader = new SingleReader(); // At the moment the Video class doesn't exist // on all platforms... Allow it to compile anyway. #if ANDROID || (IOS && !TVOS) || MONOMAC || (WINDOWS && !OPENGL) || WINDOWS_UAP var hVideoReader = new VideoReader(); #endif } #pragma warning restore 0219, 0649 // The first content byte i read tells me the number of content readers in this XNB file var numberOfReaders = reader.Read7BitEncodedInt(); var contentReaders = new ContentTypeReader[numberOfReaders]; var needsInitialize = new BitArray(numberOfReaders); _contentReaders = new Dictionary <Type, ContentTypeReader>(numberOfReaders); // Lock until we're done allocating and initializing any new // content type readers... this ensures we can load content // from multiple threads and still cache the readers. lock (_locker) { // For each reader in the file, we read out the length of the string which contains the type of the reader, // then we read out the string. Finally we instantiate an instance of that reader using reflection for (var i = 0; i < numberOfReaders; i++) { // This string tells us what reader we need to decode the following data // string readerTypeString = reader.ReadString(); string originalReaderTypeString = reader.ReadString(); Func <ContentTypeReader> readerFunc; if (typeCreators.TryGetValue(originalReaderTypeString, out readerFunc)) { contentReaders[i] = readerFunc(); needsInitialize[i] = true; } else { //System.Diagnostics.Debug.WriteLine(originalReaderTypeString); // Need to resolve namespace differences string readerTypeString = originalReaderTypeString; readerTypeString = PrepareType(readerTypeString); var l_readerType = Type.GetType(readerTypeString); if (l_readerType != null) { ContentTypeReader typeReader; if (!_contentReadersCache.TryGetValue(l_readerType, out typeReader)) { try { typeReader = l_readerType.GetDefaultConstructor().Invoke(null) as ContentTypeReader; } catch (TargetInvocationException ex) { // If you are getting here, the Mono runtime is most likely not able to JIT the type. // In particular, MonoTouch needs help instantiating types that are only defined in strings in Xnb files. throw new InvalidOperationException( "Failed to get default constructor for ContentTypeReader. To work around, add a creation function to ContentTypeReaderManager.AddTypeCreator() " + "with the following failed type string: " + originalReaderTypeString, ex); } needsInitialize[i] = true; _contentReadersCache.Add(l_readerType, typeReader); } contentReaders[i] = typeReader; } else { throw new ContentLoadException( "Could not find ContentTypeReader Type. Please ensure the name of the Assembly that contains the Type matches the assembly in the full type name: " + originalReaderTypeString + " (" + readerTypeString + ")"); } } var targetType = contentReaders[i].TargetType; if (targetType != null) { if (!_contentReaders.ContainsKey(targetType)) { _contentReaders.Add(targetType, contentReaders[i]); } } // I think the next 4 bytes refer to the "Version" of the type reader, // although it always seems to be zero reader.ReadInt32(); } // Initialize any new readers. for (var i = 0; i < contentReaders.Length; i++) { if (needsInitialize.Get(i)) { contentReaders[i].Initialize(this); } } } // lock (_locker) return(contentReaders); }
internal ContentTypeReader[] LoadAssetReaders(ContentReader reader) { #pragma warning disable 0219, 0649 /* Trick to prevent the linker removing the code, but not actually execute the code * FIXME: Do we really need this in FNA? */ if (falseflag) { /* Dummy variables required for it to work on iDevices ** DO NOT DELETE ** * This forces the classes not to be optimized out when deploying to iDevices */ ByteReader hByteReader = new ByteReader(); SByteReader hSByteReader = new SByteReader(); DateTimeReader hDateTimeReader = new DateTimeReader(); DecimalReader hDecimalReader = new DecimalReader(); BoundingSphereReader hBoundingSphereReader = new BoundingSphereReader(); BoundingFrustumReader hBoundingFrustumReader = new BoundingFrustumReader(); RayReader hRayReader = new RayReader(); ListReader <char> hCharListReader = new ListReader <Char>(); ListReader <Rectangle> hRectangleListReader = new ListReader <Rectangle>(); ArrayReader <Rectangle> hRectangleArrayReader = new ArrayReader <Rectangle>(); ListReader <Vector3> hVector3ListReader = new ListReader <Vector3>(); ListReader <StringReader> hStringListReader = new ListReader <StringReader>(); ListReader <int> hIntListReader = new ListReader <Int32>(); SpriteFontReader hSpriteFontReader = new SpriteFontReader(); Texture2DReader hTexture2DReader = new Texture2DReader(); CharReader hCharReader = new CharReader(); RectangleReader hRectangleReader = new RectangleReader(); StringReader hStringReader = new StringReader(); Vector2Reader hVector2Reader = new Vector2Reader(); Vector3Reader hVector3Reader = new Vector3Reader(); Vector4Reader hVector4Reader = new Vector4Reader(); CurveReader hCurveReader = new CurveReader(); IndexBufferReader hIndexBufferReader = new IndexBufferReader(); BoundingBoxReader hBoundingBoxReader = new BoundingBoxReader(); MatrixReader hMatrixReader = new MatrixReader(); BasicEffectReader hBasicEffectReader = new BasicEffectReader(); VertexBufferReader hVertexBufferReader = new VertexBufferReader(); AlphaTestEffectReader hAlphaTestEffectReader = new AlphaTestEffectReader(); EnumReader <Microsoft.Xna.Framework.Graphics.SpriteEffects> hEnumSpriteEffectsReader = new EnumReader <Graphics.SpriteEffects>(); ArrayReader <float> hArrayFloatReader = new ArrayReader <float>(); ArrayReader <Vector2> hArrayVector2Reader = new ArrayReader <Vector2>(); ListReader <Vector2> hListVector2Reader = new ListReader <Vector2>(); ArrayReader <Matrix> hArrayMatrixReader = new ArrayReader <Matrix>(); EnumReader <Microsoft.Xna.Framework.Graphics.Blend> hEnumBlendReader = new EnumReader <Graphics.Blend>(); NullableReader <Rectangle> hNullableRectReader = new NullableReader <Rectangle>(); EffectMaterialReader hEffectMaterialReader = new EffectMaterialReader(); ExternalReferenceReader hExternalReferenceReader = new ExternalReferenceReader(); SoundEffectReader hSoundEffectReader = new SoundEffectReader(); SongReader hSongReader = new SongReader(); ModelReader hModelReader = new ModelReader(); Int32Reader hInt32Reader = new Int32Reader(); } #pragma warning restore 0219, 0649 /* The first content byte i read tells me the number of * content readers in this XNB file. */ int numberOfReaders = reader.Read7BitEncodedInt(); ContentTypeReader[] newReaders = new ContentTypeReader[numberOfReaders]; BitArray needsInitialize = new BitArray(numberOfReaders); contentReaders = new Dictionary <Type, ContentTypeReader>(numberOfReaders); /* Lock until we're done allocating and initializing any new * content type readers... this ensures we can load content * from multiple threads and still cache the readers. */ lock (locker) { /* For each reader in the file, we read out the * length of the string which contains the type * of the reader, then we read out the string. * Finally we instantiate an instance of that * reader using reflection. */ for (int i = 0; i < numberOfReaders; i += 1) { /* This string tells us what reader we * need to decode the following data. */ string originalReaderTypeString = reader.ReadString(); Func <ContentTypeReader> readerFunc; if (typeCreators.TryGetValue(originalReaderTypeString, out readerFunc)) { newReaders[i] = readerFunc(); needsInitialize[i] = true; } else { // Need to resolve namespace differences string readerTypeString = originalReaderTypeString; readerTypeString = PrepareType(readerTypeString); Type l_readerType = Type.GetType(readerTypeString); if (l_readerType != null) { ContentTypeReader typeReader; if (!contentReadersCache.TryGetValue(l_readerType, out typeReader)) { try { typeReader = l_readerType.GetDefaultConstructor().Invoke(null) as ContentTypeReader; } catch (TargetInvocationException ex) { /* If you are getting here, the Mono runtime * is most likely not able to JIT the type. * In particular, MonoTouch needs help * instantiating types that are only defined * in strings in Xnb files. */ throw new InvalidOperationException( "Failed to get default constructor for ContentTypeReader. " + "To work around, add a creation function to ContentTypeReaderManager.AddTypeCreator() " + "with the following failed type string: " + originalReaderTypeString, ex ); } needsInitialize[i] = true; contentReadersCache.Add(l_readerType, typeReader); } newReaders[i] = typeReader; } else { throw new ContentLoadException( "Could not find ContentTypeReader Type. " + "Please ensure the name of the Assembly that " + "contains the Type matches the assembly in the full type name: " + originalReaderTypeString + " (" + readerTypeString + ")" ); } } contentReaders.Add(newReaders[i].TargetType, newReaders[i]); /* I think the next 4 bytes refer to the "Version" of the type reader, * although it always seems to be zero. */ reader.ReadInt32(); } // Initialize any new readers. for (int i = 0; i < newReaders.Length; i += 1) { if (needsInitialize.Get(i)) { newReaders[i].Initialize(this); } } } // lock (locker) return(newReaders); }
internal ContentTypeReader[] LoadAssetReaders() { if (ContentTypeReaderManager.falseflag) { ByteReader byteReader = new ByteReader(); SByteReader sbyteReader = new SByteReader(); DateTimeReader dateTimeReader = new DateTimeReader(); DecimalReader decimalReader = new DecimalReader(); BoundingSphereReader boundingSphereReader = new BoundingSphereReader(); BoundingFrustumReader boundingFrustumReader = new BoundingFrustumReader(); RayReader rayReader = new RayReader(); ListReader<char> listReader1 = new ListReader<char>(); ListReader<Rectangle> listReader2 = new ListReader<Rectangle>(); ArrayReader<Rectangle> arrayReader1 = new ArrayReader<Rectangle>(); ListReader<Vector3> listReader3 = new ListReader<Vector3>(); ListReader<StringReader> listReader4 = new ListReader<StringReader>(); ListReader<int> listReader5 = new ListReader<int>(); SpriteFontReader spriteFontReader = new SpriteFontReader(); Texture2DReader texture2Dreader = new Texture2DReader(); CharReader charReader = new CharReader(); RectangleReader rectangleReader = new RectangleReader(); StringReader stringReader = new StringReader(); Vector2Reader vector2Reader = new Vector2Reader(); Vector3Reader vector3Reader = new Vector3Reader(); Vector4Reader vector4Reader = new Vector4Reader(); CurveReader curveReader = new CurveReader(); IndexBufferReader indexBufferReader = new IndexBufferReader(); BoundingBoxReader boundingBoxReader = new BoundingBoxReader(); MatrixReader matrixReader = new MatrixReader(); BasicEffectReader basicEffectReader = new BasicEffectReader(); VertexBufferReader vertexBufferReader = new VertexBufferReader(); AlphaTestEffectReader testEffectReader = new AlphaTestEffectReader(); EnumReader<SpriteEffects> enumReader1 = new EnumReader<SpriteEffects>(); ArrayReader<float> arrayReader2 = new ArrayReader<float>(); ArrayReader<Vector2> arrayReader3 = new ArrayReader<Vector2>(); ListReader<Vector2> listReader6 = new ListReader<Vector2>(); ArrayReader<Matrix> arrayReader4 = new ArrayReader<Matrix>(); EnumReader<Blend> enumReader2 = new EnumReader<Blend>(); NullableReader<Rectangle> nullableReader = new NullableReader<Rectangle>(); EffectMaterialReader effectMaterialReader = new EffectMaterialReader(); ExternalReferenceReader externalReferenceReader = new ExternalReferenceReader(); } int length = this._reader.Read7BitEncodedInt(); this.contentReaders = new ContentTypeReader[length]; for (int index = 0; index < length; ++index) { string str = this._reader.ReadString(); Func<ContentTypeReader> func; if (ContentTypeReaderManager.typeCreators.TryGetValue(str, out func)) { this.contentReaders[index] = func(); } else { string typeName = ContentTypeReaderManager.PrepareType(str); Type type = Type.GetType(typeName); if (type != (Type) null) { try { this.contentReaders[index] = ContentExtensions.GetDefaultConstructor(type).Invoke((object[]) null) as ContentTypeReader; } catch (TargetInvocationException ex) { throw new InvalidOperationException("Failed to get default constructor for ContentTypeReader. To work around, add a creation function to ContentTypeReaderManager.AddTypeCreator() with the following failed type string: " + str); } } else throw new ContentLoadException("Could not find matching content reader of type " + str + " (" + typeName + ")"); } this._reader.ReadInt32(); } return this.contentReaders; }
internal ContentTypeReader[] LoadAssetReaders() { #pragma warning disable 0219, 0649 // Trick to prevent the linker removing the code, but not actually execute the code if (falseflag) { // Dummy variables required for it to work on iDevices ** DO NOT DELETE ** // This forces the classes not to be optimized out when deploying to iDevices var hByteReader = new ByteReader(); var hSByteReader = new SByteReader(); var hDateTimeReader = new DateTimeReader(); var hDecimalReader = new DecimalReader(); var hBoundingSphereReader = new BoundingSphereReader(); var hBoundingFrustumReader = new BoundingFrustumReader(); var hRayReader = new RayReader(); var hCharListReader = new ListReader <Char>(); var hRectangleListReader = new ListReader <Rectangle>(); var hRectangleArrayReader = new ArrayReader <Rectangle>(); var hVector3ListReader = new ListReader <Vector3>(); var hStringListReader = new ListReader <StringReader>(); var hIntListReader = new ListReader <Int32>(); var hSpriteFontReader = new SpriteFontReader(); var hTexture2DReader = new Texture2DReader(); var hCharReader = new CharReader(); var hRectangleReader = new RectangleReader(); var hStringReader = new StringReader(); var hVector2Reader = new Vector2Reader(); var hVector3Reader = new Vector3Reader(); var hVector4Reader = new Vector4Reader(); var hCurveReader = new CurveReader(); var hIndexBufferReader = new IndexBufferReader(); var hBoundingBoxReader = new BoundingBoxReader(); var hMatrixReader = new MatrixReader(); var hBasicEffectReader = new BasicEffectReader(); var hVertexBufferReader = new VertexBufferReader(); var hAlphaTestEffectReader = new AlphaTestEffectReader(); var hEnumSpriteEffectsReader = new EnumReader <Graphics.SpriteEffects>(); var hArrayFloatReader = new ArrayReader <float>(); var hArrayVector2Reader = new ArrayReader <Vector2>(); var hListVector2Reader = new ListReader <Vector2>(); var hArrayMatrixReader = new ArrayReader <Matrix>(); var hEnumBlendReader = new EnumReader <Graphics.Blend>(); var hNullableRectReader = new NullableReader <Rectangle>(); var hEffectMaterialReader = new EffectMaterialReader(); var hExternalReferenceReader = new ExternalReferenceReader(); var hSoundEffectReader = new SoundEffectReader(); var hSongReader = new SongReader(); } #pragma warning restore 0219, 0649 int numberOfReaders; // The first content byte i read tells me the number of content readers in this XNB file numberOfReaders = _reader.Read7BitEncodedInt(); contentReaders = new ContentTypeReader[numberOfReaders]; // For each reader in the file, we read out the length of the string which contains the type of the reader, // then we read out the string. Finally we instantiate an instance of that reader using reflection for (int i = 0; i < numberOfReaders; i++) { // This string tells us what reader we need to decode the following data // string readerTypeString = reader.ReadString(); string originalReaderTypeString = _reader.ReadString(); Func <ContentTypeReader> readerFunc; if (typeCreators.TryGetValue(originalReaderTypeString, out readerFunc)) { contentReaders[i] = readerFunc(); } else { //System.Diagnostics.Debug.WriteLine(originalReaderTypeString); // Need to resolve namespace differences string readerTypeString = originalReaderTypeString; readerTypeString = PrepareType(readerTypeString); var l_readerType = Type.GetType(readerTypeString); if (l_readerType != null) { try { contentReaders[i] = l_readerType.GetDefaultConstructor().Invoke(null) as ContentTypeReader; } catch (TargetInvocationException ex) { // If you are getting here, the Mono runtime is most likely not able to JIT the type. // In particular, MonoTouch needs help instantiating types that are only defined in strings in Xnb files. throw new InvalidOperationException( "Failed to get default constructor for ContentTypeReader. To work around, add a creation function to ContentTypeReaderManager.AddTypeCreator() " + "with the following failed type string: " + originalReaderTypeString); } } else { throw new ContentLoadException( "Could not find ContentTypeReader Type. Please ensure the name of the Assembly that contains the Type matches the assembly in the full type name: " + originalReaderTypeString + " (" + readerTypeString + ")"); } } // I think the next 4 bytes refer to the "Version" of the type reader, // although it always seems to be zero int typeReaderVersion = _reader.ReadInt32(); } return(contentReaders); }
protected T ReadAsset <T>(string assetName, Action <IDisposable> recordDisposableObject) { if (string.IsNullOrEmpty(assetName)) { throw new ArgumentNullException("assetName"); } if (disposed) { throw new ObjectDisposedException("ContentManager"); } string originalAssetName = assetName; object result = null; if (this.graphicsDeviceService == null) { this.graphicsDeviceService = serviceProvider.GetService(typeof(IGraphicsDeviceService)) as IGraphicsDeviceService; if (this.graphicsDeviceService == null) { throw new InvalidOperationException("No Graphics Device Service"); } } // Replace Windows path separators with local path separators assetName = GetFilename(assetName); // Get the real file name if ((typeof(T) == typeof(Curve))) { assetName = CurveReader.Normalize(assetName); } else if ((typeof(T) == typeof(Texture2D))) { assetName = Texture2DReader.Normalize(assetName); } else if ((typeof(T) == typeof(SpriteFont))) { assetName = SpriteFontReader.Normalize(assetName); } else if ((typeof(T) == typeof(Effect))) { assetName = Effect.Normalize(assetName); } else if ((typeof(T) == typeof(Song))) { assetName = SongReader.Normalize(assetName); } else if ((typeof(T) == typeof(SoundEffect))) { assetName = SoundEffectReader.Normalize(assetName); } else if ((typeof(T) == typeof(Video))) { assetName = Video.Normalize(assetName); } if (string.IsNullOrEmpty(assetName)) { throw new ContentLoadException("Could not load " + originalAssetName + " asset!"); } if (!Path.HasExtension(assetName)) { assetName = string.Format("{0}.xnb", assetName); } if (Path.GetExtension(assetName).ToLower() == ".xnb") { // Load a XNB file using (Stream stream = OpenStream(assetName)) { using (BinaryReader xnbReader = new BinaryReader(stream)) { // The first 4 bytes should be the "XNB" header. i use that to detect an invalid file byte[] headerBuffer = new byte[3]; xnbReader.Read(headerBuffer, 0, 3); string headerString = Encoding.UTF8.GetString(headerBuffer, 0, 3); byte platform = xnbReader.ReadByte(); if (string.Compare(headerString, "XNB") != 0 || !(platform == 'w' || platform == 'x' || platform == 'm')) { throw new ContentLoadException("Asset does not appear to be a valid XNB file. Did you process your content for Windows?"); } ushort version = xnbReader.ReadUInt16(); int graphicsProfile = version & 0x7f00; version &= 0x80ff; bool compressed = false; if (version == 0x8005 || version == 0x8004) { compressed = true; } else if (version != 5 && version != 4) { throw new ContentLoadException("Invalid XNB version"); } // The next int32 is the length of the XNB file int xnbLength = xnbReader.ReadInt32(); ContentReader reader; if (compressed) { //decompress the xnb //thanks to ShinAli (https://bitbucket.org/alisci01/xnbdecompressor) int compressedSize = xnbLength - 14; int decompressedSize = xnbReader.ReadInt32(); int newFileSize = decompressedSize + 10; MemoryStream decompressedStream = new MemoryStream(decompressedSize); LzxDecoder dec = new LzxDecoder(16); int decodedBytes = 0; int pos = 0; while (pos < compressedSize) { // let's seek to the correct position stream.Seek(pos + 14, SeekOrigin.Begin); int hi = stream.ReadByte(); int lo = stream.ReadByte(); int block_size = (hi << 8) | lo; int frame_size = 0x8000; if (hi == 0xFF) { hi = lo; lo = (byte)stream.ReadByte(); frame_size = (hi << 8) | lo; hi = (byte)stream.ReadByte(); lo = (byte)stream.ReadByte(); block_size = (hi << 8) | lo; pos += 5; } else { pos += 2; } if (block_size == 0 || frame_size == 0) { break; } int lzxRet = dec.Decompress(stream, block_size, decompressedStream, frame_size); pos += block_size; decodedBytes += frame_size; } if (decompressedStream.Position != decompressedSize) { throw new ContentLoadException("Decompression of " + originalAssetName + "failed. " + " Try decompressing with nativeDecompressXnb first."); } decompressedStream.Seek(0, SeekOrigin.Begin); reader = new ContentReader(this, decompressedStream, this.graphicsDeviceService.GraphicsDevice); } else { reader = new ContentReader(this, stream, this.graphicsDeviceService.GraphicsDevice); } using (reader) { ContentTypeReaderManager typeManager = new ContentTypeReaderManager(reader); reader.TypeReaders = typeManager.LoadAssetReaders(reader); foreach (ContentTypeReader r in reader.TypeReaders) { r.Initialize(typeManager); } // we need to read a byte here for things to work out, not sure why reader.ReadByte(); // Get the 1-based index of the typereader we should use to start decoding with int index = reader.ReadByte(); ContentTypeReader contentReader = reader.TypeReaders[index - 1]; result = reader.ReadObject <T>(contentReader); } } } } else { if ((typeof(T) == typeof(Texture2D))) { using (Stream assetStream = OpenStream(assetName)) { Texture2D texture = Texture2D.FromFile(graphicsDeviceService.GraphicsDevice, assetStream); texture.Name = originalAssetName; result = texture; } } else if ((typeof(T) == typeof(SpriteFont))) { //result = new SpriteFont(Texture2D.FromFile(graphicsDeviceService.GraphicsDevice,assetName), null, null, null, 0, 0.0f, null, null); throw new NotImplementedException(); } else if ((typeof(T) == typeof(Song))) { result = new Song(assetName); } else if ((typeof(T) == typeof(SoundEffect))) { result = new SoundEffect(assetName); } else if ((typeof(T) == typeof(Video))) { result = new Video(assetName); } else if ((typeof(T) == typeof(Effect))) { result = new Effect(graphicsDeviceService.GraphicsDevice, assetName); } } if (result == null) { throw new ContentLoadException("Could not load " + originalAssetName + " asset!"); } // Store references to the asset for later use T asset = (T)result; if (asset is IDisposable) { if (recordDisposableObject != null) { recordDisposableObject(asset as IDisposable); } else { disposableAssets.Add(asset as IDisposable); } } loadedAssets.Add(originalAssetName, asset); return((T)result); }
public T Load <T>(string assetName) { string originalAssetName = assetName; object result = null; if (this.graphicsDeviceService == null) { this.graphicsDeviceService = serviceProvider.GetService(typeof(IGraphicsDeviceService)) as IGraphicsDeviceService; if (this.graphicsDeviceService == null) { throw new InvalidOperationException("No Graphics Device Service"); } } if (string.IsNullOrEmpty(assetName)) { throw new ArgumentException("assetname"); } if (!string.IsNullOrEmpty(_rootDirectory)) { assetName = _rootDirectory + Path.DirectorySeparatorChar + assetName; } // Check for windows-style directory separator character assetName = assetName.Replace('\\', Path.DirectorySeparatorChar); // Get the real file name if ((typeof(T) == typeof(Curve))) { assetName = CurveReader.Normalize(assetName); } else if ((typeof(T) == typeof(Texture2D))) { assetName = Texture2DReader.Normalize(assetName); } if ((typeof(T) == typeof(SpriteFont))) { assetName = SpriteFontReader.Normalize(assetName); } if ((typeof(T) == typeof(Song))) { assetName = SongReader.Normalize(assetName); } if ((typeof(T) == typeof(SoundEffect))) { assetName = SoundEffectReader.Normalize(assetName); } if ((typeof(T) == typeof(Video))) { assetName = Video.Normalize(assetName); } if ((typeof(T) == typeof(Effect))) { assetName = Effect.Normalize(assetName); } if (string.IsNullOrEmpty(assetName)) { throw new ContentLoadException("Could not load " + originalAssetName + " asset!"); } if (!Path.HasExtension(assetName)) { assetName = string.Format("{0}.xnb", assetName); } if (Path.GetExtension(assetName).ToUpper() == ".XNB") { // Load a XNB file using (FileStream stream = new FileStream(assetName, FileMode.Open, FileAccess.Read, FileShare.Read)) { using (ContentReader reader = new ContentReader(this, stream, this.graphicsDeviceService.GraphicsDevice)) { ContentTypeReaderManager typeManager = new ContentTypeReaderManager(reader); reader.TypeReaders = typeManager.LoadAssetReaders(reader); foreach (ContentTypeReader r in reader.TypeReaders) { r.Initialize(typeManager); } // we need to read a byte here for things to work out, not sure why reader.ReadByte(); // Get the 1-based index of the typereader we should use to start decoding with int index = reader.ReadByte(); ContentTypeReader contentReader = reader.TypeReaders[index - 1]; result = reader.ReadObject <T>(contentReader); } } } else { if ((typeof(T) == typeof(Texture2D))) { result = Texture2D.FromFile(graphicsDeviceService.GraphicsDevice, assetName); } if ((typeof(T) == typeof(SpriteFont))) { //result = new SpriteFont(Texture2D.FromFile(graphicsDeviceService.GraphicsDevice,assetName), null, null, null, 0, 0.0f, null, null); throw new NotImplementedException(); } if ((typeof(T) == typeof(Song))) { result = new Song(assetName); } if ((typeof(T) == typeof(SoundEffect))) { result = new SoundEffect(assetName); } if ((typeof(T) == typeof(Video))) { result = new Video(assetName); } } if (result == null) { throw new ContentLoadException("Could not load " + originalAssetName + " asset!"); } return((T)result); }
internal ContentTypeReader[] LoadAssetReaders() { #pragma warning disable 0219, 0649 // Trick to prevent the linker removing the code, but not actually execute the code if (falseflag) { // Dummy variables required for it to work on iDevices ** DO NOT DELETE ** // This forces the classes not to be optimized out when deploying to iDevices var hByteReader = new ByteReader(); var hSByteReader = new SByteReader(); var hDateTimeReader = new DateTimeReader(); var hDecimalReader = new DecimalReader(); var hBoundingSphereReader = new BoundingSphereReader(); var hBoundingFrustumReader = new BoundingFrustumReader(); var hRayReader = new RayReader(); var hCharListReader = new ListReader <Char>(); var hRectangleListReader = new ListReader <Rectangle>(); var hVector3ListReader = new ListReader <Vector3>(); var hStringListReader = new ListReader <StringReader>(); var hSpriteFontReader = new SpriteFontReader(); var hTexture2DReader = new Texture2DReader(); var hCharReader = new CharReader(); var hRectangleReader = new RectangleReader(); var hStringReader = new StringReader(); var hVector2Reader = new Vector2Reader(); var hVector3Reader = new Vector3Reader(); var hVector4Reader = new Vector4Reader(); var hCurveReader = new CurveReader(); var hIndexBufferReader = new IndexBufferReader(); var hBoundingBoxReader = new BoundingBoxReader(); var hMatrixReader = new MatrixReader(); var hBasicEffectReader = new BasicEffectReader(); var hVertexBufferReader = new VertexBufferReader(); var hAlphaTestEffectReader = new AlphaTestEffectReader(); } #pragma warning restore 0219, 0649 int numberOfReaders; // The first content byte i read tells me the number of content readers in this XNB file numberOfReaders = _reader.Read7BitEncodedInt(); contentReaders = new ContentTypeReader[numberOfReaders]; // For each reader in the file, we read out the length of the string which contains the type of the reader, // then we read out the string. Finally we instantiate an instance of that reader using reflection for (int i = 0; i < numberOfReaders; i++) { // This string tells us what reader we need to decode the following data // string readerTypeString = reader.ReadString(); string originalReaderTypeString = _reader.ReadString(); // Need to resolve namespace differences string readerTypeString = originalReaderTypeString; readerTypeString = PrepareType(readerTypeString); Type l_readerType = Type.GetType(readerTypeString); if (l_readerType != null) { contentReaders[i] = (ContentTypeReader)Activator.CreateInstance(l_readerType, true); } else { throw new ContentLoadException("Could not find matching content reader of type " + originalReaderTypeString + " (" + readerTypeString + ")"); } // I think the next 4 bytes refer to the "Version" of the type reader, // although it always seems to be zero int typeReaderVersion = _reader.ReadInt32(); } return(contentReaders); }
protected void ReloadAsset(string originalAssetName, object currentAsset) { if (string.IsNullOrEmpty(originalAssetName)) { throw new ArgumentNullException("assetName"); } if (disposed) { throw new ObjectDisposedException("ContentManager"); } if (this.graphicsDeviceService == null) { this.graphicsDeviceService = serviceProvider.GetService(typeof(IGraphicsDeviceService)) as IGraphicsDeviceService; if (this.graphicsDeviceService == null) { throw new InvalidOperationException("No Graphics Device Service"); } } // Replace Windows path separators with local path separators var assetName = GetFilename(originalAssetName); // Get the real file name if ((currentAsset is Curve)) { assetName = CurveReader.Normalize(assetName); } else if ((currentAsset is Texture2D)) { assetName = Texture2DReader.Normalize(assetName); } else if ((currentAsset is SpriteFont)) { assetName = SpriteFontReader.Normalize(assetName); } else if ((currentAsset is Effect)) { assetName = Effect.Normalize(assetName); } else if ((currentAsset is Song)) { assetName = SongReader.Normalize(assetName); } else if ((currentAsset is SoundEffect)) { assetName = SoundEffectReader.Normalize(assetName); } else if ((currentAsset is Video)) { assetName = Video.Normalize(assetName); } if (string.IsNullOrEmpty(assetName)) { throw new ContentLoadException("Could not load " + originalAssetName + " asset!"); } if (!Path.HasExtension(assetName)) assetName = string.Format("{0}.xnb", assetName); if (Path.GetExtension(assetName).ToLower() == ".xnb") { } else { if ((currentAsset is Texture2D)) { using (Stream assetStream = OpenStream(assetName)) { var asset = currentAsset as Texture2D; asset.Reload(assetStream); } } else if ((currentAsset is SpriteFont)) { } else if ((currentAsset is Song)) { } else if ((currentAsset is SoundEffect)) { } else if ((currentAsset is Video)) { } else if ((currentAsset is Effect)) { } } }
protected T ReadAsset<T>(string assetName, Action<IDisposable> recordDisposableObject) { if (string.IsNullOrEmpty(assetName)) { throw new ArgumentNullException("assetName"); } if (disposed) { throw new ObjectDisposedException("ContentManager"); } string originalAssetName = assetName; object result = null; if (this.graphicsDeviceService == null) { this.graphicsDeviceService = serviceProvider.GetService(typeof(IGraphicsDeviceService)) as IGraphicsDeviceService; if (this.graphicsDeviceService == null) { throw new InvalidOperationException("No Graphics Device Service"); } } // Replace Windows path separators with local path separators assetName = GetFilename(assetName); // Get the real file name if ((typeof(T) == typeof(Curve))) { assetName = CurveReader.Normalize(assetName); } else if ((typeof(T) == typeof(Texture2D))) { assetName = Texture2DReader.Normalize(assetName); } else if ((typeof(T) == typeof(SpriteFont))) { assetName = SpriteFontReader.Normalize(assetName); } else if ((typeof(T) == typeof(Effect))) { assetName = Effect.Normalize(assetName); } else if ((typeof(T) == typeof(Song))) { assetName = SongReader.Normalize(assetName); } else if ((typeof(T) == typeof(SoundEffect))) { assetName = SoundEffectReader.Normalize(assetName); } else if ((typeof(T) == typeof(Video))) { assetName = Video.Normalize(assetName); } if (string.IsNullOrEmpty(assetName)) { throw new ContentLoadException("Could not load " + originalAssetName + " asset!"); } if (!Path.HasExtension(assetName)) assetName = string.Format("{0}.xnb", assetName); if (Path.GetExtension(assetName).ToLower() == ".xnb") { // Load a XNB file Stream stream = OpenStream(assetName); try { using (BinaryReader xnbReader = new BinaryReader(stream)) { // The first 4 bytes should be the "XNB" header. i use that to detect an invalid file byte x = xnbReader.ReadByte(); byte n = xnbReader.ReadByte(); byte b = xnbReader.ReadByte(); byte platform = xnbReader.ReadByte(); if (x != 'X' || n != 'N' || b != 'B' || !(platform == 'w' || platform == 'x' || platform == 'm')) { throw new ContentLoadException("Asset does not appear to be a valid XNB file. Did you process your content for Windows?"); } byte version = xnbReader.ReadByte(); byte flags = xnbReader.ReadByte(); bool compressed = (flags & 0x80) != 0; if (version != 5 && version != 4) { throw new ContentLoadException("Invalid XNB version"); } // The next int32 is the length of the XNB file int xnbLength = xnbReader.ReadInt32(); ContentReader reader; if (compressed) { LzxDecoder dec = new LzxDecoder(16); //decompress the xnb //thanks to ShinAli (https://bitbucket.org/alisci01/xnbdecompressor) int compressedSize = xnbLength - 14; int decompressedSize = xnbReader.ReadInt32(); int newFileSize = decompressedSize + 10; MemoryStream decompressedStream = new MemoryStream(decompressedSize); int decodedBytes = 0; int pos = 0; #if ANDROID // Android native stream does not support the Position property. LzxDecoder.Decompress also uses // Seek. So we read the entirity of the stream into a memory stream and replace stream with the // memory stream. MemoryStream memStream = new MemoryStream(); stream.CopyTo(memStream); memStream.Seek(0, SeekOrigin.Begin); stream.Dispose(); stream = memStream; pos = -14; #endif while (pos < compressedSize) { // let's seek to the correct position // The stream should already be in the correct position, and seeking can be slow stream.Seek(pos + 14, SeekOrigin.Begin); int hi = stream.ReadByte(); int lo = stream.ReadByte(); int block_size = (hi << 8) | lo; int frame_size = 0x8000; if (hi == 0xFF) { hi = lo; lo = (byte)stream.ReadByte(); frame_size = (hi << 8) | lo; hi = (byte)stream.ReadByte(); lo = (byte)stream.ReadByte(); block_size = (hi << 8) | lo; pos += 5; } else pos += 2; if (block_size == 0 || frame_size == 0) break; int lzxRet = dec.Decompress(stream, block_size, decompressedStream, frame_size); pos += block_size; decodedBytes += frame_size; } if (decompressedStream.Position != decompressedSize) { throw new ContentLoadException("Decompression of " + originalAssetName + "failed. " + " Try decompressing with nativeDecompressXnb first."); } decompressedStream.Seek(0, SeekOrigin.Begin); reader = new ContentReader(this, decompressedStream, this.graphicsDeviceService.GraphicsDevice, originalAssetName); } else { reader = new ContentReader(this, stream, this.graphicsDeviceService.GraphicsDevice, originalAssetName); } using (reader) { result = reader.ReadAsset<T>(); } } } finally { if (stream != null) { stream.Dispose(); } } } else { if ((typeof(T) == typeof(Texture2D))) { #if IPHONE Texture2D texture = Texture2D.FromFile(graphicsDeviceService.GraphicsDevice, assetName); texture.Name = originalAssetName; result = texture; #else using (Stream assetStream = OpenStream(assetName)) { Texture2D texture = Texture2D.FromFile(graphicsDeviceService.GraphicsDevice, assetStream); texture.Name = originalAssetName; result = texture; } #endif } else if ((typeof(T) == typeof(SpriteFont))) { //result = new SpriteFont(Texture2D.FromFile(graphicsDeviceService.GraphicsDevice,assetName), null, null, null, 0, 0.0f, null, null); throw new NotImplementedException(); } else if ((typeof(T) == typeof(Song))) { result = new Song(assetName); } else if ((typeof(T) == typeof(SoundEffect))) { result = new SoundEffect(assetName); } else if ((typeof(T) == typeof(Video))) { result = new Video(assetName); } else if ((typeof(T) == typeof(Effect))) { result = new Effect(graphicsDeviceService.GraphicsDevice, assetName); } } if (result == null) { throw new ContentLoadException("Could not load " + originalAssetName + " asset!"); } if ( recordDisposableObject != null && result is IDisposable ) recordDisposableObject(result as IDisposable); return (T)result; }