/// <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(); }
/// <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(); }
/// <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); } }
/// <summary> /// Seleccionar una sola primitiva /// </summary> private void selectPrimitive(EditPolyPrimitive p) { p.Selected = true; SelectionList.Add(p); }
/// <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(); }