Example #1
0
        public Character(World world, CharacterConfiguration configuration, string colliderName)
            : base(world)
        {
            this.Configuration = configuration;
            if (Configuration.EntityNames.Length == 0)
                throw new ArgumentException("At least one body entity must be provided.");

            CharacterNode = World.WorldNode.CreateChildSceneNode();
            EyeNode = CharacterNode.CreateChildSceneNode(new Vector3(0, 1.7f, 0));
            FirstPersonModel = new FirstPersonModel(this, EyeNode);
            FirstPersonModel.Visible = false;
            ThirdPersonModel = new ThirdPersonModel(this, CharacterNode, Configuration.EntityNames);

            BodyCollisionTree = new BodyCollisionTree(ThirdPersonModel.BodyEntities[0], AllLowerBodyAnimations.Concat(AllUpperBodyAnimations));
            BodyColliders = ColliderLoader.ParseColliders(colliderName, BodyCollisionTree, "Alpha_").ToArray();

            BoundingSphere = new SphereNode(CharacterNode, new Vector3(0, 1, 0), 2);
            SimpleCollider = new UprightCylinderNode(CharacterNode, Vector3.ZERO, 1.7f, 0.7f);
            AnimationManagerMapper.Add(
                AnimationKind.LowerBody,
                new AnimationManager(
                    AllLowerBodyAnimations,
                    ThirdPersonModel.BodyEntities,
                    "Idle"
                )
            );
            AnimationManagerMapper.Add(
                AnimationKind.UpperBody,
                new AnimationManager(
                    AllUpperBodyAnimations,
                    ThirdPersonModel.BodyEntities,
                    "Wield_USP"
                )
            );
            Camera = World.CreateCamera(Vector3.ZERO, MathHelper.Forward);
            EyeNode.AttachObject(Camera);
            ViewFrustum = new FrustumNode(Camera);

            SpecialMoveHandlers = new SpecialMoveHandler[3];
            Reset();
        }
Example #2
0
        public IEnumerable<BodyCollider> GetFrustumCollisionResult(FrustumNode frustum)
        {
            if (!frustum.Intersects(BoundingSphere))
                yield break;

            List<BodyCollider> collidedColliders = new List<BodyCollider>();
            foreach (BodyCollider collider in BodyColliders)
            {
                if (World.IsBodyColliderVisibleFromFrustum(frustum, collider))
                    yield return collider;
            }
        }
Example #3
0
        public bool IsBodyColliderVisibleFromFrustum(FrustumNode frustum, BodyCollider collider)
        {
            Vector3 colliderCenter = collider.PrimitiveNode.GetCenter(true);
            if (!frustum.Contains(colliderCenter))
                return false;

            Vector3 delta = colliderCenter - frustum.Position;
            Ray ray = new Ray(frustum.Position, delta);
            float? buildingDistance = GetNearestIntersectingBuilding(ray);
            if (!buildingDistance.HasValue || delta.SquaredLength < buildingDistance.Value.Squared())
                return true;

            return false;
        }
Example #4
0
 protected static bool Intersects(FrustumNode a, SphereNode b)
 {
     Vector3 bTransformedCenter = b.ReferenceNode.ConvertLocalToWorldPosition(b.Position);
     Vector3 bTransformedTop = b.ReferenceNode.ConvertLocalToWorldPosition(MathHelper.Up * b.Radius);
     float bTransformedRadius = bTransformedCenter.Distance(bTransformedTop);
     return a.Camera.IsVisible(new Sphere(bTransformedCenter, bTransformedRadius));
 }
Example #5
0
 public bool Intersects(FrustumNode frustum)
 {
     return PrimitiveNode.Intersects(frustum, this);
 }