数据实体:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Drawing; 6 using SlimDX; 7 using RGeos.SlimScene.Core; 8
9 namespace RGeos.Framework.OTL.Geometries 10 { 11
12 /// <summary>
13 /// LineString. 14 /// </summary>
15 public class LineString 16 { 17 public Point3d[] Coordinates = null; 18 public Color Color = Color.Yellow; 19 public float LineWidth = 1.0f; 20 public bool Visible = true; 21 public bool Remove = false; 22 public RenderableObject ParentRenderable = null; 23
24 public BoundingBox GetBoundingBox() 25 { 26 if (Coordinates == null || Coordinates.Length == 0) 27 return new BoundingBox(); 28
29 double minX = Coordinates[0].X; 30 double maxX = Coordinates[0].X; 31 double minY = Coordinates[0].Y; 32 double maxY = Coordinates[0].Y; 33 double minZ = Coordinates[0].Z; 34 double maxZ = Coordinates[0].Z; 35
36 for (int i = 1; i < Coordinates.Length; i++) 37 { 38 if (Coordinates[i].X < minX) 39 minX = Coordinates[i].X; 40 if (Coordinates[i].X > maxX) 41 maxX = Coordinates[i].X; 42
43 if (Coordinates[i].Y < minY) 44 minY = Coordinates[i].Y; 45 if (Coordinates[i].Y > maxY) 46 maxY = Coordinates[i].Y; 47
48 if (Coordinates[i].Z < minZ) 49 minZ = Coordinates[i].Z; 50 if (Coordinates[i].Z > maxZ) 51 maxZ = Coordinates[i].Z; 52 } 53
54 return new BoundingBox(new Vector3( 55 (float)maxY, (float)minY, (float)minX), new Vector3((float)maxX, (float)minZ, (float)maxZ)); 56 } 57 } 58
59
60 }
渲染对象
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using RGeos.SlimScene.Core; 6 using SlimDX.Direct3D9; 7 using SlimDX; 8
9 namespace RGeos.Framework.OTL.Geometries 10 { 11 public class RenderableLineString : RenderableObject 12 { 13 #region Static Members
14 #endregion
15
16 #region Private Members
17 double m_distanceAboveSurface = 0; 18 Point3d[] m_points = null; 19 CustomVertex.PositionColoredTextured[] m_wallVertices = null; 20
21 CustomVertex.PositionColored[] m_topVertices = null; 22 CustomVertex.PositionColored[] m_bottomVertices = null; 23 CustomVertex.PositionColored[] m_sideVertices = null; 24
25 System.Drawing.Color m_lineColor = System.Drawing.Color.Black; 26 float m_verticalExaggeration = 1; 27 double m_minimumDisplayAltitude = 0; 28 double m_maximumDisplayAltitude = double.MaxValue; 29 string m_imageUri = null; 30 Texture m_texture = null; 31 System.Drawing.Color m_polygonColor = System.Drawing.Color.Black; 32 bool m_outline = true; 33 float m_lineWidth = 1.0f; 34 bool m_extrude = false; 35 AltitudeMode m_altitudeMode = AltitudeMode.Absolute; 36 long m_numPoints = 0; 37 #endregion
38
39 /// <summary>
40 /// Boolean indicating whether or not the line needs rebuilding. 41 /// </summary>
42 public bool NeedsUpdate = true; 43
44 public bool Extrude 45 { 46 get { return m_extrude; } 47 set { m_extrude = value; } 48 } 49
50 public AltitudeMode AltitudeMode 51 { 52 get { return m_altitudeMode; } 53 set { m_altitudeMode = value; } 54 } 55
56 public System.Drawing.Color LineColor 57 { 58 get { return m_lineColor; } 59 set
60 { 61 m_lineColor = value; 62 NeedsUpdate = true; 63 } 64 } 65
66 public float LineWidth 67 { 68 get { return m_lineWidth; } 69 set
70 { 71 m_lineWidth = value; 72 NeedsUpdate = true; 73 } 74 } 75
76 public double DistanceAboveSurface 77 { 78 get { return m_distanceAboveSurface; } 79 set
80 { 81 m_distanceAboveSurface = value; 82 if (m_topVertices != null) 83 { 84 NeedsUpdate = true; 85 //UpdateVertices();
86 } 87 } 88 } 89
90 public System.Drawing.Color PolygonColor 91 { 92 get { return m_polygonColor; } 93 set
94 { 95 m_polygonColor = value; 96 if (m_topVertices != null) 97 { 98 NeedsUpdate = true; 99 //UpdateVertices();
100 } 101 } 102 } 103
104 public bool Outline 105 { 106 get { return m_outline; } 107 set
108 { 109 m_outline = value; 110 if (m_topVertices != null) 111 { 112 NeedsUpdate = true; 113 //UpdateVertices();
114 } 115 } 116 } 117
118 public Point3d[] Points 119 { 120 get
121 { 122 // if the array size is correct just return it
123 if (m_numPoints == m_points.LongLength) 124 return m_points; 125
126 // return an array the correct size.
127 Point3d[] points = new Point3d[m_numPoints]; 128 for (int i = 0; i < m_numPoints; i++) 129 { 130 points[i] = m_points[i]; 131 } 132 return points; 133 } 134 set
135 { 136 m_points = value; 137 m_numPoints = m_points.LongLength; 138 NeedsUpdate = true; 139 } 140 } 141
142 public long NumPoints 143 { 144 get { return m_numPoints; } 145 } 146
147 public double MinimumDisplayAltitude 148 { 149 get { return m_minimumDisplayAltitude; } 150 set { m_minimumDisplayAltitude = value; } 151 } 152
153 public double MaximumDisplayAltitude 154 { 155 get { return m_maximumDisplayAltitude; } 156 set { m_maximumDisplayAltitude = value; } 157 } 158
159 public override byte Opacity 160 { 161 get
162 { 163 return base.Opacity; 164 } 165 set
166 { 167 base.Opacity = value; 168 if (m_topVertices != null) 169 { 170 UpdateVertices(); 171 } 172 } 173 } 174
175 public RenderableLineString(string name, World parentWorld, Point3d[] points, System.Drawing.Color lineColor) 176 : base(name, parentWorld) 177 { 178 m_points = points; 179 m_lineColor = lineColor; 180 m_polygonColor = lineColor; 181 m_numPoints = m_points.LongLength; 182
183 // RenderPriority = WorldWind.Renderable.RenderPriority.LinePaths;
184 } 185
186 public RenderableLineString(string name, World parentWorld, Point3d[] points, string imageUri) 187 : base(name, parentWorld) 188 { 189 m_points = points; 190 m_imageUri = imageUri; 191 m_numPoints = m_points.LongLength; 192
193 // RenderPriority = WorldWind.Renderable.RenderPriority.LinePaths;
194 } 195
196 public override void Dispose() 197 { 198 if (m_texture != null && !m_texture.Disposed) 199 { 200 m_texture.Dispose(); 201 m_texture = null; 202 } 203
204 if (m_lineString != null) 205 { 206 m_lineString.Remove = true; 207 m_lineString = null; 208 } 209 NeedsUpdate = true; 210 } 211
212 public override void Initialize(DrawArgs drawArgs) 213 { 214 if (m_points == null) 215 { 216 isInitialized = true; 217 return; 218 } 219
220 if (m_imageUri != null) 221 { 222 //load image 223 //if (m_imageUri.ToLower().StartsWith("http://")) 224 //{ 225 // string savePath = string.Format("{0}\\image", ConfigurationLoader.GetRenderablePathString(this)); 226 // System.IO.FileInfo file = new System.IO.FileInfo(savePath); 227 // if (!file.Exists) 228 // { 229 // WorldWind.Net.WebDownload download = new WorldWind.Net.WebDownload(m_imageUri); 230
231 // if (!file.Directory.Exists) 232 // file.Directory.Create(); 233
234 // download.DownloadFile(file.FullName, WorldWind.Net.DownloadType.Unspecified); 235 // } 236
237 // m_texture = ImageHelper.LoadTexture(file.FullName); 238 //} 239 //else 240 //{ 241 // m_texture = ImageHelper.LoadTexture(m_imageUri); 242 //}
243 } 244
245 UpdateVertices(); 246
247 isInitialized = true; 248 } 249
250 /// <summary>
251 /// Adds a point to the line at the end of the line. 252 /// </summary>
253 /// <param name="point">The Point3d object to add.</param>
254 public void AddPoint(Point3d point) 255 { 256 // if the array is too small grow it.
257 if (m_numPoints >= m_points.LongLength) 258 { 259 long growSize = m_points.LongLength / 2; 260 if (growSize < 10) growSize = 10; 261
262 Point3d[] points = new Point3d[m_points.LongLength + growSize]; 263
264 for (int i = 0; i < m_numPoints; i++) 265 { 266 points[i] = m_points[i]; 267 } 268 m_points = points; 269 } 270 m_points[m_numPoints] = point; 271 m_numPoints++; 272 NeedsUpdate = true; 273 } 274
275 private void UpdateVertices() 276 { 277 try
278 { 279 // m_verticalExaggeration = World.Settings.VerticalExaggeration;
280
281 UpdateTexturedVertices(); 282
283 if (m_lineString != null && m_outline && m_wallVertices != null && m_wallVertices.Length > m_topVertices.Length) 284 { 285 UpdateOutlineVertices(); 286 } 287
288 NeedsUpdate = false; 289 } 290 catch (Exception ex) 291 { 292 Utility.Log.Write(ex); 293 } 294 } 295
296 private void UpdateOutlineVertices() 297 { 298 m_bottomVertices = new CustomVertex.PositionColored[m_numPoints]; 299 m_sideVertices = new CustomVertex.PositionColored[m_numPoints * 2]; 300
301 for (int i = 0; i < m_numPoints; i++) 302 { 303 m_sideVertices[2 * i] = m_topVertices[i]; 304
305 Vector3 xyzVertex = new Vector3( 306 m_wallVertices[2 * i + 1].Position.X, 307 m_wallVertices[2 * i + 1].Position.Y, 308 m_wallVertices[2 * i + 1].Position.Z); 309
310 m_bottomVertices[i].Position.X = xyzVertex.X; 311 m_bottomVertices[i].Position.Y = xyzVertex.Y; 312 m_bottomVertices[i].Position.Z = xyzVertex.Z; 313 m_bottomVertices[i].Color = m_lineColor.ToArgb(); 314
315 m_sideVertices[2 * i + 1] = m_bottomVertices[i]; 316 } 317 } 318
319 LineString m_lineString = null; 320 private void UpdateTexturedVertices() 321 { 322 if (m_altitudeMode == AltitudeMode.ClampedToGround) 323 { 324 if (m_lineString != null) 325 { 326 m_lineString.Remove = true; 327 m_lineString = null; 328 } 329
330 m_lineString = new LineString(); 331 m_lineString.Coordinates = Points; 332 m_lineString.Color = LineColor; 333 m_lineString.LineWidth = LineWidth; 334 m_lineString.ParentRenderable = this; 335 // this.World.ProjectedVectorRenderer.Add(m_lineString);
336
337 if (m_wallVertices != null) 338 m_wallVertices = null; 339
340 return; 341 } 342
343 if (m_extrude || m_altitudeMode == AltitudeMode.RelativeToGround) 344 { 345 m_wallVertices = new CustomVertex.PositionColoredTextured[m_numPoints * 2]; 346 } 347
348 float textureCoordIncrement = 1.0f / (float)(m_numPoints - 1); 349 // m_verticalExaggeration = World.Settings.VerticalExaggeration;
350 int vertexColor = m_polygonColor.ToArgb(); 351
352 m_topVertices = new CustomVertex.PositionColored[m_numPoints]; 353
354 for (int i = 0; i < m_numPoints; i++) 355 { 356 double terrainHeight = 0; 357
358
359 Vector3 xyzVertex = new Vector3((float)m_points[i].X, (float)m_points[i].Y, (float)m_points[i].Z); 360
361 m_topVertices[i].Position.X = xyzVertex.X; 362 m_topVertices[i].Position.Y = xyzVertex.Y; 363 m_topVertices[i].Position.Z = xyzVertex.Z; 364 m_topVertices[i].Color = m_lineColor.ToArgb(); 365
366 if (m_extrude || m_altitudeMode == AltitudeMode.RelativeToGround) 367 { 368 m_wallVertices[2 * i].Position.X = xyzVertex.X; 369 m_wallVertices[2 * i].Position.Y = xyzVertex.Y; 370 m_wallVertices[2 * i].Position.Z = xyzVertex.Z; 371 m_wallVertices[2 * i].Color = vertexColor; 372 m_wallVertices[2 * i].Tu = i * textureCoordIncrement; 373 m_wallVertices[2 * i].Tv = 1.0f; 374
375 m_wallVertices[2 * i + 1].Position.X = xyzVertex.X; 376 m_wallVertices[2 * i + 1].Position.Y = xyzVertex.Y; 377 m_wallVertices[2 * i + 1].Position.Z = xyzVertex.Z; 378 m_wallVertices[2 * i + 1].Color = vertexColor; 379 m_wallVertices[2 * i + 1].Tu = i * textureCoordIncrement; 380 m_wallVertices[2 * i + 1].Tv = 0.0f; 381 } 382 } 383 } 384
385 public override bool PerformSelectionAction(DrawArgs drawArgs) 386 { 387 return false; 388 } 389
390 public override void Update(DrawArgs drawArgs) 391 { 392 if (drawArgs.WorldCamera.Distance >= m_minimumDisplayAltitude && drawArgs.WorldCamera.Distance <= m_maximumDisplayAltitude) 393 { 394 if (!isInitialized) 395 Initialize(drawArgs); 396
397 if (NeedsUpdate) 398 UpdateVertices(); 399 } 400
401 } 402
403 public override void Render(DrawArgs drawArgs) 404 { 405 if (!isInitialized || drawArgs.WorldCamera.Distance < m_minimumDisplayAltitude || drawArgs.WorldCamera.Distance > m_maximumDisplayAltitude) 406 { 407 return; 408 } 409
410 try
411 { 412 if (m_lineString != null) 413 return; 414
415 int currentCull = drawArgs.Device.GetRenderState(RenderState.CullMode); 416 drawArgs.Device.SetRenderState(RenderState.CullMode, Cull.None); 417
418 if (m_wallVertices != null) 419 { 420 drawArgs.Device.SetRenderState(RenderState.ZEnable, true); 421
422 if (m_texture != null && !m_texture.Disposed) 423 { 424 drawArgs.Device.SetTexture(0, m_texture); 425 drawArgs.Device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Modulate); 426 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Add); 427 drawArgs.Device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture); 428 } 429 else
430 { 431 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable); 432 } 433
434 drawArgs.Device.VertexFormat = CustomVertex.PositionColoredTextured.Format; 435
436 drawArgs.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, m_wallVertices.Length - 2, m_wallVertices); 437
438 if (m_outline) 439 { 440
441 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable); 442 drawArgs.Device.VertexFormat = CustomVertex.PositionColored.Format; 443 drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineStrip, m_topVertices.Length - 1, m_topVertices); 444
445 if (m_bottomVertices != null) 446 drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineStrip, m_bottomVertices.Length - 1, m_bottomVertices); 447
448 if (m_sideVertices != null) 449 drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineList, m_sideVertices.Length / 2, m_sideVertices); 450
451 } 452 } 453 else
454 { 455 drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable); 456 drawArgs.Device.VertexFormat = CustomVertex.PositionColored.Format; 457 drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineStrip, m_topVertices.Length - 1, m_topVertices); 458 } 459
460 drawArgs.Device.SetTransform(TransformState.World, drawArgs.WorldCamera.WorldMatrix); 461 drawArgs.Device.SetRenderState(RenderState.CullMode, currentCull); 462 } 463 catch//(Exception ex)
464 { 465 //Utility.Log.Write(ex);
466 } 467 } 468 } 469 }
使用方法:
private void tspPolyline_Click(object sender, EventArgs e) { Point3d[] pts=new Point3d[5]; Point3d pt1=new Point3d(0,0,0); Point3d pt2=new Point3d(0,10,8); Point3d pt3=new Point3d(0,20,5); Point3d pt4=new Point3d(0,30,4); Point3d pt5=new Point3d(0,40,2); pts[0]=pt1; pts[1]=pt2; pts[2]=pt3; pts[3]=pt4; pts[4]=pt5; RenderableLineString rend = new RenderableLineString("Hello", null, pts, Color.White); rend.IsOn = true; rend.RenderPriority = RenderPriority.Custom; mSceneControl.CurrentWorld.RenderableObjects.ChildObjects.Add(rend); }