Пример #1
0
        public override void Update(DrawArgs drawArgs)
        {
            try
            {
                if (drawArgs.WorldCamera.Altitude <= this._maxDisplayAltitude &&
                    drawArgs.WorldCamera.Altitude >= this._minDisplayAltitude)
                {
                    if (!this.isInitialized)
                    {
                        this.Initialize(drawArgs);
                    }

                    foreach (ShapeRecord curShapeRecord in this._shapeIndex.ShapeRecords)
                    {
                        BoundingBox bb = new BoundingBox(
                            (float)curShapeRecord.South, (float)curShapeRecord.North,
                            (float)curShapeRecord.West, (float)curShapeRecord.East,
                            (float)(this._parentWorld.EquatorialRadius + this._Altitude + 0),
                            (float)(this._parentWorld.EquatorialRadius + this._Altitude + 10000f));

                        if (drawArgs.WorldCamera.ViewFrustum.Intersects(bb))
                        {
                            if (this._showFilledPolygons && curShapeRecord.PolygonFile != String.Empty)
                            {
                                if (!this._currentPolygons.Contains(curShapeRecord.ID))
                                {
                                    double dv;

                                    double curScalar = (double)curShapeRecord.ScalarData[this._scalarKey];

                                    double r = 1.0;
                                    double g = 1.0;
                                    double b = 1.0;

                                    if (curScalar < this._scalarMin)
                                    {
                                        curScalar = this._scalarMin;
                                    }
                                    if (curScalar > this._scalarMax)
                                    {
                                        curScalar = this._scalarMax;
                                    }
                                    dv = this._scalarMax - this._scalarMin;

                                    if (curScalar < (this._scalarMin + 0.25 * dv))
                                    {
                                        r = 0;
                                        g = 4 * (curScalar - this._scalarMin) / dv;
                                    }
                                    else if (curScalar < (this._scalarMin + 0.5 * dv))
                                    {
                                        r = 0;
                                        b = 1 + 4 * (this._scalarMin + 0.25 * dv - curScalar) / dv;
                                    }
                                    else if (curScalar < (this._scalarMin + 0.75 * dv))
                                    {
                                        r = 4 * (curScalar - this._scalarMin - 0.5 * dv) / dv;
                                        b = 0;
                                    }
                                    else
                                    {
                                        g = 1 + 4 * (this._scalarMin + 0.75 * dv - curScalar) / dv;
                                        b = 0;
                                    }

                                    //float colorPercent = 1.0f;
                                    //if(this._scalarKey != null)
                                    //{
                                    //	double curScalar = (double)curShapeRecord.ScalarData[this._scalarKey];
                                    //	colorPercent = (float)((float)curScalar - (float)this._scalarMin) / ((float)this._scalarMax - (float)this._scalarMin);
                                    //}
                                    PolygonLayer newPoly = new PolygonLayer(
                                        curShapeRecord.ID,
                                        this._parentWorld,
                                        this._minDisplayAltitude,
                                        this._maxDisplayAltitude,
                                        this._Altitude,
                                        curShapeRecord.PolygonFile,
                                        System.Drawing.Color.FromArgb((int)(255 * r), (int)(255 * g), (int)(255 * b))
                                        //System.Drawing.Color.FromArgb((int)(this._color.R * colorPercent), (int)(this._color.G * colorPercent), (int)(this._color.B * colorPercent))
                                        );
                                    newPoly.Initialize(drawArgs);
                                    newPoly.Update(drawArgs);
                                    lock (this._currentPolygons.SyncRoot)
                                    {
                                        this._currentPolygons.Add(curShapeRecord.ID, newPoly);
                                    }
                                }
                                else
                                {
                                    PolygonLayer curPoly = (PolygonLayer)this._currentPolygons[curShapeRecord.ID];
                                    curPoly.Update(drawArgs);
                                }
                            }

                            if (this._showBoundaries && curShapeRecord.BoundaryFile != String.Empty)
                            {
                                if (!this._currentBoundaries.Contains(curShapeRecord.ID))
                                {
                                    BoundaryLayer newBoundary = new BoundaryLayer(
                                        curShapeRecord.ID,
                                        this._parentWorld,
                                        this._Altitude,
                                        this._minDisplayAltitude,
                                        this._maxDisplayAltitude,
                                        curShapeRecord.BoundaryFile,
                                        this._color);
                                    newBoundary.Initialize(drawArgs);
                                    newBoundary.Update(drawArgs);
                                    lock (this._currentBoundaries.SyncRoot)
                                    {
                                        this._currentBoundaries.Add(curShapeRecord.ID, newBoundary);
                                    }
                                }
                                else
                                {
                                    BoundaryLayer curBoundary = (BoundaryLayer)this._currentBoundaries[curShapeRecord.ID];
                                    curBoundary.Update(drawArgs);
                                }
                            }
                        }
                        else
                        {
                            if (this._showFilledPolygons && curShapeRecord.PolygonFile != String.Empty)
                            {
                                if (this._currentPolygons.Contains(curShapeRecord.ID))
                                {
                                    lock (this._currentPolygons.SyncRoot)
                                    {
                                        using (PolygonLayer oldPoly = (PolygonLayer)this._currentPolygons[curShapeRecord.ID])
                                            this._currentPolygons.Remove(curShapeRecord.ID);
                                    }
                                }
                            }

                            if (this._showBoundaries && curShapeRecord.BoundaryFile != String.Empty)
                            {
                                if (this._currentBoundaries.Contains(curShapeRecord.ID))
                                {
                                    lock (this._currentBoundaries.SyncRoot)
                                    {
                                        using (BoundaryLayer oldBoundary = (BoundaryLayer)this._currentBoundaries[curShapeRecord.ID])
                                            this._currentBoundaries.Remove(curShapeRecord.ID);
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    //remove current rendering resources
                }
            }
            catch (System.Threading.ThreadAbortException)
            {
            }
            catch (Exception caught)
            {
                Log.Write(caught);
            }
        }