Пример #1
0
        private static Resource Load(Stream stream, bool leaveOpen, Type type)
        {
            if (stream.Length < ResourceFileHeader.SIZE)
            {
                throw new InvalidDataException("Stream is too small to be a valid resource file.");
            }

            using (var reader = new ResourceReader(stream, leaveOpen))
            {
                var      header = reader.ReadFileHeader();
                Resource res;

                switch (header.Type)
                {
                case ResourceType.ModelPack:
                    res = new ModelPack(header.Version);
                    break;

                case ResourceType.ShaderCachePS3:
                    if (type == typeof(Epl))
                    {
                        res = new Epl(header.Version);
                    }
                    else
                    {
                        res = new ShaderCachePS3(header.Version);
                    }
                    break;

                case ResourceType.ShaderCachePSP2:
                    res = new ShaderCachePSP2(header.Version);
                    break;

                case ResourceType.ShaderCachePS4:
                    res = new ShaderCachePS4(header.Version);
                    break;

                // Custom
                case ResourceType.TextureMap:
                    res = new TextureMap(header.Version);
                    break;

                case ResourceType.TextureDictionary:
                    res = new TextureDictionary(header.Version);
                    break;

                case ResourceType.Texture:
                    res = new Texture(header.Version);
                    break;

                case ResourceType.ShaderPS3:
                    res = new ShaderPS3(header.Version);
                    break;

                case ResourceType.ShaderPSP2:
                    res = new ShaderPSP2(header.Version);
                    break;

                case ResourceType.ShaderPS4:
                    res = new ShaderPS4(header.Version);
                    break;

                case ResourceType.Model:
                    res = new Model(header.Version);
                    break;

                case ResourceType.Node:
                    return(Node.ReadRecursive(reader, header.Version));

                case ResourceType.UserPropertyDictionary:
                    res = new UserPropertyDictionary(header.Version);
                    break;

                case ResourceType.Morph:
                    res = new Morph(header.Version);
                    break;

                case ResourceType.MorphTarget:
                    res = new MorphTarget(header.Version);
                    break;

                case ResourceType.MorphTargetList:
                    res = new MorphTargetList(header.Version);
                    break;

                case ResourceType.MaterialDictionary:
                    res = new MaterialDictionary(header.Version);
                    break;

                case ResourceType.ChunkType000100F9:
                    res = new ChunkType000100F9(header.Version);
                    break;

                case ResourceType.ChunkType000100F8:
                    return(new ChunkType000100F8(header.Version)
                    {
                        Data = reader.ReadBytes(reader.ReadInt32())
                    });

                case ResourceType.AnimationPack:
                    res = new AnimationPack(header.Version);
                    break;

                case ResourceType.MaterialAttribute:
                    return(MaterialAttribute.Read(reader, header.Version));

                case ResourceType.Material:
                    res = new Material(header.Version);
                    break;

                case ResourceType.Light:
                    res = new Light(header.Version);
                    break;

                case ResourceType.Mesh:
                    res = new Mesh(header.Version);
                    break;

                case ResourceType.Camera:
                    res = new Camera(header.Version);
                    break;

                case ResourceType.Epl:
                {
                    res = new Epl(header.Version);
                    break;
                }

                case ResourceType.EplLeaf:
                    res = new EplLeaf(header.Version);
                    break;

                case ResourceType.Animation:
                    res = new Animation(header.Version);
                    break;

                case ResourceType.AnimationBit29Data:
                    res = new AnimationBit29Data(header.Version);
                    break;

                case ResourceType.AnimationLayer:
                    res = new AnimationLayer(header.Version);
                    break;

                case ResourceType.AnimationController:
                    res = new AnimationController(header.Version);
                    break;

                default:
                    throw new InvalidDataException("Unknown/Invalid resource type");
                }

                res.ReadCore(reader);

                if (res.ResourceType == ResourceType.ModelPack && type == typeof(AnimationPack))
                {
                    // Identify AnimationPack from a file with a model resource header
                    var model = ( ModelPack )res;
                    if (model.AnimationPack != null && model.ChunkType000100F8 == null && model.ChunkType000100F9 == null &&
                        model.Materials == null && model.Model == null && model.Textures == null)
                    {
                        res = model.AnimationPack;
                    }
                }

                return(res);
            }
        }
