Exemplo n.º 1
0
        /// <summary>
        ///     Actualiza los parametros de la caja en base a lo cargado por el usuario
        /// </summary>
        private void updateQuad()
        {
            var size   = sizeModifier.Value;
            var normal = normalModifier.Value;
            var center = centerModifier.Value;
            var color  = colorModifier.Value;

            //Cargar valores del quad.
            quad.Center = center;
            quad.Size   = size;
            quad.Normal = normal;
            quad.Color  = color;

            //Actualizar valors para hacerlos efectivos
            //Los quad actualizan el vertexBuffer, al ser solo 2 triangulos no tiene gran costo recalcular los valores,
            //pero es mas recomendado utilizar transformaciones
            quad.updateValues();

            //Actualizar valores de la flecha
            if (showNormalModifier.Value)
            {
                normalArrow.PStart = quad.Center;
                normalArrow.PEnd   = quad.Center + quad.Normal * 10;
                normalArrow.updateValues();
            }
        }
        private void CrearQuad(TGCVector3 centro, Color color)
        {
            quad        = new TGCQuad();
            quad.Center = centro;
            quad.Size   = new TGCVector2(sizeX, sizeY);
            quad.Normal = new TGCVector3(0, 0, 1);
            quad.Color  = color;
            quad.updateValues();
            var s = quad.Size * 0.5f;

            AABB = new TgcBoundingAxisAlignBox(new TGCVector3(centro.X - sizeX / 2, centro.Y - sizeY / 2, centro.Z), new TGCVector3(centro.X + sizeX / 2, centro.Y + sizeY / 2, centro.Z));
        }
        public QuadButton(TGCVector3 pos, float X, float Y, string text, ClickDelegate onClick, Color color, float sizeX = 50, float sizeY = 4)
        {
            quad        = new TGC.Core.Geometry.TGCQuad();
            quad.Center = new TGCVector3(pos.X + X, pos.Y - 50, pos.Z + Y);
            quad.Size   = new TGCVector2(sizeX, sizeY);
            quad.Normal = new TGCVector3(0, 1, 0);
            quad.Color  = color;
            quad.updateValues();
            var s = quad.Size * 0.5f;

            aabb = new TgcBoundingAxisAlignBox(quad.Center - new TGCVector3(s.X, 0, s.Y), quad.Center + new TGCVector3(s.X, 0, s.Y), quad.Center, new TGCVector3(1, 1, 1));
            x    = (int)(X * 650 / 50 + 525);
            //x = (int)(X* 650 / 20 + 650 - font.Size/5*text.Length);
            y            = (int)(Y * 350 / 20 + 350);
            this.onClick = onClick;
            this.text    = text;
        }
        public override void Init()
        {
            //Cargar un mesh
            var loader = new TgcSceneLoader();
            var scene  = loader.loadSceneFromFile(MediaDir + "MeshCreator\\Meshes\\Cimientos\\PilarEgipcio\\PilarEgipcio-TgcScene.xml");

            mesh = scene.Meshes[0];

            //Obtener los vértices del mesh (esta operacion es lenta, copia de la GPU a la CPU, no hacer a cada rato)
            var vertices = mesh.getVertexPositions();

            //Iterar sobre todos los vertices y construir triangulos, normales y planos
            var triCount = vertices.Length / 3;

            triangles = new List <TgcTriangle>(triCount);
            normals   = new List <TgcArrow>();
            planes    = new List <TGCQuad>();
            for (var i = 0; i < triCount; i++)
            {
                //Obtenemos los 3 vertices del triangulo, es importante saber como esta estructurado nuestro mesh.
                var a = vertices[i * 3];
                var b = vertices[i * 3 + 1];
                var c = vertices[i * 3 + 2];

                //Obtener normal del triangulo. El orden influye en si obtenemos el vector normal hacia adentro o hacia afuera del mesh
                var normal = TGCVector3.Cross(c - a, b - a);
                normal.Normalize();

                //Crear plano que contiene el triangulo a partir un vertice y la normal
                var plane = TGCPlane.FromPointNormal(a, normal);

                //Calcular el centro del triangulo. Hay muchos tipos de centros para un triangulo (http://www.mathopenref.com/trianglecenters.html)
                //Aca calculamos el mas simple
                var center = TGCVector3.Scale(a + b + c, 1 / 3f);

                ///////////// Creacion de elementos para poder dibujar a pantalla (propios de este ejemplo) ///////////////

                //Crear un quad (pequeno plano) con la clase TgcQuad para poder dibujar el plano que contiene al triangulo
                var quad = new TGCQuad();
                quad.Center = center;
                quad.Normal = normal;
                quad.Color  = adaptColorRandom(Color.DarkGreen);
                quad.Size   = new TGCVector2(10, 10);
                quad.updateValues();
                planes.Add(quad);

                //Creamos una flecha con la clase TgcArrow para poder dibujar la normal (la normal la estiramos un poco para que se pueda ver)
                normals.Add(TgcArrow.fromDirection(center, TGCVector3.Scale(normal, 10f)));

                //Creamos la clase TgcTriangle que es un helper para dibujar triangulos sueltos
                var t = new TgcTriangle();
                t.A     = a;
                t.B     = b;
                t.C     = c;
                t.Color = adaptColorRandom(Color.Red);
                t.updateValues();
                triangles.Add(t);
            }

            //Modifiers
            meshModifier      = AddBoolean("mesh", "mesh", true);
            trianglesModifier = AddBoolean("triangles", "triangles", true);
            normalsModifier   = AddBoolean("normals", "normals", true);
            planesModifier    = AddBoolean("planes", "planes", false);

            //Camara
            Camera = new TgcRotationalCamera(mesh.BoundingBox.calculateBoxCenter(), mesh.BoundingBox.calculateBoxRadius() * 2, Input);
        }