Пример #1
0
        /// <summary>
        ///     Hacer picking para seleccionar la primitiva mas cercano del ecenario.
        /// </summary>
        /// <param name="additive">En True agrega/quita la primitiva a la seleccion actual</param>
        public void doDirectSelection(bool additive)
        {
            Control.PickingRay.updateRay();

            //Buscar menor colision con primitivas
            var minDistSq = float.MaxValue;
            EditPolyPrimitive closestPrimitive = null;
            TGCVector3        q;
            var i = 0;
            var p = iteratePrimitive(CurrentPrimitive, i);

            while (p != null)
            {
                if (p.intersectRay(Control.PickingRay.Ray, mesh.Transform, out q))
                {
                    var lengthSq = TGCVector3.Subtract(Control.PickingRay.Ray.Origin, q).LengthSq();
                    if (lengthSq < minDistSq)
                    {
                        minDistSq        = lengthSq;
                        closestPrimitive = p;
                    }
                }
                p = iteratePrimitive(CurrentPrimitive, ++i);
            }

            //Agregar
            if (closestPrimitive != null)
            {
                //Sumar a la lista de seleccion
                if (additive)
                {
                    selectOrRemovePrimitiveIfPresent(closestPrimitive);
                }
                //Seleccionar uno solo
                else
                {
                    clearSelection();
                    selectPrimitive(closestPrimitive);
                }
                //activateTranslateGizmo();
            }
            //Nada seleccionado
            else
            {
                //Limpiar seleccion
                clearSelection();
            }

            //Pasar a modo seleccion
            CurrentState = State.SelectObject;
            updateUiPanel();
        }
Пример #2
0
        /// <summary>
        /// Seleccionar todo
        /// </summary>
        public void selectAll()
        {
            clearSelection();
            int i = 0;
            EditPolyPrimitive p = iteratePrimitive(currentPrimitive, i);

            while (p != null)
            {
                selectPrimitive(p);
                p = iteratePrimitive(currentPrimitive, ++i);
            }
            updateUiPanel();
        }
Пример #3
0
 /// <summary>
 ///     Selecciona una sola primitiva pero antes se fija si ya no estaba en la lista de seleccion.
 ///     Si ya estaba, entonces la quita de la lista de seleccion
 /// </summary>
 private void selectOrRemovePrimitiveIfPresent(EditPolyPrimitive p)
 {
     //Ya existe, quitar
     if (SelectionList.Contains(p))
     {
         p.Selected = false;
         SelectionList.Remove(p);
     }
     //No existe, agregar
     else
     {
         p.Selected = true;
         SelectionList.Add(p);
     }
 }
Пример #4
0
 /// <summary>
 ///     Seleccionar una sola primitiva
 /// </summary>
 private void selectPrimitive(EditPolyPrimitive p)
 {
     p.Selected = true;
     SelectionList.Add(p);
 }
Пример #5
0
        /// <summary>
        /// Estado: Cuando se esta arrastrando el mouse para armar el cuadro de seleccion
        /// </summary>
        private void doSelectingObject()
        {
            TgcD3dInput input = GuiController.Instance.D3dInput;

            //Mantiene el mouse apretado
            if (input.buttonDown(TgcD3dInput.MouseButtons.BUTTON_LEFT))
            {
                //Definir recuadro
                Vector2 mousePos = new Vector2(input.Xpos, input.Ypos);
                Vector2 min      = Vector2.Minimize(initMousePos, mousePos);
                Vector2 max      = Vector2.Maximize(initMousePos, mousePos);

                rectMesh.updateMesh(min, max);
            }
            //Solo el mouse
            else if (input.buttonUp(TgcD3dInput.MouseButtons.BUTTON_LEFT))
            {
                //Definir recuadro
                Vector2   mousePos = new Vector2(input.Xpos, input.Ypos);
                Vector2   min      = Vector2.Minimize(initMousePos, mousePos);
                Vector2   max      = Vector2.Maximize(initMousePos, mousePos);
                Rectangle r        = new Rectangle((int)min.X, (int)min.Y, (int)(max.X - min.X), (int)(max.Y - min.Y));

                //Usar recuadro de seleccion solo si tiene un tamaño minimo
                if (r.Width > 1 && r.Height > 1)
                {
                    //Limpiar seleccionar anterior si no estamos agregando en forma aditiva
                    if (!selectiveObjectsAdditive)
                    {
                        clearSelection();
                    }

                    //Buscar que primitivas caen dentro de la seleccion y elegirlos
                    int i = 0;
                    EditPolyPrimitive p = iteratePrimitive(currentPrimitive, i);
                    while (p != null)
                    {
                        //Ver si hay colision contra la proyeccion de la primitiva y el rectangulo 2D
                        Rectangle primRect;
                        if (p.projectToScreen(mesh.Transform, out primRect))
                        {
                            if (r.IntersectsWith(primRect))
                            {
                                //Agregar el objeto en forma aditiva
                                if (selectiveObjectsAdditive)
                                {
                                    selectOrRemovePrimitiveIfPresent(p);
                                }
                                //Agregar el objeto en forma simple
                                else
                                {
                                    selectPrimitive(p);
                                }
                            }
                        }
                        p = iteratePrimitive(currentPrimitive, ++i);
                    }
                }
                //Si el recuadro no tiene tamaño suficiente, hacer seleccion directa
                else
                {
                    doDirectSelection(selectiveObjectsAdditive);
                }

                currentState = State.SelectObject;

                /*
                 * //Si quedo algo seleccionado activar gizmo
                 * if (selectionList.Count > 0)
                 * {
                 *  activateTranslateGizmo();
                 * }
                 */

                //Actualizar panel de Modify con lo que se haya seleccionado, o lo que no
                updateUiPanel();
            }



            //Dibujar recuadro
            rectMesh.render();
        }