Ejemplo n.º 1
0
 private void RecursiveTreeLoad(AssetTypeValueField atvf, TreeNode node, int depth)
 {
     if (atvf.childrenCount == 0)
     {
         return;
     }
     foreach (AssetTypeValueField atvfc in atvf.children) //todo, if over certain amount of children, load later
     {
         if (atvfc == null)
         {
             return;                //derp check, usually doesn't break anything
         }
         string value = "";
         if (atvfc.GetValue() != null)
         {
             EnumValueTypes evt = atvfc.GetValue().GetValueType();
             string         str = "";
             if (evt == EnumValueTypes.ValueType_String)
             {
                 str = "\"";
             }
             if (1 <= (int)evt && (int)evt <= 12)
             {
                 value = " = " + str + atvfc.GetValue().AsString() + str;
             }
             if (evt == EnumValueTypes.ValueType_Array ||
                 evt == EnumValueTypes.ValueType_ByteArray)
             {
                 value = $" (size {atvfc.childrenCount})";
             }
         }
         node.Nodes.Add(atvfc.GetFieldType() + " " + atvfc.GetName() + value);
         RecursiveTreeLoad(atvfc, node.LastNode, depth + 1);
     }
 }
Ejemplo n.º 2
0
        private uint GetFieldSize(EnumValueTypes valueType)
        {
            switch (valueType)
            {
            case EnumValueTypes.ValueType_Bool:
            case EnumValueTypes.ValueType_Int8:
            case EnumValueTypes.ValueType_UInt8:
                return(1);

            case EnumValueTypes.ValueType_Int16:
            case EnumValueTypes.ValueType_UInt16:
                return(2);

            case EnumValueTypes.ValueType_Int32:
            case EnumValueTypes.ValueType_UInt32:
            case EnumValueTypes.ValueType_Float:
                return(4);

            case EnumValueTypes.ValueType_Int64:
            case EnumValueTypes.ValueType_UInt64:
            case EnumValueTypes.ValueType_Double:
                return(8);

            default:
                return(0xFFFFFFFF);
            }
        }
Ejemplo n.º 3
0
 //Creates an AssetTypeValue.
 //type : the value type which valueContainer stores
 //valueContainer : the buffer for the value type
 //freeIfPointer : should the value get freed if value type is Array/String
 public AssetTypeValue(EnumValueTypes type, object valueContainer)
 {
     this.type = type;
     if (valueContainer != null)
     {
         Set(valueContainer);
     }
 }
Ejemplo n.º 4
0
        private void RecurseTextDump(AssetTypeValueField field, int depth)
        {
            AssetTypeTemplateField template = field.GetTemplateField();
            string align     = template.align ? "1" : "0";
            string typeName  = template.type;
            string fieldName = template.name;
            bool   isArray   = template.isArray;

            //string's field isn't aligned but its array is
            if (template.valueType == EnumValueTypes.String)
            {
                align = "1";
            }

            if (isArray)
            {
                AssetTypeTemplateField sizeTemplate = template.children[0];
                string sizeAlign     = sizeTemplate.align ? "1" : "0";
                string sizeTypeName  = sizeTemplate.type;
                string sizeFieldName = sizeTemplate.name;
                int    size          = field.GetValue().AsArray().size;
                sw.WriteLine($"{new string(' ', depth)}{align} {typeName} {fieldName} ({size} items)");
                sw.WriteLine($"{new string(' ', depth+1)}{sizeAlign} {sizeTypeName} {sizeFieldName} = {size}");
                for (int i = 0; i < field.childrenCount; i++)
                {
                    sw.WriteLine($"{new string(' ', depth+1)}[{i}]");
                    RecurseTextDump(field.children[i], depth + 2);
                }
            }
            else
            {
                string value = "";
                if (field.GetValue() != null)
                {
                    EnumValueTypes evt = field.GetValue().GetValueType();
                    if (evt == EnumValueTypes.String)
                    {
                        //only replace \ with \\ but not " with \" lol
                        //you just have to find the last "
                        string fixedStr = field.GetValue().AsString()
                                          .Replace("\\", "\\\\")
                                          .Replace("\r", "\\r")
                                          .Replace("\n", "\\n");
                        value = $" = \"{fixedStr}\"";
                    }
                    else if (1 <= (int)evt && (int)evt <= 12)
                    {
                        value = $" = {field.GetValue().AsString()}";
                    }
                }
                sw.WriteLine($"{new string(' ', depth)}{align} {typeName} {fieldName}{value}");

                for (int i = 0; i < field.childrenCount; i++)
                {
                    RecurseTextDump(field.children[i], depth + 1);
                }
            }
        }
