void ReadMiptexDirectory(DataStream ds) { // get offsets to each texture var base_offset = this.header.miptex.fileofs; ds.seek(base_offset); var miptex_offsets = ds.readStruct <MIPTEX_DIRECTORY_T>().offsets; // create entries var miptex_directory = new MIPTEX_DIRECTORY_ENTRY_T[miptex_offsets.Length]; var garbage_entries = 0; for (var i = 0; i < miptex_offsets.Length; ++i) { var offset = base_offset + miptex_offsets[i]; ds.seek(offset); var miptex = ds.readStruct <miptex_t>(); MIPTEX_DIRECTORY_ENTRY_T entry; entry.offset = offset; entry.dsize = (miptex.width * miptex.height); entry.size = (miptex.width * miptex.height); entry.type = "D"[0]; entry.compression = 0; entry.name = FileUtilEx.trimNullTerminatedString(miptex.name); // additional parameters useful for generating uvs entry.width = miptex.width; entry.height = miptex.height; if (entry.name == "") { garbage_entries += 1; // console.log("Warning: BSP miptex entry at index " + i + " is unreadable. Name: '" + miptex.name + "'"); // console.log(entry); } else { miptex_directory[i - garbage_entries] = entry; } } this.miptex_directory = miptex_directory; }
public MDLFile(DataStream ds, string name) { this.name = name; // read header var header = ds.readStruct <HEADER_T>(); this.header = header; // read skins var skins = new DynamicArray <ImageData>(); // image_data (see ImageUtil.newImageData) var skin_groups = new DynamicArray <SKIN_GROUP_T>(); // { index, num_skins } var skin_size = header.skin_width * header.skin_height; for (var i = 0; i < header.num_skins; ++i) { var group = ds.readInt32(); var num_skins = 1; if (group != 0) { // create and add skin group num_skins = ds.readInt32(); SKIN_GROUP_T skin_group; skin_group.index = skins.length; skin_group.num_skins = num_skins; skin_group.times = ds.readArray <float>(num_skins); skin_groups[skin_groups.length] = skin_group; } // add skins for (var j = 0; j < num_skins; ++j) { var image_data = new ImageData(name + i, header.skin_width, header.skin_height); image_data.pixels = ds.readBuffer(skin_size); skins[skins.length] = image_data; } } this.skins = expandSkins(skins.ToArray()); this.skin_groups = skin_groups.ToArray(); // read geometry GEOMETRY_T geometry; geometry.expanded = false; // read skin verts and triangles geometry.skin_verts = ds.readArray <SKINVERT_T>(this.header.num_verts); geometry.triangles = ds.readArray <TRIANGLE_T>(this.header.num_tris); // read frames var frames = new DynamicArray <FRAME_T>(); var frame_groups = new DynamicArray <FRAME_GROUP_T>(); for (var i = 0; i < header.num_frames; ++i) { var group = ds.readInt32(); var num_frames = 1; if (group != 0) { // create and add frame group FRAME_GROUP_T frame_group; frame_group.index = frames.length; frame_group.num_frames = ds.readInt32(); frame_group.min = ds.readStruct <VERTEX_T>(); frame_group.max = ds.readStruct <VERTEX_T>(); num_frames = frame_group.num_frames; frame_group.times = ds.readArray <float>(num_frames); frame_groups[frame_groups.length] = frame_group; } // add frames for (var j = 0; j < num_frames; ++j) { var frame = ds.readStruct <FRAME_T>(); frame.verts = ds.readArray <VERTEX_T>(this.header.num_verts); frame.name = FileUtilEx.trimNullTerminatedString(frame.name); frames[frames.length] = frame; } } geometry.frames = frames.ToArray(); geometry.frame_groups = frame_groups.ToArray(); this.geometry = this.expandGeometry(geometry); this.animations = this.detectAnimations(); }