protected virtual void processCompletedTask(CellCompiler task) { if (task.getResult().isOK() && task.getResultNode()) { if (!lod.valid()) { lod = new osg.LOD(); } uint key = uint.Parse(task.getName()); MapLayerLevelOfDetail def = getLodForKey(key, getMapLayer()); if (def != null) { lod.addChild(task.getResultNode(), def.getMinRange(), def.getMaxRange()); } } }
public Node compile(FeatureLayer layer, FeatureCursor cursor, string output_file) { osg.Node *result = NULL; if (!layer) { osgGIS.notify(osg.WARN) << "Illegal null feature layer" << std.endl; return(NULL); } osg.ref_ptr <osg.LOD> lod = new osg.LOD(); if (getFadeLODs()) { FadeHelper.enableFading(lod.getOrCreateStateSet()); } for (FilterGraphRangeList.iterator i = graph_ranges.begin(); i != graph_ranges.end(); i++) { osg.Node *range = compile(layer, cursor, i.graph.get()); if (range) { lod.addChild(range, i.min_range, i.max_range); if (getFadeLODs()) { FadeHelper.setOuterFadeDistance(i.max_range, range.getOrCreateStateSet()); FadeHelper.setInnerFadeDistance(i.max_range - .2 * (i.max_range - i.min_range), range.getOrCreateStateSet()); } } } if (GeomUtils.hasDrawables(lod.get())) { if (getOverlay()) { result = convertToOverlay(lod.get()); } else { result = lod.release(); } osgUtil.Optimizer opt; opt.optimize(result, osgUtil.Optimizer.SPATIALIZE_GROUPS | osgUtil.Optimizer.STATIC_OBJECT_DETECTION | osgUtil.Optimizer.SHARE_DUPLICATE_STATE); if (getRenderOrder() >= 0) { string bin_name = result.getOrCreateStateSet().getBinName(); result.getOrCreateStateSet().setRenderBinDetails(getRenderOrder(), bin_name); result.getOrCreateStateSet().setAttributeAndModes(new osg.Depth(osg.Depth.ALWAYS), osg.StateAttribute.ON); } localizeResourceReferences(result); if (output_file.length() > 0) { localizeResources(osgDB.getFilePath(output_file)); } } return(result); }
protected void setCenterAndRadius(osg.Node node, GeoExtent cell_extent, SmartReadCallback reader) { SpatialReference srs = map_layer.getOutputSRS(getSession(), getTerrainSRS()); // first get the output srs centroid: GeoPoint centroid = srs.transform(cell_extent.getCentroid()); GeoPoint sw = srs.transform(cell_extent.getSouthwest()); double radius = map_layer.getEncodeCellRadius() ? (centroid - sw).length() : -1.0; if (terrain_node.valid() && terrain_srs != null) { GeoPoint clamped; for (int t = 0; t < 5; t++) { clamped = GeomUtils.clampToTerrain(centroid, terrain_node.get(), terrain_srs, reader); if (!clamped.isValid()) { // if the clamp failed, it's due to the geocentric intersection bug in which the isect // fails when coplanar with a tile boundary/skirt. Fudge the centroid and try again. double fudge = 0.001 * ((double)(1 + (Random.Rand() % 10))); centroid.X += fudge; centroid.Y -= fudge; centroid.Z += fudge * fudge; } else { break; } } if (!clamped.isValid()) { SpatialReference geo = srs.getGeographicSRS(); GeoPoint latlon = geo.transform(centroid); //osgGIS.warn() << "*** UNABLE TO CLAMP CENTROID: ***" << latlon.toString() << std.endl; } else { centroid = clamped; } } else { //osgGIS.warn() << "*** Failed to clamp Center/Radius for cell" << std.endl; } if (node is osg.LOD) { osg.LOD plod = (osg.LOD)node; plod.setCenter(centroid); plod.setRadius(radius); } else if (node is osg.ProxyNode) { osg.ProxyNode proxy = (osg.ProxyNode)node; proxy.setCenter(centroid); proxy.setRadius(radius); } }