protected override void LoadPosesAndAttachmentPoints(ShapeElement[] elements, List <ElementPose> intoPoses) { // Only load root pose and only the ones that have attachment points if (loadFully) { base.LoadPosesAndAttachmentPoints(elements, intoPoses); return; } ElementPose pose; for (int i = 0; i < elements.Length; i++) { ShapeElement elem = elements[i]; if (elem.AttachmentPoints == null) { continue; } intoPoses.Add(pose = new ElementPose()); pose.AnimModelMatrix = Mat4f.Create(); pose.ForElement = elem; for (int j = 0; j < elem.AttachmentPoints.Length; j++) { AttachmentPoint apoint = elem.AttachmentPoints[j]; AttachmentPointByCode[apoint.Code] = new AttachmentPointAndPose() { AttachPoint = apoint, CachedPose = pose }; } } }
protected virtual void LoadPosesAndAttachmentPoints(ShapeElement[] elements, List <ElementPose> intoPoses) { ElementPose pose; for (int i = 0; i < elements.Length; i++) { ShapeElement elem = elements[i]; intoPoses.Add(pose = new ElementPose()); pose.AnimModelMatrix = Mat4f.Create(); pose.ForElement = elem; if (elem.AttachmentPoints != null) { for (int j = 0; j < elem.AttachmentPoints.Length; j++) { AttachmentPoint apoint = elem.AttachmentPoints[j]; AttachmentPointByCode[apoint.Code] = new AttachmentPointAndPose() { AttachPoint = apoint, CachedPose = pose }; } } if (elem.Children != null) { pose.ChildElementPoses = new List <ElementPose>(elem.Children.Length); LoadPosesAndAttachmentPoints(elem.Children, pose.ChildElementPoses); } } }
protected virtual void LoadAttachmentPoints(List <ElementPose> cachedPoses) { for (int i = 0; i < cachedPoses.Count; i++) { ElementPose elem = cachedPoses[i]; if (elem.ForElement.AttachmentPoints != null) { for (int j = 0; j < elem.ForElement.AttachmentPoints.Length; j++) { AttachmentPoint apoint = elem.ForElement.AttachmentPoints[j]; AttachmentPointByCode[apoint.Code] = new AttachmentPointAndPose() { AttachPoint = apoint, CachedPose = elem }; } } if (elem.ChildElementPoses != null) { LoadAttachmentPoints(elem.ChildElementPoses); } } }
void updateLocalEyePosImmersiveFpMode() { AttachmentPointAndPose apap = AnimManager.Animator.GetAttachmentPointPose("Eyes"); AttachmentPoint ap = apap.AttachPoint; float[] ModelMat = Mat4f.Create(); Matrixf tmpModelMat = new Matrixf(); float bodyYaw = BodyYaw; float rotX = Properties.Client.Shape != null ? Properties.Client.Shape.rotateX : 0; float rotY = Properties.Client.Shape != null ? Properties.Client.Shape.rotateY : 0; float rotZ = Properties.Client.Shape != null ? Properties.Client.Shape.rotateZ : 0; float bodyPitch = WalkPitch; float lookOffset = (SidedPos.Pitch - GameMath.PI) / 9f; bool wasHoldPos = holdPosition; holdPosition = false; for (int i = 0; i < AnimManager.Animator.RunningAnimations.Length; i++) { RunningAnimation anim = AnimManager.Animator.RunningAnimations[i]; if (anim.Running && anim.EasingFactor > anim.meta.HoldEyePosAfterEasein) { if (!wasHoldPos) { prevAnimModelMatrix = (float[])apap.AnimModelMatrix.Clone(); } holdPosition = true; break; } } tmpModelMat .Set(ModelMat) .RotateX(SidedPos.Roll + rotX * GameMath.DEG2RAD) .RotateY(bodyYaw + (180 + rotY) * GameMath.DEG2RAD) .RotateZ(bodyPitch + rotZ * GameMath.DEG2RAD) .Mul(holdPosition ? prevAnimModelMatrix : apap.AnimModelMatrix) .Scale(Properties.Client.Size, Properties.Client.Size, Properties.Client.Size) .Translate(-0.5f, 0, -0.5f) .Translate(ap.PosX / 16f - lookOffset, ap.PosY / 16f - lookOffset / 1.3f, ap.PosZ / 16f) ; float[] pos = new float[4] { 0, 0, 0, 1 }; float[] endVec = Mat4f.MulWithVec4(tmpModelMat.Values, pos); LocalEyePos.Set(endVec[0], endVec[1], endVec[2]); }