Пример #1
0
        /// <summary>
        /// Reloads the VertexBuffer for the TerrainPage for displaying vertices.
        /// </summary>
        public void RefreshVertexBuffer_Vertices()
        {
            if (_page != null)
            {
                GraphicsStream stream;
                D3D.CustomVertex.PositionColored[] vertices = new
                                                              D3D.CustomVertex.PositionColored[_page.TerrainPatch.NumVertices * 4];
                D3D.CustomVertex.PositionNormal[] tri = _page.TerrainPatch.Vertices;
                int     color = Color.Black.ToArgb();
                int     red, blue;
                float   zoomFactor = _viewport.Camera.FollowDistance / _originalZoomFactor;
                Vector3 position;
                float   distance;
                float   vDist = _page.TerrainPatch.NearestVertices * _vertexSize;

                for (int i = 0; i < tri.Length; i++)
                {
                    if (_showSelectedVertices && _page.TerrainPatch.SelectedVertices[i])
                    {
                        color = Color.Red.ToArgb();
                    }
                    else if (_showSelectedVertices && _softSelection &&
                             _page.TerrainPatch.AreVerticesSelected)
                    {
                        position = _page.TerrainPatch.Vertices[i].Position;
                        distance = _page.TerrainPatch.FindShortestDistanceToSelectedVertex(position);

                        if (distance <= _softDistanceSquared)
                        {
                            if (_falloff)
                            {
                                red   = Convert.ToInt32(Color.Red.R * (1 - distance / _softDistanceSquared));
                                blue  = Convert.ToInt32(Color.Blue.B * (distance / _softDistanceSquared));
                                color = Color.FromArgb(red, 0, blue).ToArgb();
                            }
                            else
                            {
                                color = Color.Red.ToArgb();
                            }
                        }
                        else
                        {
                            color = Color.Blue.ToArgb();
                        }
                    }
                    else
                    {
                        color = Color.Blue.ToArgb();
                    }

                    vertices[i * 4].Position = new Vector3(tri[i].Position.X - (vDist * zoomFactor),
                                                           tri[i].Position.Y, tri[i].Position.Z - (vDist * zoomFactor));
                    vertices[i * 4].Color        = color;
                    vertices[i * 4 + 1].Position = new Vector3(tri[i].Position.X - (vDist * zoomFactor),
                                                               tri[i].Position.Y, tri[i].Position.Z + (vDist * zoomFactor));
                    vertices[i * 4 + 1].Color    = color;
                    vertices[i * 4 + 2].Position = new Vector3(tri[i].Position.X + (vDist * zoomFactor),
                                                               tri[i].Position.Y, tri[i].Position.Z + (vDist * zoomFactor));
                    vertices[i * 4 + 2].Color    = color;
                    vertices[i * 4 + 3].Position = new Vector3(tri[i].Position.X + (vDist * zoomFactor),
                                                               tri[i].Position.Y, tri[i].Position.Z - (vDist * zoomFactor));
                    vertices[i * 4 + 3].Color = color;
                }

                if (_vbVerts != null)
                {
                    if (!_vbVerts.Disposed)
                    {
                        _vbVerts.Dispose();
                    }

                    _vbVerts = null;
                }

                _vbVerts = new D3D.VertexBuffer(typeof(D3D.CustomVertex.PositionColored),
                                                vertices.Length, _viewport.Device, D3D.Usage.WriteOnly,
                                                D3D.CustomVertex.PositionColored.Format, D3D.Pool.Managed);

                stream = _vbVerts.Lock(0, 0, D3D.LockFlags.None);
                stream.Write(vertices);
                _vbVerts.Unlock();

                _vbVertSize = vertices.Length;
                _page.TerrainPatch.RefreshVertices = false;
            }
            else if (_vbVerts != null)
            {
                if (!_vbVerts.Disposed)
                {
                    _vbVerts.Dispose();
                }

                _vbVerts    = null;
                _vbVertSize = 0;
            }
        }
