int main (int argc, char *argv[]) { zoeHMM hmm; /* set the program name */ zoeSetProgramName(argv[0]); zoeSetOption("-durations", 1); zoeSetOption("-general", 0); zoeSetOption("-models", 0); zoeParseOptions(&argc, argv); /* usage */ if (argc != 2) { zoeE("usage: %s <hmm file>\n", argv[0]); zoeM(stderr, 4, "commands:", " -models", " -general", " -durations <length>" ); exit(1); } /* get HMM */ if ((hmm = zoeGetHMM(argv[1])) == NULL) zoeExit("error opening hmm file"); if (zoeOption("-models")) modelInfo(hmm); if (zoeOption("-general")) generalInfo(hmm); if (zoeOption("-durations")) exportDurations(hmm); zoeDeleteHMM(hmm); return 0; }
void main() { InitMPQs(); FILE* fo = fopen("test.txt", "w"); DBCFile displayInfo("DBFilesClient\\CreatureDisplayInfo.dbc"); DBCFile modelInfo("DBFilesClient\\CreatureModelData.dbc"); displayInfo.open(); modelInfo.open(); std::map<uint32, DBCFile::Record> modelInfoEntries; std::map<std::string, ModelCache> modelCache; for (auto itr = modelInfo.begin(); itr != modelInfo.end(); ++itr) { unsigned int entry = itr->getInt(0); modelInfoEntries.insert(std::make_pair(entry, *itr)); } for (auto itr = displayInfo.begin(); itr != displayInfo.end(); ++itr) { unsigned int displayid = itr->getInt(0); unsigned int modelentry = itr->getInt(1); float modelscale = itr->getFloat(4); auto modelitr = modelInfoEntries.find(modelentry); if (modelitr == modelInfoEntries.end()) { printf("Cannot find model entry for display %u (entry %u)\n", displayid, modelentry); continue; } auto modelrec = modelitr->second; const char* modelname = modelrec.getString(2); std::string strmodelname(modelname); replace(strmodelname, ".mdx", ".m2", 0); replace(strmodelname, ".MDX", ".m2", 0); M2Header* header; M2Attachment* attachments; M2Bone* bones; uint16* bonelookups; auto cacheitr = modelCache.find(modelname); if (cacheitr == modelCache.end()) { MPQFile modelf(strmodelname.c_str()); if (modelf.isEof()) { printf("Error: cannot open %s\n", strmodelname.c_str()); continue; } printf("Processing %u", displayid); header = (M2Header*)malloc(sizeof(M2Header)); modelf.read(header, sizeof(M2Header)); printf(" %u attachments %u bone lookups %u bones\n", header->nAttachments, header->nBoneLookupTable, header->nBones); attachments = (M2Attachment*)malloc(header->nAttachments * sizeof(M2Attachment)); modelf.seek(header->ofsAttachments); modelf.read(attachments, header->nAttachments * sizeof(M2Attachment)); bonelookups = (uint16*)malloc(header->nBoneLookupTable * sizeof(uint16)); modelf.seek(header->ofsBoneLookupTable); modelf.read(bonelookups, header->nBoneLookupTable * sizeof(uint16)); bones = (M2Bone*)malloc(header->nBones * sizeof(M2Bone)); modelf.seek(header->ofsBones); modelf.read(bones, header->nBones * sizeof(M2Bone)); ModelCache cacheentry; cacheentry.attachments = attachments; cacheentry.bones = bones; cacheentry.bonelookups = bonelookups; cacheentry.header = header; modelCache.insert(std::make_pair(modelname, cacheentry)); } else { header = cacheitr->second.header; bones = cacheitr->second.bones; bonelookups = cacheitr->second.bonelookups; attachments = cacheitr->second.attachments; } //try and get the bone for (auto i = 0; i < header->nAttachments; ++i) { if (attachments[i].bone > header->nBoneLookupTable) { printf("Attachment %u requests bonelookup %u (too large, bonelookup table is only %u entries)\n", i, attachments[i].bone, header->nBoneLookupTable); } uint16 boneindex = bonelookups[attachments[i].bone]; if (boneindex > header->nBones) { printf("Attachment %u requests bone %u (too large, bone table is only %u entries)\n", i, boneindex, header->nBones); continue; } M2Bone & bone = bones[boneindex]; //printf("Attachment %u (bone pivot %f %f %f offset %f %f %f)\n", attachments[i].id, bone.pivotpoint[0], bone.pivotpoint[1], bone.pivotpoint[2], attachments[i].pos[0], attachments[i].pos[1], attachments[i].pos[2]); float realpos[3]; realpos[0] = (/*bone.pivotpoint[0] +*/ attachments[i].pos[0]) * modelscale; realpos[1] = (/*bone.pivotpoint[1] +*/ attachments[i].pos[1]) * modelscale; realpos[2] = (/*bone.pivotpoint[2] +*/ attachments[i].pos[2]) * modelscale; //fix coord system // float tmp = realpos[2]; // realpos[2] = realpos[1]; // realpos[1] = -tmp; //fprintf(fo, "insert into `display_attachment_points` VALUES (%u, %u, %f, %f, %f);\n", displayid, attachments[i].id, attachments[i].pos[0], attachments[i].pos[1], attachments[i].pos[2]); //printf("Attachmnent %u point %f %f %f pivot %f %f %f\n", attachments[i].id, realpos[0], realpos[1], realpos[2], bone.pivotpoint[0], bone.pivotpoint[1], bone.pivotpoint[2]); } float boundlow[3]; boundlow[0] = header->boundingbox1[0] * modelscale; boundlow[1] = header->boundingbox1[1] * modelscale; boundlow[2] = header->boundingbox1[2] * modelscale; float boundhigh[3]; boundhigh[0] = header->boundingbox2[0] * modelscale; boundhigh[1] = header->boundingbox2[1] * modelscale; boundhigh[2] = header->boundingbox2[2] * modelscale; float boundradius = header->boundingradius * modelscale; fprintf(fo, "insert into `display_bounding_boxes` VALUES (%u, %f, %f, %f, %f, %f, %f, %f);\n", displayid, boundlow[0], boundlow[1], boundlow[2], boundhigh[0], boundhigh[1], boundhigh[2], boundradius); } }