public void read(FileData f) { base.read(f); f.skip(1); x = f.readFloat(); y = f.readFloat(); }
public override void Read(FileData f) { x1 = f.readFloat(); y1 = f.readFloat(); x2 = f.readFloat(); y2 = f.readFloat(); f.skip(0x6); }
public void read(FileData f) { base.read(f); f.skip(1); left = f.readFloat(); right = f.readFloat(); top = f.readFloat(); bottom = f.readFloat(); }
public void Read(FileData d) { hash = d.readInt(); unk1 = d.readInt(); int s = d.readByte(); name = d.readString(d.pos(), -1); d.skip(s); d.align(4); d.skip(8); offset = d.readInt(); size = d.readInt(); for (int i = 0; i < param.Length; i++) { param[i] = d.readFloat(); } offsets = new int[d.readInt()]; for (int i = 0; i < offsets.Length; i++) { offsets[i] = d.readInt(); } unkvalues = new float[d.readInt()]; for (int i = 0; i < unkvalues.Length; i++) { unkvalues[d.readInt()] = d.readFloat(); } List <int> une = new List <int>(); while (true) { int i = d.readInt(); une.Add(i); if (i == -1) { break; } } unkending = une.ToArray(); end = new int[3 + (int)Math.Ceiling((double)((unk1 >> 8) & 0xFF) / 4)]; for (int i = 0; i < end.Length; i++) { end[i] = d.readInt(); } //Console.WriteLine(id + " " + name + " " + offset.ToString("x")); }
public void read(FileData f) { base.read(f); flag1 = Convert.ToBoolean(f.readByte()); flag2 = Convert.ToBoolean(f.readByte()); flag3 = Convert.ToBoolean(f.readByte()); flag4 = Convert.ToBoolean(f.readByte()); f.skip(1); int vertCount = f.readInt(); for (int i = 0; i < vertCount; i++) { f.skip(1); Vector2D temp = new Vector2D(); temp.x = f.readFloat(); temp.y = f.readFloat(); verts.Add(temp); } f.skip(1); int normalCount = f.readInt(); for (int i = 0; i < normalCount; i++) { f.skip(1); Vector2D temp = new Vector2D(); temp.x = f.readFloat(); temp.y = f.readFloat(); normals.Add(temp); } f.skip(1); int cliffCount = f.readInt(); for (int i = 0; i < cliffCount; i++) { CollisionCliff temp = new CollisionCliff(); temp.read(f); cliffs.Add(temp); } f.skip(1); int materialCount = f.readInt(); for (int i = 0; i < materialCount; i++) { f.skip(1); CollisionMat temp = new CollisionMat(); temp.material = f.read(0xC);//Temporary, will work on fleshing out material more later materials.Add(temp); } }
public Entry Read(FileData f) { subaction = f.readUShort(); f.readUShort();//skip padding startFrame = f.readUShort(); lastFrame = f.readUShort(); xmin = f.readFloat(); xmax = f.readFloat(); ymin = f.readFloat(); ymax = f.readFloat(); return(this); }
public Vector2D angle; //Someone figure out what these angles do public void read(FileData f) { base.read(f); f.skip(1); pos = new Vector2D(); pos.x = f.readFloat(); pos.y = f.readFloat(); angle = new Vector2D(); angle.x = f.readFloat(); angle.y = f.readFloat(); }
public override void Read(string filename) { FileData file = new FileData(filename); if (file != null) { file.Endian = Endianness.Little; Endian = Endianness.Little; string magic = file.readString(0, 4); if (magic == "VBN ") { file.Endian = Endianness.Big; Endian = Endianness.Big; } file.seek(4); unk_1 = (short)file.readShort(); unk_2 = (short)file.readShort(); totalBoneCount = (UInt32)file.readInt(); boneCountPerType[0] = (UInt32)file.readInt(); boneCountPerType[1] = (UInt32)file.readInt(); boneCountPerType[2] = (UInt32)file.readInt(); boneCountPerType[3] = (UInt32)file.readInt(); for (int i = 0; i < totalBoneCount; i++) { Bone temp = new Bone(this); temp.boneName = file.readString(file.pos(), -1).ToCharArray(); file.skip(64); temp.boneType = (UInt32)file.readInt(); temp.parentIndex = file.readInt(); temp.boneId = (UInt32)file.readInt(); temp.position = new float[3]; temp.rotation = new float[3]; temp.scale = new float[3]; bones.Add(temp); } for (int i = 0; i < bones.Count; i++) { bones[i].position[0] = file.readFloat(); bones[i].position[1] = file.readFloat(); bones[i].position[2] = file.readFloat(); bones[i].rotation[0] = file.readFloat(); bones[i].rotation[1] = file.readFloat(); bones[i].rotation[2] = file.readFloat(); bones[i].scale[0] = file.readFloat(); bones[i].scale[1] = file.readFloat(); bones[i].scale[2] = file.readFloat(); Bone temp = bones[i]; //Debug.Write(temp.parentIndex); //if (temp.parentIndex != 0x0FFFFFFF && temp.parentIndex > -1) // bones[temp.parentIndex].children.Add(i); bones[i] = temp; } reset(); } }
public Entry Read(FileData f) { attackId = (ushort)f.readShort(); unk = (ushort)f.readShort(); start = (ushort)f.readShort(); end = (ushort)f.readShort(); xmin = f.readFloat(); xmax = f.readFloat(); ymin = f.readFloat(); ymax = f.readFloat(); return(this); }
public void read(FileData f) { base.read(f); f.skip(1); type = f.readInt(); //always 4? x = f.readFloat(); y = f.readFloat(); z = f.readFloat(); f.skip(0x10); }
public void read(FileData f) { f.skip(0x2); //x01 03 type = f.readInt(); //First set of sections = type 1, second set = type 3. No difference in structure but type 3 seems to have non-zero for z and unk x = f.readFloat(); y = f.readFloat(); z = f.readFloat(); //0 unless type 3 unk = f.readFloat(); //0 unless type 3 f.skip(0x2); //x01 01 f.readInt(); //Only seen this as 0, probably a count }
public override void Read(FileData f) { f.skip(0x12); int pointCount = f.readInt(); for (int i = 0; i < pointCount; i++) { f.skip(1);//seperator char points.Add(new Vector2D() { x = f.readFloat(), y = f.readFloat() }); } }
public override void Read(string filename) { FileData buf = new FileData(filename); buf.Endian = Endianness.Little; buf.seek(0x06); short numAtlases = buf.readShort(); short numTextures = buf.readShort(); short flagsOffset = buf.readShort(); short entriesOffset = buf.readShort(); short stringsOffset = buf.readShort(); buf.seek(flagsOffset); for (int i = 0; i < numAtlases; i++) { atlases.Add((AtlasFlag)buf.readInt()); } buf.seek(entriesOffset); for (int i = 0; i < numTextures; i++) { Texture entry = new Texture(); int nameOffset = buf.readInt(); int nameOffset2 = buf.readInt(); // I have yet to see this. if (nameOffset != nameOffset2) { throw new NotImplementedException("texlist name offsets don't match?"); } buf.seek(stringsOffset + nameOffset); entry.name = buf.readString(); entry.topLeft = new Vector2(buf.readFloat(), buf.readFloat()); entry.botRight = new Vector2(buf.readFloat(), buf.readFloat()); entry.width = buf.readShort(); entry.height = buf.readShort(); entry.atlasId = buf.readShort(); textures.Add(entry); buf.skip(0x02); // Padding. } }
public static double readVal(FileData d, int valueFormat) { int scale = (int)Math.Pow(2, valueFormat & 0x1F); d.Endian = System.IO.Endianness.Little; switch (valueFormat & 0xF0) { case 0x00: return(d.readFloat()); case 0x20: return(unchecked ((short)d.readShort()) / (double)scale); case 0x40: return(d.readShort() / (double)scale); case 0x60: return(unchecked ((sbyte)d.readByte()) / (double)scale); case 0x80: return(d.readByte() / (double)scale); default: return(0); } }
public void read(FileData f) { int nameOff = f.readInt(); unknown = f.readInt(); valueCount = f.readInt(); int frameCount = f.readInt(); unknown2 = f.readShort(); unknown3 = f.readShort(); int dataOff = f.readInt(); f.seek(nameOff); name = f.readString(); f.seek(dataOff); for (int i = 0; i < frameCount; i++) { frame temp = new frame(); //temp.size = valueCount; temp.values = new float[valueCount]; for (int j = 0; j < valueCount; j++) { temp.values[j] = f.readFloat(); } frames.Add(temp); } }
public void Read(FileData f) { type = f.readInt(); format = f.readInt(); scale = f.readFloat(); Text = ((_3DSGPU.VertexAttribute)type).ToString() + "_" + format; }
public void Read(FileData f) { unk0 = (uint)f.readInt(); unk1 = (uint)f.readInt(); unk2 = (uint)f.readInt(); maxCharacterId = (uint)f.readInt(); unk4 = f.readInt(); maxCharacterId2 = (uint)f.readInt(); maxDepth = (ushort)f.readShort(); unk7 = (ushort)f.readShort(); framerate = f.readFloat(); width = f.readFloat(); height = f.readFloat(); unk8 = (uint)f.readInt(); unk9 = (uint)f.readInt(); }
public void read(FileData f) { f.skip(1); f.skip(0x16);// unknown data f.skip(1); points = new List <Vector2D>(); int vertCount = f.readInt(); for (int j = 0; j < vertCount; j++) { f.skip(1); Vector2D point = new Vector2D(); point.x = f.readFloat(); point.y = f.readFloat(); points.Add(point); } }
public void read(FileData f) { base.read(f); f.readByte(); type = f.readInt(); //3 = rect, 4 = path if ((type != 3) && (type != 4)) { throw new NotImplementedException($"Unknown general shape type {type} at offset {f.pos()-4}"); } x1 = f.readFloat(); y1 = f.readFloat(); x2 = f.readFloat(); y2 = f.readFloat(); f.skip(1); f.skip(1); int pointCount = f.readInt(); for (int i = 0; i < pointCount; i++) { f.skip(1); points.Add(new Vector2D() { x = f.readFloat(), y = f.readFloat() }); } }
public void read(FileData f) { f.skip(0xC); f.skip(1); name = f.readString(f.pos(), 0x38); f.skip(0x38); f.skip(1); subname = f.readString(f.pos(), 0x40); f.skip(0x40); f.skip(1); for (int i = 0; i < 3; i++) { startPos[i] = f.readFloat(); } useStartPos = Convert.ToBoolean(f.readByte()); f.skip(1); unk1 = f.readInt(); //Some kind of count? Only seen it as 0 so I don't know what it's for //Not sure what this is for, but it seems like an x,y,z followed by a hash f.skip(1); for (int i = 0; i < 3; i++) { unk2[i] = f.readFloat(); } unk3 = f.readInt(); f.skip(1); boneName = new char[0x40]; for (int i = 0; i < 0x40; i++) { boneName[i] = (char)f.readByte(); } }
public void Read(FileData d) { hash = d.readInt(); unk1 = d.readInt(); int s = d.readByte(); name = d.readString(d.pos(), s - 1); d.skip(s); d.align(4); data = new float[0x2c]; for (int i = 0; i < 0x2c; i++) { data[i] = d.readFloat(); } }
public void ReadDescription(FileData d) { int count = d.readInt(); type = new int[count]; format = new int[count]; scale = new float[count]; for (int i = 0; i < count; i++) { type[i] = d.readInt(); format[i] = d.readInt(); scale[i] = d.readFloat(); } length = d.readInt(); }
private static float readType(FileData d, int format, float scale) { switch (format) { case 0: return(d.readFloat() * scale); case 1: return(d.readByte() * scale); case 2: return(d.readSByte() * scale); case 3: return(d.readShort() * scale); } return(0); }
private float ReadType(FileData d) { switch (format) { case 0: return(d.readFloat() * scale); case 1: return(d.readByte() * scale); case 2: return((sbyte)d.readByte() * scale); case 3: return((short)d.readShort() * scale); } return(0); }
public override void Read(string filename) { FileData f = new FileData(filename); f.Endian = Endianness.Big; f.seek(4); if (f.readUInt() != Magic) { return; } f.seek(0); uint bom = f.readUInt(); if (bom == 0xFFFE0000) { Endian = Endianness.Little; } else if (bom == 0x0000FEFF) { Endian = Endianness.Big; } else { return; } f.Endian = Endian; f.seek(8); f.readInt(); // Always 0 int frameCount = f.readInt(); for (int i = 0; i < frameCount; i++) { pathFrame temp; temp.qx = f.readFloat(); temp.qy = f.readFloat(); temp.qz = f.readFloat(); temp.qw = f.readFloat(); temp.x = f.readFloat(); temp.y = f.readFloat(); temp.z = f.readFloat(); Frames.Add(temp); } }
public void Read(FileData f) { CharacterId = f.readInt(); unk1 = f.readInt(); placeholderTextId = f.readInt(); unk2 = f.readInt(); strokeColorId = f.readInt(); unk3 = f.readInt(); unk4 = f.readInt(); unk5 = f.readInt(); alignment = (TextAlignment)f.readShort(); unk6 = f.readShort(); unk7 = f.readInt(); unk8 = f.readInt(); size = f.readFloat(); unk9 = f.readInt(); unk10 = f.readInt(); unk11 = f.readInt(); unk12 = f.readInt(); }
public override void Read(string filename) { FileData f = new FileData(filename); byte[] magic = f.read(0xC);; int frameCount = f.readInt(); for (int i = 0; i < frameCount; i++) { pathFrame temp; temp.qx = f.readFloat(); temp.qy = f.readFloat(); temp.qz = f.readFloat(); temp.qw = f.readFloat(); temp.x = f.readFloat(); temp.y = f.readFloat(); temp.z = f.readFloat(); Frames.Add(temp); } }
public override void Read(string filename) { bchHeader header = new bchHeader(); FileData f = new FileData(filename); f.Endian = System.IO.Endianness.Little; f.skip(4); header.backwardCompatibility = f.readByte(); header.forwardCompatibility = f.readByte(); header.version = f.readUShort(); header.mainHeaderOffset = f.readInt(); header.stringTableOffset = f.readInt(); header.gpuCommandsOffset = f.readInt(); header.dataOffset = f.readInt(); if (header.backwardCompatibility > 0x20) { header.dataExtendedOffset = f.readInt(); } header.relocationTableOffset = f.readInt(); header.mainHeaderLength = f.readInt(); header.stringTableLength = f.readInt(); header.gpuCommandsLength = f.readInt(); header.dataLength = f.readInt(); if (header.backwardCompatibility > 0x20) { header.dataExtendedLength = f.readInt(); } header.relocationTableLength = f.readInt(); header.uninitializedDataSectionLength = f.readInt(); header.uninitializedDescriptionSectionLength = f.readInt(); if (header.backwardCompatibility > 7) { header.flags = f.readUShort(); header.addressCount = f.readUShort(); } // Relocation table for (int i = 0; i < header.relocationTableLength; i += 4) { f.seek(header.relocationTableOffset + i); int val = f.readInt(); int off = val & 0x1FFFFFF; byte flag = (byte)(val >> 25); switch (flag) { case 0: f.seek((off * 4) + header.mainHeaderOffset); f.writeInt((off * 4) + header.mainHeaderOffset, f.readInt() + header.mainHeaderOffset); break; case 1: f.seek(off + header.mainHeaderOffset); f.writeInt((off) + header.mainHeaderOffset, f.readInt() + header.stringTableOffset); break; case 2: f.seek((off * 4) + header.mainHeaderOffset); f.writeInt((off * 4) + header.mainHeaderOffset, f.readInt() + header.gpuCommandsOffset); break; case 0xc: f.seek((off * 4) + header.mainHeaderOffset); f.writeInt((off * 4) + header.mainHeaderOffset, f.readInt() + header.dataOffset); break; } f.seek((off * 4) + header.gpuCommandsOffset); if (header.backwardCompatibility < 6) { switch (flag) { case 0x23: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break; //Texture case 0x25: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break; //Vertex //case 0x26: f.writeInt((off * 4) + header.gpuCommandsOffset, ((f.readInt() + header.dataOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode case 0x27: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataOffset) & 0x7fffffff); break; //Index 8 bits mode } } else if (header.backwardCompatibility < 8) { switch (flag) { case 0x24: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break; //Texture case 0x26: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break; //Vertex //case 0x27: writer.Write(((peek(input) + header.dataOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode case 0x28: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataOffset) & 0x7fffffff); break; //Index 8 bits mode } } else if (header.backwardCompatibility < 0x21) { switch (flag) { case 0x25: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break; //Texture case 0x27: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break; //Vertex //case 0x28: writer.Write(((peek(input) + header.dataOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode case 0x29: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataOffset) & 0x7fffffff); break; //Index 8 bits mode } } else { switch (flag) { case 0x25: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break; //Texture case 0x26: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataOffset); break; //Vertex relative to Data Offset //case 0x27: writer.Write(((peek(input) + header.dataOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode relative to Data Offset case 0x28: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataOffset) & 0x7fffffff); break; //Index 8 bits mode relative to Data Offset case 0x2b: f.writeInt((off * 4) + header.gpuCommandsOffset, f.readInt() + header.dataExtendedOffset); break; //Vertex relative to Data Extended Offset //case 0x2c: writer.Write(((peek(input) + header.dataExtendedOffset) & 0x7fffffff) | 0x80000000); break; //Index 16 bits mode relative to Data Extended Offset case 0x2d: f.writeInt((off * 4) + header.gpuCommandsOffset, (f.readInt() + header.dataExtendedOffset) & 0x7fffffff); break; //Index 8 bits mode relative to Data Extended Offset } } } // Content Header f.seek(header.mainHeaderOffset); bchContentHeader content = new bchContentHeader(); { content.modelsPointerTableOffset = f.readInt(); content.modelsPointerTableEntries = f.readInt(); content.modelsNameOffset = f.readInt(); content.materialsPointerTableOffset = f.readInt(); content.materialsPointerTableEntries = f.readInt(); content.materialsNameOffset = f.readInt(); content.shadersPointerTableOffset = f.readInt(); content.shadersPointerTableEntries = f.readInt(); content.shadersNameOffset = f.readInt(); content.texturesPointerTableOffset = f.readInt(); content.texturesPointerTableEntries = f.readInt(); content.texturesNameOffset = f.readInt(); content.materialsLUTPointerTableOffset = f.readInt(); content.materialsLUTPointerTableEntries = f.readInt(); content.materialsLUTNameOffset = f.readInt(); content.lightsPointerTableOffset = f.readInt(); content.lightsPointerTableEntries = f.readInt(); content.lightsNameOffset = f.readInt(); content.camerasPointerTableOffset = f.readInt(); content.camerasPointerTableEntries = f.readInt(); content.camerasNameOffset = f.readInt(); content.fogsPointerTableOffset = f.readInt(); content.fogsPointerTableEntries = f.readInt(); content.fogsNameOffset = f.readInt(); content.skeletalAnimationsPointerTableOffset = f.readInt(); content.skeletalAnimationsPointerTableEntries = f.readInt(); content.skeletalAnimationsNameOffset = f.readInt(); content.materialAnimationsPointerTableOffset = f.readInt(); content.materialAnimationsPointerTableEntries = f.readInt(); content.materialAnimationsNameOffset = f.readInt(); content.visibilityAnimationsPointerTableOffset = f.readInt(); content.visibilityAnimationsPointerTableEntries = f.readInt(); content.visibilityAnimationsNameOffset = f.readInt(); content.lightAnimationsPointerTableOffset = f.readInt(); content.lightAnimationsPointerTableEntries = f.readInt(); content.lightAnimationsNameOffset = f.readInt(); content.cameraAnimationsPointerTableOffset = f.readInt(); content.cameraAnimationsPointerTableEntries = f.readInt(); content.cameraAnimationsNameOffset = f.readInt(); content.fogAnimationsPointerTableOffset = f.readInt(); content.fogAnimationsPointerTableEntries = f.readInt(); content.fogAnimationsNameOffset = f.readInt(); content.scenePointerTableOffset = f.readInt(); content.scenePointerTableEntries = f.readInt(); content.sceneNameOffset = f.readInt(); } //Skeletal animation for (int index1 = 0; index1 < content.skeletalAnimationsPointerTableEntries; index1++) { f.seek(content.skeletalAnimationsPointerTableOffset + (index1 * 4)); int dataOffset = f.readInt(); f.seek(dataOffset); string skeletalAnimationName = f.readString(f.readInt(), -1); int animationFlags = f.readInt(); //int skeletalAnimationloopMode = f.readByte(); //pas ça du tout float skeletalAnimationframeSize = f.readFloat(); int boneTableOffset = f.readInt(); int boneTableEntries = f.readInt(); int metaDataPointerOffset = f.readInt(); //Debug.WriteLine("Animation Name: " + skeletalAnimationName); //Debug.WriteLine("BonetableOffset: " + boneTableOffset.ToString("X")); //Debug.WriteLine("BonetableEntry: " + boneTableEntries.ToString("X")); for (int i = 0; i < boneTableEntries; i++) { f.seek(boneTableOffset + (i * 4)); int offset = f.readInt(); OSkeletalAnimationBone bone = new OSkeletalAnimationBone(); f.seek(offset); bone.name = f.readString(f.readInt(), -1); Console.WriteLine("Bone Name: " + bone.name); int animationTypeFlags = f.readInt(); int flags = f.readInt(); OSegmentType segmentType = (OSegmentType)((animationTypeFlags >> 16) & 0xf); switch (segmentType) { case OSegmentType.transform: f.seek(offset + 0x18); int notExistMask = 0x80000; int constantMask = 0x200; for (int j = 0; j < 2; j++) { for (int axis = 0; axis < 3; axis++) { bool notExist = (flags & notExistMask) > 0; bool constant = (flags & constantMask) > 0; OAnimationKeyFrameGroup frame = new OAnimationKeyFrameGroup(); frame.exists = !notExist; if (frame.exists) { if (constant) { frame.interpolation = OInterpolationMode.linear; frame.keyFrames.Add(new OAnimationKeyFrame(f.readFloat(), 0)); } else { int frameOffset = f.readInt(); int position = f.pos(); f.seek(frameOffset); //getAnimationKeyFrame(input, frame); f.seek(position); } } else { f.seek(f.pos() + 0x04); } if (j == 0) { switch (axis) { case 0: bone.rotationX = frame; break; case 1: bone.rotationY = frame; break; case 2: bone.rotationZ = frame; break; } } else { switch (axis) { case 0: bone.translationX = frame; break; case 1: bone.translationY = frame; break; case 2: bone.translationZ = frame; break; } } notExistMask <<= 1; constantMask <<= 1; } constantMask <<= 1; } break; case OSegmentType.transformQuaternion: bone.isFrameFormat = true; int scaleOffset = f.readInt(); int rotationOffset = f.readInt(); int translationOffset = f.readInt(); if ((flags & 0x20) == 0) { bone.scale.exists = true; f.seek(scaleOffset); if ((flags & 4) > 0) { bone.scale.vector.Add(new Vector4( f.readFloat(), f.readFloat(), f.readFloat(), 0)); } else { bone.scale.startFrame = f.readFloat(); bone.scale.endFrame = f.readFloat(); int scaleFlags = f.readInt(); int scaleDataOffset = f.readInt(); int scaleEntries = f.readInt(); f.seek(scaleDataOffset); for (int j = 0; j < scaleEntries; j++) { bone.scale.vector.Add(new Vector4( f.readFloat(), f.readFloat(), f.readFloat(), 0)); } } } if ((flags & 0x10) == 0) { bone.rotationQuaternion.exists = true; f.seek(rotationOffset); if ((flags & 2) > 0) { bone.rotationQuaternion.vector.Add(new Vector4( f.readFloat(), f.readFloat(), f.readFloat(), f.readFloat())); } else { bone.rotationQuaternion.startFrame = f.readFloat(); bone.rotationQuaternion.endFrame = f.readFloat(); int rotationFlags = f.readInt(); int rotationDataOffset = f.readInt(); int rotationEntries = f.readInt(); f.seek(rotationDataOffset); for (int j = 0; j < rotationEntries; j++) { bone.rotationQuaternion.vector.Add(new Vector4( f.readFloat(), f.readFloat(), f.readFloat(), f.readFloat())); } } } if ((flags & 8) == 0) { bone.translation.exists = true; f.seek(translationOffset); if ((flags & 1) > 0) { bone.translation.vector.Add(new Vector4( f.readFloat(), f.readFloat(), f.readFloat(), 0)); } else { bone.translation.startFrame = f.readFloat(); bone.translation.endFrame = f.readFloat(); int translationFlags = f.readInt(); int translationDataOffset = f.readInt(); int translationEntries = f.readInt(); f.seek(translationDataOffset); for (int j = 0; j < translationEntries; j++) { bone.translation.vector.Add(new Vector4( f.readFloat(), f.readFloat(), f.readFloat(), 0)); } } } break; case OSegmentType.transformMatrix: bone.isFullBakedFormat = true; f.readInt(); f.readInt(); int matrixOffset = f.readInt(); int entries = f.readInt(); f.seek(matrixOffset); for (int j = 0; j < entries; j++) { /*OMatrix transform = new OMatrix(); * transform.M11 = f.readFloat(); * transform.M21 = f.readFloat(); * transform.M31 = f.readFloat(); * transform.M41 = f.readFloat(); * * transform.M12 = f.readFloat(); * transform.M22 = f.readFloat(); * transform.M32 = f.readFloat(); * transform.M42 = f.readFloat(); * * transform.M13 = f.readFloat(); * transform.M23 = f.readFloat(); * transform.M33 = f.readFloat(); * transform.M43 = f.readFloat(); * * bone.transform.Add(transform);*/ } break; default: throw new Exception(string.Format("BCH: Unknow Segment Type {0} on Skeletal Animation bone {1}! STOP!", segmentType, bone.name)); } //skeletalAnimation.bone.Add(bone); } } //Shaders (unused for now, until someone wants to add them) for (int index = 0; index < content.shadersPointerTableEntries; index++) { f.seek(content.shadersPointerTableOffset + (index * 4)); int dataOffset = f.readInt(); f.seek(dataOffset); int shaderDataOffset = f.readInt(); int shaderDataLength = f.readInt(); } // Textures // WIP Section for (int index = 0; index < content.texturesPointerTableEntries; index++) { f.seek(content.texturesPointerTableOffset + (index * 4)); int dOffset = f.readInt(); f.seek(dOffset); int textureCommandsOffset = f.readInt(); int textureCommandsWordCount = f.readInt(); f.seek(f.pos() + 0x14); String textureName = f.readString(f.readInt(), -1); f.seek(textureCommandsOffset); BCH_Texture tex = new BCH_Texture(); textures.Add(textureName, tex); tex.Height = f.readUShort(); tex.Width = f.readUShort(); f.skip(12); int doffset = f.readInt(); f.skip(4); tex.type = f.readInt(); tex.data = f.getSection(doffset, f.size() - doffset); tex.texture = _3DS.DecodeImage(tex.data, tex.Width, tex.Height, (_3DS.Tex_Formats)tex.type); //Texture texture = new Texture2D(tex.texture); //tex.display = texture.Id; } // Model data for (int modelIndex = 0; modelIndex < content.modelsPointerTableEntries; modelIndex++) { f.seek(content.modelsPointerTableOffset + (modelIndex * 4)); int objectsHeaderOffset = f.readInt(); // Objects f.seek(objectsHeaderOffset); BCH_Model model = new BCH_Model(); models.Add(model); model.flags = f.readByte(); model.skeletonScaleType = f.readByte(); model.silhouetteMaterialEntries = f.readUShort(); model.worldTransform = new Matrix4(f.readFloat(), f.readFloat(), f.readFloat(), f.readFloat() , f.readFloat(), f.readFloat(), f.readFloat(), f.readFloat() , f.readFloat(), f.readFloat(), f.readFloat(), f.readFloat() , 0, 0, 0, 1); int materialsTableOffset = f.readInt(); int materialsTableEntries = f.readInt(); int materialsNameOffset = f.readInt(); int verticesTableOffset = f.readInt(); int verticesTableEntries = f.readInt(); f.skip(0x28); int skeletonOffset = f.readInt(); int skeletonEntries = f.readInt(); int skeletonNameOffset = f.readInt(); int objectsNodeVisibilityOffset = f.readInt(); int objectsNodeCount = f.readInt(); String name = f.readString(f.readInt(), -1); int objectsNodeNameEntries = f.readInt(); int objectsNodeNameOffset = f.readInt(); f.readInt(); //0x0 int metaDataPointerOffset = f.readInt(); f.seek(objectsNodeVisibilityOffset); int nodeVisibility = f.readInt(); string[] objectName = new string[objectsNodeNameEntries]; f.seek(objectsNodeNameOffset); int rootReferenceBit = f.readInt(); //Radix tree int rootLeftNode = f.readUShort(); int rootRightNode = f.readUShort(); int rootNameOffset = f.readInt(); for (int i = 0; i < objectsNodeNameEntries; i++) { int referenceBit = f.readInt(); short leftNode = f.readShort(); short rightNode = f.readShort(); objectName[i] = f.readString(f.readInt(), -1); } // Materials // NOTE: MATERIALS AND OBJECT SECTIONS ARE REALLY MESSY ATM String[] materialNames = new String[materialsTableEntries]; for (int index = 0; index < materialsTableEntries; index++) { f.seek(materialsTableOffset + (index * 0x2c)); int materialParametersOffset = f.readInt(); f.readInt(); f.readInt(); f.readInt(); int textureCommandsOffset = f.readInt(); int textureCommandsWordCount = f.readInt(); int materialMapperOffset = f.readInt(); materialNames[index] = f.readString(f.readInt(), -1); } // Object Descriptions... // Assumes MBN is already loaded for now f.seek(verticesTableOffset); List <objDes> objDescriptors = new List <objDes>(); if (mbn == null) { mbn = new Smash_Forge.MBN(); for (int index = 0; index < verticesTableEntries; index++) { mbn.mesh.Add(new MBN.Mesh()); } mbn.PreRender(); } for (int index = 0; index < mbn.mesh.Count; index++) { int i = f.readUShort(); if (index > mbn.mesh.Count) { break; } if (i > materialNames.Length) { break; } mbn.mesh[index].texId = textures[materialNames[i]].display; Console.WriteLine("Tex index" + mbn.mesh[index].texId); f.skip(2); // flags int nameId = f.readUShort(); mbn.mesh[index].Text = objectName[nameId]; // node visibility TODO: finish... mbn.mesh[index].Checked = ((nodeVisibility & (1 << nameId)) > 0); mbn.mesh[index].renderPriority = f.readUShort(); objDes des = new objDes(); objDescriptors.Add(des); des.vshAttBufferCommandOffset = f.readInt(); des.vshAttBufferCommandCount = f.readInt(); des.faceOffset = f.readInt(); des.faceCount = f.readInt(); des.vshAttBufferCommandOffsetEx = f.readInt(); des.vshAttBufferCommandCountEx = f.readInt(); f.skip(12); // center vector f.skip(4); // flagsOffset f.skip(4); // 0? f.readInt(); //bbOffsets[i] } //Skeleton f.seek(skeletonOffset); for (int index = 0; index < skeletonEntries; index++) { Bone bone = new Bone(model.skeleton); int boneFlags = f.readInt(); bone.parentIndex = f.readShort(); short boneSpace = f.readShort(); bone.scale = new float[3]; bone.rotation = new float[3]; bone.position = new float[3]; bone.scale[0] = f.readFloat(); bone.scale[1] = f.readFloat(); bone.scale[2] = f.readFloat(); bone.rotation[0] = f.readFloat(); bone.rotation[1] = f.readFloat(); bone.rotation[2] = f.readFloat(); bone.position[0] = f.readFloat(); bone.position[1] = f.readFloat(); bone.position[2] = f.readFloat(); // bone matrix... not really needed to be stored per say f.skip(4 * 4 * 3); bone.Text = f.readString(f.readInt(), -1); f.skip(4); // Meta data bones.bones.Add(bone); model.skeleton.bones.Add(bone); } model.skeleton.reset(); model.skeleton.update(); } }
public override void Read(string filename) { FileData d = new FileData(filename); FilePath = filename; d.Endian = Endianness.Little; // characters are little d.seek(8); // skip magic and version? int count = d.readInt(); // entry count for (int i = 0; i < count; i++) { SBEntry sb = new SBEntry() { hash = (uint)d.readInt(), param1_1 = d.readFloat(), param1_2 = d.readInt(), param1_3 = d.readInt(), param2_1 = d.readFloat(), param2_2 = d.readFloat(), param2_3 = d.readInt(), rx1 = d.readFloat(), rx2 = d.readFloat(), ry1 = d.readFloat(), ry2 = d.readFloat(), rz1 = d.readFloat(), rz2 = d.readFloat() }; for (int j = 0; j < 8; j++) { sb.boneHashes[j] = (uint)d.readInt(); } for (int j = 0; j < 4; j++) { sb.unks1[j] = d.readFloat(); } for (int j = 0; j < 6; j++) { sb.unks2[j] = d.readFloat(); } sb.factor = d.readFloat(); for (int j = 0; j < 3; j++) { sb.ints[j] = d.readInt(); } bones.Add(sb); /*Console.WriteLine(sb.hash.ToString("x")); * Console.WriteLine(d.readFloat() + " " + d.readInt() + " " + d.readInt()); * Console.WriteLine(d.readFloat() + " " + d.readInt() + " " + d.readInt()); * * //28 floats? * Console.WriteLine(d.readFloat() + " " + d.readFloat()); * Console.WriteLine(d.readFloat() + " " + d.readFloat()); * Console.WriteLine(d.readFloat() + " " + d.readFloat()); * Console.WriteLine(d.readFloat() + " " + d.readFloat() + " " + d.readFloat() + " " + d.readFloat()); * Console.WriteLine(d.readFloat() + " " + d.readFloat() + " " + d.readFloat() + " " + d.readFloat()); * * Console.WriteLine(d.readFloat() + " " + d.readFloat() + " " + d.readFloat() + " " + d.readFloat()); * Console.WriteLine(d.readFloat() + " " + d.readFloat() + " " + d.readFloat() + " " + d.readFloat()); * * Console.WriteLine(d.readFloat() + " " + d.readFloat()); * Console.WriteLine(d.readInt() + " " + d.readInt()); * Console.WriteLine(d.readInt() + " " + d.readInt()); * Console.WriteLine();*/ } }
public override void Read(string filename) { FileData f = new FileData(filename); //Header f.skip(0x4); version = f.readInt(); frameCount = f.readInt(); if (version == 4) { frameDuration = 1; } else if (version == 5) { frameDuration = f.readInt(); } else { throw new NotImplementedException($"Unknown light.bin version {version}"); } int[] offsets = new int[6]; for (int i = 0; i < 6; i++) { offsets[i] = f.readInt(); } //RGB properties for (int i = 0; i < 5; i++) { RgbProperty temp = new RgbProperty(); temp.enabled = (offsets[i + 1] != 0); if (temp.enabled) { f.seek(offsets[i + 1]); for (int j = 0; j < frameCount; j++) { byte[] frame = new byte[3]; for (int k = 0; k < 3; k++) { frame[k] = (byte)f.readByte(); } temp.frames.Add(frame); } } rgbProperties.Add(temp); } //Light data f.seek(offsets[0]); for (int i = 0; i < frameCount; i++) { LightFrame temp = new LightFrame(); for (int j = 0; j < 17; j++) { for (int k = 0; k < 4; k++) { temp.lightSets[j].lights[k].enabled = f.readInt(); for (int l = 0; l < 3; l++) { temp.lightSets[j].lights[k].angle[l] = f.readFloat(); } temp.lightSets[j].lights[k].colorHue = f.readFloat(); temp.lightSets[j].lights[k].colorSat = f.readFloat(); temp.lightSets[j].lights[k].colorVal = f.readFloat(); } temp.lightSets[j].fog.unknown = (byte)f.readByte(); for (int k = 0; k < 3; k++) { temp.lightSets[j].fog.color[k] = (byte)f.readByte(); } } temp.effect.unknown = (byte)f.readByte(); for (int j = 0; j < 3; j++) { temp.effect.color[j] = (byte)f.readByte(); } for (int j = 0; j < 3; j++) { temp.effect.position[j] = f.readFloat(); } lightFrames.Add(temp); } }