Пример #2
0
		public override void Render(DrawArgs drawArgs)
		{
			if(!isInitialized || 
				drawArgs.WorldCamera.AltitudeAboveTerrain < m_MinimumViewingAltitude ||
				drawArgs.WorldCamera.AltitudeAboveTerrain > m_MaximumViewingAltitude
				)
			{
				return;
			}

			try
			{
				foreach(ShapeTile shapeTile in m_RootTiles)
				{
					if(shapeTile!=null&&(shapeTile.m_GeoBB.North-shapeTile.m_GeoBB.South)<=m_lztsd)
						shapeTile.Render(drawArgs);
				}

				Vector3 referenceCenter = new Vector3(
					(float)drawArgs.WorldCamera.ReferenceCenter.X,
					(float)drawArgs.WorldCamera.ReferenceCenter.Y,
					(float)drawArgs.WorldCamera.ReferenceCenter.Z);

				if(m_PointList.Count > 0)
				{
					drawArgs.device.VertexFormat = CustomVertex.PositionColored.Format;
						
					float curPointSize = drawArgs.device.RenderState.PointSize;
						
					drawArgs.device.RenderState.PointSize = 5.0f;
					drawArgs.device.RenderState.ZBufferEnable = false;
					CustomVertex.PositionColored[] verts = new Microsoft.DirectX.Direct3D.CustomVertex.PositionColored[1];
					Vector3 camPoint = MathEngine.SphericalToCartesian(drawArgs.WorldCamera.Latitude.Degrees, drawArgs.WorldCamera.Longitude.Degrees, m_ShapeTileArgs.LayerRadius);
					
					drawArgs.device.Transform.World = Matrix.Translation(-referenceCenter);
					foreach(Vector3 v in m_PointList)
					{
						if(Vector3.Subtract(v, camPoint).Length() < m_ShapeTileArgs.LayerRadius)
						{
							verts[0].Color = m_ShapeTileArgs.LabelColor.ToArgb();
							verts[0].X = v.X;
							verts[0].Y = v.Y;
							verts[0].Z = v.Z;

							drawArgs.device.TextureState[0].ColorOperation = TextureOperation.Disable;
							drawArgs.device.DrawUserPrimitives(PrimitiveType.PointList, 1, verts);
						}
					}

					drawArgs.device.Transform.World = drawArgs.WorldCamera.WorldMatrix;
					drawArgs.device.RenderState.PointSize = curPointSize;
					drawArgs.device.RenderState.ZBufferEnable = true;
				}

				if(m_LabelList.Count > 0)
				{
					System.Drawing.Color iconColor = System.Drawing.Color.FromArgb(m_IconOpacity, 255, 255, 255);
					foreach(Shapefile_Point p in m_LabelList)
					{
						Vector3 cartesianPoint = MathEngine.SphericalToCartesian(p.Y, p.X, drawArgs.WorldCamera.WorldRadius + drawArgs.WorldCamera.TerrainElevation);
					
						if(!drawArgs.WorldCamera.ViewFrustum.ContainsPoint(cartesianPoint) ||
							MathEngine.SphericalDistanceDegrees(p.Y, p.X, drawArgs.WorldCamera.Latitude.Degrees, drawArgs.WorldCamera.Longitude.Degrees) > 90.0)
							continue;

						Vector3 projectedPoint = drawArgs.WorldCamera.Project(cartesianPoint - referenceCenter);

						/*if(isMouseOver)
						{
							// Mouse is over
							isMouseOver = true;

							if(icon.isSelectable)
								DrawArgs.MouseCursor = CursorType.Hand;

							string description = icon.Description;
							if(description==null)
								description = icon.ClickableActionURL;
							if(description!=null)
							{
								// Render description field
								DrawTextFormat format = DrawTextFormat.NoClip | DrawTextFormat.WordBreak | DrawTextFormat.Bottom;
								int left = 10;
								if(World.Settings.showLayerManager)
									left += World.Settings.layerManagerWidth;
								Rectangle rect = Rectangle.FromLTRB(left, 10, drawArgs.screenWidth - 10, drawArgs.screenHeight - 10 );

								// Draw outline
								drawArgs.defaultDrawingFont.DrawText(
									m_sprite, description,
									rect,
									format, 0xb0 << 24 );
					
								rect.Offset(2,0);
								drawArgs.defaultDrawingFont.DrawText(
									m_sprite, description,
									rect,
									format, 0xb0 << 24 );

								rect.Offset(0,2);
								drawArgs.defaultDrawingFont.DrawText(
									m_sprite, description,
									rect,
									format, 0xb0 << 24 );

								rect.Offset(-2,0);
								drawArgs.defaultDrawingFont.DrawText(
									m_sprite, description,
									rect,
									format, 0xb0 << 24 );

								// Draw description
								rect.Offset(1,-1);
								drawArgs.defaultDrawingFont.DrawText(
									m_sprite, description,
									rect, 
									format, descriptionColor );
							}
						}*/
					m_Sprite.Begin(SpriteFlags.AlphaBlend);

						if(m_IconTexture != null)
						{
							float xscale = (float)m_IconWidth / m_IconTextureDescription.Width;
							float yscale = (float)m_IconHeight / m_IconTextureDescription.Height;
							m_Sprite.Transform = Matrix.Scaling(xscale,yscale,0);
							m_Sprite.Transform *= Matrix.Translation(projectedPoint.X, projectedPoint.Y, 0);
							m_Sprite.Draw( m_IconTexture,
								new Vector3( m_IconWidth>>1, m_IconHeight>>1,0),
								Vector3.Empty,
								iconColor.ToArgb() );
				
							// Reset transform to prepare for text rendering later
							m_Sprite.Transform = Matrix.Identity;
						}

						if(m_ShapeTileArgs.ShowLabels && m_ShapeTileArgs.DataKey != null)
						{
						
							// Render label
							if(p.Tag != null)
							{
								// Render name field
								const int labelWidth = 1000; // Dummy value needed for centering the text
								if(m_IconTexture==null)
								{
									// Center over target as we have no bitmap
									Rectangle rect = new Rectangle(
										(int)projectedPoint.X - (labelWidth>>1), 
										(int)(projectedPoint.Y - (drawArgs.defaultDrawingFont.Description.Height >> 1)),
										labelWidth, 
										drawArgs.screenHeight );

									drawArgs.defaultDrawingFont.DrawText(m_Sprite, p.Tag.ToString(), rect, DrawTextFormat.Center, m_ShapeTileArgs.LabelColor);
								}
								else
								{
									// Adjust text to make room for icon
									int spacing = (int)(m_IconWidth * 0.3f);
									if(spacing>10)
										spacing = 10;
									int offsetForIcon = (m_IconWidth>>1) + spacing;

									Rectangle rect = new Rectangle(
										(int)projectedPoint.X + offsetForIcon, 
										(int)(projectedPoint.Y - (drawArgs.defaultDrawingFont.Description.Height >> 1)),
										labelWidth, 
										drawArgs.screenHeight );

									drawArgs.defaultDrawingFont.DrawText(m_Sprite, p.Tag.ToString(), rect, DrawTextFormat.WordBreak, m_ShapeTileArgs.LabelColor);
								}
							}
						}
						
						m_Sprite.End();
					}
				}
			}
			catch(Exception ex)
			{
				Log.Write(ex);
			}
		}