Ejemplo n.º 5
0
 private bool TypeAligns(EnumValueTypes valueType)
 {
     if (valueType.Equals(EnumValueTypes.Bool) ||
         valueType.Equals(EnumValueTypes.Int8) ||
         valueType.Equals(EnumValueTypes.UInt8) ||
         valueType.Equals(EnumValueTypes.Int16) ||
         valueType.Equals(EnumValueTypes.UInt16))
     {
         return(true);
     }
     return(false);
 }
Ejemplo n.º 6
0
 private bool IsAlignable(EnumValueTypes valueType)
 {
     if (valueType.Equals(EnumValueTypes.ValueType_Bool) ||
         valueType.Equals(EnumValueTypes.ValueType_Int8) ||
         valueType.Equals(EnumValueTypes.ValueType_UInt8) ||
         valueType.Equals(EnumValueTypes.ValueType_Int16) ||
         valueType.Equals(EnumValueTypes.ValueType_UInt16))
     {
         return(true);
     }
     return(false);
 }
Ejemplo n.º 7
0
        private AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, bool isArray, bool align, int childrenCount, AssetTypeTemplateField[] children)
        {
            AssetTypeTemplateField field = new AssetTypeTemplateField();

            field.name          = name;
            field.type          = type;
            field.valueType     = valueType;
            field.isArray       = isArray;
            field.align         = align;
            field.hasValue      = valueType != EnumValueTypes.None;
            field.childrenCount = childrenCount;
            field.children      = children;

            return(field);
        }
Ejemplo n.º 8
0
        public AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, bool isArray, bool align, uint childrenCount, AssetTypeTemplateField[] children)
        {
            AssetTypeTemplateField field = new AssetTypeTemplateField();

            field.name          = name;
            field.type          = type;
            field.valueType     = valueType;
            field.isArray       = isArray;
            field.align         = align;
            field.hasValue      = (valueType == EnumValueTypes.ValueType_None) ? false : true;
            field.childrenCount = childrenCount;
            field.children      = children;

            return(field);
        }
        public bool FromClassDatabase(ClassDatabaseFile pFile, ClassDatabaseType pType, uint fieldIndex)
        {
            ClassDatabaseTypeField field = pType.fields[(int)fieldIndex];

            name      = field.fieldName.GetString(pFile);
            type      = field.typeName.GetString(pFile);
            valueType = AssetTypeValueField.GetValueTypeByTypeName(type);
            isArray   = field.isArray == 1 ? true : false;
            align     = (field.flags2 & 0x4000) != 0x00 ? true : false;
            hasValue  = (valueType == EnumValueTypes.ValueType_None) ? false : true;

            List <int> childrenIndexes = new List <int>();
            int        thisDepth       = pType.fields[(int)fieldIndex].depth;

            for (int i = (int)fieldIndex + 1; i < pType.fields.Count; i++)
            {
                if (pType.fields[i].depth == thisDepth + 1)
                {
                    childrenCount++;
                    childrenIndexes.Add(i);
                }
                if (pType.fields[i].depth <= thisDepth)
                {
                    break;
                }
            }
            children = new AssetTypeTemplateField[childrenCount];
            int child = 0;

            for (int i = (int)fieldIndex + 1; i < pType.fields.Count; i++)
            {
                if (pType.fields[i].depth == thisDepth + 1)
                {
                    children[child] = new AssetTypeTemplateField();
                    children[child].FromClassDatabase(pFile, pType, (uint)childrenIndexes[child]);
                    child++;
                }
                if (pType.fields[i].depth <= thisDepth)
                {
                    break;
                }
            }
            return(true);
        }
        ///public AssetTypeTemplateField()
        ///public void Clear()
        public bool From0D(Type_0D u5Type, int fieldIndex)
        {
            TypeField_0D field = u5Type.typeFieldsEx[fieldIndex];

            name      = field.GetNameString(u5Type.stringTable);
            type      = field.GetTypeString(u5Type.stringTable);
            valueType = AssetTypeValueField.GetValueTypeByTypeName(type);
            isArray   = field.isArray == 1 ? true : false;
            align     = (field.flags & 0x4000) != 0x00 ? true : false;
            hasValue  = (valueType == EnumValueTypes.ValueType_None) ? false : true;

            List <int> childrenIndexes = new List <int>();
            int        thisDepth       = u5Type.typeFieldsEx[fieldIndex].depth;

            for (int i = fieldIndex + 1; i < u5Type.typeFieldsExCount; i++)
            {
                if (u5Type.typeFieldsEx[i].depth == thisDepth + 1)
                {
                    childrenCount++;
                    childrenIndexes.Add(i);
                }
                if (u5Type.typeFieldsEx[i].depth <= thisDepth)
                {
                    break;
                }
            }
            children = new AssetTypeTemplateField[childrenCount];
            int child = 0;

            for (int i = fieldIndex + 1; i < u5Type.typeFieldsExCount; i++)
            {
                if (u5Type.typeFieldsEx[i].depth == thisDepth + 1)
                {
                    children[child] = new AssetTypeTemplateField();
                    children[child].From0D(u5Type, childrenIndexes[child]);
                    child++;
                }
                if (u5Type.typeFieldsEx[i].depth <= thisDepth)
                {
                    break;
                }
            }
            return(true);
        }
