示例#1
0
        public override void OnMouseUp(MouseEventArgs e)
        {
            if (moving != null)
            {
                Vector3 world = view.ScreenToWorld(new Vector3(e.X, e.Y, 0));
                Ray r = new Ray(new Vector3(world.X, world.Y, 100), -Vector3.UnitZ);
                Common.RayIntersection rOut;
                float minD = float.MaxValue;

                if (view.Simulation != null)
                    foreach (Common.IMotion.IObject o in view.Simulation.All)
                        if (o != moving)
                        {
                            if (Common.Intersection.Intersect<Common.RayIntersection>(r, o.WorldBounding, out rOut) && rOut.Distance < minD)
                                minD = rOut.Distance;
                        }

                if (minD < float.MaxValue)
                {
                    moving.Position = r.Position + minD * r.Direction;
                    view.Invalidate();
                }
            }
            moving = null;
        }
示例#2
0
        protected virtual void OnHitsObject(Common.IMotion.IObject obj, Vector3 intersection)
        {
            if (IsRemoved)
            {
                return;
            }

            Translation = intersection;
            if (obj.Tag is GroundPiece)
            {
                CreateGroundBulletHole(intersection);
            }
            else if (obj.Tag is Props.Prop)
            {
                var prop = obj.Tag as Props.Prop;
                if (prop.MainGraphic != null)
                {
                    var dir     = Vector3.Normalize(velocity);
                    var dirLeft = Vector3.TransformNormal(dir, Matrix.RotationZ(0.1f));
                    var dirUp   = dir;
                    dirUp.Z = 0.1f;
                    var mesh = new BoundingMetaMesh
                    {
                        Mesh           = ((MetaModel)prop.MainGraphic).XMesh,
                        Transformation = ((MetaModel)prop.MainGraphic).World * prop.WorldMatrix
                    };
                    var    p = intersection - dir;
                    var    rayForward = new Ray(p, dir);
                    object distForward, distLeft, distUp;
                    var    h1 = global::Graphics.Intersection.Intersect(rayForward, mesh, out distForward);
                    if (!h1)
                    {
                        return;
                    }

                    var point = rayForward.Position + rayForward.Direction * ((Common.RayIntersection)distForward).Distance;
                    p = point - dir;
                    var rayLeft = new Ray(p, dirLeft);
                    var rayUp   = new Ray(p, dirUp);

                    var h2        = global::Graphics.Intersection.Intersect(rayLeft, mesh, out distLeft);
                    var h3        = global::Graphics.Intersection.Intersect(rayUp, mesh, out distUp);
                    var pointLeft = rayLeft.Position + rayLeft.Direction * ((Common.RayIntersection)distLeft).Distance;
                    var pointUp   = rayUp.Position + rayUp.Direction * ((Common.RayIntersection)distUp).Distance;

                    var vUp   = Vector3.Normalize(pointUp - point);
                    var vLeft = Vector3.Normalize(pointLeft - point);

                    var forward = Vector3.Cross(vUp, vLeft);
                    var up      = Vector3.Cross(vLeft, forward);
                    var left    = vLeft;

                    Matrix rot = Common.Math.MatrixFromVectors(-left, up, forward, point);
                    CreateWallBulletHole(rot);
                }
            }

            /*Game.Instance.Scene.Add(new Props.Stone3
             * {
             *  Translation = intersection,
             *  Scale = new Vector3(0.05f, 0.05f, 0.05f),
             *  PhysicsLocalBounding = null
             * });*/
        }
示例#3
0
 public override void OnMouseDown(MouseEventArgs e)
 {
     Vector3 world = view.ScreenToWorld(new Vector3(e.X, e.Y, 0));
     if (view.Simulation != null)
         foreach (Common.IMotion.IObject o in view.Simulation.All)
             if (o is Common.IMotion.IUnit)
                 if (Common.Intersection.Intersect(new Ray(new Vector3(world.X, world.Y, 100), -Vector3.UnitZ), o.WorldBounding))
                     moving = o;
 }
示例#4
0
 public void Pursue(Common.IMotion.IObject objct, float distance)
 {
     highLevelGoalState.Pursue(new Pursuee {
         Object = objct, Distance = distance, RegionNode = Simulation.NavMesh.BoundingRegion.GetNodeAt(objct.Position)
     });
 }