private Rsm(IBinaryReader reader) { int count; Header = new RsmHeader(reader); AnimationLength = reader.Int32(); ShadeType = reader.Int32(); Alpha = 0xFF; if (Version >= 1.4) { Alpha = reader.Byte(); } if (Version >= 2.3) { FrameRatePerSecond = reader.Float(); count = reader.Int32(); for (int i = 0; i < count; i++) { MainMeshNames.Add(reader.String(reader.Int32(), '\0')); } count = reader.Int32(); } else if (Version >= 2.2) { FrameRatePerSecond = reader.Float(); int numberOfTextures = reader.Int32(); for (int i = 0; i < numberOfTextures; i++) { _textures.Add(reader.String(reader.Int32(), '\0')); } count = reader.Int32(); for (int i = 0; i < count; i++) { MainMeshNames.Add(reader.String(reader.Int32(), '\0')); } count = reader.Int32(); } else { Reserved = reader.Bytes(16); count = reader.Int32(); for (int i = 0; i < count; i++) { _textures.Add(reader.String(40, '\0')); } MainMeshNames.Add(reader.String(40, '\0')); count = reader.Int32(); } for (int i = 0; i < count; i++) { _meshes.Add(new Mesh(this, reader)); } // Resolve parent/child associations if (MainMeshNames.Count == 0) { MainMeshNames.Add(_meshes[0].Name); } MainMesh = _meshes.FirstOrDefault(m => m.Name == MainMeshNames[0]) ?? _meshes[0]; _setParents(); foreach (Mesh mesh in _meshes) { if (String.IsNullOrEmpty(mesh.ParentName)) { _parents.Add(mesh); } else { var meshParent = _meshes.FirstOrDefault(p => p.Name == mesh.ParentName); if (meshParent == null) { // no parent _parents.Add(mesh); } else { mesh.Parent = meshParent; } } } if (Version < 1.6) { count = reader.Int32(); for (int i = 0; i < count; i++) { _scaleKeyFrames.Add(new ScaleKeyFrame { Frame = reader.Int32(), Sx = reader.Float(), Sy = reader.Float(), Sz = reader.Float(), Data = reader.Float() }); } } count = reader.CanRead ? reader.Int32() : 0; if (Version >= 1.3) { for (int i = 0; i < count; i++) { VolumeBoxes.Add(new VolumeBox(reader)); } } else { for (int i = 0; i < count; i++) { VolumeBoxes.Add(new VolumeBox(reader, true)); } } _uniqueTextures(); Box = new BoundingBox(); }