Пример #1
0
        public override void setSelected(bool selected)
        {
            this.selected = selected;
            Color color = selected ? MeshCreatorUtils.SELECTED_OBJECT_COLOR : MeshCreatorUtils.UNSELECTED_OBJECT_COLOR;

            // mesh.BoundingSphere.setRenderColor(color);
            bb.setRenderColor(color);
        }
Пример #2
0
        public override void render(float elapsedTime)
        {
            TgcModifiers modifiers = GuiController.Instance.Modifiers;
            Vector2      size      = (Vector2)modifiers.getValue("size");
            Vector3      position  = (Vector3)modifiers.getValue("position");

            collider.Center = position;
            collider.Radius = size.X;
            collider.Length = size.Y;

            if (TgcCollisionUtils.testSphereCylinder(collisionableSphere, collider))
            {
                collisionableSphere.setRenderColor(collisionColor);
            }
            else
            {
                collisionableSphere.setRenderColor(noCollisionColor);
            }

            if (TgcCollisionUtils.testAABBCylinder(collisionableAABB, collider))
            {
                collisionableAABB.setRenderColor(collisionColor);
            }
            else
            {
                collisionableAABB.setRenderColor(noCollisionColor);
            }

            if (TgcCollisionUtils.testCylinderCylinder(collisionableCylinder, collider))
            {
                collisionableCylinder.setRenderColor(collisionColor);
            }
            else
            {
                collisionableCylinder.setRenderColor(noCollisionColor);
            }


            collider.render();
            collisionableSphere.render();
            collisionableAABB.render();
            collisionableCylinder.render();
        }
        public override void render(float elapsedTime)
        {
            TgcModifiers modifiers = GuiController.Instance.Modifiers;
            Vector2      size      = (Vector2)modifiers.getValue("size");
            Vector3      position  = (Vector3)modifiers.getValue("position");

            collider.Center = position;
            collider.Radius = size.X;
            collider.Length = size.Y;

            collider.updateValues();

            if (TgcCollisionUtils.testSphereCylinder(collisionableSphere, collider))
            {
                collisionableSphere.setRenderColor(collisionColor);
            }
            else
            {
                collisionableSphere.setRenderColor(noCollisionColor);
            }

            if (TgcCollisionUtils.testAABBCylinder(collisionableAABB, collider))
            {
                collisionableAABB.setRenderColor(collisionColor);
            }
            else
            {
                collisionableAABB.setRenderColor(noCollisionColor);
            }

            if (TgcCollisionUtils.testCylinderCylinder(collisionableCylinder, collider))
            {
                collisionableCylinder.setRenderColor(collisionColor);
            }
            else
            {
                collisionableCylinder.setRenderColor(noCollisionColor);
            }

            if (pickingTimeLeft > 0)
            {
                pickingTimeLeft -= elapsedTime;
            }
            else
            {
                collider.setRenderColor(noCollisionColor);
            }

            if (GuiController.Instance.D3dInput.buttonPressed(TgcViewer.Utils.Input.TgcD3dInput.MouseButtons.BUTTON_LEFT))
            {
                TgcPickingRay pickingRay = new TgcPickingRay();
                pickingRay.updateRay();
                if (TgcCollisionUtils.testRayCylinder(pickingRay.Ray, collider))
                {
                    pickingTimeLeft = PICKING_TIME;
                    collider.setRenderColor(pickingColor);
                }
            }

            collider.render();
            collisionableSphere.render();
            collisionableAABB.render();
            collisionableCylinder.render();
        }