Ejemplo n.º 11
0
        private string CorrectTypeName(EnumValueTypes valueTypes)
        {
            switch (valueTypes)
            {
            case EnumValueTypes.Bool:
                return("bool");

            case EnumValueTypes.UInt8:
                return("UInt8");

            case EnumValueTypes.Int8:
                return("SInt8");

            case EnumValueTypes.UInt16:
                return("UInt16");

            case EnumValueTypes.Int16:
                return("Int16");

            case EnumValueTypes.UInt32:
                return("unsigned int");

            case EnumValueTypes.Int32:
                return("int");

            case EnumValueTypes.UInt64:
                return("UInt64");

            case EnumValueTypes.Int64:
                return("SInt64");

            case EnumValueTypes.Float:
                return("float");

            case EnumValueTypes.Double:
                return("double");

            case EnumValueTypes.String:
                return("string");
            }
            return("UnknownBaseType");
        }
Ejemplo n.º 12
0
        private void TreeLoad(AssetsFileInstance fromFile, AssetTypeValueField assetField, TreeViewItem treeItem)
        {
            if (assetField.childrenCount == 0)
            {
                return;
            }

            int arrayIdx = 0;
            List <TreeViewItem> items = new List <TreeViewItem>(assetField.childrenCount + 1);

            AssetTypeTemplateField assetFieldTemplate = assetField.GetTemplateField();
            bool isArray = assetFieldTemplate.isArray;

            if (isArray)
            {
                int size = assetField.GetValue().AsArray().size;
                AssetTypeTemplateField sizeTemplate       = assetFieldTemplate.children[0];
                TreeViewItem           arrayIndexTreeItem = CreateTreeItem($"{sizeTemplate.type} {sizeTemplate.name} = {size}");
                items.Add(arrayIndexTreeItem);
            }

            foreach (AssetTypeValueField childField in assetField.children)
            {
                if (childField == null)
                {
                    return;
                }
                string value = "";
                if (childField.GetValue() != null)
                {
                    EnumValueTypes evt   = childField.GetValue().GetValueType();
                    string         quote = "";
                    if (evt == EnumValueTypes.String)
                    {
                        quote = "\"";
                    }
                    if (1 <= (int)evt && (int)evt <= 12)
                    {
                        value = $" = {quote}{childField.GetValue().AsString()}{quote}";
                    }
                    if (evt == EnumValueTypes.Array ||
                        evt == EnumValueTypes.ByteArray)
                    {
                        value = $" (size {childField.childrenCount})";
                    }
                }

                if (isArray)
                {
                    TreeViewItem arrayIndexTreeItem = CreateTreeItem($"{arrayIdx}");
                    items.Add(arrayIndexTreeItem);

                    TreeViewItem childTreeItem = CreateTreeItem($"{childField.GetFieldType()} {childField.GetName()}{value}");
                    arrayIndexTreeItem.Items = new List <TreeViewItem>()
                    {
                        childTreeItem
                    };

                    if (childField.childrenCount > 0)
                    {
                        TreeViewItem dummyItem = CreateTreeItem("Loading...");
                        childTreeItem.Items = new List <TreeViewItem>()
                        {
                            dummyItem
                        };
                        SetTreeItemEvents(childTreeItem, fromFile, childField);
                    }

                    arrayIdx++;
                }
                else
                {
                    TreeViewItem childTreeItem = CreateTreeItem($"{childField.GetFieldType()} {childField.GetName()}{value}");
                    items.Add(childTreeItem);

                    if (childField.childrenCount > 0)
                    {
                        TreeViewItem dummyItem = CreateTreeItem("Loading...");
                        childTreeItem.Items = new List <TreeViewItem>()
                        {
                            dummyItem
                        };
                        SetTreeItemEvents(childTreeItem, fromFile, childField);
                    }
                }
            }

            string templateFieldType = assetField.templateField.type;

            if (templateFieldType.StartsWith("PPtr<") && templateFieldType.EndsWith(">"))
            {
                var  fileIdField = assetField.Get("m_FileID");
                var  pathIdField = assetField.Get("m_PathID");
                bool pptrValid   = !fileIdField.IsDummy() && !pathIdField.IsDummy();

                if (pptrValid)
                {
                    int  fileId = fileIdField.GetValue().AsInt();
                    long pathId = pathIdField.GetValue().AsInt64();

                    AssetContainer cont = workspace.GetAssetContainer(fromFile, fileId, pathId, false);

                    TreeViewItem childTreeItem = CreateTreeItem($"[view asset]");
                    items.Add(childTreeItem);

                    TreeViewItem dummyItem = CreateTreeItem("Loading...");
                    childTreeItem.Items = new List <TreeViewItem>()
                    {
                        dummyItem
                    };
                    SetPPtrEvents(childTreeItem, fromFile, cont);
                }
            }

            treeItem.Items = items;
        }
        public AssetTypeValueField ReadType(AssetsFileReader reader, ulong filePos, AssetTypeValueField valueField, bool bigEndian)
        {
            if (valueField.templateField.isArray)
            {
                if (valueField.templateField.childrenCount == 2)
                {
                    EnumValueTypes sizeType = valueField.templateField.children[0].valueType;
                    if (sizeType == EnumValueTypes.ValueType_Int32 ||
                        sizeType == EnumValueTypes.ValueType_UInt32)
                    {
                        valueField.childrenCount = reader.ReadUInt32();
                        valueField.pChildren     = new AssetTypeValueField[valueField.childrenCount];
                        for (int i = 0; i < valueField.childrenCount; i++)
                        {
                            valueField.pChildren[i] = new AssetTypeValueField();
                            valueField.pChildren[i].templateField = valueField.templateField.children[1];
                            valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian);
                        }
                        if (valueField.templateField.align)
                        {
                            reader.Align();
                        }
                        AssetTypeArray ata = new AssetTypeArray();
                        ata.size         = valueField.childrenCount;
                        valueField.value = new AssetTypeValue(EnumValueTypes.ValueType_Array, 0);
                        valueField.value.Set(ata);
                    }
                    else
                    {
                        Debug.WriteLine("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!");
                    }
                }
                else
                {
                    Debug.WriteLine("Invalid array!");
                }
            }
            else
            {
                EnumValueTypes type = valueField.templateField.valueType;
                if (type != 0)
                {
                    valueField.value = new AssetTypeValue(type, 0);
                }
                if (type == EnumValueTypes.ValueType_String)
                {
                    valueField.value.Set(reader.ReadCountStringInt32());
                    reader.Align();
                }
                else
                {
                    valueField.childrenCount = valueField.templateField.childrenCount;
                    if (valueField.childrenCount == 0)
                    {
                        valueField.pChildren = new AssetTypeValueField[0];
                        switch (valueField.templateField.valueType)
                        {
                        case EnumValueTypes.ValueType_Int8:
                            valueField.value.Set(reader.ReadSByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.ValueType_UInt8:
                        case EnumValueTypes.ValueType_Bool:
                            valueField.value.Set(reader.ReadByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.ValueType_Int16:
                            valueField.value.Set(reader.ReadInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.ValueType_UInt16:
                            valueField.value.Set(reader.ReadUInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.ValueType_Int32:
                            valueField.value.Set(reader.ReadInt32());
                            break;

                        case EnumValueTypes.ValueType_UInt32:
                            valueField.value.Set(reader.ReadUInt32());
                            break;

                        case EnumValueTypes.ValueType_Int64:
                            valueField.value.Set(reader.ReadInt64());
                            break;

                        case EnumValueTypes.ValueType_UInt64:
                            valueField.value.Set(reader.ReadUInt64());
                            break;

                        case EnumValueTypes.ValueType_Float:
                            valueField.value.Set(reader.ReadSingle());
                            break;

                        case EnumValueTypes.ValueType_Double:
                            valueField.value.Set(reader.ReadDouble());
                            break;
                        }
                    }
                    else
                    {
                        valueField.pChildren = new AssetTypeValueField[valueField.childrenCount];
                        for (int i = 0; i < valueField.childrenCount; i++)
                        {
                            valueField.pChildren[i] = new AssetTypeValueField();
                            valueField.pChildren[i].templateField = valueField.templateField.children[i];
                            valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian);
                        }
                        if (valueField.templateField.align)
                        {
                            reader.Align();
                        }
                    }
                }
            }
            return(valueField);
        }
Ejemplo n.º 14
0
 //Creates an AssetTypeValue.
 //type : the value type which valueContainer stores
 //valueContainer : the buffer for the value type
 //freeIfPointer : should the value get freed if value type is Array/String
 public AssetTypeValue(EnumValueTypes type, object valueContainer)
 {
     this.type = type;
 }
Ejemplo n.º 15
0
 private AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, int childrenCount, AssetTypeTemplateField[] children)
 {
     return(CreateTemplateField(name, type, valueType, false, false, childrenCount, children));
 }
Ejemplo n.º 16
0
 private AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType, bool isArray, bool align)
 {
     return(CreateTemplateField(name, type, valueType, isArray, align, 0, null));
 }
