예제 #1
0
        public virtual void Mod_LoadSubmodels(lump_t l)
        {
            qfiles.dmodel_t in_renamed;
            mmodel_t[]      out_renamed;
            Int32           i, j, count;

            if ((l.filelen % qfiles.dmodel_t.SIZE) != 0)
            {
                Com.Error(Defines.ERR_DROP, "MOD_LoadBmodel: funny lump size in " + loadmodel.name);
            }
            count                  = l.filelen / qfiles.dmodel_t.SIZE;
            out_renamed            = new mmodel_t[count];
            loadmodel.submodels    = out_renamed;
            loadmodel.numsubmodels = count;
            ByteBuffer bb = ByteBuffer.Wrap(mod_base, l.fileofs, l.filelen);

            bb.Order = ByteOrder.LittleEndian;
            for (i = 0; i < count; i++)
            {
                in_renamed     = new dmodel_t(bb);
                out_renamed[i] = new mmodel_t();
                for (j = 0; j < 3; j++)
                {
                    out_renamed[i].mins[j]   = in_renamed.mins[j] - 1;
                    out_renamed[i].maxs[j]   = in_renamed.maxs[j] + 1;
                    out_renamed[i].origin[j] = in_renamed.origin[j];
                }

                out_renamed[i].radius    = RadiusFromBounds(out_renamed[i].mins, out_renamed[i].maxs);
                out_renamed[i].headnode  = in_renamed.headnode;
                out_renamed[i].firstface = in_renamed.firstface;
                out_renamed[i].numfaces  = in_renamed.numfaces;
            }
        }
예제 #2
0
    Hash <UInt32, face_id_list_t> getFaceIdsPerTexture(GEOMETRY_T geometry, dmodel_t model)
    {
        var texinfos = geometry.texinfos;
        var faces    = geometry.faces;

        var face_id_lists = new Hash <UInt32, face_id_list_t>(); // important to note that this is a hash

        var start = model.face_id;
        var end   = start + model.num_faces;

        for (var i = start; i < end; ++i)
        {
            var face     = faces[i];
            var tex_id   = texinfos[face.texinfo_id].tex_id;
            var face_ids = face_id_lists[tex_id];
            if (face_ids == null)
            {
                face_ids = new face_id_list_t();
            }

            face_ids[face_ids.length] = i;
            face_id_lists[tex_id]     = face_ids;
        }

        return(face_id_lists);
    }
예제 #3
0
    BSPModel CreateModel(ref GEOMETRY_T geometry, dmodel_t model)
    {
        var face_id_lists = this.getFaceIdsPerTexture(geometry, model);
        var geometries    = new List <BSPModelGeometry>();
        var faces         = new List <BSPFace>();

        foreach (var i in face_id_lists.sortedKeys)
        {
            var miptex_entry = this.miptex_directory[i];
            var face_ids     = face_id_lists[i];

            foreach (var face_id in face_ids)
            {
                faces.Add(this.faces[face_id]);
            }

            var mesh = this.CreateMesh(geometry, face_ids, miptex_entry);
            geometries.Add(new BSPModelGeometry(i, mesh, faces.ToArray()));

            faces.Clear();
        }

        var result = new BSPModel(geometries.ToArray(), faces.ToArray());

        result.origin   = TransformVector(model.origin);
        result.boundbox = TransformBoundbox(model.bbox);
        return(result);
    }
예제 #4
0
        static void LoadModels(BinaryReader br, Header header)
        {
            // Models
            br.BaseStream.Seek(header.lumps[14].fileofs, SeekOrigin.Begin);
            int nModels = header.lumps[14].filelen / 48;
            dmodel_t[] models = new dmodel_t[nModels];
            for (int i = 0; i < nModels; i++)
            {
                dmodel_t model = new dmodel_t();
                model.mins = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
                model.maxs = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
                model.origin = SourceParser.SwapZY(new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle()));
                model.headnode = br.ReadInt32();
                model.firstface = br.ReadInt32();
                model.numfaces = br.ReadInt32();
                models[i] = model;
            }

            world.cmodels = new cmodel_t[models.Length];

            for (int i = 0; i < models.Length; i++)
            {
                dmodel_t min = models[i];
                cmodel_t mout = new cmodel_t();
                mout.leaf = new dleaf_t();
                mout.mins = mout.maxs = Vector3.Zero;

                for (int j = 0; j < 3; j++)
                {
                    // spread the mins / maxs by a pixel
                    mout.mins[j] = min.mins[j] - 1;
                    mout.maxs[j] = min.maxs[j] + 1;
                }

                // world model doesn't need other info
                if (i == 0)
                    continue;

                mout.leaf.numleaffaces = (ushort)min.numfaces;
                mout.leaf.firstleafface = (ushort)world.leafFaces.Count;
                for (int j = 0; j < min.numfaces; j++)
                {
                    world.leafFaces.Add(min.firstface + j);
                }

                world.cmodels[i] = mout;
            }
        }