Compare commits
2 Commits
b7cd60e4cf
...
ebcc629feb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ebcc629feb | ||
|
|
2bd93ab3bb |
@@ -6,4 +6,14 @@
|
|||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="KaitaiStruct.Runtime.CSharp" Version="0.10.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\CodeGenerator\BlendFile.cs">
|
||||||
|
<Link>BlendFile.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
42
BlendFile/Reader.cs
Normal file
42
BlendFile/Reader.cs
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using Kaitai;
|
||||||
|
|
||||||
|
|
||||||
|
namespace BlendFile;
|
||||||
|
|
||||||
|
public class Reader {
|
||||||
|
readonly string _path;
|
||||||
|
private readonly Dictionary<int, Type> dnaTypes = new();
|
||||||
|
|
||||||
|
private List<object> objects = new();
|
||||||
|
public List<object> Objects => objects;
|
||||||
|
|
||||||
|
public Reader(string path) {
|
||||||
|
_path = path;
|
||||||
|
var types = Assembly.GetExecutingAssembly().DefinedTypes;
|
||||||
|
foreach (var type in types) {
|
||||||
|
var attrib = type.GetCustomAttribute<DNAClassAttribute>();
|
||||||
|
if (attrib ==null) continue;
|
||||||
|
dnaTypes.Add(attrib.OriginalIndex, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Read() {
|
||||||
|
var file = new KaitaiStream(_path);
|
||||||
|
var blend = new Kaitai.BlendFile(file);
|
||||||
|
|
||||||
|
foreach (var block in blend.Blocks) {
|
||||||
|
Type t = dnaTypes[(int)block.SdnaIndex];
|
||||||
|
var obj = Activator.CreateInstance(t);
|
||||||
|
if(obj == null) continue;
|
||||||
|
objects.Add(obj);
|
||||||
|
|
||||||
|
foreach (var field in t.GetFields()) {
|
||||||
|
var attrib = field.GetCustomAttribute<DNAFieldAttribute>();
|
||||||
|
if (attrib == null) continue;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,9 +18,9 @@ namespace Kaitai {
|
|||||||
/// block would be a structure with code `DNA1`, which is a essentially
|
/// block would be a structure with code `DNA1`, which is a essentially
|
||||||
/// a machine-readable schema of all other structures used in this file.
|
/// a machine-readable schema of all other structures used in this file.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class BlenderBlend : KaitaiStruct {
|
public partial class BlendFile : KaitaiStruct {
|
||||||
public static BlenderBlend FromFile(string fileName) {
|
public static BlendFile FromFile(string fileName) {
|
||||||
return new BlenderBlend(new KaitaiStream(fileName));
|
return new BlendFile(new KaitaiStream(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ namespace Kaitai {
|
|||||||
Le = 118,
|
Le = 118,
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend(KaitaiStream p__io, KaitaiStruct p__parent = null, BlenderBlend p__root = null) : base(p__io) {
|
public BlendFile(KaitaiStream p__io, KaitaiStruct p__parent = null, BlendFile p__root = null) : base(p__io) {
|
||||||
m_parent = p__parent;
|
m_parent = p__parent;
|
||||||
m_root = p__root ?? this;
|
m_root = p__root ?? this;
|
||||||
f_sdnaStructs = false;
|
f_sdnaStructs = false;
|
||||||
@@ -62,7 +62,7 @@ namespace Kaitai {
|
|||||||
return new DnaStruct(new KaitaiStream(fileName));
|
return new DnaStruct(new KaitaiStream(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
public DnaStruct(KaitaiStream p__io, BlenderBlend.Dna1Body p__parent = null, BlenderBlend p__root = null) :
|
public DnaStruct(KaitaiStream p__io, BlendFile.Dna1Body p__parent = null, BlendFile p__root = null) :
|
||||||
base(p__io) {
|
base(p__io) {
|
||||||
m_parent = p__parent;
|
m_parent = p__parent;
|
||||||
m_root = p__root;
|
m_root = p__root;
|
||||||
@@ -95,8 +95,8 @@ namespace Kaitai {
|
|||||||
private ushort _idxType;
|
private ushort _idxType;
|
||||||
private ushort _numFields;
|
private ushort _numFields;
|
||||||
private List<DnaField> _fields;
|
private List<DnaField> _fields;
|
||||||
private BlenderBlend m_root;
|
private BlendFile m_root;
|
||||||
private BlenderBlend.Dna1Body m_parent;
|
private BlendFile.Dna1Body m_parent;
|
||||||
|
|
||||||
public ushort IdxType {
|
public ushort IdxType {
|
||||||
get { return _idxType; }
|
get { return _idxType; }
|
||||||
@@ -110,11 +110,11 @@ namespace Kaitai {
|
|||||||
get { return _fields; }
|
get { return _fields; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend M_Root {
|
public BlendFile M_Root {
|
||||||
get { return m_root; }
|
get { return m_root; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend.Dna1Body M_Parent {
|
public BlendFile.Dna1Body M_Parent {
|
||||||
get { return m_parent; }
|
get { return m_parent; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,7 +124,7 @@ namespace Kaitai {
|
|||||||
return new FileBlock(new KaitaiStream(fileName));
|
return new FileBlock(new KaitaiStream(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
public FileBlock(KaitaiStream p__io, BlenderBlend p__parent = null, BlenderBlend p__root = null) : base(p__io) {
|
public FileBlock(KaitaiStream p__io, BlendFile p__parent = null, BlendFile p__root = null) : base(p__io) {
|
||||||
m_parent = p__parent;
|
m_parent = p__parent;
|
||||||
m_root = p__root;
|
m_root = p__root;
|
||||||
f_sdnaStruct = false;
|
f_sdnaStruct = false;
|
||||||
@@ -174,8 +174,8 @@ namespace Kaitai {
|
|||||||
private uint _sdnaIndex;
|
private uint _sdnaIndex;
|
||||||
private uint _count;
|
private uint _count;
|
||||||
private object _body;
|
private object _body;
|
||||||
private BlenderBlend m_root;
|
private BlendFile m_root;
|
||||||
private BlenderBlend m_parent;
|
private BlendFile m_parent;
|
||||||
private byte[] __raw_body;
|
private byte[] __raw_body;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -217,11 +217,11 @@ namespace Kaitai {
|
|||||||
get { return _body; }
|
get { return _body; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend M_Root {
|
public BlendFile M_Root {
|
||||||
get { return m_root; }
|
get { return m_root; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend M_Parent {
|
public BlendFile M_Parent {
|
||||||
get { return m_parent; }
|
get { return m_parent; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,7 +251,7 @@ namespace Kaitai {
|
|||||||
return new Dna1Body(new KaitaiStream(fileName));
|
return new Dna1Body(new KaitaiStream(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dna1Body(KaitaiStream p__io, BlenderBlend.FileBlock p__parent = null, BlenderBlend p__root = null) :
|
public Dna1Body(KaitaiStream p__io, BlendFile.FileBlock p__parent = null, BlendFile p__root = null) :
|
||||||
base(p__io) {
|
base(p__io) {
|
||||||
m_parent = p__parent;
|
m_parent = p__parent;
|
||||||
m_root = p__root;
|
m_root = p__root;
|
||||||
@@ -319,8 +319,8 @@ namespace Kaitai {
|
|||||||
private byte[] _strcMagic;
|
private byte[] _strcMagic;
|
||||||
private uint _numStructs;
|
private uint _numStructs;
|
||||||
private List<DnaStruct> _structs;
|
private List<DnaStruct> _structs;
|
||||||
private BlenderBlend m_root;
|
private BlendFile m_root;
|
||||||
private BlenderBlend.FileBlock m_parent;
|
private BlendFile.FileBlock m_parent;
|
||||||
|
|
||||||
public byte[] Id {
|
public byte[] Id {
|
||||||
get { return _id; }
|
get { return _id; }
|
||||||
@@ -382,11 +382,11 @@ namespace Kaitai {
|
|||||||
get { return _structs; }
|
get { return _structs; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend M_Root {
|
public BlendFile M_Root {
|
||||||
get { return m_root; }
|
get { return m_root; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend.FileBlock M_Parent {
|
public BlendFile.FileBlock M_Parent {
|
||||||
get { return m_parent; }
|
get { return m_parent; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -396,7 +396,7 @@ namespace Kaitai {
|
|||||||
return new Header(new KaitaiStream(fileName));
|
return new Header(new KaitaiStream(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Header(KaitaiStream p__io, BlenderBlend p__parent = null, BlenderBlend p__root = null) : base(p__io) {
|
public Header(KaitaiStream p__io, BlendFile p__parent = null, BlendFile p__root = null) : base(p__io) {
|
||||||
m_parent = p__parent;
|
m_parent = p__parent;
|
||||||
m_root = p__root;
|
m_root = p__root;
|
||||||
f_psize = false;
|
f_psize = false;
|
||||||
@@ -409,8 +409,8 @@ namespace Kaitai {
|
|||||||
throw new ValidationNotEqualError(new byte[] { 66, 76, 69, 78, 68, 69, 82 }, Magic, M_Io,
|
throw new ValidationNotEqualError(new byte[] { 66, 76, 69, 78, 68, 69, 82 }, Magic, M_Io,
|
||||||
"/types/header/seq/0");
|
"/types/header/seq/0");
|
||||||
}
|
}
|
||||||
_ptrSizeId = ((BlenderBlend.PtrSize)m_io.ReadU1());
|
_ptrSizeId = ((BlendFile.PtrSize)m_io.ReadU1());
|
||||||
_endian = ((BlenderBlend.Endian)m_io.ReadU1());
|
_endian = ((BlendFile.Endian)m_io.ReadU1());
|
||||||
_version = System.Text.Encoding.GetEncoding("ASCII").GetString(m_io.ReadBytes(3));
|
_version = System.Text.Encoding.GetEncoding("ASCII").GetString(m_io.ReadBytes(3));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,7 +424,7 @@ namespace Kaitai {
|
|||||||
get {
|
get {
|
||||||
if (f_psize)
|
if (f_psize)
|
||||||
return _psize;
|
return _psize;
|
||||||
_psize = (sbyte)((PtrSizeId == BlenderBlend.PtrSize.Bits64 ? 8 : 4));
|
_psize = (sbyte)((PtrSizeId == BlendFile.PtrSize.Bits64 ? 8 : 4));
|
||||||
f_psize = true;
|
f_psize = true;
|
||||||
return _psize;
|
return _psize;
|
||||||
}
|
}
|
||||||
@@ -434,8 +434,8 @@ namespace Kaitai {
|
|||||||
private PtrSize _ptrSizeId;
|
private PtrSize _ptrSizeId;
|
||||||
private Endian _endian;
|
private Endian _endian;
|
||||||
private string _version;
|
private string _version;
|
||||||
private BlenderBlend m_root;
|
private BlendFile m_root;
|
||||||
private BlenderBlend m_parent;
|
private BlendFile m_parent;
|
||||||
|
|
||||||
public byte[] Magic {
|
public byte[] Magic {
|
||||||
get { return _magic; }
|
get { return _magic; }
|
||||||
@@ -462,11 +462,11 @@ namespace Kaitai {
|
|||||||
get { return _version; }
|
get { return _version; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend M_Root {
|
public BlendFile M_Root {
|
||||||
get { return m_root; }
|
get { return m_root; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend M_Parent {
|
public BlendFile M_Parent {
|
||||||
get { return m_parent; }
|
get { return m_parent; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -476,7 +476,7 @@ namespace Kaitai {
|
|||||||
return new DnaField(new KaitaiStream(fileName));
|
return new DnaField(new KaitaiStream(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
public DnaField(KaitaiStream p__io, BlenderBlend.DnaStruct p__parent = null, BlenderBlend p__root = null) :
|
public DnaField(KaitaiStream p__io, BlendFile.DnaStruct p__parent = null, BlendFile p__root = null) :
|
||||||
base(p__io) {
|
base(p__io) {
|
||||||
m_parent = p__parent;
|
m_parent = p__parent;
|
||||||
m_root = p__root;
|
m_root = p__root;
|
||||||
@@ -518,8 +518,8 @@ namespace Kaitai {
|
|||||||
|
|
||||||
private ushort _idxType;
|
private ushort _idxType;
|
||||||
private ushort _idxName;
|
private ushort _idxName;
|
||||||
private BlenderBlend m_root;
|
private BlendFile m_root;
|
||||||
private BlenderBlend.DnaStruct m_parent;
|
private BlendFile.DnaStruct m_parent;
|
||||||
|
|
||||||
public ushort IdxType {
|
public ushort IdxType {
|
||||||
get { return _idxType; }
|
get { return _idxType; }
|
||||||
@@ -529,11 +529,11 @@ namespace Kaitai {
|
|||||||
get { return _idxName; }
|
get { return _idxName; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend M_Root {
|
public BlendFile M_Root {
|
||||||
get { return m_root; }
|
get { return m_root; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend.DnaStruct M_Parent {
|
public BlendFile.DnaStruct M_Parent {
|
||||||
get { return m_parent; }
|
get { return m_parent; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -545,7 +545,7 @@ namespace Kaitai {
|
|||||||
get {
|
get {
|
||||||
if (f_sdnaStructs)
|
if (f_sdnaStructs)
|
||||||
return _sdnaStructs;
|
return _sdnaStructs;
|
||||||
_sdnaStructs = (List<DnaStruct>)(((BlenderBlend.Dna1Body)(Blocks[(Blocks.Count - 2)].Body)).Structs);
|
_sdnaStructs = (List<DnaStruct>)(((BlendFile.Dna1Body)(Blocks[(Blocks.Count - 2)].Body)).Structs);
|
||||||
f_sdnaStructs = true;
|
f_sdnaStructs = true;
|
||||||
return _sdnaStructs;
|
return _sdnaStructs;
|
||||||
}
|
}
|
||||||
@@ -553,7 +553,7 @@ namespace Kaitai {
|
|||||||
|
|
||||||
private Header _hdr;
|
private Header _hdr;
|
||||||
private List<FileBlock> _blocks;
|
private List<FileBlock> _blocks;
|
||||||
private BlenderBlend m_root;
|
private BlendFile m_root;
|
||||||
private KaitaiStruct m_parent;
|
private KaitaiStruct m_parent;
|
||||||
|
|
||||||
public Header Hdr {
|
public Header Hdr {
|
||||||
@@ -564,7 +564,7 @@ namespace Kaitai {
|
|||||||
get { return _blocks; }
|
get { return _blocks; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlenderBlend M_Root {
|
public BlendFile M_Root {
|
||||||
get { return m_root; }
|
get { return m_root; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -7,7 +7,6 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Kaitai;
|
using Kaitai;
|
||||||
using Microsoft.CSharp;
|
using Microsoft.CSharp;
|
||||||
using BlendFile = Kaitai.BlenderBlend;
|
|
||||||
|
|
||||||
// ReSharper disable BitwiseOperatorOnEnumWithoutFlags
|
// ReSharper disable BitwiseOperatorOnEnumWithoutFlags
|
||||||
namespace CodeGenerator {
|
namespace CodeGenerator {
|
||||||
@@ -314,7 +313,7 @@ namespace CodeGenerator {
|
|||||||
return cad;
|
return cad;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CodeMemberField CreateMemberField(BlenderBlend.DnaField field) {
|
private static CodeMemberField CreateMemberField(BlendFile.DnaField field) {
|
||||||
Type t = Type.GetType(field.Type.ParseFType());
|
Type t = Type.GetType(field.Type.ParseFType());
|
||||||
CodeMemberField cmf;
|
CodeMemberField cmf;
|
||||||
//Check if the type is a built-in type or a custom type
|
//Check if the type is a built-in type or a custom type
|
||||||
@@ -327,7 +326,7 @@ namespace CodeGenerator {
|
|||||||
return cmf;
|
return cmf;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CodeMemberField CreateArrayMemberField(BlenderBlend.DnaField field) {
|
private static CodeMemberField CreateArrayMemberField(BlendFile.DnaField field) {
|
||||||
Type t = Type.GetType(field.Type.ParseFType());
|
Type t = Type.GetType(field.Type.ParseFType());
|
||||||
CodeMemberField cmf;
|
CodeMemberField cmf;
|
||||||
|
|
||||||
@@ -395,7 +394,7 @@ namespace CodeGenerator {
|
|||||||
return ctc;
|
return ctc;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CodeConstructor GenerateConstructor(BlenderBlend.DnaStruct type, CodeTypeDeclaration ctd) {
|
private static CodeConstructor GenerateConstructor(BlendFile.DnaStruct type, CodeTypeDeclaration ctd) {
|
||||||
//Create a normal constructor
|
//Create a normal constructor
|
||||||
CodeConstructor cc = new CodeConstructor {
|
CodeConstructor cc = new CodeConstructor {
|
||||||
Name = type.Type,
|
Name = type.Type,
|
||||||
|
|||||||
Reference in New Issue
Block a user