Пример #4
0
        /// <summary>
        /// Crea la malla de un terreno en base a un Heightmap
        /// </summary>
        /// <param name="heightmapPath">Imagen de Heightmap</param>
        /// <param name="scaleXZ">Escala para los ejes X y Z</param>
        /// <param name="scaleY">Escala para el eje Y</param>
        /// <param name="center">Centro de la malla del terreno</param>
        /// <param name="divisiones">Cantidad de filas y columnas en las que se va a dividir el terreno</param>
        public void loadHeightmap(string heightmapPath, float scaleXZ, float scaleY, Vector3 center, int divisiones)
        {
            Device d3dDevice = GuiController.Instance.D3dDevice;

            this.center = center;
            TgcBoundingBox box;

            vbTerrains    = new List <VertexBuffer>();
            boundingBoxes = new List <TgcBoundingBox>();

            //Dispose de VertexBuffer anterior, si habia
            foreach (VertexBuffer vbTerrain in vbTerrains)
            {
                if (vbTerrain != null && !vbTerrain.Disposed)
                {
                    vbTerrain.Dispose();
                }
            }
            vbTerrains.Clear();

            //cargar heightmap
            heightmapData = loadHeightMap(d3dDevice, heightmapPath);
            float width  = (float)heightmapData.GetLength(0);
            float length = (float)heightmapData.GetLength(1);


            //Crear vertexBuffer
            float nodeWidth  = (width / divisiones);
            float nodeLength = (length / divisiones);

            for (int x = 0; x < divisiones; x++)
            {
                for (int z = 0; z < divisiones; z++)
                {
                    VertexBuffer vbTerrain;

                    totalVertices = 2 * 3 * ((int)nodeWidth - 1) * ((int)nodeLength - 1);
                    vbTerrain     = new VertexBuffer(typeof(CustomVertex.PositionTextured), totalVertices, d3dDevice, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionTextured.Format, Pool.Default);

                    //Cargar vertices
                    int     dataIdx = 0;
                    Vector3 pMin    = Vector3.Empty;
                    Vector3 pMax    = Vector3.Empty;
                    CustomVertex.PositionTextured[] data = new CustomVertex.PositionTextured[totalVertices];
                    Vector3 currentCenter;
                    currentCenter.X = center.X * scaleXZ - (width / 2) * scaleXZ;
                    currentCenter.Y = center.Y * scaleY;
                    currentCenter.Z = center.Z * scaleXZ - (length / 2) * scaleXZ;

                    for (int k = 0; k < (nodeWidth) - 1; k++)
                    {
                        for (int l = 0; l < (nodeLength) - 1; l++)
                        {
                            int i = k + (x * ((int)nodeWidth - 1));
                            int j = l + (z * ((int)nodeLength - 1));
                            //Vertices
                            Vector3 v1 = new Vector3(currentCenter.X + i * scaleXZ, currentCenter.Y + heightmapData[i, j] * scaleY, currentCenter.Z + j * scaleXZ);
                            Vector3 v2 = new Vector3(currentCenter.X + i * scaleXZ, currentCenter.Y + heightmapData[i, j + 1] * scaleY, currentCenter.Z + (j + 1) * scaleXZ);
                            Vector3 v3 = new Vector3(currentCenter.X + (i + 1) * scaleXZ, currentCenter.Y + heightmapData[i + 1, j] * scaleY, currentCenter.Z + j * scaleXZ);
                            Vector3 v4 = new Vector3(currentCenter.X + (i + 1) * scaleXZ, currentCenter.Y + heightmapData[i + 1, j + 1] * scaleY, currentCenter.Z + (j + 1) * scaleXZ);

                            //Coordendas de textura
                            Vector2 t1 = new Vector2(i / nodeWidth, j / nodeLength);
                            Vector2 t2 = new Vector2(i / nodeWidth, (j + 1) / nodeLength);
                            Vector2 t3 = new Vector2((i + 1) / nodeWidth, j / nodeLength);
                            Vector2 t4 = new Vector2((i + 1) / nodeWidth, (j + 1) / nodeLength);

                            //Cargar triangulo 1
                            data[dataIdx]     = new CustomVertex.PositionTextured(v1, t1.X, t1.Y);
                            data[dataIdx + 1] = new CustomVertex.PositionTextured(v2, t2.X, t2.Y);
                            data[dataIdx + 2] = new CustomVertex.PositionTextured(v4, t4.X, t4.Y);

                            //Cargar triangulo 2
                            data[dataIdx + 3] = new CustomVertex.PositionTextured(v1, t1.X, t1.Y);
                            data[dataIdx + 4] = new CustomVertex.PositionTextured(v4, t4.X, t4.Y);
                            data[dataIdx + 5] = new CustomVertex.PositionTextured(v3, t3.X, t3.Y);

                            dataIdx += 6;

                            if (k == 0 && l == 0)
                            {
                                pMin   = v1;
                                pMin.Y = 0;
                            }
                            if (k == (nodeLength) - 2 && l == (nodeLength) - 2)
                            {
                                pMax   = v4;
                                pMax.Y = 1500;
                            }
                        }
                    }

                    vbTerrain.SetData(data, 0, LockFlags.None);
                    vbTerrains.Add(vbTerrain);
                    //vbTerrain.Dispose();

                    box = new TgcBoundingBox(pMin, pMax);
                    box.setRenderColor(Color.Red);
                    boundingBoxes.Add(box);
                }
            }
        }
