using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Media3D;
using agree;
using agree.Wpf.Util;
using glue.WpfUtil;
namespace WpfClient
{
class Main3D : Viewport3D
{
List<TfsEdge> edges;
Grammar g;
ContainerUIElement3D cont3;
const int spacing = 100;
public Main3D(Grammar g, IEnumerable<TfsEdge> ie, Grid main_wnd)
{
this.InheritanceBehavior = InheritanceBehavior.SkipToThemeNext;
this.edges = ie.ToList();
this.g = g;
this.Width = 1280;
this.Height = 1024;
this.ClipToBounds = false;
cont3 = new ContainerUIElement3D();
ModelVisual3D alv = new ModelVisual3D();
alv.Content = new AmbientLight(Colors.White);
cont3.Children.Add(alv);
Random rnd = new Random();
Size max = new Size(0, 0);
double z = 0;
foreach (TfsEdge e in ie)
{
// TfsControl tc = new TfsControl(g, e);
TfsControl tc = new TfsControl();
tc._TfsEdge = edges[0];
tc.FontFamily = new FontFamily("Arial");
tc.Background = new SolidColorBrush(Color.FromArgb(0x40, (byte)rnd.Next(), (byte)rnd.Next(), (byte)rnd.Next()));
tc.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size sz = tc.DesiredSize;
Debug.WriteLine(sz.Width);
Debug.WriteLine(sz.Height);
max.Width = Math.Max(max.Width, sz.Width);
max.Height = Math.Max(max.Height, sz.Height);
MeshGeometry3D g3 = new MeshGeometry3D();
g3.Positions.Add(new Point3D(0, -sz.Height, z)); // 0
g3.Positions.Add(new Point3D(sz.Width, -sz.Height, z)); // 1
g3.Positions.Add(new Point3D(0, 0, z)); // 2
g3.Positions.Add(new Point3D(sz.Width, 0, z)); // 3
g3.Normals.Add(new Vector3D(0, -sz.Height, 1));
g3.Normals.Add(new Vector3D(sz.Width, -sz.Height, 1));
g3.Normals.Add(new Vector3D(0, 0, 1));
g3.Normals.Add(new Vector3D(sz.Width, 0, 1));
g3.TriangleIndices.Add(0);
g3.TriangleIndices.Add(1);
g3.TriangleIndices.Add(2);
g3.TriangleIndices.Add(2);
g3.TriangleIndices.Add(1);
g3.TriangleIndices.Add(3);
g3.TextureCoordinates.Add(new Point(0, 1));
g3.TextureCoordinates.Add(new Point(1, 1));
g3.TextureCoordinates.Add(new Point(0, 0));
g3.TextureCoordinates.Add(new Point(1, 0));
DiffuseMaterial dm = new DiffuseMaterial();
dm.SetValue(Viewport2DVisual3D.IsVisualHostMaterialProperty, true);
Viewport2DVisual3D me3 = new Viewport2DVisual3D();
me3.Visual = tc;
me3.Geometry = g3;
me3.Material = dm;
// Depth of Diffuse materials trumps transparency. They must be sorted by depth to achieve a transparent effect.
cont3.Children.Insert(0, me3);
z -= spacing;
}
double stack_thick = -z;
Point3D interest = new Point3D(max.Width / 2, 0, -stack_thick * .8);
PerspectiveCamera cam = new PerspectiveCamera();
cam.FieldOfView = 35;
cam.Position = new Point3D(max.Width * .2, -max.Height * 1.5, stack_thick * .2);
cam.LookDirection = new Vector3D(interest.X - cam.Position.X, interest.Y - cam.Position.Y, interest.Z - cam.Position.Z);
cam.UpDirection = new Vector3D(0, 0, 1);
this.Camera = cam;
this.Children.Add(cont3);
}
};
class Zoom3D : Viewport3D
{
public static readonly RoutedCommand ZoomInCommand;
public static readonly RoutedCommand ZoomOutCommand;
public static readonly RoutedCommand PanLeftCommand;
public static readonly RoutedCommand PanRightCommand;
public static readonly RoutedCommand PanUpCommand;
public static readonly RoutedCommand PanDownCommand;
public static readonly RoutedCommand LookUpCommand;
public static readonly RoutedCommand LookDownCommand;
public static readonly RoutedCommand LookLeftCommand;
public static readonly RoutedCommand LookRightCommand;
static Zoom3D()
{
ZoomInCommand = new RoutedCommand("ZoomIn", typeof(Zoom3D));
ZoomOutCommand = new RoutedCommand("ZoomOut", typeof(Zoom3D));
PanLeftCommand = new RoutedCommand("PanLeft", typeof(Zoom3D));
PanRightCommand = new RoutedCommand("PanRight", typeof(Zoom3D));
PanUpCommand = new RoutedCommand("PanUp", typeof(Zoom3D));
PanDownCommand = new RoutedCommand("PanDown", typeof(Zoom3D));
LookUpCommand = new RoutedCommand("LookUp", typeof(Zoom3D));
LookDownCommand = new RoutedCommand("LookDown", typeof(Zoom3D));
LookLeftCommand = new RoutedCommand("LookLeft", typeof(Zoom3D));
LookRightCommand = new RoutedCommand("LookRight", typeof(Zoom3D));
//LookClockwiseCommand = new RoutedCommand("LookUp", typeof(Zoom3D));
//LookCommand = new RoutedCommand("LookDown", typeof(Zoom3D));
ZoomInCommand.InputGestures.Add(new KeyGesture(Key.OemPlus));
ZoomInCommand.InputGestures.Add(new KeyGesture(Key.Up, ModifierKeys.Control));
ZoomOutCommand.InputGestures.Add(new KeyGesture(Key.OemMinus));
ZoomOutCommand.InputGestures.Add(new KeyGesture(Key.Down, ModifierKeys.Control));
PanLeftCommand.InputGestures.Add(new KeyGesture(Key.Left));
PanRightCommand.InputGestures.Add(new KeyGesture(Key.Right));
PanUpCommand.InputGestures.Add(new KeyGesture(Key.Up));
PanDownCommand.InputGestures.Add(new KeyGesture(Key.Down));
LookUpCommand.InputGestures.Add(new KeyGesture(Key.Up, ModifierKeys.Alt));
LookDownCommand.InputGestures.Add(new KeyGesture(Key.Down, ModifierKeys.Alt));
LookLeftCommand.InputGestures.Add(new KeyGesture(Key.Left, ModifierKeys.Alt));
LookRightCommand.InputGestures.Add(new KeyGesture(Key.Right, ModifierKeys.Alt));
}
//List<Edge> edges;
Grammar g;
ContainerUIElement3D cont3;
Window main_wnd;
const int spacing = 100;
public Zoom3D(Grammar g, TfsEdge ie, Window main_wnd)
{
this.main_wnd = main_wnd;
this.CommandBindings.Add(new CommandBinding(ZoomInCommand, this.HandleZoomIn));
this.CommandBindings.Add(new CommandBinding(ZoomOutCommand, this.HandleZoomOut));
this.CommandBindings.Add(new CommandBinding(PanLeftCommand, this.HandlePanLeft));
this.CommandBindings.Add(new CommandBinding(PanRightCommand, this.HandlePanRight));
this.CommandBindings.Add(new CommandBinding(PanUpCommand, this.HandlePanUp));
this.CommandBindings.Add(new CommandBinding(PanDownCommand, this.HandlePanDown));
this.CommandBindings.Add(new CommandBinding(LookUpCommand, this.HandleLookUp));
this.CommandBindings.Add(new CommandBinding(LookDownCommand, this.HandleLookDown));
this.CommandBindings.Add(new CommandBinding(LookLeftCommand, this.HandleLookLeft));
this.CommandBindings.Add(new CommandBinding(LookRightCommand, this.HandleLookRight));
this.InheritanceBehavior = InheritanceBehavior.SkipToThemeNext;
//this.InitializeComponent();
//TransformGroup transform = new TransformGroup();
//transform.Children.Add(this.zoom);
//transform.Children.Add(this.translation);
//this.RenderTransform = transform;
//this.edges = ie.ToList();
this.g = g;
this.Width = 1024;
this.Height = 1024;
//this.
//this.SetValue(Window.SizeToContentProperty, SizeToContent.WidthAndHeight);
this.ClipToBounds = false;
cont3 = new ContainerUIElement3D();
ModelVisual3D alv = new ModelVisual3D();
alv.Content = new AmbientLight(Colors.White);
cont3.Children.Add(alv);
Random rnd = new Random();
Size max = new Size(0, 0);
double z = 0;
for (int j=0; j < 5; j++)
{
TfsControl tc = new TfsControl();
tc._TfsEdge = ie;
tc.FontFamily = new FontFamily("Arial");
//tc.Background = new SolidColorBrush(Color.FromArgb(0x40, (byte)rnd.Next(), (byte)rnd.Next(), (byte)rnd.Next()));
tc.Background = new SolidColorBrush(Color.FromArgb((byte)(0x10 * j), 0, 0, 0));
tc.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size sz = tc.DesiredSize;
Debug.WriteLine(sz.Width);
Debug.WriteLine(sz.Height);
max.Width = Math.Max(max.Width, sz.Width);
max.Height = Math.Max(max.Height, sz.Height);
MeshGeometry3D g3 = new MeshGeometry3D();
g3.Positions.Add(new Point3D(0, -sz.Height, z)); // 0
g3.Positions.Add(new Point3D(sz.Width, -sz.Height, z)); // 1
g3.Positions.Add(new Point3D(0, 0, z)); // 2
g3.Positions.Add(new Point3D(sz.Width, 0, z)); // 3
g3.Normals.Add(new Vector3D(0, -sz.Height, 1));
g3.Normals.Add(new Vector3D(sz.Width, -sz.Height, 1));
g3.Normals.Add(new Vector3D(0, 0, 1));
g3.Normals.Add(new Vector3D(sz.Width, 0, 1));
g3.TriangleIndices.Add(0);
g3.TriangleIndices.Add(1);
g3.TriangleIndices.Add(2);
g3.TriangleIndices.Add(2);
g3.TriangleIndices.Add(1);
g3.TriangleIndices.Add(3);
g3.TextureCoordinates.Add(new Point(0, 1));
g3.TextureCoordinates.Add(new Point(1, 1));
g3.TextureCoordinates.Add(new Point(0, 0));
g3.TextureCoordinates.Add(new Point(1, 0));
DiffuseMaterial dm = new DiffuseMaterial();
dm.SetValue(Viewport2DVisual3D.IsVisualHostMaterialProperty, true);
Viewport2DVisual3D me3 = new Viewport2DVisual3D();
me3.Visual = tc;
me3.Geometry = g3;
me3.Material = dm;
cont3.Children.Insert(0, me3);
z -= spacing;
}
double stack_thick = -z;
center = new Point3D(max.Width / 2, -max.Height * .8, -stack_thick / 2);
Point3D interest = new Point3D(max.Width / 2, 0, -stack_thick * .8);
cam = new PerspectiveCamera();
cam.FieldOfView = 35;
cam.Position = new Point3D(max.Width * .2, -max.Height * 1.5, stack_thick * .2);
cam.LookDirection = new Vector3D(interest.X - cam.Position.X, interest.Y - cam.Position.Y, interest.Z - cam.Position.Z);
cam.UpDirection = new Vector3D(0, 0, 1);
this.Camera = cam;
this.Children.Add(cont3);
}
Point3D center;
const int nav_inc = 20;
PerspectiveCamera cam;
private void HandleZoomIn(object target, ExecutedRoutedEventArgs args)
{
Point3D pt = cam.Position;
pt.Y += nav_inc;
cam.Position = pt;
//LookToCenter();
ReportPositions();
}
private void HandleZoomOut(object target, ExecutedRoutedEventArgs args)
{
Point3D pt = cam.Position;
pt.Y -= nav_inc;
cam.Position = pt;
//LookToCenter();
ReportPositions();
}
private void HandlePanLeft(object target, ExecutedRoutedEventArgs args)
{
Point3D pt = cam.Position;
pt.X += nav_inc;
cam.Position = pt;
//LookToCenter();
ReportPositions();
}
private void HandlePanRight(object target, ExecutedRoutedEventArgs args)
{
Point3D pt = cam.Position;
pt.X -= nav_inc;
cam.Position = pt;
//LookToCenter();
ReportPositions();
}
private void HandlePanUp(object target, ExecutedRoutedEventArgs args)
{
Point3D pt = cam.Position;
pt.Z += nav_inc;
cam.Position = pt;
//LookToCenter();
ReportPositions();
}
private void HandlePanDown(object target, ExecutedRoutedEventArgs args)
{
Point3D pt = cam.Position;
pt.Z -= nav_inc;
if (pt.Z > 0)
cam.Position = pt;
//LookToCenter();
ReportPositions();
}
#if false
private void HandleLookUp(object target, ExecutedRoutedEventArgs args)
{
Point3D pos = cam.Position;
Point3D interest = new Point3D(pos.X + cam.LookDirection.X, pos.Y + cam.LookDirection.Y, pos.Z + cam.LookDirection.Z);
interest.Z += nav_inc;
cam.LookDirection = new Vector3D(interest.X - cam.Position.X, interest.Y - cam.Position.Y, interest.Z - cam.Position.Z);
ReportPositions();
}
private void HandleLookDown(object target, ExecutedRoutedEventArgs args)
{
Point3D pos = cam.Position;
Point3D interest = new Point3D(pos.X + cam.LookDirection.X, pos.Y + cam.LookDirection.Y, pos.Z + cam.LookDirection.Z);
interest.Z -= nav_inc;
cam.LookDirection = new Vector3D(interest.X - cam.Position.X, interest.Y - cam.Position.Y, interest.Z - cam.Position.Z);
ReportPositions();
}
#else
private void HandleLookUp(object target, ExecutedRoutedEventArgs args)
{
Vector3D lp = cam.LookDirection;
lp.Z += nav_inc;
cam.LookDirection = lp;
ReportPositions();
}
private void HandleLookDown(object target, ExecutedRoutedEventArgs args)
{
Vector3D lp = cam.LookDirection;
lp.Z -= nav_inc;
cam.LookDirection = lp;
ReportPositions();
}
private void HandleLookLeft(object target, ExecutedRoutedEventArgs args)
{
Vector3D lp = cam.LookDirection;
lp.X -= nav_inc;
cam.LookDirection = lp;
ReportPositions();
}
private void HandleLookRight(object target, ExecutedRoutedEventArgs args)
{
Vector3D lp = cam.LookDirection;
lp.X += nav_inc;
cam.LookDirection = lp;
ReportPositions();
}
#endif
private void ReportPositions()
{
Debug.WriteLine("position: {0} look: {0}", cam.Position, cam.LookDirection);
}
private void LookToCenter()
{
cam.LookDirection = new Vector3D(center.X - cam.Position.X, center.Y - cam.Position.Y, center.Z - cam.Position.Z);
ReportPositions();
}
private void Content_MouseDown(object sender, MouseButtonEventArgs e)
{
//this.downPoint = e.GetPosition(this.main_wnd);
//this.main_wnd.CaptureMouse();
}
private void Content_MouseMove(object sender, MouseEventArgs e)
{
#if false
if (this.main_wnd.IsMouseCaptured)
{
Vector delta = e.GetPosition(this.main_wnd) - this.downPoint;
this.translation.X += delta.X;
this.translation.Y += delta.Y;
this.downPoint = e.GetPosition(this.main_wnd);
}
#endif
}
private void Content_MouseUp(object sender, MouseEventArgs e)
{
//this.main_wnd.ReleaseMouseCapture();
}
private void Content_MouseWheel(object sender, MouseWheelEventArgs e)
{
// double zoom = Math.Pow(Zoom3D.ZoomFactor, e.Delta / 120.0);
// Point offset = e.GetPosition(this);
// this.Zoom(zoom, offset);
}
private void Zoom(double zoom, Point offset)
{
#if false
Vector v = new Vector((1 - zoom) * offset.X, (1 - zoom) * offset.Y);
Vector translationVector = v * RenderTransform.Value;
this.translation.X += translationVector.X;
this.translation.Y += translationVector.Y;
this.zoom.ScaleX = this.zoom.ScaleX * zoom;
this.zoom.ScaleY = this.zoom.ScaleY * zoom;
#endif
}
//private TranslateTransform translation = new TranslateTransform();
//private ScaleTransform zoom = new ScaleTransform();
//private Point downPoint;
//private const double ZoomFactor = 1.1;
};
}