private void ParseSkinSet(BinaryParser parser, AnimSkin skin) { var name = parser.ConsumeUInt32(); var numVerts = parser.ConsumeUInt32(); var numBones = parser.ConsumeByte(); parser.Expect(1); var boneIds = parser.ConsumeByteArray(numBones); var vertIds = parser.ConsumeUInt16Array((int)numVerts); var preMultipliedPositions = parser.ConsumeVector3Array((int)numVerts * numBones); var weights = parser.ConsumeFloatArray((int)numVerts * numBones); for (int index = 0; index < vertIds.Length; index++) { var id = vertIds[index]; skin.Weights.EnsureAt(id); var vertexWeights = new VertexWeights { }; if (numBones > 0) { vertexWeights.Bone0 = new VertexWeight { BoneIndex = boneIds[0], Weight = weights[0 + index * numBones] }; } if (numBones > 1) { vertexWeights.Bone1 = new VertexWeight { BoneIndex = boneIds[1], Weight = weights[1 + index * numBones] }; } if (numBones > 2) { vertexWeights.Bone2 = new VertexWeight { BoneIndex = boneIds[2], Weight = weights[2 + index * numBones] }; } if (numBones > 3) { vertexWeights.Bone3 = new VertexWeight { BoneIndex = boneIds[3], Weight = weights[3 + index * numBones] }; } skin.Weights[id] = vertexWeights; } }
private void ParseModelBlockCols(BinaryParser parser, Model model, uint name, uint size, uint numItems, ushort flags) { var streamMesh = (model.Meshes[0]); int num = (int)numItems; streamMesh.Colors.Clear(); streamMesh.Colors.Capacity = num; if (parser.ConsumeBool()) { for (int i = 0; i < num; ++i) { byte b = parser.ConsumeByte(); streamMesh.Colors.Add(Color.FromArgb(255, b, b, b)); } } else { var c = parser.ConsumeByteArray(num * 4); for (int i = 0; i < num; ++i) { streamMesh.Colors.Add(Color.FromArgb(c[i + num * 3], c[i + num * 0], c[i + num * 1], c[i + num * 2])); } } }
private Image ParseImage(BinaryParser parser) { var image = new Image(); image.Format = (ImageFormat)parser.ConsumeUInt8(); image.Flags = parser.ConsumeUInt16(); image.width = parser.ConsumeUInt16(); image.height = parser.ConsumeUInt16(); image.pitch = parser.ConsumeUInt16(); image.palette = parser.ConsumeUInt32(); byte[] d = new byte[image.height * image.pitch]; parser.ConsumeArray(d); image.data = d; switch (image.Format) { case ImageFormat.ABGR_8888: case ImageFormat.BGR_888: case ImageFormat.RGB_888: return image; //case Image.PALETTE4_ABGR_1555: // format = (new Palette4Abgr1555(image.width, image.height, image.pitch)); // Debug.WriteLine(string.Format("Image PALETTE4_ABGR_1555 {0}x{1}", image.width, image.height)); // break; //case Image.PALETTE4_RGB_888: // format = (new Palette4Rgb888(image.width, image.height, image.pitch)); // Debug.WriteLine(string.Format("Image PALETTE4_RGB_888 {0}x{1}", image.width, image.height)); // break; //case Image.PALETTE8_ABGR_1555: // format = (new Palette8Abgr1555(image.width, image.height, image.pitch)); // Debug.WriteLine(string.Format("Image PALETTE8_ABGR_1555 {0}x{1}", image.width, image.height)); // break; //case Image.ABGR_1555: // Debug.WriteLine(string.Format("Image ABGR_1555 {0}x{1}", image.width, image.height)); // LoadABGR1555(serialise); // return; //case Image.RGBA_6666: // Debug.WriteLine(string.Format("Image RGBA_6666 {0}x{1}", image.width, image.height)); // LoadRgba6666(serialise); // return; case ImageFormat.PALETTE8_RGB_888: image.PaletteData = parser.ConsumeByteArray(256 * 3); return image; case ImageFormat.PALETTE8_ABGR_8888: case ImageFormat.PALETTE8_ARGB_8888: case ImageFormat.PALETTE8_RGBA_8888: image.PaletteData = parser.ConsumeByteArray(256 * 4); return image; case ImageFormat.PALETTE4_RGB_888: image.PaletteData = parser.ConsumeByteArray(16 * 3); return image; case ImageFormat.PALETTE4_ABGR_8888: case ImageFormat.PALETTE4_ARGB_8888: case ImageFormat.PALETTE4_RGBA_8888: image.PaletteData = parser.ConsumeByteArray(16 * 4); return image; default: throw new FormatException(string.Format(CultureInfo.CurrentCulture, "Unknown image format 0x{0:x}", image.Format)); } }