Пример #5
0
        public bool colisionar(TgcBoundingBox objeto, List <Vector3> centros)
        {
            if (objeto.Position.Y - (centros[0].Y + escalaY) - tolerancia > EPSILON)
            {//si esta lejos en el eje y, no tiene sentido testear lo demas.
                objeto.setRenderColor(Color.Yellow);
                return(false);
            }
            objeto.setRenderColor(Color.Red);
            centros_probables.Clear();
            if (objeto.Position.Y < 0)
            {
                return(true);
            }                                           //Si el avion avanza demasiado rápido  y no se llega a checkear la colisión
            foreach (Vector3 centro in centros)
            {
                if ((Math.Pow(objeto.Position.X - centro.X, 2) + Math.Pow(objeto.Position.Z - centro.Z, 2)) - Math.Pow(tamanio_terrenos / 2, 2) < EPSILON)
                {//si el centro esta cerca en altura, y en horizontal lo guardo para colisionar
                    centros_probables.Add(centro);
                }
            }

            //veo si colisionan los terrenos
            Vector3        nuevaPosicion;
            List <Vector3> verticesEnEsfera = new List <Vector3>();
            TgcBoundingBox bounding         = objeto.clone();

            foreach (Vector3 centro in centros_probables)
            {
                //desplazo el avion en vez del terreno para testear colisiones
                nuevaPosicion = Vector3.Subtract(objeto.Position, centro);

                bounding.move(Vector3.Multiply(centro, -1f));
                verticesEnEsfera.Clear();
                TgcBoundingSphere esfera   = new TgcBoundingSphere(nuevaPosicion, tolerancia);
                Vector3           colision = new Vector3();
                for (int i = 0; i < verticesTerreno.Length; i += 3)
                {
                    if (TgcCollisionUtils.testSphereTriangle(esfera, verticesTerreno[i].Position, verticesTerreno[i + 1].Position, verticesTerreno[i + 2].Position, out colision))
                    {
                        if (TgcCollisionUtils.testTriangleAABB(verticesTerreno[i].Position, verticesTerreno[i + 1].Position, verticesTerreno[i + 2].Position, bounding))
                        {
                            return(true);
                        }
                    }
                }

                /*
                 * foreach (CustomVertex.PositionTextured vertice in verticesTerreno)
                 * {
                 *  if ( Vector3.LengthSq(Vector3.Subtract(nuevaPosicion,vertice.Position)) - toleranciaSQ < EPSILON)
                 *  {
                 *      verticesEnEsfera.Add(vertice.Position);
                 *  }
                 * }
                 *
                 * foreach (Vector3 vertice in verticesEnEsfera)
                 * {
                 *  if (TgcCollisionUtils.sqDistPointAABB(vertice, bounding) < EPSILON)
                 *  {
                 *      return true;
                 *  }
                 * }*/
            }
            return(false);
        }
        public override void Render()
        {
            PreRender();

            var size     = (Vector2)Modifiers.getValue("size");
            var position = (Vector3)Modifiers.getValue("position");

            collider.Center = position;
            collider.Radius = size.X;
            collider.Length = size.Y;

            collider.updateValues();

            if (TgcCollisionUtils.testSphereCylinder(collisionableSphere, collider))
            {
                collisionableSphere.setRenderColor(collisionColor);
            }
            else
            {
                collisionableSphere.setRenderColor(noCollisionColor);
            }

            if (TgcCollisionUtils.testAABBCylinder(collisionableAABB, collider))
            {
                collisionableAABB.setRenderColor(collisionColor);
            }
            else
            {
                collisionableAABB.setRenderColor(noCollisionColor);
            }

            if (TgcCollisionUtils.testCylinderCylinder(collisionableCylinder, collider))
            {
                collisionableCylinder.setRenderColor(collisionColor);
            }
            else
            {
                collisionableCylinder.setRenderColor(noCollisionColor);
            }

            if (pickingTimeLeft > 0)
            {
                pickingTimeLeft -= ElapsedTime;
            }
            else
            {
                collider.setRenderColor(noCollisionColor);
            }

            if (TgcD3dInput.Instance.buttonPressed(TgcD3dInput.MouseButtons.BUTTON_LEFT))
            {
                var pickingRay = new TgcPickingRay();
                pickingRay.updateRay();
                if (TgcCollisionUtils.testRayCylinder(pickingRay.Ray, collider))
                {
                    pickingTimeLeft = PICKING_TIME;
                    collider.setRenderColor(pickingColor);
                }
            }

            collider.render();
            collisionableSphere.render();
            collisionableAABB.render();
            collisionableCylinder.render();

            PostRender();
        }