Exemple #1
0
    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;
    }
Exemple #2
0
    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();
    }