public Kn5Node ReadNode() {
var nodeClass = ReadNodeClass();
var nodeName = ReadString();
var nodeChildren = ReadInt32();
var nodeActive = ReadBoolean();
var node = new Kn5Node {
NodeClass = nodeClass,
Name = nodeName,
Children = new List<Kn5Node>(nodeChildren),
Active = nodeActive
};
switch (node.NodeClass) {
case Kn5NodeClass.Base:
node.Transform = ReadMatrix();
break;
case Kn5NodeClass.Mesh:
node.CastShadows = ReadBoolean();
node.IsVisible = ReadBoolean();
node.IsTransparent = ReadBoolean();
node.Vertices = new Kn5Node.Vertice[ReadUInt32()];
for (var i = 0; i < node.Vertices.Length; i++) {
// 44 bytes per vertice
node.Vertices[i] = new Kn5Node.Vertice {
Co = ReadSingle3D(),
Normal = ReadSingle3D(),
Uv = ReadSingle2D(),
Tangent = ReadSingle3D()
};
}
node.Indices = new ushort[ReadUInt32()];
for (var i = 0; i < node.Indices.Length; i++) {
node.Indices[i] = ReadUInt16();
}
node.MaterialId = ReadUInt32();
node.Layer = ReadUInt32();
node.LodIn = ReadSingle();
node.LodOut = ReadSingle();
node.BoundingSphereCenter = ReadSingle3D();
node.BoundingSphereRadius = ReadSingle();
node.IsRenderable = ReadBoolean();
break;
case Kn5NodeClass.SkinnedMesh:
node.CastShadows = ReadBoolean();
node.IsVisible = ReadBoolean();
node.IsTransparent = ReadBoolean();
node.Bones = new Kn5Node.Bone[ReadUInt32()];
for (var i = 0; i < node.Bones.Length; i++) {
node.Bones[i] = new Kn5Node.Bone {
Name = ReadString(),
Transform = ReadMatrix()
};
}
node.Vertices = new Kn5Node.Vertice[ReadUInt32()];
node.VerticeWeights = new Kn5Node.VerticeWeight[node.Vertices.Length];
for (var i = 0; i < node.Vertices.Length; i++) {
// 76 bytes per vertice
node.Vertices[i] = new Kn5Node.Vertice {
Co = ReadSingle3D(),
Normal = ReadSingle3D(),
Uv = ReadSingle2D(),
Tangent = ReadSingle3D()
};
node.VerticeWeights[i] = new Kn5Node.VerticeWeight {
Weights = ReadSingle4D(),
Indices = ReadSingle4D()
};
}
node.Indices = new ushort[ReadUInt32()];
for (var i = 0; i < node.Indices.Length; i++) {
node.Indices[i] = ReadUInt16();
}
node.MaterialId = ReadUInt32();
node.Layer = ReadUInt32();
ReadBytes(8); // the only mistery left?
node.IsRenderable = true;
break;
}
return node;
}