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; }
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 * });*/ }
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; }
public void Pursue(Common.IMotion.IObject objct, float distance) { highLevelGoalState.Pursue(new Pursuee { Object = objct, Distance = distance, RegionNode = Simulation.NavMesh.BoundingRegion.GetNodeAt(objct.Position) }); }