//========================================================================================= //// 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; assert(surfNum>=0&&surfNum<(int)slist.size()); // ensure surface num is valid if (surfNum >= (int)slist.size()) { 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].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(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].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; }
void G2_RemoveRedundantGeneratedSurfaces(surfaceInfo_v &slist, int *activeSurfaces) { // walk the surface list, removing surface overrides or generated surfaces that are pointing at surfaces that aren't active anymore for (size_t i=0; i<slist.size(); i++) { if (slist[i].surface != -1) { // is this a generated surface? if (slist[i].offFlags & G2SURFACEFLAG_GENERATED) { // if it's not in the list, remove it if (!activeSurfaces[slist[i].genPolySurfaceIndex & 0xffff]) { G2_RemoveSurface(slist, i); } } // no, so it does point back at a legal surface else { // if it's not in the list, remove it if (!activeSurfaces[slist[i].surface]) { G2_RemoveSurface(slist, i); } } } } }
// set a named surface offFlags - if it doesn't find a surface with this name in the list then it will add one. qboolean G2_SetSurfaceOnOff (CGhoul2Info *ghlInfo, surfaceInfo_v &slist, const char *surfaceName, const int offFlags) { int surfIndex = -1; surfaceInfo_t temp_slist_entry; mdxmSurface_t *surf; // find the model we want model_t *mod = (model_t *)ghlInfo->currentModel; // did we find a ghoul 2 model or not? if (!mod->mdxm) { assert(0); return qfalse; } // first find if we already have this surface in the list surf = G2_FindSurface(ghlInfo, slist, surfaceName, &surfIndex); if (surf) { // set descendants value // slist[surfIndex].offFlags = offFlags; // seems to me that we shouldn't overwrite the other flags. // the only bit we really care about in the incoming flags is the off bit slist[surfIndex].offFlags &= ~(G2SURFACEFLAG_OFF | G2SURFACEFLAG_NODESCENDANTS); slist[surfIndex].offFlags |= offFlags & (G2SURFACEFLAG_OFF | G2SURFACEFLAG_NODESCENDANTS); return qtrue; } else { // ok, not in the list already - in that case, lets verify this surface exists in the model mesh int flags; int surfaceNum = G2_IsSurfaceLegal((void*)mod, surfaceName, &flags); if (surfaceNum != -1) { int newflags = flags; // the only bit we really care about in the incoming flags is the off bit newflags &= ~(G2SURFACEFLAG_OFF | G2SURFACEFLAG_NODESCENDANTS); newflags |= offFlags & (G2SURFACEFLAG_OFF | G2SURFACEFLAG_NODESCENDANTS); if (newflags != flags) { // insert here then because it changed, no need to add an override otherwise temp_slist_entry.offFlags = newflags; temp_slist_entry.surface = surfaceNum; slist.push_back(temp_slist_entry); } return qtrue; } } return qfalse; }
//========================================================================================= //// Public Bolt Routines int G2_Add_Bolt_Surf_Num(const char *fileName, boltInfo_v &bltlist, surfaceInfo_v &slist, const int surfNum) { 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 (int)bltlist.size()-1; }