using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HaloPlugins.Xbox
{
    public class phmo : TagDefinition
    {
        public phmo() : base("phmo", "physics_model", 272)
        {
            Fields.AddRange(new IMetaNode[] {
           new Value("flags (unused)", typeof(float)),
           new Value("mass", typeof(float)),
           new Value("low freq. desactivation scale", typeof(float)),
           new Value("high freq. desactivation scale", typeof(float)),
           new Value("Unused", typeof(float)),
           new Value("Unused", typeof(float)),
           new Value("Unused", typeof(float)),
           new Value("Unused", typeof(float)),
           new Value("Unused", typeof(float)),
           new Value("Unused", typeof(float)),
           new TagBlock("Phantom types (Lift)", 60, 16, new IMetaNode[] { 
               new Flags("Flags: type?", new string[] { "generates_effect", "use_acc_as_force", "negates_gravity", "ignores_players", "Oignores_nonplayers", "ignores_bipeds", "ignores_vehicles", "ignores_weapons", "ignores_equipement", "ignores_garbage", "ignores_projectiles", "ignores_scenery", "ignores_machines", "ignores_controls", "ignores_light_fixtures", "ignores_sound_scenery", "ignores_crates", "ignores_creatures", "localizes_physics", "disable_linear_damping", "disable_angular_damping", "ignores_dead_bipeds" }, 32),
               new HaloPlugins.Enum("minimum size", new string[] { "default", "tiny", "small", "medium", "large", "huge", "extra_huge" }, 16),
               new HaloPlugins.Enum("maximum size", new string[] { "default", "tiny", "small", "medium", "large", "huge", "extra_huge" }, 16),
               new StringId("Marker name"),
               new StringId("alignment marker name"),
               new Value("hookes law e", typeof(float)),
               new Value("linear radius", typeof(float)),
               new Value("center acc", typeof(float)),
               new Value("center max vel", typeof(float)),
               new Value("axis acc", typeof(float)),
               new Value("axis max vel", typeof(float)),
               new Value("direction acc", typeof(float)),
               new Value("direction max vel", typeof(float)),
               new Value("alignement hookes law e", typeof(float)),
               new Value("alignement acc", typeof(float)),
               new Value("alignement max vel", typeof(float)),
           }),
           new TagBlock("Node Edges", 24, 4096, new IMetaNode[] { 
               new Value("Node A Index", typeof(short)),
               new Value("Node B Index", typeof(short)),
               new Value("Node A Index", typeof(short)),
               new Value("Node B Index", typeof(short)),
               new TagBlock("Constriants", 12, 64, new IMetaNode[] { 
                   new HaloPlugins.Enum("Type", new string[] {  }, 16),
                   new HaloPlugins.Enum("Index", new string[] { "None" }, 16),
                   new Flags("Flags", new string[] { "Is_Rigid", "Disable_Effects" }, 32),
                   new Value("Friction", typeof(float)),
               }),
               new StringId("Node A Material"),
               new StringId("Node B Material"),
           }),
           new TagBlock("Rigid Bodies", 144, 64, 16, new IMetaNode[] { // offset 56
               new Value("Node Index", typeof(short)),
               new Value("Region Index", typeof(short)),
               new HaloPlugins.Enum("Permutation", new string[] { "None" }, 16),
               new Value("unused", typeof(short)),
               new Value("Bounding Sphere Offset X", typeof(float)),
               new Value("Bounding Sphere Offset Y", typeof(float)),
               new Value("Bounding Sphere Offset Z", typeof(float)),
               new Value("Bounding Sphere Radius", typeof(float)),
               new Flags("Flags", new string[] { "No_Collisions_w/_Self", "Only_Collide_w/_environment", "Disable_Effects", "Does_not_Interact_w/_Environment", "Best_Early_Mover_Body", "Has_no_Phantom_Power_Version" }, 16),
               new HaloPlugins.Enum("Motion Type", new string[] {  }, 16),
               new Value("unused", typeof(short)),
               new Value("No Phantom Power Alt Index", typeof(short)),
               new Value("size?", typeof(float)),
               new HaloPlugins.Enum("minimum size", new string[] { "default", "tiny", "small", "medium", "large", "huge", "extra_huge" }, 32),
               new Value("size", typeof(float)),
               new Value("Unknown", typeof(float)),
               new Value("Unused", typeof(float)),
               new Value("Unknown", typeof(float)),
               new Value("Inertia Tensor Scale", typeof(float)),
               new Value("Linear Damping", typeof(float)),
               new Value("Angular Damping", typeof(float)),
               new Value("Center of Mass Offset (I)", typeof(float)),
               new Value("Center of Mass Offset (J)", typeof(float)),
               new Value("Center of Mass Offset (K)", typeof(float)),
               new Value("shape type enum", typeof(byte)),
               new Value("shape type enum", typeof(byte)),
               new Value("unused", typeof(short)),
               new Value("shape enum", typeof(byte)),
               new Value("shape type enum", typeof(byte)),
               new Value("unused", typeof(short)),
               new Value("Mass kg", typeof(float)),
               new Value("Center of Mass (I)", typeof(float)),
               new Value("Center of Mass (J)", typeof(float)),
               new Value("Center of Mass (K)", typeof(float)),
               new Value("Intertia Tensor X (I)", typeof(float)),
               new Value("Intertia Tensor X (J)", typeof(float)),
               new Value("Intertia Tensor X (K)", typeof(float)),
               new Value("Intertia Tensor Y (I)", typeof(float)),
               new Value("Intertia Tensor Y (J)", typeof(float)),
               new Value("Intertia Tensor Y (K)", typeof(float)),
               new Value("Intertia Tensor Z (I)", typeof(float)),
               new Value("Intertia Tensor Z (J)", typeof(float)),
               new Value("Intertia Tensor Z (K)", typeof(float)),
               new Value("Bounding Sphere Pad", typeof(float)),
           }),
           new TagBlock("Materials", 12, 64, new IMetaNode[] { 
               new StringId("name"),
               new StringId("global material name"),
               new Value("phantom type(enum)", typeof(short)),
               new Flags("Flags", new string[] { "does_not_collide_with_fixed_bodies" }, 16),
           }),
           new TagBlock("Spheres (shape)", 128, 1024, 16, new IMetaNode[] { 
               new StringId("name"),
               new Value("material", typeof(short)),
               new Value("flags (unused)", typeof(short)),
               new Value("relative mass scale", typeof(float)),
               new Value("Friction", typeof(float)),
               new Value("restitution", typeof(float)),
               new Value("volume", typeof(float)),
               new Value("mass", typeof(float)),
               new Value("phantom (enum)", typeof(float)),
               new Value("size", typeof(float)),
               new Value("count", typeof(float)),
               new Value("radius", typeof(float)),
               new Value("size", typeof(float)),
               new Value("count", typeof(float)),
               new Value("radius", typeof(float)),
               new Value("size", typeof(float)),
               new Value("count", typeof(float)),
               new Value("rotation i (i)", typeof(float)),
               new Value("rotation i (j)", typeof(float)),
               new Value("rotation i (k)", typeof(float)),
               new Value("Unused", typeof(float)),
               new Value("rotation j (i)", typeof(float)),
               new Value("rotation j (j)", typeof(float)),
               new Value("rotation j (k)", typeof(float)),
               new Value("Unused", typeof(float)),
               new Value("rotation k (i)", typeof(float)),
               new Value("rotation k (j)", typeof(float)),
               new Value("rotation k (k)", typeof(float)),
               new Value("Unused", typeof(float)),
               new Value("translation i", typeof(float)),
               new Value("translation j", typeof(float)),
               new Value("translation k", typeof(float)),
               new Value("Unused", typeof(float)),
           }),
           new TagBlock("Multi Spheres (shape)", 140, 1024, new IMetaNode[] { 
               new StringId("name"),
               new Value("material", typeof(short)),
               new Value("flags (unused)", typeof(short)),
               new Value("relative mass scale", typeof(float)),
               new Value("Friction", typeof(float)),
               new Value("restitution", typeof(float)),
               new Value("volume", typeof(float)),
               new Value("mass", typeof(float)),
               new Value("phantom (enum)", typeof(float)),
               new Value("size", typeof(float)),
               new Value("num spheres", typeof(float)),
               new Value("sphere i", typeof(float)),
               new Value("sphere j", typeof(float)),
               new Value("sphere k", typeof(float)),
               new Value("sphere i", typeof(float)),
               new Value("sphere j", typeof(float)),
               new Value("sphere k", typeof(float)),
               new Value("sphere i", typeof(float)),
               new Value("sphere j", typeof(float)),
               new Value("sphere k", typeof(float)),
               new Value("sphere i", typeof(float)),
               new Value("sphere j", typeof(float)),
               new Value("sphere k", typeof(float)),
               new Value("sphere i", typeof(float)),
               new Value("sphere j", typeof(float)),
               new Value("sphere k", typeof(float)),
               new Value("sphere i", typeof(float)),
               new Value("sphere j", typeof(float)),
               new Value("sphere k", typeof(float)),
               new Value("sphere i", typeof(float)),
               new Value("sphere j", typeof(float)),
               new Value("sphere k", typeof(float)),
               new Value("sphere i", typeof(float)),
               new Value("sphere j", typeof(float)),
               new Value("sphere k", typeof(float)),
               new Padding(4),
           }),
           new TagBlock("Pills (shape)", 80, 1024, 16, new IMetaNode[] { 
               new StringId("Name"),
               new Flags("Flags(unused)", new string[] {  }, 32),
               new Value("relative mass scale", typeof(float)),
               new Value("friction", typeof(float)),
               new Value("restitution", typeof(float)),
               new Value("volume", typeof(float)),
               new Value("Mass", typeof(float)),
               new Value("phantom enum", typeof(float)),
               new Value("size", typeof(float)),
               new Value("count", typeof(float)),
               new Value("radius", typeof(float)),
               new Value("Unknown", typeof(float)),
               new Value("bottom i", typeof(float)),
               new Value("bottom j", typeof(float)),
               new Value("bottom k", typeof(float)),
               new Value("unknown", typeof(float)),
               new Value("top i", typeof(float)),
               new Value("top j", typeof(float)),
               new Value("top k", typeof(float)),
               new Value("unknown", typeof(float)),
           }),
           new TagBlock("Boxes (shape)", 144, 1024, 16, new IMetaNode[] { 
               new StringId("name"),
               new StringId("material"),
               new Value("relative mass scale", typeof(float)),
               new Value("friction", typeof(float)),
               new Value("restitution", typeof(float)),
               new Value("volume", typeof(float)),
               new Value("Mass", typeof(float)),
               new Value("phantom enum", typeof(float)),
               new Value("size", typeof(short)),
               new Value("count", typeof(short)),
               new Value("phantom", typeof(float)),
               new Value("size", typeof(short)),
               new Value("count", typeof(short)),
               new Value("radius", typeof(float)),
               new Value("half extens i", typeof(float)),
               new Value("half extens j scale", typeof(float)),
               new Value("half extens k scale", typeof(float)),
               new Value("size", typeof(float)),
               new Value("count", typeof(float)),
               new Value("unused", typeof(float)),
               new Value("unused", typeof(float)),
               new Value("unused", typeof(float)),
               new Value("rotation i (i)", typeof(float)),
               new Value("rotation i (j)", typeof(float)),
               new Value("rotation i (k)", typeof(float)),
               new Value("unused", typeof(float)),
               new Value("rotation j (i)", typeof(float)),
               new Value("rotation j (j)", typeof(float)),
               new Value("rotation j (k)", typeof(float)),
               new Value("unused", typeof(float)),
               new Value("rotation k (i)", typeof(float)),
               new Value("rotation k (j)", typeof(float)),
               new Value("rotation k (k)", typeof(float)),
               new Value("Unknown", typeof(float)),
               new Value("translation i", typeof(float)),
               new Value("translation j", typeof(float)),
               new Value("translation k", typeof(float)),
               new Value("Unused", typeof(float)),
           }),
           new TagBlock("Triangles (shape)", 76, 1024, 16, new IMetaNode[] { //74
               new StringId("name"),
               new StringId("material"),
               new Value("relative mass scale", typeof(float)),
               new Value("friction", typeof(float)),
               new Value("restitution", typeof(float)),
               new Value("volume", typeof(float)),
               new Value("Mass", typeof(float)),
               new Value("phantom enum", typeof(float)),
               new Value("size", typeof(short)),
               new Value("count", typeof(short)),
               new Value("radius", typeof(float)),
               new Value("point a i", typeof(float)),
               new Value("point a j", typeof(float)),
               new Value("point a k", typeof(float)),
               new Value("point b i", typeof(float)),
               new Value("point b j", typeof(float)),
               new Value("point b k", typeof(float)),
               new Value("point c i", typeof(float)),
               new Value("point c j", typeof(float)),
               new Value("point c k", typeof(float)),
           }),
           new TagBlock("Polyhedra or Phmo parts", 256, 1024, 16, new IMetaNode[] { 
               new StringId("name"),
               new Value("material (enum)", typeof(int)),
               new Value("flags (unused)", typeof(float)),
               new Value("Friction", typeof(float)),
               new Value("restitution", typeof(float)),
               new Value("volume", typeof(float)),
               new Value("mass", typeof(float)),
               new Value("phantom ", typeof(float)),
               new Value("size", typeof(float)),
               new Value("count", typeof(float)),
               new Value("radius", typeof(float)),
               new Value("aabb half entents i", typeof(float)),
               new Value("aabb half entents j", typeof(float)),
               new Value("aabb half entents k", typeof(float)),
               new Value("aabb center i", typeof(float)),
               new Value("aabb center j", typeof(float)),
               new Value("aabb center k", typeof(float)),
               new Value("four vectors size", typeof(float)),
               new Value("four vectors capacity", typeof(float)),
               new Value("num vertices", typeof(float)),
               new Value("Unknown", typeof(float)),
               new HaloPlugins.Enum("Phmo part proprieties", new string[] { "Unknown", "Unknown", "unknown", "Unknown", "Unknown", "Static(Unmovable)" }, 16),
               new Value("4", typeof(short)),
               new Value("num vertrices count", typeof(short)),
               new Value("6", typeof(byte)),
               new Value("7", typeof(byte)),
               new Value("Unused", typeof(float)),
               new Value("four vectors x (i)", typeof(float)),
               new Value("four vectors x (j)", typeof(float)),
               new Value("four vectors x (k)", typeof(float)),
               new Value("four vectors y (i)", typeof(float)),
               new Value("four vectors y (j)", typeof(float)),
               new Value("four vectors y (k)", typeof(float)),
               new Value("four vectors z (i)", typeof(float)),
               new Value("four vectors z (j)", typeof(float)),
               new Value("four vectors z (k)", typeof(float)),
               new Value("four vectors x (i)", typeof(float)),
               new Value("four vectors x (j)", typeof(float)),
               new Value("four vectors x (k)", typeof(float)),
               new Value("four vectors y (i)", typeof(float)),
               new Value("four vectors y (j)", typeof(float)),
               new Value("four vectors y (k)", typeof(float)),
               new Value("four vectors z (i)", typeof(float)),
               new Value("four vectors z (j)", typeof(float)),
               new Value("four vectors z (k)", typeof(float)),
               new Value("four vectors x (i)", typeof(float)),
               new Value("four vectors x (j)", typeof(float)),
               new Value("four vectors x (k)", typeof(float)),
               new Value("four vectors y (i)", typeof(float)),
               new Value("four vectors y (j)", typeof(float)),
               new Value("four vectors y (k)", typeof(float)),
               new Value("four vectors z (i)", typeof(float)),
               new Value("four vectors z (j)", typeof(float)),
               new Value("four vectors z (k)", typeof(float)),
               new Value("four vectors x (i)", typeof(float)),
               new Value("four vectors x (j)", typeof(float)),
               new Value("four vectors x (k)", typeof(float)),
               new Value("four vectors y (i)", typeof(float)),
               new Value("four vectors y (j)", typeof(float)),
               new Value("four vectors y (k)", typeof(float)),
               new Value("four vectors z (i)", typeof(float)),
               new Value("four vectors z (j)", typeof(float)),
               new Value("four vectors z (k)", typeof(float)),
               new Value("plane equation size", typeof(short)),
               new Value("2", typeof(short)),
               new Value("3", typeof(byte)),
               new Value("Something Count?", typeof(byte)),
               new Value("3", typeof(short)),
               new Value("Planes equation capacity", typeof(short)),
               new Value("6", typeof(short)),
               new Value("Planes count", typeof(short)),
               new Value("3", typeof(short)),
           }),
           new TagBlock("Polyhedron Four Vectors", 48, 4096, 16, new IMetaNode[] { 
               new Value("Length Vector i", typeof(float)),
               new Value("Length Vector j", typeof(float)),
               new Value("Length Vector k", typeof(float)),
               new Value("Length Vector w", typeof(float)),
               new Value("Width Vector i", typeof(float)),
               new Value("Width Vector j", typeof(float)),
               new Value("Width Vector k", typeof(float)),
               new Value("Width Vector w", typeof(float)),
               new Value("Height Vector i", typeof(float)),
               new Value("Height Vector j", typeof(float)),
               new Value("Height Vector k", typeof(float)),
               new Value("Height Vector w", typeof(float)),
           }),
           new TagBlock("Polyhedron Planes Equations", 16, 1024, 16, new IMetaNode[] { 
               new Value("X", typeof(float)),
               new Value("y", typeof(float)),
               new Value("z", typeof(float)),
               new Value("d", typeof(float)),
           }),
           new TagBlock("Mass Distributions", 48, 256, 16, new IMetaNode[] { 
               new Value("center of mass i", typeof(float)),
               new Value("center of mass j", typeof(float)),
               new Value("center of mass k", typeof(float)),
               new Value("inertia tensor i (i)", typeof(float)),
               new Value("inertia tensor i (j)", typeof(float)),
               new Value("inertia tensor i (k)", typeof(float)),
               new Value("inertia tensor j (i)", typeof(float)),
               new Value("inertia tensor j (j)", typeof(float)),
               new Value("inertia tensor j (k)", typeof(float)),
               new Value("inertia tensor k (i)", typeof(float)),
               new Value("inertia tensor k (j)", typeof(float)),
               new Value("inertia tensor k (k)", typeof(float)),
           }),
           new TagBlock("Lists", 48, 64, new IMetaNode[] { 
               new Value("size", typeof(float)),
               new Value("count", typeof(float)),
               new Value("child shapes size", typeof(float)),
               new Value("child shapes  capacity", typeof(float)),
               new Value("shape type", typeof(short)),
               new Value("shape", typeof(short)),
               new Value("collision filter", typeof(float)),
               new Value("shape type", typeof(short)),
               new Value("shape", typeof(short)),
               new Value("collision filter", typeof(float)),
               new Value("shape type", typeof(short)),
               new Value("shape", typeof(short)),
               new Value("collision filter", typeof(float)),
               new Value("shape type", typeof(short)),
               new Value("shape", typeof(short)),
               new Value("collision filter", typeof(float)),
           }),
           new TagBlock("List shapes", 8, 256, new IMetaNode[] { 
               new HaloPlugins.Enum("shape type", new string[] { "Box", "Polyhedron" }, 16),
               new Value("shape", typeof(short)),
               new Value("collision filter", typeof(float)),
           }),
           new TagBlock("MOPPS", 24, 64, new IMetaNode[] { 
               new Value("size", typeof(float)),
               new Value("count", typeof(float)),
               new Value("list (enum)", typeof(float)),
               new Value("code offset", typeof(float)),
               new Value("mopp codes bytes", typeof(float)),
               new Value("Unknown", typeof(float)),
           }),
           new TagBlock("MOPPS", 1, -1, 16, new IMetaNode[] { 
               new Value("mopp codes bytes", typeof(byte)),
           }),
           new TagBlock("Hinge Constraints", 120, 64, 16, new IMetaNode[] { 
               new StringId("name"),
               new Value("node a", typeof(float)),
               new Value("node b", typeof(float)),
               new Value("a scale", typeof(float)),
               new Value("a forward i", typeof(float)),
               new Value("a forward j", typeof(float)),
               new Value("a forward k", typeof(float)),
               new Value("a left i", typeof(float)),
               new Value("a left j", typeof(float)),
               new Value("a left k", typeof(float)),
               new Value("a up i", typeof(float)),
               new Value("a up j", typeof(float)),
               new Value("a up k", typeof(float)),
               new Value("a position x", typeof(float)),
               new Value("a position y", typeof(float)),
               new Value("a position z", typeof(float)),
               new Value("b scale", typeof(float)),
               new Value("b forward i", typeof(float)),
               new Value("b forward j", typeof(float)),
               new Value("b forward k", typeof(float)),
               new Value("b left i", typeof(float)),
               new Value("b left j", typeof(float)),
               new Value("b left k", typeof(float)),
               new Value("b up i", typeof(float)),
               new Value("b up j", typeof(float)),
               new Value("b up k", typeof(float)),
               new Value("b position x", typeof(float)),
               new Value("b position y", typeof(float)),
               new Value("b position z", typeof(float)),
               new Value("edge index", typeof(float)),
           }),
           new TagBlock("Ragdoll Constraints", 148, 64, 16, new IMetaNode[] { 
               new StringId("name"),
               new Value("node a", typeof(float)),
               new Value("node b", typeof(float)),
               new Value("a scale", typeof(float)),
               new Value("a forward i", typeof(float)),
               new Value("a forward j", typeof(float)),
               new Value("a forward k", typeof(float)),
               new Value("a left i", typeof(float)),
               new Value("a left j", typeof(float)),
               new Value("a left k", typeof(float)),
               new Value("a up i", typeof(float)),
               new Value("a up j", typeof(float)),
               new Value("a up k", typeof(float)),
               new Value("a position x", typeof(float)),
               new Value("a position y", typeof(float)),
               new Value("a position z", typeof(float)),
               new Value("b scale", typeof(float)),
               new Value("b forward i", typeof(float)),
               new Value("b forward j", typeof(float)),
               new Value("b forward k", typeof(float)),
               new Value("b left i", typeof(float)),
               new Value("b left j", typeof(float)),
               new Value("b left k", typeof(float)),
               new Value("b up i", typeof(float)),
               new Value("b up j", typeof(float)),
               new Value("b up k", typeof(float)),
               new Value("b position x", typeof(float)),
               new Value("b position y", typeof(float)),
               new Value("b position z", typeof(float)),
               new Value("edge index", typeof(float)),
               new Value("min twist", typeof(float)),
               new Value("max twist", typeof(float)),
               new Value("min cone", typeof(float)),
               new Value("max cone", typeof(float)),
               new Value("min plane", typeof(float)),
               new Value("max plane", typeof(float)),
               new Value("max friction torque", typeof(float)),
           }),
           new TagBlock("Regions", 12, 16, new IMetaNode[] { 
               new StringId("name"),
               new TagBlock("Permutations", 12, 32, 4, new IMetaNode[] { 
                   new StringId("name"),
                   new TagBlock("Rigid Bodies", 2, 64, 4, new IMetaNode[] { 
                       new Value("rigid body ", typeof(short)),
                   }),
               }),
           }),
           new TagBlock("Nodes", 12, 255, 4, new IMetaNode[] { 
               new StringId("name"),
               new Value("flag: does not animate", typeof(short)),
               new Value("parent", typeof(short)),
               new Value("Sibling", typeof(short)),
               new Value("child", typeof(short)),
           }),
           new Value("errors", typeof(int)),
           new Value("errors", typeof(int)),
           new Value("errors", typeof(int)),
           new Value("errors", typeof(int)),
           new Value("errors", typeof(int)),
           new Value("errors", typeof(int)),
           new TagBlock("Limited Hinge Constraints", 132, 64, 16, new IMetaNode[] { 
               new StringId("name"),
               new Value("node a", typeof(float)),
               new Value("node b", typeof(float)),
               new Value("a scale", typeof(float)),
               new Value("a forward i", typeof(float)),
               new Value("a forward j", typeof(float)),
               new Value("a forward k", typeof(float)),
               new Value("a left i", typeof(float)),
               new Value("a left j", typeof(float)),
               new Value("a left k", typeof(float)),
               new Value("a up i", typeof(float)),
               new Value("a up j", typeof(float)),
               new Value("a up k", typeof(float)),
               new Value("a position x", typeof(float)),
               new Value("a position y", typeof(float)),
               new Value("a position z", typeof(float)),
               new Value("b scale", typeof(float)),
               new Value("b forward i", typeof(float)),
               new Value("b forward j", typeof(float)),
               new Value("b forward k", typeof(float)),
               new Value("b left i", typeof(float)),
               new Value("b left j", typeof(float)),
               new Value("b left k", typeof(float)),
               new Value("b up i", typeof(float)),
               new Value("b up j", typeof(float)),
               new Value("b up k", typeof(float)),
               new Value("b position x", typeof(float)),
               new Value("b position y", typeof(float)),
               new Value("b position z", typeof(float)),
               new Value("edge index", typeof(float)),
               new Value("limit friction", typeof(float)),
               new Value("limit min angle", typeof(float)),
               new Value("limit max angle", typeof(float)),
           }),
           new TagBlock("Ball And Socket Constraints", 120, 64, 16, new IMetaNode[] { 
               new StringId("name"),
               new Value("node a", typeof(float)),
               new Value("node b", typeof(float)),
               new Value("a scale", typeof(float)),
               new Value("a forward i", typeof(float)),
               new Value("a forward j", typeof(float)),
               new Value("a forward k", typeof(float)),
               new Value("a left i", typeof(float)),
               new Value("a left j", typeof(float)),
               new Value("a left k", typeof(float)),
               new Value("a up i", typeof(float)),
               new Value("a up j", typeof(float)),
               new Value("a up k", typeof(float)),
               new Value("a position x", typeof(float)),
               new Value("a position y", typeof(float)),
               new Value("a position z", typeof(float)),
               new Value("b scale", typeof(float)),
               new Value("b forward i", typeof(float)),
               new Value("b forward j", typeof(float)),
               new Value("b forward k", typeof(float)),
               new Value("b left i", typeof(float)),
               new Value("b left j", typeof(float)),
               new Value("b left k", typeof(float)),
               new Value("b up i", typeof(float)),
               new Value("b up j", typeof(float)),
               new Value("b up k", typeof(float)),
               new Value("b position x", typeof(float)),
               new Value("b position y", typeof(float)),
               new Value("b position z", typeof(float)),
               new Value("edge index", typeof(float)),
           }),
           new TagBlock("Stiff Spring Constraints", 124, 64, 16, new IMetaNode[] { 
               new StringId("name"),
               new Value("node a", typeof(float)),
               new Value("node b", typeof(float)),
               new Value("a scale", typeof(float)),
               new Value("a forward i", typeof(float)),
               new Value("a forward j", typeof(float)),
               new Value("a forward k", typeof(float)),
               new Value("a left i", typeof(float)),
               new Value("a left j", typeof(float)),
               new Value("a left k", typeof(float)),
               new Value("a up i", typeof(float)),
               new Value("a up j", typeof(float)),
               new Value("a up k", typeof(float)),
               new Value("a position x", typeof(float)),
               new Value("a position y", typeof(float)),
               new Value("a position z", typeof(float)),
               new Value("b scale", typeof(float)),
               new Value("b forward i", typeof(float)),
               new Value("b forward j", typeof(float)),
               new Value("b forward k", typeof(float)),
               new Value("b left i", typeof(float)),
               new Value("b left j", typeof(float)),
               new Value("b left k", typeof(float)),
               new Value("b up i", typeof(float)),
               new Value("b up j", typeof(float)),
               new Value("b up k", typeof(float)),
               new Value("b position x", typeof(float)),
               new Value("b position y", typeof(float)),
               new Value("b position z", typeof(float)),
               new Value("edge index", typeof(float)),
               new Value("spring length", typeof(float)),
           }),
           new TagBlock("Prismatic Constraints", 132, 64, 16, new IMetaNode[] { 
               new StringId("name"),
               new Value("node a", typeof(float)),
               new Value("node b", typeof(float)),
               new Value("a scale", typeof(float)),
               new Value("a forward i", typeof(float)),
               new Value("a forward j", typeof(float)),
               new Value("a forward k", typeof(float)),
               new Value("a left i", typeof(float)),
               new Value("a left j", typeof(float)),
               new Value("a left k", typeof(float)),
               new Value("a up i", typeof(float)),
               new Value("a up j", typeof(float)),
               new Value("a up k", typeof(float)),
               new Value("a position x", typeof(float)),
               new Value("a position y", typeof(float)),
               new Value("a position z", typeof(float)),
               new Value("b scale", typeof(float)),
               new Value("b forward i", typeof(float)),
               new Value("b forward j", typeof(float)),
               new Value("b forward k", typeof(float)),
               new Value("b left i", typeof(float)),
               new Value("b left j", typeof(float)),
               new Value("b left k", typeof(float)),
               new Value("b up i", typeof(float)),
               new Value("b up j", typeof(float)),
               new Value("b up k", typeof(float)),
               new Value("b position x", typeof(float)),
               new Value("b position y", typeof(float)),
               new Value("b position z", typeof(float)),
               new Value("edge index", typeof(float)),
               new Value("min_limit", typeof(float)),
               new Value("max_limit", typeof(float)),
               new Value("max_friction_force", typeof(float)),
           }),
           new TagBlock("Phantoms", 32, 1024, new IMetaNode[] { 
               new Value("size", typeof(int)),
               new Value("count", typeof(int)),
               new Value("size", typeof(int)),
               new Value("count", typeof(int)),
               new Value("unknown", typeof(int)),
               new Value("unknown", typeof(int)),
               new Value("unknown", typeof(int)),
               new Value("count?", typeof(int)),
           }),
           });
        }
    }
}