private void UpdateStateColliders(BonesState bonesState) { _borderColliders.ForEach(border => { border.isTrigger = bonesState == BonesState.Sleep; }); }
private void UpdatePos() { // The position only needs to be updated if we're attached to an object if (_attachedTo == null) { return; } switch (_spec.GetSpace()) { // We are attached to one of the bones of the object case PartSysEmitterSpace.NodePos: case PartSysEmitterSpace.NodeYpr: _prevObjPos = _objPos; _prevObjRotation = _objRotation; External.GetObjRotation(_attachedTo, out _objRotation); if (External.GetBoneWorldMatrix(_attachedTo, _spec.GetNodeName(), out var boneMatrix)) { _objPos = boneMatrix.Translation; } else { // As a fallback we use the object's location External.GetObjLocation(_attachedTo, out _objPos); } break; // We're attached to the world position of the object case PartSysEmitterSpace.ObjectPos: case PartSysEmitterSpace.ObjectYpr: _prevObjPos = _objPos; External.GetObjLocation(_attachedTo, out _objPos); // The rotation is only relevant when we're in OBJECT_YPR space if (_spec.GetSpace() == PartSysEmitterSpace.ObjectYpr) { _prevObjRotation = _objRotation; External.GetObjRotation(_attachedTo, out _objRotation); } break; case PartSysEmitterSpace.Bones: if (_boneState == null && _attachedTo != null) { _boneState = new BonesState(External, _attachedTo); } _boneState?.UpdatePos(); break; } }
public void SetAttachedTo(object attachedTo) { _attachedTo = attachedTo; // Reinitialize the bone state we're tracking for the object if (_spec.GetSpace() == PartSysEmitterSpace.Bones) { _boneState = null; if (attachedTo != null) { _boneState = new BonesState(External, attachedTo); } } UpdatePos(); }