public CollisionObject(CollisionNode parent, ColObject *entry) { _modelName = entry->ModelName; _boneName = entry->BoneName; _unk1 = entry->_unk1; _unk2 = entry->_unk2; _unk3 = entry->_unk3; _flags = (ushort)entry->_flags; _unk5 = entry->_unk5; _unk6 = entry->_unk6; _boneIndex = entry->_boneIndex; _boxMax = entry->_boxMax; _boxMin = entry->_boxMin; int pointCount = entry->_pointCount; int pointOffset = entry->_pointOffset; int planeCount = entry->_planeCount; int planeOffset = entry->_planeIndex; ColPlane *pPlane = &parent.Header->Planes[planeOffset]; //Decode points BVec2 *pPtr = &parent.Header->Points[pointOffset]; for (int i = 0; i < pointCount; i++) { new CollisionLink(this, *pPtr++); } //CollisionPlane plane; for (int i = 0; i < planeCount; i++) { if (pPlane->_point1 != pPlane->_point2) { new CollisionPlane(this, pPlane++, pointOffset); } } }
public override void OnRebuild(VoidPtr address, int length, bool force) { CollisionHeader *header = (CollisionHeader *)address; *header = new CollisionHeader(_pointCount, _planeCount, _objects.Count, _unk1); BVec2 * pPoint = header->Points; ColPlane * pPlane = header->Planes; ColObject *pObj = header->Objects; int iPoint = 0, iPlane = 0; int lind, rind, llink, rlink, tmp; int cPoint, cPlane; lind = 0; rind = 0; CollisionPlane current, next; CollisionLink link; foreach (CollisionObject obj in _objects) { //Sets bounds and entry indices obj.Prepare(); cPoint = iPoint; cPlane = iPlane; foreach (CollisionPlane plane in obj._planes) { if (plane._encodeIndex != -1) { continue; } current = next = plane; Top: //Update variables, moving to next plane and links llink = current._encodeIndex; current = next; next = null; rlink = -1; //Get left point index, and encode where necessary if ((link = current._linkLeft)._encodeIndex == -1) { pPoint[link._encodeIndex = lind = iPoint++] = link._rawValue; } else { lind = link._encodeIndex; } //Get right point index and encode. if ((link = current._linkRight)._encodeIndex == -1) { pPoint[link._encodeIndex = rind = iPoint++] = link._rawValue; } else { rind = link._encodeIndex; } //Right-link planes by finding next available if (link != null) { foreach (CollisionPlane p in link._members) { if ((p == current) || (p._linkLeft != link)) { continue; //We only want to go left-to-right! } //Determine if entry has been encoded yet if ((tmp = p._encodeIndex) != -1) { if (pPlane[tmp]._link1 != -1) { continue; //Already linked, try again } else { pPlane[rlink = tmp]._link1 = (short)iPlane; //Left link, which means the end! } } else { next = p; rlink = iPlane + 1; } break; } } //Create entry pPlane[current._encodeIndex = iPlane++] = new ColPlane(lind, rind, llink, rlink, current._type, current._flags2, current._flags, current._material); //Traverse if (next != null) { goto Top; } } *pObj++ = new ColObject(cPlane, iPlane - cPlane, cPoint, iPoint - cPoint, obj._boxMin, obj._boxMax, obj._modelName, obj._boneName, obj._unk1, obj._unk2, obj._unk3, obj._flags, obj._unk5, obj._unk6, obj._boneIndex); } }