public void Detach(IAttachable attachable) { if (Attachables.Contains(attachable)) { Attachables.Remove(attachable); } }
public void Attach(IAttachable attachable) { if (!Attachables.Contains(attachable)) { Attachables.Add(attachable); } }
public void Update(IUpdateArgs args, Matrix characterMatrix, Vector3 diffuseColor) { CharacterMatrix = characterMatrix; foreach (var part in Parts) { if (part.Effect != null) { part.Effect.DiffuseColor = diffuseColor; } if (!part.IsDirty) { continue; } _isDirty = true; part.Update(args); } foreach (var attachable in Attachables.ToArray()) { attachable.Update(RotationMatrix); } if (_isDirty) { UpdateVertexBuffer(args.GraphicsDevice); } }
public void Update(IUpdateArgs args, Matrix characterMatrix, Vector3 diffuseColor) { if (CurrentAnim == null && Animations.TryDequeue(out var animation)) { animation.Setup(); CurrentAnim = animation; } if (CurrentAnim != null) { CurrentAnim.Update(args.GameTime); if (CurrentAnim.IsFinished()) { CurrentAnim.Reset(); CurrentAnim = null; } } CharacterMatrix = characterMatrix; foreach (var part in Parts) { if (part.Effect != null) { part.Effect.DiffuseColor = diffuseColor; } if (!part.IsDirty) { continue; } _isDirty = true; part.Update(args); } foreach (var attachable in Attachables.ToArray()) { //attachable.R //attachable.Update(RotationMatrix); } if (_isDirty) { UpdateVertexBuffer(args.GraphicsDevice); } }
public void Render(IRenderArgs args, PlayerLocation position, Matrix characterMatrix) { if (Buffer == null) { return; } args.GraphicsDevice.Indices = Buffer; int idx = 0; for (var index = 0; index < Parts.Length; index++) { var part = Parts[index]; AlphaTestEffect effect = part.Effect; if (effect == null) { continue; } var headYaw = part.ApplyHeadYaw ? MathUtils.ToRadians(-(position.HeadYaw - position.Yaw)) : 0f; var pitch = part.ApplyPitch ? MathUtils.ToRadians(position.Pitch) : 0f; var rot = _rotation + part.Rotation; Matrix rotMatrix = Matrix.CreateTranslation(-part.Pivot) * Matrix.CreateFromYawPitchRoll( MathUtils.ToRadians(rot.Y), MathUtils.ToRadians(rot.X), MathUtils.ToRadians(rot.Z) ) * Matrix.CreateTranslation(part.Pivot); var rotMatrix2 = Matrix.CreateTranslation(-part.Pivot) * Matrix.CreateFromYawPitchRoll(headYaw, pitch, 0f) * Matrix.CreateTranslation(part.Pivot); var rotateMatrix = Matrix.CreateTranslation(part.Origin) * (rotMatrix2 * rotMatrix); RotationMatrix = rotateMatrix * characterMatrix; effect.World = rotateMatrix * characterMatrix; effect.View = args.Camera.ViewMatrix; effect.Projection = args.Camera.ProjectionMatrix; foreach (var pass in effect.CurrentTechnique.Passes) { pass.Apply(); } args.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, idx, part.Indexes.Length / 3); idx += part.Indexes.Length; } foreach (var attach in Attachables.ToArray()) { attach.Render(args); } }
public void Render(IRenderArgs args, PlayerLocation position, Matrix characterMatrix, bool mock) { if (Buffer == null) { return; } args.GraphicsDevice.Indices = Buffer; //var headYaw = MathUtils.ToRadians(-(position.HeadYaw - position.Yaw)); // var pitch = MathUtils.ToRadians(position.Pitch); var bindPoseMatrix = Matrix.CreateTranslation(-EntityModelBone.Pivot) * Matrix.CreateRotationX(MathUtils.ToRadians(-EntityModelBone.BindPoseRotation.X)) * Matrix.CreateRotationY(MathUtils.ToRadians(-EntityModelBone.BindPoseRotation.Y)) * Matrix.CreateRotationZ(MathUtils.ToRadians(-EntityModelBone.BindPoseRotation.Z)) * Matrix.CreateTranslation(EntityModelBone.Pivot); var boneMatrix = Matrix.Identity * Matrix.CreateTranslation(-EntityModelBone.Pivot) * Matrix.CreateFromAxisAngle(Vector3.Right, MathUtils.ToRadians(-EntityModelBone.Rotation.X)) * Matrix.CreateFromAxisAngle(Vector3.Backward, MathUtils.ToRadians(-EntityModelBone.Rotation.Z)) * Matrix.CreateFromAxisAngle(Vector3.Up, MathUtils.ToRadians(-EntityModelBone.Rotation.Y)) * Matrix.CreateTranslation(EntityModelBone.Pivot) * Matrix.CreateTranslation(_position); var headYaw = ApplyHeadYaw ? MathUtils.ToRadians(-(position.HeadYaw - position.Yaw)) : 0f; var pitch = ApplyPitch ? MathUtils.ToRadians(position.Pitch) : 0f; int idx = 0; for (var index = 0; index < Cubes.Length; index++) { var cube = Cubes[index]; var effect = cube.Effect; if (effect == null) { continue; } Matrix cubeRotationMatrix = Matrix.CreateTranslation(-cube.Pivot) * Matrix.CreateFromAxisAngle(Vector3.Right, MathUtils.ToRadians(-cube.Rotation.X)) * Matrix.CreateFromAxisAngle(Vector3.Backward, MathUtils.ToRadians(-cube.Rotation.Z)) * Matrix.CreateFromAxisAngle(Vector3.Up, MathUtils.ToRadians(-cube.Rotation.Y)) /* Matrix.CreateRotationX(MathUtils.ToRadians(part.Rotation.X)) * Matrix.CreateRotationY(MathUtils.ToRadians(part.Rotation.Y)) * Matrix.CreateRotationZ(MathUtils.ToRadians(part.Rotation.Z))*/ * Matrix.CreateTranslation(cube.Pivot); var rotMatrix2 = Matrix.CreateTranslation(-EntityModelBone.Pivot) * Matrix.CreateFromYawPitchRoll(headYaw, pitch, 0f) * Matrix.CreateTranslation(EntityModelBone.Pivot); //var p = EntityModelBone.Pivot + EntityModelBone. var rotMatrix3 = Matrix.CreateTranslation(-EntityModelBone.Pivot) * Matrix.CreateRotationX(MathUtils.ToRadians(-Rotation.X)) * Matrix.CreateRotationY(MathUtils.ToRadians(-Rotation.Y)) * Matrix.CreateRotationZ(MathUtils.ToRadians(-Rotation.Z)) * Matrix.CreateTranslation(EntityModelBone.Pivot); var cubeMatrix = (cubeRotationMatrix) * Matrix.CreateTranslation(cube.Origin); RotationMatrix = cubeMatrix * boneMatrix * characterMatrix; effect.World = cubeMatrix * rotMatrix2 * rotMatrix3 * bindPoseMatrix * boneMatrix * characterMatrix; effect.View = args.Camera.ViewMatrix; effect.Projection = args.Camera.ProjectionMatrix; if (!mock && !cube.IsInvisible) { foreach (var pass in effect.CurrentTechnique.Passes) { pass.Apply(); } args.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, idx, cube.Indexes.Length / 3); } idx += cube.Indexes.Length; } foreach (var attach in Attachables.ToArray()) { attach.Render(args); } }