/** * @param coordinates * @param bbox */ private RenderableQualityModel createRenderableGeometry( Coordinate[] coordinates, float minz, float maxz ) { RenderableQualityModel result = new RenderableQualityModel(); for ( int i = 0; i < coordinates.length - 1; ++i ) { result.addQualityModelPart( createVerticalGeometry( coordinates[i], coordinates[i + 1], minz, maxz ) ); } // the bottom is of no use // result.addQualityModelPart( createHorizontalGeometry( coordinates, minz ) ); // and the top result.addQualityModelPart( createHorizontalGeometry( coordinates, maxz ) ); return result; }
/** * @return the number of ordinates in all qualitylevels, needed for the initialization of the direct buffer. */ public int getOrdinateCount() { int result = 0; if ( qualityLevels != null ) { for ( RenderableQualityModel model : qualityLevels ) { if ( model != null ) { result += model.getOrdinateCount(); } } } return result; }
/** * @param rqm * @param out * @throws IOException */ private void write( RenderableQualityModel rqm, DataOutputStream out ) throws IOException { if ( rqm.getPrototypeReference() != null ) { out.writeInt( QL_PROTO ); write( rqm.getPrototypeReference(), out ); } else { out.writeInt( QL_GEOMETRIES ); ArrayList<RenderableQualityModelPart> qmParts = rqm.getQualityModelParts(); if ( qmParts != null && !qmParts.isEmpty() ) { int size = qmParts.size(); out.writeInt( size ); for ( RenderableQualityModelPart rqmp : rqm.getQualityModelParts() ) { write( rqmp, out ); } } else { out.write( -1 ); } } }
/** * @param in * @return * @throws IOException */ private RenderableQualityModel readQualityModel( DataInputStream in ) throws IOException { int rqNull = in.readInt(); RenderableQualityModel result = null; if ( rqNull != -1 ) { int qlType = in.readInt(); if ( qlType == QL_PROTO ) { PrototypeReference pr = readPrototypeReference( in ); result = new RenderableQualityModel( pr ); } else { int size = in.readInt(); if ( size != -1 ) { ArrayList<RenderableQualityModelPart> qmps = new ArrayList<RenderableQualityModelPart>( size ); for ( int i = 0; i < size; ++i ) { RenderableQualityModelPart p = readRenderableQMPart( in ); if ( p != null ) { qmps.add( p ); } } result = new RenderableQualityModel( qmps ); } } } return result; }
RenderableQualityModel modelQL = building.getQualityLevel( qualityLevel ); if ( modelQL != null ) { modelQL.setPrototype( pr ); } else { modelQL = new RenderableQualityModel( pr );
RenderableQualityModel rqm = rqms[qualityLevel]; if ( rqm != null ) { int ordinates = rqm.getOrdinateCount(); int textureOrdinates = rqm.getTextureOrdinateCount(); info.addOrdinates( -ordinates ); info.addTextureOrdinates( -textureOrdinates );
/** * * @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; }
/** * @return the number of ordinates in all qualitylevels, needed for the initialization of the direct buffer. */ public int getTextureOrdinateCount() { int result = 0; if ( qualityLevels != null ) { for ( RenderableQualityModel model : qualityLevels ) { if ( model != null ) { result += model.getTextureOrdinateCount(); } } } return result; }
if ( rqm == null || rqm.getPrototypeReference() != null ) { throw new IllegalArgumentException( "The given QualityModel: "
@Override public void render( RenderContext glRenderContext ) { this.renderPrepared( glRenderContext, null ); }
result.addQualityModelParts( geometries );
/** * @param mappedColumns * @param values * @return */ private WorldRenderableObject createWRO( Map<Column, Integer> mappedColumns, String[] values ) { float height = parseFloatingPoint( values[mappedColumns.get( Column.HEIGHT )], Column.HEIGHT ); float width = 1; float depth = 1; float northing = parseFloatingPoint( values[mappedColumns.get( Column.NORTHING )], Column.NORTHING ); northing += wpvsTranslationVector[1]; float easting = parseFloatingPoint( values[mappedColumns.get( Column.EASTING )], Column.EASTING ); easting += wpvsTranslationVector[0]; float groundLevel = parseFloatingPoint( values[mappedColumns.get( Column.GROUND_LEVEL )], Column.GROUND_LEVEL ); String protoTypeRef = values[mappedColumns.get( Column.PROTOTYPE )]; float[] location = new float[] { easting, northing, groundLevel }; PrototypeReference reference = new PrototypeReference( protoTypeRef, 0, location, width, height, depth ); RenderableQualityModel[] qualityLevels = new RenderableQualityModel[numberOfLevels]; Envelope env = getEnvelope( location, width, height, depth ); qualityLevels[qualityLevel] = new RenderableQualityModel( reference ); WorldRenderableObject result = new WorldRenderableObject( values[mappedColumns.get( Column.ID )], null, env, qualityLevels ); 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; }
/** * Renders the model at the given quality level or the lesser quality level if the requested one is not available. * * @param level * @param geomBuffer */ private void render( RenderContext glRenderContext, int level, DirectGeometryBuffer geomBuffer ) { if ( qualityLevels != null ) { if ( level >= 0 && qualityLevels.length > level ) { RenderableQualityModel model = qualityLevels[level]; if ( model == null ) { // first find the next less quality for ( int i = level; i >= 0 && model == null; --i ) { model = qualityLevels[i]; } } if ( model != null ) { model.renderPrepared( glRenderContext, geomBuffer ); } } } if ( LOG.isDebugEnabled() ) { debug( glRenderContext ); } }
private static RenderablePrototype createBoxPrototype() { RenderableQualityModel rqm = new RenderableQualityModel(); RenderableGeometry rg = new BOXGeometry(); rqm.addQualityModelPart( rg ); Envelope env = new GeometryFactory().createEnvelope( 0, 0, 1, 1, null ); return new RenderablePrototype( "box", "yeah", env, rqm ); }
return new RenderableQualityModel( results );
float maxY = Float.MIN_VALUE; float maxZ = Float.MIN_VALUE; ArrayList<RenderableQualityModelPart> qualityModelParts = rqm.getQualityModelParts(); for ( RenderableQualityModelPart rqmp : qualityModelParts ) { if ( rqmp != null ) {
if ( fileName != null ) { if ( group.getCapability( Group.ALLOW_CHILDREN_READ ) ) { result = new RenderableQualityModel(); Transform3D initialMatrix = new Transform3D(); if ( doUserRotation ) {
/** * @param rqm * @param bbox * @return */ private RenderableQualityModel createPrototypeReference( RegressionForm form ) { // get 2D projection of 3D object required for calculating convex hull // Coordinate[] coordinates = projectToPlane( rqm ); float angle = form.getRotationAngle(); float width = form.getWidth(); float depth = form.getDepth(); float height = form.getHeight(); return new RenderableQualityModel( new PrototypeReference( "box", angle, form.getCentroid(), width, height, depth ) ); }