示例#1
0
 public void Detach(IAttachable attachable)
 {
     if (Attachables.Contains(attachable))
     {
         Attachables.Remove(attachable);
     }
 }
示例#2
0
 public void Attach(IAttachable attachable)
 {
     if (!Attachables.Contains(attachable))
     {
         Attachables.Add(attachable);
     }
 }
示例#3
0
            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);
                }
            }
示例#4
0
            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);
                }
            }
示例#5
0
            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);
                }
            }
示例#6
0
            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);
                }
            }