public static STR Load(BinaryReader data) { var header = data.ReadBinaryString(4); if (!header.Equals(STR.Header)) { throw new Exception("EffectLoader.Load: Header (" + header + ") is not \"STRM\""); } var version = data.ReadULong(); if (version != 0x94) { throw new Exception("EffectLoader.Load: Unsupported STR version (v" + version + ")"); } STR str = new STR(); str.version = version; str.fps = data.ReadULong(); str.maxKey = data.ReadULong(); var layerCount = data.ReadULong(); data.Seek(16, System.IO.SeekOrigin.Current); //read layers str.layers = new STR.Layer[layerCount]; for (uint i = 0; i < layerCount; i++) { STR.Layer layer = str.layers[i] = new STR.Layer(); //read texture filenames var textureCount = data.ReadLong(); layer.textures = new string[textureCount]; for (int j = 0; j < textureCount; j++) { layer.textures[j] = "data/texture/effect/" + data.ReadBinaryString(128); } //read animations var animCount = data.ReadLong(); layer.animations = new STR.Animation[animCount]; for (int j = 0; j < animCount; j++) { layer.animations[j] = new STR.Animation() { frame = data.ReadLong(), type = data.ReadULong(), position = new Vector2(data.ReadFloat(), data.ReadFloat()), uv = new float[] { data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat() }, xy = new float[] { data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat() }, animFrame = data.ReadFloat(), animType = data.ReadULong(), delay = data.ReadFloat(), angle = data.ReadFloat() / (1024 / 360), color = new Color( data.ReadFloat() / 255, data.ReadFloat() / 255, data.ReadFloat() / 255, data.ReadFloat() / 255), srcAlpha = data.ReadULong(), destAlpha = data.ReadULong(), mtPreset = data.ReadULong() }; } } return(str); }
public static STR Load(MemoryStreamReader data, string path) { var header = data.ReadBinaryString(4); if (!header.Equals(STR.Header)) { throw new Exception("EffectLoader.Load: Header (" + header + ") is not \"STRM\""); } var version = data.ReadUInt(); if (version != 0x94) { throw new Exception("EffectLoader.Load: Unsupported STR version (v" + version + ")"); } STR str = new STR(); str.version = version; str.fps = data.ReadUInt(); str.maxKey = data.ReadUInt(); var layerCount = data.ReadUInt(); data.Seek(16, System.IO.SeekOrigin.Current); //read layers str.layers = new STR.Layer[layerCount]; for (uint i = 0; i < layerCount; i++) { STR.Layer layer = str.layers[i] = new STR.Layer(); //read texture filenames var textureCount = data.ReadInt(); layer.textures = new Texture2D[textureCount]; layer.texturesIds = new List <int>(); for (int j = 0; j < textureCount; j++) { var tex = data.ReadBinaryString(128); var texture = FileManager.Load(path + "/" + tex) as Texture2D; layer.textures[j] = texture; if (!textureNames.Contains(tex)) { layer.texturesIds.Add(textureNames.Count); textureIdLookup.Add(tex, textureNames.Count); textureNames.Add(tex); textures.Add(texture); } else { layer.texturesIds.Add(textureIdLookup[tex]); } } //read animations var animCount = data.ReadInt(); layer.animations = new STR.Animation[animCount]; for (int j = 0; j < animCount; j++) { var entry = new STR.Animation() { frame = data.ReadInt(), type = data.ReadUInt(), position = new Vector2(data.ReadFloat(), data.ReadFloat()) }; var uv = new float[] { data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat() }; var xy = new float[] { data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat(), data.ReadFloat() }; entry.uv = new Vector2[4]; entry.uv[0] = new Vector2(0, 0); entry.uv[1] = new Vector2(1, 0); entry.uv[2] = new Vector2(0, 1); entry.uv[3] = new Vector2(1, 1); entry.xy = new Vector2[4]; entry.xy[0] = new Vector2(xy[0], -xy[4]); entry.xy[1] = new Vector2(xy[1], -xy[5]); entry.xy[2] = new Vector2(xy[3], -xy[7]); entry.xy[3] = new Vector2(xy[2], -xy[6]); entry.animFrame = data.ReadFloat(); entry.animType = data.ReadUInt(); entry.delay = data.ReadFloat(); entry.angle = data.ReadFloat() / (1024f / 360f); entry.color = new Color(data.ReadFloat() / 255, data.ReadFloat() / 255, data.ReadFloat() / 255, data.ReadFloat() / 255); entry.srcAlpha = data.ReadUInt(); entry.destAlpha = data.ReadUInt(); entry.mtPreset = data.ReadUInt(); layer.animations[j] = entry; } } return(MakeAtlas(str, path)); }