Example #1
0
        public static bool Execute(Request req, out Result result)
        {
            result = new Result();

            try
            {
                var rep    = new BlendTypeRepository();
                var loader = new BlendLoader(rep);

                result.EntityList = loader.FromFile(req.FilePath);
            }
            catch (Exception e)
            {
                return(false);
            }


            return(true);
        }
Example #2
0
        private static List <BlockHeaderEntity> _CreateEntityList(ReadValueContext context, BlendTypeRepository repository)
        {
            var result = new List <BlockHeaderEntity>();

            BlendStructures.GlobalHeader.ReadValue(context);
            while (true)
            {
                var blockEntity = BlockHeaderEntity.ReadValue(context);
                switch (blockEntity.Code)
                {
                case "DNA1":
                    // skip
                    result.Add(blockEntity);
                    context.reader.ReadBytes(blockEntity.Size);
                    break;

                case "ENDB":
                    // end of file
                    result.Add(blockEntity);
                    return(result);

                case "REND":                         // RenderInfo
                case "TEST":                         // Preview Image
                    // skip
                    result.Add(blockEntity);
                    context.reader.ReadBytes(blockEntity.Size);
                    break;

                default:
                {
                    var type = repository.Find(blockEntity.SdnaIndex);

                    // register address mapping
                    int sdnaSize = blockEntity.Count * type.SizeOf();
                    context.mapper.AddEntry(blockEntity.OldAddress.Address, (int)context.reader.BaseStream.Position, blockEntity.Size, blockEntity.SdnaIndex, type);

                    if (blockEntity.Count == 1 && blockEntity.SdnaIndex == 0 && blockEntity.Size != type.SizeOf())
                    {
                        // Error? skip
                        result.Add(blockEntity);
                        context.reader.ReadBytes(blockEntity.Size);
                    }
                    else
                    {
                        Debug.Assert((type.SizeOf() * blockEntity.Count) == blockEntity.Size, "structure size unmatched");
                        for (int i = 0; i < blockEntity.Count; ++i)
                        {
                            var value = type.ReadValue(context);
                            blockEntity.Children.Add(new BlendEntityBase(value.Type.Name, value));
                        }

                        result.Add(blockEntity);
                    }
                }
                break;
                }
            }
        }
Example #3
0
 public BlendLoader(BlendTypeRepository rep)
 {
     m_repository = rep;
 }