private uint CastIntRead(BinaryReader bin, PMXFormat.Header.IndexSize index_size) { uint result = 0; switch (index_size) { case PMXFormat.Header.IndexSize.Byte1: result = (uint)binary_reader_.ReadByte(); if (byte.MaxValue == result) { result = uint.MaxValue; } break; case PMXFormat.Header.IndexSize.Byte2: result = (uint)binary_reader_.ReadUInt16(); if (ushort.MaxValue == result) { result = uint.MaxValue; } break; case PMXFormat.Header.IndexSize.Byte4: result = binary_reader_.ReadUInt32(); break; default: throw new System.ArgumentOutOfRangeException(); } return(result); }
private PMXFormat.DisplayElement ReadDisplayElement() { PMXFormat.DisplayElement result = new PMXFormat.DisplayElement(); result.element_target = binary_reader_.ReadByte(); PMXFormat.Header.IndexSize element_target_index_size = ((result.element_target == 0) ? format_.header.boneIndexSize : format_.header.morphIndexSize); result.element_target_index = CastIntRead(binary_reader_, element_target_index_size); return(result); }
private PMXFormat.Material ReadMaterial() { PMXFormat.Material result = new PMXFormat.Material(); result.name = ReadString(); result.english_name = ReadString(); result.diffuse_color = ReadSinglesToColor(binary_reader_); // dr, dg, db, da // 減衰色 result.specular_color = ReadSinglesToColor(binary_reader_, 1); // sr, sg, sb // 光沢色 result.specularity = binary_reader_.ReadSingle(); result.ambient_color = ReadSinglesToColor(binary_reader_, 1); // mr, mg, mb // 環境色(ambient) result.flag = (PMXFormat.Material.Flag)binary_reader_.ReadByte(); result.edge_color = ReadSinglesToColor(binary_reader_); // r, g, b, a result.edge_size = binary_reader_.ReadSingle(); result.usually_texture_index = CastIntRead(binary_reader_, format_.header.textureIndexSize); result.sphere_texture_index = CastIntRead(binary_reader_, format_.header.textureIndexSize); result.sphere_mode = (PMXFormat.Material.SphereMode)binary_reader_.ReadByte(); result.common_toon = binary_reader_.ReadByte(); PMXFormat.Header.IndexSize texture_index_size = ((result.common_toon == 0)? format_.header.textureIndexSize: PMXFormat.Header.IndexSize.Byte1); result.toon_texture_index = CastIntRead(binary_reader_, texture_index_size); result.memo = ReadString(); result.face_vert_count = binary_reader_.ReadUInt32(); // 面頂点数 // インデックスに変換する場合は、材質0から順に加算 return(result); }