Пример #3
0
        /// <summary>
        /// Reloads the VertexBuffer for the TerrainPage for displaying vertices.
        /// </summary>
        public void RefreshVertexBuffer_Vertices()
        {
            if ( _page != null )
            {
                GraphicsStream stream;
                D3D.CustomVertex.PositionColored[] vertices = new
                    D3D.CustomVertex.PositionColored[_page.TerrainPatch.NumVertices * 4];
                D3D.CustomVertex.PositionNormal[] tri = _page.TerrainPatch.Vertices;
                int color = Color.Black.ToArgb();
                int red, blue;
                float zoomFactor = _viewport.Camera.FollowDistance / _originalZoomFactor;
                Vector3 position;
                float distance;
                float vDist = _page.TerrainPatch.NearestVertices * _vertexSize;

                for ( int i = 0; i < tri.Length; i++ )
                {
                    if ( _showSelectedVertices && _page.TerrainPatch.SelectedVertices[i] )
                        color = Color.Red.ToArgb();
                    else if ( _showSelectedVertices && _softSelection &&
                        _page.TerrainPatch.AreVerticesSelected )
                    {
                        position = _page.TerrainPatch.Vertices[i].Position;
                        distance = _page.TerrainPatch.FindShortestDistanceToSelectedVertex( position );

                        if ( distance <= _softDistanceSquared )
                        {
                            if ( _falloff )
                            {
                                red = Convert.ToInt32( Color.Red.R * ( 1 - distance / _softDistanceSquared ) );
                                blue = Convert.ToInt32( Color.Blue.B * ( distance / _softDistanceSquared ) );
                                color = Color.FromArgb( red, 0, blue ).ToArgb();
                            }
                            else
                                color = Color.Red.ToArgb();
                        }
                        else
                        {
                            color = Color.Blue.ToArgb();
                        }
                    }
                    else
                    {
                        color = Color.Blue.ToArgb();
                    }

                    vertices[i * 4].Position = new Vector3( tri[i].Position.X - ( vDist * zoomFactor ),
                        tri[i].Position.Y, tri[i].Position.Z - ( vDist * zoomFactor ) );
                    vertices[i * 4].Color = color;
                    vertices[i * 4 + 1].Position = new Vector3( tri[i].Position.X - ( vDist * zoomFactor ),
                        tri[i].Position.Y, tri[i].Position.Z + ( vDist * zoomFactor ) );
                    vertices[i * 4 + 1].Color = color;
                    vertices[i * 4 + 2].Position = new Vector3( tri[i].Position.X + ( vDist * zoomFactor ),
                        tri[i].Position.Y, tri[i].Position.Z + ( vDist * zoomFactor ) );
                    vertices[i * 4 + 2].Color = color;
                    vertices[i * 4 + 3].Position = new Vector3( tri[i].Position.X + ( vDist * zoomFactor ),
                        tri[i].Position.Y, tri[i].Position.Z - ( vDist * zoomFactor ) );
                    vertices[i * 4 + 3].Color = color;
                }

                if ( _vbVerts != null )
                {
                    if ( !_vbVerts.Disposed )
                        _vbVerts.Dispose();

                    _vbVerts = null;
                }

                _vbVerts = new D3D.VertexBuffer( typeof( D3D.CustomVertex.PositionColored ),
                    vertices.Length, _viewport.Device, D3D.Usage.WriteOnly,
                    D3D.CustomVertex.PositionColored.Format, D3D.Pool.Managed );

                stream = _vbVerts.Lock( 0, 0, D3D.LockFlags.None );
                stream.Write( vertices );
                _vbVerts.Unlock();

                _vbVertSize = vertices.Length;
                _page.TerrainPatch.RefreshVertices = false;
            }
            else if ( _vbVerts != null )
            {
                if ( !_vbVerts.Disposed )
                    _vbVerts.Dispose();

                _vbVerts = null;
                _vbVertSize = 0;
            }
        }