/** * Create a renderable geometry from the given {@link SimpleAccessGeometry} by tesselating it. * * @param originalGeometry * may not be null. * @return the {@link RenderableGeometry} or <code>null</code> if the given geometry could not be triangulated. */ public final RenderableGeometry tesselateGeometry( SimpleAccessGeometry originalGeometry ) { GLUtessellator tess = glu.gluNewTess(); if ( originalGeometry == null ) { throw new NullPointerException( "The original geometry may not be null" ); } GeometryCallBack callBack = createAndRegisterCallBack( tess, originalGeometry ); RenderableGeometry result = tesselatePolygon( tess, callBack ); if ( result != null && LOG.isTraceEnabled() ) { LOG.trace( "Resulting renderable has " + result.getVertexCount() + " number of vertices." ); } glu.gluDeleteTess( tess ); return result; }
/** * * @param rqm * @return List of points of a 3D object projected onto x/y-plane */ private Coordinate[] projectToPlane( RenderableQualityModel rqm ) { int length = 0; for ( RenderableQualityModelPart qmp : rqm.getQualityModelParts() ) { length += ( (RenderableGeometry) qmp ).getVertexCount(); } Coordinate[] coords = new Coordinate[length]; int i = 0; for ( RenderableQualityModelPart qmp : rqm.getQualityModelParts() ) { RenderableGeometry rg = (RenderableGeometry) qmp; FloatBuffer coordBuffer = rg.getReadOnlyCoordBuffer(); coordBuffer.rewind(); int cap = coordBuffer.capacity(); while ( coordBuffer.position() < cap ) { coords[i++] = new Coordinate( coordBuffer.get(), coordBuffer.get() ); // ignore z. coordBuffer.get(); } } return coords; }
/** * * @param rqm * @return List of points of a 3D object projected onto x/y-plane */ private float[] retrieveCoords( RenderableQualityModel rqm ) { int length = 0; for ( RenderableQualityModelPart qmp : rqm.getQualityModelParts() ) { length += ( (RenderableGeometry) qmp ).getVertexCount(); } float[] coords = new float[length * 3]; int i = 0; for ( RenderableQualityModelPart qmp : rqm.getQualityModelParts() ) { RenderableGeometry rg = (RenderableGeometry) qmp; FloatBuffer coordBuffer = rg.getReadOnlyCoordBuffer(); coordBuffer.rewind(); int cap = coordBuffer.capacity(); while ( coordBuffer.position() < cap ) { coords[i++] = coordBuffer.get(); coords[i++] = coordBuffer.get(); coords[i++] = coordBuffer.get(); } } return coords; }
RenderableGeometry result = tesselatePolygon( tess, callBack ); if ( result != null ) { LOG.trace( "Resulting renderable has " + result.getVertexCount() + " number of vertices." ); results.add( result );