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; } }
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); }
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); }
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; } }