[Bprocessor-commit] gl/src/net/sourceforge/bprocessor/gl/view View.java,1.61,1.62
Status: Pre-Alpha
Brought to you by:
henryml
From: Michael L. <he...@us...> - 2006-02-17 14:45:29
|
Update of /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/view In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21382/src/net/sourceforge/bprocessor/gl/view Modified Files: View.java Log Message: New hit-detection algorithm Index: View.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/view/View.java,v retrieving revision 1.61 retrieving revision 1.62 diff -C2 -d -r1.61 -r1.62 *** View.java 14 Feb 2006 11:56:21 -0000 1.61 --- View.java 17 Feb 2006 14:45:19 -0000 1.62 *************** *** 1576,1602 **** } /** ! * Processes the select buffer. A set of entities that should ! * not be considered is specified. ! * @param unWantedEntities the collection og unwanted entities ! * @return the closest hit and null if no hit. */ private List processSelect(Collection unWantedEntities) { - List selection = new LinkedList(); int bufferOffset = 0; int names = 0; long zMax = 0xFFFFFFFFL; double nearest = 1.0; ! double nearestConstructor = 1.0; ! int id = -1; ! Edge closestConstructor = null; ! Object closest = null; ! Object current = null; ! Object candidate = null; ! Set vertices = new HashSet(); ! Set edges = new HashSet(); ! Set constructors = new HashSet(); for (int i = 0; i < hits; i++) { --- 1576,1604 ---- } + /** ! * Process Selection ! * @param unWantedEntities Entities to be ignored ! * @return Selection */ private List processSelect(Collection unWantedEntities) { int bufferOffset = 0; int names = 0; long zMax = 0xFFFFFFFFL; + double nearestSurface = 1.0; + Surface surface = null; + + double nearestVertex = 1.0; + Vertex vertex = null; + + double nearestEdge = 1.0; + Edge edge = null; + double nearest = 1.0; ! Object object = null; ! Collection edges = new HashSet(); ! List result = new LinkedList(); for (int i = 0; i < hits; i++) { *************** *** 1610,1777 **** bufferOffset += 2; ! id = selectBuffer.get(bufferOffset); ! current = getName(id); if (!unWantedEntities.contains(current)) { ! boolean isConstructor = false; ! if (current instanceof Vertex) { ! vertices.add(current); ! } else if (current instanceof Edge) { ! Edge e = (Edge) current; ! if (e.getConstructor()) { ! isConstructor = true; ! constructors.add(e); ! } else { ! edges.add(current); } ! } ! if (isConstructor) { ! if (near < nearestConstructor) { ! nearestConstructor = near; ! closestConstructor = (Edge) current; } } else { if (near < nearest) { ! nearest = near; ! closest = current; } } ! bufferOffset += names; ! } else { ! bufferOffset += 3; ! } } else { bufferOffset += 3; } } - - - if (closest instanceof ClippingPlane) { - selection.add(closest); - return selection; - } ! if (closest instanceof Surface) { ! Surface surface = (Surface) closest; ! CoordinateSystem system = surface.coordinateSystem(); ! ! ! { ! Iterator iter = vertices.iterator(); ! while (iter.hasNext() && (candidate == null)) { ! Vertex v = (Vertex) iter.next(); ! ! Vertex vLocal = system.translate(v); ! ! if (Math.abs(vLocal.getZ()) < 0.0000000001) { ! candidate = v; } } } ! ! { ! Iterator iter = edges.iterator(); ! while (iter.hasNext() && (candidate == null)) { ! Edge e = (Edge) iter.next(); ! Vertex from = e.getFrom(); ! Vertex to = e.getTo(); ! Vertex fromLocal = system.translate(from); ! Vertex toLocal = system.translate(to); ! boolean fromIn = (Math.abs(fromLocal.getZ()) < 0.0000000001); ! boolean toIn = (Math.abs(toLocal.getZ()) < 0.0000000001); ! ! if (fromIn && vertices.contains(from)) { ! candidate = from; ! break; ! } ! ! if (toIn && vertices.contains(to)) { ! candidate = to; ! break; ! } ! if (fromIn && toIn) { ! candidate = e; ! break; } } } } - if (closest instanceof Edge) { - Edge edge = (Edge) closest; - if (vertices.contains(edge.getFrom())) { - candidate = edge.getFrom(); - } - if (vertices.contains(edge.getTo())) { - candidate = edge.getTo(); - } - } - if (candidate != null) { - closest = candidate; - } ! if (closest == null) { ! selection.add(closestConstructor); ! Iterator iter = constructors.iterator(); ! while (iter.hasNext()) { ! Edge c = (Edge) iter.next(); ! if (c != closestConstructor) { ! selection.add(c); } } ! return selection; } else { ! if (closest instanceof Edge) { ! selection.add(closest); ! if (closestConstructor != null) { ! selection.add(closestConstructor); ! Iterator iter = constructors.iterator(); ! while (iter.hasNext()) { ! Edge c = (Edge) iter.next(); ! if (c != closestConstructor) { ! selection.add(c); ! } ! } ! } ! return selection; ! } ! if (closest instanceof Surface) { ! if (nearestConstructor < nearest) { ! if (closestConstructor != null) { ! selection.add(closestConstructor); ! Iterator iter = constructors.iterator(); ! while (iter.hasNext()) { ! Edge c = (Edge) iter.next(); ! if (c != closestConstructor) { ! selection.add(c); ! } ! } ! return selection; ! } } else { ! Surface surface = (Surface) closest; ! CoordinateSystem system = surface.coordinateSystem(); ! Iterator iter = constructors.iterator(); ! while (iter.hasNext()) { ! Edge e = (Edge) iter.next(); ! Vertex from = e.getFrom(); ! Vertex to = e.getTo(); ! Vertex fromLocal = system.translate(from); ! Vertex toLocal = system.translate(to); ! boolean fromIn = (Math.abs(fromLocal.getZ()) < 0.0000000001); ! boolean toIn = (Math.abs(toLocal.getZ()) < 0.0000000001); ! ! if (fromIn && toIn) { ! selection.add(e); ! } ! } ! if (!selection.isEmpty()) { ! return selection; } } } - selection.add(closest); - return selection; } } /** * Gets Entity under a point. For use in selection. --- 1612,1716 ---- bufferOffset += 2; ! int id = selectBuffer.get(bufferOffset); ! bufferOffset += names; ! Object current = getName(id); if (!unWantedEntities.contains(current)) { ! if (current instanceof Surface) { ! if (near < nearestSurface) { ! nearestSurface = near; ! surface = (Surface) current; ! if (near < nearest) { ! object = null; ! } } ! } else if (current instanceof Vertex) { ! if (near < nearestVertex) { ! nearestVertex = near; ! vertex = (Vertex) current; ! if (near < nearest) { ! object = null; ! } ! } ! } else if (current instanceof Edge) { ! edges.add(current); ! if (near < nearestEdge) { ! nearestEdge = near; ! edge = (Edge) current; ! if (near < nearest) { ! object = null; ! } } } else { if (near < nearest) { ! object = current; } } ! if (near < nearest) { ! nearest = near; ! } ! } } else { bufferOffset += 3; } } ! ! ! ! if (surface != null) { ! // Test vertex and edge against surface ! Plane plane = surface.plane(); ! if (vertex != null) { ! if (nearestSurface < nearestVertex) { ! if (!plane.contains(vertex)) { ! vertex = null; } } } ! if (edge != null) { ! if (nearestSurface < nearestEdge) { ! if (!plane.contains(edge)) { ! edge = null; } } } } ! ! ! if (edge != null && vertex != null) { ! // Test edge and vertex against each other ! if (nearestEdge < nearestVertex) { ! if (!edge.intersects(vertex)) { ! vertex = null; ! } else { ! edge = null; } } ! } ! ! ! if (object != null) { ! result.add(object); } else { ! if (vertex != null) { ! result.add(vertex); ! } else { ! if (edge != null) { ! result.add(edge); ! edges.remove(edge); ! result.addAll(edges); } else { ! if (surface != null) { ! result.add(surface); } } } } + return result; } + + /** * Gets Entity under a point. For use in selection. |