[Bprocessor-commit] gl/src/net/sourceforge/bprocessor/gl/view Tesselator.java, NONE, 1.1 View.java,
Status: Pre-Alpha
Brought to you by:
henryml
From: Michael L. <he...@us...> - 2009-03-30 09:16:51
|
Update of /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/view In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv23329/src/net/sourceforge/bprocessor/gl/view Modified Files: View.java PopupMenu.java Added Files: Tesselator.java Log Message: Tesselation implemented --- NEW FILE: Tesselator.java --- //--------------------------------------------------------------------------------- // $Id: Tesselator.java,v 1.1 2009/03/30 09:16:42 henryml Exp $ // // Copyright (c) 2005 The BProcessor Team (http://bprocessor.sourceforge.net) // Released under the Lesser GNU Public License v2.1 //--------------------------------------------------------------------------------- package net.sourceforge.bprocessor.gl.view; import java.util.LinkedList; import java.util.List; import javax.media.opengl.GL; import javax.media.opengl.glu.GLU; import javax.media.opengl.glu.GLUtessellator; import javax.media.opengl.glu.GLUtessellatorCallback; import javax.media.opengl.glu.GLUtessellatorCallbackAdapter; import net.sourceforge.bprocessor.model.Edge; import net.sourceforge.bprocessor.model.Surface; import net.sourceforge.bprocessor.model.Vertex; /** * Tesselator divides arbitrary surfaces into triangular patches */ public class Tesselator { private static GLUtessellator tesselator; private static GLU glu; private static Vertex v0; private static Vertex vi; private static List<Surface> triangles; private static int mode; /** * * @param g GLU */ public Tesselator(GLU g) { tesselator = g.gluNewTess(); glu = g; GLUtessellatorCallback callback = new TesselatorCallback(); glu.gluTessCallback(tesselator, GLU.GLU_TESS_BEGIN, callback); glu.gluTessCallback(tesselator, GLU.GLU_TESS_END, callback); glu.gluTessCallback(tesselator, GLU.GLU_TESS_VERTEX, callback); glu.gluTessProperty(tesselator, GLU.GLU_TESS_WINDING_RULE, GLU.GLU_TESS_WINDING_ODD); } private static class TesselatorCallback extends GLUtessellatorCallbackAdapter { /** {@inheritDoc} */ public void begin(int type) { System.out.print("begin "); mode = type; if (type == GL.GL_TRIANGLES) { System.out.println("triangles"); } else if (type == GL.GL_TRIANGLE_STRIP) { System.out.println("triangle-strip"); } else if (type == GL.GL_TRIANGLE_FAN) { System.out.println("triangle-fan"); } else { System.out.println(type); } } /** {@inheritDoc} */ public void end() { System.out.println("end "); v0 = null; vi = null; } /** {@inheritDoc} */ @Override public void vertex(Object object) { double[] vertex = (double[]) object; System.out.println(" " + vertex[0] + ", " + vertex[1] + ", " + vertex[2]); Vertex current = new Vertex(vertex); if (v0 == null) { v0 = current; } else if (vi == null) { vi = current; } else { if (mode == GL.GL_TRIANGLE_FAN || mode == GL.GL_TRIANGLE_STRIP || mode == GL.GL_TRIANGLES) { Edge e0 = new Edge(v0, vi); Edge e1 = new Edge(vi, current); Edge e2 = new Edge(current, v0); List<Edge> edges = new LinkedList(); edges.add(e0); edges.add(e1); edges.add(e2); Surface s = new Surface(edges); triangles.add(s); if (mode == GL.GL_TRIANGLE_FAN) { vi = current; } else if (mode == GL.GL_TRIANGLE_STRIP) { v0 = vi; vi = current; } else if (mode == GL.GL_TRIANGLES) { v0 = null; vi = null; } } } } /** {@inheritDoc} */ @Override public void error(int arg0) { System.out.println(glu.gluErrorString(arg0)); } } /** * Tesselates a surface * @param surface Surface to tesselate * @return List of triangular surfaces */ public List<Surface> tesselate(Surface surface) { System.out.println("Tesselate " + surface); triangles = new LinkedList(); glu.gluTessBeginPolygon(tesselator, null); drawContour(surface); for (Surface current : surface.getHoles()) { if (surface.getOwner() == current.getOwner()) { drawContour(current); } } glu.gluTessEndPolygon(tesselator); return triangles; } private static void drawContour(Surface surface) { List<Vertex> vertices = surface.getVertices(); if (vertices.size() > 2) { vertices.add(vertices.get(0)); glu.gluTessBeginContour(tesselator); for (Vertex current : vertices) { double[] content = current.values(); glu.gluTessVertex(tesselator, content, 0, content); } glu.gluTessEndContour(tesselator); } } } Index: View.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/view/View.java,v retrieving revision 1.285 retrieving revision 1.286 diff -C2 -d -r1.285 -r1.286 *** View.java 17 Feb 2009 11:08:27 -0000 1.285 --- View.java 30 Mar 2009 09:16:42 -0000 1.286 *************** *** 66,69 **** --- 66,71 ---- private boolean enabled; + + private Tesselator tesselator; /** OBJECTS flag */ *************** *** 475,478 **** --- 477,483 ---- glu = new GLU(); + tesselator = new Tesselator(glu); + + int[] maxplanes = new int[1]; gl.glGetIntegerv(GL.GL_MAX_CLIP_PLANES, maxplanes, 0); *************** *** 553,556 **** --- 558,581 ---- /** + * + * @param surface Surface + */ + public void tesselate(Surface surface) { + List<Surface> surfaces = tesselator.tesselate(surface); + Container owner = surface.getOwner(); + Collection<Surface> holes = new LinkedList(surface.getHoles()); + for (Surface hole : holes) { + hole.erase(); + } + surface.erase(); + + for (Surface current : surfaces) { + owner.insert(current); + } + Selection.primary().clear(); + Project.getInstance().changed(Project.getInstance()); + } + + /** * Apply edge attributes * @param attributes the new attributes Index: PopupMenu.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/view/PopupMenu.java,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** PopupMenu.java 3 Nov 2008 14:26:15 -0000 1.25 --- PopupMenu.java 30 Mar 2009 09:16:42 -0000 1.26 *************** *** 183,186 **** --- 183,195 ---- menu.add(action); } + { + AbstractAction action = new GeometricMenuAction(surfaces, "Tesselate") { + public void actionPerformed(ActionEvent event) { + Surface surface = (Surface) entities.iterator().next(); + editor.getView().tesselate(surface); + } + }; + menu.add(action); + } } return menu; *************** *** 388,392 **** menu.add(action); } ! if (CHECKS) { AbstractAction check = new SpaceMenuAction(sp, "Consistency Check") { --- 397,411 ---- menu.add(action); } ! { ! AbstractAction action = new SpaceMenuAction(sp, "Tesselate") { ! public void actionPerformed(ActionEvent event) { ! Collection<Surface> surfaces = new LinkedList(space.getEnvelope()); ! for (Surface current : surfaces) { ! editor.getView().tesselate(current); ! } ! } ! }; ! menu.add(action); ! } if (CHECKS) { AbstractAction check = new SpaceMenuAction(sp, "Consistency Check") { |