[Bprocessor-commit] gl/src/net/sourceforge/bprocessor/gl/view GLTesselator.java, NONE, 1.1 View.jav
Status: Pre-Alpha
Brought to you by:
henryml
From: Michael L. <he...@us...> - 2009-04-21 10:21:46
|
Update of /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/view In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv18970/src/net/sourceforge/bprocessor/gl/view Modified Files: View.java PopupMenu.java Added Files: GLTesselator.java Removed Files: Tesselator.java Log Message: Export tesselated objects --- NEW FILE: GLTesselator.java --- //--------------------------------------------------------------------------------- // $Id: GLTesselator.java,v 1.1 2009/04/21 10:21:18 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.Tesselator; import net.sourceforge.bprocessor.model.Vertex; /** * Tesselator divides arbitrary surfaces into triangular patches */ public class GLTesselator implements 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 GLTesselator(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) { mode = type; } /** {@inheritDoc} */ public void end() { v0 = null; vi = null; } /** {@inheritDoc} */ @Override public void vertex(Object object) { double[] vertex = (double[]) object; 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); if (s.valid()) { 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) { 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); } } } --- Tesselator.java DELETED --- Index: View.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/view/View.java,v retrieving revision 1.286 retrieving revision 1.287 diff -C2 -d -r1.286 -r1.287 *** View.java 30 Mar 2009 09:16:42 -0000 1.286 --- View.java 21 Apr 2009 10:21:18 -0000 1.287 *************** *** 67,71 **** private boolean enabled; ! private Tesselator tesselator; /** OBJECTS flag */ --- 67,71 ---- private boolean enabled; ! private GLTesselator tesselator; /** OBJECTS flag */ *************** *** 477,481 **** glu = new GLU(); ! tesselator = new Tesselator(glu); --- 477,482 ---- glu = new GLU(); ! tesselator = new GLTesselator(glu); ! Project.getInstance().setTesselator(tesselator); *************** *** 563,566 **** --- 564,571 ---- public void tesselate(Surface surface) { List<Surface> surfaces = tesselator.tesselate(surface); + Vertex normal = surface.normal(); + Container front = surface.getFrontDomain(); + Container back = surface.getBackDomain(); + Container owner = surface.getOwner(); Collection<Surface> holes = new LinkedList(surface.getHoles()); *************** *** 571,575 **** for (Surface current : surfaces) { ! owner.insert(current); } Selection.primary().clear(); --- 576,588 ---- for (Surface current : surfaces) { ! Surface inserted = owner.insert(current); ! Vertex n = inserted.normal(); ! if (n.dot(normal) > 0) { ! inserted.setFrontDomain(front); ! inserted.setBackDomain(back); ! } else { ! inserted.setBackDomain(front); ! inserted.setFrontDomain(back); ! } } Selection.primary().clear(); Index: PopupMenu.java =================================================================== RCS file: /cvsroot/bprocessor/gl/src/net/sourceforge/bprocessor/gl/view/PopupMenu.java,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** PopupMenu.java 16 Apr 2009 11:11:48 -0000 1.28 --- PopupMenu.java 21 Apr 2009 10:21:18 -0000 1.29 *************** *** 368,374 **** Vertex normal = surface.normal(); Vertex origin = surface.center(); - CoordinateSystem system = CoordinateSystem.systemFor(origin, normal); - Container pyramid = Command.Pyramid.pyramid(0.05, 0.05, 0.2); for (Vertex current : pyramid.getVertices()) { --- 368,372 ---- *************** *** 411,434 **** AbstractAction action = new SpaceMenuAction(sp, "Export") { public void actionPerformed(ActionEvent event) { ! List<Surface> surfaces = new LinkedList(space.getEnvelope()); ! List<Edge> edges = new LinkedList(Surface.edges(surfaces)); ! List<Vertex> vertices = new LinkedList(Edge.vertices(edges)); ! ! HashMap<Vertex, Integer> vmap = new HashMap(); ! int count = 1; ! for (Vertex current : vertices) { ! vmap.put(current, count++); ! System.out.println("v " + current.getX() + ! " " + current.getY() + " " + current.getZ()); ! } ! for (Surface current : surfaces) { ! List<Vertex> verts = current.getVertices(); ! System.out.print("f"); ! for (Vertex v : verts) { ! int i = vmap.get(v); ! System.out.print(" " + i); ! } ! System.out.println(); ! } } }; --- 409,413 ---- AbstractAction action = new SpaceMenuAction(sp, "Export") { public void actionPerformed(ActionEvent event) { ! space.export(System.out); } }; |