/// <summary> /// BCKファイルにエディタのデータを書き込む<br/> /// <remarks>Write(<param name="filepath">対象のファイルのパス</param>)</remarks> /// </summary> /// <returns>なし</returns> public void Write(string filepath) { FileStream fs = new FileStream(filepath, FileMode.Create); BinaryWriter bw = new BinaryWriter(fs); //J3Dヘッダー書き込み bw.Write(Encoding.ASCII.GetBytes("J3D1")); bw.Write(Encoding.ASCII.GetBytes("bck1")); bw.Write(CS.StringToBytes((0).ToString("X8"))); //チャンクサイズ bw.Write(CS.StringToBytes((1).ToString("X8"))); //chunc count 1固定 bw.Write(BitConverter.GetBytes(0xFFFFFFFF)); //padding 16byte すべてFF 固定 bw.Write(BitConverter.GetBytes(0xFFFFFFFF)); bw.Write(BitConverter.GetBytes(0xFFFFFFFF)); bw.Write(BitConverter.GetBytes(0xFFFFFFFF)); //チャンクヘッダー位置を保存 int Ank1_pos = Convert.ToInt32(fs.Position); //ANK1ヘッダー書き込み bw.Write(Encoding.ASCII.GetBytes("ANK1")); bw.Write(BitConverter.GetBytes(0x00000000)); bw.Write(CS.StringToByte(Txt_Roop_Mode.Text)); //roopmode bw.Write(CS.StringToByte(Txt_Rot_Frac.Text)); //rotfrac bw.Write(CS.StringToShort_byte(Txt_Total_Frame.Text)); //フレーム数 bw.Write(CS.StringToShort_byte(Txt_Bone_Num.Text)); //ボーン数 bw.Write(CS.StringToShort_byte((dgv2.Rows.Count).ToString())); //sca count bw.Write(CS.StringToShort_byte((dgv3.Rows.Count).ToString())); //rot count bw.Write(CS.StringToShort_byte((dgv4.Rows.Count).ToString())); //tra count bw.Write(CS.StringToBytes((0x40).ToString("X8"))); //anim offset bw.Write(BitConverter.GetBytes(0x00000000)); //sca offset bw.Write(BitConverter.GetBytes(0x00000000)); //rot offsett bw.Write(BitConverter.GetBytes(0x00000000)); //tra offsett bw.Write(Encoding.ASCII.GetBytes("Made by Penguin Made by J3DB")); //BCK_Systemクラスのインスタンス作成 BCK_System bcksys = new BCK_System(); //アニメーションテーブルを書き込む bcksys.Anim_Writer(bw); //パディングを書き込む bcksys.Padding_Writer(bw, fs.Position); //スケールテーブルを書き込む int scale_pos = Convert.ToInt32(fs.Position); bcksys.Scale_Trans_Writer(bw, dgv2, "Scale_Value"); //パディングを書き込む bcksys.Padding_Writer(bw, fs.Position); //ローテーションテーブルの書き込みと設定 bcksys.Mode_Checker((Int16.Parse(Txt_Bone_Num.Text)), 1, false); int rotation_pos = Convert.ToInt32(fs.Position); bcksys.Rotate_Writer(bw, dgv3, "Rotation_Value"); bcksys.Mode_Checker((Int16.Parse(Txt_Bone_Num.Text)), 1, true); //パディングを書き込む bcksys.Padding_Writer(bw, fs.Position); //トランスレートテーブルの書き込み int trans_pos = Convert.ToInt32(fs.Position); bcksys.Scale_Trans_Writer(bw, dgv4, "Translation_Value"); //パディングを書き込み bcksys.Padding_Writer(bw, fs.Position); //チャンク末尾を記録 int Ank_Last = Convert.ToInt32(fs.Position); //追記 bw.Seek(0x8, SeekOrigin.Begin); bw.Write(CS.StringToBytes((Ank_Last).ToString("X8"))); bw.Seek(0x38, SeekOrigin.Begin); bw.Write(CS.StringToBytes((scale_pos - Ank1_pos).ToString("X8"))); bw.Seek(0x3C, SeekOrigin.Begin); bw.Write(CS.StringToBytes((rotation_pos - Ank1_pos).ToString("X8"))); bw.Seek(0x40, SeekOrigin.Begin); bw.Write(CS.StringToBytes((trans_pos - Ank1_pos).ToString("X8"))); //書き込みの終了処理 bw.Close(); fs.Close(); //ステータスバー設定 tssl2.Text = Path.GetFileName(filepath) + "を保存しました"; }
/// <summary> /// BCKファイルを読み込む<br/> /// <remarks>Reader(<param name="filepath">対象のファイルのパス</param>)</remarks> /// </summary> /// /// <returns>なし</returns> public void Reader(string filepath) { //初期化 dgv1.Rows.Clear(); dgv2.Rows.Clear(); dgv3.Rows.Clear(); dgv4.Rows.Clear(); debugnum = 0; //★処理開始 //★バイナリ読み込み FileStream fs = new FileStream(filepath, FileMode.Open); BinaryReader br = new BinaryReader(fs); //★J3Dヘッダー Magic_1 = CS.Byte2Char(br); Magic_2 = CS.Byte2Char(br); File_Size = CS.Byte2Int(br); Chunk_Count = CS.Byte2Int(br); Subversion = CS.Byte2Char(br); padding = CS.Byte2Char(br, 12); //★ANK1ヘッダー Chunk_Type = CS.Byte2Char(br); Anim_Size = CS.Byte2Int(br); Roop_Mode = CS.Byte2Int(br, 1); Rotation_Frac = CS.Byte2Int(br, 1); Frame_Num = CS.Byte2Int(br, 2); Bone_Num = CS.Byte2Int(br, 2); Scale_Table_Count = CS.Byte2Int(br, 2); Rotation_Table_Count = CS.Byte2Int(br, 2); Translation_Table_Count = CS.Byte2Int(br, 2); Animation_Data_Table_Offset = CS.Byte2Int(br); Scale_Table_Offset = CS.Byte2Int(br); Rotation_Table_Offset = CS.Byte2Int(br); Translation_Table_Offset = CS.Byte2Int(br); Padding_Data_1 = CS.Byte2Char(br, 28); //★値をテキストボックスに Txt_Roop_Mode.Text = Roop_Mode.ToString(); Txt_Bone_Num.Text = Bone_Num.ToString(); Txt_Rot_Frac.Text = Rotation_Frac.ToString(); Txt_Total_Frame.Text = Frame_Num.ToString(); //☆デバッガー //☆j3d Debugger.Append("マジック1:" + Magic_1); Debugger.Append("\r\n" + "マジック2:" + Magic_2); Debugger.Append("\r\n" + "ファイルサイズ:" + File_Size); Debugger.Append("\r\n" + "チャンクカウント:" + Chunk_Count); Debugger.Append("\r\n" + "サブバージョン:" + Subversion); Debugger.Append("\r\n" + "パディング:" + padding); //☆ank1 Debugger.Append("\r\n" + "チャンクタイプ:" + Chunk_Type); Debugger.Append("\r\n" + "アニメーションサイズ:" + Anim_Size); Debugger.Append("\r\n" + "ループモード:" + Roop_Mode); Debugger.Append("\r\n" + "回転フラク?:" + Rotation_Frac); Debugger.Append("\r\n" + "フレーム数:" + Frame_Num); Debugger.Append("\r\n" + "ボーン数:" + Bone_Num); Debugger.Append("\r\n" + "スケールテーブルカウント:" + Scale_Table_Count); Debugger.Append("\r\n" + "ローテーションテーブルカウント:" + Rotation_Table_Count); Debugger.Append("\r\n" + "トランスレートテーブルカウント:" + Translation_Table_Count); Debugger.Append("\r\n" + "アニメーションオフセット:" + Animation_Data_Table_Offset); Debugger.Append("\r\n" + "スケールテーブルオフセット:" + Scale_Table_Offset); Debugger.Append("\r\n" + "ローテーションテーブルオフセット:" + Rotation_Table_Offset); Debugger.Append("\r\n" + "トランスレートテーブルオフセット:" + Translation_Table_Offset); Debugger.Append("\r\n" + "paddingdata:" + Padding_Data_1); //★BCKクラスインスタンス作成 BCK_System bcksys = new BCK_System(); //★アニメーショングリッドに書き込み bcksys.Animation_Table_File_Reader(br); //★パディング2 bcksys.Padding(br, fs.Position); //★スケールテーブルグリッドに書き込み for (int l = 0; l < Scale_Table_Count; l++) { dgv2.Rows.Add(l, string.Format("{0:0.##########}", CS.FromHexString(br))); //dgv2.Rows.Add(l, string.Format("{0:F}", CS.Byte2Float(br))); } //bcksys.Mode_Checker(Bone_Num, 0, true); bcksys.Mode_Checker(Bone_Num, 0, true, true); //★パディング3 bcksys.Padding(br, fs.Position); //★ローテーションテーブルグリッドに書き込み for (int l = 0; l < Rotation_Table_Count; l++) { dgv3.Rows.Add(l, string.Format("{0}", CS.Byte2Short_noPI(br))); } bcksys.Mode_Checker(Bone_Num, 1, true); bcksys.Mode_Checker(Bone_Num, 1, true, true); //★パディング4 bcksys.Padding(br, fs.Position); //★トランスレートテーブルグリッドに書き込み for (int l = 0; l < Translation_Table_Count; l++) { dgv4.Rows.Add(l, string.Format("{0:0.##########}", CS.Byte2Float(br))); } bcksys.Mode_Checker(Bone_Num, 2, true, true); //★パディング5 bcksys.Padding(br, fs.Position); //★ファイルストリーム、バイナリリード終了 fs.Close(); br.Close(); //ステータスバー設定 tssl2.Text = Path.GetFileName(filepath) + "を開きました"; }