Ejemplo n.º 17
0
 private AssetTypeTemplateField CreateTemplateField(string name, string type, EnumValueTypes valueType)
 {
     return(CreateTemplateField(name, type, valueType, false, false, 0, null));
 }
Ejemplo n.º 18
0
        private void TreeLoad(AssetTypeValueField assetField, TreeViewItem treeItem)
        {
            if (assetField.childrenCount == 0)
            {
                return;
            }

            int arrayIdx = 0;
            List <TreeViewItem> items = new List <TreeViewItem>(assetField.childrenCount + 1);

            AssetTypeTemplateField assetFieldTemplate = assetField.GetTemplateField();
            bool isArray = assetFieldTemplate.isArray;

            if (isArray)
            {
                int size = assetField.GetValue().AsArray().size;
                AssetTypeTemplateField sizeTemplate       = assetFieldTemplate.children[0];
                TreeViewItem           arrayIndexTreeItem = CreateTreeItem($"{sizeTemplate.type} {sizeTemplate.name} = {size}");
                items.Add(arrayIndexTreeItem);
            }

            foreach (AssetTypeValueField childField in assetField.children)
            {
                if (childField == null)
                {
                    return;
                }
                string value = "";
                if (childField.GetValue() != null)
                {
                    EnumValueTypes evt   = childField.GetValue().GetValueType();
                    string         quote = "";
                    if (evt == EnumValueTypes.String)
                    {
                        quote = "\"";
                    }
                    if (1 <= (int)evt && (int)evt <= 12)
                    {
                        value = $" = {quote}{childField.GetValue().AsString()}{quote}";
                    }
                    if (evt == EnumValueTypes.Array ||
                        evt == EnumValueTypes.ByteArray)
                    {
                        value = $" (size {childField.childrenCount})";
                    }
                }

                if (isArray)
                {
                    TreeViewItem arrayIndexTreeItem = CreateTreeItem($"{arrayIdx}");
                    items.Add(arrayIndexTreeItem);

                    TreeViewItem childTreeItem = CreateTreeItem($"{childField.GetFieldType()} {childField.GetName()}{value}");
                    arrayIndexTreeItem.Items = new List <TreeViewItem>()
                    {
                        childTreeItem
                    };

                    if (childField.childrenCount > 0)
                    {
                        TreeViewItem dummyItem = CreateTreeItem("Loading...");
                        childTreeItem.Items = new List <TreeViewItem>()
                        {
                            dummyItem
                        };
                        SetTreeItemEvents(childTreeItem, childField);
                    }

                    arrayIdx++;
                }
                else
                {
                    TreeViewItem childTreeItem = CreateTreeItem($"{childField.GetFieldType()} {childField.GetName()}{value}");
                    items.Add(childTreeItem);

                    if (childField.childrenCount > 0)
                    {
                        TreeViewItem dummyItem = CreateTreeItem("Loading...");
                        childTreeItem.Items = new List <TreeViewItem>()
                        {
                            dummyItem
                        };
                        SetTreeItemEvents(childTreeItem, childField);
                    }
                }
            }
            treeItem.Items = items;
        }
        public AssetTypeValueField ReadType(AssetsFileReader reader, AssetTypeValueField valueField)
        {
            if (valueField.templateField.isArray)
            {
                if (valueField.templateField.childrenCount == 2)
                {
                    EnumValueTypes sizeType = valueField.templateField.children[0].valueType;
                    if (sizeType == EnumValueTypes.Int32 ||
                        sizeType == EnumValueTypes.UInt32)
                    {
                        if (valueField.templateField.valueType == EnumValueTypes.ByteArray)
                        {
                            valueField.childrenCount = 0;
                            valueField.children      = new AssetTypeValueField[0];
                            int    size = reader.ReadInt32();
                            byte[] data = reader.ReadBytes(size);
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            AssetTypeByteArray atba = new AssetTypeByteArray();
                            atba.size        = (uint)size;
                            atba.data        = data;
                            valueField.value = new AssetTypeValue(EnumValueTypes.ByteArray, atba);
                        }
                        else
                        {
                            valueField.childrenCount = reader.ReadInt32();
                            valueField.children      = new AssetTypeValueField[valueField.childrenCount];
                            for (int i = 0; i < valueField.childrenCount; i++)
                            {
                                valueField.children[i] = new AssetTypeValueField();
                                valueField.children[i].templateField = valueField.templateField.children[1];
                                valueField.children[i] = ReadType(reader, valueField.children[i]);
                            }
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            AssetTypeArray ata = new AssetTypeArray();
                            ata.size         = valueField.childrenCount;
                            valueField.value = new AssetTypeValue(EnumValueTypes.Array, ata);
                        }
                    }
                    else
                    {
                        throw new Exception("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!");
                    }
                }
                else
                {
                    throw new Exception("Invalid array!");
                }
            }
            else
            {
                EnumValueTypes type = valueField.templateField.valueType;
                if (type != 0)
                {
                    valueField.value = new AssetTypeValue(type, null);
                }
                if (type == EnumValueTypes.String)
                {
                    int length = reader.ReadInt32();
                    valueField.value.Set(reader.ReadBytes(length));
                    reader.Align();
                }
                else
                {
                    valueField.childrenCount = valueField.templateField.childrenCount;
                    if (valueField.childrenCount == 0)
                    {
                        valueField.children = new AssetTypeValueField[0];
                        switch (valueField.templateField.valueType)
                        {
                        case EnumValueTypes.Int8:
                            valueField.value.Set(reader.ReadSByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.UInt8:
                        case EnumValueTypes.Bool:
                            valueField.value.Set(reader.ReadByte());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.Int16:
                            valueField.value.Set(reader.ReadInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.UInt16:
                            valueField.value.Set(reader.ReadUInt16());
                            if (valueField.templateField.align)
                            {
                                reader.Align();
                            }
                            break;

                        case EnumValueTypes.Int32:
                            valueField.value.Set(reader.ReadInt32());
                            break;

                        case EnumValueTypes.UInt32:
                            valueField.value.Set(reader.ReadUInt32());
                            break;

                        case EnumValueTypes.Int64:
                            valueField.value.Set(reader.ReadInt64());
                            break;

                        case EnumValueTypes.UInt64:
                            valueField.value.Set(reader.ReadUInt64());
                            break;

                        case EnumValueTypes.Float:
                            valueField.value.Set(reader.ReadSingle());
                            break;

                        case EnumValueTypes.Double:
                            valueField.value.Set(reader.ReadDouble());
                            break;
                        }
                    }
                    else
                    {
                        valueField.children = new AssetTypeValueField[valueField.childrenCount];
                        for (int i = 0; i < valueField.childrenCount; i++)
                        {
                            valueField.children[i] = new AssetTypeValueField();
                            valueField.children[i].templateField = valueField.templateField.children[i];
                            valueField.children[i] = ReadType(reader, valueField.children[i]);
                        }
                        if (valueField.templateField.align)
                        {
                            reader.Align();
                        }
                    }
                }
            }
            return(valueField);
        }