public static void Draw(Teclado teclado, Viewport3D viewport3D, Dimensiones dimTeclaBlanca, Dimensiones dimTeclaNegra)
 {
     Dictionary<string, Tecla> teclas = teclado.Teclas;
     int numTeclas = teclas.Count;
     double separacionTeclas = 0.02;
     double offsetX = -calcularAnchoTeclado(teclado, dimTeclaBlanca.Ancho, separacionTeclas)/2;
     //Dimensiones auxiliares con margen
     Dimensiones dimTeclaNegraConMargen = new Dimensiones();
     dimTeclaNegraConMargen.Ancho = dimTeclaNegra.Ancho + separacionTeclas * 2;
     dimTeclaNegraConMargen.Profundidad = dimTeclaNegra.Profundidad + separacionTeclas;
     dimTeclaNegraConMargen.Alto = dimTeclaNegra.Alto;
     for (int i = 0, iTeclaBlanca = 0; i < numTeclas; i++)
     {
         Tecla tecla = teclas.ElementAt(i).Value;
         Tecla teclaAnterior = (i == 0) ? null : teclas.ElementAt(i - 1).Value;
         Tecla teclaSiguiente = (i == numTeclas - 1) ? null : teclas.ElementAt(i + 1).Value;
         double posicionX = offsetX + iTeclaBlanca * dimTeclaBlanca.Ancho;
         posicionX += iTeclaBlanca * separacionTeclas;
         ModelVisual3D model = null;
         // tecla blanca
         if (typeof(TeclaBlanca3D) == tecla.GetType())
         {
             if (isTeclaBlanca(teclaAnterior))
             {
                 if (isTeclaBlanca(teclaSiguiente))
                 {
                     //blanca con anterior blanca y siguiente blanca
                     model = DrawTeclaBlancaTipoA(tecla, dimTeclaBlanca, posicionX, BrushesTeclas.Blanco);
                 }
                 else
                 {
                     //blanca con anterior blanca y siguiente negra;
                     model = DrawTeclaBlancaTipoB(tecla, dimTeclaBlanca, dimTeclaNegraConMargen, posicionX, BrushesTeclas.Blanco);
                 }
             }
             else
             {
                 if (isTeclaBlanca(teclaSiguiente))
                 {
                     //blanca con anterior negra y siguiente blanca
                     model = DrawTeclaBlancaTipoC(tecla, dimTeclaBlanca, dimTeclaNegraConMargen, posicionX, BrushesTeclas.Blanco);
                 }
                 else
                 {
                     //blanca con anterior negra y siguiente negra;
                     model = DrawTeclaBlancaTipoD(tecla, dimTeclaBlanca, dimTeclaNegraConMargen, posicionX, BrushesTeclas.Blanco);
                 }
             }
             iTeclaBlanca++;
         }
         else //tecla negra
         {
             posicionX += separacionTeclas;
             model = DrawTeclaNegra(tecla, dimTeclaNegra, posicionX, BrushesTeclas.Negro);
         }
         viewport3D.Children.Add(model);
     }
 }
 public TeclaFactory(Dimensiones dimTeclaBlanca, Dimensiones dimTeclaNegra)
 {
     if (dimTeclaBlanca.Ancho <= dimTeclaNegra.Ancho
         || dimTeclaBlanca.Profundidad <= dimTeclaNegra.Profundidad) {
             throw new System.ArgumentException("El Ancho y Profundidad de la tecla negra deben ser menores a los de la tecla blanca", "dimTeclaNegra");
     }
     if (dimTeclaBlanca.Alto >= dimTeclaNegra.Alto) {
         throw new System.ArgumentException("El Alto de la tecla negra deben ser mayor al de la tecla blanca", "dimTeclaNegra");
     }
     this.dimTeclaBlanca = dimTeclaBlanca;
     this.dimTeclaNegra = dimTeclaNegra;
 }
        public static void Draw(Jugador jugador, Viewport3D viewport3D, Dimensiones dimMano)
        {
            //mano izq
            ModelVisual3D modelManoIzq = DrawMano(jugador, dimMano, Brushes.Blue);
            viewport3D.Children.Add(modelManoIzq);
            jugador.ManoIzquierda = (Model3DGroup)modelManoIzq.Content;

            //mano der
            ModelVisual3D modelManoDer = DrawMano(jugador, dimMano, Brushes.Green);
            viewport3D.Children.Add(modelManoDer);
            jugador.ManoDerecha = (Model3DGroup)modelManoDer.Content;
        }
        /// <summary>
        /// Dibuja una tecla blanca con una tecla anterior blanca y una tecla siguiente blanca
        /// </summary>
        /// <param name="tecla"></param>
        /// <param name="x"></param>
        /// <returns></returns>
        private static ModelVisual3D DrawTeclaNegra(Tecla tecla, Dimensiones dimTeclaNegra, double x, Brush brush)
        {
            x = x - dimTeclaNegra.Ancho / 2;

            Point3D p0 = new Point3D(x , 0, 0);
            Point3D p1 = new Point3D(x + dimTeclaNegra.Ancho, 0, 0);
            Point3D p2 = new Point3D(x + dimTeclaNegra.Ancho, 0, dimTeclaNegra.Profundidad);
            Point3D p3 = new Point3D(x, 0, dimTeclaNegra.Profundidad);
            Point3D p4 = new Point3D(x, dimTeclaNegra.Alto, 0);
            Point3D p5 = new Point3D(x + dimTeclaNegra.Ancho, dimTeclaNegra.Alto, 0);
            Point3D p6 = new Point3D(x + dimTeclaNegra.Ancho, dimTeclaNegra.Alto, dimTeclaNegra.Profundidad);
            Point3D p7 = new Point3D(x, dimTeclaNegra.Alto, dimTeclaNegra.Profundidad);
            //Modelo
            List<Point3D> puntosModelo = new List<Point3D>();
            puntosModelo.Add(p0);
            puntosModelo.Add(p1);
            puntosModelo.Add(p2);
            puntosModelo.Add(p3);
            puntosModelo.Add(p4);
            puntosModelo.Add(p5);
            puntosModelo.Add(p6);
            puntosModelo.Add(p7);
            Model3DGroup teclaModel3D = new Model3DGroup();
            teclaModel3D.Children.Add(DrawCubeModel(x, puntosModelo, brush));

            ModelVisual3D model = new ModelVisual3D();
            model.Content = teclaModel3D;
            tecla.TeclaModel3D = teclaModel3D;
            return model;
        }
        /// <summary>
        ///   Dibuja una tecla blanca con una tecla anterior negra y una tecla siguiente negra
        /// </summary>
        /// <param name="tecla"></param>
        /// <param name="x"></param>
        /// <param name="dimTeclaBlanca"></param>
        /// <param name="dimTeclaNegra"></param>
        /// <returns></returns>
        private static ModelVisual3D DrawTeclaBlancaTipoD(Tecla tecla, Dimensiones dimTeclaBlanca, Dimensiones dimTeclaNegra, double x, Brush brush)
        {
            double mitadAnchoTeclaNegra = dimTeclaNegra.Ancho / 2;
            double diferenciaAncho = dimTeclaBlanca.Ancho - mitadAnchoTeclaNegra;
            //Puntos capa inferior
            Point3D p0 = new Point3D(x + mitadAnchoTeclaNegra, 0, 0);
            Point3D p1 = new Point3D(x + diferenciaAncho, 0, 0);
            Point3D p2 = new Point3D(x + diferenciaAncho, 0, dimTeclaNegra.Profundidad);
            Point3D p3 = new Point3D(x + dimTeclaBlanca.Ancho, 0, dimTeclaNegra.Profundidad);
            Point3D p4 = new Point3D(x + dimTeclaBlanca.Ancho, 0, dimTeclaBlanca.Profundidad);
            Point3D p5 = new Point3D(x, 0, dimTeclaBlanca.Profundidad);
            Point3D p6 = new Point3D(x, 0, dimTeclaNegra.Profundidad);
            Point3D p7 = new Point3D(x + mitadAnchoTeclaNegra, 0, dimTeclaNegra.Profundidad);
            //Puntos capa superior
            Point3D p8 = new Point3D(x + mitadAnchoTeclaNegra, dimTeclaBlanca.Alto, 0);
            Point3D p9 = new Point3D(x + diferenciaAncho, dimTeclaBlanca.Alto, 0);
            Point3D p10 = new Point3D(x + diferenciaAncho, dimTeclaBlanca.Alto, dimTeclaNegra.Profundidad);
            Point3D p11 = new Point3D(x + dimTeclaBlanca.Ancho, dimTeclaBlanca.Alto, dimTeclaNegra.Profundidad);
            Point3D p12 = new Point3D(x + dimTeclaBlanca.Ancho, dimTeclaBlanca.Alto, dimTeclaBlanca.Profundidad);
            Point3D p13 = new Point3D(x, dimTeclaBlanca.Alto, dimTeclaBlanca.Profundidad);
            Point3D p14 = new Point3D(x, dimTeclaBlanca.Alto, dimTeclaNegra.Profundidad);
            Point3D p15 = new Point3D(x + mitadAnchoTeclaNegra, dimTeclaBlanca.Alto, dimTeclaNegra.Profundidad);

            //Modelo trasero
            List<Point3D> puntosModeloTrasero = new List<Point3D>();
            puntosModeloTrasero.Add(p0);
            puntosModeloTrasero.Add(p1);
            puntosModeloTrasero.Add(p2);
            puntosModeloTrasero.Add(p7);
            puntosModeloTrasero.Add(p8);
            puntosModeloTrasero.Add(p9);
            puntosModeloTrasero.Add(p10);
            puntosModeloTrasero.Add(p15);
            Model3DGroup backModel3D = DrawCubeModel(x, puntosModeloTrasero, brush);

            //Modelo delantero
            List<Point3D> puntosModeloDelantero = new List<Point3D>();
            puntosModeloDelantero.Add(p6);
            puntosModeloDelantero.Add(p3);
            puntosModeloDelantero.Add(p4);
            puntosModeloDelantero.Add(p5);
            puntosModeloDelantero.Add(p14);
            puntosModeloDelantero.Add(p11);
            puntosModeloDelantero.Add(p12);
            puntosModeloDelantero.Add(p13);
            Model3DGroup frontModel3D = DrawCubeModel(x, puntosModeloDelantero, brush);

            //Modelo completo
            Model3DGroup teclaModel3D = new Model3DGroup();
            teclaModel3D.Children.Add(backModel3D);
            teclaModel3D.Children.Add(frontModel3D);

            ModelVisual3D model = new ModelVisual3D();
            model.Content = teclaModel3D;
            tecla.TeclaModel3D = teclaModel3D;
            return model;
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // Se ponen dimensiones menores al teclado (x= -14 +14, y= -2 +2, z= 0-12)
            factorConversion = new Dimensiones(12, 1.5, 12);

            juego.SetIniciarSesionCompletedAction(delegate() {
                conectarWS.Content = "Desconectar";
            });

            juego.SetFinalizarSesionCompletedAction(delegate(){
                conectarWS.Content = "Conectar";
            });

            juego.IniciarSesion();

            // Leer el angulo de elavación actual del kinect
            elevationAngleSlider.Value = Kinect.ElevationAngle;

            // Establecer un Action para cuando un frame de video esta listo
            Kinect.BitmapSourceActionForVideo = (Action<BitmapSource>)delegate(BitmapSource bitmapSource)
            {
                videoImage.Source = bitmapSource;
            };

            // Establecer un Action para cuando un frame de profundidad esta listo
            Kinect.BitmapSourceActionForDepth = (Action<BitmapSource>)delegate(BitmapSource bitmapSource)
            {
                depthImage.Source = bitmapSource;
            };

            //Establecer un Action para cuando el skeleton este listo
            Kinect.TrackedUsersActionForSkeleton = (Action<List<KinectUser>>)delegate(List<KinectUser> kinectUsers)
            {
                foreach (KinectUser kinectUser in kinectUsers)
                {
                    juego.UpdatePosition(kinectUser.TrackingID, escalarPosicion(kinectUser.HandLeft), escalarPosicion(kinectUser.HandRight));
                }
            };

            //Establecer un Action para cuando se detecta un usuario nuevo
            Kinect.AddKinectUserAction = (Action<KinectUser>)delegate(KinectUser kinectUser)
            {
                juego.addJugador(kinectUser.TrackingID);
            };

            //Establecer un Action para cuando se deja de detectar un usuario nuevo
            Kinect.RemoveKinectUserAction = (Action<KinectUser>)delegate(KinectUser kinectUser)
            {
                juego.removeJugador(kinectUser.TrackingID);
            };
        }
        private static ModelVisual3D DrawMano(Jugador jugador, Dimensiones dimMano, Brush brush)
        {
            Point3D p0 = new Point3D(0, 0, 0);
            Point3D p1 = new Point3D(dimMano.Ancho, 0, 0);
            Point3D p2 = new Point3D(dimMano.Ancho, 0, dimMano.Profundidad);
            Point3D p3 = new Point3D(0, 0, dimMano.Profundidad);
            Point3D p4 = new Point3D(0, dimMano.Alto, 0);
            Point3D p5 = new Point3D(dimMano.Ancho, dimMano.Alto, 0);
            Point3D p6 = new Point3D(dimMano.Ancho, dimMano.Alto, dimMano.Profundidad);
            Point3D p7 = new Point3D(0, dimMano.Alto, dimMano.Profundidad);
            /*
            //Modelo
            List<Point3D> puntosModelo = new List<Point3D>();
            puntosModelo.Add(p0);
            puntosModelo.Add(p1);
            puntosModelo.Add(p2);
            puntosModelo.Add(p3);
            puntosModelo.Add(p4);
            puntosModelo.Add(p5);
            puntosModelo.Add(p6);
            puntosModelo.Add(p7);

            Model3DGroup manoModel3D = new Model3DGroup();
            manoModel3D.Children.Add(DrawCubeModel(0, puntosModelo, brush));

            ModelVisual3D modelVisual3D = new ModelVisual3D();
            modelVisual3D.Content = manoModel3D;
            return modelVisual3D;
            */

             Model3DGroup cube = new Model3DGroup();
            //front side triangles
            cube.Children.Add(CreateTriangleModel(p3, p2, p6, brush));
            cube.Children.Add(CreateTriangleModel(p3, p6, p7, brush));
            //right side triangles
            cube.Children.Add(CreateTriangleModel(p2, p1, p5, brush));
            cube.Children.Add(CreateTriangleModel(p2, p5, p6, brush));
            //back side triangles
            cube.Children.Add(CreateTriangleModel(p1, p0, p4, brush));
            cube.Children.Add(CreateTriangleModel(p1, p4, p5, brush));
            //left side triangles
            cube.Children.Add(CreateTriangleModel(p0, p3, p7, brush));
            cube.Children.Add(CreateTriangleModel(p0, p7, p4, brush));
            //top side triangles
            cube.Children.Add(CreateTriangleModel(p7, p6, p5, brush));
            cube.Children.Add(CreateTriangleModel(p7, p5, p4, brush));
            //bottom side triangles
            cube.Children.Add(CreateTriangleModel(p2, p3, p0, brush));
            cube.Children.Add(CreateTriangleModel(p2, p0, p1, brush));

            ModelVisual3D model = new ModelVisual3D();
            model.Content = cube;
            return model;

            /*
            Model3DGroup cube = new Model3DGroup();
            cube.Children.Add(CreateTriangleModel(p2, p1, p0, brush));
            cube.Children.Add(CreateTriangleModel(p2, p0, p3, brush));

            ModelVisual3D model = new ModelVisual3D();
            model.Content = cube;
            return model;*/
        }