예제 #1
0
        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());
                }
            }
        }
        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());
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
            }
        }