private void SetGhostFaceAtFace(WorldObject target, TileFace resultFace) { var bb = target.ObjectType.TileData.GetBoundingBox(); var range = (bb.Max - bb.Min) * 0.5f; Vector3 right; Vector3 normal; Vector3 up; normal = TileSnapInformationBuilder.getFaceNormal(resultFace); up = TileSnapInformationBuilder.getFaceUp(resultFace); right = Vector3.Cross(up, normal); range *= 2f; Vector3 dim = new Vector3(); var ghostWidth = 0.01f; dim += normal * ghostWidth; dim += up * Vector3.Dot(up, range); dim += right * Vector3.Dot(right, range); dim.X = Math.Abs(dim.X); dim.Y = Math.Abs(dim.Y); dim.Z = Math.Abs(dim.Z); ghostFace.Dimensions = dim; ghostFace.PivotPoint = Vector3.One * 0.5f; ghostFace.WorldMatrix = Matrix.CreateTranslation(normal * (Math.Abs(Vector3.Dot(normal, range * 0.5f)) + 0.01f)) * target.WorldMatrix; }
private TileFace RaycastTileFace(IXNAGame _game, WorldObject target) { var bb = target.ObjectType.TileData.GetBoundingBox(); var range = (bb.Max - bb.Min) * 0.5f; Ray ray; var targetMatrix = Matrix.Invert(target.WorldMatrix); ray = _game.GetWereldViewRay(_game.Mouse.CursorPositionVector); ray.Position = Vector3.Transform(ray.Position, targetMatrix); ray.Direction = Vector3.TransformNormal(ray.Direction, targetMatrix); raycasterFace.Reset(); Vector3 normal; Vector3 up; Vector3 right; for (int i = 0; i < 6; i++) { var face = (TileFace)(i + 1); normal = TileSnapInformationBuilder.getFaceNormal(face); up = TileSnapInformationBuilder.getFaceUp(face); right = Vector3.Cross(up, normal); var scaledNormal = normal * Math.Abs(Vector3.Dot(normal, range)); var scaledUp = up * Math.Abs(Vector3.Dot(up, range)); var scaledRight = right * Math.Abs(Vector3.Dot(right, range)); var v1 = scaledNormal + scaledUp + scaledRight; var v2 = scaledNormal + scaledUp - scaledRight; var v3 = scaledNormal - scaledUp + scaledRight; var v4 = scaledNormal - scaledUp - scaledRight; float?result; Functions.RayIntersectsSquare(ref ray, ref v1, ref v2, ref v3, ref v4, out result); raycasterFace.AddResult(result, face); } return(raycasterFace.ClosestObject); }