Пример #2
0
        public static Resource Load(Stream stream, bool leaveOpen)
        {
            if (stream.Length < ResourceFileHeader.SIZE)
            {
                throw new InvalidDataException("Stream is too small to be a valid resource file.");
            }

            using (var reader = new ResourceReader(stream, leaveOpen))
            {
                var      header = reader.ReadFileHeader();
                Resource res;

                switch (header.Type)
                {
                case ResourceType.Model:
                    res = new Model(header.Version);
                    break;

                case ResourceType.ShaderCachePS3:
                    res = new ShaderCachePS3(header.Version);
                    break;

                case ResourceType.ShaderCachePSP2:
                    res = new ShaderCachePSP2(header.Version);
                    break;

                case ResourceType.ShaderCachePS4:
                    res = new ShaderCachePS4(header.Version);
                    break;

                // Custom
                case ResourceType.TextureMap:
                    res = new TextureMap(header.Version);
                    break;

                case ResourceType.TextureDictionary:
                    res = new TextureDictionary(header.Version);
                    break;

                case ResourceType.Texture:
                    res = new Texture(header.Version);
                    break;

                case ResourceType.ShaderPS3:
                    res = new ShaderPS3(header.Version);
                    break;

                case ResourceType.ShaderPSP2:
                    res = new ShaderPSP2(header.Version);
                    break;

                case ResourceType.ShaderPS4:
                    res = new ShaderPS4(header.Version);
                    break;

                case ResourceType.Scene:
                    res = new Scene(header.Version);
                    break;

                case ResourceType.Node:
                    res = new Node(header.Version);
                    break;

                case ResourceType.UserPropertyCollection:
                    res = new UserPropertyCollection(header.Version);
                    break;

                case ResourceType.Morph:
                    res = new Morph(header.Version);
                    break;

                case ResourceType.MorphTarget:
                    res = new MorphTarget(header.Version);
                    break;

                case ResourceType.MorphTargetList:
                    res = new MorphTargetList(header.Version);
                    break;

                case ResourceType.MaterialDictionary:
                    res = new MaterialDictionary(header.Version);
                    break;

                case ResourceType.ChunkType000100F9:
                    res = new ChunkType000100F9(header.Version);
                    break;

                case ResourceType.ChunkType000100F8:
                    res = new ChunkType000100F8(header.Version);
                    break;

                case ResourceType.AnimationPack:
                    res = new AnimationPack(header.Version);
                    break;

                case ResourceType.MaterialAttribute:
                    return(MaterialAttribute.Read(reader, header.Version));

                case ResourceType.Material:
                    res = new Material(header.Version);
                    break;

                case ResourceType.Light:
                    res = new Light(header.Version);
                    break;

                case ResourceType.Geometry:
                    res = new Geometry(header.Version);
                    break;

                case ResourceType.Camera:
                    res = new Camera(header.Version);
                    break;

                case ResourceType.Epl:
                {
                    return(new Epl
                        {
                            // Make sure to also read the extra boolean we wrote to the file to keep track of this.
                            IncludesProperties = reader.ReadBoolean(),
                            RawData = reader.ReadBytes(( int )(stream.Length - stream.Position))
                        });
                }

                case ResourceType.EplLeaf:
                    res = new EplLeaf(header.Version);
                    break;

                case ResourceType.Animation:
                    res = new Animation(header.Version);
                    break;

                case ResourceType.AnimationExtraData:
                    res = new AnimationExtraData(header.Version);
                    break;

                case ResourceType.KeyframeTrack:
                    res = new KeyframeTrack(header.Version);
                    break;

                case ResourceType.AnimationController:
                    res = new AnimationController(header.Version);
                    break;

                default:
                    throw new InvalidDataException("Unknown/Invalid resource type");
                }

                res.Read(reader);

                if (res.ResourceType == ResourceType.Model)
                {
                    // Identifier AnimationPack from a file with a model resource header
                    var model = ( Model )res;
                    if (model.AnimationPack != null && model.ChunkType000100F8 == null && model.ChunkType000100F9 == null &&
                        model.Materials == null && model.Scene == null && model.Textures == null)
                    {
                        res = model.AnimationPack;
                    }
                }

                return(res);
            }
        }