//========================================================================================= //// Public Bolt Routines int G2_Add_Bolt_Surf_Num(CGhoul2Info *ghlInfo, boltInfo_v &bltlist, surfaceInfo_v &slist, const int surfNum) { assert(ghlInfo && ghlInfo->mValid); boltInfo_t tempBolt; int i; // first up, make sure have a surface first if (surfNum >= slist.size()) { return -1; } // look through entire list - see if it's already there first for(i=0; i<bltlist.size(); i++) { // already there?? if (bltlist[i].surfaceNumber == surfNum) { // increment the usage count bltlist[i].boltUsed++; return i; } } // we have a surface // look through entire list - see if it's already there first for(i=0; i<bltlist.size(); i++) { // if this surface entry has info in it, bounce over it if (bltlist[i].boneNumber == -1 && bltlist[i].surfaceNumber == -1) { // if we found an entry that had a -1 for the bone / surface number, then we hit a surface / bone slot that was empty bltlist[i].surfaceNumber = surfNum; bltlist[i].surfaceType = G2SURFACEFLAG_GENERATED; bltlist[i].boltUsed = 1; return i; } } // ok, we didn't find an existing surface of that name, or an empty slot. Lets add an entry tempBolt.surfaceNumber = surfNum; tempBolt.surfaceType = G2SURFACEFLAG_GENERATED; tempBolt.boneNumber = -1; tempBolt.boltUsed = 1; bltlist.push_back(tempBolt); return bltlist.size()-1; }
int G2_Add_Bolt(CGhoul2Info *ghlInfo, boltInfo_v &bltlist, surfaceInfo_v &slist, const char *boneName) { assert(ghlInfo && ghlInfo->mValid); model_t *mod_m = (model_t *)ghlInfo->currentModel; model_t *mod_a = (model_t *)ghlInfo->animModel; int x, surfNum = -1; mdxaSkel_t *skel; mdxaSkelOffsets_t *offsets; mdxmHierarchyOffsets_t *surfOffsets; boltInfo_t tempBolt; int flags; surfOffsets = (mdxmHierarchyOffsets_t *)((byte*)mod_m->mdxm + sizeof(mdxmHeader_t)); // first up, we'll search for that which this bolt names in all the surfaces surfNum = G2_IsSurfaceLegal((void*)mod_m, boneName, &flags); // did we find it as a surface? if (surfNum != -1) { // look through entire list - see if it's already there first for (size_t i = 0; i<bltlist.size(); i++) { // already there?? if (bltlist[i].surfaceNumber == surfNum) { // increment the usage count bltlist[i].boltUsed++; return i; } } // look through entire list - see if we can re-use one for (size_t i = 0; i<bltlist.size(); i++) { // if this surface entry has info in it, bounce over it if (bltlist[i].boneNumber == -1 && bltlist[i].surfaceNumber == -1) { // if we found an entry that had a -1 for the bone / surface number, then we hit a surface / bone slot that was empty bltlist[i].surfaceNumber = surfNum; bltlist[i].boltUsed = 1; bltlist[i].surfaceType = 0; return i; } } // ok, we didn't find an existing surface of that name, or an empty slot. Lets add an entry tempBolt.surfaceNumber = surfNum; tempBolt.boneNumber = -1; tempBolt.boltUsed = 1; tempBolt.surfaceType = 0; bltlist.push_back(tempBolt); return bltlist.size()-1; } // no, check to see if it's a bone then offsets = (mdxaSkelOffsets_t *)((byte *)mod_a->mdxa + sizeof(mdxaHeader_t)); // walk the entire list of bones in the gla file for this model and see if any match the name of the bone we want to find for (x=0; x< mod_a->mdxa->numBones; x++) { skel = (mdxaSkel_t *)((byte *)mod_a->mdxa + sizeof(mdxaHeader_t) + offsets->offsets[x]); // if name is the same, we found it if (!Q_stricmp(skel->name, boneName)) { break; } } // check to see we did actually make a match with a bone in the model if (x == mod_a->mdxa->numBones) { // didn't find it? Error //assert(0&&x == mod_a->mdxa->numBones); #ifdef _DEBUG // Com_Printf("WARNING: %s not found on skeleton\n", boneName); #endif return -1; } // look through entire list - see if it's already there first for (size_t i = 0; i<bltlist.size(); i++) { // already there?? if (bltlist[i].boneNumber == x) { // increment the usage count bltlist[i].boltUsed++; return i; } } // look through entire list - see if we can re-use it for (size_t i = 0; i<bltlist.size(); i++) { // if this bone entry has info in it, bounce over it if (bltlist[i].boneNumber == -1 && bltlist[i].surfaceNumber == -1) { // if we found an entry that had a -1 for the bonenumber, then we hit a bone slot that was empty bltlist[i].boneNumber = x; bltlist[i].boltUsed = 1; bltlist[i].surfaceType = 0; return i; } } // ok, we didn't find an existing bone of that name, or an empty slot. Lets add an entry tempBolt.boneNumber = x; tempBolt.surfaceNumber = -1; tempBolt.boltUsed = 1; tempBolt.surfaceType = 0; bltlist.push_back(tempBolt); return bltlist.size()-1; }